# flag92.com — Chatwoot + Dify docker-compose 模板
# 适用于 4C8G+ VPS / 测试或小型生产环境
# 使用前修改：所有 CHANGE_ME 占位符 + 域名 + SMTP

version: '3.8'

x-chatwoot-env: &chatwoot-env
  NODE_ENV: production
  RAILS_ENV: production
  SECRET_KEY_BASE: CHANGE_ME_SECRET_KEY_BASE
  FRONTEND_URL: https://support.example.com
  DEFAULT_LOCALE: zh_CN
  REDIS_URL: redis://redis:6379
  POSTGRES_HOST: postgres
  POSTGRES_USERNAME: chatwoot
  POSTGRES_PASSWORD: CHANGE_ME_PG_PASSWORD
  POSTGRES_DATABASE: chatwoot_production
  MAILER_SENDER_EMAIL: support@example.com
  SMTP_ADDRESS: smtp.postmarkapp.com
  SMTP_PORT: 587
  SMTP_USERNAME: CHANGE_ME
  SMTP_PASSWORD: CHANGE_ME
  ACTIVE_STORAGE_SERVICE: local

services:
  chatwoot-rails:
    image: chatwoot/chatwoot:v4
    restart: unless-stopped
    environment: *chatwoot-env
    ports:
      - "127.0.0.1:3000:3000"
    depends_on:
      - postgres
      - redis
    volumes:
      - chatwoot-storage:/app/storage

  chatwoot-sidekiq:
    image: chatwoot/chatwoot:v4
    restart: unless-stopped
    command: bundle exec sidekiq -C config/sidekiq.yml
    environment: *chatwoot-env
    depends_on:
      - postgres
      - redis
    volumes:
      - chatwoot-storage:/app/storage

  postgres:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_DB: chatwoot_production
      POSTGRES_USER: chatwoot
      POSTGRES_PASSWORD: CHANGE_ME_PG_PASSWORD
    volumes:
      - postgres-data:/var/lib/postgresql/data

  redis:
    image: redis:7-alpine
    restart: unless-stopped
    command: redis-server --requirepass CHANGE_ME_REDIS_PASSWORD
    volumes:
      - redis-data:/data

  # Dify
  dify-api:
    image: langgenius/dify-api:latest
    restart: unless-stopped
    environment:
      MODE: api
      SECRET_KEY: CHANGE_ME_DIFY_SECRET
      CONSOLE_WEB_URL: https://dify.example.com
      DB_HOST: postgres
      DB_USERNAME: chatwoot
      DB_PASSWORD: CHANGE_ME_PG_PASSWORD
      DB_DATABASE: dify
      REDIS_HOST: redis
      REDIS_PASSWORD: CHANGE_ME_REDIS_PASSWORD
      VECTOR_STORE: weaviate
      WEAVIATE_ENDPOINT: http://weaviate:8080
    ports:
      - "127.0.0.1:5001:5001"
    depends_on: [postgres, redis, weaviate]

  dify-worker:
    image: langgenius/dify-api:latest
    restart: unless-stopped
    environment:
      MODE: worker
      SECRET_KEY: CHANGE_ME_DIFY_SECRET
      DB_HOST: postgres
      REDIS_HOST: redis
    depends_on: [postgres, redis]

  dify-web:
    image: langgenius/dify-web:latest
    restart: unless-stopped
    ports:
      - "127.0.0.1:3001:3000"
    environment:
      CONSOLE_API_URL: https://dify.example.com

  weaviate:
    image: semitechnologies/weaviate:1.27
    restart: unless-stopped
    environment:
      QUERY_DEFAULTS_LIMIT: 25
      AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true'
      PERSISTENCE_DATA_PATH: /var/lib/weaviate
    volumes:
      - weaviate-data:/var/lib/weaviate

volumes:
  postgres-data:
  redis-data:
  chatwoot-storage:
  weaviate-data:
