跳到主要内容

Discord 是什么?以及我们为什么部署了 Revolt / Stoat

· 阅读需 7 分钟

这篇文章回答一个很容易混淆的问题:Discord 能不能像 Discourse 一样自建?如果不能,我们刚刚部署的 Revolt / Stoat 又是什么?

结论先说:官方 Discord 不能自建。它是 Discord 公司运营的 SaaS。我们能自建的是 Discord-like 替代品,例如 Stoat / Revolt、Mattermost、Rocket.Chat、Zulip、Matrix / Element 等。为了直观看一下 Discord-like 产品形态,我们在 ChatArch 服务器上部署了一个 Stoat / Revolt demo。

当前 demo 入口:

https://revolt.public.wzhecnu.cn/

Stoat / Revolt landing page

先把名字分开

我们最近同时讨论了几个名字很像的平台:

名称是什么能否自托管在 Agent 社区里的位置
Discourse论坛 / topic / comment 社区可以当前主社区,长期 discussion 和任务沉淀
Discord实时聊天 / 语音 / 社群频道 SaaS官方不能未来可作为外部实时入口
Revolt / StoatDiscord-like 开源/自托管替代方向可以用来观察 Discord-like 交互和频道形态

所以我们当前已经正式部署和使用的是 Discourse。本文介绍的 Revolt / Stoat 是另一个 demo,用来理解 Discord-like 产品长什么样。

Agent community platform map

Discord 是什么?

如果没怎么用过 Discord,可以先把它理解成:

实时社区大厅 + 频道化群聊 + 语音房间 + bot 操作入口

它最早从游戏社区和语音聊天起家,后来扩展到开源项目、AI 产品社区、创作者社区、课程社群、模型工具社区等。Midjourney 早期就主要通过 Discord 提供交互,所以很多人第一次接触 Discord 是在一个很热闹、滚动很快的 prompt / image 频道里。

一个典型 Discord server 大概由这些对象组成:

  • Server:一个社区或组织空间。
  • Category:频道分组,比如 Announcements、General、Support、Bots。
  • Text Channel:文字频道,比如 #general#support
  • Voice Channel:语音频道。
  • Forum Channel:轻量帖子区,但仍在 Discord 体验内。
  • Thread:从某条消息展开的局部讨论。
  • Role:成员身份和权限。
  • Bot:机器人用户,可以被 @mention,也可以提供 slash commands。

它的典型界面是多栏的:

最左侧:server 列表
左侧:当前 server 的 channel 列表
中间:当前 channel 的实时消息流
右侧:成员列表、在线状态、角色
底部:输入框、附件、表情、slash command

这和 Discourse 很不一样。Discourse 更像长期论坛:topic-first、搜索友好、适合沉淀结论;Discord 更像实时聊天空间:适合快速问、快速响应、语音、bot 命令和群内互动。

Discord 能自建吗?

官方 Discord 不能自建。

更精确地说:

  • 你可以创建 Discord server。
  • 你可以写 Discord bot。
  • 你可以用 Discord webhook / Gateway / slash command 做自动化。
  • 但你不能把官方 Discord 服务端软件部署到自己的机器上。

所以如果目标是“我想要一个能自己部署的 Discord-like 社区”,就要看替代品,而不是 Discord 本身。

常见替代品:

平台更接近什么备注
Stoat / RevoltDiscord-like 实时社区UI 和 server/channel/bot 体验更接近 Discord
MattermostSlack-like 团队聊天企业团队协作比较成熟
Rocket.Chat团队聊天 / omnichannel功能多,运维也更重
Zuliptopic-threaded chattopic 模型很好,适合工程讨论
Matrix + Element去中心化聊天协议和客户端更开放,但部署和体验更复杂

我们部署了什么?

这次部署的是 Stoat self-hosted。GitHub 上原来的 Revolt self-hosted 路径现在观察到会转到 Stoat 相关仓库,所以文章里用 Revolt / Stoat 一起称呼这个方向。

服务目录:

/home/zhihong/.chatarch/revolt/

配置目录:

/home/zhihong/.chatarch/revolt/self-hosted/

访问入口:

https://revolt.public.wzhecnu.cn/

本机接入方式和 Discourse 一样遵循 ChatArch 的 local/public 规则:

revolt.local.wzhecnu.cn -> 本机 Nginx local vhost -> 127.0.0.1:8880
revolt.public.wzhecnu.cn -> 既有 public-entry -> local vhost -> 127.0.0.1:8880

没有给本机 Nginx 加 revolt.public.wzhecnu.cn,也没有改 DNS / FRP / public tunnel。

为什么这类系统这么重?

