Справочник по установке и настройке Matrix Synapse
Matrix Synapse
4
Сообщения
1
Posters
1
Просмотры
-
Справочник по Matrix Synapse (Пункты 1–100)
Основные понятия и архитектура
- Matrix — это открытый, децентрализованный протокол для обмена сообщениями в реальном времени (альтернатива Telegram, Discord).
- Synapse — это эталонная реализация сервера Matrix на Python, самая популярная и распространенная.
- Федерация (Federation) — возможность общаться с пользователями на других серверах Matrix.
- Домашний сервер (Homeserver) — сервер, на котором зарегистрирован пользователь и где хранятся его данные.
- Element — самый популярный клиент (веб, мобильный, десктоп) для работы с сетью Matrix.
- Coturn — TURN/STUN сервер, необходимый для голосовых и видеозвонков (WebRTC) в Matrix.
Установка Synapse (Основные способы)
- Synapse можно установить из официального репозитория Matrix.org для Debian/Ubuntu.
- Команда добавления ключа репозитория:
wget -qO /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. - Установка Synapse из репозитория:
apt install matrix-synapse-py3. - Во время установки пакет запросит server_name (домен сервера) и согласие на отправку статистики.
- После установки Synapse запускается как системная служба:
systemctl start matrix-synapse. - Включение автозапуска Synapse:
systemctl enable matrix-synapse. - Основной конфигурационный файл Synapse:
/etc/matrix-synapse/homeserver.yaml. - Для установки в Docker используется образ
matrixdotorg/synapse:latest. - Генерация конфигурации для Docker:
docker run -it --rm --mount type=volume,src=synapse-data,dst=/data -e SYNAPSE_SERVER_NAME=example.com matrixdotorg/synapse:latest generate. - Запуск Synapse в Docker:
docker run -d --name synapse --restart unless-stopped --mount type=volume,src=synapse-data,dst=/data -p 8008:8008 matrixdotorg/synapse:latest run.
PostgreSQL вместо SQLite
- Для продакшена настоятельно рекомендуется использовать PostgreSQL вместо встроенной SQLite.
- Установка PostgreSQL:
apt install postgresql postgresql-contrib -y. - Создание пользователя БД:
sudo -u postgres psql -c "CREATE USER synapse_user WITH PASSWORD 'secure_password';". - Создание базы данных:
sudo -u postgres psql -c "CREATE DATABASE synapse ENCODING 'UTF8' LC_COLLATE='C' LC_CTYPE='C' TEMPLATE=template0 OWNER synapse_user;". - Настройки базы данных в Synapse лучше выносить в отдельный файл в
/etc/matrix-synapse/conf.d/database.yaml. - Пример конфигурации для PostgreSQL:
database: name: psycopg2 args: user: synapse_user password: secure_password database: synapse host: localhost cp_min: 5 cp_max: 10 - Подключение Synapse к PostgreSQL можно проверить командой
ss -antp | grep 5432— должны быть ESTAB соединения с процессом python. - Проверить, что Synapse использует PostgreSQL, можно SQL-запросом:
sudo -u postgres psql -d synapse -c "SELECT count(*) FROM users;".
Структура конфигурации (conf.d)
- В Debian/Ubuntu пакет Synapse поддерживает модульную конфигурацию через папку
/etc/matrix-synapse/conf.d/. - Все файлы с расширением
.yamlв этой папке автоматически загружаются и применяются поверх основногоhomeserver.yaml. - Использование
conf.d/— лучшая практика, так как при обновлении пакета основной файл может быть перезаписан. - В
conf.d/рекомендуется хранить настройки базы данных, регистрации, TURN-сервера, федерации и другие специфические параметры. - Файл
/etc/matrix-synapse/conf.d/server_name.yamlобычно содержит только одну строку:server_name: "ваш.домен".
Настройка Nginx в качестве Reverse Proxy
- Matrix Synapse не должен быть напрямую доступен из интернета. Его проксируют через Nginx или Apache.
- Synapse по умолчанию слушает на порту
8008(localhost). - Конфигурация Nginx для проксирования должна включать передачу заголовков
X-Forwarded-ForиX-Forwarded-Proto. - Пример базового location для проксирования:
location / { proxy_pass http://127.0.0.1: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(например, до 50M или 2000M). - Важно: в конфиге Synapse в секции
listenersдолжен быть параметрx_forwarded: true.
SSL-сертификаты (Let's Encrypt)
- Для работы федерации и безопасных клиентов обязателен валидный SSL-сертификат.
- Установка Certbot для Nginx:
apt install certbot python3-certbot-nginx -y. - Получение сертификата:
certbot --nginx -d matrix.ваш-домен.ru. - Certbot автоматически обновляет конфигурацию Nginx, добавляя пути к сертификатам и настраивая редирект с HTTP на HTTPS.
- При использовании федерации сертификат должен быть доверенным (самоподписанный не подойдет).
Настройка федерации (.well-known)
- Федерация позволяет серверам Matrix обмениваться сообщениями.
- Для работы федерации сервер должен корректно отвечать на запросы к
/.well-known/matrix/server. - Правильный ответ должен быть JSON:
{"m.server": "matrix.ваш-домен.ru:443"}. - В Nginx это настраивается через location:
location /.well-known/matrix/server { default_type application/json; return 200 '{"m.server": "matrix.ваш-домен.ru:443"}'; } - Аналогично для клиентов настраивается
/.well-known/matrix/clientсbase_url. - Проверить федерацию можно через инструмент Matrix Federation Tester.
- Если
matrix.orgзаблокирован, можно обойтись без внешних доверенных серверов ключей, установивtrusted_key_servers: []. - Для изоляции сервера (только свои домены) используется параметр
federation_domain_whitelist.
Управление пользователями и паролями
- Создание нового пользователя через командную строку:
register_new_matrix_user -c /etc/matrix-synapse/homeserver.yaml http://localhost:8008. - Утилита запросит имя, пароль и подтверждение администратора.
- Если утилита не видит
registration_shared_secret, нужно указать путь к конфигу изconf.d/дополнительным флагом-c. - Получение списка всех пользователей из SQLite:
sudo sqlite3 /var/lib/matrix-synapse/homeserver.db "SELECT name, creation_ts FROM users;". - Получение списка пользователей из PostgreSQL:
sudo -u postgres psql -d synapse -c "SELECT name, admin FROM users;". - Сброс пароля пользователя через curl (с админским токеном):
curl -X PUT -H "Authorization: Bearer ТОКЕН" "http://localhost:8008/_synapse/admin/v2/users/@user:domain" -d '{"password": "новый_пароль"}' - Получение access_token администратора:
curl -X POST "http://localhost:8008/_matrix/client/r0/login" -d '{"type":"m.login.password","user":"admin","password":"пароль"}' - Назначение пользователя администратором через API:
curl -X PUT -H "Authorization: Bearer ТОКЕН" "http://localhost:8008/_synapse/admin/v2/users/@user:domain" -d '{"admin": true}'. - Деактивация пользователя:
curl -X PUT -H "Authorization: Bearer ТОКЕН" "http://localhost:8008/_synapse/admin/v2/users/@user:domain" -d '{"deactivated": true}'.
Настройка TURN-сервера (Coturn) для звонков
- Для голосовых и видеозвонков необходим TURN-сервер (Coturn), так как клиенты часто находятся за NAT.
- Установка Coturn:
apt install coturn -y. - Основной конфигурационный файл Coturn:
/etc/turnserver.conf. - Генерация секретного ключа (static-auth-secret) для аутентификации:
echo "static-auth-secret=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)" | tee /etc/turnserver.conf. - В конфиге обязательно указать:
listening-port=3478 external-ip=ВНЕШНИЙ_IP_СЕРВЕРА realm=ваш-домен.ru - Если сервер находится в контейнере, для external-ip используется формат:
external-ip=ВНЕШНИЙ_IP/ВНУТРЕННИЙ_IP. - Включение авторизации:
use-auth-secret. - Важно: Не блокировать подсеть сервера. Если сервер в сети 10.x.x.x, нужно закомментировать или удалить строку
denied-peer-ip=10.0.0.0-10.255.255.255. - Запрет на использование TCP-релея (
no-tcp-relay) лучше отключить (закомментировать) для надежности. - Указание диапазона портов для медиа-трафика:
min-port=49152иmax-port=65535. - Включение подробного логирования:
verboseиfingerprint. - Настройка в Synapse (homeserver.yaml):
turn_uris: - "turn:ваш-домен.ru:3478?transport=udp" - "turn:ваш-домен.ru:3478?transport=tcp" turn_shared_secret: "ВАШ_СЕКРЕТ" turn_user_lifetime: 1h turn_allow_guests: true - Для работы звонков в контейнере Incus/LXD необходим проброс UDP-портов через iptables на хосте.
- Команды для проброса портов (на хосте):
iptables -t nat -I PREROUTING -p udp --dport 3478 -j DNAT --to-destination IP_КОНТЕЙНЕРА:3478 iptables -t nat -I PREROUTING -p udp --dport 49152:65535 -j DNAT --to-destination IP_КОНТЕЙНЕРА iptables -I FORWARD -p udp -d IP_КОНТЕЙНЕРА --dport 3478 -j ACCEPT iptables -I FORWARD -p udp -d IP_КОНТЕЙНЕРА --dport 49152:65535 -j ACCEPT - Сохранение правил iptables после перезагрузки:
apt install iptables-persistentиnetfilter-persistent save.
Диагностика и логи
- Просмотр логов Synapse:
journalctl -u matrix-synapse -f. - Поиск ошибок в логах:
journalctl -u matrix-synapse -n 100 | grep -i error. - Проверка статуса сервера:
systemctl status matrix-synapse. - Проверка, на каких интерфейсах и портах слушает Synapse:
ss -tlnp | grep 8008. - Проверка, слушает ли Coturn:
ss -ulnp | grep 3478. - Просмотр логов Coturn:
journalctl -u coturn -f. - В логах Coturn при успешном звонке должны появляться записи
allocate requestилиsuccess. - Мониторинг трафика в реальном времени на хосте:
tcpdump -n -i any udp port 3478. - Проверка активных соединений к PostgreSQL:
ss -antp | grep 5432. - Проверка валидности конфигурации Synapse без запуска:
/usr/bin/python3 -m synapse.app.homeserver --config-path /etc/matrix-synapse/homeserver.yaml --config-path /etc/matrix-synapse/conf.d/ --check-config. - Проверка доступности TURN-сервера извне через онлайн-инструменты (например, Trickle ICE).
Решение проблем
- Ошибка
[] is not of type 'string': возникает при неверном синтаксисеtrusted_key_servers: []. Нужно закомментировать всю секцию. - Нет звука/видео: 90% проблема в неработающем TURN-сервере или закрытых UDP-портах (3478, 49152-65535).
- Приглашение висит, но чат не создается: проблема в федерации, проверьте
.well-knownи открытый порт 443. - Ошибка
Unable to connect to serverпри curl с хоста в контейнер: сервис слушает только127.0.0.1, нужно изменитьbind_addressesна0.0.0.0. - Дублирование ключей (
Duplicate key) в конфиге: настройка прописана и в основном файле, и вconf.d/. Оставить только в одном месте. - Конфликт с Jitsi или другими сервисами: используют общие UDP-порты, нужно разносить диапазоны (Jitsi — 10000, Matrix — 49152+).
- Пакеты в iptables есть, но Coturn молчит: Coturn блокирует подсеть через
denied-peer-ip(особенно 10.x.x.x). - Сервер не запускается после изменения конфига: проверьте синтаксис YAML (отступы важен!).
- Бесконечное «Устанавливается соединение» при звонке: TURN-сервер не отвечает или ключи не совпадают.
- Регистрация не работает: проверьте
enable_registrationи наличиеregistration_shared_secret. - Федерация не работает с matrix.org (блокировка): удалите
matrix.orgизtrusted_key_serversи оставьте пустой список[].
Полезные команды и алиасы
- Просмотр всех пользователей с датой регистрации:
sudo sqlite3 /var/lib/matrix-synapse/homeserver.db "SELECT name, datetime(creation_ts,'unixepoch') FROM users WHERE is_deactivated = 0;". - Количество активных пользователей:
alias matrix-count="sudo sqlite3 /var/lib/matrix-synapse/homeserver.db \"SELECT count(*) FROM users WHERE is_deactivated = 0;\"". - Список администраторов:
alias matrix-admins="sudo sqlite3 /var/lib/matrix-synapse/homeserver.db \"SELECT name FROM users WHERE is_admin = 1;\"". - Быстрая проверка логов звонков:
journalctl -u coturn -f | grep -E "success|error|allocate". - Путь к основным каталогам Synapse:
* Конфигурация:/etc/matrix-synapse/
* База данных SQLite:/var/lib/matrix-synapse/homeserver.db
* Медиафайлы:/var/lib/matrix-synapse/media/
* Логи:/var/log/matrix-synapse/homeserver.log
-
Справочник по Matrix Synapse (Пункты 101–200)
Глубокая настройка Synapse
- Параметр
public_baseurlвhomeserver.yamlдолжен быть полным URL-адресом вашего сервера (например,https://matrix.nbics.net/). - Он используется для генерации ссылок в уведомлениях по электронной почте и для других сервисов.
max_upload_sizeзадает максимальный размер загружаемого файла (например,100Mили2000M).enable_registration: falseотключает публичную регистрацию, позволяя создавать аккаунты только через административную утилиту.enable_registration_without_verification: trueпозволяет регистрироваться без подтверждения email (опасно для публичных серверов).registration_shared_secret— секретный ключ, используемый для регистрации новых пользователей через утилитуregister_new_matrix_user.- Его нужно генерировать случайным образом (например,
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1). - Параметр
rc_messageпозволяет ограничить скорость отправки сообщений для борьбы со спамом.
```yaml rc_message: per_second: 0.2 burst_count: 10 ```media_store_pathуказывает путь к хранилищу медиафайлов (обычно/var/lib/matrix-synapse/media).signing_key_path— путь к ключу подписи сервера, используемому для федерации (/etc/matrix-synapse/homeserver.signing.key).- Ключ подписи генерируется автоматически при первой установке и НИКОГДА не должен быть скомпрометирован.
pid_fileуказывает путь к PID-файлу процесса Synapse (/var/run/matrix-synapse.pid).
Настройка слушателей (listeners)
- Секция
listenersопределяет, на каких портах и интерфейсах Synapse принимает соединения. - Пример настройки для работы через reverse proxy (слушать только localhost):
```yaml listeners: - port: 8008 tls: false type: http x_forwarded: true bind_addresses: ['127.0.0.1', '::1'] resources: - names: [client, federation] compress: false ```x_forwarded: trueуказывает Synapse доверять заголовкамX-Forwarded-Forот прокси.- Если сервер должен принимать соединения извне напрямую,
bind_addressesнужно изменить на['0.0.0.0']. - Ресурс
clientобслуживает клиентские запросы (логин, отправка сообщений, синхронизация). - Ресурс
federationобслуживает запросы от других серверов Matrix.
Безопасность и изоляция
federation_ip_range_blacklist— список IP-диапазонов, к которым серверу запрещено подключаться (защита от SSRF-атак).- Включает приватные диапазоны (
10.0.0.0/8,192.168.0.0/16,172.16.0.0/12и IPv6 аналоги). trusted_key_servers: []делает сервер независимым от внешних серверов ключей (полезно при блокировке matrix.org).- Без списка доверенных серверов федерация работает напрямую: серверы обмениваются ключами друг с другом.
suppress_key_server_warning: trueотключает предупреждение об отсутствии доверенных серверов ключей.enable_room_list_search: falseотключает публичный каталог комнат, если он не нужен.limit_usage_by_membershipпозволяет ограничить использование ресурсов в зависимости от членства в комнатах.require_auth_for_profile_requests: trueтребует аутентификации для запросов профиля пользователя.
Установка из пакетов Debian/Ubuntu (детали)
- Пакет называется
matrix-synapse-py3(а не простоmatrix-synapse). - После установки создается системный пользователь
matrix-synapse, от которого запускается сервис. - Файлы конфигурации по умолчанию находятся в
/etc/matrix-synapse. - Логи по умолчанию пишутся в
/var/log/matrix-synapse/homeserver.log. - Настройки логирования управляются файлом
/etc/matrix-synapse/log.yaml. - Для изменения уровня логирования (например, на DEBUG для отладки) нужно отредактировать
log.yaml. - Встроенная команда проверки конфигурации:
python3 -m synapse.app.homeserver --config-path /etc/matrix-synapse/homeserver.yaml --config-path /etc/matrix-synapse/conf.d/ --check-config. - Python для пакета может находиться в системном окружении или в виртуальном окружении по пути
/opt/venvs/matrix-synapse/bin/python.
Установка в Docker (детали)
- При использовании Docker данные Synapse хранятся в Docker-томе (volume)
synapse-data. - Файлы конфигурации внутри контейнера находятся в
/data. - Чтобы отредактировать
homeserver.yaml, нужно зайти в контейнер:docker exec -it synapse /bin/bash. - Переменная окружения
SYNAPSE_CONFIG_PATHуказывает путь к конфигурационному файлу. - Для проброса портов при запуске используются ключи
-p 8008:8008(клиентский API) и-p 8448:8448(федерация). - Логи Docker-контейнера смотрят командой
docker logs -f synapse. - Обновление Synapse в Docker:
docker pull matrixdotorg/synapse:latest && docker stop synapse && docker rm synapse && (запустить контейнер заново). - Преимущество Docker — изоляция и простота обновления (не нужно чистить конфиги).
Продвинутая диагностика
- Команда для проверки, какие соединения с БД держит Synapse:
ss -antp | grep python.*5432. - Множество соединений в состоянии
ESTAB— это нормально (пул соединений). - Проверка версии Synapse:
dpkg -l | grep matrix-synapseилиdocker exec synapse pip show matrix-synapse. - Проверка, какие правила iptables активны для Matrix:
sudo iptables -L FORWARD -v -n | grep 10.214.97.46. - Просмотр статистики по пакетам в iptables (колонка
pktsпоказывает, сколько пакетов прошло). - Если счетчики пакетов в iptables растут, а звонка нет — проблема внутри контейнера (Coturn).
- Если счетчики не растут — проблема на хосте (Firewall, проброс портов).
- Для диагностики конфликтов портов используется
sudo ss -lupn | grep <порт>.
Решение проблем с конфигурацией (conf.d)
- При использовании
conf.d/важно помнить, что файлы загружаются в алфавитном порядке. - Позже загруженные настройки могут переопределить более ранние.
- Если в основном
homeserver.yamlи вconf.d/есть одинаковые секции, сервер может не запуститься с ошибкойDuplicate key. - Правильный подход: в основном файле оставлять только то, что нужно, а специфичные настройки выносить в
conf.d/. - Для отключения какой-либо опции лучше закомментировать её во всех местах.
- Файлы в
conf.d/должны иметь права на чтение для пользователяmatrix-synapse. - Проверить, какие файлы из
conf.d/загружаются, можно в логах при запуске сервера (уровень INFO).
Интеграция с Coturn и WebRTC
- Параметр
turn_user_lifetimeопределяет время жизни учетных данных TURN (например,86400000мс или1h). turn_allow_guests: trueразрешает гостевым пользователям использовать TURN-сервер.- В конфиге Coturn
listening-ipможно указать как0.0.0.0, чтобы слушать на всех интерфейсах. min-portиmax-portдолжны точно совпадать с диапазоном, проброшенным в iptables.fingerprintв Coturn включает добавление отпечатка в пакеты STUN, что требуется некоторыми WebRTC-клиентами.lt-cred-mechвключает механизм долговременных учетных данных.- Для отладки звонков полезно включить
verboseв Coturn и смотреть логи. - Если в логах Coturn появляется
401 Unauthorized, значит не совпадаетstatic-auth-secretсturn_shared_secretв Synapse. - Если в логах пусто, а пакеты в iptables есть, скорее всего, Coturn блокирует подсеть клиента (проверить
denied-peer-ip).
Настройка Element Web
- Element можно разместить на отдельном поддомене (например,
element.nbics.net) или на том же, что и Synapse. - Скачать последнюю версию Element:
wget https://github.com/vector-im/element-web/releases/latest/download/element.tar.gz. - Распаковать архив в веб-директорию:
tar -xzf element.tar.gz -C /var/www/element. - Конфигурационный файл Element —
config.jsonв корне веб-директории. - В
config.jsonобязательно указатьbase_urlвашего Synapse:
```json { "default_server_config": { "m.homeserver": { "base_url": "https://matrix.nbics.net", "server_name": "nbics.net" } } } ```- Можно отключить гостевой доступ:
"disable_guests": true. - Для изменения названия бренда используется параметр
"brand": "Мой Мессенджер". - Element лучше проксировать через тот же Nginx, что и Synapse, с отдельным
server_name. - Для кэширования статических файлов Element в Nginx можно добавить заголовки
expires 1y; add_header Cache-Control "public, immutable";.
Управление медиафайлами
- Медиафайлы (изображения, видео, документы) хранятся в директории
media_store_path. - Synapse автоматически создает хэш-директории внутри этой папки для хранения файлов.
- Просмотр занятого места под медиа:
du -sh /var/lib/matrix-synapse/media. - Удаление старых или неиспользуемых медиафайлов можно делать через API администратора.
max_image_pixels: 32Mограничивает максимальный размер изображения (в пикселях) для предотвращения DoS-атак.
API администратора (примеры)
- Для использования API администратора нужен access_token пользователя с правами администратора.
- Получение списка пользователей (с пагинацией):
curl -s "http://localhost:8008/_synapse/admin/v2/users?from=0&limit=100" -H "Authorization: Bearer ТОКЕН" | jq . - Получение информации о конкретном пользователе:
curl -s "http://localhost:8008/_synapse/admin/v2/users/@user:domain" -H "Authorization: Bearer ТОКЕН" - Деактивация пользователя (мягкое удаление):
curl -X PUT -H "Authorization: Bearer ТОКЕН" "http://localhost:8008/_synapse/admin/v2/users/@user:domain" -d '{"deactivated": true}' - Удаление пользователя (без возможности восстановления):
curl -X DELETE -H "Authorization: Bearer ТОКЕН" "http://localhost:8008/_synapse/admin/v1/deactivate/@user:domain" - Очистка медиафайлов пользователя:
curl -X POST -H "Authorization: Bearer ТОКЕН" "http://localhost:8008/_synapse/admin/v1/media/@user:domain/delete" -d '{"delete_profiles": true}'
Интеграция с почтой (необязательно)
- Synapse может отправлять email-уведомления (например, для сброса пароля).
- Для этого нужно настроить секцию
emailвhomeserver.yaml:
```yaml email: smtp_host: mail.nbics.net smtp_port: 587 smtp_user: noreply@nbics.net smtp_pass: "пароль" notif_from: "Matrix <noreply@nbics.net>" ```- Email используется только для системных уведомлений, а не для регистрации (если она отключена).
Миграция с SQLite на PostgreSQL
- Если изначально использовался SQLite, можно перенести данные в PostgreSQL.
- Остановить Synapse:
systemctl stop matrix-synapse. - Сделать дамп SQLite:
sqlite3 /var/lib/matrix-synapse/homeserver.db .dump > synapse_dump.sql. - Создать базу и пользователя в PostgreSQL (как описано выше).
- Импортировать дамп в PostgreSQL:
sudo -u postgres psql -d synapse < synapse_dump.sql. - Важно: дамп SQLite может потребовать ручной правки (удаление строк, специфичных для SQLite).
- После импорта настроить Synapse на использование PostgreSQL и перезапустить.
Безопасность и мониторинг
- Регулярно обновляйте Synapse:
apt update && apt upgrade matrix-synapse-py3. - Подпишитесь на рассылку безопасности Matrix.org.
- Следите за логами на предмет подозрительной активности (попытки брутфорса, спам-регистрации).
- Настройте автоматическое резервное копирование базы данных и папки с медиафайлами.
- Параметр
-
Справочник по Matrix Synapse (Пункты 201–300)
Глубокая настройка федерации
- Для федерации через порт 443 (вместо 8448) используется делегирование через
.well-known/matrix/server. - Альтернативный метод делегирования — SRV-запись в DNS:
_matrix._tcp.domain.com. 3600 IN SRV 10 0 443 matrix.domain.com. - SRV-запись имеет приоритет перед
.well-known, но сложнее в настройке. - Если федерация не работает, проверьте, что порт 443 открыт для входящих соединений из любых IP-адресов.
- Другие серверы Matrix подключаются к вашему серверу по протоколу HTTPS и ожидают валидный SSL-сертификат.
- Ошибка "Certificate signed by unknown authority" означает, что сертификат не доверенный (самоподписанный).
- Ошибка "Connection refused" означает, что порт 443 закрыт файерволом или сервис не слушает.
- Ошибка "401 Unauthorized" при федерации возникает из-за проблем с подписью ключей или неверным
server_name. - Параметр
federation_verify_dns(по умолчанию true) заставляет Synapse проверять SRV-записи при федерации. federation_client_minimum_versionпозволяет задать минимальную версию протокола для федерации.- Для отладки федерации включите логирование на уровень DEBUG в
log.yamlдля модуляsynapse.federation.
Мосты (Bridges)
- Мосты позволяют подключать к Matrix другие мессенджеры: Telegram, WhatsApp, Signal, Slack, Discord и др.
- Мосты обычно запускаются как отдельные сервисы (часто в Docker) и подключаются к Synapse через API.
- Самый популярный мост для Telegram — mautrix-telegram.
- Для установки моста требуется отдельный домен (обычно
telegram.domain.comилиbridge.domain.com). - Мосты часто используют собственные базы данных (SQLite/PostgreSQL) и могут потреблять много ресурсов.
- При настройке моста необходимо создать в Synapse специального пользователя для моста (например,
@telegrambot:domain.com). - В конфиге Synapse может потребоваться добавление моста в
federation_domain_whitelist, если он настроен на отдельном домене. - Логи мостов обычно хранятся отдельно и помогают диагностировать проблемы с доставкой сообщений.
- После настройки моста пользователи могут приглашать контакт моста в комнату для связи с внешним мессенджером.
Интеграция с SSO (OIDC/LDAP)
- Synapse поддерживает Single Sign-On (SSO) через OpenID Connect (OIDC).
- Это позволяет входить в Matrix, используя учетные записи Google, GitHub, Keycloak или корпоративного провайдера.
- Настройка OIDC производится в секции
oidc_providersконфигурации Synapse. - Пример настройки для Keycloak:
```yaml oidc_providers: - idp_id: keycloak idp_name: "Keycloak" issuer: "https://keycloak.domain.com/realms/myrealm" client_id: "matrix-client" client_secret: "secret" scopes: ["openid", "profile", "email"] user_mapping_provider: config: localpart_template: "{{ user.preferred_username }}" display_name_template: "{{ user.name }}" email_template: "{{ user.email }}" ```- При использовании SSO регистрация новых пользователей происходит автоматически при первом входе (если включена).
- LDAP-аутентификация также поддерживается через модуль
matrix-synapse-ldap3. - Установка модуля LDAP:
pip install matrix-synapse-ldap3или через пакетный менеджер (если доступен). - Настройка LDAP требует указания URI сервера, базы поиска (base DN) и фильтров для поиска пользователей.
- При использовании LDAP пароли не хранятся в Synapse, а проверяются напрямую у LDAP-сервера.
Пространства (Spaces)
- Spaces (пространства) — это способ организации комнат в иерархические структуры (аналог серверов в Discord).
- Spaces v2 поддерживаются начиная с Synapse 1.121+.
- Пространства могут быть публичными (видны всем) или приватными.
- Для создания пространства используется клиент Element (или другой, поддерживающий Spaces).
- API для управления пространствами доступно администраторам для массового создания/удаления.
- Пространства могут содержать другие пространства, создавая древовидную структуру.
Голосовые и видеозвонки (WebRTC)
- WebRTC использует ICE (Interactive Connectivity Establishment) для поиска пути между клиентами.
- STUN-сервер помогает клиентам узнать свой внешний IP-адрес.
- TURN-сервер ретранслирует трафик, если прямое соединение невозможно.
- В конфиге Synapse для TURN указывается несколько URI для разных протоколов (UDP, TCP, TLS).
- Параметр
turn_urisдолжен содержать полные URI:turn:turn.domain.com:3478?transport=udp. - TURN-сервер Coturn может использовать TLS на порту 5349 для защищенного соединения.
- Для этого в конфиге Coturn нужно указать
certиpkey(пути к SSL-сертификатам) иtls-listening-port=5349. - Клиенты автоматически выбирают наиболее эффективный путь (P2P если возможно, иначе через TURN).
- WebRTC требует открытого диапазона UDP-портов для медиа-трафика (обычно 49152-65535).
- Если звонки не работают, проверьте, что клиенты получают правильные turn_uris (через F12 в Element).
- Для тестирования TURN/STUN можно использовать сайт https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/.
Шифрование (E2EE)
- Matrix поддерживает сквозное шифрование (E2EE) по умолчанию для приватных комнат.
- Шифрование основано на протоколе Olm и Megolm.
- Ключи шифрования хранятся на клиентах пользователей, сервер не имеет доступа к содержимому сообщений.
- Для восстановления доступа к зашифрованным сообщениям используется механизм "key backup" (резервное копирование ключей).
- Резервное копирование ключей может быть защищено парольной фразой или храниться на сервере в зашифрованном виде.
- При первом входе в Element клиент предложит настроить резервное копирование ключей.
- Администратор не может расшифровать сообщения пользователей без их ключей.
- Шифрование может быть отключено для публичных комнат, но не рекомендуется.
Модерация и управление комнатами
- Администраторы комнат могут назначать модераторов (power level 50) и администраторов (power level 100).
- Команды модерации в Element:
-/kick @user:domain— исключить пользователя
-/ban @user:domain— забанить пользователя
-/unban @user:domain— разбанить
-/redact <event_id>— удалить сообщение - Можно устанавливать правила комнаты (server ACLs) для блокировки определенных серверов.
- Server ACLs настраиваются в конфигурации комнаты (в Element: Настройки комнаты -> Безопасность).
- Для массовой модерации используется модуль Mjolnir (бота-модератора).
- Mjolnir позволяет синхронизировать списки заблокированных пользователей и серверов между комнатами.
- Установка Mjolnir требует отдельного сервера или контейнера и доступа к API Synapse.
Масштабирование и производительность
- При росте числа пользователей (сотни и тысячи) SQLite перестает справляться — PostgreSQL обязателен.
- Synapse поддерживает горизонтальное масштабирование через разделение компонентов (worker-архитектура).
- Воркеры (workers) позволяют вынести обработку разных типов запросов на отдельные процессы.
- Типы воркеров:
-synapse.app.generic_worker— общий воркер
-synapse.app.federation_sender— отправка федеративных событий
-synapse.app.media_repository— обслуживание медиафайлов
-synapse.app.pusher— отправка push-уведомлений - Настройка воркеров сложна и требует изменений в конфигурации Nginx и Synapse.
- Для небольших установок (до 1000 пользователей) одного процесса Synapse достаточно.
- Медиафайлы можно вынести на отдельное хранилище (NFS, S3) при масштабировании.
- Synapse поддерживает хранение медиа в S3-совместимых хранилищах (через модуль
s3-storage-provider). - Кэширование в Redis (начиная с Synapse 1.113+) значительно улучшает производительность.
- Настройка Redis: указать параметры в секции
redisконфигурации.
Резервное копирование и восстановление
- Критически важные данные для бэкапа: база данных (PostgreSQL) и папка с медиафайлами.
- Для PostgreSQL используется
pg_dump:
sudo -u postgres pg_dump synapse > /backup/synapse_$(date +%Y%m%d).sql - Для восстановления:
sudo -u postgres psql -d synapse < backup.sql. - Медиафайлы можно копировать через
rsyncилиtar:
tar -czf /backup/media_$(date +%Y%m%d).tar.gz /var/lib/matrix-synapse/media - Ключ подписи сервера (
homeserver.signing.key) также необходимо сохранить, иначе федерация сломается. - Автоматизацию бэкапов лучше настроить через cron.
- Для инкрементального бэкапа больших медиа-хранилищ используйте
rsync. - При восстановлении убедитесь, что версия Synapse совпадает с той, на которой был сделан бэкап (из-за миграций БД).
- Тестируйте восстановление на тестовом сервере, чтобы убедиться в целостности бэкапов.
Мониторинг и алертинг
- Synapse предоставляет метрики в формате Prometheus на порту 9000 (если включено).
- Включение метрик: добавить
enable_metrics: trueи открыть порт в listeners. - Пример listeners для метрик:
```yaml listeners: - port: 9000 type: metrics bind_addresses: ['127.0.0.1'] ```- Метрики доступны по URL:
http://localhost:9000/_synapse/metrics. - Prometheus может собирать эти метрики, а Grafana — отображать дашборды.
- Ключевые метрики для мониторинга:
- Количество активных пользователей
- Количество отправленных сообщений
- Время отклика API
- Использование памяти и CPU
- Размер базы данных - Для мониторинга логов можно использовать Loki или Elasticsearch.
- Алертинг можно настроить в Prometheus Alertmanager для отправки уведомлений в Telegram/Slack.
Ограничения и лимиты
- Максимальный размер одного сообщения (текст + вложения) ограничен
max_request_size(по умолчанию 50M). - Максимальный размер загружаемого файла —
max_upload_size(по умолчанию 10M, рекомендуется увеличить до 100M+). - Количество пользователей в комнате технически не ограничено, но производительность падает при тысячах участников.
- Для больших комнат рекомендуется использовать архитектуру с выделенными воркерами.
- Количество одновременных подключений к базе данных ограничено параметром
cp_maxв настройках БД. - Скорость отправки сообщений может быть ограничена параметрами
rc_message,rc_loginи другими. - При превышении лимитов Synape возвращает ошибки с кодом 429 (Too Many Requests).
Устаревшие настройки и миграции
- Ранее Synapse использовал
/opt/venvs/matrix-synapseдля виртуального окружения Python. Сейчас пакеты устанавливаются системно. - Если вы видите старые пути в инструкциях (до 2024 года), они могут быть неактуальны.
- Миграция со старой версии на новую обычно описывается в официальном блоге Matrix.org.
- Перед обновлением всегда читайте release notes и проверяйте наличие обязательных миграций БД.
- При обновлении с пропуском нескольких версий могут потребоваться промежуточные обновления.
- Для федерации через порт 443 (вместо 8448) используется делегирование через
-
Справочник по Matrix Synapse (Пункты 301–374)
Сборный: сетевые проблемы в контейнерах, продвинутая диагностика, API, сравнение установок и практические советы
Incus/LXD, Docker и Сетевые Конфликты
- Incus/LXD создает изолированную сеть для контейнеров, что приводит к двойному NAT (Double NAT) и усложняет прохождение WebRTC-трафика.
- В отличие от нативной установки, в контейнере Incus сервис (Synapse/Coturn) видит только свой внутренний IP (например,
10.214.97.46), а не реальный внешний IP хоста. - Это требует обязательной настройки
external-ipв Coturn в форматеexternal-ip=ВНЕШНИЙ_IP/ВНУТРЕННИЙ_IP(например,external-ip=91.221.70.18/10.214.97.46). - Docker и Incus на одном хосте часто конфликтуют, так как оба активно управляют цепочками
iptables, вставляя свои правила в самый верх. - Конфликт с Jitsi — частая проблема, так как Jitsi Videobridge по умолчанию использует порт
10000UDP и может перехватывать трафик, предназначенный для Matrix. - Проверить, какие UDP-порты заняты Docker-контейнерами, можно командой:
sudo ss -lupn | grep docker-proxy. - Чтобы избежать конфликтов, необходимо разносить диапазоны портов для разных сервисов (например, Jitsi —
10000, Matrix —49152-65535). - При использовании Incus стандартные пробросы портов через
incus config device addнеэффективны для больших диапазонов UDP, требуется прямое вмешательство вiptablesна хосте. - Правила
iptables, добавленные вручную, живут только в памяти и исчезают после перезагрузки, если их не сохранить. - Команда для сохранения правил
iptables:sudo netfilter-persistent save(требуется пакетiptables-persistent). - Просмотр сохраненных правил:
cat /etc/iptables/rules.v4.
Глубокая Диагностика Сети и Пакетов
- Если
tcpdumpвнутри контейнера показывает входящие пакеты от клиента, а Coturn в логах молчит — значит, Coturn отклоняет пакеты на уровне приложения. - Самая частая причина такого молчания — блокировка подсети клиента через директиву
denied-peer-ipвturnserver.conf. - Для контейнеров с IP в диапазоне
10.x.x.xкритически важно закомментировать строкуdenied-peer-ip=10.0.0.0-10.255.255.255. - Пакеты могут "стучаться" в порт 3478, но Coturn не считает их валидными STUN-запросами из-за несовпадения
realmили отсутствияfingerprint. - Ошибка "401 Unauthorized" в логах Coturn при попытке звонка — явный признак несовпадения
static-auth-secretв Coturn иturn_shared_secretв Synapse. - Для детальной диагностики WebRTC-соединения в браузере (Element) нужно открыть инструменты разработчика (F12) и изучить вкладку "Network" и "Console".
- Поиск в консоли по словам "ICE", "TURN", "STUN" покажет, какие серверы пытается использовать клиент.
- Если в консоли нет упоминаний вашего TURN-сервера, значит Synapse не отдал клиенту его настройки (проблема в секции
turn_uris). - Команда для проверки, что Synapse "видит" свой TURN-сервер изнутри контейнера:
curl http://localhost:8008/_matrix/client/versions(это не проверит TURN, но проверит работу Synapse).
API Администратора (Практические Примеры)
- Получение короткого токена администратора одной строкой (замените
adminиpassword
TOKEN=$(curl -s -X POST "http://localhost:8008/_matrix/client/r0/login" -H "Content-Type: application/json" -d '{"type":"m.login.password","user":"admin","password":"ПАРОЛЬ"}' | jq -r '.access_token') - Создание алиаса для удобного получения токена:
alias matrix-token='curl -s -X POST http://localhost:8008/_matrix/client/r0/login -d '\''{"type":"m.login.password","user":"admin","password":"ваш_пароль"}'\'' | jq -r .access_token' - Получение списка всех комнат на сервере (осторожно, может быть много):
curl -s "http://localhost:8008/_synapse/admin/v1/rooms?limit=100" -H "Authorization: Bearer $TOKEN" | jq '.rooms[].room_id' - Удаление комнаты (очистка данных):
curl -X DELETE "http://localhost:8008/_synapse/admin/v1/rooms/!room_id:domain" -H "Authorization: Bearer $TOKEN" - Получение статистики по медиафайлам:
curl -s "http://localhost:8008/_synapse/admin/v1/statistics" -H "Authorization: Bearer $TOKEN" | jq . - Просмотр активных сессий пользователя:
curl -s "http://localhost:8008/_synapse/admin/v1/whois/@user:domain" -H "Authorization: Bearer $TOKEN" | jq .devices - Блокировка сервера на уровне федерации (Server ACL) через API — сложная задача, проще через интерфейс комнаты.
- Сброс пароля пользователя через API одной командой (функция оболочки):
``` matrix-passwd() { TOKEN=$(matrix-token) curl -X PUT "http://localhost:8008/_synapse/admin/v2/users/$1" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d "{\"password\": \"$2\"}" } ```Сравнение Способов Установки
- Нативная установка (Debian/Ubuntu) — максимальная простота, лучшая производительность, легкая интеграция с Coturn, но "засоряет" систему и сложнее в изоляции.
- Установка в Docker — хорошая изоляция, легкие обновления, но сложнее с пробросом UDP-портов и работой WebRTC.
- Установка в Incus/LXD — отличная изоляция, удобные снапшоты, но самые большие проблемы с WebRTC из-за двойного NAT.
- YunoHost — максимальная простота для новичков, все работает "из коробки", включая звонки, но меньше гибкости и контроля.
- Вывод: для продакшена с видео/звонками лучше всего подходит нативная установка на хост. Контейнеры хороши для тестов и изолированных сред без VoIP.
Проблемы с PostgreSQL и Базами Данных
- Проверить, использует ли Synapse PostgreSQL, можно командой
ss -antp | grep 5432 | grep python. НаличиеESTABсоединений — признак использования PostgreSQL. - Если в логах нет ошибок, но база данных не растет, возможно, Synapse все еще пишет в SQLite. Проверьте дату изменения файла
/var/lib/matrix-synapse/homeserver.db. - Конфликт между настройками БД в
homeserver.yamlиconf.d/может привести к тому, что Synapse не запустится с ошибкойDuplicate key. - При миграции с SQLite на PostgreSQL дамп SQLite требует ручной корректировки (удаление команд, специфичных для SQLite, например,
BEGIN TRANSACTIONможет дублироваться). - Параметр
cp_minиcp_maxв конфиге БД управляют размером пула соединений. Для больших серверовcp_maxможно увеличить до 20-30.
Практические Команды Администратора (Продолжение)
- Быстрый просмотр последних ошибок в логах Synapse:
journalctl -u matrix-synapse -n 50 -f | grep -i error - Проверка, слушает ли Coturn нужные порты внутри контейнера:
ss -ulnp | grep 3478(UDP) иss -tlnp | grep 3478(TCP). - Проверка версии Synapse из командной строки:
dpkg -l | grep matrix-synapse(для пакетной установки) илиdocker exec synapse pip show matrix-synapse. - Просмотр переменных окружения внутри контейнера Docker:
docker exec synapse env. - Интерактивный вход в контейнер Docker:
docker exec -it synapse /bin/bash. - Просмотр логов конкретного контейнера Docker с временными метками:
docker logs -t synapse. - Остановка всех контейнеров Docker разом (для теста конфликтов):
docker stop $(docker ps -q). - Поиск файлов конфигурации Coturn:
find / -name "turnserver.conf" 2>/dev/null. - Просмотр открытых файлов процессом Coturn:
lsof -p $(pgrep turnserver).
Теория NAT и WebRTC (Почему это сложно)
- STUN позволяет клиенту узнать свой внешний IP и порт, чтобы сообщить их собеседнику для прямого соединения.
- TURN используется, когда прямое соединение невозможно (симметричный NAT, корпоративные файерволы). Сервер ретранслирует трафик.
- ICE — это протокол, который собирает все возможные кандидаты (STUN, TURN, локальные адреса) и пытается установить соединение, перебирая их.
- В контейнере Incus Coturn видит только свой внутренний IP (
10.214.97.46). Безexternal-ipон сообщит клиенту именно его, и клиент не сможет подключиться. - Эффект "пробитого NAT" (UDP Hole Punching) — когда после успешного прохождения одного пакета NAT "запоминает" маршрут и временно открывает его для обратного трафика.
- Именно поэтому иногда "вчера не работало, а сегодня работает": таблица трансляции адресов (conntrack) могла очиститься или, наоборот, зафиксировать успешный проход.
Разное Важное
- При использовании внешнего реверс-прокси (Nginx) в конфиге Synapse обязателен параметр
x_forwarded: trueв секцииlisteners. - Для корректной работы федерации
server_nameв Synapse должен быть именно доменом, а не поддоменом (если вы хотите короткие ID@user:domain.com). Иначе используйте.well-knownделегирование. - Параметр
max_upload_sizeизмеряется в байтах.50M= 50 * 1024 * 1024 = 52428800. - При изменении
server_nameна уже работающем сервере все существующие пользователи и комнаты "сломаются", так как их ID привязаны к старому имени. - Synapse поддерживает ротацию логов. Настройки ротации находятся в
/etc/logrotate.d/matrix-synapse. - Для мониторинга можно использовать готовый дашборд Grafana для Synapse (например, из официального репозитория).
- Ошибка "Connection refused" при попытке
curlс хоста в контейнер почти всегда означает, что сервис внутри контейнера слушает только127.0.0.1, а не0.0.0.0. - Команда для изменения
bind_addressesв Synapse внутри контейнера: отредактировать файл в/conf.d/или изменить основной конфиг. - Файл
/etc/matrix-synapse/conf.d/server_name.yamlсоздается автоматически при установке из пакета и содержит толькоserver_name: "ваш.домен". - Не рекомендуется редактировать этот файл, если вы уже указали домен при установке. Для изменения домена проще переустановить сервер.
- Параметр
enable_registration_captchaвключает капчу при регистрации. Требует настройки ReCaptcha от Google. - Для использования капчи нужно получить ключи на сайте Google ReCaptcha и указать их в конфиге.
- Модули Synapse (spam checker, 3pid providers) расширяют функциональность сервера и настраиваются в секции
modules. - Официальная документация Synapse — лучший источник информации: https://element-hq.github.io/synapse/latest/.
- Сообщество Matrix в Telegram (@matrix_ru) — отличное место для получения помощи на русском языке.
Итоговые проверки работоспособности
- Финальная проверка федерации без внешних тестеров: с одного сервера пригласить пользователя с другого сервера и отправить сообщение.
- Финальная проверка звонков: позвонить с пользователя на одном сервере пользователю на другом сервере.
- Проверка логирования: убедиться, что логи пишутся и не забивают диск.
- Проверка автоматического запуска:
systemctl is-enabled matrix-synapseиsystemctl is-enabled coturn. - Проверка открытых портов снаружи: использовать онлайн-сервисы вроде
yougetsignal.comилиportchecker.co. - Проверка валидности SSL-сертификата:
openssl s_client -connect matrix.domain.com:443 -servername matrix.domain.com < /dev/null 2>/dev/null | openssl x509 -text | grep -A2 Validity.