From 3d05f527165ca3280467963e99c1c1153e987537 Mon Sep 17 00:00:00 2001 From: "34047007@qq.com" <34047007@qq.com> Date: Mon, 10 Aug 2026 17:36:05 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20deploy.sh=20=E2=80=94=20=E4=B8=8D?= =?UTF-8?q?=E5=86=8D=20set=20-a=20source=20=E6=95=B4=E4=B8=AA=20.env?= =?UTF-8?q?=EF=BC=88bash=20=E5=89=A5=E5=BC=95=E5=8F=B7=E6=95=B0=E7=BB=84?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=20compose=20=E6=8F=92=E5=80=BC=E5=8F=96?= =?UTF-8?q?=E5=88=B0=E5=9D=8F=20CORS=5FORIGINS=EF=BC=89=EF=BC=9Bauto=5Frol?= =?UTF-8?q?lback=20=E5=89=8D=E9=87=8A=E6=94=BE=20flock=20=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E5=9B=9E=E6=BB=9A=E6=AD=BB=E9=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy/deploy.sh | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/deploy/deploy.sh b/deploy/deploy.sh index 51fbc24..53bb1c6 100644 --- a/deploy/deploy.sh +++ b/deploy/deploy.sh @@ -115,11 +115,20 @@ if [ -f "$DEPLOY_DIR/.pending-deploy" ]; then 请先确认当前状态(容器/迁移/versions.log)再继续,然后删除该标记或人工处理后重跑。" fi -# 2. source .env(G:PG_PASSWORD/REDIS_PASSWORD 供 pg_dump 备选与探活) +# 2. 提取 .env 中脚本直接需要的标量变量(G:PG_PASSWORD 供 pg_dump)。 +# 绝不 `set -a; source .env`——bash 会把 `KEY=["a","b"]` 按数组语法解析剥掉引号, +# 且 export 进 shell 后 docker compose 插值会优先用 shell 值(优先于 .env 文件), +# 导致迁移容器拿到剥引号的 CORS_ORIGINS(非 JSON)而崩。compose 自身读 .env 文件, +# 能正确拿到带引号的原始值,所以这里只取标量、不 export。 if [ ! -f "$REPO_ROOT/.env" ]; then error "未找到 ${REPO_ROOT}/.env(含密钥,不进 git)。请先在服务器配置。" fi -set -a; source "$REPO_ROOT/.env"; set +a +get_env() { + local var="$1" raw + raw="$(grep -E "^[[:space:]]*(export[[:space:]]+)?${var}[[:space:]]*=" "$REPO_ROOT/.env" | tail -1 | sed -E "s/^[^=]*=//" || true)" + printf -v "$var" '%s' "$raw" +} +get_env PG_PASSWORD # 3. .env 复杂类型预检(fail fast):pydantic-settings 会把 list/dict 类型字段按 JSON 解析, # 写成了逗号列表会在迁移时炸(8-10 事故),这里提前捕获,给出正确写法提示。 @@ -322,6 +331,9 @@ check_single_head auto_rollback() { echo -e "${RED}[✗] 部署部分完成(迁移已跑/容器已切),触发自动回滚${NC}" + # 释放本脚本持有的部署锁(fd 9)再调 rollback.sh——否则 rollback.sh --auto 自身的 + # flock 会被自己占的锁挡住,形成死锁(8-10 实际发生:自动回滚被锁拦下) + exec 9>&- bash "$DEPLOY_DIR/rollback.sh" --auto || warn "自动回滚失败,请人工介入(详见 docs/16 §3 回滚 runbook)" exit 1 }