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"