version: '3.8' services: postgres: image: postgres:16-alpine container_name: postgres environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: flower ports: - "5432:5432" volumes: - 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: # 数据库连接配置(格式:数据库名=host=主机 port=端口 dbname=数据库名 user=用户 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 pgadmin: image: dpage/pgadmin4:latest container_name: pgadmin environment: PGADMIN_DEFAULT_EMAIL: admin@admin.com PGADMIN_DEFAULT_PASSWORD: admin PGADMIN_CONFIG_SERVER_MODE: 'False' ports: - "5050:80" volumes: - pgadmin_data:/var/lib/pgadmin depends_on: - postgres restart: unless-stopped redis: image: redis:7-alpine container_name: redis ports: - "6379:6379" volumes: - redis_data:/data restart: unless-stopped rabbitmq: image: rabbitmq:3-management-alpine container_name: rabbitmq environment: RABBITMQ_DEFAULT_USER: guest RABBITMQ_DEFAULT_PASS: guest ports: - "5672:5672" - "15672:15672" volumes: - rabbitmq_data:/var/lib/rabbitmq restart: unless-stopped web: build: context: . target: base container_name: flower_web command: python manage.py runserver 0.0.0.0:8000 ports: - "8000:8000" volumes: - .:/app environment: DJANGO_SETTINGS_MODULE: flower.settings PYTHONPATH: /app DEBUG: "1" ALLOWED_HOSTS: "localhost,127.0.0.1,0.0.0.0,8.148.215.233,yuwenerp.yuwen.cloud" DB_HOST: pgbouncer DB_PORT: "6432" DB_NAME: flower DB_USER: postgres DB_PASSWORD: postgres depends_on: - pgbouncer - postgres - redis - rabbitmq restart: unless-stopped celery_worker: build: context: . target: base container_name: celery_worker command: - celery - -A - flower - worker - -l - info - --concurrency=2 - --pool=solo volumes: - .:/app environment: CELERY_BROKER_URL: amqp://guest:guest@rabbitmq:5672// CELERY_RESULT_BACKEND: redis://redis:6379/0 PYTHONPATH: /app DB_HOST: pgbouncer DB_PORT: "6432" DB_NAME: flower DB_USER: postgres DB_PASSWORD: postgres depends_on: - pgbouncer - postgres - redis - rabbitmq restart: unless-stopped celery_beat: build: context: . target: base container_name: celery_beat command: - celery - -A - flower - beat - -l - info volumes: - .:/app environment: DJANGO_SETTINGS_MODULE: flower.settings PYTHONPATH: /app DB_HOST: pgbouncer DB_PORT: "6432" DB_NAME: flower DB_USER: postgres DB_PASSWORD: postgres CELERY_BROKER_URL: amqp://guest:guest@rabbitmq:5672// CELERY_RESULT_BACKEND: redis://redis:6379/0 depends_on: - pgbouncer - postgres - redis - rabbitmq restart: unless-stopped volumes: db_data: redis_data: pgadmin_data: rabbitmq_data: