fix(admin): 修复 NEXT_PUBLIC_API_BASE_URL 注入时机导致登录 Network Error
All checks were successful
Build and Deploy LTY / build-and-deploy (push) Successful in 8m38s
All checks were successful
Build and Deploy LTY / build-and-deploy (push) Successful in 8m38s
- qy-lty-admin/Dockerfile: build 阶段加 ARG/ENV,让该变量在 next build 时进客户端 JS 包 - .gitea/workflows/deploy.yaml: admin docker build 加 --build-arg https://${DOMAIN_API}/api;删除已失效的 sed 替换 - k8s/admin-deployment-prod.yaml: 删除运行时无效的 NEXT_PUBLIC_API_BASE_URL env,留注释说明 根因:Next.js NEXT_PUBLIC_* 变量在 next build 时被静态编译进客户端 JS。 原配置在容器运行时才设该变量,对已打包的 fallback 默认值无效, 导致线上前端实际打到 http://localhost:8000/api 触发 ERR_CONNECTION_REFUSED。 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
parent
cfd8a4923a
commit
3e8a212e9f
@ -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
|
||||
|
||||
@ -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: /
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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`
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user