rsync と cron を使用してバックアップを別のサーバーにコピー

バックアップサーバーがあり、多数のサーバー間でバックアップを調整しています。このバックアップサーバーが、フォーラムサーバーから Discourse のバックアップを取得したいと考えています。

バックアップサーバーがフォーラムサーバー上のバックアップファイルにアクセスできるようにする方法について検討しました。私が思いついた最善の方法は、Discourse のバックアップを所有する www-data ユーザーとしてリモートアクセスを許可することです。

標準的なシステム管理上の理由から、バックアップサーバーが root としてフォーラムサーバーにシェル接続できるようにしたくありませんでした。また、バックアップや復元中に Discourse がエラーを起こす可能性のある操作は避けたいと考えていました。さらに、フォーラムサーバー上で別のサービスをホストすることも避けたかったのです。

以下に、私が実現した方法を紹介します。

www-data ユーザーによるリモートアクセスの許可

  1. /etc/passwd を編集し、www-data のシェルを /usr/sbin/nologin から /bin/bash に変更します。
  2. /etc/passwd を再度編集し、www-data のホームディレクトリを /var/www から /home/www-data に変更します(任意ですが、私にとっては好ましい設定です)。
  3. バックアップサーバーの SSH 鍵を /home/www-data/.ssh/authorized_keys に追加します。

rsync

最後に、バックアップサーバー上で、以下のスクリプトを実行する毎時の cron コマンドを追加しました。

#!/usr/bin/env bash

set -xe

HOST="$1"
DIR="$2"
if [ -z "$HOST" ] || [ ! -d "$DIR" ]; then
	echo "$0 HOST DIR"
	exit 1
fi

# --ignore-existing は、すでにコピー済みのバックアップを rsync が無視するようにします。
# --delay-updates は、$DIR 内に完全なバックアップのみが到達することを保証します。
# これを指定しないと、部分的なバックアップが $DIR に入り込む可能性があります。
# また、--ignore-existing は等価チェックを行わないため、その問題が修正または検出されません。
rsync --ignore-existing --delay-updates "$HOST:/var/discourse/shared/standalone/backups/default/*" "$DIR"

この情報が誰かの役に立てば幸いです。

「いいね!」 8

すごい!!
初心者ユーザーの私でも間違いを犯さず(そして各ステップが何をしているのかを理解できるように)、以下の手順をもう少し詳しく説明していただけると、もっと感謝します。

これは何をするのですか?

ここで公開鍵のことを言っていますか?

「いいね!」 1

これにより、www-data ユーザーが正常にログインできるようになります。これは「ログインシェル」を変更するもので、さらに詳しく調べるための良いキーワードです。

はい。秘密鍵は(基本的に)ホストマシン以外の場所にコピーしたり共有したりすべきではありません。

「いいね!」 1

あなたは比較的新しいタイプの検索者なので、cronジョブを使用して、ローカルサーバーのバックアップをGoogle S3やiDrive S3などの異なるS3バケットに転送する簡単な方法も考えられますか?
(AWS S3バケットには、キーとシークレットを使用して直接設定できることはわかっています)。

S3バックアップを設定すると、自動的にS3にアップロードされますが、アップロードのすべてまたは none のいずれかになるため、S3にアップロードがない場合は、バックアップファイルにすべてのアップロードの複数のコピーがあります。

「いいね!」 2

それはすでに知っています。そして、6年前に始めたときから今まで、私はこのセットアップ(すべてのメディアとバックアップをAWSバケットにアップロードする)を使用してきました。

しかし、私は上記について、私が直面している別の種類の問題について尋ねていました。
現在、ローカルのUbuntuサーバーにバックアップ(メディア「アップロード」を含む)を作成するように設定しています。しかし、(別のスレッドで議論されているように)、それらの(1GBの大きな)バックアップから復元することができません。何かが欠けているか、問題が発生しています。そのため、Googleバケットを使用して、AWSを完全に廃止することを考えていました。

「いいね!」 1

AWS S3とGoogleのものは違いがわかりません。しかし、https://restic.net/ がお役に立つかもしれません。これはs3バケットにバックアップできるバックアッププログラムです。

復元の問題が何かわかりません。

「いいね!」 2

このトピックにたどり着いた方のために、この最初の投稿についてもう少し詳しく説明したいと思います。

  • これはbashスクリプトで、ファイル名を .sh 拡張子を持つものにすれば、そのままファイルに貼り付けることができます。
  • スクリプトの最初の行は、どのシェルや環境を使用するかなど、スクリプトを実行するための環境を設定します: #!/usr/bin/env bash: これは、env コマンドで見つかった bash インタープリターを使用するようにシステムに指示します。
  • フラグ (set -xe):
    • -x: デバッグを有効にします。これは、各コマンドとその引数が実行前にターミナルに出力されることを意味します。スクリプトのデバッグに役立ちます。
    • -e: コマンドがゼロ以外のステータス(エラーを示す)を返した場合、スクリプトは直ちに終了します。これは、スクリプトが失敗した後に続行するのを防ぐのに役立ちます。
  • 次の重要なステップ、変数 (HOST="$1" DIR="$2"):
    • HOST="$1": スクリプトに渡された最初の引数 ($1) を変数 HOST に代入します。つまり、このスクリプトが実行されると、ユーザーからの入力を要求し、ユーザーが入力した最初の入力($1)が「ホスト」値(おそらくデータがコピーされる場所)として渡されます/考慮されます。
    • DIR="$2": スクリプトに渡された2番目の引数 ($2) を変数 DIR に代入します。つまり、ユーザーが最初の値(「$2」と呼ばれる)を入力した後に(ディレクトリパスを)入力したものは何でも、スクリプトは「ターゲットディレクトリ」として取得します。
      興味のある方は残りの2つのステップも説明できますが、次のステップは、ユーザーがプロンプトで正しいホストとターゲットディレクトリの値を提供することを確認するだけで十分です。それ以外の場合(最後のステップ)は、エラー出力として 1 を返します。
      私が繰り返したい主なことは、これはスクリプトであり、実行されると、ホスト(データがコピーされる場所)とターゲットディレクトリ(データが貼り付けられる場所)をユーザーに要求することです。そして、cronジョブファイルに このファイルへのパス を含めると、cronファイルで設定した回数だけこのスクリプトファイルが実行される可能性があります。

しかし、私が理解できなかったのは、実際のコピー&ペースト(またはバックアップ)コマンドはどこにあるのかということです。
実際の同期はどのように行われるのでしょうか?

「いいね!」 1