docker-compose.production.yml
Rama develop · réplica de lectura del repositorio original.
name: roomote
x-roomote-production-env: &roomote-production-env
NODE_ENV: production
R_APP_ENV: production
DATABASE_URL: ${DATABASE_URL:?DATABASE_URL is required}
REDIS_URL: ${REDIS_URL:?REDIS_URL is required}
S3_ENDPOINT: ${S3_ENDPOINT:-http://minio:9000}
S3_PRESIGN_ENDPOINT: ${S3_PRESIGN_ENDPOINT:-https://${ROOMOTE_APP_DOMAIN:?ROOMOTE_APP_DOMAIN is required}}
S3_REGION: ${S3_REGION:-us-east-1}
S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID:?S3_ACCESS_KEY_ID is required}
S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY:?S3_SECRET_ACCESS_KEY is required}
S3_BUCKET_ARTIFACTS: ${S3_BUCKET_ARTIFACTS:-roomote-artifacts}
JOB_AUTH_PRIVATE_KEY: ${JOB_AUTH_PRIVATE_KEY:?JOB_AUTH_PRIVATE_KEY is required}
JOB_AUTH_PUBLIC_KEY: ${JOB_AUTH_PUBLIC_KEY:?JOB_AUTH_PUBLIC_KEY is required}
PREVIEW_AUTH_PRIVATE_KEY: ${PREVIEW_AUTH_PRIVATE_KEY:?PREVIEW_AUTH_PRIVATE_KEY is required}
PREVIEW_AUTH_PUBLIC_KEY: ${PREVIEW_AUTH_PUBLIC_KEY:?PREVIEW_AUTH_PUBLIC_KEY is required}
ENCRYPTION_KEY: ${ENCRYPTION_KEY:?ENCRYPTION_KEY is required}
ENCRYPTION_KEY_PREVIOUS: ${ENCRYPTION_KEY_PREVIOUS:-}
BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET:-${ENCRYPTION_KEY_PREVIOUS:-${ENCRYPTION_KEY}}}
ARTIFACT_SIGNING_KEY: ${ARTIFACT_SIGNING_KEY:?ARTIFACT_SIGNING_KEY is required}
ARTIFACT_SIGNING_KEY_PREVIOUS: ${ARTIFACT_SIGNING_KEY_PREVIOUS:-}
DASHBOARD_PASSWORD: ${DASHBOARD_PASSWORD:?DASHBOARD_PASSWORD is required}
R_APP_URL: https://${ROOMOTE_APP_DOMAIN:?ROOMOTE_APP_DOMAIN is required}
R_PUBLIC_URL: https://${ROOMOTE_APP_DOMAIN:?ROOMOTE_APP_DOMAIN is required}
R_INSTANCE_ID: ${R_INSTANCE_ID:-}
R_SESSION_DONE_WEBHOOK_ALLOWED_PRIVATE_CIDRS: ${R_SESSION_DONE_WEBHOOK_ALLOWED_PRIVATE_CIDRS:-}
R_CURATED_INTEGRATIONS_DISABLED: ${R_CURATED_INTEGRATIONS_DISABLED:-false}
TRPC_URL: http://api:3001
PREVIEW_PROXY_BASE_URL: https://${ROOMOTE_PREVIEW_DOMAIN:?ROOMOTE_PREVIEW_DOMAIN is required}
NEXT_PUBLIC_PREVIEW_PROXY_BASE_URL: https://${ROOMOTE_PREVIEW_DOMAIN:?ROOMOTE_PREVIEW_DOMAIN is required}
PREVIEW_DOMAINS: ${ROOMOTE_PREVIEW_DOMAIN:?ROOMOTE_PREVIEW_DOMAIN is required}
PREVIEW_PROXY_SUBDOMAIN_SUFFIX: ${PREVIEW_PROXY_SUBDOMAIN_SUFFIX:-}
R_ALLOWED_EMAILS: ${R_ALLOWED_EMAILS:-}
R_LICENSE_KEY: ${R_LICENSE_KEY:-}
R_MODEL: ${R_MODEL:-}
R_SMALL_MODEL: ${R_SMALL_MODEL:-}
R_VISION_MODEL: ${R_VISION_MODEL:-}
R_CODE_REVIEW_MODEL: ${R_CODE_REVIEW_MODEL:-}
R_EXPLORE_MODEL: ${R_EXPLORE_MODEL:-}
R_MODEL_ENV_KEYS: ${R_MODEL_ENV_KEYS:-}
CUSTOM_PROVIDER_API_KEY: ${CUSTOM_PROVIDER_API_KEY:-}
OPENROUTER_API_KEY: ${OPENROUTER_API_KEY:-}
AI_GATEWAY_API_KEY: ${AI_GATEWAY_API_KEY:-}
OPENAI_API_KEY: ${OPENAI_API_KEY:-}
ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-}
DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-}
GOOGLE_GENERATIVE_AI_API_KEY: ${GOOGLE_GENERATIVE_AI_API_KEY:-}
GEMINI_API_KEY: ${GEMINI_API_KEY:-}
AWS_BEARER_TOKEN_BEDROCK: ${AWS_BEARER_TOKEN_BEDROCK:-}
AWS_REGION: ${AWS_REGION:-}
MOONSHOT_API_KEY: ${MOONSHOT_API_KEY:-}
KIMI_API_KEY: ${KIMI_API_KEY:-}
MINIMAX_API_KEY: ${MINIMAX_API_KEY:-}
ZAI_API_KEY: ${ZAI_API_KEY:-}
ZAI_REGION: ${ZAI_REGION:-}
ZAI_CODING_PLAN_API_KEY: ${ZAI_CODING_PLAN_API_KEY:-}
ZAI_CODING_PLAN_REGION: ${ZAI_CODING_PLAN_REGION:-}
OPENCODE_API_KEY: ${OPENCODE_API_KEY:-}
OPENCODE_GO_API_KEY: ${OPENCODE_GO_API_KEY:-}
BASETEN_API_KEY: ${BASETEN_API_KEY:-}
TOGETHER_API_KEY: ${TOGETHER_API_KEY:-}
GITHUB_TOKEN: ${GITHUB_TOKEN:-}
R_GITHUB_APP_SLUG: ${R_GITHUB_APP_SLUG:?R_GITHUB_APP_SLUG is required}
R_GITHUB_ADDITIONAL_APP_SLUGS: ${R_GITHUB_ADDITIONAL_APP_SLUGS:-}
R_GITHUB_APP_ID: ${R_GITHUB_APP_ID:-}
R_GITHUB_APP_PRIVATE_KEY: ${R_GITHUB_APP_PRIVATE_KEY:-}
R_GITHUB_CLIENT_ID: ${R_GITHUB_CLIENT_ID:-}
R_GITHUB_CLIENT_SECRET: ${R_GITHUB_CLIENT_SECRET:-}
R_GITHUB_WEBHOOK_SECRET: ${R_GITHUB_WEBHOOK_SECRET:-}
SLACK_APP_ID: ${SLACK_APP_ID:-}
R_SLACK_CLIENT_ID: ${R_SLACK_CLIENT_ID:-}
R_SLACK_CLIENT_SECRET: ${R_SLACK_CLIENT_SECRET:-}
R_SLACK_SIGNING_SECRET: ${R_SLACK_SIGNING_SECRET:-}
R_TELEGRAM_BOT_TOKEN: ${R_TELEGRAM_BOT_TOKEN:-}
R_TELEGRAM_WEBHOOK_SECRET: ${R_TELEGRAM_WEBHOOK_SECRET:-}
R_DISCORD_BOT_TOKEN: ${R_DISCORD_BOT_TOKEN:-}
R_DISCORD_GATEWAY_SECRET: ${R_DISCORD_GATEWAY_SECRET:-}
R_LINEAR_CLIENT_ID: ${R_LINEAR_CLIENT_ID:-}
R_LINEAR_CLIENT_SECRET: ${R_LINEAR_CLIENT_SECRET:-}
R_LINEAR_WEBHOOK_SECRET: ${R_LINEAR_WEBHOOK_SECRET:-}
DEFAULT_COMPUTE_PROVIDER: ${DEFAULT_COMPUTE_PROVIDER:?DEFAULT_COMPUTE_PROVIDER is required}
MODAL_TOKEN_ID: ${MODAL_TOKEN_ID:-}
MODAL_TOKEN_SECRET: ${MODAL_TOKEN_SECRET:-}
MODAL_ENDPOINT: ${MODAL_ENDPOINT:-}
MODAL_ENVIRONMENT: ${MODAL_ENVIRONMENT:-}
MODAL_APP_NAME: ${MODAL_APP_NAME:-}
MODAL_BASE_IMAGE_REF: ${MODAL_BASE_IMAGE_REF:-}
MODAL_ECR_OIDC_ROLE_ARN: ${MODAL_ECR_OIDC_ROLE_ARN:-}
MODAL_ECR_REGION: ${MODAL_ECR_REGION:-}
MODAL_REGIONS: ${MODAL_REGIONS:-}
BL_API_KEY: ${BL_API_KEY:-}
BL_WORKSPACE: ${BL_WORKSPACE:-}
BLAXEL_IMAGE: ${BLAXEL_IMAGE:-}
BLAXEL_REGION: ${BLAXEL_REGION:-}
BLAXEL_STANDBY_MAX_COUNT: ${BLAXEL_STANDBY_MAX_COUNT:-25}
BLAXEL_STANDBY_MAX_AGE_HOURS: ${BLAXEL_STANDBY_MAX_AGE_HOURS:-168}
BOX_API_KEY: ${BOX_API_KEY:-}
BOX_API_BASE_URL: ${BOX_API_BASE_URL:-}
BOX_MACHINE_TYPE: ${BOX_MACHINE_TYPE:-}
BOX_TIMEOUT_MS: ${BOX_TIMEOUT_MS:-}
BOX_STANDBY_MAX_COUNT: ${BOX_STANDBY_MAX_COUNT:-25}
BOX_STANDBY_MAX_AGE_HOURS: ${BOX_STANDBY_MAX_AGE_HOURS:-168}
AZURE_SUBSCRIPTION_ID: ${AZURE_SUBSCRIPTION_ID:-}
AZURE_RESOURCE_GROUP: ${AZURE_RESOURCE_GROUP:-}
AZURE_SANDBOX_GROUP: ${AZURE_SANDBOX_GROUP:-}
AZURE_SANDBOX_REGION: ${AZURE_SANDBOX_REGION:-}
AZURE_SANDBOX_DISK_IMAGE: ${AZURE_SANDBOX_DISK_IMAGE:-}
AZURE_CLIENT_ID: ${AZURE_CLIENT_ID:-}
AZURE_TENANT_ID: ${AZURE_TENANT_ID:-}
AZURE_CLIENT_SECRET: ${AZURE_CLIENT_SECRET:-}
AZURE_SANDBOX_REGISTRY_USERNAME: ${AZURE_SANDBOX_REGISTRY_USERNAME:-}
AZURE_SANDBOX_REGISTRY_TOKEN: ${AZURE_SANDBOX_REGISTRY_TOKEN:-}
AZURE_SANDBOX_SIZE: ${AZURE_SANDBOX_SIZE:-}
AZURE_SANDBOX_EGRESS_INSPECTION: ${AZURE_SANDBOX_EGRESS_INSPECTION:-}
AZURE_HTTP_DEBUG: ${AZURE_HTTP_DEBUG:-}
DOCKER_STANDBY_MAX_COUNT: ${DOCKER_STANDBY_MAX_COUNT:-10}
DOCKER_STANDBY_MAX_AGE_HOURS: ${DOCKER_STANDBY_MAX_AGE_HOURS:-24}
x-roomote-production-build-args: &roomote-production-build-args
R_APP_ENV: production
RELEASE_VERSION: ${RELEASE_VERSION:-self-host-production}
RELEASE_PRODUCT_VERSION: ${RELEASE_PRODUCT_VERSION:-}
services:
postgres:
ports: !reset []
redis:
ports: !reset []
minio:
ports: !reset []
db-migrate:
build:
args:
<<: *roomote-production-build-args
environment:
<<: *roomote-production-env
web:
environment:
<<: *roomote-production-env
ports: !reset []
healthcheck:
test:
[
'CMD-SHELL',
'curl -fsS --max-time 2 http://127.0.0.1:3000/health >/dev/null',
]
interval: 5s
timeout: 3s
retries: 12
start_period: 20s
api:
environment:
<<: *roomote-production-env
ports: !reset []
healthcheck:
test:
[
'CMD-SHELL',
'curl -fsS --max-time 2 http://127.0.0.1:3001/health/liveness >/dev/null',
]
interval: 5s
timeout: 3s
retries: 12
start_period: 20s
controller:
environment:
<<: *roomote-production-env
SANDBOX_OPENROUTER_API_KEY: ${SANDBOX_OPENROUTER_API_KEY:-}
healthcheck:
test:
[
'CMD-SHELL',
'curl -fsS --max-time 5 http://api:3001/health/controller >/dev/null',
]
interval: 5s
timeout: 6s
retries: 12
start_period: 20s
bullmq:
environment:
<<: *roomote-production-env
ports: !reset []
healthcheck:
test:
[
'CMD-SHELL',
'curl -fsS --max-time 5 http://127.0.0.1:3002/admin/health >/dev/null',
]
interval: 5s
timeout: 6s
retries: 12
start_period: 20s
preview-proxy:
environment:
<<: *roomote-production-env
ports: !reset []
healthcheck:
test:
[
'CMD-SHELL',
'curl -fsS --max-time 2 http://127.0.0.1:8081/health >/dev/null',
]
interval: 5s
timeout: 3s
retries: 12
start_period: 20s
caddy:
image: caddy:2.10-alpine@sha256:4c6e91c6ed0e2fa03efd5b44747b625fec79bc9cd06ac5235a779726618e530d
container_name: roomote-caddy
restart: unless-stopped
depends_on:
web:
condition: service_healthy
preview-proxy:
condition: service_healthy
environment:
ROOMOTE_APP_DOMAIN: ${ROOMOTE_APP_DOMAIN:?ROOMOTE_APP_DOMAIN is required}
ROOMOTE_PREVIEW_DOMAIN: ${ROOMOTE_PREVIEW_DOMAIN:?ROOMOTE_PREVIEW_DOMAIN is required}
S3_BUCKET_ARTIFACTS: ${S3_BUCKET_ARTIFACTS:-roomote-artifacts}
ports:
- '${CADDY_HTTP_PORT:-80}:80'
- '${CADDY_HTTPS_PORT:-443}:443'
volumes:
- ./deploy/caddy/Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
volumes:
caddy_data:
caddy_config: