x-common-env: &common-env DATABASE_URL: postgresql://mpr_user:mpr_pass@postgres:5432/mpr REDIS_URL: redis://redis:6379/0 DJANGO_SETTINGS_MODULE: admin.mpr.settings DEBUG: 1 GRPC_HOST: grpc GRPC_PORT: 50051 S3_ENDPOINT_URL: http://minio:9000 S3_BUCKET_IN: mpr-media-in S3_BUCKET_OUT: mpr-media-out AWS_ACCESS_KEY_ID: minioadmin AWS_SECRET_ACCESS_KEY: minioadmin AWS_REGION: us-east-1 x-healthcheck-defaults: &healthcheck-defaults interval: 5s timeout: 5s retries: 5 x-python-service: &python-service build: context: .. dockerfile: ctrl/Dockerfile volumes: - ..:/app environment: <<: *common-env depends_on: postgres: condition: service_healthy redis: condition: service_healthy services: # ============================================================================= # Infrastructure # ============================================================================= postgres: image: postgres:15-alpine environment: POSTGRES_DB: mpr POSTGRES_USER: mpr_user POSTGRES_PASSWORD: mpr_pass ports: - "5436:5432" volumes: - postgres-data:/var/lib/postgresql/data healthcheck: <<: *healthcheck-defaults test: ["CMD-SHELL", "pg_isready -U mpr_user -d mpr"] redis: image: redis:7-alpine ports: - "6381:6379" volumes: - redis-data:/data healthcheck: <<: *healthcheck-defaults test: ["CMD", "redis-cli", "ping"] minio: image: minio/minio command: ["server", "/data", "--console-address", ":9001"] ports: - "9000:9000" - "9001:9001" environment: MINIO_ROOT_USER: minioadmin MINIO_ROOT_PASSWORD: minioadmin volumes: - minio-data:/data healthcheck: <<: *healthcheck-defaults test: ["CMD", "mc", "ready", "local"] minio-init: image: minio/mc depends_on: minio: condition: service_healthy entrypoint: ["/bin/sh", "-c"] command: - | mc alias set local http://minio:9000 minioadmin minioadmin mc mb --ignore-existing local/mpr-media-in mc mb --ignore-existing local/mpr-media-out mc anonymous set download local/mpr-media-in mc anonymous set download local/mpr-media-out envoy: image: envoyproxy/envoy:v1.28-latest ports: - "8090:8090" volumes: - ./envoy.yaml:/etc/envoy/envoy.yaml:ro depends_on: - grpc nginx: image: nginx:alpine ports: - "80:80" volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro - ./landing.html:/etc/nginx/landing.html:ro - ../media/out:/app/media/out:ro depends_on: - django - fastapi - timeline - chunker - minio - envoy # ============================================================================= # Application Services # ============================================================================= django: <<: *python-service command: > bash -c "python admin/manage.py migrate && python admin/manage.py loadbuiltins || true && python admin/manage.py runserver 0.0.0.0:8701" ports: - "8701:8701" fastapi: <<: *python-service command: uvicorn core.api.main:app --host 0.0.0.0 --port 8702 --reload ports: - "8702:8702" environment: <<: *common-env DJANGO_ALLOW_ASYNC_UNSAFE: "true" grpc: <<: *python-service command: python -m core.rpc.server ports: - "50052:50051" environment: <<: *common-env GRPC_PORT: 50051 GRPC_MAX_WORKERS: 10 celery: build: context: .. dockerfile: ctrl/Dockerfile.worker command: celery -A admin.mpr worker -l info -Q celery,transcode -c 2 environment: <<: *common-env MPR_EXECUTOR: local volumes: - ..:/app depends_on: postgres: condition: service_healthy redis: condition: service_healthy grpc: condition: service_started timeline: build: context: ../ui/timeline dockerfile: Dockerfile ports: - "5173:5173" environment: VITE_ALLOWED_HOSTS: ${VITE_ALLOWED_HOSTS:-} volumes: - ../ui/timeline/src:/app/src - ../ui/timeline/vite.config.ts:/app/vite.config.ts - ../ui/common:/common chunker: build: context: ../ui/chunker dockerfile: Dockerfile ports: - "5174:5174" environment: VITE_ALLOWED_HOSTS: ${VITE_ALLOWED_HOSTS:-} volumes: - ../ui/chunker/src:/app/src - ../ui/chunker/vite.config.ts:/app/vite.config.ts - ../ui/common:/common volumes: postgres-data: redis-data: minio-data: networks: default: name: mpr name: mpr