Установка и настройка сервера Zulip на Ubuntu
Используемые термины: Zulip, Ubuntu.
В данной инструкции мы установим в выполним основные настройки для корпоративного сервера чата Zulip. В качестве операционной системы будет использоваться Linux Ubuntu 20.04 (на данный момент поддерживаются только Debian и Ubuntu).
Требования к инфраструктуре
Подготовка системы
Установка Zulip
Отправка уведомлений по почте
Настройка уведомлений на мобильные устройства
Вход в систему под учетными записями LDAP
Читайте также
Программно-аппаратные требования
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. Более подробную информацию можно найти в статьях:
1. Установка и настройка bind на Ubuntu.
2. Большой почтовый сервер на Ubuntu Server.
3. Получение бесплатного SSL сертификата Let's Encrypt.
4. Как установить роль контроллера домена на Windows Server.