version: "3.8"

services:
  plane-web:
    container_name: planefrontend
    build:
      context: .
      dockerfile: ./web/Dockerfile.web
      args:
        DOCKER_BUILDKIT: 1
    restart: always
    command: /usr/local/bin/start.sh web/server.js web
    depends_on:
      - plane-api
      - plane-worker

  plane-deploy:
    container_name: planedeploy
    build:
      context: .
      dockerfile: ./space/Dockerfile.space
      args:
        DOCKER_BUILDKIT: 1
    restart: always
    command: /usr/local/bin/start.sh space/server.js space
    depends_on:
      - plane-api
      - plane-worker
      - plane-web

  plane-api:
    container_name: planebackend
    build:
      context: ./apiserver
      dockerfile: Dockerfile.api
      args:
        DOCKER_BUILDKIT: 1
    restart: always
    command: ./bin/takeoff
    env_file:
      - ./apiserver/.env
    depends_on:
      - plane-db
      - plane-redis

  plane-worker:
    container_name: planebgworker
    build:
      context: ./apiserver
      dockerfile: Dockerfile.api
      args:
        DOCKER_BUILDKIT: 1
    restart: always
    command: ./bin/worker
    env_file:
      - ./apiserver/.env
    depends_on:
      - plane-api
      - plane-db
      - plane-redis

  plane-beat-worker:
    container_name: planebeatworker
    build:
      context: ./apiserver
      dockerfile: Dockerfile.api
      args:
        DOCKER_BUILDKIT: 1
    restart: always
    command: ./bin/beat
    env_file:
      - ./apiserver/.env
    depends_on:
      - plane-api
      - plane-db
      - plane-redis

  plane-db:
    container_name: plane-db
    image: postgres:15.2-alpine
    restart: always
    command: postgres -c 'max_connections=1000'
    volumes:
      - pgdata:/var/lib/postgresql/data
    env_file:
      - .env
    environment:
      POSTGRES_USER: ${PGUSER}
      POSTGRES_DB: ${PGDATABASE}
      POSTGRES_PASSWORD: ${PGPASSWORD}
      PGDATA: /var/lib/postgresql/data

  plane-redis:
    container_name: plane-redis
    image: redis:6.2.7-alpine
    restart: always
    volumes:
      - redisdata:/data

  plane-minio:
    container_name: plane-minio
    image: minio/minio
    restart: always
    command: server /export --console-address ":9090"
    volumes:
      - uploads:/export
    environment:
      MINIO_ROOT_USER: ${AWS_ACCESS_KEY_ID}
      MINIO_ROOT_PASSWORD: ${AWS_SECRET_ACCESS_KEY}

  createbuckets:
    image: minio/mc
    entrypoint: >
      /bin/sh -c " /usr/bin/mc config host add plane-minio http://plane-minio:9000 \$AWS_ACCESS_KEY_ID \$AWS_SECRET_ACCESS_KEY; /usr/bin/mc mb plane-minio/\$AWS_S3_BUCKET_NAME; /usr/bin/mc anonymous set download plane-minio/\$AWS_S3_BUCKET_NAME; exit 0; "
    env_file:
      - .env
    depends_on:
      - plane-minio

  # Comment this if you already have a reverse proxy running
  plane-proxy:
    container_name: planeproxy
    build:
      context: ./nginx
      dockerfile: Dockerfile
    restart: always
    ports:
      - ${NGINX_PORT}:80
    environment:
      FILE_SIZE_LIMIT: ${FILE_SIZE_LIMIT:-5242880}
      BUCKET_NAME: ${AWS_S3_BUCKET_NAME:-uploads}
    depends_on:
      - plane-web
      - plane-api

volumes:
  pgdata:
  redisdata:
  uploads: