services: postgres: image: "postgres:18.3@sha256:52e6ffd11fddd081ae63880b635b2a61c14008c17fc98cdc7ce5472265516dd0" pull_policy: missing 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:4.20@sha256:cea8339d21dad1b200adce581dd7434d254b8f5975f142c3b4c930ba78647eef" pull_policy: missing 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:13.0.0@sha256:a03d9e604e4dba58c5e64458a879701f46ef64af1f596058aacfad9aacdcab34" pull_policy: missing 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:v3.11.2@sha256:5550dc63da361dc30f6fe02ac0e4dfc736ededfef3c8d12a634db04a67824d78" pull_policy: missing 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:3.7.1@sha256:73e905b51a7f917f7a1075e4be68759df30226e03dcb3cd2213b989cc0dc8eb4" pull_policy: missing ports: - "3100:3100" command: - "-config.file=/etc/loki/local-config.yaml" tempo: image: "grafana/tempo:2.10.4@sha256:a6616c9d224770c883a67b50e4941e99c5df81b076ef05f516bb7cce5a96cec0" pull_policy: missing command: - "-config.file=/etc/tempo.yaml" ports: - "3200:3200" - "4317:4317" - "4318:4318" volumes: - "./compose/tempo/tempo.yaml:/etc/tempo.yaml:ro" - "tempo-data:/var/tempo:rw" mailpit: image: "axllent/mailpit:v1.29.6@sha256:0b5c5f7ffd3c93474baa7fd3869c1462e5a3d03256ed0933dfc0e7d81d794036" pull_policy: missing 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:149.0.7779.3@sha256:b24482ae166e2c67135f5a8ba9575c257efdd8e2fd6b2e931f9d88ede3d72f3b" pull_policy: missing 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:2.10.0@sha256:68cf1ec8a8db96f64244d5f559c448bc8e54f2934e0dd53a414eabffda7a6f22" pull_policy: missing 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:2.10.0@sha256:df85447c39114cd2b3da971e751682ad2db19a996034b47d5392cd4a0f43406a" pull_policy: missing ports: - "8055:8055" # HTTP-01 challenge test server - "8053:8053" # DNS server - "8056:8056" # Management API command: -dnsserver ":8053" -http01 ":8055" -management ":8056" keycloak: image: "quay.io/keycloak/keycloak:26.6.1@sha256:26ae26445475f7fac5f90ee138b1bdb64324f5815fb16133ffdbdb122d97c4d8" pull_policy: missing 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: