#!/bin/bash # ============================================================================= # 追光AI 部署验证脚本 (Docker 版) # - 检查 Docker 容器状态 # - 验证 APP/API 端点响应 # - 检查 CRON 容器健康状态 # - 用法: bash scripts/verify-deploy-docker.sh # ============================================================================= set -e APP_PORT="${APP_PORT:-8301}" APP_URL="http://127.0.0.1:${APP_PORT}" PASS=0 FAIL=0 check() { local label="$1" shift if "$@" >/dev/null 2>&1; then echo " ✅ $label" PASS=$((PASS + 1)) else echo " ❌ $label" FAIL=$((FAIL + 1)) fi } echo "========================================" echo " 追光AI 部署验证 ($(date '+%Y-%m-%d %H:%M:%S'))" echo "========================================" echo "" # ---- 1) Docker 容器状态 ---- echo "=== 1) Docker 容器状态 ===" docker compose ps 2>/dev/null || docker ps --filter "name=zhuiguang" --format "table {{.Names}}\t{{.Status}}" echo "" check "APP 容器运行中" docker compose ps app 2>/dev/null | grep -q "Up" || docker ps --filter "name=zhuiguang.*app" --filter "status=running" | grep -q . check "CRON 容器运行中" docker compose ps cron 2>/dev/null | grep -q "Up" || docker ps --filter "name=zhuiguang.*cron" --filter "status=running" | grep -q . # ---- 2) APP 健康检查 ---- echo "" echo "=== 2) APP 端点验证 ===" # 主页 HTTP_MAIN=$(curl -s -o /dev/null -m 5 -w "%{http_code}" "${APP_URL}/" 2>/dev/null || echo "000") if [ "$HTTP_MAIN" = "200" ]; then echo " ✅ 主页 (/) HTTP=$HTTP_MAIN" PASS=$((PASS + 1)) else echo " ❌ 主页 (/) HTTP=$HTTP_MAIN" FAIL=$((FAIL + 1)) fi # 关键 API 端点 for endpoint in \ "api/forum/categories:论坛分类" \ "api/tools:工具列表" \ "api/skills:技能列表" \ "api/admin/overview:管理概览" \ "api/rss:订阅源" do path="${endpoint%%:*}" label="${endpoint##*:}" code=$(curl -s -o /dev/null -m 5 -w "%{http_code}" "${APP_URL}/${path}" 2>/dev/null || echo "000") if [ "$code" = "200" ]; then echo " ✅ ${label} (/${path}) HTTP=$code" PASS=$((PASS + 1)) else echo " ❌ ${label} (/${path}) HTTP=$code" FAIL=$((FAIL + 1)) fi done # ---- 3) 管理后台 API (需认证) ---- echo "" echo "=== 3) 管理后台 API 状态 ===" for endpoint in \ "api/admin/bot-quality:Bot质量" \ "api/admin/bots/stats?days=7:Bot统计" do path="${endpoint%%:*}" label="${endpoint##*:}" code=$(curl -s -o /dev/null -m 5 -w "%{http_code}" "${APP_URL}/${path}" 2>/dev/null || echo "000") if [ "$code" = "200" ] || [ "$code" = "401" ]; then echo " ✅ ${label} (/${path}) HTTP=$code" PASS=$((PASS + 1)) else echo " ❌ ${label} (/${path}) HTTP=$code" FAIL=$((FAIL + 1)) fi done # ---- 4) 备份状态 ---- echo "" echo "=== 4) 备份状态 ===" BACKUP_DIR="/home/ubuntu/zhuiguang-ai-backup/dockers" if [ -d "$BACKUP_DIR" ]; then LATEST=$(ls -t "$BACKUP_DIR" 2>/dev/null | head -1) if [ -n "$LATEST" ]; then echo " ✅ 最新备份: $LATEST" PASS=$((PASS + 1)) else echo " ⚠️ 备份目录为空" fi else echo " ⚠️ 备份目录不存在: $BACKUP_DIR" fi # ---- 汇总 ---- echo "" echo "========================================" echo " 结果: ${PASS} 通过 / ${FAIL} 失败" if [ "$FAIL" -eq 0 ]; then echo " 🟢 全部通过" else echo " 🔴 存在 ${FAIL} 项异常,请检查" fi echo "========================================" exit $FAIL