# documentation: https://docs.plane.so/self-hosting/methods/docker-compose
# slogan: The open source project management tool
# category: productivity
# tags: plane,project-management,tool,open,source,api,nextjs,redis,postgresql,django,pm
# logo: svgs/plane.svg

x-app-env: &app-env
  environment:
    - APP_RELEASE=${APP_RELEASE:-v0.25.2}
    - WEB_URL=${SERVICE_URL_PLANE}
    - DEBUG=${DEBUG:-0}
    - CORS_ALLOWED_ORIGINS=${CORS_ALLOWED_ORIGIN:-http://localhost}
    # Gunicorn Workers
    - GUNICORN_WORKERS=${GUNICORN_WORKERS:-1}
    #DB SETTINGS
    - PGHOST=plane-db
    - PGDATABASE=plane
    - POSTGRES_USER=$SERVICE_USER_POSTGRES
    - POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES
    - POSTGRES_DB=plane
    - POSTGRES_PORT=5432
    - PGDATA=/var/lib/postgresql/data
    - DATABASE_URL=postgresql://$SERVICE_USER_POSTGRES:$SERVICE_PASSWORD_POSTGRES@plane-db/plane
    # REDIS SETTINGS
    - REDIS_HOST=plane-redis
    - REDIS_PORT=6379
    - REDIS_URL=${REDIS_URL:-redis://plane-redis:6379/}

    # RabbitMQ Settings
    - RABBITMQ_HOST=plane-mq
    - RABBITMQ_PORT=${RABBITMQ_PORT:-5672}
    - RABBITMQ_DEFAULT_USER=${SERVICE_USER_RABBITMQ:-plane}
    - RABBITMQ_DEFAULT_PASS=${SERVICE_PASSWORD_RABBITMQ:-plane}
    - RABBITMQ_DEFAULT_VHOST=${RABBITMQ_VHOST:-plane}
    - RABBITMQ_VHOST=${RABBITMQ_VHOST:-plane}
    - 'AMQP_URL=amqp://${SERVICE_USER_RABBITMQ}:${SERVICE_PASSWORD_RABBITMQ}@plane-mq:${RABBITMQ_PORT}/plane'
    # Application secret
    - SECRET_KEY=$SERVICE_PASSWORD_64_SECRETKEY
    # DATA STORE SETTINGS
    - USE_MINIO=${USE_MINIO:-1}
    - AWS_REGION=${AWS_REGION}
    - AWS_ACCESS_KEY_ID=$SERVICE_USER_MINIO
    - AWS_SECRET_ACCESS_KEY=$SERVICE_PASSWORD_MINIO
    - AWS_S3_ENDPOINT_URL=${AWS_S3_ENDPOINT_URL:-http://plane-minio:9000}
    - AWS_S3_BUCKET_NAME=${AWS_S3_BUCKET_NAME:-uploads}
    - MINIO_ROOT_USER=$SERVICE_USER_MINIO
    - MINIO_ROOT_PASSWORD=$SERVICE_PASSWORD_MINIO
    - BUCKET_NAME=${BUCKET_NAME:-uploads}
    - FILE_SIZE_LIMIT=${FILE_SIZE_LIMIT:-5242880}
    # Live server env
    - API_BASE_URL=${API_BASE_URL:-http://api:8000}

services:
  proxy:
    environment:
      - SERVICE_URL_PLANE
      - FILE_SIZE_LIMIT=${FILE_SIZE_LIMIT:-5242880}
      - BUCKET_NAME=${BUCKET_NAME:-uploads}
    image: makeplane/plane-proxy:${APP_RELEASE:-v0.25.1}
    depends_on:
      - web
      - api
      - space
    healthcheck:
      test: ["CMD", "curl", "-f", "http://127.0.0.1:80"]
      interval: 2s
      timeout: 10s
      retries: 15

  web:
    image: makeplane/plane-frontend:${APP_RELEASE:-v0.25.1}
    command: node web/server.js web
    depends_on:
      - api
      - worker
    healthcheck:
      test: "wget -qO- http://`hostname`:3000"
      interval: 2s
      timeout: 10s
      retries: 15
  space:
    image: makeplane/plane-space:${APP_RELEASE:-v0.25.1}
    command: node space/server.js space
    depends_on:
      - api
      - worker
      - web
    healthcheck:
      test: ["CMD", "echo", "hey whats up"]
      interval: 2s
      timeout: 10s
      retries: 15

  admin:
    image: makeplane/plane-admin:${APP_RELEASE:-v0.25.1}
    command: node admin/server.js admin
    depends_on:
      - api
      - web
    healthcheck:
      test: ["CMD", "echo", "hey whats up"]
      interval: 2s
      timeout: 10s
      retries: 15

  live:
    <<: *app-env
    image: makeplane/plane-live:${APP_RELEASE:-v0.25.1}
    command: node live/dist/server.js live
    depends_on:
      - api
      - web
    healthcheck:
      test: ["CMD", "echo", "hey whats up"]
      interval: 2s
      timeout: 10s
      retries: 15

  api:
    <<: *app-env
    image: makeplane/plane-backend:${APP_RELEASE:-v0.25.1}
    command: ./bin/docker-entrypoint-api.sh
    volumes:
      - logs_api:/code/plane/logs
    depends_on:
      - plane-db
      - plane-redis
    healthcheck:
      test: ["CMD", "echo", "hey whats up"]
      interval: 2s
      timeout: 10s
      retries: 15

  worker:
    <<: *app-env
    image: makeplane/plane-backend:${APP_RELEASE:-v0.25.1}
    command: ./bin/docker-entrypoint-worker.sh
    volumes:
      - logs_worker:/code/plane/logs
    depends_on:
      - api
      - plane-db
      - plane-redis
    healthcheck:
      test: ["CMD", "echo", "hey whats up"]
      interval: 2s
      timeout: 10s
      retries: 15

  beat-worker:
    <<: *app-env
    image: makeplane/plane-backend:${APP_RELEASE:-v0.25.1}
    command: ./bin/docker-entrypoint-beat.sh
    volumes:
      - logs_beat-worker:/code/plane/logs
    depends_on:
      - api
      - plane-db
      - plane-redis
    healthcheck:
      test: ["CMD", "echo", "hey whats up"]
      interval: 2s
      timeout: 10s
      retries: 15

  migrator:
    <<: *app-env
    image: makeplane/plane-backend:${APP_RELEASE:-v0.25.1}
    restart: "no"
    command: ./bin/docker-entrypoint-migrator.sh
    volumes:
      - logs_migrator:/code/plane/logs
    depends_on:
      - plane-db
      - plane-redis

  plane-db:
    <<: *app-env
    image: postgres:15.7-alpine
    command: postgres -c 'max_connections=1000'
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
      interval: 5s
      timeout: 20s
      retries: 10

  plane-redis:
    <<: *app-env
    image: valkey/valkey:7.2.5-alpine
    volumes:
      - redisdata:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 20s
      retries: 10

  plane-mq:
    <<: *app-env
    image: rabbitmq:3.13.6-management-alpine
    restart: always
    volumes:
      - rabbitmq_data:/var/lib/rabbitmq
    healthcheck:
      test: rabbitmq-diagnostics -q ping
      interval: 30s
      timeout: 30s
      retries: 3

  plane-minio:
    <<: *app-env
    image: minio/minio:latest
    command: server /export --console-address ":9090"
    volumes:
      - uploads:/export
    healthcheck:
      test: ["CMD", "mc", "ready", "local"]
      interval: 5s
      timeout: 20s
      retries: 10
