====== Установка 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 для продакшн среды