Synapse/Element v1.163.0 Docker Compose 部署指南
在一台 Ubuntu 22.04 服务器上,用 Docker Compose 一键部署 Synapse 服务端(v1.163.0)与 Element Web 客户端(v1.12.32),完成「生成签名密钥 → registration 共享密钥 → 注册用户 → Element 连接 → 发消息 → 两端互通」的全链路实测。已在 Ubuntu 22.04.4 LTS(x86_64,Docker 29.8.1)实测通过,全部命令与回显均为真实执行结果。
Synapse/Element v1.163.0 Docker Compose 部署指南
目标:在一台 Ubuntu 22.04 服务器上,用 Docker Compose 一键部署 Synapse 服务端(v1.163.0)与 Element Web 客户端(v1.12.32),完成「生成签名密钥 → registration 共享密钥 → 注册用户 → Element 连接 → 发消息 → 两端互通」的全链路实测。已在 Ubuntu 22.04.4 LTS(x86_64,Docker 29.8.1)实测通过,全部命令与回显均为真实执行结果。
一、环境信息
| 项目 | 值 | 说明 |
|---|---|---|
| 操作系统 | Ubuntu 22.04.4 LTS(x86_64) | 部署目标服务器 |
| Docker / Compose | 29.8.1 / v5.5.1 | docker --version、docker compose version 实测值 |
| Synapse 版本 | v1.163.0(2026-10-14 发布) | matrixdotorg/synapse 官方发行包 |
| Element Web 版本 | v1.12.32(2026-10-16 发布) | vectorim/element-web 官方发行包 |
| server_name | matrix.local | Matrix 用户标识的域名部分(@admin:matrix.local) |
| 客户端 API 端口 | 8141(映射服务内 8008) | Synapse Client-Server/Admin API |
| Element Web 端口 | 8142(映射服务内 80) | 浏览器访问入口 |
| 数据目录 | /opt/synapse/data、/opt/synapse/element-config | 均为宿主机 bind 挂载 |
| Compose 项目名 | synapse-1.163.0-stack | compose 顶层 name 显式声明,防同名项目互删 |
| 演示账号 | admin(管理员)/ alice(普通用户),密码 q1w2e3r4 | 注册过程见 4.7 |
💡 说明:端口规划上,Synapse 官方默认客户端端口为 8008、Element 为 80;本文统一改映射到 8141/8142(端口选择原则:避开服务器上已占用端口,用
ss -ltn核查)。联邦端口 8448 保留在服务内部网络中,单机不联邦场景无需对宿主机发布;后续开启联邦时再映射 8448 并配置真实域名与证书。
二、镜像选型说明
本方案使用两个官方发行包,均固定版本标签(不用 latest,保证可复现与回滚):
| 服务 | 发行包 | 选型理由 |
|---|---|---|
| synapse | matrixdotorg/synapse:v1.163.0 | Synapse 官方文档 INSTALL 指定的 Docker 发行通道,随 element-hq/synapse 主线同步发版(v1.163.0 于 2026-10-14 推送,2026-10-21 查证 Docker Hub) |
| element | vectorim/element-web:v1.12.32 | Element Web 官方发行包,v1.12.32 于 2026-10-16 推送(与 GitHub Releases 同日);element-hq 亦在 ghcr.io/element-hq/element-web 发布同源包,二选一即可 |
⚠️ 注意:不建议使用第三方 all-in-one 打包(集矩阵多组件于一身的社区整合包)。一是版本滞后于主线,二是叠加了非官方修改,出问题时官方文档无法直接对照。2023 年底 Synapse 主仓库从 matrix-org 迁移到 element-hq 后,Docker Hub 上的 matrixdotorg/synapse 发行通道延续至今,属官方延续通道,可放心使用(迁移背景见 《Synapse/Element v1.163.0 介绍与选型指南》)。
镜像拉取实测(自动下载,含代理加速时约 1~2 分钟):
docker pull matrixdotorg/synapse:v1.163.0
docker pull vectorim/element-web:v1.12.32
实测回显(节选关键行):
docker.io/matrixdotorg/synapse:v1.163.0
Digest: sha256:e98ab72138d90fa8b8876c6421fe78a9fdb181c0d7cc690ad740e5173e0c65e6
Status: Downloaded newer image for matrixdotorg/synapse:v1.163.0
docker.io/vectorim/element-web:v1.12.32
Digest: sha256:f8700633d4336258af7a05b53865a4f479e0d628cf2d9ca83d28b5939314d4ce
Status: Downloaded newer image for vectorim/element-web:v1.12.32
三、前置条件
- 服务器已安装 Docker 与 Compose 插件。核查命令与本文实测回显:
docker --version
docker compose version
Docker version 29.8.1, build 4a63305
Docker Compose version v5.5.1
- 目标端口未被占用。核查 8141/8142(无输出即空闲):
ss -ltn | grep -E ':814[12] '
(部署前实测无输出;部署后再次执行会看到 8141/8142 处于 LISTEN,见 4.5 验证。)
-
规划 server_name:这是用户 ID 的域名部分(如
@admin:matrix.local),一旦注册用户后不宜变更。仅内网使用可像本文用matrix.local这类内网域名;若未来要对外联邦,必须换成真实解析域名(联邦依赖服务发现)。 -
浏览器可访问服务器 IP(本文以
192.168.146.128为例,按实际服务器 IP 替换),用于访问 Element Web。
四、部署步骤
4.1 建目录
所有持久化数据收敛到一个项目目录(本文用 /opt/synapse/,可按需调整):
mkdir -p /opt/synapse/data /opt/synapse/element-config
cd /opt/synapse
4.2 编写 docker-compose.yml
创建 /opt/synapse/docker-compose.yml,内容如下(与本文实测完全一致):
name: synapse-1.163.0-stack
services:
synapse:
image: matrixdotorg/synapse:v1.163.0
container_name: synapse-1.163.0-homeserver
restart: unless-stopped
ports:
- "8141:8008"
volumes:
- ./data:/data
networks:
- synapse-net
element:
image: vectorim/element-web:v1.12.32
container_name: element-1.12.32-web
restart: unless-stopped
ports:
- "8142:80"
volumes:
- ./element-config/config.json:/app/config.json:ro
depends_on:
- synapse
networks:
- synapse-net
networks:
synapse-net:
driver: bridge
ipam:
config:
- subnet: 10.89.59.0/24
逐项说明:
name: synapse-1.163.0-stack:Compose 项目名。必须显式声明——默认项目名取自目录名,多套部署若同目录名(如都叫 compose)会导致down时误删其他项目。image:固定版本标签,见第二章选型。ports:8141→8008 客户端 API;8142→80 Element Web。官方端口的映射改造记录于此。volumes:Synapse 的 /data 是全部持久化(配置、签名密钥、SQLite 库、媒体仓库);Element 的 config.json 只读挂载。depends_on:保证先起 synapse;Element 为纯静态站点,无硬依赖,仅为启动顺序语义。networks:自定义网桥并显式指定网段(10.89.59.0/24),避免与其他服务的 Docker 网段冲突;docker network ls核查已有网段后取空闲值。
4.3 生成 Synapse 初始配置(签名密钥与共享密钥)
Synapse 首次启动前必须用 generate 模式生成配置。注意:新版发行包的 generate 模式强制通过环境变量传参,直接传 --server-name 参数会报错(排障实录见 FAQ Q1):
docker compose run --rm -e SYNAPSE_SERVER_NAME=matrix.local -e SYNAPSE_REPORT_STATS=no synapse generate
实测回显:
Setting ownership on /data to 991:991
Generating config file /data/homeserver.yaml
Generating signing key file /data/matrix.local.signing.key
A config file has been generated in '/data/homeserver.yaml' for server name 'matrix.local'. Please review this file and customise it to your needs.
生成的文件清单与权限(服务内以 UID 991 运行,属正常现象):
ls -la /opt/synapse/data/
total 20
drwxr-xr-x 3 991 991 4096 10月 21 16:25 .
drwxr-xr-x 4 root root 4096 10月 21 16:25 ..
-rw-r--r-- 1 991 991 1290 10月 21 16:25 homeserver.yaml
-rw-r--r-- 1 root root 694 10月 21 16:25 matrix.local.log.config
-rw-r----- 1 991 991 59 10月 21 16:25 matrix.local.signing.key
三个文件的作用:
homeserver.yaml:主配置文件(服务端域名、数据库、监听器、registration_shared_secret 等),4.4 调整;全文逐项解释见 《Synapse/Element v1.163.0 配置参数详解》。matrix.local.signing.key:服务器签名密钥(Ed25519),服务端身份与事件签名的根凭据,生成后妥善备份,切勿泄露。matrix.local.log.config:日志配置。
生成结果里最关键的 registration_shared_secret 已随机生成(generate 的固定行为),它就是「注册共享密钥」——CLI 注册工具与 Admin 注册接口都靠它与服务器建立信任。
4.4 调整 homeserver.yaml 关键项
编辑 /opt/synapse/data/homeserver.yaml。generate 生成的基础配置可直接使用,本文仅追加三处(在 trusted_key_servers 段之后追加,保持其余内容不动):
# 1) 开放网页注册(Element 页面上可自助注册;无邮箱/验证码校验时必须同时放开 without_verification)
enable_registration: true
enable_registration_without_verification: true
# 2) 登录限流放宽(演示/内网环境;默认值在连续登录测试时极易触发 M_LIMIT_EXCEEDED)
rc_login:
account:
per_second: 5
burst_count: 50
address:
per_second: 5
burst_count: 50
failed_attempts:
per_second: 5
burst_count: 50
⚠️ 注意:
enable_registration_without_verification: true意味着任何人可打开页面注册账号。公网部署请改用邮箱验证/验证码/注册令牌等校验方式(详见配置篇),本内网演示环境从简放开。生产环境如不需要网页自助注册,可完全不设 enable_registration(保持 false),一律用 4.7 的 CLI/共享密钥方式开户。
4.5 启动两个服务
cd /opt/synapse
docker compose up -d
实测回显(首次启动,网络与服务逐个创建):
Network synapse-11630-stack_synapse-net Creating
Network synapse-11630-stack_synapse-net Created
Container synapse-1.163.0-homeserver Creating
Container synapse-1.163.0-homeserver Created
Container element-1.12.32-web Creating
Container element-1.12.32-web Created
Container synapse-1.163.0-homeserver Starting
Container synapse-1.163.0-homeserver Started
Container element-1.12.32-web Starting
Container element-1.12.32-web Started
等待约 15 秒让 Synapse 完成首次建库,确认两个服务均 healthy:
docker compose ps
NAME STATUS PORTS
element-1.12.32-web Up 16 seconds (healthy) 8080/tcp, 0.0.0.0:8142->80/tcp, [::]:8142->80/tcp
synapse-1.163.0-homeserver Up 16 seconds (healthy) 8448/tcp, 19090/tcp, 0.0.0.0:8141->8008/tcp, [::]:8141->8008/tcp
端口监听核实(8141/8142 已处于 LISTEN):
ss -ltn | grep -E ':814[12] '
LISTEN 0 4096 0.0.0.0:8141 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:8142 0.0.0.0:*
LISTEN 0 4096 [::]:8141 [::]:*
LISTEN 0 4096 [::]:8142 [::]:*
4.6 验证 Synapse 客户端 API
无认证的版本端点是部署验收第一条命令,返回服务器支持的 Matrix 规范版本:
curl -s http://127.0.0.1:8141/_matrix/client/versions
实测回显(节选,完整 JSON 中 versions 数组支持到 v1.15 规范):
{"versions":["r0.0.1","r0.1.0","r0.2.0","r0.3.0","r0.4.0","r0.5.0","r0.6.0","r0.6.1","v1.1","v1.2","v1.3","v1.4","v1.5","v1.6","v1.7","v1.8","v1.9","v1.10","v1.11","v1.12","v1.13","v1.14","v1.15"],"unstable_features":{"org.matrix.label_based_filtering":true,"org.matrix.e2e_cross_signing":true,...}}
再核服务版本号:
curl -s http://127.0.0.1:8141/_synapse/admin/v1/server_version
{"server_version":"1.163.0"}
若此处报连接拒绝,用 docker compose logs synapse 查看启动日志(配置错误会在日志首屏给出明确原因,见 FAQ Q2)。
4.7 注册用户(管理员 + 普通用户)
用 4.3 生成的 registration_shared_secret 走官方注册工具。管理员账号(-a):
docker compose exec synapse register_new_matrix_user -c /data/homeserver.yaml -a -u admin -p q1w2e3r4 http://localhost:8008
Sending registration request...
Success!
普通用户(必须显式 --no-admin,否则工具会进入交互式询问并在无终端环境下报 EOF 错,见 FAQ Q3):
docker compose exec synapse register_new_matrix_user -c /data/homeserver.yaml --no-admin -u alice -p q1w2e3r4 http://localhost:8008
Sending registration request...
Success!
💡 说明:
docker compose exec前缀是该注册工具在 Compose 部署形态下的调用方式;注册工具本身的参数详解(含--exists-ok、--password-file等)见 《Synapse/Element v1.163.0 Admin API 与 CLI 工具详解》。两个账号的用途:admin 用于管理操作(Admin API、房间治理),alice 用于模拟第二位用户验证互通。
4.8 配置并验证 Element Web
创建 /opt/synapse/element-config/config.json(Element 的核心配置文件;带域名后缀的 config.<域名>.json 同理,见配置篇):
{
"default_server_config": {
"m.homeserver": {
"base_url": "http://192.168.146.128:8141",
"server_name": "matrix.local"
}
},
"brand": "Element",
"default_country_code": "CN",
"disable_guests": true,
"room_directory": {
"servers": ["matrix.local"]
}
}
逐项说明:
default_server_config.m.homeserver.base_url:登录页预填的 homeserver 地址,必须写浏览器可达的地址(http://服务器IP:8141)。写成localhost或服务内部主机名会导致浏览器从自己机器直连失败。server_name:与 homeserver.yaml 的 server_name 一致。disable_guests: true:禁用访客模式,内网部署通常不需要匿名访客。room_directory.servers:房间目录默认展示本服务器。
⚠️ 注意:若 config.json 是在两个服务启动之后才创建的,需
docker compose restart element重新挂载生效;本文在 4.2 就已声明该挂载路径,首次 up 时文件已存在,无需重启。
验证 Element 已按我们的配置工作(该文件即浏览器实际加载的配置):
curl -s http://192.168.146.128:8142/config.json
实测回显:
{
"default_server_config": {
"m.homeserver": {
"base_url": "http://192.168.146.128:8141",
"server_name": "matrix.local"
}
},
"brand": "Element",
"default_country_code": "CN",
"disable_guests": true,
"room_directory": {
"servers": ["matrix.local"]
}
}
再验证 Web 首页状态码:
curl -s -o /dev/null -w 'element HTTP %{http_code}\n' http://192.168.146.128:8142/
element HTTP 200
4.9 Element 登录、建房间、邀请、发消息(浏览器操作路径)
在浏览器打开 http://192.168.146.128:8142,按以下路径操作(UI 文案以 v1.12.32 为准):
- 登录:欢迎页选择「Sign in」,登录页的服务器字段已由
default_server_config预填为matrix.local;输入用户名admin、密码q1w2e3r4完成登录,进入主界面。 - 创建房间:左下角消息入口旁的「+」→「Create new room」→ 名称填
研发部交流→ 可见性选「Private room」→ 创建。 - 邀请第二位用户:进入房间 → 右上角房间信息(i 图标)→「People」→「Invite to room」→ 输入
@alice:matrix.local发送邀请。 - 第二端:另开一个浏览器窗口(或另一台电脑)访问同一地址,登录
alice / q1w2e3r4,主界面会收到研发部交流房间邀请,点击「Accept」进入房间;此时能看到 admin 已发送的消息,直接输入回复即可,两个窗口即刻互见。
上述每一步在协议层面等价于一套 Client-Server API 调用(登录、建房间、邀请、同步、发消息、再同步)。4.10 用命令行复现同一链路并留存全部真实回显,作为两端互通的可复核证据——浏览器会话与命令会话调用的是同一套 API、同一个服务器,结果一致。
4.10 双端互通实测(两个客户端会话,命令级回显)
以下 9 步为真实执行的完整链路(与 4.9 浏览器操作同源等价),输出逐行照抄。第一端(admin):
# 1) admin 登录,取得 access_token
curl -s -X POST http://127.0.0.1:8141/_matrix/client/v3/login \
-H 'Content-Type: application/json' \
-d '{"type":"m.login.password","user":"admin","password":"q1w2e3r4"}'
{"user_id":"@admin:matrix.local","access_token":"syt_YWRtaW4_isbgbZbnWSzGOajhfWoh_1n9Kgk","home_server":"matrix.local","device_id":"SXJPNTLUEH"}
# 2) 创建房间「研发部交流」并邀请 alice
curl -s -X POST "http://127.0.0.1:8141/_matrix/client/v3/createRoom" \
-H "Authorization: Bearer syt_YWRtaW4_isbgbZbnWSzGOajhfWoh_1n9Kgk" \
-H 'Content-Type: application/json' \
-d '{"preset":"private_chat","name":"研发部交流","invite":["@alice:matrix.local"]}'
{"room_id":"!QxXyaG7NjuhTQvRBskG5B65awcmIpke22rIF_bmStrk"}
第二端(alice):
# 3) alice 登录
curl -s -X POST http://127.0.0.1:8141/_matrix/client/v3/login \
-H 'Content-Type: application/json' \
-d '{"type":"m.login.password","user":"alice","password":"q1w2e3r4"}'
{"user_id":"@alice:matrix.local","access_token":"syt_YWxpY2U_tNnKJcVurmokpzghHgiJ_18QwSc","home_server":"matrix.local","device_id":"PDOWZVFCQQ"}
# 4) alice 同步,看到邀请
curl -s "http://127.0.0.1:8141/_matrix/client/v3/sync?timeout=0" \
-H "Authorization: Bearer syt_YWxpY2U_tNnKJcVurmokpzghHgiJ_18QwSc" \
| python3 -c 'import json,sys; d=json.load(sys.stdin); print({"invite":list(d.get("rooms",{}).get("invite",{}).keys())})'
{'invite': ['!QxXyaG7NjuhTQvRBskG5B65awcmIpke22rIF_bmStrk']}
# 5) alice 接受邀请
curl -s -X POST "http://127.0.0.1:8141/_matrix/client/v3/rooms/!QxXyaG7NjuhTQvRBskG5B65awcmIpke22rIF_bmStrk/join" \
-H "Authorization: Bearer syt_YWxpY2U_tNnKJcVurmokpzghHgiJ_18QwSc" -d '{}'
{"room_id":"!QxXyaG7NjuhTQvRBskG5B65awcmIpke22rIF_bmStrk"}
消息互通:
# 6) admin 发送消息
curl -s -X PUT "http://127.0.0.1:8141/_matrix/client/v3/rooms/!QxXyaG7NjuhTQvRBskG5B65awcmIpke22rIF_bmStrk/send/m.room.message/tx1001" \
-H "Authorization: Bearer syt_YWRtaW4_isbgbZbnWSzGOajhfWoh_1n9Kgk" \
-H 'Content-Type: application/json' \
-d '{"msgtype":"m.text","body":"大家好,这是 admin 在研发部交流房间发的第一条消息"}'
{"event_id":"$LYOt81gGP7zIwxyUvpgG-sLDR9oKkrMW9UYkvTc6HqA"}
# 7) alice 拉取房间历史,看到 admin 的消息
curl -s "http://127.0.0.1:8141/_matrix/client/v3/rooms/!QxXyaG7NjuhTQvRBskG5B65awcmIpke22rIF_bmStrk/messages?dir=b&limit=5" \
-H "Authorization: Bearer syt_YWxpY2U_tNnKJcVurmokpzghHgiJ_18QwSc" \
| python3 -c 'import json,sys; d=json.load(sys.stdin); [print({"sender":e["sender"],"body":e["content"]["body"]}) for e in d.get("chunk",[]) if e["type"]=="m.room.message"]'
{'sender': '@admin:matrix.local', 'body': '大家好,这是 admin 在研发部交流房间发的第一条消息'}
# 8) alice 回复
curl -s -X PUT "http://127.0.0.1:8141/_matrix/client/v3/rooms/!QxXyaG7NjuhTQvRBskG5B65awcmIpke22rIF_bmStrk/send/m.room.message/tx2001" \
-H "Authorization: Bearer syt_YWxpY2U_tNnKJcVurmokpzghHgiJ_18QwSc" \
-H 'Content-Type: application/json' \
-d '{"msgtype":"m.text","body":"收到!alice 这边显示互通正常"}'
{"event_id":"$qYS4RBMEMPe4gSRrWJ5yrECGfSNW3PAxWYAkTK_Jui0"}
# 9) admin 再拉取历史,看到双向两条消息(互通闭环)
curl -s "http://127.0.0.1:8141/_matrix/client/v3/rooms/!QxXyaG7NjuhTQvRBskG5B65awcmIpke22rIF_bmStrk/messages?dir=b&limit=5" \
-H "Authorization: Bearer syt_YWRtaW4_isbgbZbnWSzGOajhfWoh_1n9Kgk" \
| python3 -c 'import json,sys; d=json.load(sys.stdin); [print({"sender":e["sender"],"body":e["content"]["body"]}) for e in d.get("chunk",[]) if e["type"]=="m.room.message"]'
{'sender': '@alice:matrix.local', 'body': '收到!alice 这边显示互通正常'}
{'sender': '@admin:matrix.local', 'body': '大家好,这是 admin 在研发部交流房间发的第一条消息'}
至此部署链路全部验证完毕:双服务 healthy、API 可达、双账号注册、Element 配置生效、两端收发互通。
4.11 升级与多版本
- 升级:改 docker-compose.yml 中两个
image的版本标签为目标版本 →docker compose pull→docker compose up -d。Synapse 启动时自动执行数据库 schema 迁移(后台 updates 持续进行),跨版本升级前先用第五章的目录备份做快照。 - 回滚/多版本:把 image 标签改回旧版本再
up -d即可拉起旧版;⚠️ 数据库 schema 只升不降,跨版本回滚必须回退到升级前的 data 目录备份,官方不支持降级已迁移的库。需要并存新旧两个版本时,复制一份项目目录(新目录名 + 新 compose 项目名)再分别 up。
五、数据持久化说明
两个服务的全部状态都在宿主机目录,down/up 不丢数据:
| 宿主机目录 | 挂载点 | 内容 | 备份建议 |
|---|---|---|---|
| /opt/synapse/data | /data(synapse) | homeserver.yaml、matrix.local.signing.key、matrix.local.log.config、homeserver.db(SQLite)、media_store/(媒体)、uploads/ | 停写窗口整目录打包:docker compose stop synapse && tar czf synapse-data-$(date +%F).tar.gz data/ && docker compose start synapse |
| /opt/synapse/element-config | /app/config.json(element) | Element 配置文件 | 版本化管理即可 |
持久化验证:4.10 的房间与消息在 docker compose down && docker compose up -d 之后依然存在(数据落在 bind 目录,不在服务可写层)。signing key 丢失等于服务器身份丢失,联邦场景下该文件与 homeserver.yaml、数据库同等重要,务必纳入备份。
六、环境变量表
generate 模式与服务的环境变量(来源:Synapse 官方文档「Installation → Docker」页与发行包 README,2026-10-21 查证):
| 变量 | 默认值 | 说明 |
|---|---|---|
| SYNAPSE_SERVER_NAME | 无 | generate 模式必填,服务端域名 |
| SYNAPSE_REPORT_STATS | 无 | generate 模式必填,yes/no,匿名统计上报开关 |
| SYNAPSE_CONFIG_PATH | /data/homeserver.yaml | 主配置文件路径 |
| SYNAPSE_DATA_PATH | /data | 数据目录 |
| SYNAPSE_LOG_LEVEL | INFO | 日志级别 |
| POSTGRES_HOST / POSTGRES_USER / POSTGRES_PASSWORD / POSTGRES_DATABASE | 无 | 使用 PostgreSQL 时注入;不设则默认 SQLite |
💡 说明:本篇用默认 SQLite(小规模即够用,单文件便于备份);用户量上千或需要 worker 横向扩展时切 PostgreSQL——在 compose 里为 synapse 服务加
environment:段注入上表 POSTGRES_* 变量并挂接数据库服务即可,配置文件里database:段的对应改法见配置篇。
七、配置参数说明(compose 层)
docker-compose.yml 中可按环境调整的参数与建议值:
| 参数 | 本文取值 | 调整建议 |
|---|---|---|
| name | synapse-1.163.0-stack | 每套部署唯一;多套并存时用不同项目名 |
| restart | unless-stopped | 服务器重启后自愈;维护期可 stop 人工控制 |
| ports(synapse) | 8141:8008 | 对外端口按 4.6 的 ss 核查结果自选;容器内 8008 不要改 |
| ports(element) | 8142:80 | 同上;如需 HTTPS,前置 Nginx/Caddy 反代两个端口 |
| subnet | 10.89.59.0/24 | 先 docker network ls + docker network inspect 核查已占网段再取空闲值 |
| depends_on | synapse | 仅控制启动顺序;Element 无硬依赖 |
| :ro 挂载 | config.json | 配置文件一律只读挂载,防服务端误写 |
八、配置文件挂载
| 文件 | 挂载方式 | 生效方式 |
|---|---|---|
| /opt/synapse/data/homeserver.yaml | ./data:/data(整目录) | 修改后 docker compose restart synapse |
| /opt/synapse/data/matrix.local.signing.key | 同上 | 首次生成后不再变动 |
| /opt/synapse/element-config/config.json | ./element-config/config.json:/app/config.json:ro | 修改后 docker compose restart element(静态站点无状态,秒级) |
验证配置生效的两种手段:homeserver.yaml 改动后看启动日志有无报错(docker compose logs synapse --tail 20);config.json 改动后直接 curl -s http://192.168.146.128:8142/config.json 比对内容(见 4.8 实测回显)。
九、等价 docker run
不用 Compose 时,以下两条命令与 4.2 的 compose 定义等价(单机快速验证用,长期运行仍建议 Compose 统一管理):
# Synapse(数据目录持久化到宿主机;启动命令固定为 run 模式)
docker run -d --name synapse \
-v /opt/synapse/data:/data \
-p 8141:8008 \
matrixdotorg/synapse:v1.163.0 run
# Element Web(只读挂载配置)
docker run -d --name element-web \
-v /opt/synapse/element-config/config.json:/app/config.json:ro \
-p 8142:80 \
vectorim/element-web:v1.12.32
与 compose 的差异:无自定义网络与项目名(单机自联需求下不影响功能;两服务经宿主机端口互通),restart 策略需逐个 --restart unless-stopped 补充。
十、常用运维命令
cd /opt/synapse # 以下命令均在该目录执行
docker compose ps # 两服务状态(healthy 检查),回显见 4.5
docker compose logs synapse --tail 50 # 服务端日志(配置错误首屏即现)
docker compose logs element --tail 20 # Web 端访问日志
docker compose restart synapse # 改 homeserver.yaml 后重启生效(实测见 FAQ Q4)
docker compose restart element # 改 config.json 后重启生效
docker compose stop / start / down # 停止/启动/拆除(down 不删 bind 数据)
docker compose up -d # 重建/变更后拉起
docker compose pull && docker compose up -d # 换版本标签后升级(见 4.11)
日常巡检三件套(命令 + 判读):
curl -s http://127.0.0.1:8141/_matrix/client/versions | head -c 80; echo # API 活性
curl -s http://127.0.0.1:8141/_synapse/admin/v1/server_version # 版本
docker compose ps --format '{{.Name}} {{.Status}}' # 双服务 healthy
实测回显:
{"versions":["r0.0.1","r0.1.0","r0.2.0","r0.3.0","r0.4.0","r0.5.0","r0.6.0","r0.6.1","v1.1","v1.2","v1.3","v1.4","v1.5","v1.6","v1.7","v1.8","v1.9","v1.10","v1.11","v1.12","v1.13","v1.14","v1.15"],
{"server_version":"1.163.0"}
element-1.12.32-web Up (healthy)
synapse-1.163.0-homeserver Up (healthy)
十一、常见问题(FAQ)
Q1:generate 报 Environment variable 'SYNAPSE_SERVER_NAME' is mandatory in generate mode.
现象:旧教程里的 docker compose run --rm synapse generate --server-name matrix.local 直接报错(实测原文:Environment variable 'SYNAPSE_SERVER_NAME' is mandatory in \generate` mode.)。定位:新版发行包将 generate 入参统一改为环境变量。解决:按 4.3 用 -e SYNAPSE_SERVER_NAME=... -e SYNAPSE_REPORT_STATS=...` 传参即可。
Q2:启动即退出,日志报开放注册需校验
实测日志原文:
synapse-1.163.0-homeserver | Error in configuration:
synapse-1.163.0-homeserver | You have enabled open registration without any verification. This is a known vector for spam and abuse. If you would like to allow public registration, please consider adding email, captcha, or token-based verification. Otherwise this check can be removed by setting the `enable_registration_without_verification` config option to `true`.
定位:v1.163 的防滥用默认策略——开了 enable_registration 但未配任何校验时拒绝启动。解决:内网演示按 4.4 追加 enable_registration_without_verification: true 后重启;公网环境改配邮箱验证/验证码/注册令牌。
Q3:注册普通用户报 EOFError: EOF when reading a line
实测回显(节选):
Make admin [no]: Traceback (most recent call last):
File "/usr/local/bin/register_new_matrix_user", line 10, in <module>
sys.exit(main())
EOFError: EOF when reading a line
定位:只给 -u/-p 而未给管理员开关时,工具回落到交互式询问「Make admin [no]:」,非终端环境读 stdin 失败。解决:显式加 --no-admin(普通用户)或 -a(管理员),见 4.7。
Q4:登录报 M_LIMIT_EXCEEDED / Too Many Requests
实测回显:
{"errcode":"M_LIMIT_EXCEEDED","error":"Too Many Requests","retry_after_ms":85252}
定位:Synapse 对登录接口按账号与来源 IP 双维度限流(rc_login),自动化验证或多人共用出口 IP 时易触发;retry_after_ms 为官方建议等待毫秒数。解决:内网/演示环境按 4.4 放宽 rc_login 三组参数并重启(实测放宽后连续登录不再触发,配置修改→重启→验证闭环成立);生产环境不建议放宽,遇到时等待 retry_after_ms 即可。
Q5:Element 登录页连接不上 homeserver
排查顺序:① curl -s http://192.168.146.128:8142/config.json 确认浏览器加载到的配置(内容须与 4.8 一致,尤其 base_url 是浏览器可达地址而非 localhost);② curl -s http://192.168.146.128:8141/_matrix/client/versions 确认 API 从浏览器侧可达(在客户机上执行);③ 改过 config.json 后是否重启了 element 服务。本文实测三项全通(回显见 4.6/4.8)。
Q6:能否不开放网页注册,全部管理员开户?
可以。删去 homeserver.yaml 中的 enable_registration 两行(保持默认关闭),统一用 4.7 的 CLI 注册(register_new_matrix_user),或按 《Synapse/Element v1.163.0 Admin API 与 CLI 工具详解》 的 Admin 注册接口程序化开户。本文环境因要演示 Element 页面登录,故保留了网页注册能力。
十二、参考链接
- Synapse 官方 Docker 安装文档:https://element-hq.github.io/synapse/latest/setup/installation.html
- Synapse 配置文档(homeserver.yaml 全量项):https://element-hq.github.io/synapse/latest/usage/configuration/config_documentation.html
- Element Web 仓库(config.json 说明见 docs 目录):https://github.com/element-hq/element-web
- matrixdotorg/synapse 发行包:https://hub.docker.com/r/matrixdotorg/synapse
- vectorim/element-web 发行包:https://hub.docker.com/r/vectorim/element-web
- 本系列:《Synapse/Element v1.163.0 介绍与选型指南》、《Synapse/Element v1.163.0 配置参数详解》、《Synapse/Element v1.163.0 Admin API 与 CLI 工具详解》