首頁 > 軟體

開源框架 Matrix-Dendrite 搭建聊天伺服器的詳細過程

2022-03-10 13:00:44

開源框架 Matrix-Dendrite 搭建聊天伺服器

關於Matrix

Matrix 是一個開源、可互動、去中心化的實時通訊服務架構。使用 Matrix 可以搭建安全的通訊伺服器,配合支援 Matrix 的使用者端可以實現個人、團隊間的實時聊天互動。

Matrix 相較於普通的通訊服務(如微信、QQ等軟體使用的服務),最特別的地方在於其去中心化的架構。每個執行著 Matrix 的伺服器都是一個節點(homeserver),使用者可以選擇在任意節點進行註冊、連線,和處於同一節點的其他使用者自由交流,使用者的隱私資料以加密的形式儲存於當前的節點上。同時,節點與節點間也可以通過聯鎖(Federation)機制進行通訊,使在不同節點上的使用者之間可以互相交流。得益於去中心化的服務架構,使用者完全可以自行搭建節點伺服器,使自己的聊天資料安全和隱私得到保護。

支援 Matrix 協定的使用者端有很多,比較成熟的有 Element.io(Riot.IM),語音、視訊通話、附件等功能都有,並且支援 Windows,Linux,Android 等多個平臺。

開始搭建

Matrix 的伺服器端有兩種:Synapse 和 Dendrite。

Synapse 是用 Python 編寫的第一代 Matrix 伺服器端,是十分穩定的正式版,使用者非常多,適合用於生產環境中。Dendrite 是 Matrix 的開發團隊使用 Go 語言編寫的第二代 Matrix 伺服器端,它旨在為 Synapse 提供一個高效、可靠、可延伸的替代方案。目前 Dendrite 仍然在 Beta 開發中,像推播和提醒等一些功能還沒有實現。

如果是生產環境使用,還是搭建 Synapse,更穩定並且相關的教學也十分豐富。

本文使用 Dendrite 來搭建,在 Unraid 系統通過 Docker 容器來實現,主要是想嚐鮮噠!在其他系統下也可以參照本文進行部署。

需要準備的'東西'

  • 一個域名和該域名的有效 TLS 證書
  • 一個反向代理服務,比如 Nginx
  • 可選:高效能資料庫引擎,推薦 PostgreSQL。對效能無要求可以使用內建的 SQLite。

PostgreSQL

Matrix 並不強制要求使用哪種資料庫,少量使用者的情況下完全可以使用其內建的 SQLite 資料庫。如果系統內已經有其他資料庫引擎執行,當然也可以直接使用。本文只是按照官方推薦使用 PostgreSQL 作為 Matrix 資料庫的管理引擎。

01.建立 PostgreSQL 組態檔目錄

在安裝 PostgreSQL Docker 前,先建立組態檔目錄 /mnt/user/appdata/PostgreSQL/

存取 https://github.com/matrix-org/dendrite/tree/main/build/docker/postgres 下載 create_db.sh 檔案,使用文字編輯器開啟它,修改程式碼中使用者名稱欄位為自己的資料庫使用者名稱。

# 這段程式碼的作用是初始化資料庫,所以語句中的 Username 必須要替換成自己的資料庫管理員使用者名稱。
for db in userapi_accounts userapi_devices mediaapi syncapi roomserver keyserver federationapi appservice mscs; do
    createdb -U [Username] -O [Username] dendrite_$db # 注意修改[Username]
done

最後將 create_db.sh 檔案上傳到組態檔目錄裡:/mnt/user/appdata/PostgreSQL/create_db.sh

02.建立 databases 資料夾儲存資料庫

建立目錄用來存放 PostgreSQL 的資料庫:

/mnt/user/appdata/PostgreSQL/databases

03.設定 Docker 命令建立容器

本文使用 Unraid 系統進行搭建,進入 DOCKER -> ADD CONTAINER 即可設定容器引數。也可以使用 Unraid 外掛中心進行安裝。其他系統使用 docker create 命令可能還更簡單,所以本文也將建立容器的命令列字串附於其後。

Unraid 建立容器需要新增/修改的引數如下:

[Type] Variable            [Name] 管理員使用者名稱
[Key]  POSTGRES_USER       [Value] FrozenSky

[Type] Variable            [Name] 管理員密碼
[Key]  POSTGRES_PASSWORD   [Value] xxxxxxx
[Type] Path                [Name] 資料庫儲存路徑
[Container Path] /var/lib/postgresql/data
[Host Path]      /mnt/user/appdata/PostgreSQL/databases
[Access Mode]    Read/Write
[Type] Path                [Name] 資料庫初始化指令碼
[Container Path] /docker-entrypoint-initdb.d/20-create_db.sh
[Host Path]      /mnt/user/appdata/PostgreSQL/create_db.sh
[Type] Port                [Name] 埠對映
[Container Port] 5432
[Host Port]      5432

另外,官方還推薦開啟容器健康狀態檢查功能,在新增容器介面點選高階檢視(ADVANCED VIEW),在 Post Arguments 中新增下面的語句:

--health-cmd='["CMD-SHELL", "pg_isready -U dendrite"]' --health-interval=5s --health-timeout=5s --health-retries=5

設定完成後,點選 APPLY 即可建立容器。

國內網路存取 DockerHub 可能出現無法連線的問題,可以通過阿里雲加速來解決。網路上教學很多,但多是需要更改 Unraid 系統檔案,其實完全沒必要。Docker 命令是支援自定義拉取伺服器的。只需要在設定介面中倉庫(Repository)這一欄新增加速伺服器即可:

比如:dazeaikzq.mirror.aliyuncs.com/library/postgres:14

關於 HEALTHCHECK

官方 docker-compose 檔案中,有個 HEALTHCHECK 欄位,如果使用 docker-cli 啟動容器的話可以參照下面的欄位進行替換。這個欄位是設定容器健康狀態檢查的,貌似不加也可以。

 --health-cmd            Command to run to check health
  --health-interval       Time between running the check
  --health-retries        Consecutive failures needed to report unhealthy
  --health-timeout        Maximum time to allow one check to run
  --health-start-period   Start period for the container to initialize before starting health-retries countdown
  --no-healthcheck        Disable any container-specified HEALTHCHECK

附:命令列方式建立Docker

docker create
    --name='PostgreSQL' 
    --net='bridge' 
    -e TZ="Asia/Shanghai" 
    -e HOST_OS="Unraid" 
    -e 'POSTGRES_PASSWORD'='xxxxxxx' 
    -e 'POSTGRES_USER'='FrozenSky' 
    -e 'POSTGRES_DB'='' 
    -p '5432:5432/tcp' 
    -v '/mnt/user/appdata/PostgreSQL/databases':'/var/lib/postgresql/data':'rw' 
    -v '/mnt/user/appdata/PostgreSQL/create_db.sh':'/docker-entrypoint-initdb.d/20-create_db.sh':'rw' 
    --restart=always 'postgres:14'
    --health-cmd='["CMD-SHELL", "pg_isready -U dendrite"]' 
    --health-interval=5s
    --health-timeout=5s
    --health-retries=5 

04.連線資料庫以確認初始化正常

可以使用 PGAdmin、dbeaver、phpMyAdmin 等管理軟體連線遠端資料庫,檢視是否已經建立了好多個 dendrite 開頭的資料。

PostgreSQL 的預設連線地址是: [IP]:5432

Matrix-Dendrite

Matrix-Dendrite 伺服器端分為2個版本,monolithpolylith,本文選擇了 monolith,因為它的各個元件都是整合在一起的,設定簡單。

Dendrite 的 Github 倉庫:https://github.com/matrix-org/dendrite

01.建立 Dendrite 資料夾儲存組態檔

建立目錄:/mnt/user/appdata/Dendrite/config

該目錄下必須包含如下檔案:

  • dendrite.yaml 組態檔
  • matrix_key.pem 伺服器端金鑰(通過下文的命令生成)
  • server.crt 證書檔案(打算作為Matrix伺服器的域名的證書)
  • server.key 證書私鑰

(1) 生成 matrix_key.pem 伺服器金鑰檔案

把你的網站域名證書和私鑰上傳到設定目錄裡:

/mnt/user/appdata/Dendrite/config/server.key
/mnt/user/appdata/Dendrite/config/server.crt

開啟 Unraid 終端,進入組態檔目錄,執行下面的 Docker 命令:

# 注意:命令引數中 -tls-cert 和 -tls-key 的檔名要和上面保持一致。
docker run --rm --entrypoint="" 
  -v $(pwd):/mnt 
  matrixdotorg/dendrite-monolith:latest 
  /usr/bin/generate-keys 
  -private-key /mnt/matrix_key.pem 
  -tls-cert /mnt/server.crt 
  -tls-key /mnt/server.key

該命令將在當前目錄中生成伺服器端金鑰 matrix_key.pem

# 命令輸出
Created TLS cert file:    /mnt/server.crt
Created TLS key file:     /mnt/server.key
Created private key file: /mnt/matrix_key.pem

(2) 修改 Dendrite 組態檔

從 Github 倉庫下載組態檔 dendrite.yaml 範例進行修改。下載地址: 組態檔範例

以下組態檔將假設我的域名是 frozensky.org 並且打算在 1443 埠進行反向代理,將 Matrix 的 API 請求進行轉發;我的資料庫使用者名稱是 FrozenSky 密碼是 xxxxxxx ,資料庫存取地址是:192.168.7.9:5432

主要修改的地方如下:

# 域名(運營商封443的話,就要填寫你的自定義反向代理埠)
server_name: frozensky.org:1443
# 伺服器私鑰路徑(上文生成的私鑰)
private_key: /etc/dendrite/matrix_key.pem
# Well-known服務的域名(同域名)
well_known_server_name: "frozensky.org:1443"
# 每個元件的資料庫連線字串 connection_string 
# 組態檔中所有元件的資料庫連線URL都要改(使用內建SQLite則不需要改)
connection_string: postgresql://FrozenSky:xxxxxxxx@192.168.7.9:5432/............

# 註釋掉 JetStream 預設的伺服器地址
# Configuration for NATS JetStream
  jetstream:
    addresses:
    # - jetstream:4222  #註釋該行
    storage_path: /etc/JetStream_NATS #設定一個容器內目錄用來儲存資料

02.建立資料儲存目錄

建立一些目錄用來儲存 Dendrite 的資料:

JetStream:/mnt/user/appdata/Dendrite/JetStream

Media: /mnt/user/appdata/Dendrite/media

03.建立 Dendrite 容器

使用官方映象:matrixdotorg/dendrite-monolith

以下是容器設定:

[Type] Port 1              [Name] 埠對映
[Container Port] 8008
[Host Port]      8008

[Type] Port 2              [Name] 埠對映
[Container Port] 8448
[Host Port]      8448
[Type] Path                [Name] 組態檔路徑
[Container Path] /etc/dendrite
[Host Path]      /mnt/user/appdata/Dendrite/config
[Access Mode]    Read/Write
[Type] Path                [Name] 媒體檔案路徑
[Container Path] /var/dendrite/media
[Host Path]      /mnt/user/appdata/Dendrite/media
[Type] Path                [Name] JetStream路徑
[Container Path] /etc/JetStream_NATS
[Host Path]      /mnt/user/appdata/Dendrite/JetStream

在新增容器介面點選高階檢視(ADVANCED VIEW),在 Post Arguments 中新增下面的語句:

--tls-cert=server.crt --tls-key=server.key

點選 APPLY 建立容器。

Nginx反向代理

安裝完成 Dendrite 後,其實 Matrix 服務架構的後端就已經執行起來了,但想要讓使用者端軟體與我們的伺服器端通訊還需要通過 Nginx 設定,將使用者端的請求轉發到對應的伺服器埠上來。

修改 Nginx 組態檔 /etc/nginx/sites-available (Nginx版本不同組態檔路徑可能不同)

以本文環境為例,因運營商封殺443埠,我在路由上將 1443 埠轉發到內部的 443 埠。組態檔要修改的部分本文都作了註釋,就不再為 Nginx 的設定做過多說明了,遇到問題可以自行搜尋,教學還是很詳細的。

server {
	listen 80;
	listen 443 ssl;
	server_name frozensky.org; #域名
	charset utf-8;

	#ssl on;
	ssl_certificate     /etc/ssl/frozensky.org/fullchain.crt; #證書
	ssl_certificate_key /etc/ssl/frozensky.org/frozensky.org.key; #金鑰
	ssl_session_timeout 5m;
	ssl_protocols       SSLv2 SSLv3 TLSv1 TLSv1.2;
	ssl_ciphers         HIGH:!aNULL:!MD5;
	ssl_prefer_server_ciphers   on;
    # 代理請求的一些設定
    proxy_set_header Host      $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_read_timeout         600;
	
    # Dendrite組態檔中的server_name,注意埠是外部埠!!!
    location /.well-known/matrix/server {
        return 200 '{ "m.server": "frozensky.org:1443" }'; 
    }
	# Dendrite組態檔中的server_name,注意埠是外部埠!!!
    location /.well-known/matrix/client {
        return 200 '{ "m.homeserver": { "base_url": "https://frozensky.org:1443" } }';
    # Dendrite後端的地址,IP是搭建Dendrite的伺服器IP,埠是8008
    location /_matrix {
        proxy_pass http://192.168.7.10:8008;
}

設定完成後儲存退出。

過載組態檔和證書,重啟Nginx服務

sudo service nginx force-reload
sudo service nginx restart

測試連線

至此,Matrix 服務就全部設定完成了,可以存取 Federation Tester 輸入自己的 Matrix 網址 https://frozensky.org:1443 進行測試,全部通過的話就表示服務執行正常且 Federation 聯鎖也已啟用,可以和其他伺服器的小夥伴進行通訊了。本文推薦安裝 Element.io 使用者端來使用,雖然 Matrix-Dendrite 還處於開發測試階段,但經過這幾天的使用發現主要功能並沒有什麼問題。

Reference

在Docker命令中使用HEALTHCHECK

https://docs.docker.com/engine/reference/run/

Federation連線測試

Federation Tester

到此這篇關於開源框架 Matrix-Dendrite 搭建聊天伺服器的文章就介紹到這了,更多相關Matrix Dendrite聊天伺服器內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com