Snikket 介绍与选型指南
Snikket 一体化自托管 XMPP 即时通讯方案:架构组成、邀请制与全预配特性、与 Prosody IM/ejabberd/Openfire 的选型对比,基于 stable.20260611.1 实测。
Snikket 介绍与选型指南
目标:说清 Snikket 是什么、架构如何组成、与 Prosody IM/ejabberd 等同类 XMPP 服务器的差异与选型依据。本文数据来自 snikket.org 官方站与 snikket-im 官方仓库溯源(查询日期 2026-10-30),并在 Ubuntu 22.04 服务器上以官方部署形态完成安装实测(部署过程见《Snikket Docker Compose 部署指南》)。
一、环境信息
- 操作系统:Ubuntu 22.04 LTS(x86_64)
- Snikket Server 版本:
stable.20260611.1(官方最新稳定 tag,服务器内 XEP-0092 版本查询实测自报Snikket release stable.20260611.1) - 底层 XMPP 引擎:
Prosody trunk nightly build 2079 (2026-05-27, fa492a9d1a20)(prosodyctl version实测回显) - 官方仓库:https://github.com/snikket-im/snikket-server(476 stars / 52 forks / 59 open issues,pushed_at 2026-10-23,查询日期 2026-10-30)
- 许可证:Apache-2.0(仓库 LICENSE 实查)
- 实测组件形态:官方四组件部署栈(web-proxy / server / web-portal / certs),XMPP C2S 5222 登录、Web 管理门户、MUC 群聊均实测可用
- 站内同类专栏:Prosody IM、ejabberd、Openfire、Tigase
二、软件概述
Snikket 是由 Snikket IM 组织(Matthew Wild,Prosody IM 的核心作者所在团队)维护的一体化自托管即时通讯(IM)解决方案。它的核心主张是:XMPP 技术已经足够成熟,但"自己搭一个能用的聊天服务"这个门槛太高——要装服务器、配证书、配群聊服务、配文件上传、配 TURN 语音中继、还要解决客户端兼容。Snikket 把这一整套打包成一个开箱即用的发行版:
- 服务端:以 Prosody(轻量级 Lua 编写的 XMPP 服务器)为引擎,预配好群聊(MUC)、文件分享(HTTP File Upload)、消息存档(MAM)、推送通知、STUN/TURN 语音视频中继、邀请注册等全部所需模块,并以"官方推荐参数"固化,普通管理员无需接触 Prosody 配置;
- Web 管理门户:内建一个 Python 编写的管理门户,管理员用浏览器即可完成账号管理、邀请链接生成、群组(Circle)管理等操作,无需 CLI;
- 客户端:官方 iOS/Android App(基于 Conversations 项目代码定制),扫描邀请二维码即完成注册接入;
- 证书:内建 Let's Encrypt 证书管理器(certbot),首次部署自动申请、自动续期,客户端与 Web 全程 TLS。
一句话定位:Snikket 之于 XMPP,正如 Nextcloud 之于文件同步——不是再造一个协议实现,而是把成熟引擎做成"给普通人用"的成品。
💡 技术拓展:XMPP 服务器的"发行版"与"裸引擎"是两种选型思路。主流方案对比——
方案 思路 适合谁 Snikket Prosody 引擎 + 全家桶预配 + 邀请制 + 官方 App,面向"开箱即用" 家庭、团队、社区,无专职运维 Prosody IM 裸装 只装引擎,逐个启用/配置模块 想完全掌控每个参数的技术玩家 ejabberd Erlang 引擎,自带 WebAdmin、大集群与关系库支持 大规模、多租户、企业集成 Openfire Java 引擎 + 成熟 Web 控制台 + 插件生态 传统企业内网、Java 栈团队 本文选型对象是 Snikket:目标是"交付一个完整的私有 IM 服务"而非"交付一个 XMPP 引擎",Snikket 用最低的运维成本覆盖 90% 的自托管聊天需求;需要精细定制协议行为时,Prosody/ejabberd 裸装更合适( Prosody 相关能力可参考 《Prosody IM 13.0.7 介绍与选型指南》)。
三、核心架构
Snikket 采用"一个 XMPP 域 + 四个协作组件"的架构。官方部署以 Docker Compose 编排,四个服务共享同一个数据卷,全部使用宿主网络(network_mode: host):
| 组件 | 镜像 | 职责 | 内部监听 |
|---|---|---|---|
| snikket_server | snikket/snikket-server:stable | Prosody XMPP 核心 + 内置 coturn(STUN/TURN) | 5222(C2S)、5223(C2S 直连 TLS)、5269(S2S)、5280(内部 HTTP API,默认绑 127.0.0.1)、3478(STUN/TURN) |
| snikket_web_proxy | snikket/snikket-web-proxy:stable | Nginx 反向代理:443 统一入口,按路径分发门户与 XMPP 子服务 | 80/443 |
| snikket_web_portal | snikket/snikket-web-portal:stable | Web 管理与邀请门户(Python/Quart,hypercorn 承载) | 5765(内部 HTTP,默认绑 127.0.0.1) |
| snikket_certmanager | snikket/snikket-cert-manager:stable | Let's Encrypt 证书申请与每小时续期(certbot + anacron) | 出站访问 ACME |
组件间桥接机制(部署排障时最需要理解的一条链路):
- Web 代理把
https://<域名>/的普通页面请求转发给门户(默认上游localhost:5765),把/admin_api、/invites_api、/upload、/http-bind、/xmpp-websocket等路径转发给 Prosody(默认上游localhost:5280); - 门户自身不直接连数据库——它通过环境变量
SNIKKET_WEB_PROSODY_ENDPOINT(镜像默认http://127.0.0.1:5280/)调用 Prosody 的管理 API(OAuth2 password 授权获取令牌后访问/admin_api)。宿主网络下 127.0.0.1 天然互通;若改为桥接网络分容器部署,必须把该变量改为指向 snikket_server 服务地址,并让 Prosody/门户监听 0.0.0.0(实测验证过的改法见《Snikket Docker Compose 部署指南》第五章); - 证书管理器申请到的证书落盘到共享数据卷
/snikket/letsencrypt/live/<域名>/,Prosody 启动前由prosodyctl cert import导入/etc/prosody/certs/,Web 代理由内建的 cert-monitor 服务轮询检测到证书后自动渲染 Nginx 配置并 reload。
对外端口与域名规划(官方要求):
| 端口 | 用途 |
|---|---|
| 80/TCP | HTTP 入口(ACME 验证 + 跳转 HTTPS) |
| 443/TCP | Web 门户、XMPP Over HTTPS(BOSH/WebSocket) |
| 5222/TCP | 客户端连接(C2S,STARTTLS) |
| 5223/TCP | 客户端直连 TLS(legacy) |
| 5269/TCP | 服务器联邦(S2S) |
| 3478/TCP+UDP | STUN/TURN(语音视频中继) |
| 5000/TCP | 文件传输代理(proxy65,默认) |
域名上除主域(如 chat.example.com)外,还需 groups.<域名>(群聊 MUC)与 share.<域名>(文件分享)两个子域名,DNS 上 CNAME 指向主域即可。
四、功能特性
以下特性均来自官方文档站(docs.snikket.org)并在实测环境中逐项验证可用:
- 邀请制注册:服务器默认关闭公开注册(
registration_invite_only = true),管理员生成邀请链接/二维码,受邀者按链接注册账号;实测create-invite --admin --group default生成的链接可在浏览器完成admin@snikket.local的注册并直接登录门户; - Web 管理门户:账号管理、邀请管理、群组(Circle)、系统健康面板(
/_health/portal、/_health/xmpp健康检查实测返回STATUS OK);登录走 OAuth2 password 授权,会话由服务端托管; - 消息存档(MAM):默认保留 7 天(
SNIKKET_RETENTION_DAYS可调),多设备同步消息由服务端存档兜底; - 群聊(MUC):
groups.<域名>MUC 服务实测可用,房间默认持久化、仅本地创建(restrict_room_creation = "local"),支持房间内 moderation 与离线成员推送; - 文件分享:单文件上限 100MB(协议层 +16 字节为 XEP-0454 加密余量),每用户每日默认 1GB,全局总量可通过
SNIKKET_UPLOAD_STORAGE_GB限定,过期随留存周期清理; - 端到端加密:App 与兼容客户端支持 OMEMO 端到端加密(服务器只存密文,配合 MAM 实现离线多设备同步);
- 推送通知:通过 Snikket 官方推送中继(push.snikket.net / push-ios.snikket.net,连接由
isolate_except_domains白名单放行)向离线设备下发通知,App 无需自建推送通道; - 语音视频:内置 coturn 提供 STUN/TURN,TURN 凭据由 Prosody 与 coturn 共享密钥自动生成(首次启动写入
/snikket/prosody/turn-auth-secret-v2); - 服务器联邦(S2S):标准 XMPP 联邦,强制 TLS(
s2s_require_encryption = true、s2s_secure_auth = true),可与任意 XMPP 服务器互通; - 多客户端同账号:默认每账号最多 10 个并发客户端资源(
SNIKKET_MAX_USER_CLIENTS)。
💡 技术拓展:IM 的"加密"分两层,选型时别混淆。传输加密(TLS,STARTTLS/直连 TLS)保护的是"客户端↔服务器"链路;端到端加密(OMEMO/OTR/PGP 等)保护的是"发件人↔收件人",服务器也只能看到密文。Snikket 两条都做了:链路上 C2S/S2S 强制 TLS,内容上依赖客户端 OMEMO。对比 Matrix 生态(如 Synapse+Element)则走 Megolm 端到端加密路线,协议本身不同、不与 XMPP 联邦。
五、快速开始(最小可用示例)
完整的 DNS/端口/证书细节见《Snikket Docker Compose 部署指南》,这里给出最小路径(已在 Ubuntu 22.04 实测):
# 1. 准备目录与配置(/etc/snikket 是官方约定的部署目录)
mkdir -p /etc/snikket && cd /etc/snikket
curl -o docker-compose.yml https://snikket.org/service/resources/docker-compose.yml
cat > snikket.conf <<'EOF'
SNIKKET_DOMAIN=chat.example.com
SNIKKET_ADMIN_EMAIL=admin@example.com
EOF
# 2. 启动四组件
docker compose up -d
实测(测试域 snikket.local)启动后各容器状态与 Prosody 激活端口回显:
NAME STATUS
snikket Up 12 seconds
snikket-certs Up 12 seconds
snikket-portal Up 12 seconds
snikket-proxy Up 12 seconds
portmanager info Activated service 'c2s' on [*]:5222, [::]:5222
portmanager info Activated service 'c2s_direct_tls' on [*]:5223, [::]:5223
portmanager info Activated service 's2s' on [*]:5269, [::]:5269
portmanager info Activated service 'http' on [0.0.0.0]:5280
# 3. 创建管理员邀请链接并按链接完成注册
docker exec snikket create-invite --admin --group default
# 回显:Your invite link: https://snikket.local/invite/MhuhpaBQrLc-lD2p_hiTLH7f/
浏览器打开邀请链接 → 设定用户名/密码 → 注册成功页显示分配的 XMPP 地址(实测显示 admin@snikket.local)→ 用该地址登录 https://<域名>/ 即进入管理门户。XMPP 客户端用同一账号密码连 5222 端口即可聊天。
六、适用场景与限制
适用场景:
- 家庭/朋友圈私有 IM:邀请制 + 官方 App 扫码加入,把使用门槛降到"发个链接";
- 中小企业内部沟通:数据完全自持,E2EE + 自管推送中继之外的全部组件都在自己服务器上;
- 社区/开源项目服务:可与 XMPP 联邦互通,社区成员用既有 XMPP 账号也能加入群聊;
- 教学与实验:组件边界清晰(nginx/prosody/portal/certs),是学习 XMPP 服务端完整形态的好标本。
限制与注意:
- 域名是硬前提:证书、联邦、客户端发现都依赖真实公网域名;没有公网域名时只能走自签证书降级(实测路径见部署指南排障章节),联邦不可用;
- 端口 80/443 需独占:官方形态 Web 代理直接绑宿主 80/443,同机已有网站时需按官方反向代理文档改造;
- TURN 依赖公网 IP:实测在无公网 IP 的 NAT/桥接环境下 coturn 报
Unable to determine any public IP addresses, required for TURN,语音视频中继需要服务器具备公网可达性(可设SNIKKET_TWEAK_TURNSERVER_INTERNAL_IP或接外部 TURN); - 深定制需回到 Prosody 层:Snikket 有意收敛配置面(snikket.conf 环境变量),要改 Prosody 行为需通过
SNIKKET_TWEAK_EXTRA_CONFIG挂载附加配置,且部分改动会被官方升级策略覆盖; - 版本节奏:官方以
stable.YYYYMMDD[.N]日期式 tag 滚动发布(实测最新stable.20260611.1,GitHub 无传统 Release 页,tag 即版本),升级 = 拉新镜像重启,跨版本数据迁移由启动脚本自动处理。
七、同类选型对比
围绕"自托管 XMPP 服务"这个命题,把主流方案放在同一张表里(数据均溯源自各官方仓库,查询日期 2026-10-30;Snikket 数据为实查值):
| 维度 | Snikket | Prosody IM(裸装) | ejabberd | Openfire |
|---|---|---|---|---|
| 定位 | 一体化自托管 IM 发行版 | 轻量 XMPP 引擎 | 企业级 XMPP 引擎 | 传统企业 XMPP + Web 控制台 |
| 实现语言 | Lua(Prosody)+ Python(门户) | Lua | Erlang/OTP | Java |
| 许可证 | Apache-2.0(server 仓库实查) | MIT | GPL-2.0/Apache 双许可 | Apache-2.0 |
| 管理界面 | 专用 Web 门户(邀请制管理、健康面板) | 无官方(第三方 admin 插件) | WebAdmin + CLI | 成熟 Web 控制台 |
| 开箱模块 | MUC/MAM/上传/TURN/推送/邀请全预配 | 按需手工启用 | 内置较多,需手工调优 | 插件市场 |
| 集群 | 不支持(单实例) | 不支持 | 支持原生集群 | 支持集群(商业版部分特性) |
| 仓库活跃度 | 476 stars,pushed 2026-10-23 | 约 1.3k stars(prosody-im 仓库) | 约 3.5k stars(processone) | 约 2.9k stars(igniterealtime) |
| 版本形态 | stable.YYYYMMDD[.N] 日期 tag | 13.x 语义化版本 | 26.x 语义化版本 | 5.x 语义化版本 |
| 上手成本 | 低(一份 conf 两个变量) | 中(逐模块配置) | 中高(参数面广) | 中低(GUI 引导) |
| 站内专栏 | 本文 | 《Prosody IM 13.0.7 介绍与选型指南》 | 《ejabberd 26.09 介绍与选型指南》 | 《Openfire 5.1.2 介绍与选型指南》 |
其他可参的单位:Tigase(Java,《Tigase 介绍与选型指南》)、MongooseIM(ejabberd 企业分支,《MongooseIM 6.10.0 介绍与选型指南》)。若不考虑 XMPP 协议本身,Matrix 系(Synapse/Dendrite + Element)是另一条技术路线:生态偏"去中心化大平台",资源占用与运维复杂度显著高于 Snikket,小规模私有场景通常不是首选。
选型建议("如果…则…"):
- 如果目标是"给团队/家庭一个能用就行、不想天天运维的私有聊天"→ Snikket,一份
snikket.conf两个变量起服务,升级就是拉镜像; - 如果要数百并发以上的大集群、多虚拟主机托管 → ejabberd(原生集群)或 MongooseIM;
- 如果要极致轻量、单机小内存、愿意手工调每个模块 → Prosody IM 裸装;
- 如果企业已有 Java 技术栈、需要 LDAP/AD 深度集成与成熟 GUI → Openfire;
- 如果必须在既有 SNMP/Zabbix 栈内做深度监控对接、或需要 REST 管理接口自动化 → ejabberd(REST API 完备)。
八、参考链接
- 官网:https://snikket.org/
- 官方文档(快速开始/进阶配置):https://docs.snikket.org/
- 服务端仓库:https://github.com/snikket-im/snikket-server(部署栈与文档源码,Apache-2.0)
- 自托管配套仓库:https://github.com/snikket-im/snikket-selfhosted
- 客户端下载:https://snikket.org/app/
- FAQ:https://snikket.org/faq/
- XMPP 协议基线(RFC 6120/6121):https://xmpp.org/
- 站内关联文档:《Snikket Docker Compose 部署指南》、《Snikket stable.20260611.1 配置参数详解》、《Snikket stable.20260611.1 常用运维命令与排障详解》