《炮打Matrix司令部，我的一张大字报》

作者 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 呢）：

Copy
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。