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: