#!/bin/bash # ============================================================ # AI Knowledge Link — 一键更新脚本 # 用法: bash update.sh # ============================================================ set -e echo "=== AI Knowledge Link 更新 ===" echo "时间: $(date '+%Y-%m-%d %H:%M:%S')" echo "" # 1. 拉取最新代码 echo "[1/4] 拉取最新代码..." if ! git pull; then echo "" echo "错误:git pull 失败。通常是服务器上有本地修改与远程冲突。" echo "如果确认要放弃服务器上的修改,执行:" echo " git checkout -- . && git pull" exit 1 fi # 2. 重新构建 echo "" echo "[2/4] 重新构建镜像..." docker compose build # 3. 重启服务 echo "" echo "[3/4] 重启服务..." docker compose up -d # 4. 等待后端就绪后执行迁移(兜底,容器启动时也会自动迁移) echo "" echo "[4/4] 等待后端就绪并执行迁移..." for i in $(seq 1 30); do if docker compose exec -T backend python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/api/healthz')" 2>/dev/null; then echo "后端已就绪(第 ${i} 次探测)" break fi if [ "$i" -eq 30 ]; then echo "警告:后端 30 秒内未就绪,跳过迁移步骤(容器启动时会自动迁移)" fi sleep 1 done docker compose exec -T backend alembic upgrade head 2>/dev/null || true # 5. 结果 echo "" echo "==========================================" echo " 更新完成!$(date '+%H:%M:%S')" echo "==========================================" echo "" docker compose ps echo "" # 健康检查 if curl -s -f http://127.0.0.1:8000/api/healthz > /dev/null 2>&1; then echo "✅ 后端健康检查通过" else echo "❌ 后端健康检查失败,查看日志:docker compose logs backend --tail 50" fi