automa/minecraft/scripts/setup.sh
m1ngsama 0fe7ed79ad refactor: 重构Minecraft服务器自动化管理方案
## 重构内容

### 新增自动化脚本系统 (scripts/)
- utils.sh: 通用工具库(日志、Docker操作、备份、网络检查)
- setup.sh: 环境初始化脚本(目录结构、权限、配置验证)
- mod-manager.sh: Mods管理(Modrinth下载、更新、清理)
- backup.sh: 备份管理(世界/配置/mods备份、恢复、清理)
- monitor.sh: 服务器监控(状态、资源、玩家、日志分析)

### 增强Makefile集成
新增命令:
- minecraft-status: 服务器状态检查
- minecraft-setup: 环境初始化
- minecraft-mods-*: Mods管理命令
- minecraft-backup-*: 备份管理命令

### 完善文档
- 重写README: 详细的使用指南、故障排查、迁移指南
- 新增CHANGELOG: 完整的重构说明和技术细节

## 架构改进

### 整合原有设计
- 继承src/automatic/的日志系统设计
- 改进Modrinth API集成逻辑
- 优化部署流程和备份机制

### 新增优势
- Docker优先的容器化方案
- 模块化脚本设计,职责单一
- Makefile统一管理入口
- 完整的生命周期自动化

## 技术特性

- 完善的错误处理和日志记录
- macOS/Linux跨平台兼容
- 敏感信息安全管理
- 持续监控模式

## 向后兼容

- 保留src/automatic/旧脚本(供参考)
- 配置文件格式完全兼容
- Docker Compose配置无变化
2025-12-09 10:00:00 +08:00

184 lines
4.3 KiB
Bash
Executable file

#!/usr/bin/env bash
# Minecraft 服务器初始化脚本
# 用于首次部署或环境重置
set -e
# 加载工具库
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/utils.sh"
# ============================================
# 配置变量
# ============================================
readonly PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
# ============================================
# 初始化检查
# ============================================
check_prerequisites() {
log_info "检查系统环境..."
# 检查 Docker
if ! check_docker; then
log_error "Docker 环境检查失败"
exit 1
fi
# 检查必需文件
local required_files=(
"$PROJECT_ROOT/docker-compose.yml"
"$PROJECT_ROOT/.env"
)
for file in "${required_files[@]}"; do
if ! check_file "$file"; then
log_error "缺少必需文件"
exit 1
fi
done
log_success "环境检查通过"
}
# ============================================
# 目录结构初始化
# ============================================
init_directories() {
log_info "初始化目录结构..."
local dirs=(
"$PROJECT_ROOT/data"
"$PROJECT_ROOT/mods"
"$PROJECT_ROOT/configs"
"$PROJECT_ROOT/backups"
"$PROJECT_ROOT/logs"
)
for dir in "${dirs[@]}"; do
if [[ ! -d "$dir" ]]; then
mkdir -p "$dir"
log_success "创建目录: $(basename "$dir")"
else
log_info "目录已存在: $(basename "$dir")"
fi
done
}
# ============================================
# 配置文件初始化
# ============================================
check_env_config() {
log_info "检查环境配置..."
local env_file="$PROJECT_ROOT/.env"
# 检查关键配置
if grep -q "your_rcon_password_here" "$env_file"; then
log_warning ".env 中的 RCON_PASSWORD 未配置"
log_warning "请编辑 .env 文件并设置安全的密码"
fi
# 检查 UID/GID
local current_uid=$(id -u)
local current_gid=$(id -g)
if ! grep -q "UID=$current_uid" "$env_file"; then
log_info "当前用户 UID: $current_uid"
log_warning "建议更新 .env 中的 UID 为: $current_uid"
fi
if ! grep -q "GID=$current_gid" "$env_file"; then
log_info "当前用户 GID: $current_gid"
log_warning "建议更新 .env 中的 GID 为: $current_gid"
fi
}
# ============================================
# Mods 初始化
# ============================================
init_mods() {
log_info "检查 Mods 状态..."
local mods_count=$(find "$PROJECT_ROOT/mods" -name "*.jar" 2>/dev/null | wc -l)
if [[ $mods_count -eq 0 ]]; then
log_warning "未找到任何 mods"
log_info "建议运行: make minecraft-mods-download"
else
log_success "发现 $mods_count 个 mods"
fi
}
# ============================================
# 权限设置
# ============================================
fix_permissions() {
log_info "修复文件权限..."
# 确保脚本可执行
find "$PROJECT_ROOT/scripts" -name "*.sh" -type f -exec chmod +x {} \;
# 确保数据目录可写
if [[ -d "$PROJECT_ROOT/data" ]]; then
chmod -R 755 "$PROJECT_ROOT/data"
fi
log_success "权限修复完成"
}
# ============================================
# 显示配置摘要
# ============================================
show_summary() {
log_separator
log_success "初始化完成!"
echo ""
log_info "配置摘要:"
log_info " 项目目录: $PROJECT_ROOT"
log_info " Docker Compose: $(get_docker_compose_cmd)"
log_info " Mods 数量: $(find "$PROJECT_ROOT/mods" -name "*.jar" 2>/dev/null | wc -l)"
echo ""
log_info "后续步骤:"
log_info " 1. 检查并编辑 .env 文件,设置 RCON_PASSWORD"
log_info " 2. 如需下载 mods: make minecraft-mods-download"
log_info " 3. 启动服务器: make minecraft-up"
log_info " 4. 查看日志: make minecraft-logs"
echo ""
show_log_file
}
# ============================================
# 主函数
# ============================================
main() {
# 初始化日志
init_log "Minecraft 服务器初始化"
log_system_info
log_info "开始初始化 Minecraft 服务器环境..."
log_separator
# 执行初始化步骤
check_prerequisites
init_directories
check_env_config
init_mods
fix_permissions
# 显示摘要
show_summary
}
# 执行主函数
main "$@"