Dorimu

Dorimu

Matrix Synapse 去中心化加密聊天伺服器部署教程(開源no IM)

在開始之前#

我在blog上的這篇文章

如果你對相關概念不太熟悉,可以跳轉到最下面的介紹

部署#

1. 部署PostgreSQL#

安裝過程可以參照搜索引擎,這樣不過多闡述

創建數據庫#

如果你的數據庫超級用戶名為user

psql -U user # 進入數據庫

創建一個新用戶(假設用戶名為 synapse_user):

CREATE USER synapse_user WITH PASSWORD 'password';

將 password 替換為你想要設置的密碼。

創建數據庫 synapse

CREATE DATABASE synapse
    WITH ENCODING 'UTF8'
    LC_COLLATE 'C'
    LC_CTYPE 'C'
    TEMPLATE template0;
GRANT ALL PRIVILEGES ON DATABASE synapse TO synapse_user;

2. 安裝 Synapse #

因為我希望 Synapse 伺服器的 server_name(用戶 ID 的後綴,如 @user:my-example.com)與實際訪問的域名(如 chat.my-example.com,你伺服器分配的域名),所以要通過 Delegation(委託) 來實現。

在 server_name 的根域名(my-example.com)下,創建一個 .well-known/matrix/server 文件,內容如下:

{
  "m.server": "chat.my-example.com:443"
}

這個文件告訴其他 Matrix 伺服器,實際的 Synapse 伺服器地址是 chat.my-example.com:443

docker 部署#

安裝docker 的操作可以見搜索引擎

docker run -it --rm -v /data/matrix-synapse-data/:/data/ -e SYNAPSE_SERVER_NAME=你的服務端域名 -e SYNAPSE_REPORT_STATS=no matrixdotorg/synapse:latest generate

解釋一下各個參數:

-e SYNAPSE_REPORT_STATS 是否發送匿名統計數據

-v /data/matrix-synapse-data/:/data/ 是映射的具體路徑,可以不用修改

-e SYNAPSE_SERVER_NAME 是你的服務端域名,不是 server_name

Synapse 配置#

到了本片教程最坑的地方,一定要注意,同時yml有嚴格的縮進和標點,出錯了要仔細排除

配置 Synapse 主要是配置位於 /data/matrix-synapse-data/ 的 homeserver.yaml

這裡給出我的示例,一定要注意!其他內容可以參照官方文檔Configuration - Synapse

server_name: "my-example.com"
public_baseurl: https://chat.my-example.com/ #輸入你的域名
pid_file: /data/homeserver.pid
listeners:
  - port: 8008
    tls: false
    type: http
    x_forwarded: true
    resources:
      - names: [client, federation, openid]
        compress: false
database:  #按照你的數據庫配置
    name: psycopg2
    args:
        user: synapse_user
        password: password
        database: synapse
        host: 192.168.1.1
        cp_min: 5
        cp_max: 10
        keepalives_idle: 30
        keepalives_interval: 10
        keepalives_count: 3
log_config: "/data/dorimu.cn.log.config"
media_store_path: /data/media_store

# 這幾行自動生成的,內容不要動
registration_shared_secret: ""
report_stats: false
macaroon_secret_key: ""
form_secret: ""
signing_key_path: ""


trusted_key_servers:
  - server_name: "matrix.org"
suppress_key_server_warning: true
# 為新用戶啟用註冊
enable_registration: true
# 無需電子郵件或 recaptcha 驗證即可註冊(其實不推薦)
enable_registration_without_verification: false
email: #郵件配置
  smtp_host: smtp-mail.outlook.com
  smtp_port: 587
  smtp_user: "11" #用戶名
  smtp_pass: "11"
  force_tls: false
  require_transport_security: false
  enable_tls: true
  notif_from: "user" #用戶名
  enable_notifs: true
  notif_for_new_users: false
  client_base_url: "https://my-example.com"
  validation_token_lifetime: 15m
  invite_client_location: https://my-example.com
registrations_require_3pid:
  - email

運行#

docker run -d --name synapse -v /data/matrix-synapse-data/:/data/ -p 8008:8008 -p 8009:8009 -p 8448:8448 matrixdotorg/synapse:latest

創建管理員用戶#

docker exec -it synapse register_new_matrix_user http://localhost:8008 -c /data/homeserver.yaml -a -u 用戶名 -p 密碼

3. Nginx 反向代理#

