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

Matrix / гайды
29.11.2025
45
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
2 скачиваний
29.11.2025
Скачать
docker-compose.yml
3.08 Kb
2 скачиваний
29.11.2025
Скачать
config.json
802 b
3 скачиваний
29.11.2025
Скачать
files.rar
3.76 Kb
3 скачиваний
29.11.2025
Скачать

Download Files

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

Оцените работу движка
Статистика
Успешно!

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