/ docker.sh
docker.sh
  1  #!/bin/bash
  2  
  3  # -----------------------------------------------------------------------------
  4  # One-click Deployment Script
  5  #
  6  # Features:
  7  # 1. Check and install Docker and Docker Compose
  8  # 2. Download application from Git repository
  9  # 3. Create independent release package directory
 10  # 4. Start application using Docker Compose
 11  # -----------------------------------------------------------------------------
 12  
 13  # Set color variables for output
 14  GREEN='\033[0;32m'
 15  YELLOW='\033[1;33m'
 16  RED='\033[0;31m'
 17  NC='\033[0m' # No Color
 18  
 19  # 当任何命令失败时立即退出脚本
 20  set -e
 21  # 管道命令中任何一个失败,则整个管道视为失败
 22  set -o pipefail
 23  
 24  # --- 配置变量 ---
 25  GIT_URL="https://github.com/Tencent/AI-Infra-Guard.git"
 26  REPO_NAME="AI-Infra-Guard"
 27  RELEASE_DIR="release-package"
 28  # 可以修改为您需要的 Docker Compose 版本
 29  COMPOSE_VERSION="v2.24.6"
 30  
 31  IMAGE_AGENT="zhuquelab/aig-agent:latest"
 32  IMAGE_SERVER="zhuquelab/aig-server:latest"
 33  
 34  # --- 函数定义 ---
 35  
 36  # 打印信息
 37  info() {
 38      echo -e "${YELLOW}[INFO] $1${NC}"
 39  }
 40  
 41  # 打印成功信息
 42  success() {
 43      echo -e "${GREEN}[SUCCESS] $1${NC}"
 44  }
 45  
 46  # 打印错误信息并退出
 47  error_exit() {
 48      echo -e "${RED}[ERROR] $1${NC}" >&2
 49      exit 1
 50  }
 51  
 52  # 检查命令是否存在
 53  command_exists() {
 54      command -v "$1" &> /dev/null
 55  }
 56  
 57  # 检查并安装 Docker
 58  install_docker() {
 59      if command_exists docker; then
 60          success "Docker 已安装。版本信息: $(docker --version)"
 61      else
 62          info "未检测到 Docker,正在尝试安装..."
 63          if ! curl -fsSL https://get.docker.com | bash -s docker; then
 64              error_exit "Docker 安装失败。请检查网络或手动安装。"
 65          fi
 66  
 67          info "正在启动并设置 Docker 开机自启..."
 68          if ! systemctl enable --now docker; then
 69              error_exit "无法启动或设置 Docker 开机自启。请检查 systemd 状态。"
 70          fi
 71          success "Docker 安装并启动成功!"
 72      fi
 73  }
 74  
 75  # 检查并安装 Docker Compose(优先使用 docker compose v2,不可用时回退到 docker-compose)
 76  COMPOSE_CMD=""
 77  install_docker_compose() {
 78      if docker compose version &>/dev/null; then
 79          COMPOSE_CMD="docker compose"
 80          success "Docker Compose (docker compose) 已可用。版本信息: $(docker compose version)"
 81          return
 82      fi
 83      if command_exists docker-compose; then
 84          COMPOSE_CMD="docker-compose"
 85          success "Docker Compose 已安装。版本信息: $(docker-compose --version)"
 86      else
 87          info "未检测到 Docker Compose,正在尝试安装版本 ${COMPOSE_VERSION}..."
 88  
 89          # 检查系统架构
 90          DOCKER_COMPOSE_URL="https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)"
 91  
 92          info "正在从 ${DOCKER_COMPOSE_URL} 下载..."
 93          if ! curl -L "${DOCKER_COMPOSE_URL}" -o /usr/local/bin/docker-compose; then
 94              error_exit "Docker Compose 下载失败。请检查网络或 GitHub Release 页面。"
 95          fi
 96  
 97          if ! chmod +x /usr/local/bin/docker-compose; then
 98              error_exit "为 Docker Compose 添加执行权限失败。"
 99          fi
100  
101          COMPOSE_CMD="docker-compose"
102          success "Docker Compose 安装成功!版本信息: $(docker-compose --version)"
103      fi
104  }
105  
106  # 部署应用
107  deploy_application() {
108      info "开始部署应用..."
109  
110      # 检查是否存在旧的目录,并询问用户是否删除
111      if [ -d "${REPO_NAME}" ] || [ -d "${RELEASE_DIR}" ]; then
112          info "检测到已存在的目录 (${REPO_NAME} 或 ${RELEASE_DIR})。"
113          read -p "是否要删除这些目录并重新部署? [y/N]: " -n 1 -r
114          echo
115          if [[ $REPLY =~ ^[Yy]$ ]]; then
116              info "正在删除旧目录..."
117              rm -rf "${REPO_NAME}" "${RELEASE_DIR}"
118              success "旧目录已删除。"
119          else
120              error_exit "用户取消操作。部署中止。"
121          fi
122      fi
123  
124      # 1. 克隆仓库
125      info "正在从 ${GIT_URL} 克隆仓库..."
126      if ! git clone --depth 1 "${GIT_URL}"; then
127          error_exit "Git 克隆失败。请检查 Git URL 或网络连接。"
128      fi
129      success "仓库克隆成功。"
130  
131      # 2. 创建发布目录并复制文件
132      info "正在创建发布目录: ${RELEASE_DIR}"
133      mkdir -p "${RELEASE_DIR}"/{db,logs,uploads}
134  
135      info "正在复制必要文件到 ${RELEASE_DIR}..."
136      # 进入源仓库目录以简化复制路径
137      cd "${REPO_NAME}"
138  
139      cp docker-compose.images.yml "../${RELEASE_DIR}/docker-compose.yml"
140      cp -r data "../${RELEASE_DIR}/data"
141      cp README.md "../${RELEASE_DIR}/README.md"
142      cp README_ZH.md "../${RELEASE_DIR}/README_ZH.md"
143      cp CHANGELOG.md "../${RELEASE_DIR}/CHANGELOG.md"
144  
145      # 返回上级目录
146      cd ..
147      success "文件复制完成。"
148  
149      # 3. 清理原始仓库
150      info "正在清理临时文件..."
151      rm -rf "${REPO_NAME}"
152      success "临时文件清理完毕。"
153  
154      # 4. 检测并删除旧镜像
155      if docker images --format "{{.Repository}}:{{.Tag}}" | grep -q "^$IMAGE_AGENT$"; then
156          info "检测到旧Agent镜像,正在删除..."
157          docker rmi "$IMAGE_AGENT"
158      fi
159  
160      if docker images --format "{{.Repository}}:{{.Tag}}" | grep -q "^$IMAGE_SERVER$"; then
161          info "检测到旧Server镜像,正在删除..."
162          docker rmi "$IMAGE_SERVER"
163      fi
164  
165      # 5. 启动 Docker Compose
166      cd "${RELEASE_DIR}"
167      info "当前目录: $(pwd)"
168      info "正在使用 ${COMPOSE_CMD} 启动服务 (后台模式)..."
169      # 在拉取镜像前先检查 Docker 守护进程是否可用,避免用户已经安装 Docker 但服务未启动的情况
170      if ! docker info >/dev/null 2>&1; then
171          error_exit "无法连接到 Docker 守护进程。请确认 Docker 服务已启动(例如使用 'systemctl status docker' 或 'service docker start'),然后重新运行本脚本。"
172      fi
173      if ! $COMPOSE_CMD pull; then
174          error_exit "Compose 拉取镜像失败。请先查看上方 ${COMPOSE_CMD} 输出的详细错误信息。常见原因包括:无法访问镜像仓库(网络或代理问题)、镜像仓库被防火墙拦截、或仓库地址配置错误。"
175      fi
176      if ! $COMPOSE_CMD up -d; then
177          error_exit "Compose 启动失败。请使用 '${COMPOSE_CMD} logs' 查看错误日志。"
178      fi
179  
180      success "应用部署并启动成功!"
181  }
182  
183  # --- 主函数 ---
184  main() {
185      # 检查是否为 root 用户
186      if [ "$(id -u)" -ne 0 ]; then
187         error_exit "此脚本需要 root 权限运行。请使用 'sudo bash $0' 执行。"
188      fi
189  
190      # 检查核心依赖
191      command_exists git || error_exit "请先安装 'git'。"
192      command_exists curl || error_exit "请先安装 'curl'。"
193  
194      # 执行流程
195      install_docker
196      install_docker_compose
197      deploy_application
198  
199      # 结束提示
200      echo
201      success "=========================================================="
202      success "         所有操作已成功完成!"
203      success "=========================================================="
204      info "应用正在后台运行中。"
205      info "您可以使用 'cd ${RELEASE_DIR}' 进入应用目录。"
206      info "查看服务状态: ${YELLOW}${COMPOSE_CMD} ps${NC}"
207      info "查看实时日志: ${YELLOW}${COMPOSE_CMD} logs -f${NC}"
208      info "停止并移除容器: ${YELLOW}${COMPOSE_CMD} down${NC}"
209      echo
210  }
211  
212  # --- 脚本入口 ---
213  main