MAATRIX / Блог / Как установить и настроить Chatwoot на VPS

Как установить и настроить Chatwoot на VPS

MAATRIX

Когда обращения клиентов размазаны по почте, виджету на сайте и паре мессенджеров, рано или поздно кто-то из них теряется — а с ним и клиент. Chatwoot собирает все каналы поддержки в один инбокс: чат на сайте, email, Telegram, WhatsApp через API-провайдеров, Facebook и Instagram. Это открытый аналог Intercom и Zendesk, и его можно поднять на собственном VPS за час, без ежемесячной платы за агентов и без ограничений по числу диалогов.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Что такое Chatwoot и зачем разворачивать его самостоятельно

Chatwoot — open-source платформа службы поддержки на Ruby on Rails и Vue.js, с версией Community (бесплатная, MIT-лицензия) и облачной Enterprise. Self-hosted вариант даёт полный контроль: данные переписки с клиентами остаются на вашем сервере, а не в чужом облаке за периметром РФ или ЕС, что важно и с точки зрения 152-ФЗ, и просто из соображений приватности.

Из коробки Community-версия умеет:

  • виджет живого чата на сайте с настройкой цвета, приветствия и рабочих часов;
  • единый инбокс для email, веб-чата, API-каналов;
  • команды, роли агентов, метки, приватные заметки внутри диалога;
  • базу знаний (Help Center) и автоответы по ключевым словам;
  • интеграции через API и вебхуки — можно подключить свою CRM или бота.

Есть нюанс: часть каналов (WhatsApp через официальный Cloud API, Instagram DM) на Community-плане требует либо сторонний шлюз (например, 360dialog или собственный WhatsApp Business API), либо ограничена по функциям по сравнению с облачным тарифом. Для email и веб-чата ограничений нет — это база, которая закрывает 80% сценариев поддержки малого и среднего бизнеса.

Требования к серверу

Chatwoot — не самое лёгкое приложение: под капотом Rails-бэкенд, PostgreSQL, Redis и Sidekiq для фоновых задач. Для теста хватит и меньшего, но для рабочей нагрузки на команду из 3-10 агентов ориентируйтесь на такие цифры:

ПараметрМинимум (тест)Рекомендуется (продакшн)
CPU2 vCPU4 vCPU
RAM4 ГБ8 ГБ
Диск40 ГБ SSD80+ ГБ SSD
ОСUbuntu 24.04 LTSUbuntu 24.04 LTS

Это ориентир, а не измеренный бенчмарк — реальное потребление зависит от числа одновременных диалогов и того, держите ли вы полнотекстовый поиск и историю за годы на том же сервере. Если бюджет ограничен, можно стартовать на 4 ГБ и мигрировать на более мощный тариф позже — Docker-развёртывание переносится без переустановки, достаточно перенести volume с данными.

Держать почту, поддержку и сайт на одном сервере с плавающей нагрузкой не всегда удобно — если у вас уже есть основной проект, для Chatwoot часто разумнее взять отдельный небольшой VPS под задачу и не смешивать нагрузки.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Установка Docker и подготовка сервера

Если Docker ещё не стоит, разверните его с нуля — этот шаг подробно разобран в статье про установку Docker на Ubuntu 24.04. Коротко, для чистого сервера:

apt update && apt upgrade -y
curl -fsSL https://get.docker.com | sh
systemctl enable --now docker

Проверьте, что Docker Compose plugin установился вместе с движком:

docker compose version

Дальше создайте рабочую директорию и пользователя без root-прав для будущих операций (по желанию, но правильнее для продакшна):

mkdir -p /opt/chatwoot && cd /opt/chatwoot

Развёртывание через Docker Compose

Официальный образ Chatwoot публикуется в Docker Hub как chatwoot/chatwoot. Разверните минимальный стек из четырёх сервисов: приложение, PostgreSQL, Redis и Sidekiq для очередей.

