Matrix 服务器部署(Docker)+ FluffyChat 安卓端安装 — 完整调研报告
Matrix 服务器部署(Docker)+ FluffyChat 安卓端安装 — 完整调研报告
写在前面:本文是给自己留底的自建笔记。
你拿到的内容是 2026-08-05 调研时间点的快照 — Element 官方文档 + GitHub 仓库 + F-Droid/Play 商店 + 中文社区 docker-compose 实践四路源头交叉验证。
一、Matrix 协议 & Synapse 是什么
Matrix 是开源、联邦化、E2EE 实时通信协议(类似 SMTP,不是单一产品)。客户端可自由选择,服务端可自建或联邦。
Synapse 是 Element 维护的 Matrix homeserver(服务端)参考实现,Python 写,AGPL/商业双协议。当前最新主分支 develop(GitHub element-hq/synapse)。
替代品:
- Dendrite(Go — 性能更好但特性较少)
- Tuwunel(Rust fork,低内存,适合小团队)
- Conduit(Rust,更轻量)
本文走的是官方推荐的 Synapse 路线。
二、硬件需求
| 场景 | CPU | 内存 | 磁盘 | 来源 |
|---|---|---|---|---|
| 官方最低(小房间) | 1 核 | 1 GB(建议 ≥ 2 GB) | 5 GB | Element 官方文档 |
| 推荐(多用户 / 联邦活跃) | 2 核 | 4 GB | 50 GB SSD | selfhostvps 2026 评测 |
| 跑大公共房间 | — | ≥ 1 GB 富裕 | — | 官方 README |
关键提醒:资源消耗不是跟着用户数走,而是跟着联邦房间活跃度走。一个号挂在大公共房间里可能比 10 个内部号还费内存。建议起步 2 vCPU / 4 GB / 50 GB SSD,留升级空间。
三、官方 Docker 镜像
- Docker Hub:
matrixdotorg/synapse:latest(默认 SQLite,不适合生产) - GitHub Container Registry:
ghcr.io/element-hq/synapse:latest(Element 官方构建,alpha/beta 同步更及时) - 官方 README 强调:生产必须切 PostgreSQL
- 镜像内置 jemalloc(默认开启)
- TURN 服务在外部自己搭(Synapse 容器不内置)
四、最小可跑 docker-compose(生产精简版)
version: "3"
networks:
synapse:
name: synapse
driver: bridge
services:
synapse:
image: matrixdotorg/synapse:latest
container_name: matrix-synapse
restart: unless-stopped
volumes:
- ./data:/data # 配置 / 签名密钥 / 媒体存储
environment:
- SYNAPSE_SERVER_NAME=matrix.example.com
- SYNAPSE_REPORT_STATS=yes
- TZ=Asia/Shanghai
depends_on:
- db
networks:
- synapse
db:
image: postgres:15
container_name: matrix-pg
restart: unless-stopped
environment:
- POSTGRES_PASSWORD=changeme
- POSTGRES_INITDB_ARGS=--encoding=UTF8 --lc-collate=C --lc-ctype=C
volumes:
- ./postgres:/var/lib/postgresql/data
- ./init:/docker-entrypoint-initdb.d
networks:
- synapse
数据库初始化脚本 ./init/matrix.sql
CREATE USER matrix WITH PASSWORD 'changeme';
CREATE DATABASE matrix WITH OWNER = matrix
ENCODING = 'UTF8' LC_COLLATE = 'C' LC_CTYPE = 'C' TEMPLATE = template0;
GRANT ALL PRIVILEGES ON DATABASE matrix TO matrix;
五、配置文件生成与 Postgres 切换
# 1. 生成 homeserver.yaml + 签名密钥
docker run -it --rm \
-v ./data:/data \
-e SYNAPSE_SERVER_NAME=matrix.example.com \
-e SYNAPSE_REPORT_STATS=yes \
matrixdotorg/synapse:latest generate
# 2. 改 homeserver.yaml 切 Postgres
database:
name: psycopg2
args:
user: matrix
password: changeme
dbname: matrix
host: db
cp_min: 5
cp_max: 10
# 3. 加 .well-known & 客户端地址
serve_server_wellknown: true
public_baseurl: https://matrix.example.com
六、反向代理(外网访问必备)
Element 官方文档给出 nginx / Apache / Caddy / HAProxy / NPM 完整模板。关键点:
- 客户端走 443,
location ~ ^/_matrix转发到localhost:8008 - 联邦走 8448(用
_well-known/matrix/server指到 443 即可不开 8448) - 反代不得改 URL(不要做 path rewrite),否则签名校验失败
client_max_body_size至少 50M(synapse 默认max_upload_size)
Caddy 最小配置
matrix.example.com {
reverse_proxy /_matrix/* localhost:8008
reverse_proxy /_synapse/client/* localhost:8008
}
Nginx(联邦端口走 443 推荐)
server {
listen 443 ssl;
server_name example.com;
location ~ ^(/_matrix|/_synapse/client) {
proxy_pass http://localhost:8008;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 50M;
proxy_http_version 1.1;
}
location /.well-known/matrix/server {
return 200 '{"m.server": "matrix.example.com:443"}';
add_header Content-Type application/json;
}
}
七、TURN 服务(音视频必装)
homeserver.yaml 追加:
turn_uris:
- "turn:turn.example.com:3478?transport=udp"
- "turn:turn.example.com:3478?transport=tcp"
turn_shared_secret: "长随机串"
turn_user_lifetime: 86400000
turn_allow_guests: true
coturn 端口:3478 (TCP+UDP) + 5349 (TLS) + 49160-65535 (UDP relay 范围)。防火墙要全开。
完整 Tuwunel/coturn/element-web JWT/livekit 一站式(中文社区实践)
services:
tuwunel:
image: jevolk/tuwunel:latest
restart: unless-stopped
container_name: tuwunel
ports:
- "127.0.0.1:5001:6167"
volumes:
- ./tuwunel/db:/var/lib/tuwunel
- ./tuwunel/config.toml:/etc/tuwunel.toml
coturn:
image: coturn/coturn:latest
container_name: coturn
restart: unless-stopped
environment:
DETECT_EXTERNAL_IP: "yes"
DETECT_RELAY_IP: "yes"
user: "用户名:密码"
realm: "你反代的域名"
ports:
- "3478:3478/tcp"
- "3478:3478/udp"
- "5349:5349/tcp"
- "5349:5349/udp"
- "49160-49170:49160-49170/udp"
command:
- --min-port=49160
- --max-port=49170
element-web:
container_name: element-web
ports:
- '127.0.0.1:8098:80'
image: vectorim/element-web
restart: unless-stopped
八、完整组件路线(Matrix 2.0 全栈)
Element 官方有现成的 Matrix 2.0 全栈 demo:element-hq/element-docker-demo,包含:
- Synapse(带 worker 拆分)
- Element Web(
vectorim/element-web) - Element Call(
ghcr.io/element-hq/element-call) - Matrix Authentication Service(
ghcr.io/element-hq/matrix-authentication-service) - LiveKit(SFU 音视频)
- nginx + Let's Encrypt
- Postgres + Redis
注意:README 自写"no support, no HA, no monitoring, no backup" — 生产用 Element 商业版 ESS,或社区 spantaleev/matrix-docker-ansible-deploy Ansible 剧本。
九、创建用户
docker exec -it synapse register_new_matrix_user \
http://localhost:8008 -c /data/homeserver.yaml
# 按提示输入用户名、密码、是否管理员
默认 不开 公开注册。
homeserver.yaml改enable_registration: true+enable_registration_without_verification: true才开放(仅测试用)。
邮件通知配置
email:
smtp_host: smtp.example.com
smtp_port: 465
smtp_user: matrix@example.com
smtp_pass: <password>
force_tls: true
require_transport_security: true
enable_tls: true
notif_from: "Matrix <service@example.com>"
enable_notifs: true
十、备案 / 国内特定坑
- 国内:必须有 ICP 备案域名,否则 8448 联邦端口会被 GFW 干扰
- 国内到 matrix.org 联邦会慢/不通,可考虑只内部用 + 不开联邦
- 邮件通知用国内 SMTP(QQ/网易/阿里云),
force_tls: true+smtp_port: 465
十一、安卓端 FluffyChat 安装
项目概况
- 官网:https://fluffy.chat
- GitHub:https://github.com/krille-chan/fluffychat
- 当前版本:
2.8.0+3558(pubspec.yaml 确认) - 包名:
chat.fluffy.fluffychat - 技术栈:Flutter(Dart sdk
>=3.11.1 <4.0.0),自带 Rust vodozemac 加密库 - License:AGPL-3.0-or-later
- 开发者:Christian Kußowski(Krille),独立非营利项目
三个官方安装渠道
| 渠道 | 链接 | 推送 | 备注 |
|---|---|---|---|
| Google Play | play.google.com/store/apps/details?id=chat.fluffy.fluffychat | FCM(Google 服务) | 国内访问困难,多数国产 ROM 无 GMS |
| F-Droid | f-droid.org/packages/chat.fluffy.fluffychat | 无 FCM,用 UnifiedPush 或本地 poll | 最稳,国内可用 |
| 直接 APK | APKPure / Uptodown / IzzyOnDroid / OpenAPK | 同 F-Droid(不带 FCM) | 适合华为/小米/OPPO 等无 GMS 的设备 |
安卓侧安装步骤(推荐 F-Droid 路线)
-
装 F-Droid 客户端
- 手机浏览器开 https://f-droid.org → 点 "Download F-Droid"
- 允许"安装未知来源"(设置 → 应用 → 特殊权限 → 安装未知应用 → F-Droid 允许)
- 装好后保持 F-Droid 不被禁止后台自启(重要) -
F-Droid 里搜 "FluffyChat"
- 看到 chat.fluffy.fluffychat
- 点 Install
- 装好后禁用/卸载 F-Droid 都行,但别在 F-Droid 里把 FluffyChat 卸载、然后再装 Play 版,跨渠道数据互不兼容 -
首次启动 FluffyChat
- 选择 "Login" 或 "Register"
- Homeserver 填 https://matrix.example.com(你的服务端域名)
- 走 OIDC 或密码注册(看你服务端配置)
推送问题(国内无 GMS 设备)
这是 FluffyChat 在国产 ROM 上最大的坑:
- 有 GMS 的设备(Pixel / 三星 / 摩托等):登录自动启用 FCM 推送,息屏也收消息
- 无 GMS 的设备(华为 / 小米国际版以外的 ROM / 一加部分):必须装一个 UnifiedPush distributor(推荐 ntfy),否则你必须保持 FluffyChat 在前台才能收到消息
- 华为:HarmonyOS 杀后台很凶,建议把 FluffyChat 加入"电池不优化"和"应用启动管理 → 允许自启动"
安装后的连接设置
启动 FluffyChat 后会问三件事:
1. Homeserver URL:填 https://matrix.example.com(你的服务端)
2. Discover well-known:默认勾选,会自动读 https://example.com/.well-known/matrix/server 找到真正的 HS
3. 登录/注册账号:用你 register_new_matrix_user 创建的账号
如要连接第三方公服(不自己建服务端),FluffyChat 默认推荐三家:
- matrix.org(官方,需翻墙)
- mozilla.org
- tchncs.de
十二、推荐部署路线
路线 A:最小化(自用、不开联邦)
1 台 2 核 4 GB VPS + 1 个备案域名
├── docker compose: synapse + postgres
├── nginx 反代 443(客户端 + 联邦合并)
├── 不开 TURN(不打语音)
└── 安卓端:F-Droid 装 FluffyChat
路线 B:完整家庭/小团队(开音视频)
1 台 2 核 4 GB VPS
├── docker compose: synapse + postgres + coturn + element-web
├── nginx 反代 + Let's Encrypt
├── TURN TCP/UDP 3478 + 5349 + relay 49160-65535 全开
├── 公开注册 + enable_registration_without_verification=false(强制验证邮件)
└── 安卓端:F-Droid 装 FluffyChat + ntfy 推 UnifiedPush
路线 C:Matrix 2.0 全栈(前端 / 音视频 / OIDC)
直接用 element-hq/element-docker-demo(实验性)
├── 一键 ./setup.sh
├── 域名分四个:matrix / auth / element / call
├── 包含 livekit(SFU)
└── 生产不要用,演示用
路线 D:生产级(企业)
- Element Server Suite (ESS) 商业版
- 或社区:spantaleev/matrix-docker-ansible-deploy Ansible 剧本
- 拆分 worker(synapse-generic-worker / federation-sender)
- Postgres 主从 + Redis + Prometheus + Grafana
十三、不确定项 / 风险点
| 项 | 状态 | 备注 |
|---|---|---|
Docker Hub latest 当前具体版本号 |
⚠️ 抓取 hub.docker.com 超时 | 推测 1.13x 系列(中文教程 2026 用 1.136.0),建议 docker pull matrixdotorg/synapse:latest && docker inspect 看 digest |
| FluffyChat 是否在国内应用商店有官方版 | ❌ 未确认 | 国内小米/华为商店有第三方上传的旧版,不建议从那装,从 F-Droid 或 APKPure 拿官方 APK |
| 国内自建 Matrix 服务器的合规性 | ⚠️ 需自查 | 端到端加密可能被监管重点关注,私人家庭/小团队自用基本无碍,公开注册服务有合规风险 |
| federaton 8448 端口在国内的可达性 | ⚠️ 矛盾 | 官方说联邦必须 8448,但用 _well-known/matrix/server 指到 443 后可只开 443 — 实践可行 |
| Coturn + Element Call 是否需要 livekit 完整组件 | ✅ 明确 | 旧版 1:1 通话只装 coturn 即可;新版 Element Call 必须 livekit(demo compose 包含) |
十四、信息源索引
官方一手
- Element Synapse GitHub 仓库
- Synapse 官方安装文档
- Synapse Docker 主 README
- contrib/docker/docker-compose.yml
- Postgres 配置文档
- 反向代理文档
- TURN/coturn howto
- Element Matrix 2.0 docker-demo
- FluffyChat GitHub 仓库
- FluffyChat 官网
- F-Droid 详情页
社区实践
十五、下一步想做的
- 起草一份能直接使用的 docker-compose + .env + homeserver.yaml 三件套
- 写一份服务端到客户端的端到端冒烟测试脚本(注册 → 登录 → 发消息 → 二次登录验持久化)
- 对比 Synapse vs Tuwunel vs Dendrite 给出决策表
- 整理一份极简部署 SOP(拷贝粘贴就能跑)