构图:身着北欧战术铠甲的 NordBastion 北极熊吉祥物站在一座青蓝色光芒密码格构成的半透明金库前,联邦线条在峡湾之夜的远处堡垒剪影之间穿梭,金库门上隐约刻着 Matrix 标志,头顶是极光
使用场景 · Matrix home server · 2026 年更新

你自己的 Matrix home server。
端到端。联邦。北欧。无从询问。

在 Ravelin($23.90/月)上运行 Synapse + Postgres + Element。你的 home server 中继并联邦消息;它无法读取自己的端到端流量;北欧司法管辖意味着没有人能客气地请它开始尝试这么做。

简而言之
  • 01

    Ravelin $23.90/月 可以舒适承载一台约 100 个房间、联邦良好的 Synapse——Postgres、Redis、Synapse 工作进程、房间状态缓存,全在同一台机器上。

  • 02

    端到端加密是结构性的——home server 中继的是它无法解密的密文。免 KYC 的管理员注册意味着运维者也不带任何纸面记录。

  • 03

    北欧司法管辖 + 按设计不留日志 + 不限量上行。一个活跃房间集合的联邦喋喋不休是真实流量;在这里不会额外计费。

为什么要折腾

究竟为什么要自托管 home server。

对大多数人来说,加入 matrix.org 是正确答案。当你的用户名、房间成员关系和消息元数据不应当住在别人管理面板上时,运营自己的 home server 才是正确答案。协议是联邦的,加密是端到端的;缺失的那一块是「谁控制了我账户所锚定的那台机器」——这个答案实质性地改变了威胁模型。

Matrix 的联邦模型是宽厚的:任何 home server 都能与任何其他 home server 对话,房间跨服务器存在,加密跟随用户,参与网络也不需要中心目录。一旦你的 home server 跑起来并通过联邦测试器的验证,你的账户就是网络的一等公民——与 @user:matrix.org 或 @user:mozilla.org 同等,只是在你自己的域名下。

Synapse 的运维故事早已走熟:上游有 Docker Compose 模板,状态用 Postgres,工作池用 Redis,高流量联邦时可选分片工作进程。其中没有任何新东西;全都有文档;故障模式也已知晓。

正确的问题不是抽象地讨论「自托管还是 matrix.org」——而是「我希望我的联邦身份锚定在我管理的机器上吗」。如果答案是肯定的,这一页接下来的内容就是配方。

规模选择

为这件事选对 NordBastion 档位。

