Baseline: pr1 HYC下载站 v2.3 before security/functional fixes
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
#!/bin/bash
|
||||
# ============================================
|
||||
# HYC下载站 v2.3 - 多架构 Docker 构建脚本
|
||||
# 支持: amd64, arm64, arm/v7, i386
|
||||
# ============================================
|
||||
|
||||
set -e
|
||||
|
||||
# 颜色
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m'
|
||||
|
||||
VERSION=${1:-v2.3}
|
||||
REGISTRY=${2:-hyc-download-station}
|
||||
TAG=${3:-$VERSION}
|
||||
|
||||
# 支持的平台
|
||||
PLATFORMS="linux/amd64,linux/arm64,linux/arm/v7,linux/386"
|
||||
|
||||
echo "========================================"
|
||||
echo " HYC下载站 v2.3 - 多架构构建"
|
||||
echo "========================================"
|
||||
echo " 版本: $TAG"
|
||||
echo " 平台: $PLATFORMS"
|
||||
echo
|
||||
|
||||
# 检查 Docker
|
||||
if ! command -v docker &> /dev/null; then
|
||||
echo -e "${RED}✗ Docker 未安装${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 检查 BuildX
|
||||
if ! docker buildx version &> /dev/null; then
|
||||
echo -e "${YELLOW}⚠ Docker BuildX 未安装,尝试安装...${NC}"
|
||||
docker buildx install || true
|
||||
fi
|
||||
|
||||
# 创建构建器
|
||||
echo "[1/4] 创建构建器..."
|
||||
docker buildx rm hyc-builder 2>/dev/null || true
|
||||
docker buildx create \
|
||||
--name hyc-builder \
|
||||
--platform $PLATFORMS \
|
||||
--use
|
||||
|
||||
# 引导构建器
|
||||
echo "[2/4] 引导构建器..."
|
||||
docker buildx inspect --bootstrap
|
||||
|
||||
# 构建镜像
|
||||
echo "[3/4] 构建镜像..."
|
||||
echo " 构建中,请稍候..."
|
||||
|
||||
START_TIME=$(date +%s)
|
||||
|
||||
docker buildx build \
|
||||
--platform $PLATFORMS \
|
||||
--tag "$REGISTRY:$TAG" \
|
||||
--tag "$REGISTRY:latest" \
|
||||
--push \
|
||||
--file docker/Dockerfile.multiarch \
|
||||
.
|
||||
|
||||
END_TIME=$(date +%s)
|
||||
BUILD_TIME=$((END_TIME - START_TIME))
|
||||
|
||||
echo -e "${GREEN}✓ 构建完成 (${BUILD_TIME}秒)${NC}"
|
||||
|
||||
# 推送清单
|
||||
echo "[4/4] 创建清单..."
|
||||
docker manifest create "$REGISTRY:$TAG" \
|
||||
"$REGISTRY:$TAG-amd64" \
|
||||
"$REGISTRY:$TAG-arm64" \
|
||||
"$REGISTRY:$TAG-arm-v7" \
|
||||
"$REGISTRY:$TAG-386" 2>/dev/null || true
|
||||
|
||||
docker manifest push "$REGISTRY:$TAG" || true
|
||||
|
||||
echo
|
||||
echo "========================================"
|
||||
echo -e "${GREEN}✓ 多架构构建完成${NC}"
|
||||
echo "========================================"
|
||||
echo
|
||||
echo "镜像标签:"
|
||||
echo " - $REGISTRY:$TAG"
|
||||
echo " - $REGISTRY:latest"
|
||||
echo
|
||||
echo "推送到仓库:"
|
||||
echo " docker pull $REGISTRY:$TAG"
|
||||
echo
|
||||
@@ -0,0 +1,183 @@
|
||||
#!/bin/bash
|
||||
# ============================================
|
||||
# HYC下载站 v2.3 - 系统兼容性检查脚本
|
||||
# 支持: X86_32, X86_64, ARMv7, ARM64, MIPS 等
|
||||
# ============================================
|
||||
|
||||
set -e
|
||||
|
||||
# 颜色
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
echo "========================================"
|
||||
echo " HYC下载站 v2.3 - 兼容性检查"
|
||||
echo "========================================"
|
||||
echo
|
||||
|
||||
# 检测架构
|
||||
ARCH=$(uname -m)
|
||||
OS=$(uname -s)
|
||||
echo "系统信息:"
|
||||
echo " - 架构: $ARCH"
|
||||
echo " - 系统: $OS"
|
||||
echo
|
||||
|
||||
# 架构特定配置
|
||||
case "$ARCH" in
|
||||
x86_64)
|
||||
echo "✓ x86_64 (64位) - 完全支持"
|
||||
RECOMMENDED_WORKERS=4
|
||||
;;
|
||||
i386|i686)
|
||||
echo "⚠ i386/i686 (32位) - 有限支持"
|
||||
RECOMMENDED_WORKERS=2
|
||||
echo " 建议: --workers 2"
|
||||
;;
|
||||
armv7l|armv7hl)
|
||||
echo "✓ ARMv7 (32位) - 完全支持"
|
||||
RECOMMENDED_WORKERS=2
|
||||
;;
|
||||
armv8l|aarch64)
|
||||
echo "✓ ARM64 (64位) - 完全支持"
|
||||
RECOMMENDED_WORKERS=4
|
||||
;;
|
||||
armv6l)
|
||||
echo "⚠ ARMv6 - 有限支持 (可能需要重新编译)"
|
||||
RECOMMENDED_WORKERS=1
|
||||
;;
|
||||
mips*)
|
||||
echo "⚠ MIPS - 实验性支持"
|
||||
RECOMMENDED_WORKERS=1
|
||||
;;
|
||||
*)
|
||||
echo "⚠ 未知架构: $ARCH - 需要测试"
|
||||
RECOMMENDED_WORKERS=1
|
||||
;;
|
||||
esac
|
||||
echo
|
||||
|
||||
# Python 版本检查
|
||||
PYTHON_VERSION=$(python3 --version 2>&1 || echo "未安装")
|
||||
echo "Python 版本: $PYTHON_VERSION"
|
||||
|
||||
PYTHON_MAJOR=$(python3 -c 'import sys; print(sys.version_info.major)' 2>/dev/null || echo "0")
|
||||
PYTHON_MINOR=$(python3 -c 'import sys; print(sys.version_info.minor)' 2>/dev/null || echo "0")
|
||||
|
||||
if [ "$PYTHON_MAJOR" -ge 3 ] && [ "$PYTHON_MINOR" -ge 8 ]; then
|
||||
echo "✓ Python 3.8+ - 支持"
|
||||
else
|
||||
echo "✗ 需要 Python 3.8 或更高版本"
|
||||
exit 1
|
||||
fi
|
||||
echo
|
||||
|
||||
# 内存检查
|
||||
echo "内存检查:"
|
||||
if command -v free &> /dev/null; then
|
||||
TOTAL_MEM=$(free -m | awk '/^Mem:/{print $2}')
|
||||
echo " - 总内存: ${TOTAL_MEM}MB"
|
||||
|
||||
if [ "$TOTAL_MEM" -lt 256 ]; then
|
||||
echo "⚠ 内存低于 256MB - 使用 ultra_low 预设"
|
||||
echo " python main.py --preset ultra_low"
|
||||
elif [ "$TOTAL_MEM" -lt 512 ]; then
|
||||
echo "⚠ 内存 256-512MB - 使用 low 预设"
|
||||
echo " python main.py --preset low"
|
||||
elif [ "$TOTAL_MEM" -lt 1024 ]; then
|
||||
echo "✓ 内存 512MB-1GB - 使用 medium 预设 (默认)"
|
||||
else
|
||||
echo "✓ 内存 1GB+ - 使用 high 预设 (默认)"
|
||||
fi
|
||||
else
|
||||
echo " (无法检测,使用默认配置)"
|
||||
fi
|
||||
echo
|
||||
|
||||
# 磁盘空间检查
|
||||
echo "磁盘空间检查:"
|
||||
DISK_FREE=$(df -BG . | awk '/^\//{print $4}' | sed 's/G//')
|
||||
echo " - 可用: ${DISK_FREE}GB"
|
||||
|
||||
if [ "$DISK_FREE" -lt 1 ]; then
|
||||
echo "⚠ 可用空间不足 1GB"
|
||||
fi
|
||||
echo
|
||||
|
||||
# 必需依赖检查
|
||||
echo "必需依赖检查:"
|
||||
MISSING_DEPS=""
|
||||
|
||||
check_dep() {
|
||||
if command -v "$1" &> /dev/null; then
|
||||
echo " ✓ $1"
|
||||
else
|
||||
echo " ✗ $1 (必需)"
|
||||
MISSING_DEPS="$MISSING_DEPS $1"
|
||||
fi
|
||||
}
|
||||
|
||||
check_dep "python3"
|
||||
echo
|
||||
|
||||
# 可选依赖检查
|
||||
echo "可选依赖检查:"
|
||||
check_opt() {
|
||||
if command -v "$1" &> /dev/null; then
|
||||
echo " ✓ $1"
|
||||
else
|
||||
echo " ⚠ $1 (可选)"
|
||||
fi
|
||||
}
|
||||
|
||||
check_opt "psutil" || pip3 install psutil
|
||||
check_opt "sqlalchemy" || pip3 install sqlalchemy
|
||||
echo
|
||||
|
||||
# Docker 构建检查 (如果使用 Docker)
|
||||
if [ -f "../Dockerfile" ]; then
|
||||
echo "Docker 构建检查:"
|
||||
if command -v docker &> /dev/null; then
|
||||
echo " ✓ Docker 可用"
|
||||
|
||||
# 检查 buildx 支持
|
||||
if docker buildx version &> /dev/null; then
|
||||
echo " ✓ Docker BuildX 支持多架构构建"
|
||||
echo
|
||||
echo "多架构构建命令:"
|
||||
echo " docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t hyc:v2.3 ."
|
||||
fi
|
||||
else
|
||||
echo " ⚠ Docker 不可用 (需要安装 Docker)"
|
||||
fi
|
||||
echo
|
||||
fi
|
||||
|
||||
# 推荐启动命令
|
||||
echo "========================================"
|
||||
echo " 推荐启动命令"
|
||||
echo "========================================"
|
||||
|
||||
# 根据检测结果生成推荐命令
|
||||
CMD="python main.py --preset "
|
||||
|
||||
if [ "$TOTAL_MEM" -lt 256 ]; then
|
||||
CMD="${CMD}ultra_low"
|
||||
elif [ "$TOTAL_MEM" -lt 512 ]; then
|
||||
CMD="${CMD}low"
|
||||
elif [ "$TOTAL_MEM" -lt 1024 ]; then
|
||||
CMD="${CMD}medium"
|
||||
else
|
||||
CMD="${CMD}high"
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "$CMD"
|
||||
echo
|
||||
|
||||
# 完整命令示例
|
||||
echo "完整示例:"
|
||||
echo " $CMD --host 0.0.0.0 --port 8080 --base-dir ./downloads"
|
||||
echo
|
||||
@@ -0,0 +1,69 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
平台检测工具
|
||||
自动检测系统架构并推荐配置
|
||||
"""
|
||||
|
||||
import sys
|
||||
import os
|
||||
|
||||
# 添加项目根目录
|
||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
|
||||
from core.optimization import (
|
||||
ArchitectureDetector, LowMemoryConfig, check_compatibility
|
||||
)
|
||||
|
||||
|
||||
def main():
|
||||
print("=" * 60)
|
||||
print(" HYC下载站 v2.3 - 平台检测")
|
||||
print("=" * 60)
|
||||
print()
|
||||
|
||||
# 架构检测
|
||||
print("[1/3] 架构信息")
|
||||
arch = ArchitectureDetector.get_architecture()
|
||||
for key, value in arch.items():
|
||||
print(f" {key}: {value}")
|
||||
print()
|
||||
|
||||
# 兼容性检查
|
||||
print("[2/3] 兼容性检查")
|
||||
compat = check_compatibility()
|
||||
print(f" 兼容状态: {'✓ 通过' if compat['compatible'] else '✗ 有问题'}")
|
||||
if compat['warnings']:
|
||||
print(" 警告:")
|
||||
for w in compat['warnings']:
|
||||
print(f" ⚠ {w}")
|
||||
print()
|
||||
|
||||
# 推荐配置
|
||||
print("[3/3] 推荐配置")
|
||||
recommended = ArchitectureDetector.get_recommended_config()
|
||||
for key, value in recommended.items():
|
||||
print(f" {key}: {value}")
|
||||
|
||||
# 低内存配置
|
||||
low_mem = LowMemoryConfig('auto')
|
||||
status = low_mem.get_status()
|
||||
print()
|
||||
print(" 自动检测预设:")
|
||||
print(f" - 预设: {status['preset']}")
|
||||
print(f" - 描述: {status['description']}")
|
||||
print()
|
||||
print(" 建议启动命令:")
|
||||
cmd = f"python main.py --preset {status['preset']}"
|
||||
if 'ultra_low' in str(status):
|
||||
cmd += " --disable-ws --disable-sse"
|
||||
print(f" {cmd}")
|
||||
print()
|
||||
|
||||
# 返回状态码
|
||||
return 0 if compat['compatible'] else 1
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(main())
|
||||
@@ -0,0 +1,136 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
MC核心目录结构迁移脚本
|
||||
将旧结构迁移到新结构:
|
||||
旧: MCServerCore/{core}/{major}/{file.jar}
|
||||
新: MCServerCore/{core}/{major}/{version}/{file.jar}
|
||||
|
||||
版本号提取规则:
|
||||
- paper-1.20.1-6550.jar -> 1.20.1
|
||||
- spongeneo-1.21.2-21.2.0-beta-13.0.0-RC1868-universal.jar -> 1.21.2
|
||||
- spongevanilla-1.20.6-11.0.1-RC1916-universal.jar -> 1.20.6
|
||||
"""
|
||||
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def extract_version(filename, core_name):
|
||||
"""
|
||||
从文件名中提取版本号
|
||||
例如: spongevanilla-1.20.6-11.0.1-RC1916-universal.jar -> 1.20.6
|
||||
例如: craftbukkit-1.9.jar -> 1.9
|
||||
例如: spongevanilla-1.17-9.0.0-RC668-universal.jar -> 1.17
|
||||
"""
|
||||
# 去掉 .jar 后缀
|
||||
name_without_jar = filename[:-4] if filename.endswith('.jar') else filename
|
||||
|
||||
# 模式:核心名-版本号-其他
|
||||
# 版本号格式:数字.数字 或 数字.数字.数字 (如 1.9, 1.20.6, 1.21.2)
|
||||
pattern = rf'^{re.escape(core_name)}-(\d+\.\d+(?:\.\d+)?)'
|
||||
match = re.match(pattern, name_without_jar)
|
||||
|
||||
if match:
|
||||
return match.group(1)
|
||||
return None
|
||||
|
||||
|
||||
def migrate_mc_structure(base_dir='./downloads/MCServerCore'):
|
||||
"""迁移MC核心目录结构"""
|
||||
mc_dir = Path(base_dir)
|
||||
|
||||
if not mc_dir.exists():
|
||||
print(f"目录不存在: {mc_dir}")
|
||||
return
|
||||
|
||||
migrated_count = 0
|
||||
skipped_count = 0
|
||||
errors = []
|
||||
|
||||
for jar_file in mc_dir.rglob('*.jar'):
|
||||
try:
|
||||
relative = jar_file.relative_to(mc_dir)
|
||||
parts = relative.parts
|
||||
except ValueError:
|
||||
continue
|
||||
|
||||
# 格式: core/major/file.jar 或 core/major/version/file.jar
|
||||
if len(parts) >= 3:
|
||||
core_name = parts[0]
|
||||
major = parts[1]
|
||||
|
||||
# 如果已经是新结构(len >= 4),跳过
|
||||
if len(parts) >= 4:
|
||||
print(f" 已在正确位置: {relative}")
|
||||
continue
|
||||
|
||||
# 旧结构:core/major/file.jar
|
||||
# 提取版本号
|
||||
version = extract_version(jar_file.name, core_name)
|
||||
|
||||
if not version:
|
||||
print(f" 无法提取版本号: {relative}")
|
||||
skipped_count += 1
|
||||
continue
|
||||
|
||||
# 构建新路径: core/major/version/file.jar
|
||||
new_version_dir = jar_file.parent / version
|
||||
new_path = new_version_dir / jar_file.name
|
||||
|
||||
# 如果目标目录已存在同名文件
|
||||
if new_path.exists():
|
||||
print(f" 目标已存在,跳过: {relative}")
|
||||
skipped_count += 1
|
||||
continue
|
||||
|
||||
try:
|
||||
new_version_dir.mkdir(parents=True, exist_ok=True)
|
||||
shutil.move(str(jar_file), str(new_path))
|
||||
print(f" 移动: {relative} -> {new_path.relative_to(mc_dir)}")
|
||||
migrated_count += 1
|
||||
except Exception as e:
|
||||
errors.append(f"移动失败 {relative}: {e}")
|
||||
else:
|
||||
print(f" 跳过(未知结构): {relative}")
|
||||
skipped_count += 1
|
||||
|
||||
# 尝试清理空的目录
|
||||
cleaned_dirs = 0
|
||||
for dir_path in sorted(mc_dir.rglob('*'), reverse=True):
|
||||
if dir_path.is_dir():
|
||||
try:
|
||||
if not any(dir_path.iterdir()):
|
||||
dir_path.rmdir()
|
||||
cleaned_dirs += 1
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
print(f"\n迁移完成!")
|
||||
print(f" 移动文件: {migrated_count}")
|
||||
print(f" 跳过文件: {skipped_count}")
|
||||
print(f" 清理空目录: {cleaned_dirs}")
|
||||
|
||||
if errors:
|
||||
print(f"\n错误:")
|
||||
for e in errors[:10]:
|
||||
print(f" {e}")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
import sys
|
||||
|
||||
base_dir = sys.argv[1] if len(sys.argv) > 1 else './downloads/MCServerCore'
|
||||
|
||||
print("=" * 60)
|
||||
print("MC核心目录结构迁移工具")
|
||||
print("旧结构: MCServerCore/{core}/{major}/{file.jar}")
|
||||
print("新结构: MCServerCore/{core}/{major}/{version}/{file.jar}")
|
||||
print("=" * 60)
|
||||
print(f"基础目录: {base_dir}")
|
||||
print()
|
||||
|
||||
migrate_mc_structure(base_dir)
|
||||
@@ -0,0 +1,61 @@
|
||||
#!/bin/bash
|
||||
# ============================================
|
||||
# HYC下载站 v2.3 - QEMU 仿真支持设置
|
||||
# 用于在 x86_64 上构建 ARM 镜像
|
||||
# ============================================
|
||||
|
||||
set -e
|
||||
|
||||
echo "========================================"
|
||||
echo " QEMU 仿真支持设置"
|
||||
echo "========================================"
|
||||
|
||||
# 检查是否需要设置
|
||||
if [ "$(uname -m)" = "x86_64" ]; then
|
||||
echo "检测到 x86_64 平台"
|
||||
echo "将启用 ARM/i386 仿真支持"
|
||||
fi
|
||||
|
||||
# 启用 QEMU 仿真
|
||||
echo
|
||||
echo "[1/3] 检查 QEMU ..."
|
||||
|
||||
# 注册 ARM 二进制格式
|
||||
if [ -f /usr/bin/qemu-arm-static ]; then
|
||||
echo "✓ qemu-arm-static 已安装"
|
||||
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes || true
|
||||
elif [ -f /usr/bin/qemu-arm ]; then
|
||||
echo "✓ qemu-arm 已安装"
|
||||
else
|
||||
echo "⚠ QEMU 未安装,正在安装..."
|
||||
apt-get update && apt-get install -y qemu-user-static || \
|
||||
yum install -y qemu-user-static || \
|
||||
apk add --no-cache qemu-arm qemu-i386
|
||||
fi
|
||||
|
||||
# 设置 binfmt-misc
|
||||
echo
|
||||
echo "[2/3] 注册二进制格式..."
|
||||
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes 2>/dev/null || \
|
||||
echo " (可能需要手动配置)"
|
||||
|
||||
echo
|
||||
echo "[3/3] 验证设置..."
|
||||
echo "可用的仿真架构:"
|
||||
|
||||
for arch in arm arm64 i386; do
|
||||
if [ -f "/usr/bin/qemu-$arch-static" ] || [ -f "/usr/bin/qemu-$arch" ]; then
|
||||
echo " ✓ $arch"
|
||||
else
|
||||
echo " ✗ $arch"
|
||||
fi
|
||||
done
|
||||
|
||||
echo
|
||||
echo "========================================"
|
||||
echo "✓ QEMU 设置完成"
|
||||
echo "========================================"
|
||||
echo
|
||||
echo "现在可以构建多架构镜像:"
|
||||
echo " ./scripts/build-multiarch.sh"
|
||||
echo
|
||||
Reference in New Issue
Block a user