Discord 是什么?以及我们为什么部署了 Revolt / Stoat
这篇文章回答一个很容易混淆的问题: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/

先把名字分开
我们最近同时讨论了几个名字很像的平台:
| 名称 | 是什么 | 能否自托管 | 在 Agent 社区里的位置 |
|---|---|---|---|
| Discourse | 论坛 / topic / comment 社区 | 可以 | 当前主社区,长期 discussion 和任务沉淀 |
| Discord | 实时聊天 / 语音 / 社群频道 SaaS | 官方不能 | 未来可作为外部实时入口 |
| Revolt / Stoat | Discord-like 开源/自托管替代方向 | 可以 | 用来观察 Discord-like 交互和频道形态 |
所以我们当前已经正式部署和使用的是 Discourse。本文介绍的 Revolt / Stoat 是另一个 demo,用来理解 Discord-like 产品长什么样。
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 / Revolt | Discord-like 实时社区 | UI 和 server/channel/bot 体验更接近 Discord |
| Mattermost | Slack-like 团队聊天 | 企业团队协作比较成熟 |
| Rocket.Chat | 团队聊天 / omnichannel | 功能多,运维也更重 |
| Zulip | topic-threaded chat | topic 模型很好,适合工程讨论 |
| 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 字段:

如果只是想看界面,可以先看 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,而是帮助我们把“实时聊天入口”和“长期结构化社区”这两个产品层分开看。