最近,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 几的选择,你可以运行这段代码:
| |
随后,根据你的 distro 不同,执行相应的安装流程即可。
2.3 配置 tuwunel
为了尽可能减少我们需要写的配置,这里会尽可能使用默认配置。
2.3.1 创建用户和用户组
默认配置下,tuwunel 使用 tuwunel 用户组下的 tuwunel 用户运行服务,所以我们需要创建 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 设置权限
这一块按照官方给出的步骤就可以了:
| |
好习惯:设置完权限之后记得手动
ls -l检查一下,看看有没有设置成功,这可以避免很多麻烦
2.3.5 配置反向代理
我是直接选用了 nginx 作为反向代理,因为我的服务器已经用 nginx 跑了好几个服务了。
如果是使用 nginx 的话,可以直接在 /etc/nginx/nginx.conf 里面加上这一段:
| |
把 server_name 换成你刚才在 tuwunel.conf 里面配置好的子域名,把 ssl_certificate 和 ssl_certificate_key 换成你存放证书的路径,退出,sudo nginx -s reload 即可。
2.3.6 启动 systemd 服务
运行以下命令:
| |
检测是否配置成功:
| |
2.3.7 可能需要做的额外设置
虽然说这是后话,但是我在配置 openclaw 的时候发现 agent 没有办法访问我的 matrix 服务,在查看 nginx 日志的时候发现了很多条以下报错:
| |
关于这一点,AI 的描述是,请求的 body 内容过大时,nginx 会在 /var/lib/nginx/tmp/ 目录下创建临时文件,而上述问题则出在运行 nginx 的用户并没有相应的权限。
为了排查这个问题,我们首先需要确认运行 nginx 的用户:
| |
接着,查看相应的文件夹权限:
| |
这里,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 还是蛮值得尝试的。
