# 单机应用容器:跑 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 默认写 /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