Matrix (Synapse) + PostgreSQL + Element + Synapse Admin + Coturn (TURN сервер) + Caddy. admin панель

Matrix / гайды
29.11.2025
35
Matrix (Synapse) + PostgreSQL + Element + Synapse Admin + Coturn (TURN сервер) + Caddy. admin панель

любезно подготовил ИИ

Это сложная задача, так как мы объединяем несколько тяжеловесных сервисов. Чтобы это работало стабильно, нам нужно правильно настроить DNS, SSL (через Caddy) и взаимодействие контейнеров.

Ниже представлена подробная инструкция по развертыванию стека: Matrix (Synapse) + PostgreSQL + Element + Synapse Admin + Coturn (TURN сервер) + Caddy. admin панель

Jitsi мы развернем рядом (официальный метод), так как он требует сложной конфигурации сети, и смешивать его в один docker-compose файл не рекомендуется (сложно обновлять). Но мы настроим Element на работу с ним.

Предварительные требования

  1. VPS/Сервер: Ubuntu 20.04/22.04 (минимум 4GB RAM, желательно 8GB).

  2. Домен: Допустим, ваш домен 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 для групповых звонков)

  3. Docker и Docker Compose: Должны быть установлены.

Шаг 1: Подготовка структуры папок

Зайдите на сервер и создайте директорию:

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

Шаг 2: Генерация конфигурации Synapse

Перед запуском основного файла нужно сгенерировать конфиг для 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. Мы отредактируем его позже.

Шаг 3: Генерация секретов для TURN (Coturn)

Нам нужен секретный ключ для защиты сервера звонков. Выполните команду:

openssl rand -hex 32

Скопируйте полученную строку. Назовем её TURN_SECRET.

Шаг 4: Создание docker-compose.yml

Создайте файл 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

Шаг 5: Настройка Caddy (Caddyfile)

Создайте файл /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"
}

Шаг 6: Настройка Synapse (homeserver.yaml)

Отредактируйте файл /opt/matrix-stack/synapse/homeserver.yaml.
Вам нужно изменить несколько секций:

  1. База данных (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

Шаг 7: Настройка Element (config.json)

Создайте файл /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, который установим на следующем шаге.

Шаг 8: Запуск Matrix Стека

Находясь в папке /opt/matrix-stack, запустите:

docker-compose up -d

Проверьте логи: docker-compose logs -f. Если все хорошо, через минуту matrix.example.com, chat.example.com и admin.example.com должны открываться с HTTPS.


Шаг 9: Установка Jitsi (для групповых звонков)

Jitsi — очень сложная система (5-6 контейнеров). Лучше всего использовать их официальный репозиторий отдельно, чтобы не ломать конфиг Matrix.

  1. Выйдите из папки стека и скачайте 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

Итоговая проверка

  1. Element: Зайдите на chat.example.com. Вы должны войти под своим пользователем.

  2. Админка: Зайдите на admin.example.com. URL сервера: https://matrix.example.com, войдите под админом (создайте первого пользователя через консоль, если регистрация закрыта: docker exec -it synapse register_new_matrix_user -c /data/homeserver.yaml http://localhost:8008).

  3. Звонок 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
  1. Групповой звонок: В 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
# }

Как применить изменения

  1. Отредактируйте файл на сервере:

nano /opt/matrix-stack/caddy/Caddyfile
  1. Вставьте новый код.

  2. Перезагрузите Caddy внутри контейнера (без остановки сервисов):

cd /opt/matrix-stack
docker-compose exec -w /etc/caddy caddy caddy reload

Или просто перезапустите контейнер: docker-compose restart caddy

файлы не нужны но оставлю на всякий случай

homeserver.yaml
1.59 Kb
0 скачиваний
29.11.2025
Скачать
docker-compose.yml
3.08 Kb
0 скачиваний
29.11.2025
Скачать
config.json
802 b
2 скачиваний
29.11.2025
Скачать
files.rar
3.76 Kb
1 скачиваний
29.11.2025
Скачать

Download Files

Нет комментариев.

Добавить комментарий
Ваш комментарий будет проверен модератором. Мы оставляем за собой право удалять комментарии, нарушающие правила.
Защита от спама
Комментарий будет опубликован после проверки модератором
Оцените работу движка
Статистика
Успешно!

Операция выполнена успешно.