services: postgres: image: "postgres:17.4" shm_size: "1g" command: > postgres -c "shared_buffers=4GB" -c "max_connections=200" -c "log_statement=all" ports: - "5432:5432" volumes: - "./compose/postgres:/docker-entrypoint-initdb.d:ro" - "postgres-data:/var/lib/postgresql/data:rw" environment: POSTGRES_USER: "postgres" POSTGRES_PASSWORD: "postgres" healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 5s retries: 5 minio: image: "quay.io/minio/minio" entrypoint: "sh" command: | -c 'mkdir -p /var/lib/minio/probod && mkdir -p /var/lib/minio/probod-test && minio server --json --console-address :9001 /var/lib/minio' ports: - "9000:9000" - "9001:9001" volumes: - "minio-data:/var/lib/minio:rw" environment: MINIO_ROOT_USER: "probod" MINIO_ROOT_PASSWORD: "thisisnotasecret" grafana: image: "grafana/grafana:latest" ports: - "3001:3000" volumes: - "./compose/grafana/provisioning:/etc/grafana/provisioning:ro" - "grafana-data:/var/lib/grafana:rw" environment: GF_AUTH_ANONYMOUS_ENABLED: "true" GF_AUTH_ANONYMOUS_ORG_ROLE: "Admin" GF_AUTH_DISABLE_LOGIN_FORM: "true" GF_USERS_DEFAULT_THEME: "light" prometheus: image: "prom/prometheus:latest" volumes: - "./compose/prometheus/prometheus.yaml:/etc/prometheus/prometheus.yml" - "prometheus-data:/prometheus" command: - "--config.file=/etc/prometheus/prometheus.yml" - "--storage.tsdb.path=/prometheus" - "--web.console.libraries=/etc/prometheus/console_libraries" - "--web.console.templates=/etc/prometheus/consoles" - "--web.enable-lifecycle" - "--web.enable-remote-write-receiver" - "--web.listen-address=:9191" ports: - "9191:9191" loki: image: "grafana/loki:latest" ports: - "3100:3100" command: - "-config.file=/etc/loki/local-config.yaml" tempo: image: "grafana/tempo:latest" command: - "-config.file=/etc/tempo.yaml" ports: - "4317:4317" volumes: - "./compose/tempo/tempo.yaml:/etc/tempo.yaml:ro" - "tempo-data:/var/tempo:rw" mailpit: image: "axllent/mailpit:latest" ports: - "1025:1025" # SMTP server - "8025:8025" # Web UI environment: - "MP_DISABLE_VERSION_CHECK=true" - "MP_VERBOSE=false" - "MP_SMTP_AUTH_ACCEPT_ANY=true" - "MP_ENABLE_PROMETHEUS=true" - "MP_SMTP_AUTH_ALLOW_INSECURE=true" chrome: image: "chromedp/headless-shell:140.0.7259.2" ports: - "9222:9222" command: - "--headless" - "--disable-gpu" - "--disable-dev-shm-usage" - "--hide-scrollbars" - "--mute-audio" - "--no-default-browser-check" - "--no-first-run" - "--disable-background-networking" - "--disable-background-timer-throttling" - "--disable-extensions" pebble: image: "ghcr.io/letsencrypt/pebble:latest" ports: - "14000:14000" # ACME server - "15000:15000" # Management interface environment: PEBBLE_VA_NOSLEEP: "1" # Don't sleep during validation for faster testing PEBBLE_WFE_NONCEREJECT: "0" # Don't reject reused nonces PEBBLE_VA_ALWAYS_VALID: "1" # Skip actual HTTP/DNS validation for local dev command: -config /test/config/pebble-config.json -dnsserver 127.0.0.1:8053 volumes: - "./compose/pebble:/test/config:ro" pebble-challtestsrv: image: "ghcr.io/letsencrypt/pebble-challtestsrv:latest" ports: - "8055:8055" # HTTP-01 challenge test server - "8053:8053" # DNS server - "8056:8056" # Management API command: -dns01 ":8053" -http01 ":8055" -management ":8056" keycloak: image: quay.io/keycloak/keycloak:latest user: root environment: KC_HOSTNAME: localhost KC_HOSTNAME_PORT: 8082 KC_HOSTNAME_STRICT: false KC_HOSTNAME_STRICT_HTTPS: false KC_LOG_LEVEL: info KC_METRICS_ENABLED: true KC_HEALTH_ENABLED: true KEYCLOAK_ADMIN: admin KEYCLOAK_ADMIN_PASSWORD: admin command: - "start-dev" - "--import-realm" ports: - 8082:8080 volumes: - "./compose/keycloak:/opt/keycloak/data/import:ro" - "keycloak-data:/opt/keycloak/data/h2:rw" volumes: postgres-data: minio-data: grafana-data: prometheus-data: tempo-data: keycloak-data: