1
0
forked from erp-dev/erp
This commit is contained in:
2025-12-24 23:44:07 +08:00
parent 13d5e1c160
commit 4580539746
6 changed files with 33 additions and 240 deletions

2
.gitignore vendored
View File

@@ -8,6 +8,4 @@ wheels/
# Virtual environments # Virtual environments
.venv .venv
# Database backups
data-bak/ data-bak/

View File

@@ -12,58 +12,6 @@ services:
- "5432:5432" - "5432:5432"
volumes: volumes:
- db_data:/var/lib/postgresql/data - db_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 3s
retries: 10
start_period: 10s
restart: unless-stopped
pgbouncer:
image: pgbouncer/pgbouncer:latest
container_name: pgbouncer
# 使用环境变量配置,让镜像自动生成配置文件
environment:
# 数据库连接配置 - 使用 DATABASES 环境变量(格式:数据库名=host=主机 port=端口 dbname=数据库名 user=用户 password=密码)
# 确保密码与 PostgreSQL 容器的 POSTGRES_PASSWORD 完全一致
DATABASES: flower=host=postgres port=5432 dbname=flower user=postgres password=postgres
# PgBouncer 基本配置
PGBOUNCER_LISTEN_ADDR: 0.0.0.0
PGBOUNCER_LISTEN_PORT: 6432
PGBOUNCER_AUTH_TYPE: trust
# 使用 trust 认证时,需要指定 auth_user所有客户端连接都使用此用户
PGBOUNCER_AUTH_USER: postgres
# 连接池配置
PGBOUNCER_POOL_MODE: transaction
PGBOUNCER_MAX_CLIENT_CONN: "100"
PGBOUNCER_DEFAULT_POOL_SIZE: "25"
PGBOUNCER_MIN_POOL_SIZE: "5"
PGBOUNCER_RESERVE_POOL_SIZE: "5"
PGBOUNCER_RESERVE_POOL_TIMEOUT: "3"
# 连接超时设置
PGBOUNCER_SERVER_CONNECT_TIMEOUT: "15"
PGBOUNCER_SERVER_IDLE_TIMEOUT: "600"
PGBOUNCER_QUERY_TIMEOUT: "0"
PGBOUNCER_QUERY_WAIT_TIMEOUT: "120"
# 日志配置
PGBOUNCER_LOG_CONNECTIONS: "1"
PGBOUNCER_LOG_DISCONNECTIONS: "1"
PGBOUNCER_LOG_POOLER_ERRORS: "1"
# 其他设置
PGBOUNCER_IGNORE_STARTUP_PARAMETERS: extra_float_digits
PGBOUNCER_APPLICATION_NAME_ADD_HOST: "1"
ports:
- "6432:6432"
# 确保 postgres 完全启动后再启动 pgbouncer
depends_on:
postgres:
condition: service_healthy
# DNS 配置:使用 Docker 内置 DNS并添加 DNS 搜索域
dns:
- 127.0.0.11 # Docker 内置 DNS
dns_search:
- . # 当前网络域
restart: unless-stopped restart: unless-stopped
pgadmin: pgadmin:
@@ -118,13 +66,12 @@ services:
PYTHONPATH: /app PYTHONPATH: /app
DEBUG: "1" DEBUG: "1"
ALLOWED_HOSTS: "localhost,127.0.0.1,0.0.0.0,8.148.215.233,yuwenerp.yuwen.cloud" ALLOWED_HOSTS: "localhost,127.0.0.1,0.0.0.0,8.148.215.233,yuwenerp.yuwen.cloud"
DB_HOST: pgbouncer DB_HOST: postgres
DB_PORT: "6432" DB_PORT: "5432"
DB_NAME: flower DB_NAME: flower
DB_USER: postgres DB_USER: postgres
DB_PASSWORD: postgres DB_PASSWORD: postgres
depends_on: depends_on:
- pgbouncer
- postgres - postgres
- redis - redis
- rabbitmq - rabbitmq
@@ -147,7 +94,6 @@ services:
volumes: volumes:
- .:/app - .:/app
depends_on: depends_on:
- pgbouncer
- postgres - postgres
- redis - redis
- rabbitmq - rabbitmq
@@ -155,8 +101,8 @@ services:
CELERY_BROKER_URL: amqp://guest:guest@rabbitmq:5672// CELERY_BROKER_URL: amqp://guest:guest@rabbitmq:5672//
CELERY_RESULT_BACKEND: redis://redis:6379/0 CELERY_RESULT_BACKEND: redis://redis:6379/0
PYTHONPATH: /app PYTHONPATH: /app
DB_HOST: pgbouncer DB_HOST: postgres
DB_PORT: "6432" DB_PORT: "5432"
DB_NAME: flower DB_NAME: flower
DB_USER: postgres DB_USER: postgres
DB_PASSWORD: postgres DB_PASSWORD: postgres
@@ -179,21 +125,20 @@ services:
volumes: volumes:
- .:/app - .:/app
- celery_beat_data:/var/lib/celery - celery_beat_data:/var/lib/celery
depends_on:
- postgres
- redis
- rabbitmq
environment: environment:
DJANGO_SETTINGS_MODULE: flower.settings DJANGO_SETTINGS_MODULE: flower.settings
PYTHONPATH: /app PYTHONPATH: /app
DB_HOST: pgbouncer DB_HOST: postgres
DB_PORT: "6432" DB_PORT: "5432"
DB_NAME: flower DB_NAME: flower
DB_USER: postgres DB_USER: postgres
DB_PASSWORD: postgres DB_PASSWORD: postgres
CELERY_BROKER_URL: amqp://guest:guest@rabbitmq:5672// CELERY_BROKER_URL: amqp://guest:guest@rabbitmq:5672//
CELERY_RESULT_BACKEND: redis://redis:6379/0 CELERY_RESULT_BACKEND: redis://redis:6379/0
depends_on:
- pgbouncer
- postgres
- redis
- rabbitmq
restart: unless-stopped restart: unless-stopped
volumes: volumes:

View File

@@ -8,65 +8,11 @@ services:
POSTGRES_USER: ${POSTGRES_USER:-postgres} POSTGRES_USER: ${POSTGRES_USER:-postgres}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres}
POSTGRES_DB: ${POSTGRES_DB:-flower} POSTGRES_DB: ${POSTGRES_DB:-flower}
# 仅绑定到本机,避免把数据库暴露到公网
ports: ports:
- "5432:5432" - "127.0.0.1:${POSTGRES_PORT:-5432}:5432"
volumes: volumes:
- db_data:/var/lib/postgresql/data - db_data:/var/lib/postgresql/data
dns:
- 8.8.8.8
- 8.8.4.4
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-postgres}"]
interval: 5s
timeout: 3s
retries: 10
start_period: 10s
restart: unless-stopped
pgbouncer:
image: pgbouncer/pgbouncer:latest
container_name: pgbouncer
# 使用环境变量配置,让镜像自动生成配置文件
environment:
# 数据库连接配置 - 使用 DATABASES 环境变量(格式:数据库名=host=主机 port=端口 dbname=数据库名 user=用户 password=密码)
# 确保密码与 PostgreSQL 容器的 POSTGRES_PASSWORD 完全一致
# 注意:如果密码包含特殊字符,可能需要转义或使用引号
DATABASES: flower=host=postgres port=${POSTGRES_PORT:-5432} dbname=${POSTGRES_DB:-flower} user=${POSTGRES_USER:-postgres} password=${POSTGRES_PASSWORD:-postgres}
# PgBouncer 基本配置
PGBOUNCER_LISTEN_ADDR: 0.0.0.0
PGBOUNCER_LISTEN_PORT: 6432
PGBOUNCER_AUTH_TYPE: trust
# 使用 trust 认证时,需要指定 auth_user所有客户端连接都使用此用户
PGBOUNCER_AUTH_USER: postgres
# 连接池配置
PGBOUNCER_POOL_MODE: transaction
PGBOUNCER_MAX_CLIENT_CONN: "100"
PGBOUNCER_DEFAULT_POOL_SIZE: "25"
PGBOUNCER_MIN_POOL_SIZE: "5"
PGBOUNCER_RESERVE_POOL_SIZE: "5"
PGBOUNCER_RESERVE_POOL_TIMEOUT: "3"
# 连接超时设置
PGBOUNCER_SERVER_CONNECT_TIMEOUT: "15"
PGBOUNCER_SERVER_IDLE_TIMEOUT: "600"
PGBOUNCER_QUERY_TIMEOUT: "0"
PGBOUNCER_QUERY_WAIT_TIMEOUT: "120"
# 日志配置
PGBOUNCER_LOG_CONNECTIONS: "1"
PGBOUNCER_LOG_DISCONNECTIONS: "1"
PGBOUNCER_LOG_POOLER_ERRORS: "1"
# 其他设置
PGBOUNCER_IGNORE_STARTUP_PARAMETERS: extra_float_digits
PGBOUNCER_APPLICATION_NAME_ADD_HOST: "1"
ports:
- "${PGBOUNCER_PORT:-6432}:6432"
# 确保 postgres 完全启动后再启动 pgbouncer
depends_on:
postgres:
condition: service_healthy
# DNS 配置:使用 Docker 内置 DNS并添加 DNS 搜索域
dns:
- 8.8.8.8
- 8.8.4.4
restart: unless-stopped restart: unless-stopped
redis: redis:
@@ -105,15 +51,14 @@ services:
PYTHONPATH: /app PYTHONPATH: /app
DEBUG: "${DEBUG:-0}" DEBUG: "${DEBUG:-0}"
ALLOWED_HOSTS: "${ALLOWED_HOSTS:-yuwenerp.yuwen.cloud}" ALLOWED_HOSTS: "${ALLOWED_HOSTS:-yuwenerp.yuwen.cloud}"
DB_HOST: ${DB_HOST:-pgbouncer} DB_HOST: ${DB_HOST:-postgres}
DB_PORT: "${DB_PORT:-6432}" DB_PORT: "${DB_PORT:-5432}"
DB_NAME: "${DB_NAME:-flower}" DB_NAME: "${DB_NAME:-flower}"
DB_USER: "${DB_USER:-postgres}" DB_USER: "${DB_USER:-postgres}"
DB_PASSWORD: "${DB_PASSWORD:-postgres}" DB_PASSWORD: "${DB_PASSWORD:-postgres}"
CELERY_BROKER_URL: "${CELERY_BROKER_URL:-amqp://guest:guest@rabbitmq:5672//}" CELERY_BROKER_URL: "${CELERY_BROKER_URL:-amqp://guest:guest@rabbitmq:5672//}"
CELERY_RESULT_BACKEND: "${CELERY_RESULT_BACKEND:-redis://redis:6379/0}" CELERY_RESULT_BACKEND: "${CELERY_RESULT_BACKEND:-redis://redis:6379/0}"
depends_on: depends_on:
- pgbouncer
- postgres - postgres
- redis - redis
- rabbitmq - rabbitmq
@@ -133,8 +78,8 @@ services:
- --pool=solo - --pool=solo
environment: environment:
PYTHONPATH: /app PYTHONPATH: /app
DB_HOST: ${DB_HOST:-pgbouncer} DB_HOST: ${DB_HOST:-postgres}
DB_PORT: "${DB_PORT:-6432}" DB_PORT: "${DB_PORT:-5432}"
DB_NAME: "${DB_NAME:-flower}" DB_NAME: "${DB_NAME:-flower}"
DB_USER: "${DB_USER:-postgres}" DB_USER: "${DB_USER:-postgres}"
DB_PASSWORD: "${DB_PASSWORD:-postgres}" DB_PASSWORD: "${DB_PASSWORD:-postgres}"
@@ -146,7 +91,6 @@ services:
# 也可通过 BACKUP_DIR 指定绝对路径,如 /srv/flower/data-bak # 也可通过 BACKUP_DIR 指定绝对路径,如 /srv/flower/data-bak
- ${BACKUP_DIR:-./data-bak}:/app/data-bak - ${BACKUP_DIR:-./data-bak}:/app/data-bak
depends_on: depends_on:
- pgbouncer
- postgres - postgres
- redis - redis
- rabbitmq - rabbitmq
@@ -167,8 +111,8 @@ services:
environment: environment:
DJANGO_SETTINGS_MODULE: flower.settings DJANGO_SETTINGS_MODULE: flower.settings
PYTHONPATH: /app PYTHONPATH: /app
DB_HOST: ${DB_HOST:-pgbouncer} DB_HOST: ${DB_HOST:-postgres}
DB_PORT: "${DB_PORT:-6432}" DB_PORT: "${DB_PORT:-5432}"
DB_NAME: "${DB_NAME:-flower}" DB_NAME: "${DB_NAME:-flower}"
DB_USER: "${DB_USER:-postgres}" DB_USER: "${DB_USER:-postgres}"
DB_PASSWORD: "${DB_PASSWORD:-postgres}" DB_PASSWORD: "${DB_PASSWORD:-postgres}"
@@ -178,7 +122,6 @@ services:
volumes: volumes:
- celery_beat_data:/var/lib/celery - celery_beat_data:/var/lib/celery
depends_on: depends_on:
- pgbouncer
- postgres - postgres
- redis - redis
- rabbitmq - rabbitmq

