Skip to content

Commit a471683

Browse files
authored
Add PgBouncer (#163)
1 parent ed62851 commit a471683

3 files changed

Lines changed: 30 additions & 51 deletions

File tree

.env.production

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ LOG_DEPRECATIONS_CHANNEL=null
1818
LOG_LEVEL=debug
1919

2020
DB_CONNECTION=pgsql
21-
DB_HOST=pgsql
22-
DB_PORT=5432
21+
DB_HOST=pgbouncer
22+
DB_PORT=6432
2323
DB_DATABASE=userdb
2424
DB_USERNAME=user
2525
DB_PASSWORD="123456"

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,13 @@ The orchestrated containers include:
5050
- **Horizon:** A dedicated container for running Laravel Horizon to manage your Redis queues.
5151
- **Scheduler:** A container responsible for executing Laravel's scheduled tasks.
5252
- **Database:** A PostgreSQL container for your application's database.
53+
- **PgBouncer:** Lightweight connection pooler for PostgreSQL.
5354
- **Redis:** An in-memory data store used for caching and as a message broker for Laravel Horizon.
5455
- **Minio:** An S3-compatible object storage service, perfect for handling file uploads and storage.
5556
- **Typesense:** A fast, typo-tolerant, and open-source search engine for building powerful search functionality into your application.
5657
- **pgAdmin & pghero:** Web-based tools for managing your PostgreSQL database and monitoring its performance.
5758
- **Backup Service:** A container that performs automated backups of your database to ensure data safety.
58-
- **System Monitoring:** Includes Glances and Netdata containers to provide real-time insights and monitoring for your entire infrastructure.
59+
- **System Monitoring:** Includes Netdata containers to provide real-time insights and monitoring for your entire infrastructure.
5960
- **Prometheus:** A powerful time-series database used for collecting metrics from your application and the host system.
6061
- **Grafana:** A leading open-source platform for monitoring and observability, used to visualize the metrics collected by Prometheus in beautiful dashboards.
6162

docker-compose.production.yml

Lines changed: 26 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,11 @@ x-logging: &default-logging
44
max-size: "50m"
55
max-file: "10"
66
compress: "true"
7-
87
x-base: &base
98
profiles: [app]
109
depends_on:
11-
pgsql:
12-
condition: service_healthy
10+
pgbouncer:
11+
condition: service_started
1312
redis:
1413
condition: service_healthy
1514
minio:
@@ -39,7 +38,6 @@ x-base: &base
3938
- './storage/logs:/var/www/html/storage/logs'
4039
logging: *default-logging
4140
restart: unless-stopped
42-
4341
services:
4442
traefik:
4543
profiles: [app]
@@ -74,7 +72,6 @@ services:
7472
- "--entryPoints.pghero.address=:6660"
7573
- "--entryPoints.minio.address=:9000"
7674
- "--entryPoints.minio-console.address=:8900"
77-
- "--entryPoints.glances.address=:61208"
7875
- "--entryPoints.netdata.address=:19999"
7976
- "--entryPoints.prometheus.address=:9090"
8077
- "--entryPoints.grafana.address=:3000"
@@ -86,7 +83,6 @@ services:
8683
- "8080:8080" # Reverb
8784
- "127.0.0.1:6053:6053" # pgAdmin
8885
- "127.0.0.1:6660:6660" # PgHero
89-
- "127.0.0.1:61208:61208" # Glances
9086
- "9000:9000" # MinIO
9187
- "127.0.0.1:8900:8900" # MinIO console
9288
- "127.0.0.1:19999:19999" # NetData
@@ -103,12 +99,10 @@ services:
10399
traefik.http.routers.traefik.service: api@internal
104100
traefik.http.routers.traefik.entryPoints: traefik
105101
traefik.http.routers.traefik.middlewares: "traefik-auth,traefik-retry"
106-
107102
traefik.http.middlewares.traefik-retry.retry.attempts: 4
108103
traefik.http.middlewares.traefik-retry.retry.initialinterval: 100ms
109104
traefik.http.middlewares.traefik-auth.basicauth.removeheader: true
110105
traefik.http.middlewares.traefik-auth.basicauth.users: "${TRAEFIK_AUTH_USERS:-user:$$2y$$05$$8zbpsdxg9wDiiKdqxiB0zeAlxZtG68P1SDBOvCN4IooLFewLx70Gm}"
111-
112106
app:
113107
<<: *base
114108
healthcheck:
@@ -118,25 +112,21 @@ services:
118112
timeout: 10s
119113
labels:
120114
traefik.enable: true
121-
122115
traefik.http.routers.app.rule: Host(`${APP_HOST}`) || Host(`localhost`)
123116
traefik.http.routers.app.entryPoints: app
124117
traefik.http.routers.app.service: app-service
125118
traefik.http.routers.app.middlewares: "redirect-scheme,app-retry,app-compress,security-headers"
126-
127119
traefik.http.routers.app-secure.rule: Host(`${APP_HOST}`) || Host(`localhost`)
128120
traefik.http.routers.app-secure.entryPoints: app-secure
129121
traefik.http.routers.app-secure.service: app-service
130122
traefik.http.routers.app-secure.tls: true
131123
traefik.http.routers.app-secure.middlewares: "redirect-scheme,app-retry,app-compress,security-headers"
132-
133124
traefik.http.services.app-service.loadbalancer.server.port: 8000 # Because container exposes multiple ports
134125
traefik.http.services.app-service.loadbalancer.healthCheck.path: "/up"
135126
traefik.http.services.app-service.loadbalancer.healthCheck.hostname: "localhost"
136127
traefik.http.services.app-service.loadbalancer.healthCheck.port: 8000
137128
traefik.http.services.app-service.loadbalancer.healthCheck.interval: 3s
138129
traefik.http.services.app-service.loadbalancer.healthCheck.timeout: 5s
139-
140130
traefik.http.middlewares.limit.buffering.maxRequestBodyBytes: 460000000 # 460mb
141131
traefik.http.middlewares.redirect-scheme.redirectscheme.scheme: https
142132
traefik.http.middlewares.redirect-scheme.redirectscheme.permanent: true
@@ -162,14 +152,12 @@ services:
162152
CONTAINER_MODE: horizon
163153
labels:
164154
traefik.enable: false
165-
166155
scheduler:
167156
<<: *base
168157
environment:
169158
CONTAINER_MODE: scheduler
170159
labels:
171160
traefik.enable: false
172-
173161
reverb:
174162
<<: *base
175163
environment:
@@ -184,7 +172,6 @@ services:
184172
traefik.http.middlewares.reverb-retry.retry.initialinterval: 100ms
185173
traefik.http.routers.reverb.service: reverb-service
186174
traefik.http.services.reverb-service.loadbalancer.server.port: 8080
187-
188175
redis:
189176
profiles: [app]
190177
image: 'redis:7-alpine'
@@ -220,10 +207,9 @@ services:
220207
memory: 2.5G
221208
labels:
222209
traefik.enable: false
223-
224210
pgsql:
225211
profiles: [app]
226-
image: 'postgres:17-alpine'
212+
image: 'postgres:${POSTGRES_VERSION:-17}-alpine'
227213
ulimits:
228214
nofile:
229215
soft: 65536
@@ -254,6 +240,28 @@ services:
254240
traefik.enable: false
255241
docker-volume-backup.stop-during-backup: true
256242
docker-volume-backup.archive-pre: /bin/sh -c 'pg_dump -U ${DB_USERNAME} -F t ${DB_DATABASE} > /backup/${DB_DATABASE}-database.tar'
243+
pgbouncer:
244+
image: bitnami/pgbouncer:1
245+
restart: unless-stopped
246+
logging: *default-logging
247+
depends_on:
248+
pgsql:
249+
condition: service_healthy
250+
environment:
251+
POSTGRESQL_HOST: pgsql
252+
POSTGRESQL_PORT: 5432
253+
PGBOUNCER_DATABASE: '${DB_DATABASE}'
254+
POSTGRESQL_USERNAME: '${DB_USERNAME}'
255+
POSTGRESQL_PASSWORD: '${DB_PASSWORD}'
256+
PGBOUNCER_POOL_MODE: session
257+
PGBOUNCER_AUTH_TYPE: md5
258+
PGBOUNCER_MAX_CLIENT_CONN: 500
259+
PGBOUNCER_DEFAULT_POOL_SIZE: 25
260+
PGBOUNCER_USERLIST: '"${DB_USERNAME}" "${DB_PASSWORD}"'
261+
networks:
262+
- stack
263+
labels:
264+
traefik.enable: false
257265
pgadmin:
258266
profiles: [administration]
259267
image: 'dpage/pgadmin4:latest'
@@ -369,19 +377,16 @@ services:
369377
logging: *default-logging
370378
labels:
371379
traefik.enable: true
372-
373380
traefik.http.routers.minio-console.rule: Host(`localhost`)
374381
traefik.http.routers.minio-console.entryPoints: minio-console
375382
traefik.http.routers.minio-console.service: minio-console-service
376383
traefik.http.routers.minio-console.middlewares: "minio-auth,minio-retry"
377384
traefik.http.services.minio-console-service.loadbalancer.server.port: 8900
378-
379385
traefik.http.routers.minio.rule: Host(`${APP_HOST}`) || Host(`localhost`)
380386
traefik.http.routers.minio.entryPoints: minio
381387
traefik.http.routers.minio.service: minio-service
382388
traefik.http.routers.minio.middlewares: "minio-retry,minio-compress"
383389
traefik.http.services.minio-service.loadbalancer.server.port: 9000
384-
385390
traefik.http.middlewares.minio-compress.compress: true
386391
traefik.http.middlewares.minio-retry.retry.attempts: 4
387392
traefik.http.middlewares.minio-retry.retry.initialinterval: 100ms
@@ -391,32 +396,6 @@ services:
391396
test: [ "CMD", "mc", "ready", "local" ]
392397
retries: 3
393398
timeout: 5s
394-
glances:
395-
profiles: [administration]
396-
image: nicolargo/glances:latest-full
397-
pid: host
398-
security_opt:
399-
- no-new-privileges:true
400-
volumes:
401-
- /var/run/docker.sock:/var/run/docker.sock:ro
402-
- /etc/os-release:/etc/os-release:ro
403-
environment:
404-
- "GLANCES_OPT=-w"
405-
- TZ="${APP_TIMEZONE}"
406-
networks:
407-
- stack
408-
logging: *default-logging
409-
restart: unless-stopped
410-
labels:
411-
org.label-schema.group: "monitoring"
412-
traefik.enable: true
413-
traefik.http.routers.glances.rule: Host(`localhost`)
414-
traefik.http.routers.glances.entryPoints: glances
415-
traefik.http.routers.glances.middlewares: "glances-auth,glances-retry"
416-
traefik.http.middlewares.glances-retry.retry.attempts: 4
417-
traefik.http.middlewares.glances-retry.retry.initialinterval: 100ms
418-
traefik.http.middlewares.glances-auth.basicauth.removeheader: true
419-
traefik.http.middlewares.glances-auth.basicauth.users: "user:$$2y$$05$$8zbpsdxg9wDiiKdqxiB0zeAlxZtG68P1SDBOvCN4IooLFewLx70Gm" # user:123456
420399
netdata:
421400
profiles: [administration]
422401
image: netdata/netdata
@@ -525,5 +504,4 @@ volumes:
525504
stack-prometheus:
526505
driver: local
527506
stack-grafana:
528-
driver: local
529-
507+
driver: local

0 commit comments

Comments
 (0)