对于一台拥有约 100 个房间(混合小型 DM 和少数几个对外联邦、人气良好的公共房间)的社区 home server,Ravelin($23.90/月,8 vCPU、16 GB、480 GB NVMe是合适的档位。Synapse 的 Python 数据路径在联邦突发下对内存的胃口很大——某个人气房间被一台拥有 5 万用户的服务器加入,会引发想要更大余量的瞬时状态解析尖峰。16 GB 能舒适地吸收。

超过约 1000 个活跃房间,或联邦流量已经迫使 Synapse 需要分片工作进程模式时,Bulwark 档位能给你足够的核心去跑专用的 federation_sender、synchrotron 和 event_persister 工作进程——这就是 Synapse 在单台机器内的横向扩展故事。到那时你也会想考虑 Postgres 是否应该放到独立的 VPS 上;我们可以谈谈两机布局。

对于个人 home server——你的账户、几个 DM、几间小型私密房间——Garrison($11.90/月,4 vCPU、8 GB、240 GB NVMe)绰绰有余。在单用户搭建中,把 Conduit 跑在 Sentinel 上技术上是可行的,但在 Garrison 上跑 Synapse 能让你在不迁移的情况下留出成长空间。

这些方案都不是什么:一项面向数千租户的托管 Matrix 服务。NordBastion 是为那些为自己认识的人运营自己 home server 的运维者而构建的——而不是为了向陌生人售卖 Matrix 账户。

搭建

从全新 VPS 到第一个联邦房间。六个步骤,约九十分钟。

一份骨架式的速写——上游 element-hq 的 Synapse 文档仍是 homeserver.yaml 调优和工作进程模式的权威参考。

  1. 01

    Docker + Compose

    官方 Docker 引擎 + Compose v2 插件。Element-HQ 发布了维护中的 Synapse 镜像,你可以按 tag 锁定版本。

    curl -fsSL get.docker.com \
      | sh
    apt install \
      docker-compose-plugin
  2. 02

    生成 homeserver.yaml

    Synapse 镜像的一次性「generate」模式会写出一份以你 server_name 为键的起步配置。在同一步顺手关闭开放注册。

    docker run --rm \
      -v ./data:/data \
      -e SYNAPSE_SERVER_NAME=example.org \
      matrixdotorg/synapse:latest \
      generate
  3. 03

    接好 Postgres + Redis

    Postgres 是生产存储;SQLite 仅供测试。即使你以单进程启动,工作池也需要 Redis。

    # 添加到 docker-compose.ymlpostgres: postgres:15
    redis:    redis:7-alpine
    # 然后在 homeserver.yaml 中:数据库驱动 psycopg2
  4. 04

    发布 well-known

    在你的顶级域名上 /.well-known/matrix/{client,server} 提供两个小 JSON 文件。以 application/json 提供,并带 CORS Access-Control-Allow-Origin: *。

    # /.well-known/matrix/server
    {"m.server": "matrix.example.org:443"}
    # /.well-known/matrix/client
    {"m.homeserver":{"base_url":"https://matrix.example.org"}}
  5. 05

    验证联邦

    federationtester.matrix.org 会检查 well-known、证书链、TLS 握手、版本握手和密钥交换。在它全绿之前不要邀请用户。

    # 把 server_name 粘贴进:# federationtester.matrix.org
    # 所有检查都必须为绿
  6. 06

    通过共享秘密发放管理员账户

    homeserver.yaml 中的 registration_shared_secret + register_new_matrix_user CLI = 一个无需开放公共注册就能创建的管理员账户。

    docker compose exec synapse \
      register_new_matrix_user \
      -a -c /data/homeserver.yaml \
      http://localhost:8008
为什么用这台主机做这件事

为什么特别选 NordBastion 来跑 Matrix home server。

无KYC

端到端基础设施的管理员不应当背负纸面记录。

端到端加密是一个强势主张。当中继的主机商通过计费侧的 KYC 准确知晓是哪个法律实体搭建了这台 home server 时,这一主张就被削弱了。免 KYC 注册加仅加密货币计费让中继的管理元数据与中继的负载元数据一样不透明:「这封邮件背后的那笔预付余额」,就这样。

北欧司法管辖

腰带加背带。

Matrix 的端到端加密已经在算术层面阻止了中继读取负载。北欧司法管辖再加一层:没有数据保留强制令要求主机商记录连接元数据、没有任何客户端侧扫描立法被付诸实施,并附一份公开的令状金丝雀,说明如果有人试图改变这套数学会发生什么(我们做不到)。两层「不」胜过一层。

不限量 1 Gbps

联邦就是流量。

一台参与几间人气良好公共房间的联邦 home server 会推送大量小型联邦事件——每一次加入、每一次状态变更、每一次消息回执都是向 N 台服务器扇出的投递。总量并不庞大,但持续不断,而任何按 GB 出站计费的主机商都会让运维者紧张。不限量上行去掉了这层认知负担:协议要联邦多少就联邦多少;账单都是一样的。

结论

在 Ravelin 上运行。关闭开放注册。让联邦完成其余的部分。

自托管一台 Matrix home server,是小团体为自己的消息系统所能做的最干净的主权动作之一。用一个 SaaS 聊天工具席位的价格,你就能拥有一台联邦化、端到端加密的 home server——其用户名比任何平台都长寿,其审核归你,其托管所在的司法辖区既无数据保留强制令、也无任何客户端侧扫描立法被付诸实施。

NordBastion 对这件事真正关键的部分有自己的意见——免 KYC 的管理员注册、北欧司法管辖、不限量上行——其余部分则刻意保持平淡。Docker 就是 Docker。Synapse 就是 Synapse。Element-HQ 提供镜像;我们提供机器。

用一个晚上跑完六个步骤,用联邦测试器做验证,发放管理员账户。这台 home server 会活得比那一个晚上长上好几年。

常见问题 · 在 VPS 上跑 Matrix

最先冒出来的那些问题。

Matrix 管理员在 docker compose up 之前真正纠结的八个问题。well-known 委派之所以排在第二,是有原因的。

如果服务器已经是我的,为什么还要端到端加密?

因为服务器只是一台机器,而消息却永远存在。任何能访问磁盘的人——一次快照事故、一份取证镜像、一个翻脸的协同管理员、你最终把机器交出去的继任者——只要房间没有加密,就能看到明文。端到端加密让 home server 仍然有用(它中继、它联邦、它呈现 UI),同时让消息负载在算术意义上除了参与者的设备密钥之外无法被读取。自托管和端到端加密是腰带 + 背带:你控制中继,并且中继也无法读取自己的流量。

什么是 well-known 委派,为什么每个人都在它上面绊倒?

Matrix 允许你的面向用户域名(example.org)与你的面向服务器域名(matrix.example.org)不同,方法是在 https://example.org/.well-known/matrix/client 和 /.well-known/matrix/server 上分别提供两个小 JSON 文件。client 那个告诉 Element 用哪个 home server URL;server 那个告诉联邦对等方在 s2s API 上到哪里找 Synapse。人们会在三件事上绊倒:以错误的 Content-Type 提供文件、CORS 不允许其他实例抓取,或者 server 文件指向一个防火墙其实没暴露的端口。在公开房间之前用 federationtester.matrix.org 做验证。

Synapse vs Dendrite vs Conduit——对托管有影响吗?

Synapse(Python,参考实现)是 95% 公开 home server 所运行的;它是经过最充分测试的联邦对等方,也是唯一支持规范所定义全部特性的实现。Conduit(Rust,单二进制,RocksDB)和 Dendrite(Go,微服务)更轻——Conduit 因能在树莓派上运行而出名。对于面向公开、有用户在上面的联邦 home server,答案是 Synapse;对于业余的单用户服务器,你可以在 Sentinel 上试验 Conduit。本篇专栏默认采用 Synapse。

我如何避免开放注册的垃圾邮件?

在 homeserver.yaml 中设置 enable_registration: false,并依赖 registration_shared_secret 通过管理 API 给你真正想要的人开账户。或者,设置 enable_registration_without_verification: false,并配合一套写死的共享秘密邀请流程。Matrix 联邦规模够大,任何开放注册的 home server 几天内就会变成垃圾机器人的账号农场;标准答案是「注册由管理员策划,联邦保持开放」。

Element vs Cinny vs SchildiChat 及其他——home server 在意吗?

不在意——Matrix 的 C-S API 是协议契约,每个符合规范的客户端都能与每个符合规范的服务器对话。Element 是默认选择,也是测试最充分的;Cinny 是一个更轻的 Web 客户端,有些自托管者更愿意把它打包进去;SchildiChat 是带 Telegram 风格 UI 的 Element 分叉;FluffyChat 主打移动端优先。home server 既看不到也不在意用户用的是哪个客户端。挑你社区偏好的那个,以后再换,也无需迁移。

端到端密钥备份是怎么工作的?

每个 Matrix 用户都有一组设备密钥(每设备一套、短期)和一把交叉签名密钥(每账户一把、长期)。交叉签名主密钥让用户添加新设备时无需重新验证一切;丢了它,用户在重新生成密钥之前都会被锁在历史端到端消息之外。Element 的「Secure Backup」功能用口令或恢复密钥加密交叉签名密钥,并以不透明的密文形式存放在服务器端——home server 持有这个 blob,但无法读取它。在注册时为你的用户写清楚恢复密钥这一步;这是阻止可避免锁死事件的唯一一项 UX。

我能把一个房间从另一台 home server 迁移到我自己的吗?

不能直接迁——房间是联邦对象,不是按服务器记录的,因此「迁移」一个房间意味着对它做升级(一个 Matrix 原生原语,会创建一个继任房间并在旧房间留下一个跳转)并邀请同一组参与者。房间 ID 会变,alias 可以跟随。home server 之间的用户账户直接迁移是 Matrix 长期以来的愿望清单项(账户可移植性在规范路线图上);今天你在自己的服务器上新建一个账户,请大家重新加你。

联邦 home server 的滥用处理故事是怎样的?

Matrix 有按房间的审核原语(踢人、封禁、删除、房间管理员)和按服务器的审核原语(通过 Synapse 模块 API 实现的拒绝名单、用于托管拒绝名单的 MJOLNIR 机器人、用于仅限邀请联邦的服务器级允许名单模式)。对于社区 home server,MJOLNIR 风格的拒绝名单订阅是标准答案——你把垃圾/滥用识别委托给维护拒绝名单的社区,并在本地应用该策略。你的主权在于:你选择订阅哪些拒绝名单。