services: # --- Fleet walkthrough: two plain PostgreSQL instances --- pg1: image: postgres:16 environment: POSTGRES_PASSWORD: postgres ports: - "5433:5432" volumes: - pg1data:/var/lib/postgresql/data command: > postgres -c shared_preload_libraries=pg_stat_statements -c pg_stat_statements.track=all healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 5s retries: 5 pg2: image: postgres:16 environment: POSTGRES_PASSWORD: postgres ports: - "5434:5432" volumes: - pg2data:/var/lib/postgresql/data command: > postgres -c shared_preload_libraries=pg_stat_statements -c pg_stat_statements.track=all healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 5s retries: 5 # --- Single monitored instance for the sidecar below --- pg_sage: image: postgres:17 environment: POSTGRES_PASSWORD: postgres POSTGRES_DB: postgres ports: - "5432:5432" volumes: - pgdata:/var/lib/postgresql/data command: > postgres -c shared_preload_libraries=pg_stat_statements -c pg_stat_statements.track=all healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 5s retries: 5 sidecar: build: ./sidecar # The dashboard's "Restart now" exits with code 42 so startup-only # settings take effect; the restart policy relaunches it, and # SAGE_SUPERVISED=1 tells the sidecar a supervisor exists (G5-B09). restart: unless-stopped depends_on: pg_sage: condition: service_healthy environment: SAGE_DATABASE_URL: postgres://postgres:postgres@pg_sage:5432/postgres?sslmode=disable SAGE_MODE: standalone SAGE_SUPERVISED: "1" SAGE_PROMETHEUS_PORT: "9187" SAGE_RATE_LIMIT: "60" ports: - "8080:8080" # API + Dashboard - "9187:9187" # Prometheus metrics volumes: pgdata: pg1data: pg2data: