commit 3bafd84230fe4510957117cdc7207cbb8d08c964 Author: m1ngsama Date: Tue Oct 28 11:13:41 2025 +0800 init index and upload the scripts of minecraft diff --git a/minecraft/scripts/README.md b/minecraft/scripts/README.md new file mode 100644 index 0000000..2cfb5ea --- /dev/null +++ b/minecraft/scripts/README.md @@ -0,0 +1,11 @@ +```bash +# Structure +minecraft/ +├── automatic/ +│ ├── deploy.sh # 主部署脚本 +│ ├── download-mods.sh # 下载 mods 脚本 +│ ├── logger.sh # 日志模块 +│ ├── requirements.txt # mods 列表 +│ └── server.properties # 服务器配置 +└── mods/ # 下载的 mods(由脚本管理) +``` diff --git a/minecraft/scripts/automatic/deploy.sh b/minecraft/scripts/automatic/deploy.sh new file mode 100755 index 0000000..d98dc32 --- /dev/null +++ b/minecraft/scripts/automatic/deploy.sh @@ -0,0 +1,254 @@ +#!/bin/bash + +# 加载日志模块 +source "$(dirname "$0")/logger.sh" + +# 配置变量 +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" +MODS_SOURCE_DIR="$PROJECT_ROOT/mods" +SERVER_TARGET_DIR="$HOME/repo/mc-fabric" +BACKUP_DIR="$SERVER_TARGET_DIR/backups" + +# 初始化日志 +main init +log_start "Minecraft 服务器自动化部署" +START_TIME=$(date +%s) + +log_info "=== Minecraft 服务器自动化部署 ===" +log_info "脚本目录: $SCRIPT_DIR" +log_info "项目根目录: $PROJECT_ROOT" +log_info "Mods 源目录: $MODS_SOURCE_DIR" +log_info "服务器目标目录: $SERVER_TARGET_DIR" + +# 检查目录是否存在 +check_directories() { + log_info "检查目录结构..." + + if [[ ! -d "$MODS_SOURCE_DIR" ]]; then + log_warning "Mods 源目录不存在,创建: $MODS_SOURCE_DIR" + mkdir -p "$MODS_SOURCE_DIR" + fi + + if [[ ! -d "$SERVER_TARGET_DIR" ]]; then + log_error "服务器目标目录不存在: $SERVER_TARGET_DIR" + log_error "请先创建服务器目录或修改 SERVER_TARGET_DIR 变量" + exit 1 + fi + + log_success "目录检查完成" +} + +# 备份现有 mods +backup_existing_mods() { + local backup_name="mods-backup-$(date +%Y%m%d-%H%M%S)" + local target_mods_dir="$SERVER_TARGET_DIR/mods" + + if [[ -d "$target_mods_dir" && "$(ls -A "$target_mods_dir" 2>/dev/null)" ]]; then + log_info "备份现有 mods..." + mkdir -p "$BACKUP_DIR" + + if tar -czf "$BACKUP_DIR/$backup_name.tar.gz" -C "$SERVER_TARGET_DIR" "mods"; then + log_success "Mods 备份完成: $backup_name.tar.gz" + + # 统计备份信息 + local file_count=$(find "$target_mods_dir" -name "*.jar" | wc -l) + local total_size=$(du -sh "$target_mods_dir" | cut -f1) + log_info "备份内容: $file_count 个 mods 文件, 总大小: $total_size" + else + log_error "Mods 备份失败" + return 1 + fi + else + log_info "没有现有的 mods 需要备份" + fi +} + +# 下载 mods(如果需要) +download_mods_if_needed() { + log_info "检查 mods 下载状态..." + + local mods_count=$(find "$MODS_SOURCE_DIR" -name "*.jar" | wc -l) + + if [[ $mods_count -eq 0 ]]; then + log_warning "未找到任何 mods,开始下载..." + + if [[ -f "$SCRIPT_DIR/download-mods.sh" ]]; then + if "$SCRIPT_DIR/download-mods.sh"; then + log_success "Mods 下载完成" + else + log_error "Mods 下载失败" + return 1 + fi + else + log_error "下载脚本不存在: $SCRIPT_DIR/download-mods.sh" + return 1 + fi + else + log_success "发现 $mods_count 个 mods 文件,跳过下载" + + # 显示 mods 列表 + log_info "当前 mods 列表:" + find "$MODS_SOURCE_DIR" -name "*.jar" -exec basename {} \; | while read mod; do + log_info " - $mod" + done + fi +} + +# 部署 mods 到服务器 +deploy_mods() { + log_info "部署 mods 到服务器..." + + local target_mods_dir="$SERVER_TARGET_DIR/mods" + + # 创建目标 mods 目录 + mkdir -p "$target_mods_dir" + + # 清空目标目录(在备份之后) + if [[ -d "$target_mods_dir" ]]; then + log_info "清空目标 mods 目录..." + rm -f "$target_mods_dir"/*.jar + + # 检查是否清空成功 + local remaining_files=$(find "$target_mods_dir" -name "*.jar" | wc -l) + if [[ $remaining_files -ne 0 ]]; then + log_warning "有 $remaining_files 个文件未能删除,可能是正在被使用" + fi + fi + + # 复制新的 mods + log_info "复制 mods 文件..." + local copied_count=0 + + for mod_file in "$MODS_SOURCE_DIR"/*.jar; do + if [[ -f "$mod_file" ]]; then + local filename=$(basename "$mod_file") + if cp "$mod_file" "$target_mods_dir/"; then + log_success "复制: $filename" + ((copied_count++)) + else + log_error "复制失败: $filename" + fi + fi + done + + if [[ $copied_count -eq 0 ]]; then + log_error "没有成功复制任何 mods 文件" + return 1 + fi + + log_success "Mods 部署完成: 成功复制 $copied_count 个文件" + + # 验证部署 + local deployed_count=$(find "$target_mods_dir" -name "*.jar" | wc -l) + log_info "服务器 mods 目录现有文件: $deployed_count 个" +} + +# 部署服务器配置 +deploy_server_config() { + log_info "部署服务器配置..." + + local config_source="$SCRIPT_DIR/server.properties" + local config_target="$SERVER_TARGET_DIR/server.properties" + + if [[ -f "$config_source" ]]; then + if cp "$config_source" "$config_target"; then + log_success "服务器配置部署完成" + + # 显示配置差异(如果有旧配置) + if [[ -f "${config_target}.old" ]]; then + log_info "配置变更摘要:" + diff -u "${config_target}.old" "$config_target" | head -20 + fi + + # 备份旧配置 + if [[ -f "$config_target" ]]; then + cp "$config_target" "${config_target}.old" + fi + else + log_error "服务器配置部署失败" + fi + else + log_warning "未找到服务器配置文件: $config_source" + fi +} + +# 检查服务器状态 +check_server_status() { + log_info "检查服务器状态..." + + # 检查服务器进程 + if pgrep -f "fabric-server-mc" >/dev/null; then + log_warning "检测到服务器正在运行,部署后需要重启服务器" + SERVER_RUNNING=true + else + log_info "服务器当前未运行" + SERVER_RUNNING=false + fi + + # 检查关键文件 + local essential_files=( + "$SERVER_TARGET_DIR/eula.txt" + "$SERVER_TARGET_DIR/server.properties" + "$SERVER_TARGET_DIR/fabric-server-mc.1.21.1-loader.0.17.2-launcher.1.1.0.jar" + ) + + for file in "${essential_files[@]}"; do + if [[ -f "$file" ]]; then + log_success "存在: $(basename "$file")" + else + log_warning "缺失: $(basename "$file")" + fi + done +} + +# 显示部署摘要 +show_deployment_summary() { + log_separator + log_success "=== 部署完成摘要 ===" + + local deployed_mods=$(find "$SERVER_TARGET_DIR/mods" -name "*.jar" | wc -l) + local source_mods=$(find "$MODS_SOURCE_DIR" -name "*.jar" | wc -l) + + log_info "部署的 mods 数量: $deployed_mods" + log_info "源 mods 数量: $source_mods" + log_info "备份位置: $BACKUP_DIR" + + if [[ "$SERVER_RUNNING" == "true" ]]; then + log_warning "⚠️ 服务器正在运行,需要重启以应用更改" + log_info "重启命令: cd $SERVER_TARGET_DIR && ./boot.sh stop && ./boot.sh start" + else + log_info "启动服务器: cd $SERVER_TARGET_DIR && ./boot.sh start" + fi + + log_info "查看服务器日志: tail -f $SERVER_TARGET_DIR/logs/latest.log" +} + +# 主部署流程 +main_deployment() { + log_info "开始自动化部署流程..." + + # 执行各个步骤 + check_directories + check_server_status + backup_existing_mods + download_mods_if_needed + deploy_mods + deploy_server_config + + log_success "所有部署步骤完成" +} + +# 执行部署 +if main_deployment; then + END_TIME=$(date +%s) + DURATION=$((END_TIME - START_TIME)) + + show_deployment_summary + log_end 0 "$DURATION" + show_log_location +else + log_error "部署过程中出现错误" + log_end 1 + exit 1 +fi diff --git a/minecraft/scripts/automatic/download-mods.sh b/minecraft/scripts/automatic/download-mods.sh new file mode 100755 index 0000000..cac5327 --- /dev/null +++ b/minecraft/scripts/automatic/download-mods.sh @@ -0,0 +1,128 @@ +#!/bin/bash + +# 加载日志模块 +source "$(dirname "$0")/logger.sh" + +MODS_FILE="./requirements.txt" +MODS_DIR="./data/mods" + +# 初始化日志 +main init +log_start "Minecraft 1.21.1 Fabric Mods 下载" +START_TIME=$(date +%s) + +mkdir -p $MODS_DIR + +log_info "开始下载 Minecraft 1.21.1 Fabric mods..." +log_info "Mods 文件: $MODS_FILE" +log_info "目标目录: $MODS_DIR" + +# 测试网络连接 +log_info "测试 Modrinth API 连接..." +if ! curl -s "https://api.modrinth.com/v2/project/fabric-api" >/dev/null; then + log_error "无法连接到 Modrinth API,请检查网络" + exit 1 +fi +log_success "API 连接正常" + +download_mod() { + local project_slug="$1" + local mod_name="$2" + + log_info "正在处理: $mod_name ($project_slug)" + + # 获取项目信息 + project_info=$(curl -s "https://api.modrinth.com/v2/project/$project_slug") + if [[ $? -ne 0 || -z "$project_info" ]]; then + log_error "无法获取项目信息: $project_slug" + return 1 + fi + + # 获取版本信息 + versions_url="https://api.modrinth.com/v2/project/$project_slug/version?game_versions=%5B%221.21.1%22%5D&loaders=%5B%22fabric%22%5D" + + log_info "获取版本信息..." + versions_response=$(curl -s "$versions_url") + + if [[ $? -ne 0 || -z "$versions_response" ]]; then + log_error "无法获取版本信息" + return 1 + fi + + # 检查是否返回空数组 + if [[ "$versions_response" == "[]" ]]; then + log_warning "没有找到 1.21.1 Fabric 版本的 $mod_name" + return 1 + fi + + # 提取最新版本的信息 + filename=$(echo "$versions_response" | grep -o '"filename":"[^"]*"' | head -1 | cut -d'"' -f4) + download_url=$(echo "$versions_response" | grep -o '"url":"[^"]*"' | head -1 | cut -d'"' -f4) + + if [[ -z "$filename" || -z "$download_url" ]]; then + log_error "无法解析下载信息" + return 1 + fi + + log_info "文件名: $filename" + log_info "下载链接: $download_url" + + # 下载文件 + log_info "下载中..." + if curl -L -o "$MODS_DIR/$filename" "$download_url"; then + file_size=$(stat -c%s "$MODS_DIR/$filename" 2>/dev/null || stat -f%z "$MODS_DIR/$filename" 2>/dev/null) + if [[ $file_size -gt 1000 ]]; then + log_success "成功下载: $filename ($(($file_size / 1024)) KB)" + return 0 + else + log_error "文件大小异常: $filename (只有 $file_size 字节)" + rm -f "$MODS_DIR/$filename" + return 1 + fi + else + log_error "下载失败" + return 1 + fi +} + +# 读取 mods 文件 +success_count=0 +fail_count=0 + +while IFS='|' read -r mod_name project_slug version; do + # 去除空白字符 + mod_name=$(echo "$mod_name" | xargs) + project_slug=$(echo "$project_slug" | xargs) + version=$(echo "$version" | xargs) + + # 跳过空行和注释 + if [[ -z "$mod_name" || "$mod_name" == \#* ]]; then + continue + fi + + log_separator + if download_mod "$project_slug" "$mod_name"; then + ((success_count++)) + else + ((fail_count++)) + fi + + sleep 1 + +done <"$MODS_FILE" + +END_TIME=$(date +%s) +DURATION=$((END_TIME - START_TIME)) + +log_separator +log_info "Minecraft 1.21.1 Fabric mods 下载完成!" +log_info "位置: $MODS_DIR" +log_info "统计: 成功 $success_count, 失败 $fail_count" + +# 记录最终文件列表 +log_info "最终文件列表:" +ls -la "$MODS_DIR" >>"$LOG_FILE" 2>/dev/null +log_command "ls -la \"$MODS_DIR\"" + +log_end 0 "$DURATION" +show_log_location diff --git a/minecraft/scripts/automatic/logger.sh b/minecraft/scripts/automatic/logger.sh new file mode 100755 index 0000000..e2f6e0b --- /dev/null +++ b/minecraft/scripts/automatic/logger.sh @@ -0,0 +1,167 @@ +#!/bin/bash + +LOG_FILE="./logs/mod-install-log.txt" +mkdir -p "$(dirname "$LOG_FILE")" + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# 初始化日志文件 +init_log() { + echo "==================================================" >"$LOG_FILE" + echo "Minecraft Mod 安装日志" >>"$LOG_FILE" + echo "开始时间: $(date)" >>"$LOG_FILE" + echo "==================================================" >>"$LOG_FILE" + echo "" >>"$LOG_FILE" +} + +# 记录系统信息 +log_system_info() { + { + echo "=== 系统信息 ===" + echo "主机名: $(hostname)" + echo "操作系统: $(uname -s) $(uname -r)" + echo "架构: $(uname -m)" + + # CPU 信息 + if command -v nproc >/dev/null; then + echo "CPU 核心数: $(nproc)" + fi + + if command -v lscpu >/dev/null; then + echo "CPU 型号: $(lscpu | grep "Model name" | cut -d: -f2 | xargs)" + fi + + # 内存信息 + if command -v free >/dev/null; then + echo "内存总量: $(free -h | grep Mem: | awk '{print $2}')" + echo "可用内存: $(free -h | grep Mem: | awk '{print $7}')" + fi + + # 磁盘信息 + echo "磁盘使用:" + df -h . | tail -1 | awk '{print " 总量: " $2 ", 可用: " $4 ", 使用率: " $5}' + + # 网络信息 + echo "公网 IP: $(curl -s ifconfig.me 2>/dev/null || echo "无法获取")" + echo "" + } >>"$LOG_FILE" +} + +# 记录命令开始 +log_start() { + local command_name="$1" + local timestamp=$(date '+%Y-%m-%d %H:%M:%S') + + { + echo "╔═══════════════════════════════════════════════" + echo "║ 命令: $command_name" + echo "║ 开始时间: $timestamp" + echo "║ 工作目录: $(pwd)" + echo "║ 用户: $(whoami)" + echo "╚═══════════════════════════════════════════════" + echo "" + } >>"$LOG_FILE" +} + +# 记录命令结束 +log_end() { + local exit_code="$1" + local timestamp=$(date '+%Y-%m-%d %H:%M:%S') + local duration="${2:-0}" + + { + echo "" + echo "╔═══════════════════════════════════════════════" + echo "║ 结束时间: $timestamp" + if [[ -n "$duration" && "$duration" != "0" ]]; then + echo "║ 执行时长: ${duration}秒" + fi + echo "║ 退出代码: $exit_code" + echo "║ 状态: $([ $exit_code -eq 0 ] && echo "成功" || echo "失败")" + echo "╚═══════════════════════════════════════════════" + echo "" + echo "" + } >>"$LOG_FILE" +} + +# 记录信息(同时输出到屏幕和日志) +log_info() { + local message="$1" + local timestamp=$(date '+%Y-%m-%d %H:%M:%S') + echo -e "${BLUE}[INFO]${NC} $message" + echo "[$timestamp] [INFO] $message" >>"$LOG_FILE" +} + +# 记录成功 +log_success() { + local message="$1" + local timestamp=$(date '+%Y-%m-%d %H:%M:%S') + echo -e "${GREEN}[SUCCESS]${NC} $message" + echo "[$timestamp] [SUCCESS] $message" >>"$LOG_FILE" +} + +# 记录警告 +log_warning() { + local message="$1" + local timestamp=$(date '+%Y-%m-%d %H:%M:%S') + echo -e "${YELLOW}[WARNING]${NC} $message" + echo "[$timestamp] [WARNING] $message" >>"$LOG_FILE" +} + +# 记录错误 +log_error() { + local message="$1" + local timestamp=$(date '+%Y-%m-%d %H:%M:%S') + echo -e "${RED}[ERROR]${NC} $message" + echo "[$timestamp] [ERROR] $message" >>"$LOG_FILE" +} + +# 记录命令输出 +log_command() { + local command="$1" + local timestamp=$(date '+%Y-%m-%d %H:%M:%S') + + { + echo "[$timestamp] [COMMAND] 执行: $command" + echo "[$timestamp] [OUTPUT]" + } >>"$LOG_FILE" + + # 执行命令并捕获输出 + eval "$command" 2>&1 | while IFS= read -r line; do + echo "[$timestamp] [OUTPUT] $line" >>"$LOG_FILE" + echo "$line" # 同时输出到屏幕 + done + + local exit_code=${PIPESTATUS[0]} + echo "[$timestamp] [COMMAND] 退出代码: $exit_code" >>"$LOG_FILE" + return $exit_code +} + +# 记录分隔线 +log_separator() { + echo "--------------------------------------------------" >>"$LOG_FILE" +} + +# 显示日志位置 +show_log_location() { + log_info "详细日志已保存到: $LOG_FILE" + log_info "查看日志: tail -f $LOG_FILE" +} + +# 主函数 +main() { + if [[ "$1" == "init" ]]; then + init_log + log_system_info + fi +} + +# 如果直接执行此脚本,则初始化 +if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then + main "$@" +fi diff --git a/minecraft/scripts/automatic/requirements.txt b/minecraft/scripts/automatic/requirements.txt new file mode 100644 index 0000000..29978ab --- /dev/null +++ b/minecraft/scripts/automatic/requirements.txt @@ -0,0 +1,19 @@ +# Minecraft 1.21.1 Fabric Mods +# 格式: mod名称 | 项目slug | 版本号(可选) + +# Fabric API (必需) +fabric-api | fabric-api | 0.100.3+1.21.1 + +# 锂 (Lithium) - 性能优化 +lithium | lithium | 0.12.2+1.21.1 + +# 磷 (Phosphor) - 光照优化 +phosphor | phosphor | 0.8.2+1.21.1 + +# 钠 (Sodium) - 渲染优化 +sodium | sodium | 0.5.11+1.21.1 + +# Iris Shaders - 着色器支持 +iris | iris | 1.7.2+1.21.1 + +# 注意:版本号可以不写,会自动下载最新版本 diff --git a/minecraft/scripts/automatic/server.properties b/minecraft/scripts/automatic/server.properties new file mode 100644 index 0000000..d4f1d3d --- /dev/null +++ b/minecraft/scripts/automatic/server.properties @@ -0,0 +1,53 @@ +# Minecraft 服务器配置 +enable-jmx-monitoring=false +rcon.port=25575 +level-seed= +gamemode=survival +enable-command-block=false +enable-query=false +generator-settings={} +enforce-secure-profile=true +level-name=world +motd=My Automated Fabric Server +query.port=25565 +pvp=true +generate-structures=true +max-chained-neighbor-updates=1000000 +difficulty=normal +network-compression-threshold=256 +max-tick-time=60000 +require-resource-pack=false +use-native-transport=true +max-players=20 +online-mode=false +enable-status=true +allow-flight=false +broadcast-rcon-to-ops=true +view-distance=10 +server-ip= +resource-pack-prompt= +allow-nether=true +server-port=25565 +enable-rcon=true +sync-chunk-writes=true +op-permission-level=4 +prevent-proxy-connections=false +hide-online-players=false +resource-pack= +entity-broadcast-range-percentage=100 +simulation-distance=10 +rcon.password=changeme123 +player-idle-timeout=0 +force-gamemode=false +rate-limit=0 +hardcore=false +white-list=false +broadcast-console-to-ops=true +spawn-npcs=true +spawn-animals=true +function-permission-level=2 +level-type=minecraft\:normal +spawn-monsters=true +enforce-whitelist=false +spawn-protection=16 +max-world-size=29999984 diff --git a/minecraft/scripts/mods/fabric-api-0.116.7+1.21.1.jar b/minecraft/scripts/mods/fabric-api-0.116.7+1.21.1.jar new file mode 100644 index 0000000..dc0326a Binary files /dev/null and b/minecraft/scripts/mods/fabric-api-0.116.7+1.21.1.jar differ diff --git a/minecraft/scripts/mods/iris-fabric-1.8.8+mc1.21.1.jar b/minecraft/scripts/mods/iris-fabric-1.8.8+mc1.21.1.jar new file mode 100644 index 0000000..f38f268 Binary files /dev/null and b/minecraft/scripts/mods/iris-fabric-1.8.8+mc1.21.1.jar differ diff --git a/minecraft/scripts/mods/lithium-fabric-0.15.0+mc1.21.1.jar b/minecraft/scripts/mods/lithium-fabric-0.15.0+mc1.21.1.jar new file mode 100644 index 0000000..e160ff9 Binary files /dev/null and b/minecraft/scripts/mods/lithium-fabric-0.15.0+mc1.21.1.jar differ diff --git a/minecraft/scripts/mods/sodium-fabric-0.6.13+mc1.21.1.jar b/minecraft/scripts/mods/sodium-fabric-0.6.13+mc1.21.1.jar new file mode 100644 index 0000000..1155b6e Binary files /dev/null and b/minecraft/scripts/mods/sodium-fabric-0.6.13+mc1.21.1.jar differ