Пример docker-compose для развертывания сервера Matrix Synapse

Matrix / гайды
28.11.2025
25
Пример docker-compose для развертывания сервера Matrix Synapse

Подготовка

Требования:

  • Чистый сервер 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: Структура и Секреты

  1. Создаем папку:

    mkdir -p matrix-stack/{caddy,synapse-data,postgres-data}
    cd matrix-stack
    1. Генерируем секреты (пароли). Выполните команду 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

    1. Генерация конфига:

    docker compose run --rm -e SYNAPSE_SERVER_NAME=matrix.example.com -e SYNAPSE_REPORT_STATS=no synapse generate
    1. (Замените matrix.example.com на ваш домен Synapse)

    2. Редактирование 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: Создание пользователя и выдача Админа

    Так как мы убрали веб-админку, делаем всё через консоль (это нужно сделать один раз).

    1. Создаем пользователя:

    docker compose exec synapse register_new_matrix_user -c /data/homeserver.yaml http://localhost:8008
      • User: admin

      • Password: ваш_супер_пароль

      • Make admin: yes

    1. Если забыли сделать админом при создании:
      Можно выдать права через базу данных:

    docker compose exec postgres psql -U synapse -c "UPDATE users SET admin = 1 WHERE name = '@admin:matrix.example.com';"

    Шаг 9: Использование

    1. Зайдите на https://chat.example.com.

    2. Войдите под созданным пользователем.

    3. Проверка звонков:

      • Зайдите в Настройки -> Голосовая и видеосвязь.

      • Если видите "Ближайший VoIP-релей: coturn" (или ваш IP) — всё работает через сервер.

    Готово! У вас настроен стабильный сервер Matrix без лишних зависимостей.

Download Files

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

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

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