这也是这次部署最直观的感受:Discord-like 自托管产品通常比 Discourse 更像一整套 realtime application stack。

Stoat / Revolt self-hosted 不是一个单进程服务,而是一组容器:

web
api
events
database / MongoDB
redis / KeyDB
rabbit / RabbitMQ
minio
autumn 文件服务
january metadata/image proxy
gifbox
pushd
crond
voice-ingress
livekit
caddy

这说明它要同时处理:

  • 前端 Web App
  • API
  • WebSocket events
  • 文件和头像上传
  • 图片/metadata proxy
  • 推送通知
  • 定时任务
  • 数据库
  • 缓存
  • 消息队列
  • 语音/视频能力
  • 内部反向代理

所以如果只是想做长期 topic、任务、决策和文档沉淀,Discourse 更简单直接;如果想体验 Discord 那种 server/channel/message/bot 的实时空间,Stoat / Revolt 更像。

内部 Caddy 和主机 Nginx 的关系

Stoat self-hosted 默认带一个 Caddy。这个 Caddy 不是替代服务器上的主 Nginx,而是 Stoat 内部用来聚合多服务路由的网关:

/ -> web
/api -> api
/ws -> events websocket
/autumn -> file server
/january -> metadata/image proxy
/gifbox -> gifbox
/livekit -> voice/video

为了不影响服务器上已有的 Discourse、Gitea、Open WebUI 等服务,我们没有让 Stoat Caddy 绑定主机的 80/443。最终只暴露:

127.0.0.1:8880 -> Stoat Caddy :80

再由主机 Nginx 代理:

revolt.local.wzhecnu.cn -> 127.0.0.1:8880

这样做的好处是:Stoat 内部还是按官方 self-hosted 结构运行;外部入口仍然统一走 ChatArch 已有的 Nginx + local/public 机制。

这个站有默认账号密码吗?

没有。

Stoat / Revolt self-hosted 初始化之后不会自动创建一个默认 admin 用户,也没有类似 admin/admin 的默认账号密码。

当前这个 demo 也没有公开默认账号。API 当前状态是:

{"revolt":"0.13.7","invite_only":true,"email":false}

这意味着:

  • 站点能打开。
  • 注册入口可见。
  • 但注册需要 invite code。
  • 邮件系统还没配置。
  • 没有默认账号密码可以直接登录。

注册页能看到 Invite Code 字段:

Stoat / Revolt signup page

如果只是想看界面,可以先看 landing page 和注册页。如果要进入真正的 server/channel/chat 页面,需要手动生成一个 invite code,再创建第一个测试账号。

它和我们的 Agent 社区有什么关系?

目前我们的主线仍然是:

Discourse = 正式 topic、任务上下文、结论沉淀、公开知识库
Discord / Stoat / Revolt = 可选实时聊天入口
Agent Router = 把实时消息和结构化 topic 关联起来
Hermes / Codex / CC Connect = 执行任务的 runtime / gateway

也就是说,Stoat / Revolt 不会替代 Discourse。它更适合用来回答:

  • Discord-like 的 server/channel/thread 体验是什么?
  • 如果未来想要实时 @bot,应该长什么样?
  • Agent 是否应该出现在一个聊天频道里?
  • 聊天结果如何回写到 Discourse topic?

长期看,更合理的组合是:

Discourse topic 负责长期记忆
Stoat / Discord 负责实时入口
Agent Router 负责事件分发
Agent Runtime 负责执行任务
Git / ChatBoard / Blog 负责产物沉淀

当前 demo 的边界

这个 Stoat / Revolt 只是 inspection demo,还不是生产社区:

  • 没有配置 SMTP。
  • 没有配置 captcha。
  • 已开启 invite-only,避免公网开放注册。
  • 没有公开 invite code。
  • 没有创建默认 admin/user。
  • 语音/视频 RTC 端口没有对外开放。
  • 备份和升级策略还没写。

所以它适合“看一眼 Discord-like 产品是什么样”,不适合作为现在的正式 Agent 社区主入口。

小结

如果把几个平台放在一起看:

  • Discourse:适合做当前 Agent 社区的长期讨论和任务沉淀。
  • Discord:官方不能自建,但适合作为外部 realtime channel。
  • Stoat / Revolt:可以自建,用来观察 Discord-like server/channel/chat 体验。
  • Agent Router:未来把这些入口统一起来,让 @researcher@scribe@engineer 等 Agent 能跨平台响应。

这次部署 Stoat / Revolt 的价值,不是要马上替代 Discourse,而是帮助我们把“实时聊天入口”和“长期结构化社区”这两个产品层分开看。