Files
lovife 2ff17cd0c9 refactor(h5)!: H5 改由 nginx 托管,后端退回纯 API
用户决定:后端不再对外发静态文件,学生端 H5 交给网关。两者**仍然同源**
(微信只给一个授权回调域名;H5 的接口地址取自 location.origin),
所以前端业务代码、微信后台、application-dev.yml 的 h5-base-url 都不用改。

后端
- 删掉 dev/test/prod 三份 profile 里的 spring.web.resources.static-locations
- 主配置加 spring.web.resources.add-mappings=false —— 用开关而不是"指到空目录":
  后者会连带启用 Spring Boot 的默认位置(classpath:/static 等),谁丢个文件进去就悄悄对外可见
- StaticCacheHeaderFilter → ApiNoStoreFilter,只剩 /api/** 的 no-store
  (静态资源的缓存策略整体归 nginx,避免"改一处漏一处")
- 补 NoHandlerFoundException → 404:关掉静态映射后未匹配路径不再经过
  ResourceHttpRequestHandler,抛的是 NoHandlerFoundException,只处理
  NoResourceFoundException 时访问 / 会变成 500「系统繁忙」并刷 ERROR 日志

deploy
- 新增 xt-nginx(80):发 frontend-mp/dist/build/h5 + /api 反代 8080(host.docker.internal,
  Linux 靠 extra_hosts host-gateway),端口与产物目录走 .env 的 H5_PORT/H5_DIR
- 三条"删了就会出事"的都已带上理由:client_max_body_size 50m(默认 1m,超了回 413
  而后端日志一个字都没有)、/assets 的 immutable 与 *.html 的 no-cache(§一·十 那个
  "发版后学生看到旧页面"的坑)、健康检查写 127.0.0.1(容器里 localhost 先解析到 IPv6,
  nginx 只听 IPv4 → 永远 starting 而首页是好的)

CI 与文档
- CI:学生端 H5 构建从"e2e 的输入"改为编译检查,不再留 artifact(e2e 不消费它)
- 同步 AGENTS.md / README.md / docs/09(启动步骤、CI 表、发布注意、排障表)/ docs/11
- 交接摘要新增 §一·四十三(含理由、验证数字、要人工做的一步与环境限制)

验证
- mvn clean package 通过(必须 clean:删掉的旧类会留在 target/classes 被组件扫描)
- 后端直连:/ 与 /assets/* → 404({"code":40001,"msg":"接口不存在"})、
  /api/.../captcha → 200 + no-store、/doc.html → 302→200、/v3/api-docs 与 /actuator/health → 200
- 经 nginx(80):首页 200 + no-cache、/assets/*.js 200 + immutable、/nope.js 404(无回退)、
  /api 200 + no-store、gzip 生效;2MB multipart 上传 → 401(与直连一致 ⇒ 未踩 1m 的坑)、
  55MB → 413
- e2e(XT_BASE=http://localhost,全程走 nginx):e2e-m0.py 37/37、e2e-m3-h5-auth.py 24/24、
  e2e-m2-scope.py 38/38
- verify-all.py --quick 6/6;check-test-profile.py:test profile 仍能起来
2026-10-19 17:35:33 +08:00

36 lines
1.6 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ── 本地开发环境变量 ──────────────────────────────
# 复制为 .env 后使用: copy .env.example .env
# ⚠️ .env 已在 .gitignore 中,不要提交真实密码
# PostgreSQL
PG_DB=filldb
PG_USER=fill
PG_PASSWORD=fill_dev_pwd
PG_PORT=5432
# Redis(注意 16379,避开本机其他项目的 6379)
REDIS_PORT=16379
REDIS_PASSWORD=redis_dev_pwd
# ── 学生端 H5 站点(nginx)─────────────────────────
# 2026-10 起 H5 **不再由后端托管**,改由 nginx 提供;同一个 server 把 /api 反代到 8080,
# 于是 H5 与接口仍然同源(微信只给一个授权回调域名;跨源还会连带 CORS 与
# "接口打到 nginx 自己身上"两个问题,见 deploy/nginx/xt.conf 头部)。
#
# ⚠️ 改了端口要同步改内网穿透:穿透指到**这个端口**,不是后端的 8080
# (指到 8080 的表现是"接口好用、页面 404")
H5_PORT=80
# H5 构建产物目录(相对 deploy/)。起 nginx 前先跑 `pnpm build:h5`
H5_DIR=../frontend-mp/dist/build/h5
# ── 对象存储(七牛云)───────────────────────────────
# ⚠️ AK/SK 是**有计费与数据权限的真凭据**,不要写进 .env.example(那个是提交的)
XT_STORAGE_PROVIDER=qiniu
QINIU_ACCESS_KEY=
QINIU_SECRET_KEY=
QINIU_BUCKET=tools-matrix
QINIU_DOMAIN=https://file.tools.coding.design
QINIU_REGION=auto
# 换存储/换密钥之后值得开一次:启动时真的走一遍 写入→存在→读回→删除
XT_STORAGE_SELF_CHECK=false