为什么要自建聊天服务

微信、Slack、Discord—这些工具好用是好用,但它们都有一个共同点:你的数据在别人手里

服务器在美国,公司说关就关。聊天记录说没就没。没有端到端加密,服务商想看就看。想迁移?对不起,导不出来。

去中心化通信解决就是这个问题。协议是开放,客户端是开源,服务器你可以自己跑。换个服务器不用重新注册,联系人、聊天记录全部带走。

这就是 Matrix 做的事情。

Matrix 是什么

Matrix 是一个开放去中心化通信协议。它的核心设计理念是「联邦」—你可以自己搭一个服务器,这个服务器可以和全球其他 Matrix 服务器上用户自由通信,就像邮件一样。

  • 协议开源,有完整规范文档
  • 端到端加密(E2EE)默认开启
  • 支持文字、文件、图片、语音消息
  • 支持群组、频道概念
  • 服务器之间可以互通(联邦)
  • 客户端多样:Element 是官方桌面端,也有移动端

对于个人和小团队来说,自建 Matrix 服务器成本很低。一台 2G 内存的 VPS 足够跑起来。

Synapse 是什么

Synapse 是 Matrix 协议的官方参考实现,用 Python 写的。可以理解成 Matrix 的「服务端」—用户通过客户端(Element)连接到 Synapse,Synapse 负责存储和转发消息,同时和其他 Matrix 服务器联邦通信。

选择 Synapse 的原因:

  • 官方维护,更新稳定
  • 文档最全,社区活跃
  • Docker 部署简单,10 分钟跑起来
  • 支持 PostgreSQL,生产级存储

环境准备

  • 一台 Linux 服务器(Ubuntu 22.04 或 Debian)
  • 域名(可选,用于 HTTPS 和联邦)
  • Docker 和 Docker Compose
  • 2GB 以上内存(建议 4GB)

假设你域名是 matrix.example.com

安装 Docker

如果没有 Docker,先装一下:

apt update && apt install -y docker.io docker-compose
systemctl start docker

配置 docker-compose.yml

创建一个目录,比如 ~/matrix,然后写一个 docker-compose.yml

version: '3'

services:
  synapse:
    image: matrixdotorg/synapse:latest
    container_name: matrix-synapse
    restart: unless-stopped
    ports:
      - "8008:8008"
      - "8448:8448"
    volumes:
      - ./data:/data
    environment:
      - SYNAPSE_SERVER_NAME=matrix.example.com
      - SYNAPSE_REPORT_STATS=no
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8008/health"]
      interval: 30s
      timeout: 10s
      retries: 3

  postgres:
    image: postgres:15
    container_name: matrix-postgres
    restart: unless-stopped
    environment:
      POSTGRES_DB: synapse
      POSTGRES_USER: synapse
      POSTGRES_PASSWORD: your_strong_password_here
    volumes:
      - ./postgres:/var/lib/postgresql/data

这里把数据库从默认 SQLite 改成了 PostgreSQL。生产环境推荐用 PostgreSQL,性能和可靠性都更好。

生成配置文件

先启动一次让 Synapse 自动生成配置:

cd ~/matrix
docker-compose up -d postgres
sleep 5
docker-compose run --rm synapse generate

命令执行完后,会在 data 目录下生成 homeserver.yaml,这就是 Synapse 的主配置文件。

配置注册方式

Synapse 默认关闭公开注册,但自己用话可以打开:

编辑 data/homeserver.yaml,找到 enable_registration 改成 true:

enable_registration: true

注意:生产环境建议配合注册验证码(Captcha)或邀请制使用,防止恶意注册刷服务器。

配置反向代理

直接暴露 Synapse 的端口不安全,而且 Synapse 内部的 API 需要通过反向代理访问。Nginx 配置如下:

server {
    listen 443 ssl http2;
    server_name matrix.example.com;

    ssl_certificate /path/to/fullchain.pem;
    ssl_certificate_key /path/to/privkey.pem;

    location / {
        proxy_pass http://localhost: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;
        # WebSocket 支持
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

记得申请 SSL 证书:

apt install -y certbot
certbot certonly --nginx -d matrix.example.com

配置联邦(.well-known)

要让其他 Matrix 服务器能找到你服务器,需要在主域名添加一个 .well-known 记录:

server {
    listen 80;
    server_name example.com;
    location /.well-known/matrix/client {
        default_type application/json;
        return 200 '{"m.server": "matrix.example.com:443"}';
    }
    location / {
        # 原有配置
    }
}

这一步不能省。没有这个,其他服务器就不知道怎么跟你通信。

启动服务

docker-compose up -d

检查健康状态:

curl http://localhost:8008/health

返回 {"status":"ok"} 就说明跑起来了。

创建管理员账号

Synapse 没有单独创建管理员命令,需要通过注册接口创建,然后手动提升权限:

先在配置里开启 registration shared secret:

registration_shared_secret: "your_very_long_random_secret_here"

重启服务后用这个 secret 注册:

curl -X POST http://localhost:8008/_matrix/client/r0/register \
  -H "Content-Type: application/json" \
  -d '{
    "auth": {"session": null, "type": "m.login.dummy"},
    "username": "your_username",
    "password": "your_password"
  }'

然后用 Matrix 客户端(Element)登录就可以了。创建第一个账号后,把这个账号设为管理员:

docker exec matrix-synapse register_new_matrix_user \
  -u admin_username \
  -p admin_password \
  -a \
  http://localhost:8008

-a 参数表示创建管理员账号。

使用 Element 客户端

Synapse 跑起来之后,下载 Element,填入你服务器地址 https://matrix.example.com 就可以登录了。

第一次用可以先加入几个公共房间体验一下:

  • #matrix:matrix.org — Matrix 官方公告室
  • #synapse:matrix.org — Synapse 开发讨论

端到端加密

Matrix 的端到端加密(E2EE)默认是开启。新设备首次登录会提示你设置恢复密钥,保存好这个密钥,丢了就再也解密不了历史消息了。

加密的作用是:服务器本身也看不到你消息内容。服务器只负责转发密文,私钥存在你设备上。这个设计保证了数据主权—即使服务器入侵,攻击者拿到也只是乱码。

日常维护

备份

Synapse 的数据在 data 目录,PostgreSQL 的数据在 postgres 目录。定期打包备份就好。

更新

cd ~/matrix
docker-compose pull
docker-compose up -d

Synapse 更新比较频繁,建议每个月更新一次。

监控

Synapse 自带 metrics 接口,可以接 Prometheus 和 Grafana 做监控。看几个关键指标就够了:

  • synapse_federation_client_sent_pdu_seconds — 发送消息数
  • synapse_handlers_delta_replication_data — 联邦延迟
  • 内存使用量 — 超过 80% 就该考虑升级了

写在

自建 Matrix 服务的感觉是:终于有一个聊天工具是你真正拥有

数据在自己服务器上,协议是开放,换服务器不用换账号。和朋友聊天用是同一个协议,只是服务器不同—这才是互联网该有样子。

Synapse 的缺点也要说一下:Python 写的,资源占用不算低;E2EE 在多设备场景下管理起来有点麻烦;移动端推送在国内网络环境下不太好用。这些问题在长期使用中会感受到,但整体来说瑕不掩瑜。

如果你对数据主权有要求,或者只是想摆脱中心化平台控制,Matrix 是一个值得投入方案。

种下你的想法

在花园里留下一条评论,和这篇文章一起生长。

COMMENTS