#!/bin/bash # 自动部署脚本 - 部署到 1Panel Docker 容器 # 使用方法: ./deploy.sh # deploy_package_path: 部署包路径(如 /ci-artifacts/server-deploy-latest.tar.gz) set -e DEPLOY_PACKAGE="$1" CONTAINER_NAME="${CONTAINER_NAME:-lunar-server}" DEPLOY_DIR="${DEPLOY_DIR:-/opt/lunar/production}" BACKUP_DIR="${BACKUP_DIR:-/opt/lunar/backups}" # 颜色输出 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" } # 检查部署包是否存在 if [ ! -f "$DEPLOY_PACKAGE" ]; then log_error "部署包不存在: $DEPLOY_PACKAGE" exit 1 fi log_info "开始自动部署..." log_info "部署包: $DEPLOY_PACKAGE" log_info "目标容器: $CONTAINER_NAME" log_info "部署目录: $DEPLOY_DIR" # 创建必要的目录 mkdir -p "$DEPLOY_DIR" mkdir -p "$BACKUP_DIR" # 备份当前版本 TIMESTAMP=$(date +%Y%m%d_%H%M%S) BACKUP_FILE="$BACKUP_DIR/backup_${TIMESTAMP}.tar.gz" if [ -d "$DEPLOY_DIR/current" ]; then log_info "备份当前版本到: $BACKUP_FILE" tar -czf "$BACKUP_FILE" -C "$DEPLOY_DIR" current/ || log_warn "备份失败,继续部署" fi # 解压新版本 log_info "解压部署包..." TEMP_DIR=$(mktemp -d) tar -xzf "$DEPLOY_PACKAGE" -C "$TEMP_DIR" # 检查解压后的目录结构 if [ ! -d "$TEMP_DIR/deploy" ]; then log_error "部署包结构错误:缺少 deploy 目录" rm -rf "$TEMP_DIR" exit 1 fi # 部署新版本 log_info "部署新版本..." rm -rf "$DEPLOY_DIR/current" mv "$TEMP_DIR/deploy" "$DEPLOY_DIR/current" rm -rf "$TEMP_DIR" # 设置权限 log_info "设置文件权限..." chmod +x "$DEPLOY_DIR/current/bin/server" || log_warn "设置可执行权限失败" # 检查 Docker 容器是否存在 if ! docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then log_error "Docker 容器不存在: $CONTAINER_NAME" log_info "请在 1Panel 中创建容器,或使用以下命令:" echo "" echo "docker run -d \\" echo " --name $CONTAINER_NAME \\" echo " -v $DEPLOY_DIR/current:/app \\" echo " -p 8080:8080 \\" echo " --restart unless-stopped \\" echo " golang:1.22-bookworm \\" echo " /app/bin/server" echo "" exit 1 fi # 重启 Docker 容器 log_info "重启 Docker 容器: $CONTAINER_NAME" if docker restart "$CONTAINER_NAME"; then log_info "✅ 容器重启成功" else log_error "❌ 容器重启失败" exit 1 fi # 等待容器启动 log_info "等待容器启动..." sleep 3 # 检查容器状态 if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then log_info "✅ 容器运行正常" # 显示容器日志(最后 20 行) log_info "容器日志(最后 20 行):" docker logs --tail 20 "$CONTAINER_NAME" else log_error "❌ 容器未运行" log_error "容器日志:" docker logs --tail 50 "$CONTAINER_NAME" exit 1 fi # 清理旧备份(保留最近 5 个) log_info "清理旧备份..." ls -t "$BACKUP_DIR"/backup_*.tar.gz 2>/dev/null | tail -n +6 | xargs -r rm -f log_info "✅ 部署完成!" log_info "备份文件: $BACKUP_FILE" log_info "部署目录: $DEPLOY_DIR/current" # 输出部署信息(用于通知) echo "" echo "DEPLOY_SUCCESS=true" echo "DEPLOY_TIME=$TIMESTAMP" echo "CONTAINER_NAME=$CONTAINER_NAME"