services: # ================= PostgreSQL ================= db: build: ../postgres-with-extensions environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: PASSWORD-PLACEHOLDER--uqfEC1hmmv POSTGRES_DB: stackframe POSTGRES_DELAY_MS: ${POSTGRES_DELAY_MS:-0} ports: - 5432:5432 volumes: - postgres-data:/var/lib/postgresql/data cap_add: - NET_ADMIN # required for the fake latency during dev # ================= PgHero ================= pghero: image: ankane/pghero:latest environment: DATABASE_URL: postgres://postgres:PASSWORD-PLACEHOLDER--uqfEC1hmmv@db:5432/stackframe ports: - 8116:8080 # ================= PgAdmin ================= pgadmin: image: dpage/pgadmin4 environment: PGADMIN_DEFAULT_EMAIL: admin@example.com PGADMIN_DEFAULT_PASSWORD: PASSWORD-PLACEHOLDER--vu9p2iy3f PGADMIN_CONFIG_SERVER_MODE: "False" PGADMIN_CONFIG_MASTER_PASSWORD_REQUIRED: "False" configs: - source: pgadmin_servers target: /pgadmin4/servers.json ports: - 8117:80 # ================= Supabase Studio ================= supabase-studio: image: supabase/studio:20241202-71e5240 restart: unless-stopped healthcheck: test: [ "CMD", "node", "-e", "fetch('http://studio:3000/api/profile').then((r) => {if (r.status !== 200) throw new Error(r.status)})" ] timeout: 10s interval: 5s retries: 3 environment: STUDIO_PG_META_URL: http://supabase-meta:8080 POSTGRES_PASSWORD: PASSWORD-PLACEHOLDER--uqfEC1hmmv OPENAI_API_KEY: ${OPENAI_API_KEY:-} NEXT_PUBLIC_ENABLE_LOGS: true NEXT_ANALYTICS_BACKEND_PROVIDER: postgres ports: - 8118:3000 supabase-meta: image: supabase/postgres-meta:v0.84.2 restart: unless-stopped environment: PG_META_PORT: 8080 PG_META_DB_HOST: db PG_META_DB_PORT: 5432 PG_META_DB_NAME: stackframe PG_META_DB_USER: postgres PG_META_DB_PASSWORD: PASSWORD-PLACEHOLDER--uqfEC1hmmv # ================= Inbucket ================= inbucket: image: inbucket/inbucket:latest ports: - 2500:2500 - 8105:9000 - 1100:1100 volumes: - inbucket-data:/data # ================= OpenTelemetry & Jaeger ================= jaeger: image: jaegertracing/all-in-one:latest environment: - COLLECTOR_OTLP_ENABLED=true ports: - 8107:16686 # Jaeger UI - 4318:4318 # OTLP Endpoint restart: always # ================= svix ================= svix-db: image: "docker.io/postgres:16.1" environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: PASSWORD-PLACEHOLDER--KsoIMcchtp POSTGRES_DB: svix volumes: - svix-postgres-data:/var/lib/postgresql/data svix-redis: image: docker.io/redis:7-alpine command: --save 60 500 --appendonly yes --appendfsync everysec --requirepass PASSWORD-PLACEHOLDER--oVn8GSD6b9 volumes: - svix-redis-data:/data svix-server: image: svix/svix-server environment: WAIT_FOR: 'true' SVIX_REDIS_DSN: redis://:PASSWORD-PLACEHOLDER--oVn8GSD6b9@svix-redis:6379 SVIX_DB_DSN: postgres://postgres:PASSWORD-PLACEHOLDER--KsoIMcchtp@svix-db:5432/svix SVIX_CACHE_TYPE: memory SVIX_JWT_SECRET: secret SVIX_LOG_LEVEL: trace SVIX_QUEUE_TYPE: redis ports: - 8113:8071 depends_on: - svix-redis - svix-db # ================= volumes ================= volumes: postgres-data: inbucket-data: svix-redis-data: svix-postgres-data: # ================= configs ================= configs: pgadmin_servers: content: | { "Servers": { "1": { "Name": "Local Postgres DB", "Group": "Servers", "Host": "db", "Port": 5432, "Username": "postgres", "PasswordExecCommand": "echo 'PASSWORD-PLACEHOLDER--uqfEC1hmmv'", "MaintenanceDB": "stackframe" } } }