本指南介绍了 Discourse 中可用的各种只读模式,如何启用和禁用它们,以及您可能希望使用每种模式的场景。
所需用户级别:管理员
在 Discourse 上管理一个充满活力的在线社区时,管理员偶尔需要暂时限制用户活动。这些情况可能包括执行服务器维护、协助备份或迁移服务器。在此期间,至关重要的是在不完全关闭用户访问权限的情况下限制论坛活动。
Discourse 提供了多种只读模式,管理员可以启用这些模式来暂时冻结网站内的不同类型的交互。
本指南将探讨这些模式,重点介绍如何启用和禁用它们,包括处理某些模式相互交叉的情况。
理解只读模式
Discourse 支持两种不同级别的只读模式,以满足各种管理需求。它们是:
- 完全只读模式 (Full Read-Only Mode)
- 限制论坛中的所有写入操作,防止任何用户创建或修改内容,例如发帖、评论或点赞。
- 允许论坛基本上保持“冻结”在当前状态,使用户仍能阅读和浏览现有内容,而不会影响数据库。
- 禁止更改任何管理员站点设置或站点自定义,以保留数据库的当前状态。
- 禁止普通用户进行新的论坛登录。管理员仍可以使用管理员邮箱登录流程 (
/u/admin-login) 登录。
- 仅工作人员可写模式 (Staff Writes Only-Mode)
- 限制普通用户在论坛中进行写入操作,例如发帖、评论或点赞。普通用户仅限于只读操作,但仍可登录其账户。
- 允许管理员和版主活动正常进行。管理员可以更改站点设置,工作人员用户可以执行写入操作,如发帖、点赞或修改个人资料。
这些模式确保了在关键管理期间灵活管理论坛的可操作性。
如何启用/禁用只读模式
管理员应仔细管理不同只读模式之间的切换。在启用任何只读模式之前,请确保已禁用之前激活的任何模式。
完全只读模式
通过 Rails 控制台
如果您有权访问 Discourse 安装,请在通过 ./launcher enter app 进入 Docker 容器并使用 rails c 进入 Rails 控制台后,使用 Discourse Rails 命令行界面执行以下命令:
Discourse.enable_readonly_mode(Discourse::USER_READONLY_MODE_KEY)
通过管理面板
如果您可以通过 Web 界面访问管理权限,可以导航到 Admin > Backups > Enable Read-Only Mode 来启用只读模式。
要禁用只读模式,请执行以下 Rails 命令:
Discourse.disable_readonly_mode(Discourse::USER_READONLY_MODE_KEY)
或者,使用管理面板,导航到 Admin > Backups > Disable Read-Only Mode。
仅工作人员可写模式
仅工作人员可写模式只能通过 Discourse Rails 控制台启用/禁用。如果您的网站由 Discourse 托管,并且您希望启用或禁用此模式,请联系 team@discourse.org。
要启用仅工作人员可写模式,请使用以下 Rails 控制台命令:
Discourse.enable_readonly_mode(Discourse::STAFF_WRITES_ONLY_MODE_KEY)
要禁用:
Discourse.disable_readonly_mode(Discourse::STAFF_WRITES_ONLY_MODE_KEY)
最佳实践
- 及时沟通:提前通知社区计划的只读时间段,以设定合理的期望。
- 测试:在关键操作期间实施这些模式之前,请在低流量时段进行测试,以了解其影响。
- 文档记录:详细记录启用或禁用每种模式的时间和原因,以协助未来的运营规划。
常见问题解答 (FAQs)
-
启用/禁用只读模式需要多长时间?
- 更改是立即生效的。但是,用户体验可能会根据过渡期间的操作略有不同。
-
救命!由于只读模式我被锁在站点之外了——我该如何再次访问我的站点?
-
我注意到 discourse/lib/discourse.rb 中列出了其他
READ-ONLY模式,这些模式的作用是什么?READONLY_MODE_KEY主要用于备份和恢复过程,并由应用程序本身触发。此模式也可以通过 Discourse 命令行界面使用discourse enable_readonly和discourse disable_readonly启用或禁用。但是,此键在容器重启后不会保留。USER_READONLY_MODE_KEY用于管理员在管理界面中点击只读按钮时。此键的特殊之处在于,我们不会将其设置为过期键,因为用户启用的只读模式需要在容器重启后继续有效。其他键设置了 TTL(READONLY_MODE_KEY为 60 秒,PG_READONLY_MODE_KEY为 300 秒),并且我们有一个线程每 30 秒延长一次过期时间,以确保应用程序永远不会卡在只读模式中。PG_READONLY_MODE_KEY和PG_FORCE_READONLY_MODE_KEY用于 PG 故障转移。前者被设置为过期键,而后者是非过期的。