Создайте docker-compose.yaml:

version: "3"

services:
  rails:
    image: chatwoot/chatwoot:latest
    restart: always
    env_file: .env
    ports:
      - "127.0.0.1:3000:3000"
    depends_on:
      - postgres
      - redis
    entrypoint: docker/entrypoints/rails.sh
    command: bundle exec rails s -p 3000 -b 0.0.0.0
    volumes:
      - storage:/app/storage

  sidekiq:
    image: chatwoot/chatwoot:latest
    restart: always
    env_file: .env
    depends_on:
      - postgres
      - redis
    entrypoint: docker/entrypoints/rails.sh
    command: bundle exec sidekiq -C config/sidekiq.yml
    volumes:
      - storage:/app/storage

  postgres:
    image: pgvector/pgvector:pg16
    restart: always
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=chatwoot
      - POSTGRES_USER=chatwoot
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}

  redis:
    image: redis:7-alpine
    restart: always
    command: ["redis-server", "--requirepass", "${REDIS_PASSWORD}"]
    volumes:
      - redis_data:/data

volumes:
  storage:
  postgres_data:
  redis_data:

Обратите внимание: порт Rails-приложения проброшен только на 127.0.0.1 — снаружи сервер будет закрыт, доступ пойдёт через reverse proxy с SSL, который настроим ниже. PostgreSQL здесь — образ с расширением pgvector, оно нужно для функции AI-подсказок агентам (Captain), но работает и как обычный Postgres, если эта функция вам не нужна.

Файл .env (переменные окружения приложения):

SECRET_KEY_BASE=сгенерируйте_ниже_командой
POSTGRES_PASSWORD=надёжный_пароль_бд
REDIS_PASSWORD=надёжный_пароль_redis
REDIS_URL=redis://:надёжный_пароль_redis@redis:6379
POSTGRES_HOST=postgres
POSTGRES_USERNAME=chatwoot
FRONTEND_URL=https://support.example.com
DEFAULT_LOCALE=ru
RAILS_ENV=production
INSTALLATION_ENV=docker
NODE_ENV=production
RAILS_LOG_TO_STDOUT=true

SECRET_KEY_BASE сгенерируйте отдельно и вставьте в файл:

docker run --rm chatwoot/chatwoot:latest bundle exec rails secret

Замените support.example.com на свой реальный домен и убедитесь, что A-запись уже указывает на IP сервера — если DNS ещё не настроен, весь процесс от покупки домена до записей описан в статье про настройку домена и DNS с нуля.

Запустите миграцию базы данных перед первым стартом:

docker compose run --rm rails bundle exec rails db:chatwoot_prepare

Эта команда создаёт схему БД и сидовые данные. Если она падает с ошибкой подключения к Postgres — почти всегда причина в том, что контейнер БД ещё не успел подняться; подождите 10-15 секунд и повторите.

Теперь поднимите весь стек:

docker compose up -d

Проверьте логи, что приложение стартовало без ошибок:

docker compose logs -f rails

Reverse proxy и SSL-сертификат

Rails-контейнер слушает только localhost, поэтому снаружи нужен веб-сервер с TLS-терминацией. Проще всего — Nginx с Certbot. Установите пакеты:

apt install -y nginx certbot python3-certbot-nginx

Создайте конфиг /etc/nginx/sites-available/chatwoot:

server {
    listen 80;
    server_name support.example.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        client_max_body_size 20M;
    }
}

Upgrade/Connection critical для WebSocket — через него в Chatwoot работают realtime-обновления в интерфейсе агента (новые сообщения без перезагрузки страницы). Активируйте конфиг и выпустите сертификат:

ln -s /etc/nginx/sites-available/chatwoot /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
certbot --nginx -d support.example.com

Certbot сам пропишет редирект с 80 на 443 и настроит автопродление через systemd-таймер. Проверить, что таймер активен:

systemctl status certbot.timer

