前言
很早之前就发现,当我们在微信聊想要买什么东西的时候,过一会购物软件就会给我们推送相应的商品广告。
很多时候其实是输入法和众多厂商联合分一杯羹,但是也不免得怀疑,我们在使用一些公共的聊天服务的时候,是否能做到数据安全?有没有泄密风险?
在即时通讯软件高度垄断的今天,我们的聊天记录、社交关系链都存储在第三方的云端。“自建服务”不再仅仅是技术爱好者的折腾,更是对个人数据主权的一种宣告。
Matrix 协议,配合其最成熟的服务器实现 Synapse,能让你构建一个完全属于自己的通讯中心。
虽然个人可能用不到这么高的数据防护需求,我也给各位演示一下个人如何实现搭建一个端到端加密的个人即时通讯服务!
一、Matrix 是什么?


Matrix 是一个:
去中心化通信协议
类似“自建微信”
支持端到端加密
支持多服务器联邦
它的核心思想:
邮箱是可以自己搭建的
聊天系统为什么不可以?
就像:
Gmail ≠ Email
微信 ≠ 聊天协议
Matrix 就是聊天协议本身。
二、部署架构说明
我们使用:
Synapse(Matrix 官方服务端)
PostgreSQL(数据库)
Element Web(网页客户端)
Nginx(反向代理)
全部用 docker-compose
我这边演示机器已经部署好了1panel,使用docker-compose可不用进入终端操作!
最终架构:
用户
↓
Nginx (443)
↓
Synapse
↓
PostgreSQL前提准备
在开始之前,确保你的服务器已安装 Docker 和 Docker Compose,并开放了以下端口:
80/443: 用于 Web 访问和联轴器(Federation)。
运行该服务可能会比较吃服务器内存,建议搭建在至少2核2GB内存的服务器。
我这为了方便演示,使用docker-compose部署。
开始部署
创建目录:
mkdir matrix && cd matrix
拉取镜像:
docker pull matrixdotorg/synapse
生成配置:
docker run -it --rm \
-v $(pwd)/data:/data \
-e SYNAPSE_SERVER_NAME=yourdomain.com \
-e SYNAPSE_REPORT_STATS=no \
matrixdotorg/synapse generate
要注意的是这边一定要改域名,以防后面生成的配置和key不匹配导致无法使用“element”终端。
生成完成后会出现:
data/homeserver.yaml
接下来是开始正式使用docker-compose配置:
version: "3.9"
services:
db:
image: postgres:15
restart: always
environment:
POSTGRES_USER: synapse
POSTGRES_PASSWORD: strongpassword #1
POSTGRES_DB: synapse
volumes:
- ./postgres:/var/lib/postgresql/data
synapse:
image: matrixdotorg/synapse:latest
depends_on:
- db
volumes:
- ./data:/data
environment:
- SYNAPSE_SERVER_NAME=yourdomain.com #2
- SYNAPSE_REPORT_STATS=no
ports:
- "8008:8008"
restart: always关注2个需要修改的地方:
密码最好用生成器生成一串至少16位以上的强密码,保存妥当。
域名要和前面填写的一致!
如果你使用的是1panel面板,可以通过面板创建:

修改数据库配置
编辑:
vim data/homeserver.yaml嫌麻烦可以在面板里操作,方便很多。
找到 database 部分改为:
database:
name: psycopg2
args:
user: synapse
password: 你前面设置的强密码!!!
database: synapse
host: db
cp_min: 5
cp_max: 10执行代码启动容器:
docker-compose up -d访问IP+端口(8008)访问。记得放开8008进行测试!或者也可以弄好反向代理!
如果要使用element必须要配置到ssl证书,使用https协议。
进阶参考
如果需要开放注册,配置邮件服务器,都需要在homeserver.yaml进行编辑。
还有反向代理配置的配置参考,可以参考如下文章:
超详细 Matrix Synapse 部署教程:一个优秀的私有 IM 解决方案-腾讯云开发者社区-腾讯云
整这个是一个非常复杂的过程,需要大家耐心解决!
问题遗留
我在实操的时候有碰到一些问题,欢迎大家积极讨论。
在使用手机端elementX注册账户的时候出现如下报错,网页端没问题

尝试架设了滑动窗口同步的模组,依旧无法使用,放弃!
群组的多人语音聊天功能。
Element 的语音/视频是 WebRTC
WebRTC 需要 NAT 穿透:STUN(探测)+ TURN(中继兜底)多人通话更依赖 TURN(尤其复杂网络环境)
配置完后依旧不支持!