{"owner":"Wei-Shaw","repo":"claude-relay-service","hasDocker":true,"hasCompose":true,"hasDockerfile":false,"composePath":"docker-compose.yml","servicesCount":5,"services":[{"name":"claude-relay","image":"weishaw/claude-relay-service:latest","build":".","restart":"unless-stopped","ports":["${BIND_HOST:-0.0.0.0}:${PORT:-3000}:3000"],"environment":["NODE_ENV=production","PORT=3000","HOST=0.0.0.0","REQUEST_MAX_SIZE_MB=60","JWT_SECRET=${JWT_SECRET}","ENCRYPTION_KEY=${ENCRYPTION_KEY}","ADMIN_SESSION_TIMEOUT=${ADMIN_SESSION_TIMEOUT:-86400000}","API_KEY_PREFIX=${API_KEY_PREFIX:-cr_}","ADMIN_USERNAME=${ADMIN_USERNAME:-}","ADMIN_PASSWORD=${ADMIN_PASSWORD:-}","REDIS_HOST=redis","REDIS_PORT=6379","REDIS_PASSWORD=${REDIS_PASSWORD:-}","REDIS_DB=${REDIS_DB:-0}","REDIS_ENABLE_TLS=${REDIS_ENABLE_TLS:-}","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_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}"],"volumes":["./logs:/app/logs","./data:/app/data"],"depends_on":["redis"]},{"name":"redis","image":"redis:7-alpine","restart":"unless-stopped","command":"redis-server --save 60 1 --appendonly yes --appendfsync everysec","volumes":["./redis_data:/data"]},{"name":"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"]},{"name":"prometheus","image":"prom/prometheus:latest","restart":"unless-stopped","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","ports":["127.0.0.1:${PROMETHEUS_PORT:-9090}:9090"],"volumes":["./config/prometheus.yml:/etc/prometheus/prometheus.yml:ro","prometheus_data:/prometheus"]},{"name":"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"]}],"exposedPorts":["3000","8081","9090","3001"],"dockerRunCommand":"docker run -d --name claude-relay-service -p 3000:3000 --restart always weishaw/claude-relay-service:latest","podmanRunCommand":"podman run -d --name claude-relay-service -p 3000:3000 --restart always weishaw/claude-relay-service:latest","skopeoInspectCommand":"skopeo inspect docker://docker.io/weishaw/claude-relay-service:latest","orasPullCommand":"oras pull weishaw/claude-relay-service:latest","registryMeta":{"provider":"dockerhub","image":"weishaw/claude-relay-service","canonicalImage":"docker.io/weishaw/claude-relay-service:latest","latestTag":"latest","cliCommands":{"dockerRun":"docker run -d --name claude-relay-service -p 3000:3000 --restart always weishaw/claude-relay-service:latest","dockerPull":"docker pull weishaw/claude-relay-service:latest","podmanRun":"podman run -d --name claude-relay-service -p 3000:3000 --restart always weishaw/claude-relay-service:latest","skopeoInspect":"skopeo inspect docker://docker.io/weishaw/claude-relay-service:latest","orasPull":"oras pull weishaw/claude-relay-service:latest","composeYaml":"services:\n  claude-relay-service:\n    image: weishaw/claude-relay-service:latest\n    restart: unless-stopped\n    ports:\n      - \"3000:3000\""}}}