Pull to refresh

Установка и настройка сервера Matrix Synapse + PostgreSQL + Admin UI + Element WEB. Ubuntu 20 LTS / Ubuntu 22 LTS

Level of difficultyMedium
Reading time11 min
Views32K

Перелопатив много различных гайдов в сети не нашёл ни одного полноценно и полностью рабочего. В результате попробую дебютировать на хабре со своим личным гайдом для тех, кто столкнулся с такой-же задачей: установка на своём сервере безопасного и зашифрованного мессенджера.

Что же такое Matrix Synapse и Element WEB. Давайте немного разберёмся.

Matrix Synapse - это серверная реализация протокола Matrix. Он представляет собой программный сервер, который обеспечивает коммуникацию и синхронизацию данных в сети Matrix.

Matrix Synapse используется для следующих задач:

  1. Обмен сообщениями: Он обеспечивает передачу текстовых сообщений между пользователями в реальном времени. Пользователи могут отправлять и получать сообщения один на один или участвовать в групповых чатах.

  2. Голосовые и видеозвонки: Matrix Synapse поддерживает голосовые и видеозвонки, что позволяет пользователям общаться в режиме реального времени, используя аудио и видео связь.

  3. Синхронизация данных: Сервер Matrix Synapse синхронизирует данные между пользователями и их устройствами. Это позволяет пользователям получать свои сообщения и данные на всех устройствах, которые они используют для доступа к Matrix.

  4. Децентрализация: Matrix Synapse поддерживает децентрализованную архитектуру, что означает, что каждый пользователь может иметь свой собственный сервер Matrix Synapse. Это дает пользователям контроль над своими данными и коммуникациями, так как они не зависят от централизованного сервера.

  5. Защита и приватность: Matrix Synapse обеспечивает шифрование end-to-end для обмена сообщениями, что гарантирует безопасность и приватность коммуникаций. Это означает, что только отправитель и получатель могут прочитать содержимое сообщения.

В целом, Matrix Synapse предоставляет инфраструктуру для создания собственной сети обмена сообщениями и синхронизации данных, которая может быть использована для различных коммуникационных задач и обеспечения защиты данных.

Matrix Synapse - это программный сервер, который позволяет людям общаться друг с другом через сеть Matrix. Он отправляет и получает сообщения, позволяет проводить голосовые и видеозвонки, а также синхронизирует данные между устройствами пользователей. Matrix Synapse дает возможность людям контролировать свои данные и общение, а также обеспечивает защиту и приватность сообщений.

По сути Matrix Synapse является вашим собственным WhatsAPP / Telegramm / и т.д. мессенджером, где все данные передаются исключительно через Ваш собственный сервер и абсолютно всё шифруется.

Element Web (ранее известный как Riot.im) - это веб-интерфейс или клиент для сети Matrix. Он предоставляет пользователю возможность взаимодействовать с сетью Matrix через веб-браузер без необходимости установки дополнительного программного обеспечения.

Element Web предлагает следующие возможности:

  1. Чаты: Пользователи могут создавать личные чаты с другими пользователями или присоединяться к групповым чатам. Они могут отправлять текстовые сообщения, обмениваться файлами и ссылками, использовать эмодзи и другие элементы форматирования.

  2. Голосовые и видеозвонки: Element Web поддерживает голосовые и видеозвонки между пользователями в сети Matrix. Это позволяет пользователям общаться в режиме реального времени с помощью аудио и видео связи.

  3. Интеграция с другими сервисами: Element Web позволяет интегрировать другие сервисы, такие как уведомления, календари и файловые хранилища, чтобы пользователи могли удобно управлять своими коммуникациями и задачами в одном месте.

  4. Защита и приватность: Element Web поддерживает шифрование end-to-end для обмена сообщениями. Это означает, что только отправитель и получатель могут прочитать содержимое сообщения, обеспечивая высокий уровень приватности.

    Element Web предлагает удобный и интуитивно понятный интерфейс, который позволяет пользователям получать доступ к сети Matrix и взаимодействовать с другими пользователями независимо от устройства и операционной системы.

Немного разобравшись что же это такое давайте приступим к установке.

Установка

Прежде всего обновим нашу систему:

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
matrix_synapse_federation_enabled: false
matrix_synapse_federation_port_enabled: 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"

Давайте немного разберёмся во внесённых изменениях

  1. bind_addresses: ['127.0.0.1'] — оставляем возможность подключиться к Matrix Synapse только по localhost.

  2. names: [client] — используем только локальную аутентификацию для пользователей.

  3. database: — полностью меняем секцию и настраиваем для работы с PostgreSQL.

  4. server_name: «matrix.YOUR‑DOMAIN.COM» — домен вашего Matrix Synapse сервера.

  5. max_upload_size: 100M — ограничиваем максимальный размер загружаемых файлов.

  6. enable_registration: false — отключаем регистрацию из соображений безопасности.

  7. matrix_synapse_federation_enabled: false - отключаем Matrix Federation
    matrix_synapse_federation_port_enabled: false - отключаем Matrix Federation

  8. registration_shared_secret: «Registration‑Shared‑Secret» — прописываем длинное случайное значение, лучше воспользоваться генератором и сгенерировать ключ 32–64 символа.

  9. search_all_users: true — разрешаем поиск пользователей в клиентах.

  10. turn_uris: [«turn:matrix.YOUR‑DOMAIN.COM?transport=udp»,»turn:matrix.YOUR‑DOMAIN.COM?transport=tcp»] — сразу добавляем настройки для turn сервера, сам сервер установим позже.

  11. 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;
        proxy_http_version 1.1;
    }
}

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.

Это мой дебют на хабре по этому прошу не судить строго.

Надеюсь данный гайд кому-то поможет с экономить время и окажется полезным.

Tags:
Hubs:
Total votes 28: ↑27 and ↓1+26
Comments34

Articles