Synapse

Налаштування та адміністрування Matrix Synapse сервера.

Архітектура

flowchart TB
    subgraph Clients ["Клієнти"]
        Element[📱 Element]
        Other[📱 Інші клієнти]
    end

    subgraph Synapse ["Matrix Synapse Server"]
        API[Client-Server API<br/>:8008]
        Fed[Federation API<br/>:8448]
        Media[Media Store]
    end

    subgraph Backend ["Backend"]
        DB[(PostgreSQL)]
        MAS[MAS<br/>Authentication]
    end

    subgraph External ["Зовнішні сервери"]
        Matrix[matrix.org]
        Other2[інші сервери]
    end

    Element -->|HTTPS| API
    Other -->|HTTPS| API
    API <--> DB
    API <--> MAS
    Fed <-->|Federation| Matrix
    Fed <-->|Federation| Other2
    API --> Media

    style API fill:#3b82f6,color:#fff
    style Fed fill:#22c55e,color:#fff

Встановлення

Docker Compose

version: '3.8'

services:
  synapse:
    image: matrixdotorg/synapse:latest
    container_name: synapse
    restart: unless-stopped
    environment:
      - SYNAPSE_SERVER_NAME=matrix.example.com
      - SYNAPSE_REPORT_STATS=no
    volumes:
      - synapse-data:/data
    ports:
      - "8008:8008"
      - "8448:8448"

  postgres:
    image: postgres:15
    restart: unless-stopped
    environment:
      POSTGRES_USER: synapse
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: synapse
      POSTGRES_INITDB_ARGS: "--encoding=UTF8 --lc-collate=C --lc-ctype=C"
    volumes:
      - postgres-data:/var/lib/postgresql/data

volumes:
  synapse-data:
  postgres-data:

Генерація конфігурації

docker run -it --rm \
  -v synapse-data:/data \
  -e SYNAPSE_SERVER_NAME=matrix.example.com \
  -e SYNAPSE_REPORT_STATS=no \
  matrixdotorg/synapse:latest generate

Конфігурація

homeserver.yaml

server_name: "matrix.example.com"
pid_file: /data/homeserver.pid

listeners:
  - port: 8008
    tls: false
    type: http
    x_forwarded: true
    resources:
      - names: [client, federation]
        compress: false

database:
  name: psycopg2
  args:
    user: synapse
    password: ${POSTGRES_PASSWORD}
    database: synapse
    host: postgres
    cp_min: 5
    cp_max: 10

log_config: "/data/matrix.example.com.log.config"

media_store_path: /data/media_store
uploads_path: /data/uploads

registration_shared_secret: "your-secret-here"

enable_registration: false
enable_registration_without_verification: false

trusted_key_servers:
  - server_name: "matrix.org"

Налаштування для MAS

# Вимкнути вбудовану авторизацію
password_config:
  enabled: false

# Делегувати на MAS
experimental_features:
  msc3861:
    enabled: true
    issuer: https://auth.example.com/
    client_id: synapse
    client_auth_method: client_secret_basic
    client_secret: ${MAS_CLIENT_SECRET}
    admin_token: ${MAS_ADMIN_TOKEN}

Federation

flowchart LR
    subgraph YourServer ["example.com"]
        Synapse1[Synapse]
    end

    subgraph OtherServers ["Федерація"]
        Matrix[matrix.org]
        Element[element.io]
        Other[...]
    end

    Synapse1 <-->|Federation<br/>:8448| Matrix
    Synapse1 <-->|Federation| Element
    Synapse1 <-->|Federation| Other

    User1[👤 @user:example.com]
    User2[👤 @friend:matrix.org]

    User1 -->|повідомлення| Synapse1
    Synapse1 -->|доставка| Matrix
    Matrix -->|доставка| User2

Налаштування делегації

DNS SRV запис:

_matrix._tcp.example.com. 3600 IN SRV 10 5 443 matrix.example.com.

Або через .well-known:

# /.well-known/matrix/server
{
  "m.server": "matrix.example.com:443"
}

# /.well-known/matrix/client
{
  "m.homeserver": {
    "base_url": "https://matrix.example.com"
  }
}

Перевірка federation

# Перевірити federation через API
curl https://federationtester.matrix.org/api/report?server_name=example.com

# Локальна перевірка
curl -X GET "https://matrix.example.com/_matrix/federation/v1/version"

Проблеми з federation

Проблема Причина Рішення
Не видно сервер DNS/порти Перевірити SRV та 443
Сертифікат Недійсний SSL Перевірити Let's Encrypt
Timeout Firewall Відкрити 8448

Корисні команди

Користувачі

# Створити адміна
docker exec -it synapse register_new_matrix_user \
  -u admin -p password -a \
  -c /data/homeserver.yaml \
  http://localhost:8008

# Список користувачів
curl -s -H "Authorization: Bearer $TOKEN" \
  "http://localhost:8008/_synapse/admin/v2/users" | jq

# Деактивувати користувача
curl -X POST \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"erase": true}' \
  "http://localhost:8008/_synapse/admin/v1/deactivate/@user:example.com"

Кімнати

# Список кімнат
curl -s -H "Authorization: Bearer $TOKEN" \
  "http://localhost:8008/_synapse/admin/v1/rooms" | jq

# Видалити кімнату
curl -X DELETE \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"purge": true}' \
  "http://localhost:8008/_synapse/admin/v2/rooms/!room:example.com"

Медіа

# Очистити віддалений кеш (старше 7 днів)
curl -X POST \
  -H "Authorization: Bearer $TOKEN" \
  "http://localhost:8008/_synapse/admin/v1/purge_media_cache?before_ts=$(date -d '7 days ago' +%s)000"

# Розмір медіа
du -sh /data/media_store

Моніторинг

Health check

curl http://localhost:8008/health

Метрики

# homeserver.yaml
enable_metrics: true
metrics_port: 9000
curl http://localhost:9000/metrics

Backup

Бази даних

# PostgreSQL dump
docker exec postgres pg_dump -U synapse synapse > synapse_backup.sql

# Відновлення
cat synapse_backup.sql | docker exec -i postgres psql -U synapse synapse

Медіа файли

# Backup media
tar -czvf media_backup.tar.gz /var/lib/docker/volumes/synapse-data/_data/media_store

# Signing keys (КРИТИЧНО!)
cp /data/*.signing.key /backup/

Оновлення

# Зупинити
docker compose stop synapse

# Оновити образ
docker compose pull synapse

# Запустити
docker compose up -d synapse

# Перевірити логи
docker compose logs -f synapse

Troubleshooting

Federation test з matrix.org не проходить (Unable to verify signature / No connection)
- Симптом: на https://federationtester.matrix.org помилка Connection Refused, DNSSRVRecordFailure або Unverified signature; інші сервери не бачать наших кімнат.
- Причина: неправильно налаштований .well-known/matrix/server (повертає HTML/404 замість JSON); SRV-запис _matrix._tcp.domain відсутній або конфліктує з well-known; Caddy/nginx reverse proxy не передає Host header; server_name у homeserver.yaml не співпадає з доменом.
- Рішення: перевірка: curl -v https://domain/.well-known/matrix/server має повертати {"m.server": "matrix.domain:443"} з Content-Type: application/json. dig SRV _matrix._tcp.domain. Федераційний порт 8448 має бути відкритий, або використовувати well-known + 443. TLS cert має покривати matrix.domain (не лише domain). Див. federation та Federation setup.

State resolution OOM — Synapse падає під час join у велику кімнату
- Симптом: при спробі приєднатися до кімнати типу #matrix:matrix.org контейнер synapse вбито (OOMKilled), journalctl показує MemoryError або Killed; worker рестартиться у петлі.
- Причина: state resolution v2 для кімнат з тисячами учасників і складним event graph вимагає багато RAM (5-10GB); один main process намагається робити все.
- Рішення: переключитися на PostgreSQL (не SQLite!) якщо ще ні. Увімкнути workers (federation_reader, federation_sender, synchrotron) — див. synapse. Збільшити deploy.resources.limits.memory у docker-compose.yml до 8G+. Для Docker: docker update --memory 8g synapse. У homeserver.yaml: caches: global_factor: 0.5 (знизити якщо мало RAM). Моніторинг: Grafana + synapse_util_caches_cache_size.

База даних роздувається (event_json > 100GB), slow queries
- Симптом: PostgreSQL volume переповнюється; /sync повільний; backup займає години; event_json і state_groups_state — найбільші таблиці.
- Причина: history_retention не налаштовано; state groups не компресуються; медіафайли зберігаються вічно; відсутній VACUUM.
- Рішення: увімкнути retention у homeserver.yaml: retention: enabled: true, default_policy: {min_lifetime: 1d, max_lifetime: 1y}. Запустити state compressor: rust-synapse-compress-state (може зменшити БД на 40-80%). Purge history: POST /_synapse/admin/v1/rooms/{room_id}/purge_history. Очистка медіа: POST /_synapse/admin/v1/media/{server_name}/delete?before_ts=.... Регулярний VACUUM ANALYZE у cron. Докладніше в Matrix адміністрування.

VoIP/відеодзвінки не працюють через NAT (TURN issues)
- Симптом: голосові/відеодзвінки в element з'єднуються, але без звуку/відео; one-way audio; дзвінки працюють у LAN, не працюють через інтернет.
- Причина: coturn не налаштований або недосяжний; firewall блокує UDP 49152-65535 (media relay); turn_shared_secret у Synapse не співпадає з coturn; публічна IP coturn за NAT без external-ip.
- Рішення: перевірка: https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/ з TURN URI turn:domain:3478?transport=udp і shared secret. У /etc/turnserver.conf: external-ip=PUBLIC_IP/PRIVATE_IP, min-port=49152, max-port=65535, use-auth-secret, static-auth-secret=.... Відкрити у firewall: TCP/UDP 3478, TCP 5349 (TLS), UDP 49152-65535. У homeserver.yaml: turn_uris, turn_shared_secret мають збігатися. Рестарт: systemctl restart coturn matrix-synapse.

Пов'язані статті

Шлях: services/matrix/synapse.md

UMTC Wiki © 2026 | Ukrainian Military Tactical Communications