# 姜十三论坛 — Docker Compose 双服务部署 # 架构:web(Node :3000 对外:Vike SSR + 静态资源 + API 反代) → api(Go :3001 内部:纯 API + /data 数据卷) # 启动:docker compose up -d --build # 或:make compose-up / build.bat -Target compose-up services: api: image: hangzhang714128/jiang13-forum:latest build: context: . dockerfile: Dockerfile args: VERSION: dev command: ["--work-path", "/app", "--data", "/data", "--port", "3001"] volumes: - jiang13-data:/data # 可选:挂载自定义 app.ini(只读) # - ./app.ini:/app/app.ini:ro environment: TZ: Asia/Shanghai # 可选:固定 JWT 密钥(留空则自动生成并持久化到 /data/.jwt_secret) # JIANG13_JWT_SECRET: your-secret-here expose: - "3001" restart: unless-stopped stop_grace_period: 15s healthcheck: test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:3001/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"] interval: 30s timeout: 5s retries: 3 start_period: 15s web: image: hangzhang714128/jiang13-forum:latest entrypoint: ["node", "server/index.mjs"] working_dir: /app/frontend user: "1000:1000" ports: - "3000:3000" environment: TZ: Asia/Shanghai PORT: "3000" GO_API_URL: http://api:3001 depends_on: api: condition: service_healthy restart: unless-stopped healthcheck: test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:3000/healthz').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"] interval: 30s timeout: 5s retries: 3 start_period: 15s volumes: jiang13-data: