services: mariadb: image: mariadb:11 container_name: abot-mariadb restart: unless-stopped environment: # 数据库初始化参数统一通过 compose 管理,便于首次部署和后续迁移。 MARIADB_ROOT_PASSWORD: ${ABOT_DB_PASSWORD:-please_change_me} MARIADB_DATABASE: ${ABOT_DB_NAME:-message_archive} TZ: ${TZ:-Asia/Shanghai} command: - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci ports: - "${ABOT_DB_PORT_EXPOSED:-3306}:3306" volumes: # 独立数据卷保证数据库升级或重建容器后数据仍然保留。 - mariadb_data:/var/lib/mysql healthcheck: test: ["CMD", "mariadb-admin", "ping", "-h", "127.0.0.1", "-p${ABOT_DB_PASSWORD:-please_change_me}"] interval: 10s timeout: 5s retries: 10 start_period: 20s redis: image: redis:7 container_name: abot-redis restart: unless-stopped command: > sh -c ' if [ -n "$${ABOT_REDIS_PASSWORD}" ]; then exec redis-server --appendonly yes --requirepass "$${ABOT_REDIS_PASSWORD}"; else exec redis-server --appendonly yes; fi' environment: ABOT_REDIS_PASSWORD: ${ABOT_REDIS_PASSWORD:-} TZ: ${TZ:-Asia/Shanghai} ports: - "${ABOT_REDIS_PORT_EXPOSED:-6379}:6379" volumes: # Redis 使用 AOF 持久化,兼顾易用性与基础数据保留能力。 - redis_data:/data healthcheck: test: ["CMD-SHELL", "if [ -n \"$${ABOT_REDIS_PASSWORD}\" ]; then redis-cli -a \"$${ABOT_REDIS_PASSWORD}\" ping; else redis-cli ping; fi"] interval: 10s timeout: 5s retries: 10 start_period: 10s abot: build: context: . dockerfile: Dockerfile container_name: abot-app restart: unless-stopped depends_on: mariadb: condition: service_healthy redis: condition: service_healthy env_file: # 默认从项目根目录 .env 读取部署配置,与你现有的环境变量治理方式保持一致。 - .env environment: TZ: ${TZ:-Asia/Shanghai} ABOT_ENVIRONMENT: ${ABOT_ENVIRONMENT:-production} ABOT_DB_HOST: mariadb ABOT_DB_PORT: 3306 ABOT_DB_NAME: ${ABOT_DB_NAME:-message_archive} ABOT_DB_USER: ${ABOT_DB_USER:-root} ABOT_DB_PASSWORD: ${ABOT_DB_PASSWORD:-please_change_me} ABOT_REDIS_HOST: redis ABOT_REDIS_PORT: 6379 ABOT_REDIS_DB: ${ABOT_REDIS_DB:-0} ABOT_REDIS_PASSWORD: ${ABOT_REDIS_PASSWORD:-} DASHBOARD_HOST: 0.0.0.0 DASHBOARD_PORT: ${DASHBOARD_PORT:-8888} WECHAT_SERVER_URL: ${WECHAT_SERVER_URL:-http://host.docker.internal:8059/} WECHAT_SERVER_IP: ${WECHAT_SERVER_IP:-host.docker.internal} WECHAT_SERVER_PORT: ${WECHAT_SERVER_PORT:-8059} WECHAT_SERVER_TYPE: ${WECHAT_SERVER_TYPE:-legacy_855} WECHAT_SERVER_KEY: ${WECHAT_SERVER_KEY:-} WECHAT_LOGIN_QR_API: ${WECHAT_LOGIN_QR_API:-new_x} WECHAT_LOGIN_WAY: ${WECHAT_LOGIN_WAY:-mac} WECHAT_WXID: ${WECHAT_WXID:-} WECHAT_DEVICE_NAME: ${WECHAT_DEVICE_NAME:-} WECHAT_DEVICE_ID: ${WECHAT_DEVICE_ID:-} WECHAT_STATE_FILE: ${WECHAT_STATE_FILE:-} ABOT_DASHBOARD_USERNAME: ${ABOT_DASHBOARD_USERNAME:-admin} ABOT_DASHBOARD_PASSWORD: ${ABOT_DASHBOARD_PASSWORD:-ChangeThisPassword_2026!} ABOT_DASHBOARD_SECRET_KEY: ${ABOT_DASHBOARD_SECRET_KEY:-} ABOT_TRENDRADAR_WEBHOOK_TOKEN: ${ABOT_TRENDRADAR_WEBHOOK_TOKEN:-please_change_this_token} ports: - "${DASHBOARD_PORT:-8888}:8888" volumes: # 日志目录映射到宿主机,方便排障与运维备份。 - ./logs:/app/logs # 保留 provider 目录下的本地登录态缓存,避免容器重建后丢失 wxid / device 信息。 - ./wechat_ipad/providers:/app/wechat_ipad/providers extra_hosts: # 兼容 Linux 环境下通过 host.docker.internal 访问宿主机上的 wechat_ipad server。 - "host.docker.internal:host-gateway" volumes: mariadb_data: redis_data: