从命令行备份Discourse

:bookmark: This guide covers how to back up and restore your Discourse site using command line tools, specifically designed for self-hosted environments.

:person_raising_hand: Required user level: Administrator

:information_source: You can use the below placeholders to automatically fill out the command line prompts in this guide:

Backing up

To create a backup of your Discourse site, follow these steps:

  1. Enter the container:
./launcher enter app
  1. Run the backup:
discourse backup
exit

This will print out the final filename of your backup. Download the backup and container configuration (if needed) to your local machine:

scp =USER=@=HOST=:/var/discourse/shared/standalone/backups/default/=FILENAME= .
scp =USER=@=HOST=:/var/discourse/containers/app.yml .

Restoring

To restore a Discourse backup, follow these steps:

  1. Install a Discourse site on the server you are restoring to.

If you’re testing this procedure multiple times, you can wipe the data on your test server.

Wipe Discourse data (optional)
./launcher stop app
./launcher destroy app
rm -r /var/discourse/shared/standalone/
mkdir -p /var/discourse/shared/standalone/backups/default/

  1. Upload the backup file:
scp =FILENAME= =USER=@=HOST=:/var/discourse/shared/standalone/backups/default/
  1. Enter the container and start the restore:
./launcher enter app
discourse enable_restore
discourse restore =FILENAME=

If you happen to forget what the filename was, run the “discourse restore” command by itself to get a list of available backup files.

:information_source: For a two-container setup, use ./launcher enter web_only and replace standalone with web-only in the path to backups.

For additional information about restoring Discourse backups, see Restore a backup from the command line.

Last edited by @SaraDev 2024-08-23T20:50:17Z

Check documentPerform check on document:
40 个赞

我应该在哪里运行此命令?在我的云服务器终端还是本地计算机上?
尽管两者都给了我“权限被拒绝”的错误

在您的本地计算机上。

您是否正在使用 SSH 密钥进行连接?错误与之相关。

然后命令应为:

scp -i /path_to_your_key/your_key.pem root@147.43.15.199:/var/discourse/shared/standalone/backups/default/discourse-2024-12-25-033740-v20241211222608.tar.gz .

我有一个场景,我想要将 Discourse 安装迁移到一个全新的服务器上。
我的计划是:

  1. 创建一个新的空白 Discourse 安装
  2. 备份旧的 Discourse,将备份 scp 到新服务器并恢复
  3. 将所有 S3(图片等)复制到另一个账户上的新 S3

恢复过程进行得很顺利,直到它开始查找 S3 并因没有访问权限而失败。我认为它正在尝试访问旧 Discourse 上的同一个 S3 存储桶名称,但新服务器上不存在该存储桶,我也无法创建它。

有什么推荐的解决方案吗?

我想过尝试更改旧 Discourse 上的 S3 存储桶名称(在执行备份之前),然后在恢复时,它将期望拥有新的 S3 存储桶。但我担心如果我只是将其切换到一个不存在的存储桶,旧 Discourse 会发生什么。

有一个隐藏设置可以将 s3 文件下载到备份中。

您需要在 yml 文件中配置 s3,如 为上传配置 S3 兼容对象存储提供商 中所述。

然后,当您恢复备份时,它会将上传推送到新存储桶。

1 个赞

你最终解决这个问题了吗?

您需要在环境变量中配置 s3,如为上传配置 S3 兼容对象存储提供商中所述。

如果新服务器上的 s3 设置不同,这一点尤其正确。将 s3 值放入数据库可能会导致许多问题。

但是,还原命令有一个开关,可以在各个部分之间暂停。这会有所帮助。

我能再确认一下吗?你最终得到的这个文件,是否和从论坛网站备份时得到的一样?

我通常都在命令行重新构建,但会先用网站进行备份。这次我忘了备份!我想如果两次都用命令行操作可能会对我有帮助 :slight_smile: 祝我好运吧。

备份脚本显示:

完成!
[成功]
备份已完成。
输出文件位于:/var/www/discourse/public/backups/default/FILENAME.tar.gz

起初我尝试下载该路径下的文件,但发现路径有误。后来我在其他位置找到了该文件,这才注意到本主题中的命令是正确的…

你好!我想特别指出,如果只想备份而不上传,请使用以下命令:

discourse backup --sql-only

1 个赞

提得好——我们应该把这个(以及另外几个小贴士)加到原帖里。

2 个赞

