version: '3.8'
services:
postgres-primary:
image: pgvector/pgvector:pg16
container_name: codex_postgres_primary
environment:
POSTGRES_DB: codex_memory
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_REPLICATION_MODE: master
POSTGRES_REPLICATION_USER: replicator
POSTGRES_REPLICATION_PASSWORD: replicator_password
ports:
- "5432:5432"
volumes:
- postgres_primary_data:/var/lib/postgresql/data
- ./scripts/init-primary.sql:/docker-entrypoint-initdb.d/init.sql
networks:
- codex_network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
command: |
postgres
-c wal_level=replica
-c hot_standby=on
-c max_wal_senders=10
-c max_replication_slots=10
-c hot_standby_feedback=on
-c shared_preload_libraries='pg_stat_statements'
-c pg_stat_statements.track=all
-c shared_buffers=256MB
-c effective_cache_size=1GB
-c maintenance_work_mem=128MB
-c work_mem=16MB
postgres-replica:
image: pgvector/pgvector:pg16
container_name: codex_postgres_replica
environment:
POSTGRES_REPLICATION_MODE: slave
POSTGRES_MASTER_HOST: postgres-primary
POSTGRES_MASTER_PORT: 5432
POSTGRES_REPLICATION_USER: replicator
POSTGRES_REPLICATION_PASSWORD: replicator_password
ports:
- "5433:5432"
volumes:
- postgres_replica_data:/var/lib/postgresql/data
networks:
- codex_network
depends_on:
postgres-primary:
condition: service_healthy
pgbouncer:
image: edoburu/pgbouncer:latest
container_name: codex_pgbouncer
environment:
DATABASES_HOST: postgres-primary
DATABASES_PORT: 5432
DATABASES_DBNAME: codex_memory
DATABASES_USER: postgres
DATABASES_PASSWORD: postgres
POOL_MODE: transaction
MAX_CLIENT_CONN: 1000
DEFAULT_POOL_SIZE: 25
MIN_POOL_SIZE: 10
RESERVE_POOL_SIZE: 5
RESERVE_POOL_TIMEOUT: 3
SERVER_LIFETIME: 1800
SERVER_IDLE_TIMEOUT: 600
ports:
- "6432:6432"
networks:
- codex_network
depends_on:
postgres-primary:
condition: service_healthy
prometheus:
image: prom/prometheus:latest
container_name: codex_prometheus
volumes:
- ./config/prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
ports:
- "9090:9090"
networks:
- codex_network
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
grafana:
image: grafana/grafana:latest
container_name: codex_grafana
environment:
GF_SECURITY_ADMIN_USER: admin
GF_SECURITY_ADMIN_PASSWORD: admin
volumes:
- grafana_data:/var/lib/grafana
- ./config/grafana/dashboards:/etc/grafana/provisioning/dashboards
- ./config/grafana/datasources:/etc/grafana/provisioning/datasources
ports:
- "3000:3000"
networks:
- codex_network
depends_on:
- prometheus
volumes:
postgres_primary_data:
postgres_replica_data:
prometheus_data:
grafana_data:
networks:
codex_network:
driver: bridge