# =============================================================================
# NooviChat (Chatwoot) — Stack completa de referência (Docker Swarm / Portainer)
# Inclui o WhatsApp nativo (NooviConnect) — serviço dedicado na própria stack.
#
# Substitua os placeholders (chat.seudominio.com.br, seu-email@..., etc.) e
# defina os segredos no .env da stack (os ${VAR} são lidos de lá).
# =============================================================================
version: "3.8"

services:
  noovichat_app:
    image: nooviai/noovichat:latest
    environment:
      # --- Núcleo ---
      - RAILS_ENV=production
      - NODE_ENV=production
      - INSTALLATION_ENV=docker
      - INSTALLATION_NAME=SuaEmpresa
      - SECRET_KEY_BASE=${SECRET_KEY_BASE}
      - FRONTEND_URL=https://chat.seudominio.com.br
      - DEFAULT_LOCALE=pt_BR
      - FORCE_SSL=true
      - TZ=America/Sao_Paulo
      # --- Banco (PostgreSQL + pgvector) ---
      - POSTGRES_HOST=pgvector
      - POSTGRES_DATABASE=chatwoot
      - POSTGRES_USERNAME=postgres
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      # --- Redis ---
      - REDIS_URL=${REDIS_URL}
      # --- Licença NooviChat ---
      - NOOVI_LICENSE_KEY=${NOOVI_LICENSE_KEY}
      - NOOVI_API_KEY=${NOOVI_API_KEY}
      - NOOVI_HUB_URL=${NOOVI_HUB_URL}
      # WhatsApp nativo: o app alcança o motor (serviço nooviconnect) automaticamente
      # em http://nooviconnect:3000 — nenhuma variável extra é necessária aqui.
      # --- Storage S3-compatível (opcional; remova para usar volume local) ---
      - ACTIVE_STORAGE_SERVICE=s3_compatible
      - STORAGE_BUCKET_NAME=chatwoot
      - STORAGE_ENDPOINT=https://s3.seudominio.com.br
      - STORAGE_REGION=us-east-1
      - STORAGE_ACCESS_KEY_ID=${STORAGE_ACCESS_KEY_ID}
      - STORAGE_SECRET_ACCESS_KEY=${STORAGE_SECRET_ACCESS_KEY}
      - STORAGE_FORCE_PATH_STYLE=true
      # --- E-mail (SMTP) ---
      - SMTP_ADDRESS=smtp.seudominio.com.br
      - SMTP_PORT=587
      - SMTP_USERNAME=seu-email@seudominio.com.br
      - SMTP_PASSWORD=${SMTP_PASSWORD}
      - SMTP_AUTHENTICATION=plain
      - SMTP_ENABLE_STARTTLS_AUTO=true
      - MAILER_SENDER_EMAIL=contato@seudominio.com.br
    networks:
      - network_public
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.role == manager
      resources:
        limits:
          cpus: "4"
          memory: 8G
      labels:
        - traefik.enable=true
        - traefik.http.routers.noovichat_app.rule=Host(`chat.seudominio.com.br`)
        - traefik.http.routers.noovichat_app.entrypoints=websecure
        - traefik.http.routers.noovichat_app.tls.certresolver=letsencryptresolver
        - traefik.http.services.noovichat_app.loadbalancer.server.port=3000

  noovichat_sidekiq:
    image: nooviai/noovichat:latest
    command:
      - bundle
      - exec
      - sidekiq
      - -C
      - config/sidekiq.yml
    environment:
      - RAILS_ENV=production
      - SECRET_KEY_BASE=${SECRET_KEY_BASE}
      - FRONTEND_URL=https://chat.seudominio.com.br
      - TZ=America/Sao_Paulo
      - POSTGRES_HOST=pgvector
      - POSTGRES_DATABASE=chatwoot
      - POSTGRES_USERNAME=postgres
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - REDIS_URL=${REDIS_URL}
      - NOOVI_LICENSE_KEY=${NOOVI_LICENSE_KEY}
      - NOOVI_API_KEY=${NOOVI_API_KEY}
      - NOOVI_HUB_URL=${NOOVI_HUB_URL}
      # WhatsApp nativo: o sidekiq alcança o motor (serviço nooviconnect)
      # automaticamente em http://nooviconnect:3000 — sem variáveis extras aqui.
      - ACTIVE_STORAGE_SERVICE=s3_compatible
      - STORAGE_BUCKET_NAME=chatwoot
      - STORAGE_ENDPOINT=https://s3.seudominio.com.br
      - STORAGE_ACCESS_KEY_ID=${STORAGE_ACCESS_KEY_ID}
      - STORAGE_SECRET_ACCESS_KEY=${STORAGE_SECRET_ACCESS_KEY}
      - STORAGE_FORCE_PATH_STYLE=true
      - SMTP_ADDRESS=smtp.seudominio.com.br
      - SMTP_PORT=587
      - SMTP_USERNAME=seu-email@seudominio.com.br
      - SMTP_PASSWORD=${SMTP_PASSWORD}
      - MAILER_SENDER_EMAIL=contato@seudominio.com.br
    networks:
      - network_public
    deploy:
      mode: replicated
      replicas: 2
      placement:
        constraints:
          - node.role == manager
      resources:
        limits:
          cpus: "4"
          memory: 6G

  # --- WhatsApp nativo (NooviConnect) — serviço dedicado ---
  # O nome do serviço DEVE ser "nooviconnect": o app e o sidekiq o alcançam
  # automaticamente em http://nooviconnect:3000 (zero configuração).
  nooviconnect:
    image: nooviai/nooviconnect:latest
    environment:
      # Use a MESMA chave do app/sidekiq — o motor deriva auth/HMAC sozinho.
      - SECRET_KEY_BASE=${SECRET_KEY_BASE}
      # Mesmo PostgreSQL do NooviChat (o motor cria o próprio schema de sessões).
      - POSTGRESQL_URL=postgresql://postgres:${POSTGRES_PASSWORD}@pgvector:5432/chatwoot
      # URL interna do serviço app, para o motor enviar as mensagens recebidas.
      - NOOVI_CHATWOOT_URL=http://noovichat_app:3000
      - TZ=America/Sao_Paulo
    networks:
      - network_public
    # Sem volume: as sessões ficam no PostgreSQL; a mídia é efêmera.
    deploy:
      mode: replicated
      replicas: 1     # a sessão do WhatsApp é única — 2 réplicas brigariam
      placement:
        constraints:
          - node.role == manager
      resources:
        limits:
          cpus: "2"
          memory: 2G

  noovichat_redis:
    image: redis:7-alpine
    command:
      - redis-server
      - --appendonly
      - "yes"
      - --requirepass
      - ${REDIS_PASSWORD}
    volumes:
      - noovichat_redis:/data
    networks:
      - network_public
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.role == manager

volumes:
  noovichat_redis:
    external: true

networks:
  network_public:
    external: true
