#!/bin/bash # CloudWAF 部署脚本 - Gname DNS 提供商更新 # 使用方法: ./deploy.sh [zip文件路径] set -e # 遇到错误立即退出 # ========== 配置区域 ========== # 支持环境变量和配置文件 # 从环境变量读取 INSTALL_BASE_DIR="${BRAND_INSTALL_PATH:-/usr/local/goedge}" # 从配置文件读取(如果存在) if [ -f "/etc/goedge/brand.conf" ]; then source /etc/goedge/brand.conf if [ -n "$BRAND_INSTALL_PATH" ]; then INSTALL_BASE_DIR="$BRAND_INSTALL_PATH" fi fi # 如果通过参数传入 zip 文件路径,则使用参数;否则使用默认路径 ZIP_FILE_RAW="${1:-/tmp/edge-admin-linux-amd64-plus-v1.3.8.zip}" # 获取绝对路径,防止 cd 到临时目录后找不到文件 if [[ "$ZIP_FILE_RAW" = /* ]]; then ZIP_FILE="$ZIP_FILE_RAW" else ZIP_FILE="$(pwd)/$ZIP_FILE_RAW" fi TARGET_DIR="${INSTALL_BASE_DIR}/edge-admin" BACKUP_DIR="${INSTALL_BASE_DIR}/backup_$(date +%Y%m%d_%H%M%S)" TEMP_DIR="/tmp/edge-admin-update-$(date +%s)" # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # 日志函数 log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # ========== 检查前置条件 ========== check_prerequisites() { log_info "检查前置条件..." # 检查 zip 文件是否存在 if [ ! -f "$ZIP_FILE" ]; then log_error "未找到更新包: $ZIP_FILE" log_info "使用方法: $0 [zip文件路径]" exit 1 fi # 检查目标目录是否存在 if [ ! -d "$TARGET_DIR" ]; then log_error "目标目录不存在: $TARGET_DIR" exit 1 fi # 检查是否有足够的磁盘空间(至少 500MB) available_space=$(df "$TARGET_DIR" | tail -1 | awk '{print $4}') if [ "$available_space" -lt 512000 ]; then log_warn "可用磁盘空间不足 500MB,可能影响部署" fi log_info "前置条件检查通过" } # ========== 1. 备份关键目录 ========== backup_files() { log_info "==========================================" log_info "步骤 1: 备份关键目录" log_info "==========================================" mkdir -p "$BACKUP_DIR" # 备份 EdgeAdmin 配置 if [ -d "$TARGET_DIR/configs" ]; then log_info "备份 EdgeAdmin 配置文件..." cp -r "$TARGET_DIR/configs" "$BACKUP_DIR/edge-admin-configs" log_info "✅ EdgeAdmin 配置已备份" else log_warn "EdgeAdmin configs 目录不存在,跳过备份" fi # 备份 EdgeAdmin 日志(可选) if [ -d "$TARGET_DIR/logs" ]; then log_info "备份 EdgeAdmin 日志文件..." cp -r "$TARGET_DIR/logs" "$BACKUP_DIR/edge-admin-logs" 2>/dev/null || true fi # 备份 EdgeAPI 配置和数据 if [ -d "$TARGET_DIR/edge-api" ]; then if [ -d "$TARGET_DIR/edge-api/configs" ]; then log_info "备份 EdgeAPI 配置文件..." cp -r "$TARGET_DIR/edge-api/configs" "$BACKUP_DIR/edge-api-configs" log_info "✅ EdgeAPI 配置已备份" fi if [ -d "$TARGET_DIR/edge-api/logs" ]; then log_info "备份 EdgeAPI 日志文件..." cp -r "$TARGET_DIR/edge-api/logs" "$BACKUP_DIR/edge-api-logs" 2>/dev/null || true fi if [ -d "$TARGET_DIR/edge-api/data" ]; then log_info "备份 EdgeAPI 数据文件..." cp -r "$TARGET_DIR/edge-api/data" "$BACKUP_DIR/edge-api-data" 2>/dev/null || true fi fi log_info "✅ 备份完成,备份位置: $BACKUP_DIR" echo "" } # ========== 2. 停止服务 ========== stop_services() { log_info "==========================================" log_info "步骤 2: 停止服务" log_info "==========================================" if [ -f "$TARGET_DIR/bin/edge-admin" ]; then log_info "停止 EdgeAdmin 服务..." "$TARGET_DIR/bin/edge-admin" stop || true sleep 2 # 检查是否还有进程在运行 (精确匹配二进制路径,避免杀死解析 zip 路径的脚本自身) if pgrep -f "$TARGET_DIR/bin/edge-admin" > /dev/null; then log_warn "检测到 edge-admin 进程仍在运行,尝试强制停止..." pkill -9 -f "$TARGET_DIR/bin/edge-admin" || true sleep 1 fi log_info "✅ 服务已停止" else log_warn "未找到 edge-admin 可执行文件,跳过停止步骤" fi echo "" } # ========== 3. 解压新版本 ========== extract_package() { log_info "==========================================" log_info "步骤 3: 解压新版本" log_info "==========================================" log_info "解压更新包到临时目录: $TEMP_DIR" mkdir -p "$TEMP_DIR" cd "$TEMP_DIR" if ! unzip -q "$ZIP_FILE"; then log_error "解压失败,请检查 zip 文件是否损坏" exit 1 fi log_info "✅ 解压完成" echo "" } # ========== 4. 替换文件 ========== replace_files() { log_info "==========================================" log_info "步骤 4: 替换文件" log_info "==========================================" # 替换 EdgeAdmin bin if [ -d "$TEMP_DIR/edge-admin/bin" ]; then log_info "替换 EdgeAdmin 可执行文件..." rm -rf "$TARGET_DIR/bin" mkdir -p "$TARGET_DIR/bin" cp -r "$TEMP_DIR/edge-admin/bin"/* "$TARGET_DIR/bin/" log_info "✅ EdgeAdmin bin 已更新" fi # 替换 EdgeAdmin web(排除 tmp) if [ -d "$TEMP_DIR/edge-admin/web" ]; then log_info "替换 EdgeAdmin 前端文件..." rm -rf "$TARGET_DIR/web" cp -r "$TEMP_DIR/edge-admin/web" "$TARGET_DIR/" mkdir -p "$TARGET_DIR/web/tmp" rm -rf "$TARGET_DIR/web/tmp"/* 2>/dev/null || true log_info "✅ EdgeAdmin web 已更新" fi # 替换 EdgeAPI 文件 if [ -d "$TEMP_DIR/edge-admin/edge-api" ]; then log_info "替换 EdgeAPI 文件..." # 确保 edge-api 目录存在 mkdir -p "$TARGET_DIR/edge-api" # 替换 bin if [ -d "$TEMP_DIR/edge-admin/edge-api/bin" ]; then rm -rf "$TARGET_DIR/edge-api/bin" mkdir -p "$TARGET_DIR/edge-api/bin" cp -r "$TEMP_DIR/edge-admin/edge-api/bin"/* \ "$TARGET_DIR/edge-api/bin/" 2>/dev/null || true log_info "✅ EdgeAPI bin 已更新" fi # 替换 deploy(节点安装包) if [ -d "$TEMP_DIR/edge-admin/edge-api/deploy" ]; then rm -rf "$TARGET_DIR/edge-api/deploy" mkdir -p "$TARGET_DIR/edge-api/deploy" cp -r "$TEMP_DIR/edge-admin/edge-api/deploy"/* \ "$TARGET_DIR/edge-api/deploy/" 2>/dev/null || true log_info "✅ EdgeAPI deploy 已更新" fi # 替换 installers(安装工具) if [ -d "$TEMP_DIR/edge-admin/edge-api/installers" ]; then rm -rf "$TARGET_DIR/edge-api/installers" mkdir -p "$TARGET_DIR/edge-api/installers" cp -r "$TEMP_DIR/edge-admin/edge-api/installers"/* \ "$TARGET_DIR/edge-api/installers/" 2>/dev/null || true log_info "✅ EdgeAPI installers 已更新" fi fi log_info "✅ 文件替换完成" echo "" } # ========== 5. 恢复配置文件 ========== restore_configs() { log_info "==========================================" log_info "步骤 5: 恢复配置文件" log_info "==========================================" # 恢复 EdgeAdmin 配置 if [ -d "$BACKUP_DIR/edge-admin-configs" ]; then log_info "恢复 EdgeAdmin 配置文件..." cp -r "$BACKUP_DIR/edge-admin-configs"/* "$TARGET_DIR/configs/" log_info "✅ EdgeAdmin 配置已恢复" else log_warn "未找到 EdgeAdmin 配置备份,请手动检查配置文件" fi # 恢复 EdgeAPI 配置 if [ -d "$BACKUP_DIR/edge-api-configs" ]; then log_info "恢复 EdgeAPI 配置文件..." mkdir -p "$TARGET_DIR/edge-api/configs" cp -r "$BACKUP_DIR/edge-api-configs"/* "$TARGET_DIR/edge-api/configs/" 2>/dev/null || true log_info "✅ EdgeAPI 配置已恢复" else log_warn "未找到 EdgeAPI 配置备份,如果存在 edge-api 目录,请手动检查配置文件" fi log_info "✅ 配置文件恢复完成" echo "" } # ========== 6. 清理临时文件 ========== cleanup() { log_info "==========================================" log_info "步骤 6: 清理临时文件" log_info "==========================================" rm -rf "$TEMP_DIR" log_info "✅ 临时文件已清理" echo "" } # ========== 7. 启动服务 ========== start_services() { log_info "==========================================" log_info "步骤 7: 启动服务" log_info "==========================================" if [ -f "$TARGET_DIR/bin/edge-admin" ]; then log_info "启动 EdgeAdmin 服务..." "$TARGET_DIR/bin/edge-admin" start sleep 3 # 检查服务状态 if pgrep -f "$TARGET_DIR/bin/edge-admin" > /dev/null; then log_info "✅ 服务启动成功" else log_warn "服务可能未正常启动,请检查日志" log_info "查看日志: tail -f $TARGET_DIR/logs/run.log" fi else log_error "未找到 edge-admin 可执行文件" exit 1 fi echo "" } # ========== 主函数 ========== main() { echo "" log_info "==========================================" log_info "CloudWAF 部署脚本 - Gname DNS 提供商更新" log_info "==========================================" echo "" log_info "部署配置:" log_info " ZIP 文件: $ZIP_FILE" log_info " 目标目录: $TARGET_DIR" log_info " 备份目录: $BACKUP_DIR" echo "" # 确认操作 read -p "确认开始部署? (y/N): " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then log_info "部署已取消" exit 0 fi echo "" # 执行部署步骤 check_prerequisites backup_files stop_services extract_package replace_files restore_configs cleanup start_services # 完成 log_info "==========================================" log_info "✅ 部署完成!" log_info "==========================================" echo "" log_info "备份位置: $BACKUP_DIR" log_info "请检查服务运行状态和日志" echo "" log_info "验证步骤:" log_info "1. 检查服务进程: ps aux | grep \"$TARGET_DIR/bin/edge-admin\"" log_info "2. 检查服务日志: tail -f $TARGET_DIR/logs/run.log" log_info "3. 访问管理后台,测试 Gname DNS 提供商功能" echo "" } # 执行主函数 main