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

The Host Banner Zulip Installation

Zulip — современная система командных коммуникаций с открытым исходным кодом, сочетающая потоковое общение и асинхронные темы сообщений. Развёртывание в Docker делает установку быстрой и воспроизводимой, устраняя необходимость ручной настройки зависимости (PostgreSQL, RabbitMQ, Redis, memcached и т. д.).

Подготовка сервера

Требования

Переменные, требующие замены

  • 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

git_clone

Команда клонирует пример 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

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"

docker_compose_exec

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

web_interface_create_org

Проверка работы

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

docker_compose_ps

  1. Откройте https://<DOMAIN_NAME>/ и войдите под созданной учётной записью администратора.

web_interface_welcome 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.