From 9509c3684f2f576e8f5bb7953b1b9474ced2820b Mon Sep 17 00:00:00 2001 From: longsizhuo Date: Fri, 17 Apr 2026 17:34:01 +0000 Subject: [PATCH 1/3] =?UTF-8?q?fix(deploy):=20AUTH=5FURL=20=E9=80=8F?= =?UTF-8?q?=E4=BC=A0=20+=20=E5=BC=BA=E5=88=B6=E9=87=8D=E5=BB=BA=E5=AE=B9?= =?UTF-8?q?=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修两条独立但叠加的生产部署 bug: 1) docker-compose.yml 的 environment 缺 AUTH_URL 透传。 application.properties 里 justauth redirect-uri 是 ${AUTH_URL:http://localhost:3000}/api/auth/callback/github, compose 不显式透传时 .env 的 AUTH_URL=https://involutionhell.com 进不到容器,生产 /oauth/render/github 302 的 redirect_uri 变成 localhost,跳 GitHub 必报 redirect_uri_mismatch。 docker inspect 查到运行中容器 AUTH_URL=http://localhost:3010 是老容器手工 docker run 遗留。 2) deploy.yml 的 docker compose up -d 没加 --force-recreate。 CI 的 docker build 会把 :latest 标签指向新 sha,但 compose 看 image 名没变就不重建容器,:latest 指向新 sha 而运行中容器仍 绑死老 sha —— PR #9 / #10 的 SaToken /api/events 白名单、 events controller 全都躺在新镜像里没生效,/api/events 一直 401。 合起来就是"部署全 success 但生产没变化"的伪成功。 后续 merge 这个 PR 触发 deploy workflow 后,验证: curl -I https://api.involutionhell.com/oauth/render/github | grep -i location # → redirect_uri=https%3A%2F%2Finvolutionhell.com%2Fapi%2Fauth%2Fcallback%2Fgithub curl https://api.involutionhell.com/api/events # → {"success":true,"data":[...]} ⚠️ GitHub OAuth App 的 Authorization callback URLs 需要手动加 https://involutionhell.com/api/auth/callback/github(若还没加)。 --- .github/workflows/deploy.yml | 7 +++++-- docker-compose.yml | 5 +++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index e45a165..8dc1ae3 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -41,8 +41,11 @@ jobs: # 构建新镜像(失败则整个 workflow 标红,旧容器不受影响) docker build -t involutionhell-backend:latest . - # 用新镜像重启服务 - docker compose up -d --remove-orphans + # 用新镜像重启服务。 + # --force-recreate 是必须的:compose 看 image 名(始终是 :latest)没变就不会重建容器, + # 结果 CI 的 docker build 虽然把 :latest 标签指向新 sha,但运行中容器仍绑死老 sha, + # 部署一直 "success" 但实际 JAR 没换。用 --force-recreate backend 强制销毁重建。 + docker compose up -d --remove-orphans --force-recreate backend # 等待服务启动,最多 60 秒 echo "等待服务健康检查..." diff --git a/docker-compose.yml b/docker-compose.yml index e13834e..b5654cb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -18,6 +18,11 @@ services: AUTH_GITHUB_ID: ${AUTH_GITHUB_ID:-} AUTH_GITHUB_SECRET: ${AUTH_GITHUB_SECRET:-} AUTH_SECRET: ${AUTH_SECRET:-} + # OAuth 回调前缀:JustAuth 的 redirect-uri 用 ${AUTH_URL:http://localhost:3000}/api/auth/callback/github + # 拼接(见 application.properties)。compose 不显式透传的话,.env 的 + # AUTH_URL 进不到容器里,生产会回退到 localhost:3000/3010,跳 GitHub 时 + # redirect_uri 永远错,登录直接报 redirect_uri_mismatch。 + AUTH_URL: ${AUTH_URL:-https://involutionhell.com} # AI 模型(默认 GLM-4.6V-Flash 免费 fallback,OpenAI 兼容协议) # 变量名沿用 OPENAI_*:Java 用的是 /chat/completions 规范协议,URL+Key+Model # 三件套指哪打哪,OpenAI / 智谱 / Anthropic-compat 任选,无需改代码。 From 98c4dc5687647db198588b94a0bf4b1cbd3c4a94 Mon Sep 17 00:00:00 2001 From: longsizhuo Date: Fri, 17 Apr 2026 17:34:01 +0000 Subject: [PATCH 2/3] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- docker-compose.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index b5654cb..34ac7f8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -19,9 +19,9 @@ services: AUTH_GITHUB_SECRET: ${AUTH_GITHUB_SECRET:-} AUTH_SECRET: ${AUTH_SECRET:-} # OAuth 回调前缀:JustAuth 的 redirect-uri 用 ${AUTH_URL:http://localhost:3000}/api/auth/callback/github - # 拼接(见 application.properties)。compose 不显式透传的话,.env 的 - # AUTH_URL 进不到容器里,生产会回退到 localhost:3000/3010,跳 GitHub 时 - # redirect_uri 永远错,登录直接报 redirect_uri_mismatch。 + # 拼接(见 application.properties)。当前 compose 已通过 env_file: .env 和 + # environment 把 AUTH_URL 注入容器;如果生产上仍是旧值/回退到 localhost, + # 通常是因为容器未重建,环境变量变更需要 recreate 后才会生效,否则会报 redirect_uri_mismatch。 AUTH_URL: ${AUTH_URL:-https://involutionhell.com} # AI 模型(默认 GLM-4.6V-Flash 免费 fallback,OpenAI 兼容协议) # 变量名沿用 OPENAI_*:Java 用的是 /chat/completions 规范协议,URL+Key+Model From a2b02e99e27a17ecaaea9bd4ebbce806a574df33 Mon Sep 17 00:00:00 2001 From: longsizhuo Date: Fri, 17 Apr 2026 17:34:01 +0000 Subject: [PATCH 3/3] =?UTF-8?q?fix(deploy):=20=E5=9B=9E=E6=BB=9A=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E4=B9=9F=E5=8A=A0=20--force-recreate=20+=20--no-deps?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CR 指出:回滚分支把 rollback tag 覆盖回 latest 后 image 名依旧是 :latest, compose 同样会判断"无需重建",导致回滚等于没回(容器还绑着失败那版的 sha)。 - --force-recreate 保证 rollback tag 切换后容器真的重建 - --no-deps 限定只重建 backend 服务,不碰 postgres 等依赖, 避免部署失败同时顺带重启 DB 扩大爆炸半径 --- .github/workflows/deploy.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 8dc1ae3..2422e6e 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -71,6 +71,9 @@ jobs: # 用备份镜像回滚 echo "❌ 健康检查失败,正在回滚到上一个版本..." docker tag involutionhell-backend:rollback involutionhell-backend:latest - docker compose up -d --remove-orphans + # 回滚同样需要 --force-recreate:rollback tag 覆盖回 latest 后 image 名依旧是 :latest, + # compose 看不出变化就不会重建容器,运行中容器仍绑死着失败那版的 sha,回滚等于没回。 + # --no-deps 避免顺带重建 postgres 等依赖服务,减小爆炸半径。 + docker compose up -d --remove-orphans --force-recreate --no-deps backend echo "回滚完成,workflow 标红以提示本次部署失败" exit 1