location ^~ /_matrix/ {
    proxy_pass http://127.0.0.1:8008; 
    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header REMOTE-HOST $remote_addr; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection $http_connection; 
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_http_version 1.0; 
    add_header X-Cache $upstream_cache_status; 
    add_header Cache-Control no-cache; 
    proxy_ssl_server_name off; 
    proxy_ssl_name $proxy_host; 
}
location ^~ /_synapse/ {
    proxy_pass http://127.0.0.1:8007; 
    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header REMOTE-HOST $remote_addr; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection $http_connection; 
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_http_version 1.0; 
    add_header X-Cache $upstream_cache_status; 
    add_header Cache-Control no-cache; 
    proxy_ssl_server_name off; 
    proxy_ssl_name $proxy_host; 
}

4. 按照網頁端和管理端(可選)#

網頁端#

element-hq/element-web: 一個光鮮的 Matrix 協作客戶端,適用於網頁。

去release下載最新版解壓到伺服器網站目錄即可(靜態部署)

記得更改config.sample.json ,裡面要改成你的伺服器地址,文件名變更為config.json

管理端#

Awesome-Technologies/synapse-admin: Synapse Matrix 伺服器的管理控制台

去release下載最新版解壓到伺服器網站目錄即可(靜態部署)

5. 測試#

用 Matrix Federation Tester 進行測試。輸入 server_name ,觀察輸出結果。

介紹#

什麼是 Matrix?#

Matrix 協議的靈活性和安全性使其成為一個強大的通信解決方案,特別適用於那些關注隱私和通信自由的用戶。開放性和互操作性使 Matrix 協議成為一個極有前景的通信標準。

Matrix 有以下特點:

  1. 分散式架構:Matrix 采用了分散式架構,沒有單一的中央伺服器,而是由多個獨立的伺服器組成網絡。這意味著用戶可以選擇自己的伺服器,或者自行托管伺服器,而不必依賴單一的服務提供商。
  2. 端到端加密:Matrix 提供了端到端加密的支持,確保消息在發送方和接收方之間加密,中間伺服器無法訪問消息內容。這提供了高級的通信隱私和安全性。
  3. 互操作性:Matrix 的一個主要目標是實現不同通信應用之間的互操作性。這意味著用戶可以使用不同的客戶端應用程序,仍然能夠與其他用戶進行通信,無論他們使用哪種應用程序或伺服器。
  4. 開源和開放標準:Matrix 協議是一個開放標準,可供任何人查看和實施。這種開放性有助於確保安全性和可擴展性,並減少了隱藏的後門風險。
  5. 多種身份驗證機制:Matrix 支持多種身份驗證方式,包括用戶名和密碼、單點登錄、OpenID Connect 等,使用戶能夠選擇適合他們需求的身份驗證方式。
  6. 活躍的社區支持:Matrix 社區非常活躍,有大量的開發者和用戶參與,不斷改進和擴展協議,以滿足不斷變化的通信需求。

作為一個去中心化通訊協議,你可以使用不同的客戶端(只要客戶端支持 Matrix 協議),連接到任意一個 Matrix 服務端。

Matrix 協議支持諸多特性:

  • 去中心化通信(選擇任意一台 Matrix 伺服器創建賬號,再通過 “聯邦” 和其它伺服器上的用戶通信)
  • 端到端加密
  • WebRTC 語音通話 / 視頻通話(沒錯!Matrix 協議居然支持視頻通話)
  • 消息已讀提示
  • 輸入狀態提示
  • 群組聊天

什麼是端到端加密?#

端到端加密可以理解為是兩台終端的直接通信,我們舉個例子更容易理解:

假設小明用 A 設備 給小紅的 B 設備 發了一條消息,這時候小黑想看看他倆在聊什麼,於是小黑盜取了小紅的賬號密碼,並成功在 C 設備 上登錄了小紅的賬號。

小黑能不能看到他們倆的聊天記錄呢?不能。在端到端加密對話中,所有發出去的消息都會被自動加密。

當小明給小紅發送一段消息時,還會自動附上一串用於解密這段消息的 解密密鑰 。小紅在 B 設備 上收到消息時,同時收到了這串 解密密鑰 ,所以能正常查看消息。但小黑後來登錄時使用的 C 設備 並沒有收到 解密密鑰 ,因此無法解密這些歷史消息。

端到端加密算是當今相對最安全的一種隱私保護方式,能夠滿足大多數人的安全需求。

Synapse 是什麼?#

Matrix 是一個協議,而 Matrix Synapse 則是 Matrix 協議的一個具體實現。

除了 Synapse,Matrix 還包含許多其它分支,例如 Dendrite:

另外,Synapse 本身也只是一个不包含圖形界面的伺服器,我們還需要一個支持 Matrix 協議的客戶端才能正常聊天。常見支持 Matrix 協議的客戶端例如 Element (最為熟知和常用)

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