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‑символьная случайная строка (DjangoSECRET_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 проверьте отсутствие ошибок.
Распространённые ошибки
Ошибка | Причина | Решение |
---|---|---|
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. |
Официальная документация