x-plane: &plane APP_VERSION: ${APP_RELEASE_VERSION:-v1.8.3} APP_DOMAIN: ${DOMAIN_NAME:-localhost} MACHINE_SIGNATURE: ${MACHINE_SIGNATURE} DEPLOY_PLATFORM: docker_compose PRIME_HOST: https://prime.plane.so x-monitor-env: &monitor-env SERVICE_HTTP_WEB: web:3000 SERVICE_HTTP_API: api:8000 SERVICE_HTTP_LIVE: live:3000 SERVICE_HTTP_PROXY: proxy:80 SERVICE_HTTP_MINIO: plane-minio:9090 SERVICE_TCP_REDIS: plane-redis:6379 SERVICE_TCP_POSTGRES: plane-db:5432 TRUSTED_PROXIES: ${TRUSTED_PROXIES:-0.0.0.0/0} x-proxy-env: &proxy-env SITE_ADDRESS: ${SITE_ADDRESS:-localhost:80} CERT_EMAIL: ${CERT_EMAIL:-admin@example.com} CERT_ACME_CA: ${CERT_ACME_CA} CERT_ACME_DNS: ${CERT_ACME_DNS} BUCKET_NAME: ${BUCKET_NAME:-uploads} FILE_SIZE_LIMIT: ${FILE_SIZE_LIMIT:-5242880} LISTEN_HTTP_PORT: ${LISTEN_HTTP_PORT:-80} LISTEN_HTTPS_PORT: ${LISTEN_HTTPS_PORT:-443} x-pg-env: &pg-env POSTGRES_USER: ${POSTGRES_USER:-plane} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-plane} POSTGRES_DB: ${POSTGRES_DB:-plane} PGDATA: ${PGDATA:-/var/lib/postgresql/data} DATABASE_URL: ${DATABASE_URL:-postgresql://plane:plane@plane-db/plane} DB_URL: ${DATABASE_URL:-postgresql://plane:plane@plane-db/plane} x-rabbitmq-env: &rabbitmq-env RABBITMQ_HOST: ${RABBITMQ_HOST:-plane-mq} RABBITMQ_PORT: ${RABBITMQ_PORT:-5672} RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER:-plane} RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD:-plane} RABBITMQ_DEFAULT_VHOST: ${RABBITMQ_VHOST:-plane} RABBITMQ_VHOST: ${RABBITMQ_VHOST:-plane} AMQP_URL: ${AMQP_URL:-amqp://plane:plane@plane-mq:5672/plane} x-redis-env: &redis-env REDIS_HOST: ${REDIS_HOST:-plane-redis} REDIS_PORT: ${REDIS_PORT:-6379} REDIS_URL: ${REDIS_URL:-redis://plane-redis:6379/} x-docstore-env: &docstore-env USE_MINIO: ${USE_MINIO:-1} MINIO_ROOT_USER: ${MINIO_ROOT_USER:-access-key} MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-secret-key} BUCKET_NAME: ${BUCKET_NAME:-uploads} AWS_REGION: ${AWS_REGION} AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID:-access-key} AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY:-secret-key} AWS_S3_ENDPOINT_URL: ${AWS_S3_ENDPOINT_URL:-http://plane-minio:9000} AWS_S3_BUCKET_NAME: ${AWS_S3_BUCKET_NAME:-uploads} x-silo-env: &silo-env PORT: 3000 # Silo App Envs BATCH_SIZE: ${BATCH_SIZE:-60} DEDUP_INTERVAL: ${DEDUP_INTERVAL:-3} APP_BASE_URL: ${SITE_ADDRESS} API_BASE_URL: ${API_BASE_URL:-http://api:8000} SILO_API_BASE_URL: ${SITE_ADDRESS} SILO_BASE_PATH: ${SILO_BASE_PATH:-/silo} WEBHOOK_SECRET: ${WEBHOOK_SECRET:-plane-silo} MQ_PREFETCH_COUNT: ${MQ_PREFETCH_COUNT:-10} # Authentication SILO_HMAC_SECRET_KEY: ${SILO_HMAC_SECRET_KEY:-tnbbvj6ATPvze4zaygdujxg4dpk4hqx0WDW} # Feature Flag Envs FEATURE_FLAG_SERVER_BASE_URL: ${FEATURE_FLAG_SERVER_BASE_URL} # Github Envs GITHUB_APP_NAME: ${GITHUB_APP_NAME} GITHUB_APP_ID: ${GITHUB_APP_ID} GITHUB_CLIENT_ID: ${GITHUB_CLIENT_ID} GITHUB_CLIENT_SECRET: ${GITHUB_CLIENT_SECRET} GITHUB_PRIVATE_KEY: ${GITHUB_PRIVATE_KEY} # Gitlab Envs GITLAB_CLIENT_ID: ${GITLAB_CLIENT_ID} GITLAB_CLIENT_SECRET: ${GITLAB_CLIENT_SECRET} # Slack Envs SLACK_CLIENT_ID: ${SLACK_CLIENT_ID} SLACK_CLIENT_SECRET: ${SLACK_CLIENT_SECRET} x-app-env: &app-env WEB_URL: ${WEB_URL:-http://localhost} DEBUG: ${DEBUG:-0} CORS_ALLOWED_ORIGINS: ${CORS_ALLOWED_ORIGINS} API_BASE_URL: ${API_BASE_URL:-http://api:8000} # Gunicorn Workers GUNICORN_WORKERS: ${GUNICORN_WORKERS:-2} # Application secret SECRET_KEY: ${SECRET_KEY:-60gp0byfz2dvffa45cxl20p1scy9xbpf6d8c5y0geejgkyp1b5} FILE_SIZE_LIMIT: ${FILE_SIZE_LIMIT:-5242880} SSL_VERIFY: ${SSL_VERIFY:-1} FEATURE_FLAG_SERVER_BASE_URL: ${FEATURE_FLAG_SERVER_BASE_URL:-http://monitor:8080} PAYMENT_SERVER_BASE_URL: ${PAYMENT_SERVER_BASE_URL:-http://monitor:8080} # Enternal Services Config SILO_HMAC_SECRET_KEY: ${SILO_HMAC_SECRET_KEY:-tnbbvj6ATPvze4zaygdujxg4dpk4hqx0WDW} # API key rate limit API_KEY_RATE_LIMIT: ${API_KEY_RATE_LIMIT:-60/minute} # Force HTTPS for handling SSL Termination MINIO_ENDPOINT_SSL: ${MINIO_ENDPOINT_SSL:-0} x-live-env: &live-env API_BASE_URL: ${API_BASE_URL:-http://api:8000} services: admin: image: makeplane/admin-commercial:${APP_RELEASE_VERSION} command: node admin/server.js admin deploy: replicas: ${ADMIN_REPLICAS:-1} restart_policy: condition: on-failure depends_on: - api - web web: image: makeplane/web-commercial:${APP_RELEASE_VERSION} command: node web/server.js web deploy: replicas: ${WEB_REPLICAS:-1} restart_policy: condition: on-failure depends_on: - api - worker space: image: makeplane/space-commercial:${APP_RELEASE_VERSION} command: node space/server.js space deploy: replicas: ${SPACE_REPLICAS:-1} restart_policy: condition: on-failure depends_on: - api - web live: image: makeplane/live-commercial:${APP_RELEASE_VERSION} command: node live/dist/server.js live environment: <<: [*live-env, *redis-env] deploy: replicas: ${LIVE_REPLICAS:-1} restart_policy: condition: on-failure depends_on: - api - web monitor: image: makeplane/monitor-commercial:${APP_RELEASE_VERSION} volumes: - ${INSTALL_DIR:-./plane}/data/monitor:/app environment: <<: [*plane, *monitor-env] deploy: replicas: 1 restart_policy: condition: on-failure api: image: makeplane/backend-commercial:${APP_RELEASE_VERSION} command: ./bin/docker-entrypoint-api-ee.sh environment: <<: [*plane, *app-env, *pg-env, *redis-env, *rabbitmq-env, *docstore-env] deploy: replicas: ${API_REPLICAS:-1} restart_policy: condition: on-failure volumes: - ${INSTALL_DIR:-./plane}/logs/api:/code/plane/logs depends_on: - plane-db - plane-redis worker: image: makeplane/backend-commercial:${APP_RELEASE_VERSION} command: ./bin/docker-entrypoint-worker.sh environment: <<: [*plane, *app-env, *pg-env, *redis-env, *rabbitmq-env, *docstore-env] deploy: replicas: ${WORKER_REPLICAS:-1} restart_policy: condition: on-failure volumes: - ${INSTALL_DIR:-./plane}/logs/worker:/code/plane/logs depends_on: - api - plane-db - plane-redis beat-worker: image: makeplane/backend-commercial:${APP_RELEASE_VERSION} command: ./bin/docker-entrypoint-beat.sh environment: <<: [*plane, *app-env, *pg-env, *redis-env, *rabbitmq-env, *docstore-env] deploy: replicas: ${BEAT_WORKER_REPLICAS:-1} restart_policy: condition: on-failure volumes: - ${INSTALL_DIR:-./plane}/logs/beat-worker:/code/plane/logs depends_on: - api - plane-db - plane-redis migrator: image: makeplane/backend-commercial:${APP_RELEASE_VERSION} command: ./bin/docker-entrypoint-migrator.sh environment: <<: [*plane, *app-env, *pg-env, *redis-env, *rabbitmq-env, *docstore-env] deploy: replicas: 1 restart_policy: condition: on-failure volumes: - ${INSTALL_DIR:-./plane}/logs/migrator:/code/plane/logs depends_on: - plane-db - plane-redis plane-db: image: postgres:15.7-alpine command: postgres -c 'max_connections=1000' environment: <<: [*pg-env] deploy: replicas: 1 restart_policy: condition: on-failure volumes: - ${INSTALL_DIR:-./plane}/data/db:/var/lib/postgresql/data plane-redis: image: valkey/valkey:7.2.5-alpine environment: <<: [*redis-env] deploy: replicas: 1 restart_policy: condition: on-failure volumes: - ${INSTALL_DIR:-./plane}/data/redis:/data plane-mq: image: rabbitmq:3.13.6-management-alpine environment: <<: [*rabbitmq-env] deploy: replicas: 1 restart_policy: condition: on-failure volumes: - ${INSTALL_DIR:-./plane}/data/mq:/var/lib/rabbitmq plane-minio: image: minio/minio:latest command: server /export --console-address ":9090" environment: <<: [*docstore-env] deploy: replicas: 1 restart_policy: condition: on-failure volumes: - ${INSTALL_DIR:-./plane}/data/minio/uploads:/export - ${INSTALL_DIR:-./plane}/data/minio/data:/data silo: image: makeplane/silo-commercial:${APP_RELEASE_VERSION} restart: unless-stopped command: node silo/start.cjs environment: <<: [*silo-env, *pg-env, *rabbitmq-env, *redis-env] deploy: replicas: ${SILO_REPLICAS:-1} depends_on: - plane-redis - plane-mq # Comment this if you already have a reverse proxy running proxy: image: makeplane/proxy-commercial:${APP_RELEASE_VERSION} restart: unless-stopped environment: <<: [*proxy-env] ports: - target: 80 published: ${LISTEN_HTTP_PORT:-80} protocol: tcp mode: host - target: 443 published: ${LISTEN_HTTPS_PORT:-443} protocol: tcp mode: host volumes: - ${INSTALL_DIR:-./plane}/caddy/config:/config - ${INSTALL_DIR:-./plane}/caddy/data:/data depends_on: - web - api - space - admin - live