Backup discourse from the command line

: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

このコマンドは、クラウドサーバーのターミナルで実行する必要がありますか、それともローカルマシンで実行する必要がありますか?
どちらで実行しても、「Permission denied」というエラーが発生します。

ローカルマシンで実行してください。

接続に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 ファイルをダウンロードして保存する隠し設定があります。

アップロード用の S3 互換オブジェクトストレージプロバイダーの設定 にあるように、yml ファイルで S3 を設定する必要があります。

その後、バックアップを復元すると、アップロードが新しいバケットにプッシュされます。

「いいね!」 1

この問題は解決しましたか?

Configure an S3 compatible object storage provider for uploadsに記載されているとおりに、環境変数でs3を設定する必要があります。

特に、新しいサーバーでs3の設定が異なる場合は、なおさらです。s3の値をデータベースに保存すると、多くの問題が発生する可能性があります。

しかし、リストアコマンドには、さまざまな部分の間で一時停止させるスイッチがあります。これは役立つ場合があります。

最終的に手に入るファイルが、フォーラムウェブサイトからバックアップしたものと同一であることを確認してもよろしいでしょうか?

私はいつもコマンドラインで再構築を行いますが、その前にウェブサイトを使ってバックアップを取っています。今回はバックアップを忘れました!両方ともコマンドラインで行うと解決するかもしれません :slight_smile: 幸運を祈ってください。

バックアップスクリプトは以下のように出力しました:

完了しました!
[SUCCESS]
バックアップが完了しました。
出力ファイルの場所: /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(Thor gem を使用して script/discourse 経由で実装されています)は、バックアップと復元サイト管理とモードデータベースユーティリティ、**データ移行(インポート/エクスポート)**の 4 つのカテゴリに分類された 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_restorediscourse disable_restore

  • 説明: コンソール/ウェブベースの復元タスクを許可または制限するアプリケーションフラグを切り替えます。
  • 使用手順:
discourse enable_restore
discourse restore <filename>
discourse disable_restore

discourse rollback

  • 説明: 失敗した復元実行前の時点にデータベーススキーマと状態をロールバックします。

2. サイト状態とクライアント制御

discourse enable_readonlydiscourse disable_readonly

  • 説明: Redis 内の READONLY_MODE_KEY を設定またはクリアします。
  • 詳細:
  • データベースへの書き込みを凍結しますが、ユーザーがサイトを閲覧できるようにします。
  • アクティブな間に更新される短い生存時間(TTL)ループを使用し、ターミナルセッションがクラッシュした場合でもサイトが永久にロックされないようにします。

discourse request_refresh

  • 説明: MessageBus を介してシステムメッセージを送信し、オンラインのすべてのウェブセッションにウェブページを再読み込みするよう指示します。アセットの更新やグローバルなテーマ変更をデプロイした後で有用です。

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...]

  • 説明: 1 つ以上のスペース区切りのトピック ID を受け取り、トピック、投稿、および関連するユーザーアカウントをエクスポートします。
  • 例:
discourse export_topics 102 105 210

discourse import_topics [FILE_PATH]

  • 説明: export_topics によって作成された JSON アーカイブを宛先の Discourse インスタンスにインポートします。
「いいね!」 1