Если вы уже используете Caddy вместо связки Nginx+Certbot — он получает сертификат автоматически, конфиг сведётся к трём строкам с reverse_proxy, и такой вариант тоже валиден для этой задачи.

Первый запуск и настройка инбоксов

Откройте https://support.example.com — увидите форму создания первого администратора (доступна один раз, при пустой базе). Заполните email и пароль суперадмина.

После входа настройте первый инбокс — обычно это веб-виджет:

  1. Inboxes → Add Inbox → Website.
  2. Укажите название канала и домен сайта, где будет висеть виджет.
  3. Настройте приветственное сообщение, цвет виджета, рабочие часы.
  4. Chatwoot выдаст фрагмент JavaScript — вставьте его перед </body> на сайте.

Для email-канала (Inboxes → Add Inbox → Email) нужен либо готовый почтовый ящик с доступом по IMAP/SMTP, либо — что надёжнее для продакшна — собственный почтовый сервер. Если своей почты ещё нет, разверните её на отдельном VPS по инструкции про установку Postfix и подключите как отдельный IMAP-инбокс либо настройте пересылку через вебхук на встроенный SMTP-сервер Chatwoot.

Дальше добавьте агентов (Settings → Agents → Add Agent), распределите инбоксы по командам (Teams) и настройте автоматизацию через Automation — например, автоматическое назначение диалога агенту по языку сообщения или ключевым словам в теме.

Резервное копирование и обновления

Все персистентные данные Chatwoot лежат в двух volumes из compose-файла: postgres_data (сама база — диалоги, контакты, настройки) и storage (загруженные файлы, вложения). Бэкапить нужно оба.

Быстрый дамп базы:

docker compose exec postgres pg_dump -U chatwoot chatwoot > chatwoot_$(date +%F).sql

Для регулярных автоматических бэкапов с ротацией и шифрованием разумнее не городить свои cron-скрипты, а взять отдельный инструмент — подойдёт связка с BorgBackup, она разобрана в статье про установку и настройку BorgBackup на VPS; туда же можно включить и папку storage.

Обновление до новой версии — стандартная для Docker Compose процедура:

docker compose pull
docker compose run --rm rails bundle exec rails db:chatwoot_prepare
docker compose up -d

Перед крупным обновлением (смена мажорной версии) всегда снимайте свежий дамп базы — миграции необратимы, откат без бэкапа возможен только через восстановление из копии.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Можно ли подключить WhatsApp в бесплатной Community-версии?

Да, но не напрямую — нужен провайдер WhatsApp Business API (например, 360dialog) или собственная интеграция через Cloud API от Meta. Прямая привязка номера без стороннего шлюза в self-hosted версии не работает так же просто, как в облачном тарифе Chatwoot.

Хватит ли 4 ГБ RAM для продакшна?

Для команды из 1-3 агентов и умеренного потока диалогов — да, но Sidekiq и Rails вместе с Postgres и Redis активно используют память под кэш, поэтому при росте нагрузки лучше сразу закладывать 8 ГБ, чтобы не мигрировать на горячую.

Нужен ли отдельный сервер под Chatwoot или можно на том же, где сайт?

Технически можно на одном, но Rails-приложение и Sidekiq создают заметную фоновую нагрузку на CPU и диск (индексация, вебхуки), поэтому для сайта с высоким трафиком поддержку лучше вынести на отдельный VPS — так падение одного сервиса не утянет за собой другой.

Как перенести Chatwoot на другой сервер?

Остановите стек, скопируйте volumes postgres_data и storage (или их дампы) на новый сервер, разверните тот же docker-compose.yaml с теми же переменными .env, восстановите volumes и запустите docker compose up -d.

Поддерживает ли self-hosted версия базу знаний (Help Center)?

Да, функция доступна в Community-версии без ограничений — можно завести публичную базу статей с собственным доменом или поддоменом.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →