LemonHX

LemonHX

CEO of Limit-LAB 喜欢鼓捣底层的代码,意图改变世界
twitter
tg_channel

《炮打Matrix司令部,我的一張大字報》

新建项目 - 300x300.jpg

作者 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_serverkey_server 兩個 component 的配置,還有 user_api.account_databaseuser_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。

公开账号注册#

如果你希望能在客戶端註冊賬號而不是在服務器上,你需要公開賬號註冊。

公開賬號註冊有兩種方法:

  1. (不安全) 將 YAML 裡的 client_api.registration_disabled 設為 false,然後在 dendrite-monolith-server 的啟動參數添加 -really-enable-open-registration
  2. Enable reCAPTCHA verification registration。(讓 Google 白嫖你的大腦算力

部署#

在部署之前記得把 global.server_nameglobal.well_known_server_nameglobal.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 應該不會適合你。首先是你需要手動管理你的密鑰,如果你的密鑰丟了看起來就會像這樣: missing_key-138x300.jpg

如果你是一個追求時尚的 Geek,以上情況或許難不了你。但是它的 UI 可能就會讓你失望了。舉個栗子: awful_layout-300x106.jpg

如果你是一名重度 IM 用戶,想必 Sticker 是相當常用的功能吧。拋開 Sticker 生態不說,如果你想發出一個 Sticker,你得先點擊輸入框左邊的加號,然後再點擊第二個 Send Sticker,等彈出來的頁面加載完成後,你才能發出一個 Sticker。

EOF#

珍愛生命,遠離 Matrix。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。