Как установить и настроить Zulip на VPS
Если команда выросла настолько, что в Slack или Telegram уже невозможно найти, кто и что обсуждал три дня назад — знакомая боль. Zulip решает её не общими лозунгами про «упорядочить чат», а конкретной моделью: каждое сообщение живёт в теме (topic) внутри канала (stream), и лента не превращается в один нескончаемый поток. Здесь вы развернёте Zulip на собственном VPS с нуля — от подготовки сервера до настройки почты и бэкапов.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Почему тредовая модель Zulip — не просто фишка
В Slack, Mattermost или Rocket.Chat переписка — это линейная лента канала: сообщения идут одно за другим, и параллельные обсуждения перемешиваются. Если в канале #backend одновременно обсуждают баг в API и планируют деплой — всё сваливается в одну кучу, а через час непонятно, где что.
Zulip разбивает каждый канал на темы. Сообщение «баг в API» уходит в тему api-bug-503, а «деплой пятницы» — в deploy-2026-09-05. Участник может подписаться на канал целиком, а может — только на конкретные темы, которые ему актуальны. Непрочитанные считаются по темам, а не по каналу целиком, поэтому вернуться через два дня и понять контекст — вопрос секунд, а не прокрутки полусотни сообщений.
Это особенно заметно на командах от 15-20 человек и больше: чем больше людей одновременно пишут в общий канал, тем сильнее линейная лента превращается в шум. Для команды из 3-5 человек разница не так критична — там подойдёт и более простой Mattermost.
Требования к серверу и подготовка
Zulip официально поддерживает Ubuntu 22.04/24.04 и Debian 12 — на других дистрибутивах инсталлятор откажется работать без танцев с бубном. Минимальные требования от разработчиков — 2 CPU и 4 ГБ RAM для команды примерно до 100 человек; для 10-20 пользователей хватит и урезанного профиля, но с запасом по памяти лучше не экономить: сервис поднимает PostgreSQL, RabbitMQ, Redis, Memcached и Django-приложение одновременно, и на 2 ГБ RAM инсталлятор может падать на этапе миграций базы.
Перед установкой:
apt update && apt upgrade -y
apt install -y curl wget
hostnamectl set-hostname zulip.example.com
Замените zulip.example.com на реальный поддомен — Zulip требует отдельный домен или поддомен, на котором будет работать только он (общий с другими сервисами домен установщик не поддерживает без ручных танцев в nginx-конфигах). DNS A-запись должна указывать на IP сервера ещё до старта установки — Let's Encrypt проверяет домен по HTTP.
Откройте порты в firewall:
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверУстановка через официальный инсталлятор
Zulip не ставится через apt из коробки — используется официальный tarball-инсталлятор, который сам разворачивает PostgreSQL, RabbitMQ, Redis и nginx в изолированном окружении.
cd /tmp
curl -fLO https://download.zulip.com/server/zulip-server-latest.tar.gz
tar -xf zulip-server-latest.tar.gz
Запускаем установку с автоматическим получением сертификата Let's Encrypt:
sudo -H /tmp/zulip-server-*/scripts/setup/install \
--certbot \
--email=admin@example.com \
--hostname=zulip.example.com
Флаг --certbot заставит инсталлятор самостоятельно выпустить и настроить HTTPS-сертификат — вручную поднимать nginx и certbot, как в отдельной установке Let's Encrypt, не нужно, всё уже зашито в скрипт. Если сертификат уже есть от другого сервиса на этом сервере, используйте флаг --self-signed-cert для теста и донастройте nginx вручную позже.
Процесс занимает 10-20 минут: скачиваются зависимости, компилируются статические файлы фронтенда, накатываются миграции базы. По завершении инсталлятор выведет ссылку для создания организации:
Voilà! Your Zulip server is installed.
Open https://zulip.example.com/accounts/register/... to create your organization.
Ссылка одноразовая и содержит токен — перейдите по ней в течение суток, иначе токен истечёт и придётся генерировать заново через manage.py generate_realm_creation_link.
Создание организации и первичная настройка
По ссылке из установщика откроется форма создания организации (realm в терминологии Zulip). Заполните:
- Organization name — отображаемое имя, видно всем участникам.
- Organization URL — если это единственная организация на сервере, оставьте
/(корень домена); если планируете несколько организаций на одном сервере — задайте поддомен видаteam1.zulip.example.com(потребует wildcard DNS-записи). - Admin email/password — учётка первого администратора.
После входа в веб-интерфейс первым делом настройте:
- Organization settings → Organization permissions — кто может создавать каналы, приглашать пользователей, удалять сообщения.
- Channels — создайте базовые каналы:
general,random, отдельные под команды (#backend,#frontend,#devops). Каждый канал сразу поддерживает подписку по email-уведомлениям и desktop-нотификациям. - Invite users — пригласить участников можно email-приглашением или сгенерировать инвайт-ссылку с ограничением по количеству использований.
Полезная деталь: в Zulip можно включить mandatory topics — запрет отправлять сообщение в канал без указания темы. Для команд, где люди по привычке пишут в общий поток без темы, это сильно дисциплинирует и сохраняет весь смысл тредовой модели.
Настройка исходящей почты (SMTP)
Без рабочего SMTP не будут приходить email-уведомления о упоминаниях и личных сообщениях — критичная функция для тех, кто не сидит в Zulip постоянно. Конфиг почты правится в /etc/zulip/settings.py:
EMAIL_HOST = 'smtp.yourmailprovider.com'
EMAIL_HOST_USER = 'zulip@example.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
Пароль SMTP хранится отдельно, в секретах:
echo "email_password = ваш_пароль" >> /etc/zulip/zulip-secrets.conf
После изменений — обязательный перезапуск:
su zulip -c '/home/zulip/deployments/current/scripts/restart-server'
Если у вас уже развёрнут собственный почтовый сервер — можно указать его как relay вместо стороннего SMTP; логика подключения та же, меняются только хост и порт. Проверить доставку удобно тестовым письмом через Django shell:
su zulip -c '/home/zulip/deployments/current/manage.py shell'
>>> from django.core.mail import send_mail
>>> send_mail('Тест Zulip', 'Проверка SMTP', 'zulip@example.com', ['ваш@email.com'])
Если письмо не пришло за пару минут — проверяйте логи /var/log/zulip/send_email.log, чаще всего проблема в неверном пароле приложения или блокировке порта 587 у провайдера.
Бэкапы и обслуживание базы
Zulip хранит всё состояние в PostgreSQL плюс файлы загрузок (аватары, вложения) на диске. Встроенная утилита manage.py backup делает консистентный снапшот базы и файлов одной командой:
su zulip -c '/home/zulip/deployments/current/manage.py backup'
Бэкап складывается в /var/lib/zulip/backups/ в виде tar-архива. Для регулярного копирования добавьте задачу в cron с выгрузкой на отдельное хранилище — держать бэкапы на том же диске, что и сам сервис, бессмысленно при отказе диска:
0 3 * * * su zulip -c '/home/zulip/deployments/current/manage.py backup' && \
rclone copy /var/lib/zulip/backups/ remote:zulip-backups/ --min-age 1h
Если предпочитаете подход на уровне Docker-томов, а не встроенной утилиты — общие принципы ротации и хранения расписаны в статье про бэкап Docker volume, хотя официальная установка Zulip по умолчанию идёт не через Docker, а напрямую на хост.
Обновление версии Zulip делается похожим образом — скачивается новый tarball и применяется через scripts/upgrade-zulip, который сам прогоняет миграции базы. Перед крупными апгрейдами (major-версии) обязательно снимайте свежий бэкап — откат назад через даунгрейд миграций Zulip официально не поддерживает.
Масштабирование: вынос базы и очередей на отдельные машины
На старте всё — PostgreSQL, Redis, RabbitMQ, приложение — крутится на одном сервере, и для команды до 100-200 человек этого достаточно. Если организация растёт дальше, узкое место обычно PostgreSQL: рост числа сообщений и полнотекстового поиска нагружает диск и CPU быстрее, чем веб-слой.
Zulip поддерживает вынос PostgreSQL на отдельный хост через переменную settings.py:
REMOTE_POSTGRES_HOST = 'db.internal.example.com'
REMOTE_POSTGRES_PORT = '5432'
Общие принципы настройки production-инстанса PostgreSQL — память, shared_buffers, work_mem, репликация для отказоустойчивости — не специфичны для Zulip и разобраны в статье про установку PostgreSQL на VPS. Если планируете вынос базы сразу на старте — закладывайте отдельный сервер уже на этапе выбора конфигурации, переносить работающую инсталляцию сложнее, чем настроить сразу правильно.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Zulip и Mattermost — в чём принципиальная разница для выбора?
Mattermost ближе к Slack по интерфейсу — линейная лента канала, знакомая большинству. Zulip требует привыкания к тредовой модели, но на командах от 20+ человек с параллельными обсуждениями экономит куда больше времени на поиск контекста. Если команда маленькая и привыкла к линейному чату — начните с Mattermost, миграция на Zulip позже возможна, но небыстрая.
Можно ли поставить Zulip через Docker вместо официального инсталлятора?
Сообщество поддерживает неофициальный docker-zulip образ, но сама команда Zulip рекомендует именно tarball-инсталлятор как основной путь — он лучше протестирован и проще в апгрейдах. Для продакшена стоит ориентироваться на официальный способ, Docker-вариант больше подходит для быстрого теста.
Нужен ли отдельный reverse-proxy перед Zulip, если инсталлятор сам ставит nginx?
Нет, если Zulip — единственный сервис на сервере: встроенный nginx уже настроен инсталлятором и получает сертификат через certbot. Отдельный nginx как reverse-proxy нужен только если на одном сервере крутится несколько сервисов и требуется маршрутизация по доменам верхнего уровня.
Как перенести Zulip на другой сервер?
Через manage.py backup на старом сервере и manage.py restore на новом — утилита сама восстанавливает базу, файлы вложений и секреты из архива. Домен и DNS придётся переключить вручную после переноса.
Поддерживает ли Zulip мобильные и десктоп-клиенты?
Да, есть официальные приложения под iOS, Android, Windows, macOS и Linux, плюс полноценный веб-интерфейс. Push-уведомления на мобильных работают через собственный relay-сервис Zulip либо через self-hosted push-уведомления, если важна полная автономность от внешних сервисов.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →