; pgbouncer.ini — transaction-pooling front for timescale_db (tracksolid_db). ; ───────────────────────────────────────────────────────────────────────────── ; Purpose: the DB runs at max_connections=100 and ~9 stack services each hold a ; persistent pool (several as the postgres superuser, idle for hours), so peaks hit ; "too many connections". PgBouncer multiplexes MANY client connections onto a SMALL ; set of real backend connections, so the DB connection count stays bounded no matter ; how many app pools exist. ; ; Auth uses auth_query (NOT a hand-maintained userlist of every app): PgBouncer logs ; in as `pgbouncer_auth` and looks each user's verifier up via pgbouncer.user_lookup() ; — see auth_setup.sql. Only the pgbouncer_auth verifier lives in userlist.txt. [databases] ; Apps point their DSN host at pgbouncer:6432 with the SAME dbname/user/password. ; `host` here is the real DB (the timescale_db container hostname on the DB network). tracksolid_db = host=timescale_db port=5432 dbname=tracksolid_db [pgbouncer] listen_addr = 0.0.0.0 listen_port = 6432 ; ── Auth (pass-through via auth_query) ────────────────────────────────────── auth_type = scram-sha-256 auth_file = /etc/pgbouncer/userlist.txt auth_user = pgbouncer_auth auth_query = SELECT uname, phash FROM pgbouncer.user_lookup($1) ; ── Pooling ───────────────────────────────────────────────────────────────── ; transaction mode = a server connection is returned to the pool at COMMIT/ROLLBACK, ; so a handful of backends serve hundreds of clients. See README for the feature ; caveats (no session-level prepared statements / SET that persists across txns). pool_mode = transaction ; Total backend connections PgBouncer will ever open to the DB = ; (number of [databases] entries) × default_pool_size + reserve_pool_size. ; Keep the SUM across all poolers well under the DB's max_connections (100). ; With one database and 20 + 5 reserve = 25 backends max — leaving headroom for ; superuser/admin/background-worker connections that bypass PgBouncer. default_pool_size = 20 min_pool_size = 0 reserve_pool_size = 5 reserve_pool_timeout = 3 ; Clients can be plentiful (cheap) — only backends are scarce. max_client_conn = 2000 ; Recycle idle/old server connections so none linger for hours. server_idle_timeout = 300 server_lifetime = 3600 ; ── Robustness ────────────────────────────────────────────────────────────── ; Apps set per-connection GUCs via the `options` startup param (e.g. the analytics ; MCP sends `-c default_transaction_read_only=on -c statement_timeout=...`). In ; transaction pooling those can't be honored per-shared-backend, so ignore them and ; rely on ROLE-level settings (ALTER ROLE ... SET ...) instead. See README. ignore_startup_parameters = extra_float_digits,options,search_path ; Admin/stats console (psql -p 6432 pgbouncer) — restricted to the auth role. admin_users = pgbouncer_auth stats_users = pgbouncer_auth ; Quiet by default; flip to 1 temporarily when debugging. log_connections = 0 log_disconnections = 0