From 9d13ed0db1f255ba5e23cf431a3f24169a29ebcb Mon Sep 17 00:00:00 2001 From: Fabio Tielen // Code Agency Date: Sat, 20 Jan 2024 17:55:25 +0100 Subject: [PATCH] feat(docker): Integrate PgBouncer for connection poolingAdd PgBouncer service to the docker-compose setup for improved database connection management. Update .env.example to include new PgBouncer environment variables and service inclusion. Add PgBouncer profiles and tags to docker-compose.yml and override files for local and production configurations. Include PgBouncer initialization script for database user setup --- .env.example | 11 ++++++++++- docker-compose.override.local.yml | 5 +++++ docker-compose.override.production.yml | 5 +++++ docker-compose.yml | 17 +++++++++++++++++ pgbouncer/docker-entrypoint-initdb.d/init.sh | 20 ++++++++++++++++++++ 5 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 pgbouncer/docker-entrypoint-initdb.d/init.sh diff --git a/.env.example b/.env.example index d29a6d1..9219ee6 100644 --- a/.env.example +++ b/.env.example @@ -15,13 +15,14 @@ DEV_MODE= # Services PROJECT_NAME=odoocker -SERVICES=odoo,nginx,proxy,postgres +SERVICES=odoo,nginx,proxy,postgres,pgbouncer # Service configuration USE_REDIS=false USE_S3=false USE_SENTRY=false USE_PGADMIN=false +USE_PGBOUNCER=false # GitHub user and access token to clone private repositories GITHUB_USER= @@ -46,6 +47,11 @@ UNACCENT=False LIST_DB=True DBFILTER=.* +# PgBouncer +POOL_MODE=transaction +MAX_CLIENT_CONN=500 +ADMIN_USERS=postgres,dbuser,odoo + # Logging LOG_LEVEL=info # Additional logs @@ -135,6 +141,7 @@ USE_REDIS=${USE_REDIS} USE_S3=${USE_S3} USE_SENTRY=${USE_SENTRY} USE_PGADMIN=${USE_PGADMIN} +USE_PGBOUNCER=${USE_PGBOUNCER} # Which services are going to be brought up COMPOSE_PROFILES=${SERVICES} @@ -148,10 +155,12 @@ ACME_COMPANION_PROFILES="acme" KEYDB_PROFILES="keydb" MINIO_PROFILES="minio" PGADMIN_PROFILES="pgadmin" +PGBOUNCER_PROFILES="pgbouncer" # Containers' Tags ODOO_TAG=17.0 POSTGRES_TAG=16.1 +PGBOUNCER_TAG=latest KEYDB_TAG=latest MINIO_TAG=latest NGINX_TAG=1.25.3 diff --git a/docker-compose.override.local.yml b/docker-compose.override.local.yml index 690dc5c..c0a1f01 100644 --- a/docker-compose.override.local.yml +++ b/docker-compose.override.local.yml @@ -12,6 +12,11 @@ services: ports: - 5432:5432 + pgbouncer: + restart: 'no' + ports: + - 5432:5432 + nginx: restart: 'no' diff --git a/docker-compose.override.production.yml b/docker-compose.override.production.yml index 4aa221d..3939db1 100644 --- a/docker-compose.override.production.yml +++ b/docker-compose.override.production.yml @@ -12,6 +12,11 @@ services: ports: - 127.0.0.1:5432:5432 + pgbouncer: + restart: unless-stopped + ports: + - 127.0.0.1=5432:5432 + nginx: restart: unless-stopped diff --git a/docker-compose.yml b/docker-compose.yml index 7a34114..3c941e1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -79,6 +79,23 @@ services: - internal profiles: [$POSTGRES_PROFILES] + pgbouncer: + image: edoburu/pgbouncer:latest + container_name: pgbouncer + restart: always + depends_on: + - db + #ports: + # - "5432:5432" + environment: + - DB_HOST=db + - DB_USER=odoo + - DB_PASSWORD=odoo + - MAX_CLIENT_CONN=500 + - POOL_MODE=transaction + - ADMIN_USERS=postgres,dbuser,odoo + profiles: [$PGBOUNCER_PROFILES] + nginx: image: nginx:${NGINX_TAG} depends_on: diff --git a/pgbouncer/docker-entrypoint-initdb.d/init.sh b/pgbouncer/docker-entrypoint-initdb.d/init.sh new file mode 100644 index 0000000..b8b8bb5 --- /dev/null +++ b/pgbouncer/docker-entrypoint-initdb.d/init.sh @@ -0,0 +1,20 @@ +#!/bin/bash +set -e + +psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL + CREATE USER dbuser WITH ENCRYPTED PASSWORD 'dbuser'; + CREATE DATABASE dbuser OWNER dbuser; + + CREATE USER user1 WITH ENCRYPTED PASSWORD 'user1'; + CREATE DATABASE user1 OWNER user1; + + CREATE USER user2 WITH ENCRYPTED PASSWORD 'user2'; + CREATE DATABASE user2 OWNER user2; + + CREATE USER user3 WITH ENCRYPTED PASSWORD 'user3'; + CREATE DATABASE user3 OWNER user3; + + CREATE USER odoo WITH ENCRYPTED PASSWORD 'odoo'; + CREATE DATABASE odoo OWNER odoo; + +EOSQL \ No newline at end of file