docker-compose.yaml 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. services:
  2. postgres:
  3. image: postgres:18
  4. container_name: claude-code-hub-db
  5. restart: unless-stopped
  6. # 不对外暴露数据库端口,仅允许容器内部网络访问
  7. # 如需调试,可取消注释下行(仅绑定本机):
  8. # ports:
  9. # - "127.0.0.1:35432:5432"
  10. env_file:
  11. - ./.env
  12. environment:
  13. POSTGRES_USER: ${DB_USER:-postgres}
  14. POSTGRES_PASSWORD: ${DB_PASSWORD:-postgres}
  15. POSTGRES_DB: ${DB_NAME:-claude_code_hub}
  16. # 使用自定义数据目录
  17. PGDATA: /data/pgdata
  18. # 设置时区为上海
  19. TZ: Asia/Shanghai
  20. PGTZ: Asia/Shanghai
  21. volumes:
  22. # 持久化数据库数据到本地 ./data/postgres 目录
  23. # 挂载到 /data 而不是 /var/lib/postgresql/data 避免权限冲突
  24. - ./data/postgres:/data
  25. healthcheck:
  26. test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-postgres} -d ${DB_NAME:-claude_code_hub}"]
  27. interval: 5s
  28. timeout: 5s
  29. retries: 10
  30. start_period: 10s
  31. redis:
  32. image: redis:7-alpine
  33. container_name: claude-code-hub-redis
  34. restart: unless-stopped
  35. volumes:
  36. # 持久化 Redis 数据到本地 ./data/redis 目录
  37. # 使用 AOF 持久化模式,确保数据不丢失
  38. - ./data/redis:/data
  39. command: redis-server --appendonly yes
  40. healthcheck:
  41. test: ["CMD", "redis-cli", "ping"]
  42. interval: 5s
  43. timeout: 3s
  44. retries: 5
  45. start_period: 5s
  46. app:
  47. image: ghcr.io/ding113/claude-code-hub:latest
  48. container_name: claude-code-hub-app
  49. depends_on:
  50. postgres:
  51. condition: service_healthy
  52. redis:
  53. condition: service_healthy
  54. env_file:
  55. - ./.env
  56. environment:
  57. NODE_ENV: production
  58. # 容器内使用 Dockerfile 默认端口 3000,对外通过 APP_PORT 暴露(默认 23000)
  59. DSN: postgresql://${DB_USER:-postgres}:${DB_PASSWORD:-postgres}@postgres:5432/${DB_NAME:-claude_code_hub}
  60. REDIS_URL: redis://redis:6379
  61. AUTO_MIGRATE: ${AUTO_MIGRATE:-true}
  62. ENABLE_RATE_LIMIT: ${ENABLE_RATE_LIMIT:-true}
  63. SESSION_TTL: ${SESSION_TTL:-300}
  64. # 设置时区为上海
  65. TZ: Asia/Shanghai
  66. ports:
  67. - "${APP_PORT:-23000}:3000"
  68. restart: unless-stopped
  69. healthcheck:
  70. test: ["CMD-SHELL", "curl -f http://localhost:3000/api/actions/health || exit 1"]
  71. interval: 30s
  72. timeout: 5s
  73. retries: 3
  74. start_period: 30s