View File

@@ -12,58 +12,6 @@ services:
- "5432:5432" - "5432:5432"
volumes: volumes:
- db_data:/var/lib/postgresql/data - db_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 3s
retries: 10
start_period: 10s
restart: unless-stopped
pgbouncer:
image: pgbouncer/pgbouncer:latest
container_name: pgbouncer
# 使用环境变量配置,让镜像自动生成配置文件
environment:
# 数据库连接配置 - 使用 DATABASES 环境变量(格式:数据库名=host=主机 port=端口 dbname=数据库名 user=用户 password=密码)
# 确保密码与 PostgreSQL 容器的 POSTGRES_PASSWORD 完全一致
DATABASES: flower=host=postgres port=5432 dbname=flower user=postgres password=postgres
# PgBouncer 基本配置
PGBOUNCER_LISTEN_ADDR: 0.0.0.0
PGBOUNCER_LISTEN_PORT: 6432
PGBOUNCER_AUTH_TYPE: trust
# 使用 trust 认证时,需要指定 auth_user所有客户端连接都使用此用户
PGBOUNCER_AUTH_USER: postgres
# 连接池配置
PGBOUNCER_POOL_MODE: transaction
PGBOUNCER_MAX_CLIENT_CONN: "100"
PGBOUNCER_DEFAULT_POOL_SIZE: "25"
PGBOUNCER_MIN_POOL_SIZE: "5"
PGBOUNCER_RESERVE_POOL_SIZE: "5"
PGBOUNCER_RESERVE_POOL_TIMEOUT: "3"
# 连接超时设置
PGBOUNCER_SERVER_CONNECT_TIMEOUT: "15"
PGBOUNCER_SERVER_IDLE_TIMEOUT: "600"
PGBOUNCER_QUERY_TIMEOUT: "0"
PGBOUNCER_QUERY_WAIT_TIMEOUT: "120"
# 日志配置
PGBOUNCER_LOG_CONNECTIONS: "1"
PGBOUNCER_LOG_DISCONNECTIONS: "1"
PGBOUNCER_LOG_POOLER_ERRORS: "1"
# 其他设置
PGBOUNCER_IGNORE_STARTUP_PARAMETERS: extra_float_digits
PGBOUNCER_APPLICATION_NAME_ADD_HOST: "1"
ports:
- "6432:6432"
# 确保 postgres 完全启动后再启动 pgbouncer
depends_on:
postgres:
condition: service_healthy
# DNS 配置:使用 Docker 内置 DNS并添加 DNS 搜索域
dns:
- 127.0.0.11 # Docker 内置 DNS
dns_search:
- . # 当前网络域
restart: unless-stopped restart: unless-stopped
pgadmin: pgadmin:
@@ -120,13 +68,12 @@ services:
PYTHONPATH: /app PYTHONPATH: /app
DEBUG: "1" DEBUG: "1"
ALLOWED_HOSTS: "localhost,127.0.0.1,0.0.0.0,8.148.215.233,yuwenerp.yuwen.cloud" ALLOWED_HOSTS: "localhost,127.0.0.1,0.0.0.0,8.148.215.233,yuwenerp.yuwen.cloud"
DB_HOST: pgbouncer DB_HOST: postgres
DB_PORT: "6432" DB_PORT: "5432"
DB_NAME: flower DB_NAME: flower
DB_USER: postgres DB_USER: postgres
DB_PASSWORD: postgres DB_PASSWORD: postgres
depends_on: depends_on:
- pgbouncer
- postgres - postgres
- redis - redis
- rabbitmq - rabbitmq
@@ -148,20 +95,19 @@ services:
- --pool=solo - --pool=solo
volumes: volumes:
- .:/app - .:/app
depends_on:
- postgres
- redis
- rabbitmq
environment: environment:
CELERY_BROKER_URL: amqp://guest:guest@rabbitmq:5672// CELERY_BROKER_URL: amqp://guest:guest@rabbitmq:5672//
CELERY_RESULT_BACKEND: redis://redis:6379/0 CELERY_RESULT_BACKEND: redis://redis:6379/0
PYTHONPATH: /app PYTHONPATH: /app
DB_HOST: pgbouncer DB_HOST: postgres
DB_PORT: "6432" DB_PORT: "5432"
DB_NAME: flower DB_NAME: flower
DB_USER: postgres DB_USER: postgres
DB_PASSWORD: postgres DB_PASSWORD: postgres
depends_on:
- pgbouncer
- postgres
- redis
- rabbitmq
restart: unless-stopped restart: unless-stopped
celery_beat: celery_beat:
@@ -178,21 +124,20 @@ services:
- info - info
volumes: volumes:
- .:/app - .:/app
depends_on:
- postgres
- redis
- rabbitmq
environment: environment:
DJANGO_SETTINGS_MODULE: flower.settings DJANGO_SETTINGS_MODULE: flower.settings
PYTHONPATH: /app PYTHONPATH: /app
DB_HOST: pgbouncer DB_HOST: postgres
DB_PORT: "6432" DB_PORT: "5432"
DB_NAME: flower DB_NAME: flower
DB_USER: postgres DB_USER: postgres
DB_PASSWORD: postgres DB_PASSWORD: postgres
CELERY_BROKER_URL: amqp://guest:guest@rabbitmq:5672// CELERY_BROKER_URL: amqp://guest:guest@rabbitmq:5672//
CELERY_RESULT_BACKEND: redis://redis:6379/0 CELERY_RESULT_BACKEND: redis://redis:6379/0
depends_on:
- pgbouncer
- postgres
- redis
- rabbitmq
restart: unless-stopped restart: unless-stopped
volumes: volumes:

