Featured image of post 搭建 Matrix 服务器——踩坑记录

搭建 Matrix 服务器——踩坑记录

自建 matrix 服务,供 openclaw channel 使用

最近,openclaw 也是狠狠地火了一把,虽然说我觉得这种火爆很大程度上就是 hype——毕竟很多功能完全可以通过自己写代码实现——但我还是有点好奇这种全新的工作流是一种怎样的体验。

openclaw 的一大卖点就是可以通过 channel 连通设备,让我们可以在手机上控制我们的设备。然而,在国内,这个功能的吸引力就要大打折扣了,因为最好用的 telegram、discord 都用不了,而我们日常用的工具又太封闭,很难接入到 openclaw 中(个人微信可能被封号,企业微信、钉钉没有官方支持,qq 机器人限制太多),唯一一个算是可以用的飞书有 api 限制而且体验也没那么好。

所以我想,那我为什么不自己搭建一个即时通讯服务,用来做这个 channel 呢?反正市面上那么多即时通讯的协议可供使用,我没必要非要在一棵树上吊死。于是,经过调研,我选择了 matrix。

0 你可能不会想继续读下去……也许吧

在你继续阅读以下细节之前,我需要打一个预防针:这一套部署流程可能有以下几点给你带来糟糕的体验

  • 使用的服务器如果在国内需要备案,时间大概是一周,如果你不想备案的话就得加钱买国外的服务器
  • 你还需要买域名——如果你没有的话
  • 按照我的这套流程配置之后,如果你是安卓用户,需要从 google play 上面下载一个客户端;没有 google play 也可以下载但是它没有通知功能

1 关于 Matrix

Matrix 是一种即时通讯协议,它的官网首页是这样描述它的:

An open network for secure, decentralised communication

它有着一套标准,基于这套标准,开源社区实现了很多服务端和客户端应用,以便我们方便地部署。相比于闭源的即时通讯应用,它更加灵活、更加开放,没有 api 限制(自己的服务器想怎么搞就怎么搞);相比于其他的即时通讯协议(比如经典的 IRC),它更加现代、功能齐全,生态也比较完备。

2 搭建 Matrix 服务器

需要说明的是,你可以不自己建立 matrix 服务的——现在的市面上有很多 matrix provider,但是很多都处于被墙的状态或者是连接速度感人,剩下的你也不知道哪天就被无形的大手给保护起来了。反正我们都已经选择了这种开源的通讯协议,那也不差这点麻烦事,不如自己搭建服务。

2.1 准备工作

首先我们需要有一个服务器、域名和证书。服务器可以直接买很低的配置(我的服务器就是 2 核 2 GiB;至少我只用 matrix 进行文字通讯和简单的图片传输,在不使用 webrtc 的情况下对服务器的性能确实没有很高的要求),域名也可以随便购买一个便宜一点的,至于证书,现在也是有很多 90 天一更新的免费证书,所以这一套下来成本并不高。

不过,如果你有过网站部署的经历的话,会知道国内这一块非常刁难人,你的服务器是需要经过一个持续大概一周的备案过程的,否则你的域名没有办法解析到你的服务器。如果你实在不想走备案流程,可能得多加一点钱买国外服务器。

另外,记得在域名提供商那里解析好你的域名。

2.2 安装服务端软件

我选择的服务端框架叫 tuwunel——我没有选择官方推荐的 synapse 是因为 synapse 的部署相当麻烦,需要分步骤安装一大堆的依赖。相比之下,tuwunel 就简单多了,你基本上只需要从 github 下载 tuwunel 的包,再安装一个 nginx 就可以了。

装包这块很简单,你可以直接在 tuwunel 的 github releases 里面找到合适的版本下载。关于 v 几的选择,你可以运行这段代码:

1
cat /proc/cpuinfo | grep -Po '(avx|sse)[235]' | sort -u | sed 's/avx5/v4/;s/avx2/v3/;s/sse3/v2/;s/sse2/v1/' | sort

随后,根据你的 distro 不同,执行相应的安装流程即可。

2.3 配置 tuwunel

为了尽可能减少我们需要写的配置,这里会尽可能使用默认配置。

2.3.1 创建用户和用户组

默认配置下,tuwunel 使用 tuwunel 用户组下的 tuwunel 用户运行服务,所以我们需要创建 tuwunel 用户并将其添加到 tuwunel 组中:

1
2
sudo useradd -r --shell $(which nologin) --no-create-home tuwunel
sudo usermod -aG tuwunel tuwunel

官方文档这一块很坑,它给出的命令只包含创建用户,不包含创建用户组,这就导致了一些很难定位的错误

2.3.2 创建 systemd 服务

如果你是用 rpm 或者 deb 包直接安装的话,tuwunel.service 服务应该已经被创建好了。如果没有被创建的话,你可以参考这里,在正确的位置创建 tuwunel.service 文件。

2.3.3 创建配置文件

同样,如果是 rpm 或者 deb 包安装的,那么 tuwunel 的配置文件也已经创建好了。否则,你可以参考这里创建配置文件。

在刚才创建的 systemd 服务中,配置文件指向了 /etc/tuwunel/tuwunel.toml,所以如果你没有这个文件,就在这里创建相应的配置文件。

