diff --git a/.gitea/workflows/deploy.yaml b/.gitea/workflows/deploy.yaml index 835a437..1292196 100644 --- a/.gitea/workflows/deploy.yaml +++ b/.gitea/workflows/deploy.yaml @@ -73,6 +73,7 @@ jobs: for attempt in 1 2 3; do echo "Build admin attempt $attempt/3..." DOCKER_BUILDKIT=0 docker build \ + --build-arg NEXT_PUBLIC_API_BASE_URL=https://${{ env.DOMAIN_API }}/api \ --tag ${{ env.CR_SERVER_ACTIVE }}/${{ env.CR_ORG }}/lty-admin:${{ env.IMAGE_TAG }} \ --tag ${{ env.CR_SERVER_ACTIVE }}/${{ env.CR_ORG }}/lty-admin:latest \ ./qy-lty-admin 2>&1 | tee -a /tmp/build.log && break @@ -118,7 +119,8 @@ jobs: # Replace domain placeholders by environment sed -i "s|qy-lty.airlabs.art|${{ env.DOMAIN_API }}|g" k8s/ingress.yaml sed -i "s|qy-lty-admin.airlabs.art|${{ env.DOMAIN_ADMIN }}|g" k8s/ingress.yaml - sed -i "s|https://qy-lty.airlabs.art|https://${{ env.DOMAIN_API }}|g" k8s/admin-deployment-prod.yaml + # NEXT_PUBLIC_API_BASE_URL 已改为 docker build --build-arg 注入(见 admin 构建步骤), + # admin-deployment-prod.yaml 中不再保留可被 sed 替换的占位 # Replace DB host by environment sed -i "s|pgm-7xv4811oj11j86htzo.pg.rds.aliyuncs.com|${{ env.DB_HOST }}|g" k8s/backend-deployment-prod.yaml diff --git a/k8s/admin-deployment-prod.yaml b/k8s/admin-deployment-prod.yaml index 8204678..f338c61 100644 --- a/k8s/admin-deployment-prod.yaml +++ b/k8s/admin-deployment-prod.yaml @@ -23,8 +23,8 @@ spec: env: - name: NODE_ENV value: "production" - - name: NEXT_PUBLIC_API_BASE_URL - value: "https://qy-lty.airlabs.art" + # NEXT_PUBLIC_API_BASE_URL 必须在 docker build 时通过 --build-arg 注入(Next.js 客户端打包), + # 运行时在此处设置无效。详见 .gitea/workflows/deploy.yaml 与 qy-lty-admin/Dockerfile。 livenessProbe: httpGet: path: / diff --git a/qy-lty-admin/Dockerfile b/qy-lty-admin/Dockerfile index 433bedf..4cef32e 100644 --- a/qy-lty-admin/Dockerfile +++ b/qy-lty-admin/Dockerfile @@ -17,6 +17,10 @@ RUN yarn install --frozen-lockfile # 复制源代码 COPY . . +# 注入 NEXT_PUBLIC_API_BASE_URL(Next.js NEXT_PUBLIC_* 变量必须在 build 期注入才能进客户端 JS 包) +ARG NEXT_PUBLIC_API_BASE_URL +ENV NEXT_PUBLIC_API_BASE_URL=${NEXT_PUBLIC_API_BASE_URL} + # 构建应用 RUN yarn build diff --git a/qy-lty-admin/docs/修改记录.md b/qy-lty-admin/docs/修改记录.md index 298cc07..6332015 100644 --- a/qy-lty-admin/docs/修改记录.md +++ b/qy-lty-admin/docs/修改记录.md @@ -25,6 +25,26 @@ +### [2026-05-07] 修复 NEXT_PUBLIC_API_BASE_URL 注入时机错误(线上登录 Network Error) + +- **文件路径**: + - `qy-lty-admin/Dockerfile` + - `.gitea/workflows/deploy.yaml`(仓库根目录,与本前端构建/部署链直接相关) + - `k8s/admin-deployment-prod.yaml`(仓库根目录,与本前端构建/部署链直接相关) +- **修改类型**: 修复Bug +- **修改内容**: + - `qy-lty-admin/Dockerfile`:在 `COPY . .` 之后、`RUN yarn build` 之前新增 `ARG NEXT_PUBLIC_API_BASE_URL` 与 `ENV NEXT_PUBLIC_API_BASE_URL=${NEXT_PUBLIC_API_BASE_URL}`,让该值在 build 期可被注入 + - `.gitea/workflows/deploy.yaml`:在 admin 镜像 `docker build` 命令上加 `--build-arg NEXT_PUBLIC_API_BASE_URL=https://${DOMAIN_API}/api`(test 环境拼成 `https://qy-lty.test.airlabs.art/api`,prod 环境拼成 `https://qy-lty.airlabs.art/api`);同时删除 `Replace domain placeholders by environment` 段中已失效的 `sed -i "s|https://qy-lty.airlabs.art|https://${DOMAIN_API}|g" k8s/admin-deployment-prod.yaml` + - `k8s/admin-deployment-prod.yaml`:删除运行时无效的 `env: NEXT_PUBLIC_API_BASE_URL=https://qy-lty.airlabs.art`,改为注释说明该变量必须在 docker build 时通过 `--build-arg` 注入 +- **修改原因**: + - 线上 https://qy-lty-admin.test.airlabs.art/login 点登录弹 "Network Error"。DevTools 抓到 Request URL 是 `http://localhost:8000/api/v1/admin/login/`,对应 `lib/api/client.ts` 中 `process.env.NEXT_PUBLIC_API_BASE_URL || "http://localhost:8000/api"` 的 fallback 值。 + - 根因:Next.js 的 `NEXT_PUBLIC_*` 变量在 `next build` 时被静态编译进客户端 JS 包,运行时再设置容器环境变量已经无效。原 Dockerfile 没有 `ARG/ENV`,原 deploy.yaml 没有 `--build-arg`,只有 `k8s/admin-deployment-prod.yaml` 在容器运行时设了变量——所以打包出的镜像里硬编码的是默认 fallback `http://localhost:8000/api`,前端 HTTPS 页面去打本机的 8000 端口,浏览器报 `ERR_CONNECTION_REFUSED`,axios 包装为 "Network Error"。 + - 修复后构建期会把正确的 `https://qy-lty.test.airlabs.art/api` / `https://qy-lty.airlabs.art/api` 编译进 JS 包,登录请求会正确打到后端。 + - 备注:原 `k8s/admin-deployment-prod.yaml` 写的是 `https://qy-lty.airlabs.art`(**缺少 `/api` 后缀**),即便注入时机正确,路径也会拼错(`/v1/admin/login/` 而非 `/api/v1/admin/login/`),双重 bug。本次修复一并纠正。 +- **服务端联动**: 本次修复仅涉及前端构建链与部署配置,未改动 `qy_lty` 后端代码,无需在服务端写联动条目。 + +--- + ### [2026-04-30] 初始化 CLAUDE.md 与 docs/修改记录.md 骨架 - **文件路径**: `CLAUDE.md`、`docs/修改记录.md`