diff --git a/deploy/scripts/cutover.sh b/deploy/scripts/cutover.sh index 00dbc71..57ca79e 100755 --- a/deploy/scripts/cutover.sh +++ b/deploy/scripts/cutover.sh @@ -23,13 +23,28 @@ docker run --rm \ -v /var/www/pay:/var/www/pay:ro \ "$EDGE_IMAGE" nginx -t +rollback() { + echo "==> !! 自动回滚:停 edge,恢复宿主 nginx" >&2 + docker-compose -p pangolin stop edge >/dev/null 2>&1 || true + systemctl enable nginx >/dev/null 2>&1 || true + systemctl start nginx || echo " !! 宿主 nginx 启动失败,请手动 systemctl start nginx" >&2 + echo " 已回滚到宿主 nginx。" >&2 + exit 1 +} + echo "==> [2/4] 停用宿主 nginx 并起 edge 容器(交接窗口,秒级)" systemctl stop nginx systemctl disable nginx 2>/dev/null || true -docker-compose -p pangolin up -d edge singbox +if ! docker-compose -p pangolin up -d edge singbox; then + echo " edge 启动失败" >&2; rollback +fi echo "==> [3/4] 等待并健康检查" sleep 2 +# edge 容器必须在跑 +if [[ "$(docker inspect -f '{{.State.Running}}' pangolin-edge 2>/dev/null)" != "true" ]]; then + echo " edge 容器未运行" >&2; docker logs pangolin-edge 2>&1 | tail -10; rollback +fi fail=0 # REALITY 经 443 → 10443(Marzban),SNI=www.cloudflare.com 应握手成功 if echo | timeout 10 openssl s_client -connect 127.0.0.1:443 -servername www.cloudflare.com >/dev/null 2>&1; then @@ -45,6 +60,5 @@ echo "==> [4/4] 结果" if [[ "$fail" == "0" ]]; then echo " 切换成功 ✅(宿主 nginx 已停,配置保留可回滚)" else - echo " ❌ 检查未全通过。回滚:docker-compose -p pangolin stop edge && systemctl start nginx" >&2 - exit 1 + echo " 部分检查未通过" >&2; rollback fi