Learn by Directing AI
All materials

docker-compose.yml

ymldocker-compose.yml
# VERIFICATION: Run `docker compose up -d` and verify all services are healthy before use.
# Expected services: app (EHR application), postgres (database), grafana (monitoring), loki (log aggregation), alloy (log collection)
# Expected ports: 8080 (EHR app), 5432 (PostgreSQL), 3000 (Grafana)

version: "3.8"

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:5000"
    environment:
      - DATABASE_URL=postgresql://ehr_user:ehr_pass_2024@postgres:5432/ehr_db
      - FLASK_ENV=production
    depends_on:
      postgres:
        condition: service_healthy
    restart: unless-stopped

  postgres:
    image: postgres:15.4
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_DB=ehr_db
      - POSTGRES_USER=ehr_user
      - POSTGRES_PASSWORD=ehr_pass_2024
    volumes:
      - ./db/init.sql:/docker-entrypoint-initdb.d/init.sql
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ehr_user -d ehr_db"]
      interval: 5s
      timeout: 5s
      retries: 5

  grafana:
    image: grafana/grafana:10.2.3
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
      - GF_AUTH_ANONYMOUS_ENABLED=true
      - GF_AUTH_ANONYMOUS_ORG_ROLE=Viewer
    volumes:
      - ./grafana-provisioning:/etc/grafana/provisioning
      - grafana_data:/var/lib/grafana
    depends_on:
      - loki

  loki:
    image: grafana/loki:2.9.3
    command: -config.file=/etc/loki/local-config.yaml
    volumes:
      - loki_data:/loki

  alloy:
    image: grafana/alloy:v1.0.0
    volumes:
      - ./alloy-config/config.alloy:/etc/alloy/config.alloy
      - /var/run/docker.sock:/var/run/docker.sock:ro
    command: run /etc/alloy/config.alloy
    depends_on:
      - loki

volumes:
  postgres_data:
  grafana_data:
  loki_data: