Установка Matrix сервера с помощью playbook 2021
Инструкция по установке и настройке сервера Matrix с собственным сервером идентификации
После первой установки мною matrix прошло пару лет. Наконец настали светлые времена, когда не нужно устанавливать сервер из исходников, танцевать с бубном для установки сервера идентификации, а потом и мостов. На свете появился замечатльный инструмент причем официально опубликованный на сайте matrix.org, это набор скриптов Playbook для запуска на рабочей станции с которой можно поднять полноценный сервер matrix без лишних заморочек, а потом им управлять так же.
Мануала на русском языке я не видел, решил, что будет полезным его написать.
Забегая вперед скажу, что почти все известные косяки исправили, сделали новый приятный клиент Element.
Единственный баг, который я нашел это ошибка при видеозвонках с android на iphone, видимо баг не такой частый, но мне он попался.
По опыту минимальные требования
2Гб ОЗУ + swap, либо 4Гб ОЗУ без него (особенно, важно если будете открывать большие группы) Это если ставить без собственного jitsi!
По данному мануалу мы ставим его свой, минимально бы я закладывал под такой инстанс 4Гб+swap
2 ядра, иначе если 1 то будет часто под 100% загружено
Поддерживаемые ОС
CentOS (Только 7 версия)
Debian (9/Stretch и новее)
Ubuntu (16.04 и новее, с 20.04 есть проблемы)
Archlinux
Я пробовал ставить на ubuntu 18.04 и CentOS 7
Playbook можно запускать и на самом сервере матрикс для этого в файле hosts скриптов нужно изменения внести (прочтите в нем что вписать где), мне удобнее с рабочей станции запустить скрипты, а так же можно использовать временный сервер второй, главное сохранить ключи, что бы потом не потерять доступ к серверу матрикс.
Подготовка
Готовим DNS
Сначала нужно прописать все поддомены в ДНС, прописывать нужно именно такие, менять нельзя иначе не взлетит. Убедитесь, что все работает с помощью nslookup в сети, например: https://2whois.ru/?t=nslookup
Основной домен 2 уровня ваш обычно используется под сайт или блог, ну или просто заглушка он использоваться при установке не будет, в нем нужно будет только в nginx сделать настройку локации, что бы передать делегирование matrix на поддомен.
В качестве примера домена я буду использовать example.com
ТИП ХОСТ ПРИОРИТЕТ ВЕС ПОРТ ЦЕЛЬ
A matrix - - - matrix-server-IP
CNAME element - - - matrix.example.com
CNAME dimension - - - matrix.example.com
CNAME jitsi - - - matrix.example.com
SRV _matrix-identity._tcp 10 0 443 matrix.example.com
Готовим сервер
Обновляем все и ребутаемся для верности
sudo apt-get update && apt-get upgrade && reboot
Дальше нам нужно избавиться от подключения к серверу по паролю, будем использовать ключи, что бы рабочая станция со скриптами ansible , смогла подключиться к серверу без ввода паролей. Сделайте по инструкции и проходите дальше.
Готовим рабочую станцию
Как избавиться от входа по паролю на сервер, кратко. Если не генерили ключи, сделайте это на рабочей станции:
ssh-keygen
Копируем ключи на сервер, где будет жить матрикс
ssh-copy-id root@example.com
Пробуем зайти на сервер, пароль спросить не должен.
ssh root@example.com
Попав на сервер отключаем на нём возможность входа по паролю
sudo nano /etc/ssh/sshd_config
Добавляем запись
PasswordAuthentication no
Рестартуем сервис ssh
sudo systemctl restart ssh
От сервера можно отключаться.
Дальше все настройки, правки конфигов все делается на рабочей станции, на сервер мы уже не лезем, за нас сделают все скрипты, а на нем в конце мы настроим файрвол просто и все.
Обновляемся как и в случае сервера и ребутаемся.
Установка Python3 pip и ansible и генератор
sudo apt install python-pip
sudo pip install ansible
sudo apt install pwgen
Либо если не находит питоняку без указания версий, то так:
sudo apt install python3-pip
sudo pip3 install ansible
Установка
Получаем из гита скрипты. Делаем это на рабочей станции!
git clone https://github.com/spantaleev/matrix-docker-ansible-deploy.git
Настройка
Переходим в директорию, которая скачалась с гита и начинаем править конфигурационные файлы, их много, так как будем ставить максимальную конфигурацию с блек-джеком как мы любим. Что не доделали сможем доделать позже или дополнить.
cd matrix-docker-ansible-deploy
Базовая конфигурация
Примеры настроек каждого отдельного сервиса можно найти в папках по такому пути:
roles/ROLE_NAME_HERE/defaults/main.yml
В этих папках примеры конфигов, обычно хватает только строчки с командой включить или не включить, но бывает так, что в официально документации настройки были не верные, а в файлах верные. Я попался на синтаксисе. Вот тут официальная документация, если чего-то не хватит вам.
Создаем каталог для конфигурации нашего сервера
mkdir inventory/host_vars/matrix.example.com
Копируем стандартные файлы конфигурации
cp examples/vars.yml inventory/host_vars/matrix.example.com/
cp examples/hosts inventory/hosts
Отредактируем файл хоста, в него вносим данные по нашему серверу, который будем настраивать
nano inventory/hosts
В нём я думаю всё понятно будет:
matrix.example.com ansible_host=1.2.3.4 ansible_ssh_user=root
Вместо 1.2.3.4 внешний ip сервера, вместе example.com свой домен, а вот пользователь может быть и не root, вот только если нужно будет вводить пароль sudo, то нужно будет в команду установки добавлять всегда ключ -K скажу это ещё раз ниже.
В него мы будем вносить всё, что нужно нам для установки. В минимальном варианте без изысков и проверки можно установить просто поправив адрес сервера
Все секретные ключи желательно генерировать автоматически командой, сделайте их несколько, штук 10 и скопируйте в блокнот, будем использовать дальше в конфиге:
pwgen -s 64 1
Для Jitsi сгенерировать сразу строчки для конфига с паролями можно командой, тоже генерим и сохраняем где-нибудь:
bash inventory/scripts/jitsi-generate-passwords.sh
Теперь к основному конфигурационному файлу:
nano inventory/host_vars/matrix.example.com/vars.yaml
Обратите внимание, что домен тут указан именно 2 уровня, а не matrix.example.com сделано это для того, что бы иметь красивые адреса @login:example.com, а не с приставкой matrix
#Обязательное
matrix_domain: example.com
matrix_ssl_lets_encrypt_support_email: 'ssl@example.com'
matrix_coturn_turn_static_auth_secret: 'большой ключ'
matrix_synapse_macaroon_secret_key: 'большой ключ'
matrix_postgres_connection_password: 'пароль на БД любой ставьте'
#Jitsi
matrix_jitsi_enabled: true
matrix_jitsi_jicofo_component_secret: большой ключ
matrix_jitsi_jicofo_auth_password: большой ключ
matrix_jitsi_jvb_auth_password: большой ключ
matrix_jitsi_jibri_recorder_password: большой ключ
matrix_jitsi_jibri_xmpp_password: большой ключ
#Регистрация для своих
matrix_registration_enabled: true
#Админка
matrix_registration_admin_secret: "большой ключ"
matrix_synapse_admin_enabled: true
#Если у вас нет сайта на домене 2 уровня example.com то можно обойтись без пункта настройки на нем ngninx а добавить пункт ниже, что бы он обслуживался на этом сервере
#matrix_nginx_proxy_base_domain_serving_enabled : true
Конфиг выше даст нам сразу:
СЕРВИС ОПИСАНИЕ
Synapse homeserver сам сервер Matrix
PostgreSQL хранение истории в БД
Coturn STUN/TURN сервер для маршрутизации трафика видео\аудиозвонков
Let's Encrypt SSL бесплатный сертификат
Element Web веб клиент настроенный по умолчанию на ваш сервер
ma1sd собственный сервер идентификации
Exim почтовый сервер для отправки уведомлений
Nginx Веб-сервер
Jitsi видеоконференции
Synapse-admin веб морда для администрации клиентов и комнат
Matrix-registration регистрация для своих с помощью инвойса
Вот в таком виде нужно запустить установку. Если что-то вам не нужно просто удалите строчку из конфигурационного файла.
Устанавливаем, если пользователь в hosts не root и нужно получить пароль от sudo, добавьте в конце команды ключ -K и во всех командах его добавлять нужно будет
ansible-playbook -i inventory/hosts setup.yml --tags=setup-all,start
Дальше можно запустить проверку конфигурации
ansible-playbook -i inventory/hosts setup.yml --tags=self-check
Бывает, так что после установки иногда выходят какие-то ошибки, попробуйте заново запустить просто несколько раз, у меня пропадали.
Регистрация первого пользователя и делаем его администратором
Для этого на той же рабочей станции выполняем команду
ansible-playbook -i inventory/hosts setup.yml --extra-vars='username=логин password=пароль admin=yes' --tags=register-user
Установка Dimension
Полезная штука позволяющая добавлять виджеты в беседы, для конференций тоже полезная, что бы не торчало сразу видео, а была кнопочка подключиться к конференции.
Зарегистрируйте нового пользователя например dimension, не администратора
ansible-playbook -i inventory/hosts setup.yml --extra-vars='username=dimension password=хорошийпароль admin=no' --tags=register-user
Теперь нужно получить его токен, что бы сервис работал из под него. Есть два способа как это сделать через curl или через клиент
Через клиент:
Откройте Element можно веб-версию
Авторизуйтесь под dimension
Нажмите на имя вверху где аватарка
В настройках найдите пункт "Help & About", проскрольте ниже и найдите пункт Access Token: . Жмакайте по нему и копируйте токен, запишите куда нибудь временно в блокнот
Просто закройте браузер, не разлогиневайтесь!
Через curl
curl -X POST --header 'Content-Type: application/json' -d '{
"identifier": { "type": "m.id.user", "user": "YourDimensionUsername" },
"password": "YourDimensionPassword",
"type": "m.login.password"
}' 'https://matrix.example.com/_matrix/client/r0/login'
В команде замените "YourDimensionUser/Pass" URL на свои значения.
Добавляем в конфигурацию, что нам нужен теперь Dimension
nano inventory/host_vars/matrix.example.com/vars.yaml
Добавьте строчки:
matrix_dimension_enabled: true
matrix_dimension_admins: '@логин:example.com'
matrix_dimension_access_token: "ВАШ ТОКЕН который копировали"
Пропишите администратором свою первую учетку, которую создавали. От пользователя dimension нам нужен был только токен.
Ну а теперь как обычно проводим сборку
ansible-playbook -i inventory/hosts setup.yml --tags=setup-all,start
Так, теперь есть нюанс, Jitsi у нас локальный, а плейбук не умеет править конфиг, что бы виджет jitsi создавался с локальным jitsi. Нужно самому руками это поправить.
Откройте клиент Element откройте любой чат, любую комнату и нажмите на инфу о ней справа вверху. Там будет ссылка добавить виджеты>Откроется экран Widgets жмакайте на шестеренку справа вверху>Widgets>Jitsi Conference карандашек>тут замените домен на свой jitsi.example.com в обоих окошках не стирая остального на счёт рубилнька не уверен, может глючить. Сохраните.
Регистрация для своих
Мы ее уже подключили, а пользоваться ей вот так
ansible-playbook -i inventory/hosts setup.yml \
--tags=generate-matrix-registration-token \
--extra-vars="one_time=yes ex_date=2021-12-31"
ne_time - да нет, то есть если нужен просто постоянный токен, этакий инвойс ставьте no, дату до которой он действительный меняем в ex_date= в том же формате.
Запускаем и получаем токен и прямую ссылку на регистрацию, которую можно отправлять друзьям.
Админка
Доступна по адресу (/ в конце обязательно):
https://matrix.example.com/synapse-admin/
В конце файвол включить
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 22/tcp
sudo ufw allow 5349/tcp
sudo ufw allow 5349/udp
sudo ufw allow 3478/tcp
sudo ufw allow 3478/udp
sudo ufw allow 8448/tcp
sudo ufw allow 49152:49172/udp
sudo ufw allow 4443/tcp
sudo ufw allow 10000/udp
sudo ufw enable
Проверяем статус
sudo ufw status verbose
Конфиг вашего основного сайта domain на Nginx
В конфиг nginx нужно вставить настройку, что бы всем сказать, что этот домен обслуживает сервер matrix находящийся по адрсесу matrix.example.com и все и клиенты и федерация прозрачно работали, когда вы указываете адрес сервера example.com
location /.well-known/matrix {
proxy_pass https://matrix.example.com/.well-known/matrix;
proxy_set_header X-Forwarded-For $remote_addr;
}
Проверьте, что федерация работает:
https://federationtester.matrix.org/
Еще можно проверить правильно ли работает настройка TURN STUN для видео и аудио звонков, тут токен можно подсунуть или логин и пароль от учетки матриксовской врменной, url вводить matrix.example.com:
https://test.voip.librepush.net/
Обновление и обслуживание
Playbook не только может установить, но и производить обновления.
Канал, что бы следить за уведомлениями о новых версиях #homeowners:matrix.org.
Процесс обновления
Войдите в директорию со скриптами на рабочей станции подтяните обновления скриптов из гита:
cd matrix-docker-ansible-deploy
git pull
Запустите переустановку и перезапустите сервисы
ansible-playbook -i inventory/hosts setup.yml --tags=setup-all,start
Единственное только мажорные версии БД Postgress не будут установлены автоматически. Если захотите обновите руками.
Решение проблем
Почему-то при проверке последний раз с последней версией скриптов на убунту установка выпала в ошибку при проверке docker репозиториев:
TASK [matrix-base : Ensure Docker repository is enabled] **************************************************************************************************************** fatal: [matrix.example.com]: FAILED! => {"msg": "The conditional check 'matrix_docker_installation_enabled|bool and matrix_docker_package_name == 'docker-ce and not ansible_distribution_release == 'bullseye'' failed. The error was: template error while templating string: expected token 'end of statement block', got 'bullseye'. String: {% if matrix_docker_installation_enabled|bool and matrix_docker_package_name == 'docker-ce and not ansible_distribution_release == 'bullseye' %} True {% else %} False {% endif %}\n\nThe error appears to be in '/home/user/matrix-docker-ansible-deploy/roles/matrix-base/tasks/server_base/setup_debian.yml': line 21, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: Ensure Docker repository is enabled\n ^ here\n"}
c CentOS проблем не заметил. Я нашел причину. Если будет такая же проблема отредактируйте файл.
roles/matrix-base/tasks/server_base/setup_debian.yml
В нем нужно удалить или закоментировать вот этот кусок кода c 26 по 33 строку :
when: matrix_docker_installation_enabled|bool and matrix_docker_package_name == 'docker-ce and not ansible_distribution_release == 'bullseye'
- name: Ensure Docker repository is enabled (using Debian Buster on Debian Bullseye, for which there is no Docker yet)
apt_repository:
repo: "deb [arch={{ matrix_debian_arch }}] https://download.docker.com/linux/{{ ansible_distribution|lower }} buster stable"
state: present
update_cache: yes
when: matrix_docker_installation_enabled|bool and matrix_docker_package_name == 'docker-ce and ansible_distribution_release == 'bullseye'
И вставить вот этот код из предыдущей версии этого файла версии:
when: matrix_docker_installation_enabled|bool and matrix_docker_package_name == 'docker-ce'
Dimension не включается, а используется vector для виджетов
Поймал такую ошибку сегодня при инсталяции на любой ОСи, дело в том, что я использовал темаетический домен место стандатных ru, com и других. Видимо в этом проблема была. Все остальное завелось. Решил прописав руками в конфиг пути урлы до своего инстанса дименшина.
Их можно посмотреть войдя по адресу https://dimension.example.com
matrix_dimension_integrations_ui_url: "https://dimension.example.com/element"
matrix_dimension_integrations_rest_url: "https://dimension.example.com/api/v1/scalar"
matrix_dimension_integrations_widgets_urls: ["https://dimension.example.com/widgets"]
matrix_dimension_integrations_jitsi_widget_url: "https://dimension.example.com/widgets/jitsi"
После повторной установки такого не поймал, хз, что это было.