Synapse matrix Ubuntu 24

Linux admin

Обсуждение тут

Ставим пакеты и зависимости

sudo apt update
sudo apt install -y lsb-release wget curl gnupg apt-transport-https python3-venv python3-dev build-essential libffi-dev libssl-dev python3-pip python3-setuptools postgresql postgresql-contrib libpq-dev libjpeg-dev libxslt1-dev zlib1g-dev libyaml-dev coturn

Создаём пользователя и директории для работы

udo adduser --system --home /var/lib/matrix-synapse --group synapse
sudo mkdir -p /etc/matrix-synapse /var/lib/matrix-synapse /var/log/matrix-synapse
sudo chown -R synapse:synapse /etc/matrix-synapse /var/lib/matrix-synapse /var/log/matrix-synapse

Создаем базу

sudo -u postgres psql <<EOF
CREATE USER synapse WITH PASSWORD 'StrongPassHere';
CREATE DATABASE synapse ENCODING 'UTF8' LC_COLLATE='C' LC_CTYPE='C' template=template0 OWNER synapse;
\q
EOF

Питоновое окружение

sudo -u synapse -i
cd /var/lib/matrix-synapse
python3 -m venv env
source env/bin/activate
pip install --upgrade pip setuptools wheel
pip install matrix-synapse[all]
deactivate
exit

Конфиг синапс в /etc/matrix-synapse/homeserver.yaml

---
server_name: "mysite.ru"
pid_file: /var/run/matrix-synapse.pid

listeners:
  - port: 8008
    tls: false
    type: http
    x_forwarded: true
    bind_addresses: ['127.0.0.1', '::1', 'ip-matrix.server']
    resources:
      - names: [client, federation]
        compress: false

database:
  name: psycopg2
  args:
    user: synapse
    password: StrongPassHere
    database: synapse
    host: localhost
    cp_min: 5
    cp_max: 10

log_config: "/etc/matrix-synapse/log.config"
media_store_path: "/var/lib/matrix-synapse/media"

macaroon_secret_key: "RANDOM_SECRET_STRING"
form_secret: "RANDOM_FORM_SECRET"
signing_key_path: "/etc/matrix-synapse/my-handbook.ru.signing.key"

trusted_key_servers:
  - server_name: "matrix.org"

turn_uris:
  - "turn:mysite.ru:3478?transport=udp"
  - "turn:mysite.ru:3478?transport=tcp"
turn_shared_secret: "CHANGE_THIS_SECRET"

enable_registration: true
enable_registration_without_verification: true

report_stats: true

Systemd unit Synapse /etc/systemd/system/matrix-synapse.service

[Unit]
Description=Matrix Synapse homeserver
After=network.target postgresql.service

[Service]
Type=simple
User=synapse
Group=synapse
WorkingDirectory=/var/lib/matrix-synapse
ExecStart=/var/lib/matrix-synapse/env/bin/python -m synapse.app.homeserver --config-path /etc/matrix-synapse/homeserver.yaml
Restart=on-failure
SyslogIdentifier=matrix-synapse

[Install]
WantedBy=multi-user.target

Настройка coturn /etc/turnserver.conf

no-rfc5780
no-stun-backward-compatibility
response-origin-only-with-rfc5780

total-quota=100
bps-capacity=0

listening-port=3478
tls-listening-port=5349

denied-peer-ip=0.0.0.0-0.255.255.255
denied-peer-ip=10.0.0.0-10.255.255.255
denied-peer-ip=100.64.0.0-100.127.255.255
denied-peer-ip=127.0.0.0-127.255.255.255
denied-peer-ip=169.254.0.0-169.254.255.255
denied-peer-ip=172.16.0.0-172.31.255.255
denied-peer-ip=192.0.0.0-192.0.0.255
denied-peer-ip=192.0.2.0-192.0.2.255
denied-peer-ip=192.88.99.0-192.88.99.255
denied-peer-ip=192.168.0.0-192.168.255.255
denied-peer-ip=198.18.0.0-198.19.255.255
denied-peer-ip=198.51.100.0-198.51.100.255
denied-peer-ip=203.0.113.0-203.0.113.255
denied-peer-ip=240.0.0.0-255.255.255.255

fingerprint
use-auth-secret
static-auth-secret=CHANGE_THIS_SECRET
realm=matrix.domain.name

stale-nonce
no-loopback-peers
no-multicast-peers

Включаем и стартуем юниты

sudo systemctl daemon-reload
sudo systemctl enable --now coturn matrix-synapse

Проверяем синапс локально с самого сервера

curl http://127.0.0.1:8008/_matrix/client/versions

Как оборачивать nginx вспоминай сам)

скрипт для управления пользователями и очисткой медиа директории

#!/bin/bash
# matrix-admin.sh — утилита для управления пользователями Synapse Matrix

MATRIX_URL="http://ip_matrix:8008"
ADMIN_TOKEN="admin token"   # вставь сюда токен суперадмина

# === функции ===

create_user() {
    local USERNAME=$1
    local PASSWORD=$2
    curl -s -X POST "$MATRIX_URL/_synapse/admin/v2/users/@${USERNAME}:my-handbook.ru" \
        -H "Authorization: Bearer $ADMIN_TOKEN" \
        -H "Content-Type: application/json" \
        -d "{
            \"password\": \"${PASSWORD}\",
            \"admin\": false,
            \"deactivated\": false
        }" | jq
}

delete_user() {
    local USERNAME=$1
    curl -s -X POST "$MATRIX_URL/_synapse/admin/v1/deactivate/@${USERNAME}:my-handbook.ru" \
        -H "Authorization: Bearer $ADMIN_TOKEN" \
        -H "Content-Type: application/json" \
        -d '{"erase": true}' | jq
}

make_admin() {
    local USERNAME=$1
    curl -s -X PUT "$MATRIX_URL/_synapse/admin/v2/users/@${USERNAME}:my-handbook.ru/admin" \
        -H "Authorization: Bearer $ADMIN_TOKEN" \
        -H "Content-Type: application/json" \
        -d '{"admin": true}' | jq
}

list_users() {
    curl -s -X GET "$MATRIX_URL/_synapse/admin/v2/users?from=0&limit=50" \
        -H "Authorization: Bearer $ADMIN_TOKEN" | jq
}

cleanup() {
    local DAYS=${1:-90}   # по умолчанию 90 дней, можно передать первым аргументом
    local BEFORE_TS=$(date -d "$DAYS days ago" +%s000)

    curl -s -X POST "$MATRIX_URL/_synapse/admin/v1/purge_media_cache?before_ts=$BEFORE_TS" \
        -H "Authorization: Bearer $ADMIN_TOKEN" | jq
}

# === запуск ===
case "$1" in
    create) create_user "$2" "$3" ;;   # ./matrix-admin.sh create username password
    delete) delete_user "$2" ;;        # ./matrix-admin.sh delete username
    admin) make_admin "$2" ;;          # ./matrix-admin.sh admin username
    list) list_users ;;                # ./matrix-admin.sh list
    cleanup) cleanup "$2" ;;           # ./matrix-admin.sh cleanup [days]
    *)
        echo "Использование: $0 {create username password|delete username|admin username|list|cleanup [days]}"
        ;;
esac

Токен суперадмина получаешь так(если учетка суперадмин)

curl -X POST "http://ip_matrix:8008/_matrix/client/v3/login" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "m.login.password",
    "user": "admin_user",
    "password": "SuperSecurePassword"
  }'

Чтобы стать суперадмином

Способ 1. Через базу PostgreSQL

Подключись к БД (у тебя она называется synapse):

sudo -u postgres psql synapse

Посмотри, как называется твой пользователь (например @youre_name:my-handbook.ru):

SELECT name, admin FROM users;

Сделай его админом:

UPDATE users SET admin = 1 WHERE name = '@youre_name:my-handbook.ru';

Проверь:

SELECT name, admin FROM users WHERE name = '@youre_name:my-handbook.ru';

Если admin = t (true) или 1, значит учётка теперь суперпользователь.
Выход из psql:

\q

🔑 Способ 2. Через встроенный скрипт Synapse

(если у тебя свежая версия ≥ 1.50)

sudo -u synapse /opt/synapse/env/bin/python -m synapse.app.homeserver \
  --config-path /etc/matrix-synapse/homeserver.yaml \
  promote_user --user-id @youre_name:my-handbook.ru