作者 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。