Перелопатив много различных гайдов в сети не нашёл ни одного полноценно и полностью рабочего. В результате попробую дебютировать на хабре со своим личным гайдом для тех, кто столкнулся с такой-же задачей: установка на своём сервере безопасного и зашифрованного мессенджера.
И так приступим.
Установка
Прежде всего обновим нашу систему:
apt update
apt upgrade
Установим дополнительные зависимости
apt install net-tools python3-dev python3-pip libpq-dev mc aptitude htop apache2-utils lsb-release wget apt-transport-https
pip install psycopg2
Подключим matrix.org репозитории для Ubuntu/Debian x64 архитектуры доступные по адресу https://packages.matrix.org/debian/.
wget -O /usr/share/keyrings/matrix-org-archive-keyring.gpg https://packages.matrix.org/debian/matrix-org-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/matrix-org-archive-keyring.gpg] https://packages.matrix.org/debian/ $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/matrix-org.list
apt update
Установим Matrix Synapse
apt install matrix-synapse-py3
В процессе установки не забываем установить имя нашего сервера.
Файлы конфигурации Matrix находятся в /etc/matrix-synapse
Предлагаю его сразу отредактировать под наши нужды.
vim /etc/matrix-synapse/homeserver.yaml
Оригинальный файл
# Configuration file for Synapse.
#
# This is a YAML file: see [1] for a quick introduction. Note in particular
# that *indentation is important*: all the elements of a list or dictionary
# should have the same indentation.
#
# [1] https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html
#
# For more information on how to configure Synapse, including a complete accounting of
# each option, go to docs/usage/configuration/config_documentation.md or
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html
#
# This is set in /etc/matrix-synapse/conf.d/server_name.yaml for Debian installations.
# server_name: "SERVERNAME"
pid_file: "/var/run/matrix-synapse.pid"
listeners:
- port: 8008
tls: false
type: http
x_forwarded: true
bind_addresses: ['::1', '127.0.0.1']
resources:
- names: [client, federation]
compress: false
database:
name: sqlite3
args:
database: /var/lib/matrix-synapse/homeserver.db
log_config: "/etc/matrix-synapse/log.yaml"
media_store_path: /var/lib/matrix-synapse/media
signing_key_path: "/etc/matrix-synapse/homeserver.signing.key"
trusted_key_servers:
- server_name: "matrix.org"
Отредактированный файл
# Configuration file for Synapse.
#
# This is a YAML file: see [1] for a quick introduction. Note in particular
# that *indentation is important*: all the elements of a list or dictionary
# should have the same indentation.
#
# [1] https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html
#
# For more information on how to configure Synapse, including a complete accounting of
# each option, go to docs/usage/configuration/config_documentation.md or
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html
#
# This is set in /etc/matrix-synapse/conf.d/server_name.yaml for Debian installations.
# server_name: "SERVERNAME"
pid_file: "/var/run/matrix-synapse.pid"
listeners:
- port: 8008
tls: false
type: http
x_forwarded: true
bind_addresses: ['127.0.0.1']
resources:
- names: [client]
compress: false
database:
name: psycopg2
txn_limit: 10000
args:
user: matrix
password: YOUR-MATRIX-DB-USER-PASSWORD
database: matrix
host: localhost
port: 5432
cp_min: 5
cp_max: 10
log_config: "/etc/matrix-synapse/log.yaml"
media_store_path: /var/lib/matrix-synapse/media
signing_key_path: "/etc/matrix-synapse/homeserver.signing.key"
trusted_key_servers:
- server_name: "matrix.YOUR-DOMAIN.COM"
suppress_key_server_warning: true
max_upload_size: 100M
enable_registration: false
registration_shared_secret: "Registration-Shared-Secret"
search_all_users: true
prefer_local_users: true
turn_uris: ["turn:matrix.YOUR-DOMAIN.COM?transport=udp","turn:matrix.YOUR-DOMAIN.COM?transport=tcp"]
turn_shared_secret: "Turn-Shared-Secret"
turn_user_lifetime: 86400000
admin_users:
- "@admin:matrix.YOUR-DOMAIN.COM"
Давайте немного разберёмся во внесённых изменениях
bind_addresses: ['127.0.0.1'] - оставляем возможность подключиться к Matrix Synapse только по localhost.
names: [client] - используем только локальную аутентификацию для пользователей.
database: - полностью меняем секцию и настраиваем для работы с PostgreSQL.
server_name: "matrix.YOUR-DOMAIN.COM" - домен вашего Matrix Synapse сервера.
max_upload_size: 100M - ограничиваем максимальный размер загружаемых файлов.
enable_registration: false - отключаем регистрацию из соображений безопасности.
registration_shared_secret: "Registration-Shared-Secret" - прописываем длинное случайное значение, лучше воспользоваться генератором и сгенерировать ключ 32-64 символа.
search_all_users: true - разрешаем поиск пользователей в клиентах.
turn_uris: ["turn:matrix.YOUR-DOMAIN.COM?transport=udp","turn:matrix.YOUR-DOMAIN.COM?transport=tcp"] - сразу добавляем настройки для turn сервера, сам сервер установим позже.
turn_shared_secret: "Turn-Shared-Secret" - прописываем длинное случайное значение, лучше воспользоваться генератором и сгенерировать ключ 32-64 символа.
Установим и настроим PostgreSQL
apt install postgresql
Ограничим PostgreSQL только интерфейсом localhost всё из тех-же соображений безопасности
В файле /etc/postgresql/’YOU-POSTGRE-VERSION-NUMBER’/main/postgresql.conf устанавливаем параметр listen_addresses = ‘localhost’
vim /etc/postgresql/12/main/postgresql.conf
Переключимся на пользователя postgres и настроим пользователя и базу данных для Matrix Synapse.
su - postgres
createuser matrix
createdb --encoding=UTF8 --locale=C --template=template0 --owner=matrix matrix
psql
postgres=# ALTER USER matrix with PASSWORD 'YOUR-MATRIX-DB-USER-PASSWORD';
postgres=# \q
exit
Теперь можно включить и запустить сам сервис Matrix Synapse
systemctl enable matrix-synapse
systemctl start matrix-synapse
NGINX proxy и настройка сертификатов
NGINX нам нужен для того, чтобы безопасно спрятать все компоненты нашей установки.
Также нам понадобится certbot для получения сертификата Lets Encrypt.
apt install nginx python3-certbot-nginx
Теперь сгенерируем 3 сертификата которые нам понадобятся в дальнейшем:
certbot --nginx -d element.YOUR-DOMAIN.COM
certbot --nginx -d matrix.YOUR-DOMAIN.COM
certbot --nginx -d matrix-admin.YOUR-DOMAIN.COM
Теперь настроим nginx proxy для того, чтобы все наши сервисы стали доступны из сети.
Закоментируем include /etc/nginx/sites-enabled/*; в фаиле конфигурации nginx
vim /etc/nginx/nginx.conf
Теперь настроим nginx proxy для matrix, matrix-admin и element
vim /etc/nginx/conf.d/matrix.conf
matrix.conf
server {
listen 80;
listen [::]:80;
server_name matrix.YOUR-DOMAIN.COM;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name matrix.YOUR-DOMAIN.COM;
ssl_certificate /etc/letsencrypt/live/matrix.YOUR-DOMAIN.COM/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/matrix.YOUR-DOMAIN.COM/privkey.pem;
location ~* ^(/|/_matrix|/_synapse/client) {
proxy_pass http://localhost:8008;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
client_max_body_size 100M;
}
}
server {
listen 8448 ssl http2 default_server;
listen [::]:8448 ssl http2 default_server;
server_name matrix.YOUR-DOMAIN.COM;
ssl_certificate /etc/letsencrypt/live/matrix.YOUR-DOMAIN.COM/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/matrix.YOUR-DOMAIN.COM/privkey.pem;
location / {
proxy_pass http://localhost:8008;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
vim /etc/nginx/conf.d/matrix-admin.conf
matrix-admin.conf
server {
listen 80;
listen [::]:80;
server_name matrix-admin.YOUR-DOMAIN.COM;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name matrix-admin.YOUR-DOMAIN.COM;
ssl_certificate /etc/letsencrypt/live/matrix-admin.YOUR-DOMAIN.COM/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/matrix-admin.YOUR-DOMAIN.COM/privkey.pem;
location / {
allow 1.1.1.1; #Allowed IP
allow 8.8.8.8/24; #Allowed Subnet
deny all;
proxy_pass http://localhost:8088/;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
vim /etc/nginx/conf.d/element.conf
element.conf
server {
listen 80;
listen [::]:80;
server_name element.YOUR-DOMAIN.COM;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name element.YOUR-DOMAIN.COM;
ssl_certificate /etc/letsencrypt/live/element.YOUR-DOMAIN.COM/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/element.YOUR-DOMAIN.COM/privkey.pem;
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header Content-Security-Policy "frame-ancestors 'self'";
location / {
proxy_pass http://localhost:8080;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
Проверим конфигурацию nginx на наличие ошибок
nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
systemctl enable nginx
systemctl restart nginx
Теперь наш Matrix Synapse запущен и работоспособен для обмена текстовыми сообщениями и файлами.
Создадим первого пользователя из командной строки и сделаем его админом.
systemctl restart matrix-synapse
register_new_matrix_user -c /etc/matrix-synapse/homeserver.yaml http://localhost:8008
Теперь установим и настроим coturn для видео и аудио звонков
apt install coturn
Настроим coturn. Раскоментируем и утановим следующие настройки:
vim /etc/turnserver.conf
turnserver.conf
listening-port=3478
fingerprint
use-auth-secret
static-auth-secret=Turn-Shared-Secret #Мы еге генерировали ранее во время настройки Matrix Synapse
realm=matrix.YOUR-DOMAIN.COM
# consider whether you want to limit the quota of relayed streams per user (or total) to avoid risk of DoS.
user-quota=100 # 4 streams per video call, so 100 streams = 25 simultaneous relayed calls per user.
total-quota=1200
no-tcp-relay # VoIP traffic is all UDP. There is no reason to let users connect to arbitrary TCP endpoints via the relay.
syslog
no-multicast-peers
В файле /etc/default/coturn раскомментируем строку #TURNSERVER_ENABLED=1, если строка закомментирована — TURN-сервер не стартует.
vim /etc/default/coturn
systemctl enable coturn
systemctl start coturn
Установим Element web на базе докер контейнера
Для этого нам потребуется докер.
apt install docker.io docker-compose
Теперь подготовим config.json для нашего Element WEB для минимальной кастомизации: сразу пропишем адрес нашего Matrix Synapse сервера и отключим ненужное. Будем использовать только локальную аутентификацию.
mkdir /opt/element-web
cd /opt/element-web
vim /opt/element-web/config.json
config.json
{
"default_server_config": {
"m.homeserver": {
"base_url": "https://matrix.YOUR-DOMAIN.COM",
"server_name": "matrix.YOUR-DOMAIN.COM"
},
"m.identity_server": {
"base_url": "https://vector.im"
}
},
"disable_custom_urls": true,
"disable_guests": true,
"disable_login_language_selector": false,
"disable_3pid_login": true,
"brand": "Element",
"integrations_ui_url": "https://scalar.vector.im/",
"integrations_rest_url": "https://scalar.vector.im/api",
"integrations_widgets_urls": [
"https://scalar.vector.im/_matrix/integrations/v1",
"https://scalar.vector.im/api",
"https://scalar-staging.vector.im/_matrix/integrations/v1",
"https://scalar-staging.vector.im/api",
"https://scalar-staging.riot.im/scalar/api"
],
"bug_report_endpoint_url": "https://element.io/bugreports/submit",
"uisi_autorageshake_app": "element-auto-uisi",
"default_country_code": "GB",
"show_labs_settings": false,
"features": {},
"default_federate": false,
"default_theme": "light",
"room_directory": {
"servers": ["YOUR-DOMAIN.COM"]
},
"enable_presence_by_hs_url": {
"https://matrix.YOUR-DOMAIN.COM": true
},
"terms_and_conditions_links": [
{
"url": "https://element.io/privacy",
"text": "Privacy Policy"
},
{
"url": "https://element.io/cookie-policy",
"text": "Cookie Policy"
}
],
"privacy_policy_url": "https://element.io/cookie-policy"
}
Пришло время создать и запустить Element WEB docker контейнер.
docker run -d --name element-web --restart always -p 127.0.0.1:8080:80 -v /opt/element-web/config.json:/app/config.json vectorim/element-web:latest
Установка админки synapse-admin
Для начала нам надо зайти в папку /opt и с клонировать git репозиторий. Будем собирать контейнер самостоятельно для всё той-же минимальной кастомизации.
cd /opt
git clone https://github.com/Awesome-Technologies/synapse-admin.git
Теперь внесём необходимые настройки в docker-compose.yml
vim /opt/synapse-admin/docker-compose.yml
docker-compose
version: "3"
services:
synapse-admin:
container_name: synapse-admin
hostname: synapse-admin
#image: awesometechnologies/synapse-admin:latest
build:
context: .
# to use the docker-compose as standalone without a local repo clone,
# replace the context definition with this:
# context: https://github.com/Awesome-Technologies/synapse-admin.git
args:
# if you're building on an architecture other than amd64, make sure
# to define a maximum ram for node. otherwise the build will fail.
# - NODE_OPTIONS="--max_old_space_size=1024"
# default is .
# - PUBLIC_URL=/synapse-admin
# You can use a fixed homeserver, so that the user can no longer
# define it himself
- REACT_APP_SERVER=https://matrix.YOUR-DOMAIN.COM
ports:
- "127.0.0.1:8088:80"
restart: unless-stopped
Теперь соберём наш контейнер.
cd /opt/synapse-admin/
docker-compose up -d
Если вас будут пугать warning сообщение не обращайте внимание, в моём случае это никоим образом не повлияло на работоспособность админки.
Проверим что у нас получилось
https://matrix.YOUR-DOMAIN.COM
https://matrix-admin.YOUR-DOMAIN.COM
https://element.YOUR-DOMAIN.COM
Заключение
Данный гайд тестировался на работоспособность на Ubuntu 20 LTS и Ubuntu 22 LTS.
Это мой дебют на хабре по этому прошу не судить строго.
Надеюсь данный гайд кому-то поможет с экономить время и окажется полезным.