Как установить и настроить Chatwoot на VPS
Когда обращения клиентов размазаны по почте, виджету на сайте и паре мессенджеров, рано или поздно кто-то из них теряется — а с ним и клиент. 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 агентов ориентируйтесь на такие цифры:
| Параметр | Минимум (тест) | Рекомендуется (продакшн) |
|---|---|---|
| CPU | 2 vCPU | 4 vCPU |
| RAM | 4 ГБ | 8 ГБ |
| Диск | 40 ГБ SSD | 80+ ГБ SSD |
| ОС | Ubuntu 24.04 LTS | Ubuntu 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 и пароль суперадмина.
После входа настройте первый инбокс — обычно это веб-виджет:
- Inboxes → Add Inbox → Website.
- Укажите название канала и домен сайта, где будет висеть виджет.
- Настройте приветственное сообщение, цвет виджета, рабочие часы.
- 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 ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →