chore(qa): 验收台账与证据入库 + 构建/部署配置同步

- docs/acceptance/qa-tracker.md:跨周期缺陷单一真源台账(§7=第五轮)。
- 周期 1/2 + iPhone SE/axe 验收证据目录、ACCEPTANCE_REVIEW 快照入库。
- 同步 README/CONTEXT/CLAUDE/DESIGN/testing/deployment/lessons-learned 口径;
  next.config/Dockerfile/nginx/Jenkinsfile/docker-compose/sentry/prisma 对齐
  standalone 产物装配与部署形态。
This commit is contained in:
2026-09-28 10:48:09 +08:00
parent 6bb7c557ee
commit a0328a623f
128 changed files with 22455 additions and 504 deletions
+33 -5
View File
@@ -1,4 +1,9 @@
version: "3.8"
# 单机应用容器:跑 Next.js 16 standalone 服务(不是静态 HTML 站点)。
# 服务契约见 Dockerfile 顶部注释(output: 'standalone' → node server.js + HOSTNAME=0.0.0.0)。
# TLS/HTTP→HTTPS 跳转/HSTS/gzip/limit_req 属于边缘,见 nginx-static.conf。
#
# 历史缺陷:本文件曾用 `Dockerfile`(把 dist/ 当静态 HTML 交给 nginx、暴露 80/443 并挂载
# nginx-static.conf + ./ssl),在 standalone 产物下部署即白屏/404(ACCEPTANCE_REVIEW §5)。
services:
novalon-website:
@@ -9,8 +14,31 @@ services:
container_name: novalon-website
restart: unless-stopped
ports:
- "80:80"
- "443:443"
# 容器内 server.js 监听 0.0.0.0:3000;边缘 nginx 的 upstream 默认写 127.0.0.1:3000,
# 若把本服务加入 nginx 所在网络,可改用容器名 novalon-website:3000。
- "3000:3000"
environment:
- NODE_ENV=production
- HOSTNAME=0.0.0.0
- PORT=3000
# .dockerignore 排除了 .env*,镜像内没有 env 文件,数据库路径必须显式给出
- DATABASE_URL=file:/app/data/prod.db
# 无需 Dockerfile.prod 里的 PRISMA_QUERY_ENGINE_LIBRARY 覆盖:那条是为「宿主机(darwin)
# 构建的 dist 被直接 COPY」准备的;本镜像在 alpine 内 npm ci + build,query engine
# 本身就是 linux-musl 版本并被 standalone 追踪进 /app/src/generated/prisma/。
env_file:
# 与 docker-compose.server.yml 保持一致(CDN_DOMAIN / NEXT_PUBLIC_* 等)
- .env.production
volumes:
- ./nginx-static.conf:/etc/nginx/nginx.conf:ro
- ./ssl:/etc/nginx/ssl:ro
# SQLite 落盘
- ./data:/app/data
# 媒体上传目录:src/lib/media/storage.ts 默认写 <cwd>/public/uploads
# (对照:docker-compose.server.yml 挂的是 ./uploads:/app/uploads,与应用实际读取的
# public/uploads 不一致,属该文件的问题,本次未改——不在本次授权范围内)
- ./uploads:/app/public/uploads
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://127.0.0.1:3000/"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s