любезно подготовил ИИ
Это сложная задача, так как мы объединяем несколько тяжеловесных сервисов. Чтобы это работало стабильно, нам нужно правильно настроить DNS, SSL (через Caddy) и взаимодействие контейнеров.
Ниже представлена подробная инструкция по развертыванию стека: Matrix (Synapse) + PostgreSQL + Element + Synapse Admin + Coturn (TURN сервер) + Caddy. admin панель
Jitsi мы развернем рядом (официальный метод), так как он требует сложной конфигурации сети, и смешивать его в один docker-compose файл не рекомендуется (сложно обновлять). Но мы настроим Element на работу с ним.
VPS/Сервер: Ubuntu 20.04/22.04 (минимум 4GB RAM, желательно 8GB).
Домен: Допустим, ваш домен example.com. Вам нужно настроить DNS записи (A-записи) на IP вашего сервера:
matrix.example.com (Сервер Synapse)
chat.example.com (Клиент Element)
admin.example.com (Админ панель)
turn.example.com (TURN сервер для звонков 1-на-1)
meet.example.com (Jitsi для групповых звонков)
Docker и Docker Compose: Должны быть установлены.
Зайдите на сервер и создайте директорию:
mkdir -p /opt/matrix-stack/caddy
mkdir -p /opt/matrix-stack/synapse
mkdir -p /opt/matrix-stack/postgres
mkdir -p /opt/matrix-stack/element
cd /opt/matrix-stack
Создайте общую сеть для контейнеров:
docker network create matrix_net
Перед запуском основного файла нужно сгенерировать конфиг для Matrix.
Замените matrix.example.com на ваш домен Matrix.
docker run -it --rm \
-v /opt/matrix-stack/synapse:/data \
-e SYNAPSE_SERVER_NAME=matrix.example.com \
-e SYNAPSE_REPORT_STATS=no \
matrixdotorg/synapse:latest generate
Это создаст файл homeserver.yaml в папке /opt/matrix-stack/synapse. Мы отредактируем его позже.
Нам нужен секретный ключ для защиты сервера звонков. Выполните команду:
openssl rand -hex 32
Скопируйте полученную строку. Назовем её TURN_SECRET.
Создайте файл docker-compose.yml в папке /opt/matrix-stack/.
Важно: Замените example.com и пароли на свои. Вставьте TURN_SECRET там, где указано.
version: '3.8'
services:
# --- Reverse Proxy (SSL) ---
caddy:
image: caddy:latest
container_name: caddy
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./caddy/Caddyfile:/etc/caddy/Caddyfile
- caddy_dаta:/data
- caddy_config:/config
# Если вы создали manual.html
- ./caddy:/var/www/html
networks:
- matrix_net
# --- Database ---
postgres:
image: postgres:15-alpine
container_name: postgres
restart: always
environment:
POSTGRES_USER: synapse
POSTGRES_PASSWORD: 14001402aAA!
POSTGRES_DB: synapse
POSTGRES_INITDB_ARGS: "--encoding=UTF-8 --lc-collate=C --lc-ctype=C"
volumes:
- ./postgres:/var/lib/postgresql/data
networks:
- matrix_net
# --- Matrix Server ---
synapse:
image: matrixdotorg/synapse:latest
container_name: synapse
restart: always
volumes:
- ./synapse:/data
environment:
- UID=991
- GID=991
networks:
- matrix_net
depends_on:
- postgres
# --- Element Web Client ---
element:
image: vectorim/element-web:latest
container_name: element
restart: always
volumes:
- ./element/config.json:/app/config.json
networks:
- matrix_net
# --- Synapse Admin Panel ---
synapse-admin:
image: awesometechnologies/synapse-admin:latest
container_name: synapse-admin
restart: always
networks:
- matrix_net
# --- TURN Server (Coturn) ---
coturn:
image: coturn/coturn:latest
container_name: coturn
restart: always
network_mode: "host"
command:
- -n
- --log-file=stdout
- --min-port=49152
- --max-port=49172
- --realm=site.cc
- --listening-port=3478
- --tls-listening-port=5349
- --use-auth-secret
- --static-auth-secret=322177c853c250e91f3e82a3f2e8edefd43d990d054597fdecb6a4b90e67992bb6
# --- Redis (Для LiveKit) ---
#redis:
#image: redis:6-alpine
#container_name: redis
#restart: always
#ports:
# - "127.0.0.1:6379:6379" # Открываем порт для LiveKit (который теперь в host mode)
#networks:
# - matrix_net
# --- LiveKit Server (Host Mode для скорости) ---
#livekit:
# image: livekit/livekit-server:latest
#container_name: livekit
#restart: always
#command: --config /etc/livekit.yaml
#volumes:
# - ./livekit/livekit.yaml:/etc/livekit.yaml
#network_mode: "host" # <--- РЕШЕНИЕ ПРОБЛЕМЫ С ТАЙМАУТОМ
#depends_on:
# - redis
# --- Element Call ---
#element-call:
# image: ghcr.io/element-hq/element-call:latest # <--- ИСПРАВЛЕННЫЙ ОБРАЗ
# container_name: element-call
# restart: always
# environment:
# - LIVEKIT_LIVE_KIT_SERVER_URL=https://livekit.evilfox.pp.ua
# networks:
# - matrix_net
volumes:
caddy_dаta:
caddy_config:
networks:
matrix_net:
external: true
Создайте файл /opt/matrix-stack/caddy/Caddyfile.
Caddy автоматически получит SSL сертификаты.если не сработало у вас скопируйте внизу готовый конфиг
# Matrix Federation & Client API
matrix.example.com {
reverse_proxy synapse:8008
}
# Element Web Interface
chat.example.com {
reverse_proxy element:80
}
# Admin Panel
admin.example.com {
reverse_proxy synapse-admin:80
}
# TURN (только для верификации, если нужно, сам трафик идет через порты Coturn)
turn.example.com {
respond "TURN Server is running"
}
Отредактируйте файл /opt/matrix-stack/synapse/homeserver.yaml.
Вам нужно изменить несколько секций:
База данных (Postgres):
Найдите секцию database и замените sqlite на:
database:
name: psycopg2
args:
user: synapse
password: StrongDbPassword123! # Тот же, что в docker-compose
database: synapse
host: postgres
cp_min: 5
cp_max: 10
Включение регистрации (опционально):
enable_registration: true если нет капчи отключите
Настройка Public Base URL:
Добавьте/раскомментируйте:
public_baseurl: "https://matrix.example.com"
Настройка TURN (для звонков 1-на-1 через Element):
Это критически важно для видео/аудио. Найдите секцию turn_uris.
turn_uris:
- "turn:turn.example.com:3478?transport=udp"
- "turn:turn.example.com:3478?transport=tcp"
turn_shared_secret: "ВАШ_TURN_SECRET_ИЗ_ШАГА_3"
turn_user_lifetime: 86400000
turn_allow_guests: true
Слушатели (Listeners):
Убедитесь, что порт 8008 слушает на 0.0.0.0 и x_forwarded: true.
listeners:
- port: 8008
tls: false
type: http
x_forwarded: true
bind_addresses: ['0.0.0.0']
resources:
- names: [client, federation]
compress: false
Создайте файл /opt/matrix-stack/element/config.json.
Это укажет Элементу, куда подключаться.
{
"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": "My Element",
"integrations_ui_url": "https://scalar.vector.im/",
"integrations_rest_url": "https://scalar.vector.im/api",
"integrations_widgets_urls": [
"https://scalar.vector.im/_matrix/integrations/v1",
"https://scalar.vector.im/api",
"https://scalar-staging.vector.im/_matrix/integrations/v1",
"https://scalar-staging.vector.im/api",
"https://scalar-staging.riot.im/scalar/api"
],
"jitsi": {
"preferredDomain": "meet.example.com"
}
}
Обратите внимание на блок "jitsi", здесь мы указываем домен Jitsi, который установим на следующем шаге.
Находясь в папке /opt/matrix-stack, запустите:
docker-compose up -d
Проверьте логи: docker-compose logs -f. Если все хорошо, через минуту matrix.example.com, chat.example.com и admin.example.com должны открываться с HTTPS.
Jitsi — очень сложная система (5-6 контейнеров). Лучше всего использовать их официальный репозиторий отдельно, чтобы не ломать конфиг Matrix.
Выйдите из папки стека и скачайте Jitsi:
cd /opt
git clone https://github.com/jitsi/docker-jitsi-meet
cd docker-jitsi-meet
Создайте .env файл из примера:
cp env.example .env
Настройте .env:
nano .env
Измените следующие параметры:
HTTP_PORT=8000 (Меняем стандартный 80, так как он занят Caddy)
HTTPS_PORT=8443 (Меняем 443, он занят Caddy)
PUBLIC_URL=https://meet.example.com
ENABLE_LETSENCRYPT=0 (Отключаем, так как SSL будет давать Caddy)
DOCKER_HOST_ADDRESS=ВАШ_IP_СЕРВЕРА
ENABLE_AUTH=0 (или 1, если хотите закрытый доступ)
ENABLE_GUESTS=1
Сгенерируйте пароли командой:
./gen-passwords.sh
Создайте папки для конфигов:
mkdir -p ~/.jitsi-meet-cfg/{web,transcripts,prosody/config,prosody/prosody-plugins-custom,jicofo,jvb,jigasi,jibri}
docker-compose up -d
Добавьте Jitsi в Caddy:
Вернитесь к файлу /opt/matrix-stack/caddy/Caddyfile и добавьте блок для Jitsi:
meet.example.com {
reverse_proxy ВАШ_IP_СЕРВЕРА:8000
}
Важно: Jitsi запускается в своей сети, поэтому проще проксировать на IP_СЕРВЕРА:8000 (порт, который мы открыли в .env Jitsi).
Перезагрузите Caddy:
cd /opt/matrix-stack
docker-compose restart caddy
Element: Зайдите на chat.example.com. Вы должны войти под своим пользователем.
Админка: Зайдите на admin.example.com. URL сервера: https://matrix.example.com, войдите под админом (создайте первого пользователя через консоль, если регистрация закрыта: docker exec -it synapse register_new_matrix_user -c /data/homeserver.yaml http://localhost:8008).
Звонок 1-на-1: Позвоните другому пользователю. Если работает — Coturn (TURN) настроен верно. Если "Connecting..." висит вечно — проблема в портах 3478/UDP. Убедитесь, что фаервол (UFW) пропускает эти порты.
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 3478/tcp
ufw allow 3478/udp
ufw allow 49152:49172/udp
Групповой звонок: В Element нажмите кнопку видеозвонка в комнате > выберите Jitsi. Должен открыться фрейм с Jitsi (meet.example.com).
Теперь у вас есть полный защищенный мессенджер с видеосвязью.
# --- 5. Jitsi Meet (Видеозвонки) - Если устанавливали ---
# Если вы развернули Jitsi отдельно, раскомментируйте этот блок
meet.evilfox.pp.ua {
reverse_proxy ВАШ_IP_СЕРВЕРА:8000
}
кому лень искать
# --- 1. Matrix Homeserver (Synapse) ---
1.evilfox.pp.ua {
# Включаем сжатие для ускорения загрузки JSON
encode zstd gzip
reverse_proxy synapse:8008 {
# Критически важно для корректной работы Matrix:
# Передаем протокол (https), чтобы Synapse знал, что соединение защищено
header_up X-Forwarded-Proto {scheme}
# Передаем реальный IP пользователя (нужно для безопасности и логов)
header_up X-Forwarded-For {remote_host}
# Отключаем буферизацию для мгновенной доставки сообщений (Sync)
flush_interval -1
}
# Логи доступа (полезно для отладки)
log {
output file /var/log/caddy/matrix-access.log
}
}
# --- 2. Element Web Client ---
2.evilfox.pp.ua {
encode zstd gzip
reverse_proxy element:80
}
# --- 3. Synapse Admin Panel ---
3.evilfox.pp.ua {
encode zstd gzip
reverse_proxy synapse-admin:80
}
# --- 4. TURN Server (Coturn) ---
# Этот блок нужен, чтобы Caddy получил SSL сертификат для домена.
# Сам голосовой трафик идет мимо Caddy (через порты 3478/5349).
4.evilfox.pp.ua {
respond "Coturn TURN Server is active. Use UDP/TCP ports 3478/5349."
}
# --- 5. Jitsi Meet (Видеозвонки) - Если устанавливали ---
# Если вы развернули Jitsi отдельно, раскомментируйте этот блок
# meet.evilfox.pp.ua {
# reverse_proxy ВАШ_IP_СЕРВЕРА:8000
# }
Отредактируйте файл на сервере:
nano /opt/matrix-stack/caddy/Caddyfile
Вставьте новый код.
Перезагрузите Caddy внутри контейнера (без остановки сервисов):
cd /opt/matrix-stack
docker-compose exec -w /etc/caddy caddy caddy reload
Или просто перезапустите контейнер: docker-compose restart caddy
файлы не нужны но оставлю на всякий случай
Нет комментариев.
Операция выполнена успешно.