现在,我们需要对这个配置文件做一定的改动。以下几个字段需要修改:

  • server_name:matrix provider 的名称,也就是域名或者子域名。比如说,你想让 https://matrix.domain.com 指向你的 tuwunel 服务,那么这个字段就应该写作 server_name="matrix.domain.com"——记住,一定要有引号
  • allow_registration:设置为 true,否则不能注册新用户
  • registration_token:用户在注册的时候需要提供这一串 token,这是为了防止陌生人或者是陌生的 bot 随便注册你的服务的——注意,这个 token 也要用引号包裹

2.3.4 设置权限

这一块按照官方给出的步骤就可以了:

1
2
3
4
5
sudo chown -R root:root /etc/tuwunel
sudo chmod -R 755 /etc/tuwunel
sudo mkdir -p /var/lib/tuwunel/
sudo chown -R tuwunel:tuwunel /var/lib/tuwunel/
sudo chmod 700 /var/lib/tuwunel/

好习惯:设置完权限之后记得手动 ls -l 检查一下,看看有没有设置成功,这可以避免很多麻烦

2.3.5 配置反向代理

我是直接选用了 nginx 作为反向代理,因为我的服务器已经用 nginx 跑了好几个服务了。

如果是使用 nginx 的话,可以直接在 /etc/nginx/nginx.conf 里面加上这一段:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# Client-Server API over HTTPS (port 443)
server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name matrix.example.com;

  # Nginx standard body size is 1MB, which is quite small for media uploads
  # Increase this to match the max_request_size in your tuwunel.toml
  client_max_body_size 100M;

  # Forward requests to Tuwunel (listening on 127.0.0.1:8008)
  location / {
    proxy_pass http://127.0.0.1:8008;

    # Preserve host and scheme - critical for proper Matrix operation
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Proto https;
  }

  # TLS configuration (Let's Encrypt example using certbot)
  ssl_certificate /etc/letsencrypt/live/matrix.example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/matrix.example.com/privkey.pem;
}

# Matrix Federation over HTTPS (port 8448)
# Only needed if you want to federate with other homeservers
# Don't forget to open port 8448 in your firewall!
server {
  listen 8448 ssl http2;
  listen [::]:8448 ssl http2;
  server_name matrix.example.com;

  # Same body size increase for larger files
  client_max_body_size 100M;

  # Forward to the same local port as client-server API
  location / {
    proxy_pass http://127.0.0.1:8008;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Proto https;
  }

  # TLS configuration (same certificates as above)
  ssl_certificate /etc/letsencrypt/live/matrix.example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/matrix.example.com/privkey.pem;
}

server_name 换成你刚才在 tuwunel.conf 里面配置好的子域名,把 ssl_certificatessl_certificate_key 换成你存放证书的路径,退出,sudo nginx -s reload 即可。

2.3.6 启动 systemd 服务

运行以下命令:

1
sudo systemctl enable --now tuwunel

检测是否配置成功:

1
2
3
curl https://your.server.name/_tuwunel/server_version
curl https://your.server.name:8448/_tuwunel/server_version
curl https://your.server.name:8448/_matrix/federation/v1/version

2.3.7 可能需要做的额外设置

虽然说这是后话,但是我在配置 openclaw 的时候发现 agent 没有办法访问我的 matrix 服务,在查看 nginx 日志的时候发现了很多条以下报错:

1
2026/02/26 12:04:17 [crit] 7460#7460: *282008 open() "/var/lib/nginx/tmp//0000000827" failed (13: Permission denied), client: ..., server: ..., request: "POST /_matrix/client/v3/keys/upload HTTP/1.1", host: "..."

关于这一点,AI 的描述是,请求的 body 内容过大时,nginx 会在 /var/lib/nginx/tmp/ 目录下创建临时文件,而上述问题则出在运行 nginx 的用户并没有相应的权限。

为了排查这个问题,我们首先需要确认运行 nginx 的用户:

1
ps -eo user,cmd | grep nginx

接着,查看相应的文件夹权限:

1
ls -ld /var/lib/nginx /var/lib/nginx/tmp

这里,tmp 和它的上一级文件夹的权限都要查看,我的这个 bug 就出在运行 nginx 的用户没有 /var/lib/nginx 的权限。

在排查出问题后,给予相应权限或者是用 chown 修改所有者即可。

3 安装客户端

我们选择的 tuwunel 安装起来确实简单(相比于 synapse),但是也有相应的代价——它不支持 MAS (matrix authentication service),这意味着我们没有办法使用现在最流行的 matrix 客户端 element x 访问我们的 matrix 服务。不过,这并不成问题,我们可以选用另一个客户端 fluffychat 进行使用。

不过比较坑的是,fluffychat 需要从 google play 进行下载;从其他途径下载的话,很可能没有消息通知功能。

另外,fluffychat 并不支持注册,所以你需要通过 https://app.element.io 先注册一个账号,然后打开 fluffychat,登陆并保存好 recovery code,才能开始使用。

4 总结

总的来说,这个流程还算是简单了——只要你有可以绑定域名的服务器,并且可以用 google play 安装一个客户端。

相比于飞书接入 openclaw 的方案,这种方式可能略显麻烦(其实也没麻烦到哪去,毕竟飞书那一套权限 + 事件配置也够让人头大了),但是自由得多,也不需要有 API 焦虑。而且,如果不想用 openclaw 了,也可以自己写一些 cron job 比如说编写日报,在服务器上通过 matrix 协议发送给我们手机上的客户端。

综上,matrix 还是蛮值得尝试的。

使用 Hugo + Stack 主题构建