#!/bin/bash set -e # cc-hook 一键部署脚本 # 用法: ./deploy.sh GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' info() { echo -e "${GREEN}[✓]${NC} $1"; } warn() { echo -e "${YELLOW}[!]${NC} $1"; } error() { echo -e "${RED}[✗]${NC} $1"; exit 1; } # ========== 1. 更新代码 ========== echo "" info "拉取最新代码..." git fetch origin && git reset --hard origin/main || error "拉取代码失败,请检查网络" info "已同步至最新版本: $(git log --oneline -1)" # ========== 2. 环境检查 ========== echo "" info "检查运行环境..." # 检查 Docker command -v docker &>/dev/null || error "未安装 Docker,请先安装: https://docs.docker.com/get-docker/" docker info &>/dev/null || error "Docker 服务未启动,请执行: sudo systemctl start docker" # 检查 Docker Compose (v2 plugin 或独立二进制) if docker compose version &>/dev/null; then COMPOSE_CMD="docker compose" elif command -v docker-compose &>/dev/null; then COMPOSE_CMD="docker-compose" else error "未安装 Docker Compose,请先安装" fi info "Docker Compose: $($COMPOSE_CMD version 2>/dev/null | head -1)" # 检查 .env 文件 if [ ! -f .env ]; then if [ -f .env.example ]; then warn ".env 文件不存在,已从 .env.example 复制,请编辑后重新运行" cp .env.example .env exit 1 else error ".env 文件不存在,且无 .env.example 可参考" fi fi # 校验必要的环境变量 source .env [ -z "$GOTIFY_URL" ] && error ".env 中缺少 GOTIFY_URL" [ -z "$GOTIFY_TOKEN" ] && error ".env 中缺少 GOTIFY_TOKEN" info "环境检查通过" # ========== 3. 构建部署 ========== echo "" info "构建并部署容器..." $COMPOSE_CMD up -d --build # ========== 4. 部署验证 ========== echo "" info "等待服务启动..." sleep 3 PORT=${PORT#:} # 去掉前缀的冒号 if curl -sf "http://localhost:${PORT:-8082}/health" >/dev/null 2>&1; then info "部署完成!服务运行正常 ✓" echo "" echo " 健康检查: http://localhost:${PORT:-8082}/health" echo " 查看日志: $COMPOSE_CMD logs -f cc-hook" echo " 停止服务: $COMPOSE_CMD down" else warn "服务可能未就绪,请检查日志: $COMPOSE_CMD logs cc-hook" fi