作者 Ho229v3
Dendrite 是用 Go 写成的第二代 Matrix homeserver,今天就来踩个坑。
整个部署流程基于官方的 Get started。
温馨提示:如果你不是真的非常想当 Matrix 腐竹,也不是去中心化的狂热分子,这篇文章只会浪费你的时间。我也不推荐任何人自己部署 Dendrite,除非你闲得蛋疼。
编译与生成密钥#
编译和生成密钥的时候没有遇到啥问题。
我使用的环境是 AWS 的 1g1c 小鸡,系统是 Ubuntu 22.04-amd64,Go 版本是 1.18.1 linux/amd64。
配置文件#
配置数据库#
在编译和生成密钥完成后,运行 dendrite-monolith-server
会出现以下报错(Get started == Get new shit):
PANI[2022-11-02T05:02:46.231645575Z] Failed to set up global database connections error="failed to find maximum connections: dial tcp: lookup hostname: no such host"
panic: (*logrus.Entry) 0xc0002a5c70
...
由于这个报错很模糊,也可能是因为我是新手,所以我并没有从网上找到有用的东西。阅读了它的源代码之后发现是在执行 config 的时候 panic 的,那就说明官方给的 dendrite-sample.monolith.yaml
是不能直接用的。(过滤目标用户)
打开 YAML 一看,发现它直接在 global.database
里用了 PostgreSQL,但是我并不打算用 PostgreSQL 部署。研究了一下注释之后发现 global.database
是 PostgreSQL 专属的, SQLite 不能用 global.database
(也就是 Dendrite 的 Global database connection pool),且只能手动给每个 component 指定 database,也就是在每个 component 下面加(这么简单的事情为什么不能帮用户做一下呢,为什么就不能用 SQLite 的 connection pool 呢):
database:
connection_string: file:dendrite_<component>.db
max_open_conns: 10
max_idle_conns: 2
conn_max_lifetime: -1
需要注意的是,每个 component 不能和其它 component 用同一个 .db,同时 global.database
也要注释掉。
添加缺失的 compenet 配置#
再次运行 dendrite-monolith-server
又会得到下面的报错:
INFO[2022-11-02T05:25:53.722317580Z] Dendrite version 0.10.5+8c7b274e
PANI[2022-11-02T05:25:53.756013624Z] failed to connect to room server db error="sqlutil.Open: no database connections configured"
...
然而在我的 YAML 里面并没有关于 room server 的配置,很显然 example 是漏了一些字段。于是我去网上找了一份也是用 SQLite 的 Dendrite 配置文件,对比之后发现 example 少了 room_server
和 key_server
两个 component 的配置,还有 user_api.account_database
和 user_api.device_database
。(好家伙,不会写 sample 就不要写)
解决方法是按照网上的配置文件补上即可,注意修改 database.connection_string
的路径。
再次运行 dendrite-monolith-server
,server 已经顺利跑起来了。地址是 http://localhost:8008。
创建账号#
按照 Get started 的最后一步创建账号会出现以下错误:
FATA[0000] Shared secret registration is not enabled, enable it by setting a shared secret in the config: 'client_api.registration_shared_secret'
这个报错就说得很清楚了,是因为没有在 YAML 里设置 client_api.registration_shared_secret
。解决办法是写一段随机字符串作为 shared secret。
公开账号注册#
如果你希望能在客户端注册账号而不是在服务器上,你需要公开账号注册。
公开账号注册有两种方法:
- (不安全) 将 YAML 里的
client_api.registration_disabled
设为false
,然后在dendrite-monolith-server
的启动参数添加-really-enable-open-registration
。 - Enable reCAPTCHA verification registration。(让 Google 白嫖你的大脑算力)
部署#
在部署之前记得把 global.server_name
、global.well_known_server_name
和 global.well_known_client_name
改成自己 server 的 domain。
使用 -http(s)-bind-address
可以更改 HTTP (S) 的端口,HTTP 端口默认是 8008,HTTPS 端口默认是 8448。
Integration Manager#
目前 Matrix 主流的 integration manager 是 Dimension。
如果要部署 integration manager,需要用 Nginx 反向代理把 Dimension 的端口映射到 443 (或 80),具体方法可以看 Installing Dimension。(希望你懒得看。就算你千辛万苦部署上了里面只有几个 brige 和 某些开源社区的用爱发电 Sticker)
使用#
测试使用的客户端分别是 Android 和 Desktop 版的 Element。
测试发现 Android 端的电话图标和视频图标发起的分别是电话会议和视频会议,而 Desktop 端的是语言和视频通话。其中 Desktop 端发起的视频通话无法接通,会一直处于 connecting 的状态。(什么精分现场)
如果你只是想找一个 IM 替代品的普通用户,那么 Matrix 应该不会适合你。首先是你需要手动管理你的密钥,如果你的密钥丢了看起来就会像这样:
如果你是一个追求时尚的 Geek,以上情况或许难不了你。但是它的 UI 可能就会让你失望了。举个栗子:
如果你是一名重度 IM 用户,想必 Sticker 是相当常用的功能吧。抛开 Sticker 生态不说,如果你想发出一个 Sticker,你得先点击输入框左边的加号,然后再点击第二个 Send Sticker,等弹出来的页面加载完成后,你才能发出一个 Sticker。
EOF#
珍爱生命,远离 Matrix。