services: backend: image: ${BACKEND_IMAGE:-git.init.cool/cool/termi-astro-backend:latest} pull_policy: always restart: unless-stopped # 对 tohka 这类小内存主机,建议给服务设置明确上限, # 避免 AI 重建索引时把整机拖进 swap 抖动 / OOM。 mem_limit: ${BACKEND_MEMORY_LIMIT:-768m} memswap_limit: ${BACKEND_MEMORY_SWAP_LIMIT:-768m} environment: PORT: 5150 APP_BASE_URL: ${APP_BASE_URL:-http://localhost:5150} DATABASE_URL: ${DATABASE_URL:?DATABASE_URL is required} REDIS_URL: ${REDIS_URL:?REDIS_URL is required} JWT_SECRET: ${JWT_SECRET:?JWT_SECRET is required} # 当前推荐把 admin 放在受保护的后台域名下(同域转发 /api 到 backend), # 然后让 backend 信任 TinyAuth / Pocket ID 通过 Caddy 注入的认证头。 # 如启用代理 SSO,建议同时配置 TERMI_ADMIN_PROXY_SHARED_SECRET, # 并让 Caddy 在转发 /api 到 backend 时附带 X-Termi-Proxy-Secret。 TERMI_ADMIN_TRUST_PROXY_AUTH: ${TERMI_ADMIN_TRUST_PROXY_AUTH:-false} TERMI_ADMIN_LOCAL_LOGIN_ENABLED: ${TERMI_ADMIN_LOCAL_LOGIN_ENABLED:-true} TERMI_ADMIN_PROXY_SHARED_SECRET: ${TERMI_ADMIN_PROXY_SHARED_SECRET:-} TERMI_TURNSTILE_SECRET_KEY: ${TERMI_TURNSTILE_SECRET_KEY:-} PUBLIC_WEB_PUSH_VAPID_PUBLIC_KEY: ${PUBLIC_WEB_PUSH_VAPID_PUBLIC_KEY:-} TERMI_WEB_PUSH_VAPID_PRIVATE_KEY: ${TERMI_WEB_PUSH_VAPID_PRIVATE_KEY:-} TERMI_WEB_PUSH_VAPID_SUBJECT: ${TERMI_WEB_PUSH_VAPID_SUBJECT:-} RUST_LOG: ${RUST_LOG:-info} ports: # 这是“直连端口”示例;如果前面接 tohka 宿主机 Caddy, # 推荐叠加 compose.tohka.override.yml,把 backend 只绑定到 127.0.0.1。 - '${BACKEND_PORT:-5150}:5150' backend-worker: image: ${BACKEND_IMAGE:-git.init.cool/cool/termi-astro-backend:latest} pull_policy: always restart: unless-stopped mem_limit: ${BACKEND_WORKER_MEMORY_LIMIT:-1g} memswap_limit: ${BACKEND_WORKER_MEMORY_SWAP_LIMIT:-1g} depends_on: backend: condition: service_healthy command: ['termi_api-cli', '-e', 'production', 'start', '--worker'] environment: PORT: 5150 APP_BASE_URL: ${APP_BASE_URL:-http://localhost:5150} DATABASE_URL: ${DATABASE_URL:?DATABASE_URL is required} REDIS_URL: ${REDIS_URL:?REDIS_URL is required} JWT_SECRET: ${JWT_SECRET:?JWT_SECRET is required} TERMI_ADMIN_TRUST_PROXY_AUTH: ${TERMI_ADMIN_TRUST_PROXY_AUTH:-false} TERMI_ADMIN_LOCAL_LOGIN_ENABLED: ${TERMI_ADMIN_LOCAL_LOGIN_ENABLED:-true} TERMI_ADMIN_PROXY_SHARED_SECRET: ${TERMI_ADMIN_PROXY_SHARED_SECRET:-} PUBLIC_WEB_PUSH_VAPID_PUBLIC_KEY: ${PUBLIC_WEB_PUSH_VAPID_PUBLIC_KEY:-} TERMI_WEB_PUSH_VAPID_PRIVATE_KEY: ${TERMI_WEB_PUSH_VAPID_PRIVATE_KEY:-} TERMI_WEB_PUSH_VAPID_SUBJECT: ${TERMI_WEB_PUSH_VAPID_SUBJECT:-} RUST_LOG: ${RUST_LOG:-info} TERMI_SKIP_MIGRATIONS: 'true' # backend 镜像默认 healthcheck 会探测 HTTP /healthz, # 但 worker 模式不监听 5150,所以这里改成“主进程仍然是 --worker”检查。 healthcheck: test: ['CMD-SHELL', "test -r /proc/1/cmdline && tr '\\000' ' '