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