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

Matrix / гайды
28.11.2025
33
Пример 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

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

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

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