- 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 产物装配与部署形态。
45 lines
2.1 KiB
YAML
45 lines
2.1 KiB
YAML
# 单机应用容器:跑 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:
|
||
build:
|
||
context: .
|
||
dockerfile: Dockerfile
|
||
image: novalon-website:1.0.0
|
||
container_name: novalon-website
|
||
restart: unless-stopped
|
||
ports:
|
||
# 容器内 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:
|
||
# 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
|