SimpleX Chat 7.0.4 Docker Compose 部署指南
用官方 smp-server 与 xftp-server 镜像(v7.0.1)单机部署 SimpleX Chat 自托管中继,含证书与指纹、服务器信息页、数据持久化、运维命令,并以 CLI 双端完成连接、消息与文件传输实测。
SimpleX Chat 7.0.4 Docker Compose 部署指南
目标:用官方
simplexchat/smp-server与simplexchat/xftp-server镜像(服务端稳定版 v7.0.1)在一台服务器上完成 SimpleX Chat 中继 0→1 部署,覆盖证书与指纹、服务器信息页、数据持久化与常用运维命令,并以 CLI 双端实测连接、消息收发与文件传输。客户端侧的定位与选型见 《SimpleX Chat 7.0.4 介绍与选型指南》。
一、环境信息
| 项目 | 内容 |
|---|---|
| 宿主操作系统 | Ubuntu 24.04.5 LTS(内核 7.0.0-38-generic) |
| Docker / Compose | Docker 29.9.2 / Docker Compose v5.6.1 |
| 部署根目录 | /opt/simplex-chat/ |
| 内网网段 | 10.89.62.0/24(自定义 bridge,服务器固定 IP) |
| 服务器地址(ADDR) | smp 中继 10.89.62.10 / 文件中继 10.89.62.11 |
| 实测端口 | 5223(SMP)、8141(信息页,容器内 8000)、8140(XFTP,容器内 443) |
| 客户端 | SimpleX Chat CLI v7.0.4,两台内网终端(用户 alice / bob) |
⚠️ 镜像版本口径:客户端 v7.0.4 与服务端镜像 v7.0.1 是两个发布线(服务端来自 simplex-chat/simplexmq 仓库),v7.0.1 为 Docker Hub 上 simplexchat/smp-server 与 simplexchat/xftp-server 的最新稳定标签(另有 v7.1.0-beta.x 预发布标签,本文不采用)。实测 v7.0.4 客户端与 v7.0.1 服务端互通正常。
二、镜像选型说明
SimpleX 官方在 Docker Hub 提供两个服务端镜像,均由仓库 simplex-chat/simplexmq 构建并随镜像自动完成初始化:
| 镜像 | 用途 | 实测标签 | 镜像摘要(v7.0.1) |
|---|---|---|---|
| simplexchat/smp-server | 消息中继(队列暂存、转发) | v7.0.1 | sha256:7d825822839a…af54 |
| simplexchat/xftp-server | 大文件中继(分块暂存) | v7.0.1 | sha256:69a7f95746bb…d26b |
选型要点:
- TLS 证书不需要申请:镜像首启自动生成自签 CA 与服务器证书,客户端按服务器地址中的证书指纹锁定校验,公网部署也无需 Let's Encrypt 与域名。
- 两个镜像均为只读运行时 + bind mount 持久化,升级镜像不影响证书与队列数据。
- 环境里对 Docker Hub 官方源拉取会长时间悬挂(daemon 配置的 daocloud mirror 返回"不在白名单"拒绝)。实测降级路径:
docker pull hub.rat.dev/simplexchat/smp-server:v7.0.1可拉取且与官方标签同摘要,拉取后docker tag重打官方标签即可,不影响后续步骤。
三、前置条件
- 一台可被客户端访问的服务器(云主机或内网机器),已安装 Docker 与 Compose 插件。
- 端口规划:5223/TCP 为 SMP 主端口;443/TCP 为 XFTP 主端口(本文宿主机 443 已被占用,实测映射到 8140);8000/TCP 为可选的服务器信息页端口(本文映射到 8141)。
- 放行防火墙:
ufw allow 5223/tcp && ufw allow 8140/tcp && ufw allow 8141/tcp(公网部署按实际映射端口放行)。 - 客户端侧准备:按《SimpleX Chat 7.0.4 介绍与选型指南》安装 CLI 客户端;本文用两台内网终端(alice、bob)做双端实测。
四、部署步骤
4.1 创建部署目录
mkdir -p /opt/simplex-chat && cd /opt/simplex-chat
mkdir -p smp_configs smp_state xftp_configs xftp_state xftp_files
目录用途见"八、配置文件挂载与目录结构"。
4.2 编写 docker-compose.yml
/opt/simplex-chat/docker-compose.yml 完整内容(与实测一致):
name: simplex-7.0.4-stack
services:
smp-server:
image: simplexchat/smp-server:v7.0.1
environment:
WEB_MANUAL: 1
ADDR: 10.89.62.10
PASS: q1w2e3r4
volumes:
- ./smp_configs:/etc/opt/simplex
- ./smp_state:/var/opt/simplex
ports:
- 5223:5223
- 8141:8000
networks:
simplex-7.0.4-net:
ipv4_address: 10.89.62.10
restart: unless-stopped
xftp-server:
image: simplexchat/xftp-server:v7.0.1
environment:
ADDR: 10.89.62.11
QUOTA: 10gb
PASS: q1w2e3r4
volumes:
- ./xftp_configs:/etc/opt/simplex-xftp
- ./xftp_state:/var/opt/simplex-xftp
- ./xftp_files:/srv/xftp
ports:
- 8140:443
networks:
simplex-7.0.4-net:
ipv4_address: 10.89.62.11
restart: unless-stopped
networks:
simplex-7.0.4-net:
driver: bridge
ipam:
config:
- subnet: 10.89.62.0/24
gateway: 10.89.62.1
参数说明:
ADDR:必填,客户端实际可达的地址(公网填公网 IP 或域名,本文内网实测填固定 IP)。smp 与 xftp 分别填各自对外地址。PASS:可填,队列创建口令。填入后客户端只有在服务器地址中携带该口令才能创建新队列,防止服务器被陌生人占用(实测日志回显creating new queues requires password)。WEB_MANUAL: 1:smp 镜像手动模式,首启按单端口 5223 生成 INI(不写 https 证书行),并生成静态信息页文件。QUOTA: 10gb:xftp 必填,文件存储配额,实测回显Total / available storage: 10737418240 / 10737418240。- 端口映射:
5223:5223主端口直映射;宿主 443 已被占用,故 xftp 用8140:443、信息页用8141:8000(生产环境 443 空闲时建议直接 443:443)。
4.3 启动并观察首启日志
cd /opt/simplex-chat
docker compose up -d
实测回显:
Container simplex-704-stack-smp-server-1 Created
Container simplex-704-stack-xftp-server-1 Starting
Container simplex-704-stack-smp-server-1 Starting
Container simplex-704-stack-xftp-server-1 Started
Container simplex-704-stack-smp-server-1 Started
首启时 entrypoint 会根据 ADDR/PASS 自动执行初始化并生成证书与 INI,随后拉起服务。docker compose logs smp-server 实测回显(节选):
SMP server v7.0.1.0 /
Fingerprint: H2Z_jKo6JIjojuUI3bD3p9XHgRlhS3e_fxV-2FcPWoE=
Server address: smp://H2Z_jKo6JIjojuUI3bD3p9XHgRlhS3e_fxV-2FcPWoE=:q1w2e3r4@10.89.62.10
Server source code: https://github.com/simplex-chat/simplexmq
Store log: /var/opt/simplex/smp-server-store.log
Serving SMP protocol on port 5223 (TLS)...
WARNING: the clients will use port 443 by default soon.
Set `port` in smp-server.ini section [TRANSPORT] to `5223,443`
expiring messages after 21 days
expiring clients inactive for 21600 seconds every 3600 seconds
creating new queues requires password
docker compose logs xftp-server 实测回显(节选):
XFTP server v7.0.1.0 /
Fingerprint: kL1aZsuHWIhaIW-lcBHG5lZM0On7nK_9vJQyMnqXEeU=
Server address: xftp://kL1aZsuHWIhaIW-lcBHG5lZM0On7nK_9vJQyMnqXEeU=@10.89.62.11
Store log: /var/opt/simplex-xftp/file-server-store.log
Serving XFTP protocol on port 443 (TLS)...
WARNING: server source code is not specified!
Use `source_code` in file-server.ini section [SERVER] to specify the server source code URL.
expiring files after 2 days
Total / available storage: 10737418240 / 10737418240
两段日志中的 Fingerprint 即客户端校验用的证书指纹,Server address 即服务器地址(smp 形式含创建队列口令)。
⚠️ xftp 首启会提示未设置 source_code(smp 镜像初始化参数已带 --source-code,xftp 未带)。消除方法:在 xftp_configs/file-server.ini 的 [SERVER] 段补一行 source_code: https://github.com/simplex-chat/simplexmq,重启后警告消失。
4.4 获取服务器地址与指纹
地址与指纹可直接在宿主机读取挂载目录中的指纹文件:
cat /opt/simplex-chat/smp_configs/fingerprint
cat /opt/simplex-chat/xftp_configs/fingerprint
实测回显:
H2Z_jKo6JIjojuUI3bD3p9XHgRlhS3e_fxV-2FcPWoE=
kL1aZsuHWIhaIW-lcBHG5lZM0On7nK_9vJQyMnqXEeU=
据此得到两台中继的完整服务器地址(客户端配置用):
smp://H2Z_jKo6JIjojuUI3bD3p9XHgRlhS3e_fxV-2FcPWoE=:q1w2e3r4@10.89.62.10:5223
xftp://kL1aZsuHWIhaIW-lcBHG5lZM0On7nK_9vJQyMnqXEeU=:q1w2e3r4@10.89.62.11:443
⚠️ 指纹与证书绑定生成,删除 smp_configs/xftp_configs 重新初始化会更换指纹,已分发的服务器地址随之失效。
4.5 开启服务器信息页
WEB_MANUAL=1 首启只生成信息页静态文件,不启用内嵌 Web 服务。实测宿主机 curl http://127.0.0.1:8141/ 无响应。在 smp_configs/smp-server.ini 的 [WEB] 段把注释项放开为 http = 8000,然后重启:
docker compose restart smp-server
curl -s -o /dev/null -w "HTTP %{http_code}, %{size_download} bytes\n" http://127.0.0.1:8141/
实测回显:
HTTP 200, 46742 bytes
页面标题实测为 SimpleX Chat - Server Information,包含服务器指纹、地址与二维码,可直接发给用户。
4.6 客户端连接实测(双端)
在两台客户端终端分别执行(示例为 alice 端,bob 端同样先配置服务器):
/smp smp://H2Z_jKo6JIjojuUI3bD3p9XHgRlhS3e_fxV-2FcPWoE=:q1w2e3r4@10.89.62.10:5223
/xftp xftp://kL1aZsuHWIhaIW-lcBHG5lZM0On7nK_9vJQyMnqXEeU=:q1w2e3r4@10.89.62.11:443
/smp test smp://H2Z_jKo6JIjojuUI3bD3p9XHgRlhS3e_fxV-2FcPWoE=:q1w2e3r4@10.89.62.10:5223
/xftp test xftp://kL1aZsuHWIhaIW-lcBHG5lZM0On7nK_9vJQyMnqXEeU=:q1w2e3r4@10.89.62.11:443
实测回显依次为:
ok
ok
SMP server test passed
XFTP server test passed
alice 发起连接:
/connect
实测回显(节选):
pass this invitation link to your contact (via another channel):
https://10.89.62.10/i#G-S3BF6ETOi6EzH8ClFnDsv2XcMaS8pg/2SlptdgZPKlfoNgsLxTCcM7F9vyH98NK9JW2nEk3-xs?p=5223&c=H2Z_jKo6JIjojuUI3bD3p9XHgRlhS3e_fxV-2FcPWoE
and ask them to connect: /c <invitation_link_above>
链接参数即自建服务器信息:10.89.62.10、端口 p=5223、证书指纹 c=H2Z_…。bob 接受邀请:
/connect https://10.89.62.10/i#G-S3BF6ETOi6EzH8ClFnDsv2XcMaS8pg/2SlptdgZPKlfoNgsLxTCcM7F9vyH98NK9JW2nEk3-xs?p=5223&c=H2Z_jKo6JIjojuUI3bD3p9XHgRlhS3e_fxV-2FcPWoE
bob 实测回显:
confirmation sent!
alice: contact is connected
alice 端同步收到 bob: contact is connected。随后双向发消息:alice 输入 @bob 你好,这是通过自建 smp-server 中继的消息,alice 终端回显 01:07 @bob 你好,这是通过自建 smp-server 中继的消息,bob 终端回显:
01:07 alice> 你好,这是通过自建 smp-server 中继的消息
bob 回复 @alice 收到,双向链路正常,alice 终端回显 01:08 bob> 收到,双向链路正常。
文件传输(走 xftp/直连文件通道)实测:alice 执行 /file @bob /tmp/b2-sample.bin(20 KiB 随机文件),bob 端回显:
01:10 alice> sends file b2-sample.bin (20.0 KiB / 20480 bytes)
use /fr 1 [<dir>/ | <path>] to receive it
bob 执行 /fr 1 /tmp/b2-recv.bin 接收后,双方回显:
completed uploading file 1 (b2-sample.bin) for bob # alice 端
completed receiving file 1 (b2-sample.bin) from alice # bob 端
两端文件 md5 均为 3a8f32b2cad892ccdb6971ff1011aa00,传输一致。说明:同网段场景下文件走客户端直连通道(xftp-server 容器日志无中继访问记录),xftp-server 在不可直连的公网场景承担文件中继,本文以 XFTP server test passed 与端口探测验证其可达性。
五、数据持久化说明
持久化全部通过 bind mount 落在部署目录(见第八节),其中 smp 队列与消息依赖 store log 机制:运行时写 smp-server-store.log,停机时自动滚动备份到 var/opt/simplex/backups/。实测 docker compose down && docker compose up -d 重建容器后,日志完整回显恢复过程:
Storelog backup successful: /var/opt/simplex/backups/queues/smp-server-store.log.2026-10-27T01:14:24
Messages backup successful: /var/opt/simplex/backups/messages/smp-server-messages.log.2026-10-27T01:14:24
...
restoring messages from file /var/opt/simplex/smp-server-messages.log
...
messages stored: 0, expired: 0, queues: 4
实测重建后 4 个既有队列(双端连接与文件通道)全部恢复,客户端无需重连配置。宿主机侧整机备份:
cd /opt/simplex-chat
tar czf /root/simplex-chat-backup-$(date +%Y%m%d).tar.gz smp_configs smp_state xftp_configs xftp_state xftp_files
恢复时解包回部署目录后 docker compose up -d 即可(证书指纹随 *_configs 恢复,服务器地址不变)。
六、环境变量表
| 变量 | 适用镜像 | 实测值 | 说明 |
|---|---|---|---|
| ADDR | 两者 | 10.89.62.10 / 10.89.62.11 | 必填。客户端可达地址;纯数字按 IP 处理(--ip),含点号按域名处理(--fqdn)。仅首启初始化时生效 |
| PASS | 两者 | q1w2e3r4 | 可选。队列/文件创建口令;留空则任何人可建队列(--no-password) |
| QUOTA | xftp-server | 10gb | 必填。文件存储配额,实测写入 INI storage_quota: 10737418240 |
| WEB_MANUAL | smp-server | 1 | 可选。手动模式:单端口 5223 生成 INI、不写 https 证书行、生成信息页静态文件 |
| SIMPLEX_IMAGE | 两者 | — | 可选。覆盖 INI 中记录的镜像标签 |
⚠️ 环境变量只在 *_configs 中没有对应 INI 时(首启)参与初始化;之后的配置变更一律改 INI 文件再重启(详见《SimpleX Chat 7.0.4 配置参数详解》)。要重新生成全部证书与 INI,可停服后清空 smp_configs、xftp_configs 再 up -d(注意指纹会变更)。
七、配置参数说明
首启自动生成两份 INI,核心段位实测值:
| 文件 | 段 | 参数 | 实测值/默认 | 说明 |
|---|---|---|---|---|
| smp-server.ini | TRANSPORT | host | 10.89.62.10 | 对外地址,来自 ADDR |
| smp-server.ini | TRANSPORT | port | 5223 | SMP 监听端口;官方日志提示未来客户端默认尝试 443,可设 5223,443 |
| smp-server.ini | TRANSPORT | control_port | 注释(默认 5224) | 管理控制端口,启用后可远程查看状态、清理异常队列 |
| smp-server.ini | AUTH | new_queues | on | 是否允许新建队列 |
| smp-server.ini | AUTH | create_password | q1w2e3r4 | 建队口令,来自 PASS |
| smp-server.ini | EXPIRATION | expire_messages_days | 21 | 队列内未取消息过期天数 |
| smp-server.ini | INACTIVE_CLIENTS | disconnect | 21600 | 空闲断开秒数,实测日志 expiring clients inactive for 21600 seconds |
| smp-server.ini | STORE_LOG | enable | on | 队列 store log,持久化与恢复依赖此项 |
| smp-server.ini | WEB | static_path | /var/opt/simplex/www | 信息页静态文件目录 |
| smp-server.ini | WEB | http | 8000(默认注释) | 信息页内嵌服务端口,见 4.5 节 |
| file-server.ini | TRANSPORT | port | 443 | XFTP 监听端口 |
| file-server.ini | AUTH | create_password | q1w2e3r4 | 建文件口令 |
| file-server.ini | EXPIRATION | expire_files_hours | 48 | 文件分块过期时间,实测日志 expiring files after 2 days |
| file-server.ini | STORAGE | quota | 10737418240 | 配额字节数,来自 QUOTA=10gb |
| file-server.ini | STORAGE | path | /srv/xftp | 文件分块存储目录 |
逐项修改-验证方法与全量参数逐条解释见《SimpleX Chat 7.0.4 配置参数详解》。
八、配置文件挂载与目录结构
实测部署目录结构(tree -L 2 形态整理):
/opt/simplex-chat/
├── docker-compose.yml
├── smp_configs/ → 容器内 /etc/opt/simplex(证书 + INI)
│ ├── ca.crt ca.key ca.srl
│ ├── server.crt server.csr server.key
│ ├── openssl_ca.conf openssl_server.conf
│ ├── fingerprint
│ └── smp-server.ini
├── smp_state/ → 容器内 /var/opt/simplex(运行数据)
│ ├── smp-server-store.log smp-server-messages.log
│ ├── smp-server-stats.daily.log
│ ├── backups/{queues,messages,stats}/
│ └── www/
├── xftp_configs/ → 容器内 /etc/opt/simplex-xftp
│ ├── ca.crt ca.key server.crt server.key
│ ├── fingerprint
│ └── file-server.ini
├── xftp_state/ → 容器内 /var/opt/simplex-xftp
│ ├── file-server-store.log
│ └── backups/
└── xftp_files/ → 容器内 /srv/xftp(文件分块)
四个目录都建议纳入备份;smp_configs/xftp_configs 丢失等于丢失服务器身份(指纹变更)。
九、等价 docker run 命令
不使用 Compose 时,以下两条与本文实测等价(先建同名 bridge 网络与目录):
docker network create --subnet 10.89.62.0/24 --gateway 10.89.62.1 simplex-7.0.4-net
docker run -d --name smp-server \
--network simplex-7.0.4-net --ip 10.89.62.10 \
-e WEB_MANUAL=1 -e ADDR=10.89.62.10 -e PASS=q1w2e3r4 \
-v /opt/simplex-chat/smp_configs:/etc/opt/simplex \
-v /opt/simplex-chat/smp_state:/var/opt/simplex \
-p 5223:5223 -p 8141:8000 \
--restart unless-stopped \
simplexchat/smp-server:v7.0.1
docker run -d --name xftp-server \
--network simplex-7.0.4-net --ip 10.89.62.11 \
-e ADDR=10.89.62.11 -e QUOTA=10gb -e PASS=q1w2e3r4 \
-v /opt/simplex-chat/xftp_configs:/etc/opt/simplex-xftp \
-v /opt/simplex-chat/xftp_state:/var/opt/simplex-xftp \
-v /opt/simplex-chat/xftp_files:/srv/xftp \
-p 8140:443 \
--restart unless-stopped \
simplexchat/xftp-server:v7.0.1
十、常用运维命令
在部署目录内执行:
docker compose ps # 实例状态与端口映射
docker compose logs -f smp-server # 跟踪 SMP 日志
docker compose restart smp-server # 修改 INI 后生效
docker compose down && docker compose up -d # 完整重建(数据持久化验证见第五节)
实测 docker compose ps 回显(表格形态):
NAME IMAGE STATUS PORTS
simplex-704-stack-smp-server-1 simplexchat/smp-server:v7.0.1 Up 7 minutes 443/tcp, 0.0.0.0:5223->5223/tcp, 0.0.0.0:8141->8000/tcp
simplex-704-stack-xftp-server-1 simplexchat/xftp-server:v7.0.1 Up 9 minutes 0.0.0.0:8140->443/tcp
端口与证书自检(在任意客户端机器执行,验证服务与指纹一致):
echo | openssl s_client -connect 10.89.62.10:5223 2>/dev/null | grep subject=
echo | openssl s_client -connect 10.89.62.11:8140 2>/dev/null | grep subject=
实测回显:
subject=CN = 10.89.62.10
subject=CN = 10.89.62.11
存储水位观察:xftp 启动与过期巡检日志会输出 Total / available storage 与 Used 0mb -> 0mb, 0mb reclaimed.,配额写满将拒绝新文件上传。
十一、常见问题(FAQ)
Q1:客户端 /smp test 报连接失败?
按序检查:客户端地址是否带了正确端口与指纹(smp://指纹:口令@地址:5223);服务器防火墙是否放行 5223;docker compose logs smp-server 是否有 Serving SMP protocol on port 5223 (TLS)...。
Q2:为什么日志里有 WARNING: the clients will use port 443 by default soon.?
官方预告未来客户端将默认尝试 443 端口。生产环境建议把 smp-server.ini 的 [TRANSPORT] port 设为 5223,443 并放行两个端口;本文实测环境宿主 443 被占用,保留单端口 5223(客户端地址已显式带端口,不影响连接)。
Q3:建不了队列,报"creating new queues requires password"?
服务器设置了 PASS,客户端服务器地址必须携带口令段(smp://指纹:口令@地址:端口),口令错误或缺失时无法在该服务器创建新队列。
Q4:文件传输走了 xftp-server 吗?
客户端之间能直连时优先走直连(本文同网段实测即直连,xftp 容器无访问记录);不可直连时自动经 xftp-server 中继,文件分块默认 48 小时过期。服务端可用 /xftp test <地址> 预验证可达性。
Q5:重建容器后客户端要重新添加服务器吗?
不需要。证书与指纹在 smp_configs/xftp_configs 中持久化,队列由 store log 恢复(实测 queues: 4)。只有清空 configs 重新初始化才会换指纹,需要重新分发服务器地址。
Q6:Docker Hub 拉镜像很慢或悬挂?
见第二节镜像选型说明:官方源悬挂时可用 hub.rat.dev/simplexchat/smp-server:v7.0.1 等镜像源拉取后重打官方标签,注意核对镜像摘要一致。
十二、参考链接
- 《SimpleX Chat 7.0.4 介绍与选型指南》:https://www.quzuo.net/document/LsjsWxVptIAh
- 官方服务端部署文档(smp/xftp):https://simplex.chat/server.html 、https://simplex.chat/xftp.html(检索日期 2026-10-27)
- 服务端源码仓库:https://github.com/simplex-chat/simplexmq
- Docker Hub:https://hub.docker.com/r/simplexchat/smp-server 、https://hub.docker.com/r/simplexchat/xftp-server