| # 知識庫系統 V5 — PRD §35.2 安全選項 | |
| # read_only / cap_drop ALL / no-new-privileges / 寫入限定 mount + tmpfs | |
| services: | |
| app: | |
| build: . | |
| image: kbv5:latest | |
| container_name: kbv5 | |
| user: "1000:1000" | |
| read_only: true | |
| cap_drop: | |
| - ALL | |
| security_opt: | |
| - no-new-privileges:true | |
| tmpfs: | |
| - /tmp:size=64m | |
| - /home/kb:size=16m # pip cache、user-level temp | |
| volumes: | |
| # MD 為事實來源(§6)— 必須可寫 | |
| - ./vault:/app/vault | |
| # SQLite DB + history + PII centroids + AI 詞典等 — 必須可寫 | |
| - ./data:/app/data | |
| # 前端靜態檔(mockup HTML 由映像帶入;如要熱替換可掛 ro) | |
| # - ./static:/app/static:ro | |
| ports: | |
| - "127.0.0.1:8000:8000" # 預設綁本機;用 reverse proxy 對外 | |
| environment: | |
| KBV5_ENV: prod | |
| KBV5_RATE_LIMIT: "1" | |
| KBV5_SEED: "1" | |
| env_file: | |
| - .env.prod # JWT_SECRET / AI 金鑰等敏感資料 | |
| restart: unless-stopped | |
| healthcheck: | |
| test: ["CMD", "curl", "-fsS", "http://127.0.0.1:8000/healthz"] | |
| interval: 30s | |
| timeout: 5s | |
| start_period: 15s | |
| retries: 3 | |