====== Установка Chatwoot в Docker на Ubuntu ======
===== Шаг 1: Клонирование репозитория Chatwoot =====
# Создание директории для Chatwoot в /opt
sudo mkdir -p /opt/chatwoot
# Изменение владельца папки на текущего пользователя
sudo chown $USER:$USER /opt/chatwoot
# Переход в созданную директорию
cd /opt/chatwoot
# Клонирование репозитория в подпапку repo
git clone https://github.com/chatwoot/chatwoot.git repo
# Переход в репозиторий
cd repo
# Переход на стабильную версию (опционально)
git checkout main
===== Шаг 2: Настройка переменных окружения =====
# Убедитесь, что находитесь в корневой директории Chatwoot
cd /opt/chatwoot
# Копирование примера конфигурации из репозитория
cp repo/.env.example .env
# Редактирование файла конфигурации
nano .env
==== Основные параметры в файле .env: ====
# Redis URL
REDIS_URL=redis://redis:6379
REDIS_PASSWORD=your_redis_password
# База данных
POSTGRES_HOST=postgres
POSTGRES_USERNAME=postgres
POSTGRES_PASSWORD=your_postgres_password
POSTGRES_DATABASE=chatwoot
# Secret key (сгенерируйте уникальный)
SECRET_KEY_BASE=your_secret_key_here
# Rails environment
RAILS_ENV=production
# Frontend URL
FRONTEND_URL=http://your-domain.com
# Настройки почты (опционально)
MAILER_SENDER_EMAIL=chatwoot@yourdomain.com
SMTP_ADDRESS=smtp.gmail.com
SMTP_PORT=587
SMTP_EMAIL=your_email@gmail.com
SMTP_PASSWORD=your_app_password
===== Шаг 3: Генерация секретного ключа =====
# Генерация SECRET_KEY_BASE
openssl rand -hex 64
**ВАЖНО:** Скопируйте сгенерированный ключ в файл .env как значение для SECRET_KEY_BASE.
===== Шаг 4: Создание Docker Compose файла =====
Создайте файл ''docker-compose.yml'' в корневой директории ''/opt/chatwoot'':
# Убедитесь, что находитесь в корневой директории Chatwoot
cd /opt/chatwoot
# Создайте файл docker-compose.yml
nano docker-compose.yml
**Содержимое файла:**
services:
base: &base
build:
context: ./repo
dockerfile: docker/Dockerfile
image: chatwoot/chatwoot:custom
pull_policy: never
env_file: .env
volumes:
- ./storage:/app/storage
rails:
<<: *base
depends_on:
- postgres
- redis
environment:
- NODE_ENV=production
- RAILS_ENV=production
- INSTALLATION_ENV=docker
entrypoint: docker/entrypoints/rails.sh
command: ['bundle', 'exec', 'rails', 's', '-p', '3000', '-b', '0.0.0.0']
restart: always
sidekiq:
<<: *base
depends_on:
- postgres
- redis
environment:
- NODE_ENV=production
- RAILS_ENV=production
- INSTALLATION_ENV=docker
command: ['bundle', 'exec', 'sidekiq', '-C', 'config/sidekiq.yml']
restart: always
postgres:
image: pgvector/pgvector:pg16
restart: always
volumes:
- ./postgres_data:/var/lib/postgresql/data
environment:
- POSTGRES_DB=chatwoot
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=your_postgres_password
redis:
image: redis:alpine
restart: always
command: ["sh", "-c", "redis-server --requirepass \"$REDIS_PASSWORD\""]
env_file: .env
volumes:
- ./redis_data:/data
**Особенности конфигурации:**
* Используется сборка из исходного кода (build) вместо готового образа
* PostgreSQL с поддержкой pgvector для AI функций
* Redis защищен паролем из переменной окружения
* Нет проброшенных портов - доступ только через Nginx
* Все данные хранятся в локальных папках
===== Шаг 5: Создание папок для данных и сборка контейнеров =====
# Убедитесь, что находитесь в корневой директории Chatwoot
cd /opt/chatwoot
# Создание папок для данных баз данных и файлов
mkdir -p postgres_data redis_data storage
# Установка правильных прав доступа
sudo chown -R $USER:$USER postgres_data redis_data storage
# Сборка образа из исходного кода (может занять несколько минут)
docker-compose build
# Инициализация базы данных
docker-compose run --rm rails bundle exec rails db:chatwoot_prepare
# Создание и запуск контейнеров
docker-compose up -d
# Проверка статуса контейнеров
docker-compose ps
# Просмотр логов сборки и запуска (опционально)
docker-compose logs -f
**ВНИМАНИЕ:** Первая сборка может занять 10-15 минут, так как Docker компилирует приложение из исходного кода. Убедитесь, что у вас достаточно места на диске (минимум 5GB свободного места).
===== Шаг 6: Инициализация базы данных =====
# Убедитесь, что находитесь в корневой директории Chatwoot
cd /opt/chatwoot
# Выполнение миграций базы данных и заполнение начальными данными
docker-compose run --rm rails bundle exec rails db:chatwoot_prepare
===== Шаг 7: Создание администратора =====
# Убедитесь, что находитесь в корневой директории Chatwoot
cd /opt/chatwoot
# Создание первого пользователя-администратора
docker-compose exec rails bundle exec rails runner '
u = User.new(
email: "admin@example.com",
password: "password123",
password_confirmation: "password123",
name: "Admin User"
)
u.skip_confirmation!
u.save!
account = u.accounts.create!(name: "My Company")
AccountUser.create!(user: u, account: account, role: :administrator)
'
===== Шаг 8: Проверка установки =====
- Настройте Nginx для проксирования запросов к контейнеру
- Откройте браузер и перейдите на ваш домен
- Войдите используя созданные учетные данные администратора
- Настройте свою первую учетную запись
**СОВЕТ:** Поскольку порты не проброшены наружу, доступ к Chatwoot возможен только через настроенный Nginx proxy.
===== Дополнительные настройки =====
==== Настройка SSL (опционально) ====
Для продакшн использования рекомендуется настроить SSL через Nginx или Traefik.
==== Резервное копирование ====
# Переход в корневую директорию Chatwoot
cd /opt/chatwoot
# Создание бэкапа базы данных
docker-compose exec postgres pg_dump -U postgres chatwoot > chatwoot_backup_$(date +%Y%m%d_%H%M%S).sql
# Бэкап всех данных (база данных, redis, файлы загрузок)
tar -czf chatwoot_full_backup_$(date +%Y%m%d_%H%M%S).tar.gz postgres_data redis_data storage
# Бэкап только файлов загрузок
tar -czf storage_backup_$(date +%Y%m%d_%H%M%S).tar.gz storage
# Бэкап конфигурационных файлов
tar -czf config_backup_$(date +%Y%m%d_%H%M%S).tar.gz .env docker-compose.yml
==== Обновление ====
# Переход в корневую директорию Chatwoot
cd /opt/chatwoot
# Обновление репозитория
cd repo
git pull origin main
cd ..
# Остановка сервисов
docker-compose down
# Пересборка образа с новыми изменениями
docker-compose build --no-cache
# Запуск обновленных контейнеров
docker-compose up -d
# Выполнение миграций (если необходимо)
docker-compose exec rails bundle exec rails db:migrate
===== Полезные команды =====
# Переход в корневую директорию Chatwoot (выполнять перед командами ниже)
cd /opt/chatwoot
# Просмотр логов конкретного сервиса
docker-compose logs -f rails
docker-compose logs -f sidekiq
# Перезапуск всех сервисов
docker-compose restart
# Перезапуск конкретного сервиса
docker-compose restart rails
# Остановка всех сервисов
docker-compose down
# Пересборка образа
docker-compose build --no-cache
# Подключение к Rails консоли
docker-compose exec rails bundle exec rails console
# ОСТОРОЖНО! Полное удаление всех данных
# docker-compose down && sudo rm -rf postgres_data redis_data storage
===== Структура папок =====
После установки структура папок будет следующая:
/opt/chatwoot/
├── docker-compose.yml # Конфигурация Docker Compose
├── .env # Переменные окружения
├── repo/ # Репозиторий Chatwoot (клон с GitHub)
│ ├── .env.example
│ ├── Gemfile
│ └── ... (остальные файлы репозитория)
├── postgres_data/ # Данные PostgreSQL
├── redis_data/ # Данные Redis
└── storage/ # Файлы загрузок пользователей
**Преимущества такой структуры:**
* Все данные хранятся локально и легко доступны для резервного копирования
* Простое управление файлами и конфигурацией
* Репозиторий изолирован в отдельной папке
* Легко переносить данные между серверами
===== Устранение неполадок =====
- **Проблемы с подключением к базе данных**: Проверьте, что контейнер postgres запущен
- **Проблемы с памятью**: Убедитесь, что у вас достаточно RAM (минимум 2GB)
- **Порт 3000 занят**: Измените порт в docker-compose.yml на свободный
**ИТОГ:** После успешной установки Chatwoot будет доступен через настроенный домен с Nginx proxy.
===== Дополнительные настройки для продакшн =====
==== Настройка Nginx (обязательно) ====
Создайте файл конфигурации Nginx:
sudo nano /etc/nginx/sites-available/chatwoot
upstream chatwoot {
server rails:3000;
}
server {
listen 80;
server_name your-domain.com;
client_max_body_size 50M;
location / {
proxy_pass http://chatwoot;
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;
# WebSocket support для real-time функций
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Увеличение таймаутов
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
send_timeout 300;
}
# Обработка статических файлов
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
proxy_pass http://chatwoot;
expires 1y;
add_header Cache-Control "public, immutable";
}
}
**ВНИМАНИЕ:** Поскольку контейнеры работают без проброшенных портов, Nginx должен находиться в той же Docker сети или использовать внутренние имена контейнеров.
# Активация конфигурации
sudo ln -s /etc/nginx/sites-available/chatwoot /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
==== Настройка автозапуска ====
Создайте systemd service:
sudo nano /etc/systemd/system/chatwoot.service
[Unit]
Description=Chatwoot
Requires=docker.service
After=docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/chatwoot
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0
[Install]
WantedBy=multi-user.target
# Активация сервиса
sudo systemctl enable chatwoot.service
sudo systemctl start chatwoot.service
# Проверка статуса сервиса
sudo systemctl status chatwoot.service
==== Мониторинг и логи ====
# Просмотр системных логов Chatwoot
sudo journalctl -u chatwoot.service -f
# Мониторинг ресурсов контейнеров
docker stats
# Проверка здоровья контейнеров
docker-compose ps
# Просмотр логов Rails приложения
docker-compose logs -f rails
# Просмотр логов Sidekiq (фоновые задачи)
docker-compose logs -f sidekiq
**ВАЖНЫЕ МОМЕНТЫ БЕЗОПАСНОСТИ:**
* Измените пароли по умолчанию в .env файле
* Используйте сильные пароли для базы данных
* Настройте firewall (ufw) для ограничения доступа к портам
* Регулярно обновляйте Docker образы
* Настройте SSL/TLS для продакшн среды