进阶 docs.flarum.org 2026-10-15 14:50:52 · 21 阅读

第2章 Flarum 2.0 正式发布:历经 1234 天打磨的论坛新版本

Flarum 2.0 正式发布,快去升级你的论坛吧。
本次发布是我们首次举办的 Flarum 直播发布会。感谢 @clarkwinkelmann,你可以在他的 YouTube 频道上回看整场活动:

2023 年 5 月 24 日,这个仓库里合入了一条史上最平淡无奇的提交信息:
chore: prepare v2.0 development
1234 天之后——没错,真的是一二三四——一切尘埃落定。Flarum 2.0.0 已进入稳定版,今天就可以安装。
17 个预发布版本:八个 beta、一个修复 beta 的 beta.8.1,还有八个 RC 来自 41 位贡献者的 1250 次提交 距 Toby Zerner 向空仓库推送第一条 Hello world! 已过去十一年零九个月 不过在聊技术之前,我想先介绍两个人。
👋 这是 Sami 的作品 Flarum 2.0 是 Sami Mazouz 的杰作。@Sami M 我要先把这句话放在最前面,这样你在看下面的功能清单时,就知道这些是谁的心血。
看看 2.0 到底包含什么,同一个名字会不断出现:
整个扩展生态赖以维系的 JSON:API 重构——Sami。 搜索驱动,可以把搜索替换成 Elasticsearch 或其他方案——Sami。 代码分割,让你的论坛不再加载一个巨大的 JavaScript 包——Sami。 PostgreSQL、SQLite、MariaDB 驱动。延续十年的"Flarum 就等于 MySQL"就此终结——Sami。 Messages 扩展。私信功能,终于来了——Sami。 后台搜索、扩展列表、extension bisect、主题与可扩展性大改——Sami、Sami、Sami、Sami。 这是 2023 到 2025 年间的 208 次提交,而且都不是轻松的活儿。这类基础工作往往耗时数月,截图不显眼,也很少有人道谢,但未来十年基于 Flarum 的一切都将依赖它。
任何人都能加一个按钮。而 Sami 是钻进了 Flarum 那些早已僵化的部分——API 层、搜索系统、资源管线、"只会有一种数据库"的默认假设——把它们逐一重建,让其他人无需修改核心代码就能扩展它们。
谢谢你,Sami。这是属于你的版本,我是认真的。
🏁 然后总得有人收尾 那个人就是我。
"地基重建完毕"和"你能放心把它跑在一个拥有一万名会员的论坛上"之间,隔着一段比想象中大得多的鸿沟。2025 年 11 月 beta.4 发布时,正是我带着 2.0 走完了剩下的路:
17 个预发布版本中的 14 个:从 beta.4 到 rc.8 的所有版本 自 beta.3 以来的 529 次提交中有 425 次,即每五次中有四次 仅 2026 年就提交了 388 次:在 2.0 分支中包括 242 个修复、63 个新功能以及 25 项性能优化 并非只有“幕后”工作。你在 2.0 中实际看到的功能,许多也诞生于这段时期:
Deck,将在后文中详细介绍 为消息功能上线做准备:实时刷新、可信的未读计数、单封邮件对应一个会话(直到已读)、防垃圾邮件的节流机制 队列仪表板,支持失败任务管理以及暂停/恢复 废弃包裹警告、扩展健康组件、可折叠分类、仪表板公告和恢复默认设置 CJK 搜索、主题切换器、移动端导航搜索以及触觉反馈 带退订链接的 HTML 邮件,这一特性可追溯至 2023 年 将审计和 GDPR 功能整合进核心,并为 Realtime 提供扩展器 API,以便其他扩展可以接入 针对讨论页面进行了一轮长期性能优化,并集成测试以拦截 N+1 查询,确保速度 两次 Laravel 升级(12 和 13)、FontAwesome 7、WebP 头像和 Logo、Postmark 邮件驱动程序以及 tinker 还有那些安全加固工作,没人会对此截图。没人会为“查明缓存清除后为何下一位访客收到 500 错误而执行清除的管理员却不会”这样的事项写更新日志。但这正是“你听说过的 2.0”和“你周二早晨可以安心交给成员的 2.0”之间的区别。
Sami 让 2.0 成为可能,我让它可以发布。这就是你即将安装的东西,我为此感到自豪。
🙋 如果你只是使用论坛 这部分没有专业术语。以下是你实际会注意到的变化:
⚡ 更快。页面加载更快,传输数据更少。论坛不再向不需要的页面打包发送巨大的代码包。
💬 可以发消息了。成员间的私信内置其中,新消息实时送达。
🔍 搜索能找到东西。帖子搜索能正常配合讨论搜索工作,你可以从名字的任何部分查找成员,而不仅仅是开头。如果你的论坛使用中文、日文或韩文,新的模式能真正理解词语的起止位置,这是 Flarum 以前处理得不好的一点。
🌙 深色模式下显示正确。深色模式 Logo,加上头部可选的主题切换器,让你自由选择。
📱 在手机或平板上,搜索功能放在导航栏预期位置,菜单点一下就能展开,而非需要二次点击,同时支持可选的触觉反馈。
📧 邮件通知逻辑清晰。支持标准 HTML 格式,且每封通知邮件都附带退订链接,让你无需深入设置即可关闭不需要的内容。退订太多想恢复?点击按钮一键重置为默认配置。
🛠️ 如果你负责维护论坛 2.0 版本将彻底改变你的一周工作节奏。
30 个插件之一弄崩了论坛?老规矩:禁用一半排查,再禁用一半,耗去一个晚上。现在插件二分查找功能替你搞定这一切。
记不清哪个页面有那个设置?我也记不清。后台搜索功能帮你定位。
插件列表能提供更多信息:可折叠的分类、健康度组件,以及每周检查——当依赖的包被维护者弃坑时,系统会提前预警,避免酿成事故。
后台任务不再黑盒。队列仪表盘支持失败任务管理,维护前可暂停和恢复队列,不用全靠祈祷。
数据库任你选。MySQL、MariaDB、PostgreSQL 或 SQLite,均获得正式支持。Flarum 还能检测驱动与服务器配置冲突,并提前校验数据库版本,避免后期出现神秘故障。
此外,高级维护模式应对封站需求,设置项支持一键重置,仪表盘公告管理,以及调试控制台——当你想直接向应用提问时,它就在那里。
🧑‍💻 如果你为 Flarum 开发 JSON:API 层已重构。资源、端点和字段的扩展能力远超旧版序列化器与控制器的组合。新的导出注册表让插件能规范参与打包。底层技术栈:PHP 8.3+、Laravel 13、Mithril 2.2、ES6 输出。
测试变得严谨。Eloquent 工厂、针对 N+1 查询报错的集成测试,以及最终 RC 版本引入的前端测试——这些测试能在独立的、通过 Composer 安装的插件中真实运行。文档吹了好几年的功能,以前却只能在这个 monorepo 内部使用。
还有大家一直期盼的扩展点:JS Notification 扩展器、Conditional 上的 whenExtensionDisabled、灵活的前端内容排序、自定义头像驱动、可复用的 Hero、用于模态框和下拉菜单的 CloseWatcher、带显示名称的 slug 驱动、遍布队列仪表盘的 hooks、让你的扩展数据展示在管理后台的 Statistics 扩展器,以及让扩展能往 Deck 添加自己列的 DeckColumns 扩展器。
📖 升级指南见 docs.flarum.org/extend/update-2_0,里面如实列出了所有破坏性变更。
🎁 两个扩展,现已属于所有人 多年来,论坛最想要的两个功能都是付费高级扩展。想要就得掏钱,还得指望它们能跟上核心的更新节奏。而在 2.0 中,这两个都免费、开源、官方出品:与核心同步维护,MIT 许可证,并与其他所有功能在同一个测试套件中测试。
⚡ Realtime 来龙去脉:Realtime 最初是 blomstra/realtime,一款付费高级扩展。2025 年 12 月,Daniël Klabbers(@luceos)将其捐赠给 Flarum 基金会,使其在 Flarum 2 中开源(flarum/framework4295)。把收费的东西无偿拿出来,让每个论坛都能用上,这意义重大,值得大声说出来:谢谢你,Daniël。
对你的意义:论坛从此“活”了起来。新讨论实时出现在列表里,回复实时出现在你正在阅读的帖子中,通知无需刷新就能送达。隐藏或删除帖子,所有无权查看的人会实时看到它消失。访客同样支持,且始终严格遵守权限规则。甚至还有“正在输入”提示,让你知道有人正在写回复。
对管理员:Realtime 需要在服务器上运行自己的 websocket 服务,因此你需要一个能保持进程持续运行、并能运行队列 worker 的环境(推荐 Redis)。这排除了大多数虚拟主机。如果你正好是这种情况,flarum/pusher 仍然可用。
🔎 Audit 来龙去脉:多年来,真正好用的审计日志只有 Clark Winkelmann 的 kilowhat Audit,很多人为此付了费。Flarum 基金会从 Clark 手中买下了 Audit 并将其开源。它现在是 flarum/audit,同时随 1.8.17 和 2.0 发布,因此不必等升级就能用上。如果你已经在用 kilowhat 审计日志,Flarum 会原地接管,历史记录完好无损。感谢 Clark 开发了它,并让它成为大家共同的财富。
对你意味着什么:这是一份完整的操作记录,详细记载了谁在何时执行了什么操作。包括登录记录、重命名、用户组和权限变更、设置调整、删除的帖子、锁定和置顶的讨论、审批、标记、账号冻结、扩展的启用与关闭、GDPR 数据擦除与导出,以及私聊内容,并明确标注了每笔操作的处理人。当版主询问“谁修改了这条内容”时,答案触手可及。你可以按操作者、动作类型、用户、讨论主题或 IP 地址进行筛选搜索。
给开发者:审计扩展(Audit extender)允许任意扩展记录自身的操作。现在,每个官方内置扩展都会注册自己的集成模块,若未安装 Audit 扩展,这些集成将不会执行任何动作。
🃏 还有一件事:Deck 2.0 版本新增了一款此前未出现在任何候选版本中的全新内置扩展:Deck。
这是什么:一个位于 /deck 的页面,你可以在并排的列中实时追踪所有关心的内容,这些列会自动刷新。你可以选择关注所有讨论、未读消息、通知、单个讨论、某位成员发起或发布的所有内容、特定小组的帖子,或是任何能输入到搜索栏的过滤条件,例如 tag:support is:unread。启用其他内置扩展后,你还能看到所关注的讨论、私信、标签,以及(针对版主)被标记的帖子。你可以拖动列来调整位置、改变大小、将其排列在最多两行中,并支持全屏显示。发现想持续关注的新讨论吗?点击“添加到 Deck”即可将其纳入列中。
适用人群:希望不频繁切换页面就能跟上繁忙论坛动态的成员,以及希望在同一屏幕上查看被标记帖子、支持标签和谁正在输入内容的管理人员。
给管理员:成员默认可以使用 Deck,通过“使用 Deck”权限控制其他用户的使用资格。你还能设置每位成员的最大列数(默认为 8)。启用实时扩展(Realtime)后,内容会实时更新;若未启用,列会每 60 秒检查一次新动态,因此在共享主机上也能正常运行。新安装的用户会自动获得该扩展,与其他内置扩展一同提供。对于升级的论坛,需运行 composer require flarum/deck 添加该扩展,然后在管理面板中启用它。
给开发者:DeckColumns 扩展器允许你的扩展添加自定义的列类型。Messages、Subscriptions、Tags 和 Flags 已经在使用该功能。
🗳️ 最后一公里 我曾表示,当社区达成共识时,候选版本将升级为 2.0.0,而最终决定权并非仅在我一人手中。是你们做出了这个决定。
这并非走过场。以下几乎是长达六个月的 Release Candidate 测试中发现的问题缩影。每一项都来自实际运行论坛的用户,而非我们内部测试:
🧱 一次升级因 Audit、FoF GeoIP、FoF Ban IPs 与审核扩展之间的循环依赖而中断。这对于一套完全普通的扩展集而言,是 1.x → 2.x 迁移过程中的一道硬性障碍。flarum/framework4978 💥 清除缓存可能导致下一位访客收到 500 错误。不是执行清除的管理员,而是紧随其后的访客,且日志中毫无踪迹,因为 PHP 内存致命错误并非异常。flarum/framework4990 📧 注销确认邮件中的链接显示为 flarumsafevalue…endflarumsafevalue。更深层的问题是:核心邮件功能原本从未应用任何标记注入防护。flarum/framework4988 🕳️ 某用户申请注销账户,中途取消,随后再次申请,第二次确认邮件被静默丢弃。用户将永远等不到那个链接。flarum/framework4989 👆 在 iPad 上每个 ⋮ 菜单都需要点击两次,因为触摸屏没有悬停状态,而 Safari 会模拟这一行为。flarum/framework4992 👯 “标签页闲置一段时间后回来,发现帖子重复了。” flarum/framework4993 📉 在 Debian 和 Ubuntu 上,flarum info 报告的网络内存限制数值偏低,而用户提问求助时粘贴的恰恰是这个数值。flarum/framework4991 🎯 并且在最后一个 Release Candidate 中:一个严格按照文档构建的自定义页面发生崩溃,原因是文档中标记为可选的属性被省略了。根源在于一个核心工具将 null 转换为空对象,只差一步渲染操作,任何添加条件项的扩展都可能随之崩溃。flarum/framework5000 reported by @rafaucau) 问题并未止步于 rc.8。此后又有 81 个拉取请求被合并。如果你一直在运行 Release Candidate,会注意到通知列表的无限滚动功能恢复正常,且邮件中的 Logo 显示也修好了:现在它会生成一个 PNG 副本,确保所有邮件客户端都能正常显示,你还可以单独上传邮件 Logo。此外,Font Awesome 包也变得更精简,能从你的 vendor 目录中移除约 23,000 个文件。
上述任何一个问题如果出现在 2.0.0 正式版中,都会让某些用户度过糟糕的下午。这正是 Release Candidate 存在的意义,且只有当人们实际运行它们时才有效。你们做到了。
🚀 升级 从 1.8.x 升级:在 composer.json 中把 flarum/core 设为 ^2.0,所有扩展设为 *,然后运行 composer update --prefer-dist --no-plugins --no-dev -a --with-all-dependencies,接着执行 php flarum migrate 和 php flarum cache:clear --force。完整步骤见 docs.flarum.org/update。
先备份。有条件的话在测试环境演练。务必留好回退方案。
⚠️ 请在命令行下操作。
不要通过扩展管理器升级。大版本升级会在升级运行过程中替换掉正在执行升级的代码,可能导致论坛处于半升级状态,难以恢复。 迁移请用 php flarum migrate 执行,而不要用浏览器里论坛显示的“更新”页面。1.x → 2.x 的升级包含大量迁移操作,在浏览器里可能中途触发超时或内存限制,而在命令行下能完整跑完,出问题时也会准确显示错误信息。 如果你没有 shell 权限,请联系主机商协助,或等拿到权限再操作。晚一点升级总比恢复一个坏掉的论坛强。
拖慢你升级进度的多半不是核心,而是扩展。每个扩展都需要发布兼容 2.0 的版本,只要有一个没跟上,整个升级就会被卡住。
👀 discuss.flarum.org 已经在运行你即将下载的这个版本了。夜间演示站也在跟进 2.x。
🧭 升级前先检查 FoF Upgrade Advisor 可以在你动手之前告诉你哪些扩展能跟着升级,并检查你的 PHP 和数据库版本是否满足 2.0 的要求:
composer require fof/upgrade-advisor:"*" 查看检查结果,处理掉它标记的问题,全部通过后卸载即可。✅
📜 自 rc.8 以来的所有变更见更新日志。
🙏 其他贡献者 Sami 和我只是 2.0 版本 41 位贡献者中的两个名字,而这份名单背后还有一长串人——没有他们,这一切都不会存在。
@davetodave178 强化了 CI,锁定了整个供应链,并让数据库迁移可以独立运行。@datlechin、@luceos、@YUCLing、@Karl、@datitisev、@ekumanov、@huoxin233、@GianniG、@rafaucau、@iPurpl3x、@ClaudiusH、@edgeinfinity1、@OrdinaryJellyfish、@drewmt、@n-peugnet、@szepeviktor、@grimur82、@forumaker、@zxbmmmmmmmmm、@zDaleZ、@blt950、@Darkle、@garygreen、@JamesShaver、@johannsa、@xHeaven、@rob006、@novacuum、@Krinkle、@TowyTowy、@ksvijayan06、@Abdooo2235、@imdong、@ernestdefoe,以及 Chisato Nishikigi 和 notanothervibecoder,他们的提交记录尚未关联到可识别的账户中。
不过,统计提交数量是最容易的事。自 1.0.0 发布以来,已有 223 人参与贡献,而对本版本影响最深的人,未必总是那个在提交代码的人。
💛 我们的支持者 无论是个人、商业还是机构:开发者之所以能继续开发,全仰赖你们。在任何人可以安装之前花三年时间构建软件,是一段漫长的旅程。你们的支持让开发者在迟迟没有新发布的阶段得以坚持,并告诉他们,这些工作是有意义的。开源靠的是人的时间投入,而你们让这种时间投入成为可能。
其中最大的支持者是 Glowing Blue。感谢你们。如果没有你们,Flarum 2.0 的模样会截然不同。
所有支持者都会在支持页面列出。感谢每一位。💙
🧩 插件开发者 Sami 打下了基础,我把它推进到了终点线。而你们是在基础上继续构建的人。论坛从来不只是核心部分:让每个社区独具特色的,是那几十个插件,而你们构建了这片生态,通常是无薪的,往往是在下班之后。随后,2.0 要求你们将所有插件移植到新的 API、新的前端和新的测试套件上。你们做到了,并且反馈了那些塑造 2.0 本身的 bug 报告、边缘案例以及“这个扩展器真帮大忙”的建议。新的扩展点之所以存在,就是因为你们提出了需求。
🧑‍🤝‍🧑 管理员和社区管理者 你们每天使用 Flarum,并诚实地告诉了我们哪里不好用。这个版本的很多功能之所以存在,就是因为你们清晰地描述了问题,让我们得以修复。
请继续反馈。把你们的想法、问题和改进建议带到 Proposals。那是你们每天看到的东西转化为下一个版本的地方,2.1 正在那里被塑造。
🌍 以及每一位: 🌐 把字符串翻译成我们谁都不会说的语言, 🛟 在支持渠道里第一百次回答同一个问题, 🐛 读懂了堆栈跟踪,并正经地把它写下来,而不是耸耸肩就接着走。 还有 Toby Zerner——他在 2014 年 12 月 20 日写下了第一行 Hello world!;以及每一位维护者,把 Flarum 一路带到今天。💙
🗓️ 接下来会怎样 2.0.0 不是终点,而是起点。
2.0.x 用来应对未来几周内真实世界抛来的问题。问题一定会有:一个正式稳定版发布一天所触达的论坛数量,比之前所有候选版的总和还多。告诉我们问题,我们会修。
2.1 留给下一个阶段,那个里程碑已经在填充内容了。
1.8.x 将只接受安全修复和关键 bug,不再有功能或改进。如果你暂时留在 1.x,这完全没问题,依然安全,但那边不会再有新东西了。从今天起,Flarum 活在 2.0 上。
🐛 报 bug → flarum/frameworkissues
💬 提问 → Support
🔒 安全 → [email protected],私聊发送 从 Hello world! 到 2.0.0,十一年九个月。谢谢你们一直都在,无论是上周才来,还是从最初 beta 就开始等。 现在,去升级你的论坛吧。 🚀

评论 (0)