Container - Matrix (Synapse)

本页记录如何在 MikroTik RouterOS 上将 Synapse Matrix 服务器设置为容器,涵盖容器网络配置和 PostgreSQL 环境设置等前提条件,以实现跨多个平台的安全联邦通信。

容器 - Matrix (Synapse)

Matrix 是一种去中心化通信协议。每个 Matrix 服务器独立运行,维护自己的一组用户并定义自己的规则和政策。

托管你自己的 Matrix 服务器

你可以使用容器直接在 RouterOS 设备上托管自己的 Matrix 服务器。这使你能够完全控制自己的通信基础设施。

联邦

Matrix 服务器可以通过联邦连接起来,构建统一的通信网络。这使得不同 Matrix 服务器上的用户能够安全地相互通信,而无需中央权威机构。

桥接到其他平台

Matrix 支持桥接以中继来自其他聊天平台的消息,包括:

  • WhatsApp
  • Discord
  • Signal
  • Telegram
  • 以及许多其他平台

通过使用 Matrix 桥接,你可以将来自多个平台的通信整合到一个应用中,例如 Element。这使你能够通过一个统一的界面与不同平台的用户通信。

在 RouterOS 上设置 Synapse Matrix 服务器

本指南说明如何使用容器在你的 MikroTik RouterOS 设备上设置 Synapse——可用的多个 Matrix 服务器之一。

信息

在继续之前,请确保你已创建容器网络。有关说明,请参阅容器网络文档。


前提条件

  • 一台支持容器的 RouterOS 设备
  • 已配置好的现有容器网络
  • 为数据库和 Synapse 数据提供足够的存储空间

步骤 1:创建 PostgreSQL 容器环境变量

为 PostgreSQL 容器配置环境变量列表:

/container/envs/add list=postgres_synapse_envs key=POSTGRES_DB value="synapse"
/container/envs/add list=postgres_synapse_envs key=POSTGRES_PASSWORD value="<POSTGRES_PASSWORD_HERE>"
/container/envs/add list=postgres_synapse_envs key=POSTGRES_USER value="synapse_user"
/container/envs/add list=postgres_synapse_envs key=PGDATA value="/var/lib/postgresql/data/pgdata"
/container/envs/add list=postgres_synapse_envs key=POSTGRES_INITDB_ARGS value="--encoding='UTF8' --lc-collate='C' --lc-ctype='C'"
/container/envs/add list=postgres_synapse_envs key=PGPORT value=5433

说明

将 <POSTGRES_PASSWORD_HERE> 替换为你想要的 PostgreSQL 密码。


步骤 2:创建 PostgreSQL 容器挂载

创建一个挂载点,将 PostgreSQL 数据持久化到你的 RouterOS 设备上:

/container/mounts/add list=synapse_postgres_data src=disk1/synapse-postgres-data dst=/var/lib/postgresql/data

步骤 3:创建 PostgreSQL 容器

使用前面步骤中的配置启动 PostgreSQL 容器:

/container/add remote-image=postgres:17.2-alpine interface=veth1 root-dir=disk1/postgres-17.2-synapse mountlists=synapse_postgres_data envlists=postgres_synapse_envs name=postgresql_synapse

步骤 4:创建 Synapse 容器环境变量

为 Synapse 容器配置环境变量:

/container/envs/add list=synapse_envs key=SYNAPSE_CONFIG_DIR value="/data"
/container/envs/add list=synapse_envs key=SYNAPSE_CONFIG_PATH value="/data/homeserver.yaml"
/container/envs/add list=synapse_envs key=SYNAPSE_SERVER_NAME value="test.mt.lv"
/container/envs/add list=synapse_envs key=SYNAPSE_REPORT_STATS value="yes"

说明

将 test.mt.lv 替换为你实际的服务器域名。


步骤 5:创建 Synapse 容器挂载

创建一个挂载点,将 Synapse 数据持久化到你的 RouterOS 设备上:

/container/mounts/add list=synapse_data src=disk1/synapse-data dst=/data

步骤 6:生成初始 Synapse 配置

创建并运行一个 Synapse 容器以生成所需的配置文件。该容器使用 generate 命令运行以创建初始配置:

/container/add remote-image=matrixdotorg/synapse:latest interface=veth1 cmd="generate" root-dir=disk1/synapse mountlists=synapse_data envlists=synapse_envs name=synapse

步骤 7:初始化配置文件

启动然后停止 Synapse 容器,使其生成必要的配置文件:

/container/start [find where name=synapse]
/container/stop [find where name=synapse]

步骤 8:移除 generate 命令

清除 Synapse 容器中的 command 参数,使其以正常模式运行:

/container/set [find where name=synapse] cmd=""

步骤 9:配置数据库连接

使用 SFTP 客户端(例如 Windows 上的 WinSCP)连接到你的 RouterOS 设备,并编辑生成的配置文件 disk1/synapse-data/homeserver.yaml。用以下设置更新数据库部分:

