|
|
@@ -1,54 +1,44 @@
|
|
|
#!/bin/bash
|
|
|
# LangGraph 部署脚本
|
|
|
-# 用法: ./deploy.sh [生产|测试]
|
|
|
-# 会将本地 cfc-langgraph/ 代码同步到远程服务器并重启服务
|
|
|
+# 用法: ./deploy.sh
|
|
|
#
|
|
|
-# 远程服务器: ai.etotem.com.cn (111.228.6.214)
|
|
|
-# 部署路径: /opt/sc-data/cfc/cfc-langgraph/
|
|
|
+# 说明:
|
|
|
+# cfc-langgraph 以 Docker 镜像方式部署 —— Dockerfile 在构建时把 app/ 等代码 COPY 进镜像,
|
|
|
+# 因此代码变更必须「重新 build 镜像 + 重建容器」才能生效;仅 restart 不会加载新代码。
|
|
|
+# 本脚本在服务器上就地执行(服务地址 https://ai.etotem.com.cn,容器端口 9000)。
|
|
|
+#
|
|
|
+# 历史:旧版本 rsync 到 /opt/sc-data/cfc/cfc-langgraph 后执行 docker-compose restart,
|
|
|
+# 该路径已不存在,且 restart 无法更新镜像,故重写为就地 build + up。
|
|
|
|
|
|
set -e
|
|
|
|
|
|
-ENV="${1:-prod}"
|
|
|
-REMOTE_USER="root"
|
|
|
-REMOTE_HOST="111.228.6.214"
|
|
|
-REMOTE_PATH="/opt/sc-data/cfc/cfc-langgraph"
|
|
|
-
|
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
|
+cd "$SCRIPT_DIR"
|
|
|
|
|
|
-echo "=== LangGraph Deploy ($ENV) ==="
|
|
|
-echo "本地: $SCRIPT_DIR"
|
|
|
-echo "远程: $REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH"
|
|
|
+echo "=== LangGraph Deploy ==="
|
|
|
+echo "目录: $SCRIPT_DIR"
|
|
|
|
|
|
-# 同步代码(排除虚拟环境和缓存)
|
|
|
-echo "[1/3] 同步代码..."
|
|
|
-rsync -av --delete \
|
|
|
- --exclude='.venv' \
|
|
|
- --exclude='__pycache__' \
|
|
|
- --exclude='*.pyc' \
|
|
|
- --exclude='.env' \
|
|
|
- --exclude='.env.production' \
|
|
|
- --exclude='data/' \
|
|
|
- --exclude='node_modules' \
|
|
|
- --exclude='.git/' \
|
|
|
- "$SCRIPT_DIR/" \
|
|
|
- "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}/"
|
|
|
+echo "[1/3] 构建镜像 (langgraph-svc)..."
|
|
|
+docker compose build langgraph-svc
|
|
|
|
|
|
-# 重启服务
|
|
|
-echo "[2/3] 重启 LangGraph 服务..."
|
|
|
-ssh "${REMOTE_USER}@${REMOTE_HOST}" "
|
|
|
- cd ${REMOTE_PATH} && \
|
|
|
- docker-compose restart langgraph-svc && \
|
|
|
- sleep 3 && \
|
|
|
- docker-compose ps langgraph-svc
|
|
|
-"
|
|
|
+echo "[2/3] 重建并启动服务..."
|
|
|
+docker compose up -d langgraph-svc
|
|
|
|
|
|
-# 健康检查
|
|
|
echo "[3/3] 健康检查..."
|
|
|
-sleep 5
|
|
|
-if curl -sf "https://ai.etotem.com.cn/health" > /dev/null; then
|
|
|
+ok=0
|
|
|
+for i in $(seq 1 30); do
|
|
|
+ if curl -sf "https://ai.etotem.com.cn/health" > /dev/null 2>&1; then
|
|
|
+ ok=1
|
|
|
+ break
|
|
|
+ fi
|
|
|
+ echo " 等待服务就绪 ($i/30)..."
|
|
|
+ sleep 5
|
|
|
+done
|
|
|
+
|
|
|
+if [ "$ok" = "1" ]; then
|
|
|
echo "✅ 部署成功!服务地址: https://ai.etotem.com.cn"
|
|
|
curl -s "https://ai.etotem.com.cn/api/v1/health" | python3 -m json.tool 2>/dev/null || true
|
|
|
else
|
|
|
- echo "❌ 健康检查失败,请查看日志: ssh ${REMOTE_USER}@${REMOTE_HOST} 'docker-compose -f ${REMOTE_PATH}/docker-compose.yml logs langgraph-svc --tail=50'"
|
|
|
+ echo "❌ 健康检查失败,请查看日志: docker compose -f ${SCRIPT_DIR}/docker-compose.yml logs langgraph-svc --tail=50"
|
|
|
exit 1
|
|
|
fi
|