8.2.18 Развёртывание корпоративного чат‑сервера Zulip

Zulip — современная система командных коммуникаций с открытым исходным кодом, сочетающая потоковое общение и асинхронные темы сообщений. Развёртывание в Docker делает установку быстрой и воспроизводимой, устраняя необходимость ручной настройки зависимости (PostgreSQL, RabbitMQ, Redis, memcached и т. д.).
Подготовка сервера
Требования
- Виртуальный или Выделенный сервер;
- Минимальные системные требования 2 vCPU, 4 ГБ RAM и 20 ГБ SSD;
- root‑доступ или пользователь с правами sudo;
- Обязательно установите Docker и Docker Compose.
Переменные, требующие замены
- DOMAIN_NAME— Ваше доменное имя (например,- chat.example.com).
- ADMIN_EMAIL— email администратора Zulip.
- POSTGRES_PASSWORD,- RABBITMQ_PASSWORD,- REDIS_PASSWORD,- MEMCACHED_PASSWORD— пароли сервисов.
- SECRET_KEY— 50‑символьная случайная строка (Django- SECRET_KEY).
Безопасность
Ограничим доступ к непубличным портам и разрешим только необходимые службы.
UFW:
sudo ufw allow OpenSSH
sudo ufw allow 80,443/tcp
sudo ufw enable
iptables:
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -P INPUT DROP
Установка
Первым делом создадим директорию для нашего проэкта
mkdir ~/zulip && cd ~/zulip
Далее клонируем проект docker‑zulip:
git clone https://github.com/zulip/docker-zulip.git
cd docker-zulip

Команда клонирует пример docker-compose.yml, в котором уже описаны пять контейнеров (Zulip, PostgreSQL, Redis, RabbitMQ, memcached).
Совет: для генерации секретных ключей используйте команду:
openssl rand -base64 40 | tr -d '/+=' | head -c 50
Теперь редактируем docker-compose.yml. Откройте файл и найдите секцию environment у службы zulip и внесите Ваши данные.
services:
  zulip:
    image: zulip/docker-zulip:10.4-0  # актуальный тег
    environment:
      - SETTING_EXTERNAL_HOST=DOMAIN_NAME
      - SETTING_ZULIP_ADMINISTRATOR=ADMIN_EMAIL
      - POSTGRES_PASSWORD=POSTGRES_PASSWORD
      - SECRETS_postgres_password=POSTGRES_PASSWORD
      - RABBITMQ_DEFAULT_PASS=RABBITMQ_PASSWORD
      - SECRETS_rabbitmq_password=RABBITMQ_PASSWORD
      - REDIS_PASSWORD=REDIS_PASSWORD
      - SECRETS_redis_password=REDIS_PASSWORD
      - SECRETS_secret_key=SECRET_KEY
      - SSL_CERTIFICATE_GENERATION=certbot    # автоматический Let’s Encrypt
Предупреждение: после первого запуска изменить пароли сервисов можно только вручную в контейнерах или пересоздав тома с данными.
Загружаем образы и запускаем Zulip
Следующие команды создадут и запустят пять контейнеров, проверить их статус можно командой docker compose ps.
# загрузка последних стабильных образов
sudo docker compose pull
# запуск в фоновом режиме
sudo docker compose up -d

Создание организации
Выполнив команду в терминале появится ссылка вида https://<DOMAIN_NAME>/new/realm/..., откройте её в браузере для первичной настройки.
sudo docker compose exec -u zulip zulip \
  "/home/zulip/deployments/current/manage.py generate_realm_creation_link"

Введите данные для создания организации:

Проверка работы
- Убедитесь, что все контейнеры «healthy»:
docker compose ps

- Откройте https://<DOMAIN_NAME>/и войдите под созданной учётной записью администратора.
 3. В меню Administration → Server logs проверьте отсутствие ошибок.
3. В меню Administration → Server logs проверьте отсутствие ошибок.
Распространённые ошибки
| Ошибка | Причина | Решение | 
|---|---|---|
| port 5432 is already allocated | На хосте работает локальный PostgreSQL | Остановите службу postgresqlили измените порт вdocker-compose.yml. | 
| 502 Bad Gateway / self‑signed cert | Сертификат Let’s Encrypt ещё не выпущен | Дождитесь завершения процесса Certbot либо временно используйте HTTP. | 
| django.core.exceptions.ImproperlyConfigured: SECRET_KEY | Переменная SECRETS_secret_keyне задана | Сгенерируйте новый ключ, пропишите в docker-compose.yml, перезапустите контейнер. | 
| Нехватка RAM, очередь «worker not running» | Серверу не хватает памяти на многопроцессорные воркеры | Установите QUEUE_WORKERS_MULTIPROCESS=falseили увеличьте объём RAM. | 
Официальная документация


