From 3b920f93c57149e0e11d8857049a2ee6a0ab4a40 Mon Sep 17 00:00:00 2001 From: guilherme Date: Tue, 8 Jul 2025 17:14:37 -0300 Subject: [PATCH] feat(database): add pgbouncer support and optimize postgres config - Add pgbouncer service to handle connection pooling - Update database connection URIs to support direct and pooled connections - Optimize postgres configuration with better memory settings - Update prisma schema to support directUrl connection --- .env.example | 3 ++- docker-compose.yaml | 33 ++++++++++++++++++++++++++++----- prisma/postgresql-schema.prisma | 11 ++++++----- 3 files changed, 36 insertions(+), 11 deletions(-) diff --git a/.env.example b/.env.example index 9325f3ab..8ae5da26 100644 --- a/.env.example +++ b/.env.example @@ -29,7 +29,8 @@ DEL_INSTANCE=false # Provider: postgresql | mysql DATABASE_PROVIDER=postgresql -DATABASE_CONNECTION_URI='postgresql://user:pass@postgres:5432/evolution?schema=public' +DATABASE_CONNECTION_URI='postgresql://user:pass@postgres:6543/evolution?pgbouncer=true&schema=evolution_api' +DATABASE_DIRECT_CONNECTION_URI=postgresql://user:pass@postgres:5432/evolution?schema=evolution_api # Client name for the database connection # It is used to separate an API installation from another that uses the same database. DATABASE_CONNECTION_CLIENT_NAME=evolution_exchange diff --git a/docker-compose.yaml b/docker-compose.yaml index 33918c38..a5169c45 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,4 +1,5 @@ services: + api: container_name: evolution_api image: evoapicloud/evolution-api:latest @@ -34,19 +35,41 @@ services: image: postgres:15 networks: - evolution-net - command: ["postgres", "-c", "max_connections=1000", "-c", "listen_addresses=*"] + command: [ + "postgres", + "-c", "max_connections=200", + "-c", "listen_addresses=*", + "-c", "shared_buffers=256MB", + "-c", "effective_cache_size=1GB", + "-c", "work_mem=4MB" + ] restart: always ports: - 5432:5432 environment: - POSTGRES_USER=user - POSTGRES_PASSWORD=pass - - POSTGRES_DB=evolution + - POSTGRES_DB=evolution_db - POSTGRES_HOST_AUTH_METHOD=trust volumes: - - postgres_data:/var/lib/postgresql/data - expose: - - 5432 + - postgres_data:/var/lib/postgresql/data + + pgbouncer: + image: edoburu/pgbouncer:latest + environment: + DB_HOST: postgres + DB_USER: user + DB_PASSWORD: pass + POOL_MODE: transaction + AUTH_TYPE: trust + MAX_CLIENT_CONN: 1000 + DEFAULT_POOL_SIZE: 25 + depends_on: + - postgres + ports: + - "6543:5432" + networks: + - evolution-net volumes: evolution_instances: diff --git a/prisma/postgresql-schema.prisma b/prisma/postgresql-schema.prisma index 7d2410e9..739a61dd 100644 --- a/prisma/postgresql-schema.prisma +++ b/prisma/postgresql-schema.prisma @@ -9,8 +9,9 @@ generator client { } datasource db { - provider = "postgresql" - url = env("DATABASE_CONNECTION_URI") + provider = "postgresql" + url = env("DATABASE_CONNECTION_URI") + directUrl = env("DATABASE_DIRECT_CONNECTION_URI") } enum InstanceConnectionStatus { @@ -376,8 +377,8 @@ model TypebotSetting { debounceTime Int? @db.Integer typebotIdFallback String? @db.VarChar(100) ignoreJids Json? - splitMessages Boolean? @default(false) @db.Boolean - timePerChar Int? @default(50) @db.Integer + splitMessages Boolean? @default(false) @db.Boolean + timePerChar Int? @default(50) @db.Integer createdAt DateTime? @default(now()) @db.Timestamp updatedAt DateTime @updatedAt @db.Timestamp Fallback Typebot? @relation(fields: [typebotIdFallback], references: [id]) @@ -748,4 +749,4 @@ model EvoaiSetting { evoaiIdFallback String? @db.VarChar(100) Instance Instance @relation(fields: [instanceId], references: [id], onDelete: Cascade) instanceId String @unique -} \ No newline at end of file +}