Snikket 介绍与选型指南

Snikket 一体化自托管 XMPP 即时通讯方案:架构组成、邀请制与全预配特性、与 Prosody IM/ejabberd/Openfire 的选型对比,基于 stable.20260611.1 实测。

SnikketSnikketXMPP即时通讯自托管2026/10/30

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 服务器的"发行版"与"裸引擎"是两种选型思路。主流方案对比——

方案思路适合谁
SnikketProsody 引擎 + 全家桶预配 + 邀请制 + 官方 App,面向"开箱即用"家庭、团队、社区,无专职运维
Prosody IM 裸装只装引擎,逐个启用/配置模块想完全掌控每个参数的技术玩家
ejabberdErlang 引擎,自带 WebAdmin、大集群与关系库支持大规模、多租户、企业集成
OpenfireJava 引擎 + 成熟 Web 控制台 + 插件生态传统企业内网、Java 栈团队

本文选型对象是 Snikket:目标是"交付一个完整的私有 IM 服务"而非"交付一个 XMPP 引擎",Snikket 用最低的运维成本覆盖 90% 的自托管聊天需求;需要精细定制协议行为时,Prosody/ejabberd 裸装更合适( Prosody 相关能力可参考 《Prosody IM 13.0.7 介绍与选型指南》)。

三、核心架构

Snikket 采用"一个 XMPP 域 + 四个协作组件"的架构。官方部署以 Docker Compose 编排,四个服务共享同一个数据卷,全部使用宿主网络(network_mode: host):

组件镜像职责内部监听
snikket_serversnikket/snikket-server:stableProsody XMPP 核心 + 内置 coturn(STUN/TURN)5222(C2S)、5223(C2S 直连 TLS)、5269(S2S)、5280(内部 HTTP API,默认绑 127.0.0.1)、3478(STUN/TURN)
snikket_web_proxysnikket/snikket-web-proxy:stableNginx 反向代理:443 统一入口,按路径分发门户与 XMPP 子服务80/443
snikket_web_portalsnikket/snikket-web-portal:stableWeb 管理与邀请门户(Python/Quart,hypercorn 承载)5765(内部 HTTP,默认绑 127.0.0.1)
snikket_certmanagersnikket/snikket-cert-manager:stableLet'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/TCPHTTP 入口(ACME 验证 + 跳转 HTTPS)
443/TCPWeb 门户、XMPP Over HTTPS(BOSH/WebSocket)
5222/TCP客户端连接(C2S,STARTTLS)
5223/TCP客户端直连 TLS(legacy)
5269/TCP服务器联邦(S2S)
3478/TCP+UDPSTUN/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 端口即可聊天。

六、适用场景与限制

适用场景:

  1. 家庭/朋友圈私有 IM:邀请制 + 官方 App 扫码加入,把使用门槛降到"发个链接";
  2. 中小企业内部沟通:数据完全自持,E2EE + 自管推送中继之外的全部组件都在自己服务器上;
  3. 社区/开源项目服务:可与 XMPP 联邦互通,社区成员用既有 XMPP 账号也能加入群聊;
  4. 教学与实验:组件边界清晰(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 数据为实查值):

维度SnikketProsody IM(裸装)ejabberdOpenfire
定位一体化自托管 IM 发行版轻量 XMPP 引擎企业级 XMPP 引擎传统企业 XMPP + Web 控制台
实现语言Lua(Prosody)+ Python(门户)LuaErlang/OTPJava
许可证Apache-2.0(server 仓库实查)MITGPL-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] 日期 tag13.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 完备)。

八、参考链接