# documentation: https://www.chatwoot.com/docs/self-hosted/
# slogan: Delightful customer relationships at scale.
# tags: chatwoot,chat,api,open,source,rails,redis,postgresql,sidekiq
# logo: svgs/chatwoot.svg
# port: 3000

services:
  chatwoot:
    image: chatwoot/chatwoot:latest
    depends_on:
      - postgres
      - redis
    environment:
      - SERVICE_FQDN_CHATWOOT_3000
      - SECRET_KEY_BASE=$SERVICE_PASSWORD_CHATWOOT
      - FRONTEND_URL=${SERVICE_FQDN_CHATWOOT}
      - DEFAULT_LOCALE=${CHATWOOT_DEFAULT_LOCALE}
      - FORCE_SSL=false
      - ENABLE_ACCOUNT_SIGNUP=false
      - REDIS_URL=redis://default@redis:6379
      - REDIS_PASSWORD=$SERVICE_PASSWORD_REDIS
      - REDIS_OPENSSL_VERIFY_MODE=none
      - POSTGRES_DATABASE=chatwoot
      - POSTGRES_HOST=postgres
      - POSTGRES_USERNAME=$SERVICE_USER_POSTGRES_USER
      - POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES
      - RAILS_MAX_THREADS=5
      - NODE_ENV=production
      - RAILS_ENV=production
      - INSTALLATION_ENV=docker
      - MAILER_SENDER_EMAIL=${CHATWOOT_MAILER_SENDER_EMAIL}
      - SMTP_ADDRESS=${CHATWOOT_SMTP_ADDRESS}
      - SMTP_AUTHENTICATION=${CHATWOOT_SMTP_AUTHENTICATION}
      - SMTP_DOMAIN=${CHATWOOT_SMTP_DOMAIN}
      - SMTP_ENABLE_STARTTLS_AUTO=${CHATWOOT_SMTP_ENABLE_STARTTLS_AUTO}
      - SMTP_PORT=${CHATWOOT_SMTP_PORT}
      - SMTP_USERNAME=${CHATWOOT_SMTP_USERNAME}
      - SMTP_PASSWORD=${CHATWOOT_SMTP_PASSWORD}
      - ACTIVE_STORAGE_SERVICE=local
    entrypoint: docker/entrypoints/rails.sh
    command: sh -c "bundle exec rails db:chatwoot_prepare && bundle exec rails s -p 3000 -b 0.0.0.0"
    volumes:
      - rails-data:/app/storage
    healthcheck:
      test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:3000"]
      interval: 5s
      timeout: 20s
      retries: 10

  sidekiq:
    image: chatwoot/chatwoot:latest
    depends_on:
      - postgres
      - redis
    environment:
      - SECRET_KEY_BASE=$SERVICE_PASSWORD_CHATWOOT
      - FRONTEND_URL=${SERVICE_FQDN_CHATWOOT}
      - DEFAULT_LOCALE=${CHATWOOT_DEFAULT_LOCALE}
      - FORCE_SSL=false
      - ENABLE_ACCOUNT_SIGNUP=false
      - REDIS_URL=redis://default@redis:6379
      - REDIS_PASSWORD=$SERVICE_PASSWORD_REDIS
      - REDIS_OPENSSL_VERIFY_MODE=none
      - POSTGRES_DATABASE=chatwoot
      - POSTGRES_HOST=postgres
      - POSTGRES_USERNAME=$SERVICE_USER_POSTGRES_USER
      - POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES
      - RAILS_MAX_THREADS=5
      - NODE_ENV=production
      - RAILS_ENV=production
      - INSTALLATION_ENV=docker
      - MAILER_SENDER_EMAIL=${CHATWOOT_MAILER_SENDER_EMAIL}
      - SMTP_ADDRESS=${CHATWOOT_SMTP_ADDRESS}
      - SMTP_AUTHENTICATION=${CHATWOOT_SMTP_AUTHENTICATION}
      - SMTP_DOMAIN=${CHATWOOT_SMTP_DOMAIN}
      - SMTP_ENABLE_STARTTLS_AUTO=${CHATWOOT_SMTP_ENABLE_STARTTLS_AUTO}
      - SMTP_PORT=${CHATWOOT_SMTP_PORT}
      - SMTP_USERNAME=${CHATWOOT_SMTP_USERNAME}
      - SMTP_PASSWORD=${CHATWOOT_SMTP_PASSWORD}
      - ACTIVE_STORAGE_SERVICE=local
    command: ['bundle', 'exec', 'sidekiq', '-C', 'config/sidekiq.yml']
    volumes:
      - sidekiq-data:/app/storage
    healthcheck:
      test: ["CMD-SHELL", "bundle exec rails runner 'puts Sidekiq.redis(&:info)' > /dev/null 2>&1"]
      interval: 30s
      timeout: 10s
      retries: 3

  postgres:
    image: postgres:12
    restart: always
    volumes:
      - postgres-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=chatwoot
      - POSTGRES_USER=$SERVICE_USER_POSTGRES_USER
      - POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U $SERVICE_USER_POSTGRES_USER -d chatwoot -h 127.0.0.1"]
      interval: 30s
      timeout: 10s
      retries: 5

  redis:
    image: redis:alpine
    restart: always
    command: ["sh", "-c", "redis-server --requirepass \"$SERVICE_PASSWORD_REDIS\""]
    volumes:
      - redis-data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "-a", "$SERVICE_PASSWORD_REDIS", "PING"]
      interval: 30s
      timeout: 10s
      retries: 5
