Подготовка
Требования:
-
Чистый сервер Ubuntu (22.04 / 24.04).
-
Домен (в примере: example.com).
-
DNS записи (A-записи):
-
matrix.example.com -> IP сервера (Сервер Synapse)
-
chat.example.com -> IP сервера (Клиент Element)
-
turn.example.com -> IP сервера (для красоты, можно использовать IP)
-
Шаг 1: Установка свежего Docker
Не используйте старые версии из репозитория 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
Шаг 2: Структура и Секреты
-
Создаем папку:
mkdir -p matrix-stack/{caddy,synapse-data,postgres-data} cd matrix-stack-
Генерируем секреты (пароли). Выполните команду openssl rand -hex 32 три раза и сохраните результаты куда-нибудь в блокнот. Назовем их:
-
POSTGRES_PASS (пароль базы)
-
TURN_SECRET (для звонков)
-
REG_SECRET (для регистрации пользователей)
-
Шаг 3: Файл docker-compose.yml
Создайте файл 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:Шаг 4: Конфигурация Element (element-config.json)
Создайте файл 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" } }Шаг 5: Настройка Caddy (Caddyfile)
Создайте файл 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 }Шаг 6: Генерация и настройка Synapse
-
Генерация конфига:
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Шаг 7: Запуск
Запускаем всё и сразу:
docker compose up -dШаг 8: Создание пользователя и выдача Админа
Так как мы убрали веб-админку, делаем всё через консоль (это нужно сделать один раз).
-
Создаем пользователя:
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';"Шаг 9: Использование
-
Зайдите на https://chat.example.com.
-
Войдите под созданным пользователем.
-
Проверка звонков:
-
Зайдите в Настройки -> Голосовая и видеосвязь.
-
Если видите "Ближайший VoIP-релей: coturn" (или ваш IP) — всё работает через сервер.
-
Готово! У вас настроен стабильный сервер Matrix без лишних зависимостей.
-
