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即时通信MatrixSynapse2026/10/21

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 / Compose29.8.1 / v5.5.1docker --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_namematrix.localMatrix 用户标识的域名部分(@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-stackcompose 顶层 name 显式声明,防同名项目互删
演示账号admin(管理员)/ alice(普通用户),密码 q1w2e3r4注册过程见 4.7

💡 说明:端口规划上,Synapse 官方默认客户端端口为 8008、Element 为 80;本文统一改映射到 8141/8142(端口选择原则:避开服务器上已占用端口,用 ss -ltn 核查)。联邦端口 8448 保留在服务内部网络中,单机不联邦场景无需对宿主机发布;后续开启联邦时再映射 8448 并配置真实域名与证书。

二、镜像选型说明

本方案使用两个官方发行包,均固定版本标签(不用 latest,保证可复现与回滚):

服务发行包选型理由
synapsematrixdotorg/synapse:v1.163.0Synapse 官方文档 INSTALL 指定的 Docker 发行通道,随 element-hq/synapse 主线同步发版(v1.163.0 于 2026-10-14 推送,2026-10-21 查证 Docker Hub)
elementvectorim/element-web:v1.12.32Element 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

三、前置条件

  1. 服务器已安装 Docker 与 Compose 插件。核查命令与本文实测回显:
docker --version
docker compose version
Docker version 29.8.1, build 4a63305
Docker Compose version v5.5.1
  1. 目标端口未被占用。核查 8141/8142(无输出即空闲):
ss -ltn | grep -E ':814[12] '

(部署前实测无输出;部署后再次执行会看到 8141/8142 处于 LISTEN,见 4.5 验证。)

  1. 规划 server_name:这是用户 ID 的域名部分(如 @admin:matrix.local),一旦注册用户后不宜变更。仅内网使用可像本文用 matrix.local 这类内网域名;若未来要对外联邦,必须换成真实解析域名(联邦依赖服务发现)。

  2. 浏览器可访问服务器 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 为准):

  1. 登录:欢迎页选择「Sign in」,登录页的服务器字段已由 default_server_config 预填为 matrix.local;输入用户名 admin、密码 q1w2e3r4 完成登录,进入主界面。
  2. 创建房间:左下角消息入口旁的「+」→「Create new room」→ 名称填 研发部交流 → 可见性选「Private room」→ 创建。
  3. 邀请第二位用户:进入房间 → 右上角房间信息(i 图标)→「People」→「Invite to room」→ 输入 @alice:matrix.local 发送邀请。
  4. 第二端:另开一个浏览器窗口(或另一台电脑)访问同一地址,登录 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_LEVELINFO日志级别
POSTGRES_HOST / POSTGRES_USER / POSTGRES_PASSWORD / POSTGRES_DATABASE无使用 PostgreSQL 时注入;不设则默认 SQLite

💡 说明:本篇用默认 SQLite(小规模即够用,单文件便于备份);用户量上千或需要 worker 横向扩展时切 PostgreSQL——在 compose 里为 synapse 服务加 environment: 段注入上表 POSTGRES_* 变量并挂接数据库服务即可,配置文件里 database: 段的对应改法见配置篇。

七、配置参数说明(compose 层)

docker-compose.yml 中可按环境调整的参数与建议值:

参数本文取值调整建议
namesynapse-1.163.0-stack每套部署唯一;多套并存时用不同项目名
restartunless-stopped服务器重启后自愈;维护期可 stop 人工控制
ports(synapse)8141:8008对外端口按 4.6 的 ss 核查结果自选;容器内 8008 不要改
ports(element)8142:80同上;如需 HTTPS,前置 Nginx/Caddy 反代两个端口
subnet10.89.59.0/24先 docker network ls + docker network inspect 核查已占网段再取空闲值
depends_onsynapse仅控制启动顺序;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 页面登录,故保留了网页注册能力。

十二、参考链接

  1. Synapse 官方 Docker 安装文档:https://element-hq.github.io/synapse/latest/setup/installation.html
  2. Synapse 配置文档(homeserver.yaml 全量项):https://element-hq.github.io/synapse/latest/usage/configuration/config_documentation.html
  3. Element Web 仓库(config.json 说明见 docs 目录):https://github.com/element-hq/element-web
  4. matrixdotorg/synapse 发行包:https://hub.docker.com/r/matrixdotorg/synapse
  5. vectorim/element-web 发行包:https://hub.docker.com/r/vectorim/element-web
  6. 本系列:《Synapse/Element v1.163.0 介绍与选型指南》、《Synapse/Element v1.163.0 配置参数详解》、《Synapse/Element v1.163.0 Admin API 与 CLI 工具详解》