# Shared config for all dagster services x-dagster: &dagster-common env_file: .env environment: DAGSTER_HOME: /app/dagster_home MLFLOW_TRACKING_URI: http://mlflow:5000 depends_on: postgres: condition: service_healthy restart: unless-stopped services: # Metadata storage and dbt target postgres: image: postgres:16 container_name: postgres restart: unless-stopped env_file: .env environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} volumes: - postgres-data:/var/lib/postgresql/data ports: - "5432:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"] interval: 10s timeout: 5s retries: 5 # User code gRPC server dagster-usercode: <<: *dagster-common build: context: . target: usercode container_name: dagster-usercode command: ["dagster", "api", "grpc", "-h", "0.0.0.0", "-p", "4000", "-m", "data_platform.definitions"] volumes: - dbt-target:/app/dbt/target - elementary-reports:/app/dbt/edr_target expose: - "4000" healthcheck: test: ["CMD", "dagster", "api", "grpc-health-check", "-p", "4000"] interval: 15s timeout: 10s retries: 5 start_period: 30s # Web UI dagster-webserver: <<: *dagster-common build: context: . target: dagster-infra container_name: dagster-webserver command: ["dagster-webserver", "-h", "0.0.0.0", "-p", "3000", "-w", "/app/dagster_home/workspace.yaml"] ports: - "3000:3000" depends_on: dagster-usercode: condition: service_healthy # Schedules, sensors and run queuing dagster-daemon: <<: *dagster-common build: context: . target: dagster-infra container_name: dagster-daemon command: ["dagster-daemon", "run", "-w", "/app/dagster_home/workspace.yaml"] depends_on: dagster-usercode: condition: service_healthy # pgAdmin web UI pgadmin: image: dpage/pgadmin4:latest container_name: pgadmin restart: unless-stopped env_file: .env environment: PGADMIN_DEFAULT_EMAIL: ${PGADMIN_EMAIL} PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_PASSWORD} volumes: - pgadmin-data:/var/lib/pgadmin - ./pgadmin/servers.json:/pgadmin4/servers.json:ro ports: - "5050:80" depends_on: postgres: condition: service_healthy # MLflow experiment tracking server mlflow: image: python:3.12-slim container_name: mlflow restart: unless-stopped env_file: .env entrypoint: ["sh", "/mlflow/start.sh"] volumes: - mlflow-artifacts:/mlflow/artifacts - ./mlflow/start.sh:/mlflow/start.sh:ro ports: - "5000:5000" depends_on: postgres: condition: service_healthy # Elementary data observability report elementary-web: image: nginx:alpine container_name: elementary-web restart: unless-stopped volumes: - elementary-reports:/usr/share/nginx/html:ro - ./nginx/elementary.conf:/etc/nginx/conf.d/default.conf:ro ports: - "8080:80" volumes: postgres-data: dbt-target: pgadmin-data: elementary-reports: mlflow-artifacts: