Matrix Synapse 去中心化加密聊天服务器部署教程（开源no IM）

在开始之前
我的blog上的这篇文章

如果你对相关概念不太熟悉，可以跳转到最下面的介绍

部署

1. 部署PostgreSQL

安装过程可以参照搜索引擎，这样不过多阐述

创建数据库

如果你的数据库超级用户名为user

Copy
psql -U user # 进入数据库

创建一个新用户（假设用户名为 synapse_user）：

Copy
CREATE USER synapse_user WITH PASSWORD 'password';

将 password 替换为你想要设置的密码。

创建数据库 synapse

Copy
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 文件，内容如下：

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

这个文件告诉其他 Matrix 服务器，实际的 Synapse 服务器地址是 chat.my-example.com:443

docker 部署

安装docker 的操作可以见搜索引擎

Copy
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

Copy
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

运行

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

创建管理员用户

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

3. Nginx 反向代理

Copy
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: A glossy Matrix collaboration client for the web.

去release下载最新版解压到服务器网站目录即可（静态部署）

记得更改config.sample.json ，里面要改成你的服务器地址，文件名变更为config.json

管理端

Awesome-Technologies/synapse-admin: Admin console for synapse Matrix homeserver

去release下载最新版解压到服务器网站目录即可（静态部署）

5. 测试

用 Matrix Federation Tester 进行测试。输入 server_name ，观察输出结果。

介绍

什么是 Matrix？

Matrix 协议的灵活性和安全性使其成为一个强大的通信解决方案，特别适用于那些关注隐私和通信自由的用户。开放性和互操作性使 Matrix 协议成为一个极有前景的通信标准。

Matrix 有以下特点：

分散式架构：Matrix 采用了分散式架构，没有单一的中央服务器，而是由多个独立的服务器组成网络。这意味着用户可以选择自己的服务器，或者自行托管服务器，而不必依赖单一的服务提供商。

端到端加密：Matrix 提供了端到端加密的支持，确保消息在发送方和接收方之间加密，中间服务器无法访问消息内容。这提供了高级的通信隐私和安全性。

互操作性：Matrix 的一个主要目标是实现不同通信应用之间的互操作性。这意味着用户可以使用不同的客户端应用程序，仍然能够与其他用户进行通信，无论他们使用哪种应用程序或服务器。

开源和开放标准：Matrix 协议是一个开放标准，可供任何人查看和实施。这种开放性有助于确保安全性和可扩展性，并减少了隐藏的后门风险。

多种身份验证机制：Matrix 支持多种身份验证方式，包括用户名和密码、单点登录、OpenID Connect 等，使用户能够选择适合他们需求的身份验证方式。

活跃的社区支持：Matrix 社区非常活跃，有大量的开发者和用户参与，不断改进和扩展协议，以满足不断变化的通信需求。

作为一个去中心化通讯协议，你可以使用不同的客户端（只要客户端支持 Matrix 协议），连接到任意一个 Matrix 服务端。

Matrix 协议支持诸多特性：

去中心化通信（选择任意一台 Matrix 服务器创建账号，再通过 “联邦” 和其它服务器上的用户通信）

端到端加密

WebRTC 语音通话 / 视频通话（没错！Matrix 协议居然支持视频通话）

消息已读提示

输入状态提示

群组聊天

什么是端到端加密？

端到端加密可以理解为是两台终端的直接通信，我们举个例子更容易理解：

假设小明用 A 设备 给小红的 B 设备 发了一条消息，这时候小黑想看看他俩在聊什么，于是小黑盗取了小红的账号密码，并成功在 C 设备 上登录了小红的账号。

小黑能不能看到他们俩的聊天记录呢？不能。在端到端加密对话中，所有发出去的消息都会被自动加密。

当小明给小红发送一段消息时，还会自动附上一串用于解密这段消息的 解密密钥 。小红在 B 设备 上收到消息时，同时收到了这串 解密密钥 ，所以能正常查看消息。但小黑后来登录时使用的 C 设备 并没有收到 解密密钥 ，因此无法解密这些历史消息。

端到端加密算是当今相对最安全的一种隐私保护方式，能够满足大多数人的安全需求。

Synapse 是什么？

Matrix 是一个协议，而 Matrix Synapse 则是 Matrix 协议的一个具体实现。

除了 Synapse，Matrix 还包含许多其它分支，例如 Dendrite：

另外，Synapse 本身也只是一个不包含图形界面的服务端，我们还需要一个支持 Matrix 协议的客户端才能正常聊天。常见支持 Matrix 协议的客户端例如 Element (最为熟知和常用)