x-db-env: &db-env PGHOST: ${PGHOST:-plane-db} PGDATABASE: ${PGDATABASE:-plane} POSTGRES_USER: ${POSTGRES_USER:-plane} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-plane} POSTGRES_DB: ${POSTGRES_DB:-plane} POSTGRES_PORT: ${POSTGRES_PORT:-5432} PGDATA: ${PGDATA:-/var/lib/postgresql/data} 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-minio-env: &minio-env MINIO_ROOT_USER: ${AWS_ACCESS_KEY_ID:-access-key} MINIO_ROOT_PASSWORD: ${AWS_SECRET_ACCESS_KEY:-secret-key} x-aws-s3-env: &aws-s3-env 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-proxy-env: &proxy-env APP_DOMAIN: ${APP_DOMAIN:-localhost} FILE_SIZE_LIMIT: ${PROXY_BODY_SIZE_LIMIT:-1073741824} PROXY_BODY_SIZE_LIMIT: ${PROXY_BODY_SIZE_LIMIT:-1073741824} CERT_EMAIL: ${CERT_EMAIL:-} CERT_ACME_CA: ${CERT_ACME_CA:-https://acme-v02.api.letsencrypt.org/directory} CERT_ACME_DNS: ${CERT_ACME_DNS:-} TRUSTED_PROXIES: ${TRUSTED_PROXIES:-0.0.0.0/0} LISTEN_HTTP_PORT: ${LISTEN_HTTP_PORT:-8090} LISTEN_HTTPS_PORT: ${LISTEN_HTTPS_PORT:-8443} BUCKET_NAME: ${AWS_S3_BUCKET_NAME:-uploads} SITE_ADDRESS: ${SITE_ADDRESS:-:80} x-mq-env: &mq-env # RabbitMQ Settings 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} x-live-env: &live-env API_BASE_URL: ${API_BASE_URL:-http://api:8000} LIVE_SERVER_SECRET_KEY: ${LIVE_SERVER_SECRET_KEY:-2FiJk1U2aiVPEQtzLehYGlTSnTnrs7LW} x-app-env: &app-env WEB_URL: ${WEB_URL:-http://localhost:8090} DEBUG: ${DEBUG:-0} CORS_ALLOWED_ORIGINS: ${CORS_ALLOWED_ORIGINS:-http://localhost:8090} ENABLE_SIGNUP: ${ENABLE_SIGNUP:-0} ENABLE_EMAIL_PASSWORD: ${ENABLE_EMAIL_PASSWORD:-1} ENABLE_MAGIC_LINK_LOGIN: ${ENABLE_MAGIC_LINK_LOGIN:-0} PLANE_OIDC_ISSUER: ${PLANE_OIDC_ISSUER:-} PLANE_OIDC_CLIENT_ID: ${PLANE_OIDC_CLIENT_ID:-} PLANE_OIDC_CLIENT_SECRET: ${PLANE_OIDC_CLIENT_SECRET:-} PLANE_OIDC_REDIRECT_URI: ${PLANE_OIDC_REDIRECT_URI:-} PLANE_OIDC_SCOPE: ${PLANE_OIDC_SCOPE:-openid email profile groups} PLANE_OIDC_REQUIRED_GROUPS: ${PLANE_OIDC_REQUIRED_GROUPS:-nodedc:superadmin,nodedc:taskmanager:admin,nodedc:taskmanager:user} PLANE_OIDC_AUTO_LINK_EMAIL: ${PLANE_OIDC_AUTO_LINK_EMAIL:-0} PLANE_OIDC_AUTO_CREATE_USER: ${PLANE_OIDC_AUTO_CREATE_USER:-0} PLANE_OIDC_SYNC_PROFILE: ${PLANE_OIDC_SYNC_PROFILE:-1} PLANE_NODEDC_SKIP_PROFILE_ONBOARDING: ${PLANE_NODEDC_SKIP_PROFILE_ONBOARDING:-0} PLANE_NODEDC_ACCESS_ENFORCEMENT: ${PLANE_NODEDC_ACCESS_ENFORCEMENT:-0} PLANE_NODEDC_ACCESS_CHECK_URL: ${PLANE_NODEDC_ACCESS_CHECK_URL:-} PLANE_NODEDC_ACCESS_TOKEN: ${PLANE_NODEDC_ACCESS_TOKEN:-} PLANE_NODEDC_ACCESS_SERVICE_SLUG: ${PLANE_NODEDC_ACCESS_SERVICE_SLUG:-task-manager} PLANE_NODEDC_ACCESS_TIMEOUT_SECONDS: ${PLANE_NODEDC_ACCESS_TIMEOUT_SECONDS:-3} PLANE_NODEDC_ACCESS_CACHE_SECONDS: ${PLANE_NODEDC_ACCESS_CACHE_SECONDS:-0} PLANE_NODEDC_ACCESS_ENFORCE_UNLINKED: ${PLANE_NODEDC_ACCESS_ENFORCE_UNLINKED:-0} PLANE_NODEDC_ACCESS_DENIED_REDIRECT_URL: ${PLANE_NODEDC_ACCESS_DENIED_REDIRECT_URL:-http://launcher.local.nodedc/} PLANE_NODEDC_GLOBAL_LOGOUT_URL: ${PLANE_NODEDC_GLOBAL_LOGOUT_URL:-http://launcher.local.nodedc/auth/logout?global=1&returnTo=/} PLANE_NODEDC_LAUNCHER_PUBLIC_URL: ${PLANE_NODEDC_LAUNCHER_PUBLIC_URL:-http://launcher.local.nodedc} PLANE_NODEDC_HANDOFF_URL: ${PLANE_NODEDC_HANDOFF_URL:-http://launcher.local.nodedc/api/internal/handoff/consume} PLANE_NODEDC_HANDOFF_TIMEOUT_SECONDS: ${PLANE_NODEDC_HANDOFF_TIMEOUT_SECONDS:-3} PLANE_NODEDC_WORKSPACE_POLICY_URL: ${PLANE_NODEDC_WORKSPACE_POLICY_URL:-http://launcher.local.nodedc/api/internal/access/check} PLANE_NODEDC_WORKSPACE_POLICY_TIMEOUT_SECONDS: ${PLANE_NODEDC_WORKSPACE_POLICY_TIMEOUT_SECONDS:-3} PLANE_NODEDC_AGENT_GATEWAY_URL: ${PLANE_NODEDC_AGENT_GATEWAY_URL:-} PLANE_NODEDC_AGENT_GATEWAY_TOKEN: ${PLANE_NODEDC_AGENT_GATEWAY_TOKEN:-} PLANE_NODEDC_AGENT_GATEWAY_TIMEOUT_SECONDS: ${PLANE_NODEDC_AGENT_GATEWAY_TIMEOUT_SECONDS:-5} GUNICORN_WORKERS: 1 POSTHOG_API_KEY: ${POSTHOG_API_KEY:-} POSTHOG_HOST: ${POSTHOG_HOST:-} INSTANCE_CHANGELOG_URL: ${INSTANCE_CHANGELOG_URL:-} IS_INTERCOM_ENABLED: ${IS_INTERCOM_ENABLED:-0} INTERCOM_APP_ID: ${INTERCOM_APP_ID:-} ADMIN_BASE_PATH: ${ADMIN_BASE_PATH:-/nodedcsudo/} USE_MINIO: ${USE_MINIO:-1} DATABASE_URL: ${DATABASE_URL:-postgresql://plane:plane@plane-db/plane} SECRET_KEY: ${SECRET_KEY:-60gp0byfz2dvffa45cxl20p1scy9xbpf6d8c5y0geejgkyp1b5} AMQP_URL: ${AMQP_URL:-amqp://plane:plane@plane-mq:5672/plane} API_KEY_RATE_LIMIT: ${API_KEY_RATE_LIMIT:-60/minute} MINIO_ENDPOINT_SSL: ${MINIO_ENDPOINT_SSL:-0} LIVE_SERVER_SECRET_KEY: ${LIVE_SERVER_SECRET_KEY:-2FiJk1U2aiVPEQtzLehYGlTSnTnrs7LW} services: web: image: nodedc/plane-frontend:ru deploy: replicas: ${WEB_REPLICAS:-1} restart_policy: condition: any depends_on: - api - worker space: image: nodedc/plane-space:ru deploy: replicas: ${SPACE_REPLICAS:-1} restart_policy: condition: any depends_on: - api - worker - web admin: image: nodedc/plane-admin:ru deploy: replicas: ${ADMIN_REPLICAS:-1} restart_policy: condition: any depends_on: - api - web live: image: nodedc/plane-live:local environment: <<: [*live-env, *redis-env] deploy: replicas: ${LIVE_REPLICAS:-1} restart_policy: condition: any depends_on: - api - web api: image: nodedc/plane-backend:local command: ./bin/docker-entrypoint-api.sh extra_hosts: - "auth.local.nodedc:host-gateway" - "launcher.local.nodedc:host-gateway" deploy: replicas: ${API_REPLICAS:-1} restart_policy: condition: any volumes: - logs_api:/code/plane/logs environment: <<: [*app-env, *db-env, *redis-env, *minio-env, *aws-s3-env, *proxy-env] depends_on: - plane-db - plane-redis - plane-mq worker: image: nodedc/plane-backend:local command: ./bin/docker-entrypoint-worker.sh extra_hosts: - "auth.local.nodedc:host-gateway" - "launcher.local.nodedc:host-gateway" deploy: replicas: ${WORKER_REPLICAS:-1} restart_policy: condition: any volumes: - logs_worker:/code/plane/logs environment: <<: [*app-env, *db-env, *redis-env, *minio-env, *aws-s3-env, *proxy-env] depends_on: - api - plane-db - plane-redis - plane-mq beat-worker: image: nodedc/plane-backend:local command: ./bin/docker-entrypoint-beat.sh extra_hosts: - "auth.local.nodedc:host-gateway" - "launcher.local.nodedc:host-gateway" deploy: replicas: ${BEAT_WORKER_REPLICAS:-1} restart_policy: condition: any volumes: - logs_beat-worker:/code/plane/logs environment: <<: [*app-env, *db-env, *redis-env, *minio-env, *aws-s3-env, *proxy-env] depends_on: - api - plane-db - plane-redis - plane-mq migrator: image: nodedc/plane-backend:local command: ./bin/docker-entrypoint-migrator.sh extra_hosts: - "auth.local.nodedc:host-gateway" - "launcher.local.nodedc:host-gateway" deploy: replicas: 1 restart_policy: condition: on-failure volumes: - logs_migrator:/code/plane/logs environment: <<: [*app-env, *db-env, *redis-env, *minio-env, *aws-s3-env, *proxy-env] depends_on: - plane-db - plane-redis # Comment this if you already have a database running plane-db: image: postgres:15.7-alpine command: postgres -c 'max_connections=1000' deploy: replicas: 1 restart_policy: condition: any environment: <<: *db-env volumes: - pgdata:/var/lib/postgresql/data plane-redis: image: valkey/valkey:7.2.11-alpine deploy: replicas: 1 restart_policy: condition: any volumes: - redisdata:/data plane-mq: image: rabbitmq:3.13.6-management-alpine deploy: replicas: 1 restart_policy: condition: any environment: <<: *mq-env volumes: - rabbitmq_data:/var/lib/rabbitmq # Comment this if you using any external s3 compatible storage plane-minio: image: minio/minio:latest command: server /export --console-address ":9090" deploy: replicas: 1 restart_policy: condition: any environment: <<: *minio-env volumes: - uploads:/export # Comment this if you already have a reverse proxy running proxy: image: nodedc/plane-proxy:ru deploy: replicas: 1 restart_policy: condition: any environment: <<: *proxy-env ports: - target: 80 published: ${LISTEN_HTTP_PORT:-8090} protocol: tcp mode: host - target: 443 published: ${LISTEN_HTTPS_PORT:-8443} protocol: tcp mode: host volumes: - proxy_config:/config - proxy_data:/data - ../plane-src/apps/proxy/Caddyfile.ce:/etc/caddy/Caddyfile:ro depends_on: - web - api - space - admin - live volumes: pgdata: redisdata: uploads: logs_api: logs_worker: logs_beat-worker: logs_migrator: rabbitmq_data: proxy_config: proxy_data: