Требования:
Чистый сервер Ubuntu (22.04 / 24.04).
Домен (в примере: example.com).
DNS записи (A-записи):
matrix.example.com -> IP сервера (Сервер Synapse)
chat.example.com -> IP сервера (Клиент Element)
turn.example.com -> IP сервера (для красоты, можно использовать IP)
Не используйте старые версии из репозитория Ubuntu.
# Удаляем старое
sudo apt-get remove docker docker-engine docker.io containerd runc
# Ставим ключи и репозиторий
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Ставим Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Запускаем
sudo systemctl enable --now docker
Создаем папку:
mkdir -p matrix-stack/{caddy,synapse-data,postgres-data}
cd matrix-stack
Генерируем секреты (пароли). Выполните команду openssl rand -hex 32 три раза и сохраните результаты куда-нибудь в блокнот. Назовем их:
POSTGRES_PASS (пароль базы)
TURN_SECRET (для звонков)
REG_SECRET (для регистрации пользователей)
Создайте файл nano docker-compose.yml.
Замените значения:
YOUR_REAL_IP — внешний IP вашего сервера.
turn.example.com — ваш домен (или тот же IP).
Пароли и секреты на сгенерированные выше.
services:
# --- Reverse Proxy (Caddy) ---
caddy:
image: caddy:latest
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_dаta:/data
- caddy_config:/config
networks:
- matrix-net
# --- Database (Postgres) ---
postgres:
image: postgres:15
restart: unless-stopped
environment:
POSTGRES_DB: synapse
POSTGRES_USER: synapse
POSTGRES_PASSWORD: "YOUR_POSTGRES_PASSWORD" # <--- ПАРОЛЬ 1
POSTGRES_INITDB_ARGS: "--encoding=UTF-8 --lc-collate=C --lc-ctype=C"
volumes:
- ./postgres-dаta:/var/lib/postgresql/data
networks:
- matrix-net
# --- Matrix Server (Synapse) ---
synapse:
image: matrixdotorg/synapse:latest
restart: unless-stopped
environment:
- SYNAPSE_CONFIG_PATH=/data/homeserver.yaml
volumes:
- ./synapse-dаta:/data
networks:
- matrix-net
depends_on:
- postgres
# --- TURN Server (Coturn) - Звонки ---
coturn:
image: coturn/coturn:latest
restart: unless-stopped
network_mode: "host" # Критично для звонков
command:
- -n
- --log-file=stdout
- --min-port=49152
- --max-port=49200
- --realm=turn.example.com # <--- ВАШ ДОМЕН
- --listening-port=3478
- --tls-listening-port=5349
- --external-ip=YOUR_REAL_IP # <--- ОБЯЗАТЕЛЬНО ВНЕШНИЙ IP СЕРВЕРА
- --use-auth-secret
- --static-auth-secret=YOUR_TURN_SECRET # <--- СЕКРЕТ 2
- --no-cli
# --- Web Client (Element) ---
element:
image: vectorim/element-web:latest
restart: unless-stopped
volumes:
- ./element-config.json:/app/config.json
networks:
- matrix-net
volumes:
caddy_dаta:
caddy_config:
networks:
matrix-net:
Создайте файл nano element-config.json.
Это исправит ошибку MISSING_MATRIX_RTC_FOCUS, отключив экспериментальные функции.
Замените домены на свои:
{
"default_server_config": {
"m.homeserver": {
"base_url": "https://matrix.example.com",
"server_name": "matrix.example.com"
},
"m.identity_server": {
"base_url": "https://vector.im"
}
},
"brand": "Element",
"show_labs_settings": true,
"features": {
"feature_element_call_video_rooms": false,
"feature_group_calls": false,
"feature_video_rooms": false,
"feature_new_group_call_experience": false,
"feature_call_only_mode": false
},
"element_call": {
"url": null
},
"jitsi": {
"preferredDomain": "jitsi.riot.im"
}
}
Создайте файл nano Caddyfile.
# --- 1. Synapse (Сервер) ---
matrix.example.com {
encode zstd gzip
# Если открыли корень сервера -> редирект в чат
redir / https://chat.example.com 302
# Проксирование API
reverse_proxy /_matrix/* synapse:8008
reverse_proxy /_synapse/* synapse:8008
# Автонастройка клиентов (.well-known)
handle /.well-known/matrix/client {
header Content-Type application/json
header Access-Control-Allow-Origin *
respond `{"m.homeserver": {"base_url": "https://matrix.example.com"}}`
}
handle /.well-known/matrix/server {
header Content-Type application/json
respond `{"m.server": "matrix.example.com:443"}`
}
}
# --- 2. Федерация (Общение с другими серверами) ---
matrix.example.com:8448 {
reverse_proxy synapse:8008
}
# --- 3. Element (Клиент) ---
chat.example.com {
encode zstd gzip
reverse_proxy element:80
}
Генерация конфига:
docker compose run --rm -e SYNAPSE_SERVER_NAME=matrix.example.com -e SYNAPSE_REPORT_STATS=no synapse generate
(Замените matrix.example.com на ваш домен Synapse)
Редактирование synapse-data/homeserver.yaml:
Откройте созданный файл и измените следующие блоки:
А. URL:
Добавьте в начало файла:
public_baseurl: "https://matrix.example.com"
Б. База данных:
database:
name: psycopg2
args:
user: synapse
password: "YOUR_POSTGRES_PASSWORD" # <--- ПАРОЛЬ 1
database: synapse
host: postgres
cp_min: 5
cp_max: 10
В. Звонки (TURN):
Найдите turn_uris и сделайте так:
turn_uris:
- "turn:YOUR_REAL_IP:3478?transport=udp"
- "turn:YOUR_REAL_IP:3478?transport=tcp"
- "turns:YOUR_REAL_IP:5349?transport=udp"
- "turns:YOUR_REAL_IP:5349?transport=tcp"
turn_shared_secret: "YOUR_TURN_SECRET" # <--- СЕКРЕТ 2 (тот же, что в docker-compose)
turn_user_lifetime: 86400000
turn_allow_guests: True
Г. Регистрация и права:
В конце файла:
enable_registration: false # Закрываем свободную регистрацию
registration_shared_secret: "YOUR_REG_SECRET" # <--- СЕКРЕТ 3
Запускаем всё и сразу:
docker compose up -d
Так как мы убрали веб-админку, делаем всё через консоль (это нужно сделать один раз).
Создаем пользователя:
docker compose exec synapse register_new_matrix_user -c /data/homeserver.yaml http://localhost:8008
User: admin
Password: ваш_супер_пароль
Make admin: yes
Если забыли сделать админом при создании:
Можно выдать права через базу данных:
docker compose exec postgres psql -U synapse -c "UPDATE users SET admin = 1 WHERE name = '@admin:matrix.example.com';"
Зайдите на https://chat.example.com.
Войдите под созданным пользователем.
Проверка звонков:
Зайдите в Настройки -> Голосовая и видеосвязь.
Если видите "Ближайший VoIP-релей: coturn" (или ваш IP) — всё работает через сервер.
Готово! У вас настроен стабильный сервер Matrix без лишних зависимостей.
Нет комментариев.
Операция выполнена успешно.