@supermathie !很高兴“见”到你。不知道你还记不记得我?之前曾和你做过面试。

另外,如果在执行 discourse backup 之后,--help 参数能正常工作就好了。否则,备份文件最终会被命名为“–helpXXX”。:lolsob:

干杯!

借助一些 AI 的帮助,以下是 discourse 命令的子命令综合列表。
discourse CLI(通过 script/discourse 使用 Thor gem 实现)提供了 13 个核心子命令,分为 备份与恢复站点管理与模式数据库工具数据迁移(导入/导出) 四类。


命令快速参考

类别 子命令 主要功能
备份与恢复 backup 生成完整或仅数据库的备份归档。
restore .tar.gz 备份文件恢复到实例中。
enable_restore 授予执行恢复命令的权限。
disable_restore 撤销执行恢复的权限。
rollback 在恢复失败后回滚数据库状态。
站点模式 enable_readonly 在整个站点切换临时只读模式。
disable_readonly 移除只读模式以恢复正常的站点写入。
request_refresh 向所有已连接的活跃客户端触发浏览器刷新提示。
数据库操作 remap 在数据库表中执行全局文本查找和替换。
数据迁移 export_category 导出单个分类、其主题及相关用户。
import_category 将分类归档导入当前论坛。
export_topics 按 ID 导出特定主题及其作者/回复者账户。
import_topics 将主题归档导入当前论坛。

子命令详细文档

1. 备份与恢复命令

discourse backup [FILENAME]

  • 描述: 创建论坛数据库和资产的完整备份。

  • 标志:

  • --sql-only:(布尔值,默认:false)仅转储 PostgreSQL 数据库,跳过本地上传的文件。

  • --s3-uploads:(布尔值,默认:false)强制将存储在 S3 中的资产包含在备份归档中(设置 --sql-only 时忽略)。

  • 示例:

discourse backup
discourse backup --sql-only

discourse restore [FILENAME]

  • 描述: 从位于 /var/www/discourse/public/backups/default 的本地 .tar.gz 归档中恢复论坛备份。
  • 先决条件: 需要先运行 discourse enable_restore
  • 示例:
discourse restore discourse-2026-07-22-120000-v2026xxxx.tar.gz

discourse enable_restore & discourse disable_restore

  • 描述: 切换允许或限制控制台/基于 Web 的恢复任务的应用程序标志。
  • 使用顺序:
discourse enable_restore
discourse restore <filename>
discourse disable_restore

discourse rollback

  • 描述: 将数据库模式和状态回滚到恢复执行失败之前的点。

2. 站点状态与客户端控制

discourse enable_readonly & discourse disable_readonly

  • 描述: 在 Redis 中设置或清除 READONLY_MODE_KEY
  • 详情:
  • 冻结数据库写入,同时保持站点可供用户读取。
  • 使用在激活时刷新的短生存时间 (TTL) 循环,防止终端会话崩溃时站点永久锁定。

discourse request_refresh

  • 描述: 通过 MessageBus 分派系统消息,指示所有在线 Web 会话重新加载网页。在部署资产更新或全局主题更改后非常有用。

3. 数据库重映射

discourse remap [OPTIONS] FROM TO

  • 描述: 在数据库的文本列中执行直接的字符串查找和替换。在更新域名、CDN 路径或图像上传前缀时至关重要。

  • 标志:

  • --global:(布尔值)扫描并重映射所有表,而不仅仅是标准内容表。

  • --regex:(布尔值)将 FROM 参数评估为正则表达式,而不是字面字符串。

  • 示例:

discourse remap "old-domain.com" "new-domain.com"
discourse remap --global "/uploads/default/" "/cdn-uploads/"

4. 选择性数据导入与导出

discourse export_category [CATEGORY_ID]

  • 描述: 将单个分类(包括所有嵌套主题、帖子和参与用户配置文件)序列化为 JSON 归档文件。

discourse import_category [FILE_PATH]

  • 描述: 读取由 export_category 创建的归档,并将分类数据合并到目标实例中。

discourse export_topics [TOPIC_IDS...]

  • 描述: 接受一个或多个空格分隔的主题 ID,并导出主题、帖子和相关用户账户。
  • 示例:
discourse export_topics 102 105 210

discourse import_topics [FILE_PATH]

  • 描述: 将由 export_topics 创建的 JSON 归档导入到目标 Discourse 实例中。
1 个赞