Parley 让普通 IRC 客户端接入联邦聊天网络

Parley 是一个用 Go 写的联邦化聊天服务器,前端说普通 IRC。任何现成 IRC 客户端不用装插件就能连,用户地址长成 user@domain 的样子,两个从未接触过的实例也能当场完成互联。项目在仓库里把自己定位成 working proof of concept,端到端能跑,加固程度要自己评估。

它的联邦层不走 ActivityPub。每个事件是一份 JSON,POST 到对端的 /inbox,HTTP 头里带 detached ed25519 签名,接收方用自己发现的公钥验签。发现机制靠 DNS,一条 _parley._tcp.<域名> 的 SRV 记录加实例根目录下的 well-known 文档,里面放着 ed25519 公钥和 inbox 地址,每个用户也有自己的 well-known 文件。互联之后两边靠 gossip 交换对等节点列表,网络自己长出来。

一条私聊是怎么送到对端的

Bob 在自己实例上给 Alice 发消息,客户端的写法是一条 PRIVMSG,目标写成用户名加对端实例域名。他的实例先查那个域名的 SRV 记录,从目标主机抓 instance.json,把公钥缓存下来。接着它给这条事件签名,POST 到对端的 inbox。对端用同样的方式认识 Bob 的实例,验签通过后投递给 Alice。因为是个新对等,对端会回一个 hello,双方交换频道名册和 peer 列表,之后靠 gossip 维持这张网状结构。

这套设计的收益在客户端。Parley 在 6667 端口明文监听 IRC,TLS 由反向代理终结,支持 server-time、message-tags、echo-message、multi-prefix、setname、CHATHISTORY、read-marker、multiline、TAGMSG 这些 IRCv3 扩展。登录用 PASS 或 SASL PLAIN。irssi 这类老客户端直接就能用,用户不必为联邦付学费。

存档够自用。存储用纯 Go 驱动的 SQLite,带全文索引,parleyctl search 能搜历史,每个频道还有一个公开 feed。管理有四条路,CLI、网页后台、HTTP API 和任意 OpenID Connect 的单点登录,用户可以在设置页自己签发 IRC token 给 bot 用。仓库里没有 Web 聊天客户端,这是有意不做,管理动作都落在 IRC 客户端、网页后台和 CLI 上。

部署一个实例的步骤

  1. 起容器并挂持久卷,-domain 传自己的域名,-endpoint 传外部访问地址,数据落在 /data。
  2. 用 parleyctl 建第一个账户,再给它签一个 IRC token。
  3. 在 8443 前面架 HTTPS 反向代理,或者直接给进程传 -tls-cert 和 -tls-key。
  4. 发布 SRV 记录,缺失时对端会回退到域名根目录的 well-known 路径。
  5. 客户端侧另做一层 TLS 终结,比如用 Caddy 的 layer4 模块在 6697 上收 IRC TLS。
  6. 跑 parleyctl check <用户@域名> 做外部自检,DNS、well-known、密钥、endpoint、inbox、IRC TLS 端口会逐项查,失败时退出码非零。
  7. 备份实例密钥文件,泄露或怀疑泄露就轮换,旧指纹会留一份备份。

想先看效果,仓库带了一个本地双实例演示,一台机器上起两个域名,跳过 DNS 也能跑通互联。见到两条实例互发消息,再折腾自己的域名。

适合什么场景

自用群、工具通知频道、小团队内部沟通,现在的完成度够。看重聊天记录可迁移、想把自己域名的身份握在手里的场景也合适。反过来,要端到端加密、要频道管理权限、要打开网页就能聊的,现在都不满足,得等它脱离 proof of concept 的阶段。

限制要先看清

它没有端到端加密,只有实例级密钥,没有每用户密钥,私聊对服务器管理员可见。全局频道 #name 在实例间复制,没有所有者、没有 topic、没有操作员;&name 是本地频道,永不联邦。频道的公开 feed 不需要认证,历史可能被未授权抓取。默认每账户每秒一条消息、突发 20 条,bot 豁免。

实例密钥就是域名身份本身。丢了它,所有缓存过旧公钥的对等都会拒绝你,只能换新密钥再让全网重新信任。PARLEY_TRUSTED_PROXIES 配错会开启免密登录,代理可以直接断言用户身份,这个参数要反复核对。v0.5.0 把跨实例用户名的分隔符从斜杠改成了冒号,老实例混跑时会出现用户名匹配不上。

常见问题

和 Matrix 的区别在哪。Parley 前端是 IRC 协议本身,联邦层是签名 HTTPS 加 DNS 发现,不用 ActivityPub,也不追求 Matrix 那套房间状态和权限模型。

数据存在哪。SQLite,纯 Go 驱动,关闭 CGO 静态编译,带全文索引,历史默认保留 8760 小时。

能直接上生产吗。项目自称 proof of concept,没有每用户密钥和端到端加密,承载敏感沟通前要自己补安全设计。拿去跑内部工具频道、自用群,门槛低得多。