diff --git a/deploy.sh b/deploy.sh new file mode 100644 index 0000000..d47d602 --- /dev/null +++ b/deploy.sh @@ -0,0 +1,75 @@ +#!/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 pull --rebase || error "git pull 失败,请检查网络或冲突" + +# ========== 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