View File

@@ -196,7 +196,7 @@ DATABASES = {
'HOST': env('DB_HOST', default='localhost'), 'HOST': env('DB_HOST', default='localhost'),
'PORT': env('DB_PORT', default='5432'), 'PORT': env('DB_PORT', default='5432'),
'CONN_HEALTH_CHECK': True, 'CONN_HEALTH_CHECK': True,
'CONN_MAX_AGE': 0, # 使用 PgBouncer 连接池时,必须设置为 0 'CONN_MAX_AGE': 60,
} }
} }

View File

@@ -1,38 +0,0 @@
[databases]
flower = host=postgres port=5432 dbname=flower user=postgres password=postgres
[pgbouncer]
; 监听地址和端口
listen_addr = 0.0.0.0
listen_port = 6432
; 认证方式trust 表示信任所有连接(适用于容器内部网络)
; 这样客户端连接时不需要密码,但 PgBouncer 到 PostgreSQL 的连接仍需要密码
auth_type = trust
; 连接池配置
; pool_mode: session, transaction, statement
; transaction 模式最适合 Django每个事务结束后释放连接
pool_mode = transaction
max_client_conn = 100
default_pool_size = 25
min_pool_size = 5
reserve_pool_size = 5
reserve_pool_timeout = 3
; 连接超时设置
server_connect_timeout = 15
server_idle_timeout = 600
query_timeout = 0
query_wait_timeout = 120
; 日志配置
log_connections = 1
log_disconnections = 1
log_pooler_errors = 1
; 其他设置
; 忽略 PostgreSQL 16 的额外启动参数
ignore_startup_parameters = extra_float_digits
application_name_add_host = 1