Установка и настройка сервера Zulip на Ubuntu
Обновлено:
Опубликовано:
Используемые термины: Zulip, Ubuntu.
В данной инструкции мы установим в выполним основные настройки для корпоративного сервера чата Zulip. В качестве операционной системы будет использоваться Linux Ubuntu 20.04 (на данный момент поддерживаются только Debian и Ubuntu).
Требования к инфраструктуре
Подготовка системы
Установка Zulip
Отправка уведомлений по почте
Настройка уведомлений на мобильные устройства
Вход в систему под учетными записями LDAP
Обновление Zulip на новую версию
Читайте также
Программно-аппаратные требования
Zulip предъявляет к инфраструктуре некоторые принципиальные требования, без удовлетворения которых мы не сможем его установить:
- Настроенное доменное имя, по которому мы будем подключаться к чату. Для этого в нашей локальной системе DNS должна быть соответствующая А-запись, которая ведет на сервер Zulip. В данной инструкции предполагается, что мы используем имя zulip.dmosk.ru.
- Наличие почтового сервера, через который мы будем отправлять приглашения новым пользователям.
- 2GB RAM и 10GB дискового пространства — в противном случае, установщик вернет ошибку.
Ссылки на инструкции по настройке постовой системы и DNS смотрите ниже.
Как показывает практика, первых 2 пункта условные — если залезть в настройки поглубже, то можно их обойти.
Предварительные настройки
Выполним некоторые настройки перед тем, как приступим к установке зулипа.
Время
Для правильного отображения времени сообщения, настроим его синхронизацию.
Сначала выставим часовой пояс:
timedatectl set-timezone Europe/Moscow
Устанавливаем программу для синхронизации времени и разрешаем ее автозапуск:
apt-get install chrony
systemctl enable chrony
Брандмауэр
По умолчанию, в системе Ubuntu фаервол ничего не запрещает и в его настройке нет необходимости. Если же мы его настраивали за запрет, нужно убедиться в том, что порты для работы веб-сервера открыты:
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 443 -j ACCEPT
Для сохранения правил используем iptables-persistent:
apt-get install iptables-persistent
netfilter-persistent save
Мы готовы перейти к установке.
Установка
Процесс развертывания прост — достаточно скачать дистрибутив и запустить скрипт установки, который все сделает за нас.
Загрузку выполним командой:
wget https://www.zulip.org/dist/releases/zulip-server-latest.tar.gz
Распакуем скачанный архив:
tar zxf zulip-server-latest.tar.gz
Запускаем скрипт для установки:
./zulip-server-*/scripts/setup/install --certbot --email=postmaster@dmosk.ru --hostname=zulip.dmosk.ru
* в данном примере мы указали установщику получить бесплатный сертификат от Let's Encrypt (опция certbot).
Однако, если мы предполагаем только внутреннее использование (без публикации в Интернет) или наш сервер будет работать через http-прокси, то получить сертификат от Let's Encrypt мы не сможем, и установщик вернет ошибку. Для этого есть опция self-signed-cert, которая сгенерирует самоподписанный сертификат:
./zulip-server-*/scripts/setup/install --self-signed-cert --email=postmaster@dmosk.ru --hostname=zulip.dmosk.ru
** нам нужно передать 2 обязательных параметра — адрес почты и имя хоста, по которому мы будем заходить в чат.
Команда будет выполняться некоторое время. Если мы выполнили ее с опцией для получения сертификата от Let's Encrypt, на определенном этапе установщик запросит принять соглашение — отвечаем утвердительно:
(A)gree/(C)ancel: A
В итоге мы получим сообщение:
Please visit the following secure single-use link to register your
new Zulip organization:
https://zulip.dmosk.ru/new/5omfct4jpnimufagc66xadbn
Установка, почти, завершена — осталось перейти по ссылке в данном сообщении. В нашем примере, переходим на страницу https://zulip.dmosk.ru/new/5omfct4jpnimufagc66xadbn. Мы должны увидеть форму для создания организации — вводим электронную почту:

Кликаем по Создать организацию. На следующей странице заполняем форму создания организации и кликаем Зарегистрироваться:

* в данной форме мы указываем название организации, адрес почты администратора, логин и пароль для первой учетной записи.
Готово. Сервер развернут.
Настройка почты
Как говорилось выше, для zulip важно наличие рабочего почтового сервера для отправки сообщений. В данной инструкции мы не будем рассматривать настройку почтового сервера — ссылку на нужную информацию можно найти ниже.
Выполним настройку Zulip для использования сервера MTA. Для этого открываем файл:
vi /etc/zulip/settings.py
Приводим к виду следующие опции:
EMAIL_HOST = 'smtp.dmosk.ru'
EMAIL_HOST_USER = 'postmaster@dmosk.ru'
Если наш почтовый агент требует подключения по защищенному каналу, добавляем опции:
EMAIL_USE_TLS = True
EMAIL_PORT = 587
* где:
- EMAIL_HOST — адрес почтового сервера для отправки сообщений.
- EMAIL_HOST_USER — email, от которого система будет отправлять письма.
- EMAIL_USE_TLS — использовать или нет защищенное соединение TLS.
- EMAIL_PORT — порт, к которому нужно подключаться для отправки почты.
Открываем файл:
vi /etc/zulip/zulip-secrets.conf
Добавляем опцию для прохождения аутентификации на почтовом сервере:
email_password = abcd1234
* в данном примере предполагается использование пароля abcd1234 для учетной записи postmaster@dmosk.ru, которую мы указали выше. Обратите внимание, что мы можем настроить почтовую систему таким образом, что аутентификация не потребуется — в этом случае нет необходимости в редактировании данного файла.
Пробуем отправить тестовое сообщение:
su zulip -c "/home/zulip/deployments/current/manage.py send_test_email postmaster@dmosk.ru"
* в данном примере на тот же ящик postmaster@dmosk.ru.
Если письмо отправляется, перезагружаем наш сервис для применения настроек:
su zulip -c "/home/zulip/deployments/current/scripts/restart-server"
Push уведомления для мобильных устройств
Мы можем установить приложение для работы с чатом на мобильное устройство. Однако, мы не будем видеть уведомления при получении новых сообщений. Чтобы это исправить, нам нужно настроить PUSH_NOTIFICATION.
Открываем файл:
vi /etc/zulip/settings.py
Снимаем комментарий:
PUSH_NOTIFICATION_BOUNCER_URL = 'https://push.zulipchat.com'
Выполняем регистрацию нашего сервера на сервисе push.zulipchat.com:
su zulip -c '/home/zulip/deployments/current/manage.py register_server'
Система попросит принять соглашение — отвечаем утвердительно:
To register, you must agree to the Zulipchat Terms of Service: https://zulip.com/terms/
Do you agree to the Terms of Service? [Y/n] Y
Готово. Перезагружаем zulip:
su zulip -c "/home/zulip/deployments/current/scripts/restart-server"
В настройках zulip в веб-интерфейсе нужно убедиться, что у нас выставлена галочка для получения уведомлений на мобильные устройства:

Аутентификация через LDAP
Дополнительно рассмотрим возможность входа в систему под учетными записями, хранящимися в LDAP. В нашем примере будет использоваться реализация на базе Microsoft Active Directory.
1. Прежде всего подключимся к серверу LDAP и создадим учетную запись, которая будет использоваться для подключения к каталогу.
Предположим, что мы создали пользователя zulip с паролем zulip_ldap_password.
2. Переходим на сервер zulip и открываем файл:
vi /etc/zulip/zulip-secrets.conf
Добавим опцию:
auth_ldap_bind_password = zulip_ldap_password
* опция auth_ldap_bind_password позволяет указать пароль для LDAP BIND пользователя (в нашем примере, пароль — zulip_ldap_password).
Теперь открываем файл с настройками zulip:
vi /etc/zulip/settings.py
Приводим к виду следующие основные настройки:
AUTHENTICATION_BACKENDS: Tuple[str, ...] = (
...
'zproject.backends.ZulipLDAPAuthBackend', # LDAP, setup below
..
)
## LDAP integration.
##
## Zulip supports retrieving information about users via LDAP, and
## optionally using LDAP as an authentication mechanism.
...
AUTH_LDAP_SERVER_URI = "ldap://dc1.dmosk.ru"
...
AUTH_LDAP_BIND_DN = "zulip"
...
AUTH_LDAP_USER_SEARCH = LDAPSearch(
"dc=dmosk,dc=ru", ldap.SCOPE_SUBTREE, "(sAMAccountName=%(user)s)"
)
...
LDAP_APPEND_DOMAIN = "dmosk.ru"
...
LDAP_EMAIL_ATTR = "mail"
...
AUTH_LDAP_REVERSE_EMAIL_SEARCH = LDAPSearch("dc=dmosk,dc=ru",
ldap.SCOPE_SUBTREE, "(mail=%(email)s)")
...
AUTH_LDAP_USERNAME_ATTR = "sAMAccountName"
Если мы хотим ограничить доступ по группам, добавим опции:
AUTH_LDAP_REQUIRE_GROUP = "cn=enabled,ou=groups,dc=example,dc=com"
AUTH_LDAP_DENY_GROUP = "cn=disabled,ou=groups,dc=example,dc=com"
* где:
- AUTHENTICATION_BACKENDS — группа опций, где перечислены методы аутентификации. По умолчанию все, кроме email закомментированы. В нашем случае мы должны снять комментарий с опции zproject.backends.ZulipLDAPAuthBackend.
- AUTH_LDAP_SERVER_URI — адрес, по которому мы должны подключаться к нашему серверу LDAP.
- AUTH_LDAP_BIND_DN — учетная запись, под которой мы должны подключаться к LDAP. В нашем примере, под zulip.
- AUTH_LDAP_USER_SEARCH — область поиска объектов для входа в систему. В данном примере мы указали на корень домена dmosk.ru (при желании, можно ограничить определенным контейнером или организационным юнитом). Тут же мы указали, что в качестве логинов для входа нам нужно использовать атрибут sAMAccountName.
- LDAP_APPEND_DOMAIN — указываем конкретный домен, для которого будет выполняться аутентификация через LDAP.
- LDAP_EMAIL_ATTR — указываем атрибут в LDAP, в котором хранятся адреса email пользователей.
- AUTH_LDAP_REVERSE_EMAIL_SEARCH — область поиска объектов для получения email-адресов.
- AUTH_LDAP_USERNAME_ATTR — атрибут для имени учетной записи.
- AUTH_LDAP_REQUIRE_GROUP — группа, в которую должны входить пользователи, чтобы они могли входить в Zulip.
- AUTH_LDAP_DENY_GROUP — группа, пользователям которой необходимо запретить вход.
Проверяем нашу настройку:
su zulip -c "/home/zulip/deployments/current/manage.py query_ldap ldap_user"
* где ldap_user — имя учетной записи в LDAP.
Мы должны увидеть что-то на подобие:
full_name: ldap_user
email: ldap_user@dmosk.ru
* ldap_user — учетная запись; ldap_user@dmosk.ru — адрес электронной почты для учетной записи.
Перезапускаем сервис zulip:
su zulip -c "/home/zulip/deployments/current/scripts/restart-server"
Обновление версии
Zulip обновляется, относительно, просто. Для начала, изучаем системные требования. Необходимо убедиться, что наш сервер соответствует все пунктам.
Среди файлов уже установленного приложения есть скрипт для выполнения обновления. Нам нужно загрузить версию Zulip, на которую нужно обновиться — можно сразу на последнюю версию:
curl -sLO https://download.zulip.com/server/zulip-server-latest.tar.gz
Или мы можем посмотреть список версий и загрузить конкретную:
curl -sLO https://download.zulip.com/server/zulip-server-9.2.tar.gz
После чего выполняем скрипт:
/home/zulip/deployments/current/scripts/upgrade-zulip zulip-server-latest.tar.gz
Будет проведена проверка соответствия рекомендациям, после чего запустится процесс обновления.
Ждем.
Читайте также
В инструкции не говорится о развертывании некоторых сервисов, работа которых нужна для Zulip. Более подробную информацию можно найти в статьях:
1. Установка и настройка bind на Ubuntu.
2. Большой почтовый сервер на Ubuntu Server.
3. Получение бесплатного SSL сертификата Let's Encrypt.
4. Как установить роль контроллера домена на Windows Server.