Files
claude-relay-service/docker-compose.yml
2025-11-22 05:01:46 -08:00

170 lines
5.1 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

version: '3.8'
# Claude Relay Service Docker Compose 配置
# 所有配置通过环境变量设置,无需映射 .env 文件
services:
# 🚀 Claude Relay Service
claude-relay:
build: .
image: weishaw/claude-relay-service:latest
restart: unless-stopped
ports:
# 绑定地址:生产环境建议使用反向代理,设置 BIND_HOST=127.0.0.1
- "${BIND_HOST:-0.0.0.0}:${PORT:-3000}:3000"
volumes:
- ./logs:/app/logs
- ./data:/app/data
environment:
# 🌐 服务器配置
- NODE_ENV=production
- PORT=3000
- HOST=0.0.0.0
# 🔐 安全配置(必填)
- JWT_SECRET=${JWT_SECRET} # 必填至少32字符的随机字符串
- ENCRYPTION_KEY=${ENCRYPTION_KEY} # 必填32字符的加密密钥
- ADMIN_SESSION_TIMEOUT=${ADMIN_SESSION_TIMEOUT:-86400000}
- API_KEY_PREFIX=${API_KEY_PREFIX:-cr_}
# 👤 管理员凭据(可选)
- ADMIN_USERNAME=${ADMIN_USERNAME:-}
- ADMIN_PASSWORD=${ADMIN_PASSWORD:-}
# 📊 Redis 配置
- REDIS_HOST=redis
- REDIS_PORT=6379
- REDIS_PASSWORD=${REDIS_PASSWORD:-}
- REDIS_DB=${REDIS_DB:-0}
- REDIS_ENABLE_TLS=${REDIS_ENABLE_TLS:-}
# 🎯 Claude API 配置
- CLAUDE_API_URL=${CLAUDE_API_URL:-https://api.anthropic.com/v1/messages}
- CLAUDE_API_VERSION=${CLAUDE_API_VERSION:-2023-06-01}
- CLAUDE_BETA_HEADER=${CLAUDE_BETA_HEADER:-claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14}
# 🌐 代理配置
- DEFAULT_PROXY_TIMEOUT=${DEFAULT_PROXY_TIMEOUT:-60000}
- MAX_PROXY_RETRIES=${MAX_PROXY_RETRIES:-3}
- PROXY_USE_IPV4=${PROXY_USE_IPV4:-true}
- PROXY_KEEP_ALIVE=${PROXY_KEEP_ALIVE:-}
- PROXY_MAX_SOCKETS=${PROXY_MAX_SOCKETS:-}
- PROXY_MAX_FREE_SOCKETS=${PROXY_MAX_FREE_SOCKETS:-}
# 📈 使用限制
- DEFAULT_TOKEN_LIMIT=${DEFAULT_TOKEN_LIMIT:-1000000}
# 📝 日志配置
- LOG_LEVEL=${LOG_LEVEL:-info}
- LOG_MAX_SIZE=${LOG_MAX_SIZE:-10m}
- LOG_MAX_FILES=${LOG_MAX_FILES:-5}
# 🔧 系统配置
- CLEANUP_INTERVAL=${CLEANUP_INTERVAL:-3600000}
- TOKEN_USAGE_RETENTION=${TOKEN_USAGE_RETENTION:-2592000000}
- HEALTH_CHECK_INTERVAL=${HEALTH_CHECK_INTERVAL:-60000}
- TIMEZONE_OFFSET=${TIMEZONE_OFFSET:-8}
# 🎨 Web 界面配置
- WEB_TITLE=${WEB_TITLE:-Claude Relay Service}
- WEB_DESCRIPTION=${WEB_DESCRIPTION:-Multi-account Claude API relay service}
- WEB_LOGO_URL=${WEB_LOGO_URL:-/assets/logo.png}
# 🛠️ 开发配置
- DEBUG=${DEBUG:-false}
- ENABLE_CORS=${ENABLE_CORS:-true}
- TRUST_PROXY=${TRUST_PROXY:-true}
depends_on:
- redis
networks:
- claude-relay-network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
# 📊 Redis Database
redis:
image: redis:7-alpine
restart: unless-stopped
# 仅在容器网络内部暴露端口,不映射到主机
expose:
- "6379"
# 注意:如需本地调试访问,可取消下行注释(生产环境禁用)
# ports:
# - "127.0.0.1:${REDIS_PORT:-6379}:6379"
volumes:
- ./redis_data:/data
command: redis-server --save 60 1 --appendonly yes --appendfsync everysec
networks:
- claude-relay-network
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 30s
timeout: 10s
retries: 3
# 📈 Redis Monitoring (Optional)
redis-commander:
image: rediscommander/redis-commander:latest
restart: unless-stopped
ports:
- "127.0.0.1:${REDIS_WEB_PORT:-8081}:8081"
environment:
- REDIS_HOSTS=local:redis:6379
depends_on:
- redis
networks:
- claude-relay-network
profiles:
- monitoring
# 📊 Application Monitoring (Optional)
prometheus:
image: prom/prometheus:latest
restart: unless-stopped
ports:
- "127.0.0.1:${PROMETHEUS_PORT:-9090}:9090"
volumes:
- ./config/prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
- '--web.enable-lifecycle'
networks:
- claude-relay-network
profiles:
- monitoring
# 📈 Grafana Dashboard (Optional)
grafana:
image: grafana/grafana:latest
restart: unless-stopped
ports:
- "127.0.0.1:${GRAFANA_PORT:-3001}:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD:-admin123}
volumes:
- grafana_data:/var/lib/grafana
- ./config/grafana:/etc/grafana/provisioning
depends_on:
- prometheus
networks:
- claude-relay-network
profiles:
- monitoring
volumes:
prometheus_data:
driver: local
grafana_data:
driver: local
networks:
claude-relay-network:
driver: bridge