database:
  name: psycopg2
  args:
    user: synapse_user
    password: <POSTGRES_PASSWORD_HERE>
    dbname: synapse
    host: 172.17.0.2
    port: 5433
    cp_min: 5
    cp_max: 10
    keepalives_idle: 10  # optional
    keepalives_interval: 10  # optional
    keepalives_count: 3     # optional

信息

将 <POSTGRES_PASSWORD_HERE> 替换为你在步骤 1 中设置的密码。


步骤 10:启动 PostgreSQL 容器

启动 PostgreSQL 容器以准备数据库:

/container/start [find where name=postgresql_synapse]

步骤 11:启动 Synapse 容器

启动 Synapse 容器以运行你的 Matrix 服务器:

/container/start [find where name=synapse]

步骤 12:注册 Matrix 用户

进入 Synapse 容器的 shell 并注册一个新用户:

/container/shell [find where name=synapse]

进入容器后,运行:

register_new_matrix_user -c /data/homeserver.yaml

按照提示创建你的管理员用户账户。


步骤 13:访问你的 Matrix 服务器

你的 Synapse Matrix 服务器现在正在运行。使用你 RouterOS 设备的 IP 地址或域名访问它。


警告

请始终查阅官方 Synapse 文档,以获取最新的配置选项和最佳实践,因为配置步骤可能会随新版本而变化。

Discord 桥接

提示

下面的示例用于配置 Discord 桥接,但其他类型桥接的步骤非常相似。请查看你所需桥接的官方文档以获取更多信息。

  1. 创建 PostgreSQL Discord 桥接容器环境变量:

    /container/envs/add list=postgres_discord_envs key=POSTGRES_DB value="synapse-discord"
    /container/envs/add list=postgres_discord_envs key=POSTGRES_PASSWORD value="<POSTGRE_BRIDGE_PASSWORD_HERE>"
    /container/envs/add list=postgres_discord_envs key=POSTGRES_USER value="synapse_discord"
    /container/envs/add list=postgres_discord_envs key=PGDATA value="/var/lib/postgresql/data/pgdata"
    /container/envs/add list=postgres_discord_envs key=POSTGRES_INITDB_ARGS value="--encoding='UTF8' --lc-collate='C' --lc-ctype='C'"
     /container/envs/add list=postgres_discord_envs key=PGPORT value=5434
    
  2. 创建 PostgreSQL Discord 桥接容器挂载:

    /container/mounts/add list=discord_postgres_data src=disk1/discord-postgres-data dst=/var/lib/postgresql/data
    
  3. 为 Discord 桥接创建 PostgreSQL 容器:

    /container/add remote-image=postgres:17.2-alpine interface=veth1 root-dir=disk1/postgres-17.2-discord mountlists=discord_postgres_data envlists=postgres_discord_envs name=postgresql_discord
    
  4. 按照 HAProxy 容器指南,为端口 8080 设置逆向代理

  5. 创建 Discord 桥接容器挂载点:

    /container/mounts/add list=synapse_discord_data src=disk1/synapse-discord-data dst=/data
    
  6. 创建 Discord 桥接容器:

    /container/add remote-image=litetex/mau.mautrix.discord:latest interface=veth1 root-dir=disk1/synapse-discord mountlists=synapse_discord_data name=synapse_discord
    
  7. 启动并停止 Discord 桥接容器以生成文件:

    /container/start [find where name=synapse_discord]
    /container/stop [find where name=synapse_discord]
    
  8. 使用 SFTP 客户端(例如在 Microsoft Windows 上使用 WinSCP)连接到你的 RouterOS 设备,并调整文件 disk1/synapse-discord/config.yaml:

     homeserver
         address: http://172.17.0.2:8008
         domain: test.mt.lv
        software: standard
        async_media: true
        
    appservice
        address: leave default
        hostname: leave default
        port: leave default
        database:
            type: postgres
            uri: postgres://synapse_discord:<POSTGRE_DISCORD_PASSWORD_HERE>@172.17.0.2:5434/synapse-discord?sslmode=disable
    bridge:
        encryption:
            allow: true
        permissions:
            "*": relay
            "@your_admin_user1:test.mt.lv": admin
            "@your_admin_user2:test.mt.lv": admin
    
  9. 再次启动并停止 Discord 桥接容器:

    /container/start [find where name=synapse_discord]
    /container/stop [find where name=synapse_discord]
    
  10. 下载文件 disk1/synapse-discord/registration.yaml,并将其作为文件 disk1/synapse-data/mautrix-discord-registration.yaml 上传

  11. 使用 SFTP 客户端(例如在 Microsoft Windows 上使用 WinSCP)连接到你的 RouterOS 设备,并将以下行添加到 disk1/synapse-data/homeserver.yaml:

    ...
    app_service_config_files:
    - /data/mautrix-discord-registration.yaml
    
  12. 启动 Synapse 和 Discord 桥接容器:

    /container/start [find where name=postgresql_discord]
    /container/start [find where name=synapse_discord]
    /container/start [find where name=postgresql_synapse]
    /container/start [find where name=synapse]
    
  13. 你的 Matrix 服务器现在应该有一个名为 "Discord bridge bot" 的新用户。按照官方文档创建桥接房间。