services: postgres: image: "postgres:18.1" shm_size: "1g" command: > postgres -c "shared_buffers=1GB" -c "max_connections=200" -c "log_statement=all" ports: - "5432:5432" volumes: - "./compose/postgres:/docker-entrypoint-initdb.d:ro" - "postgres-data:/var/lib/postgresql:rw" environment: POSTGRES_USER: "postgres" POSTGRES_PASSWORD: "postgres" healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 5s retries: 5 seaweedfs: image: "chrislusf/seaweedfs:latest" command: > server -s3 -s3.config=/etc/seaweedfs/s3.json -s3.port=8333 -volume.max=100 -master.volumeSizeLimitMB=1024 -dir=/data ports: - "8333:8333" - "9333:9333" - "8888:8888" volumes: - "./compose/seaweedfs/s3.json:/etc/seaweedfs/s3.json:ro" - "seaweedfs-data:/data:rw" 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: seaweedfs-data: grafana-data: prometheus-data: tempo-data: keycloak-data: