diff --git a/plane/compose.yml b/plane/compose.yml new file mode 100644 index 0000000..b0f2ede --- /dev/null +++ b/plane/compose.yml @@ -0,0 +1,192 @@ +version: "3.8" + +# ============================================================ +# Plane Community Edition – board.byhaider.dev +# Traefik + externer PostgreSQL + eigener Redis + MinIO + RabbitMQ +# ============================================================ + +networks: + traefik-network: + external: true + postgresql: + external: true + plane-internal: + driver: bridge + +volumes: + plane-redisdata: + plane-rabbitmq: + plane-minio: + +services: + + # ---------------------------------------------------------- + # Redis + # ---------------------------------------------------------- + plane-redis: + image: valkey/valkey:7.2.11-alpine + container_name: plane-redis + restart: unless-stopped + volumes: + - plane-redisdata:/data + networks: + - plane-internal + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 5s + retries: 5 + + # ---------------------------------------------------------- + # RabbitMQ + # ---------------------------------------------------------- + plane-mq: + image: rabbitmq:3.13.6-management-alpine + container_name: plane-mq + restart: unless-stopped + environment: + RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER} + RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD} + RABBITMQ_DEFAULT_VHOST: ${RABBITMQ_VHOST} + volumes: + - plane-rabbitmq:/var/lib/rabbitmq + networks: + - plane-internal + healthcheck: + test: ["CMD", "rabbitmq-diagnostics", "ping"] + interval: 15s + timeout: 10s + retries: 5 + + # ---------------------------------------------------------- + # MinIO + # ---------------------------------------------------------- + plane-minio: + image: minio/minio + container_name: plane-minio + restart: unless-stopped + command: server /export --console-address ":9090" + environment: + MINIO_ROOT_USER: ${AWS_ACCESS_KEY_ID} + MINIO_ROOT_PASSWORD: ${AWS_SECRET_ACCESS_KEY} + volumes: + - plane-minio:/export + networks: + - plane-internal + - traefik-network + labels: + - "traefik.enable=true" + - "traefik.docker.network=traefik-network" + - "traefik.http.routers.plane-minio.rule=Host(`board.byhaider.dev`) && PathPrefix(`/uploads`)" + - "traefik.http.routers.plane-minio.entrypoints=websecure" + - "traefik.http.routers.plane-minio.tls=true" + - "traefik.http.routers.plane-minio.tls.certresolver=cloudflare" + - "traefik.http.routers.plane-minio.priority=25" + - "traefik.http.services.plane-minio.loadbalancer.server.port=9000" + + # ---------------------------------------------------------- + # DB Migrator (einmalig beim Start) + # ---------------------------------------------------------- + plane-migrator: + image: makeplane/plane-backend:stable + container_name: plane-migrator + restart: "no" + command: ./bin/docker-entrypoint-migrator.sh + env_file: .env + depends_on: + plane-redis: + condition: service_healthy + plane-mq: + condition: service_healthy + networks: + - plane-internal + - postgresql + + # ---------------------------------------------------------- + # API Backend + # ---------------------------------------------------------- + plane-api: + image: makeplane/plane-backend:stable + container_name: plane-api + restart: unless-stopped + command: ./bin/docker-entrypoint-api.sh + env_file: .env + environment: + GUNICORN_WORKERS: "2" + depends_on: + plane-redis: + condition: service_healthy + plane-mq: + condition: service_healthy + plane-migrator: + condition: service_completed_successfully + networks: + - plane-internal + - postgresql + - traefik-network + labels: + - "traefik.enable=true" + - "traefik.docker.network=traefik-network" + - "traefik.http.routers.plane-api.rule=Host(`board.byhaider.dev`) && (PathPrefix(`/api`) || PathPrefix(`/auth`) || PathPrefix(`/static`))" + - "traefik.http.routers.plane-api.entrypoints=websecure" + - "traefik.http.routers.plane-api.tls=true" + - "traefik.http.routers.plane-api.tls.certresolver=cloudflare" + - "traefik.http.routers.plane-api.priority=20" + - "traefik.http.services.plane-api.loadbalancer.server.port=8000" + + # ---------------------------------------------------------- + # Background Worker + # ---------------------------------------------------------- + plane-worker: + image: makeplane/plane-backend:stable + container_name: plane-worker + restart: unless-stopped + command: ./bin/docker-entrypoint-worker.sh + env_file: .env + depends_on: + - plane-api + networks: + - plane-internal + - postgresql + extra_hosts: + - "mail.byhaider.dev:212.132.119.248" + + # ---------------------------------------------------------- + # Beat Scheduler + # ---------------------------------------------------------- + plane-beat: + image: makeplane/plane-backend:stable + container_name: plane-beat + restart: unless-stopped + command: ./bin/docker-entrypoint-beat.sh + env_file: .env + depends_on: + - plane-api + networks: + - plane-internal + - postgresql + extra_hosts: + - "mail.byhaider.dev:212.132.119.248" + + # ---------------------------------------------------------- + # Frontend → Traefik + # ---------------------------------------------------------- + plane-web: + image: makeplane/plane-frontend:stable + container_name: plane-web + restart: unless-stopped + env_file: .env + depends_on: + - plane-api + networks: + - plane-internal + - traefik-network + labels: + - "traefik.enable=true" + - "traefik.docker.network=traefik-network" + - "traefik.http.routers.plane-web.rule=Host(`board.byhaider.dev`)" + - "traefik.http.routers.plane-web.entrypoints=websecure" + - "traefik.http.routers.plane-web.tls=true" + - "traefik.http.routers.plane-web.tls.certresolver=cloudflare" + - "traefik.http.routers.plane-web.priority=10" + - "traefik.http.services.plane-web.loadbalancer.server.port=3000" \ No newline at end of file