| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- name: ${COMPOSE_PROJECT_NAME:-claude-code-hub}
- services:
- postgres:
- image: postgres:18
- restart: unless-stopped
- # 不对外暴露数据库端口,仅允许容器内部网络访问
- # 如需调试,可取消注释下行(仅绑定本机):
- # ports:
- # - "127.0.0.1:35432:5432"
- env_file:
- - ./.env
- environment:
- POSTGRES_USER: ${DB_USER:-postgres}
- POSTGRES_PASSWORD: ${DB_PASSWORD:-postgres}
- POSTGRES_DB: ${DB_NAME:-claude_code_hub}
- # 使用自定义数据目录
- PGDATA: /data/pgdata
- # 设置时区为上海
- TZ: Asia/Shanghai
- PGTZ: Asia/Shanghai
- volumes:
- # 持久化数据库数据到本地 ./data/postgres 目录
- # 挂载到 /data 而不是 /var/lib/postgresql/data 避免权限冲突
- - ./data/postgres:/data
- healthcheck:
- test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-postgres} -d ${DB_NAME:-claude_code_hub}"]
- interval: 5s
- timeout: 5s
- retries: 10
- start_period: 10s
- redis:
- image: redis:7-alpine
- restart: unless-stopped
- volumes:
- # 持久化 Redis 数据到本地 ./data/redis 目录
- # 使用 AOF 持久化模式,确保数据不丢失
- - ./data/redis:/data
- command: redis-server --appendonly yes
- healthcheck:
- test: ["CMD", "redis-cli", "ping"]
- interval: 5s
- timeout: 3s
- retries: 5
- start_period: 5s
- app:
- image: ghcr.io/ding113/claude-code-hub:latest
- depends_on:
- postgres:
- condition: service_healthy
- redis:
- condition: service_healthy
- env_file:
- - ./.env
- environment:
- NODE_ENV: production
- # 容器内使用 Dockerfile 默认端口 3000,对外通过 APP_PORT 暴露(默认 23000)
- DSN: postgresql://${DB_USER:-postgres}:${DB_PASSWORD:-postgres}@postgres:5432/${DB_NAME:-claude_code_hub}
- REDIS_URL: redis://redis:6379
- AUTO_MIGRATE: ${AUTO_MIGRATE:-true}
- ENABLE_RATE_LIMIT: ${ENABLE_RATE_LIMIT:-true}
- SESSION_TTL: ${SESSION_TTL:-300}
- # 设置时区为上海
- TZ: Asia/Shanghai
- ports:
- - "${APP_PORT:-23000}:3000"
- restart: unless-stopped
- healthcheck:
- test:
- [
- "CMD",
- "node",
- "-e",
- "fetch('http://' + (process.env.HOSTNAME || '127.0.0.1') + ':3000/api/actions/health').then((r)=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))",
- ]
- interval: 30s
- timeout: 5s
- retries: 3
- start_period: 30s
|