前書き
Duplicityは、Pythonで記述されたコマンドラインユーティリティであり、ローカルまたはリモートリポジトリに保存するための暗号化されたtarボリュームを生成します。 GNU Privacy Guard (GPG)を使用してアーカイブを暗号化および署名し、rsyncアルゴリズムを使用して増分でスペース効率の高いバックアップを作成します。 バックアップは、ローカルファイルストレージ、SFTPまたはFTPサーバー、S3互換オブジェクトストアなど、さまざまなリポジトリに送信できます。
このチュートリアルでは、Duplicityをインストールし、プロジェクトデータをS3互換オブジェクトストレージサービスであるDigitalOcean Spacesにバックアップする方法について説明します。 この目的のためにSpacesリポジトリを作成し、データを手動でバックアップする方法について説明します。 最後に、増分および毎週の完全バックアップスケジュールを設定するスクリプトを作成して、このプロセスを自動化します。
前提条件
このチュートリアルでは、次のものが必要です。
-
Initial Server Setup with Ubuntu 16.04 tutorialに従ってセットアップされた1つのUbuntu16.04サーバー。 このチュートリアルを実行した後、ルート以外のsudoユーザーが必要になります。
-
How To Create a DigitalOcean Space and API Keyに従って作成されたDigitalOceanスペースおよびAPIキー。 スペースの次の資格情報を必ずメモしてください。
-
アクセスキー
-
秘密鍵
-
スペースURL
-
バケット名
-
Spaceをセットアップし、この情報を入手したら、Duplicityのインストールに進むことができます。
Duplicityのインストール
Duplicityの最新バージョンを入手するには、Duplicity releases Personal Package Archive (PPA)からインストールします。
sudo apt-add-repository ppa:duplicity-team/ppa
また、python-boto
パッケージをインストールして、Amazon Web Servicesへのインターフェイスを提供するPythonパッケージであるBotoにアクセスできるようにします。 これにより、SpacesのAWS S3 APIとの相互運用性を活用できます。 このバージョンは、Ubuntuサーバーイメージに付属しているPythonのバージョンと互換性があるため、公式のUbuntuリポジトリからpython-boto
をインストールします。 Boto3を使用したい場合は、ソースからインストールできますが、Python3.3以降との機能の互換性はまだ開発中です。
python-boto
に加えて、Havegedもインストールします。これは、GPGキーの作成に必要なentropyの生成に役立つツールです。 これらのキーを作成するために、GPGはシステムのエントロピーまたは予測不可能性のレベルを利用します。 haveged
をインストールすると、キー作成プロセスをスピードアップできます。
これらのパッケージをインストールする前に、ローカルリポジトリインデックスを更新します。
sudo apt-get update
次に、次のように入力して、duplicity
、python-boto
、およびhaveged
をインストールします。
sudo apt-get install duplicity haveged python-boto
インストールの確認を求められたら、y
を押します。 これでシステムにDuplicityがインストールされ、プロジェクトフォルダーと構成ファイルを作成する準備が整いました。
バックアップディレクトリの作成
バックアッププロセスの仕組みを示すために、非ルートユーザーのホームディレクトリにバックアップ用のディレクトリとサンプルデータを作成します。 ディレクトリをsammy_backups
と呼びます。
mkdir ~/sammy_backups
次に、historical_sharks.txt
というサンプルプロジェクトファイルを作成します。
echo "The ancient Megalodon shark reached lengths of up to 59 feet, and is widely regarded as one of history's most fearsome predators." >> ~/sammy_backups/historical_sharks.txt
バックアップディレクトリとテストデータを配置したら、非ルートユーザー用のGPGキーを生成する準備ができました。
GPGキーの生成
次に、ユーザーのGPGキーペアを生成します。 情報の安全な送信を確保するために、GPGは公開キー暗号化を使用します。 これが私たちの文脈で意味することは、データが公開鍵に暗号化され、リポジトリに送信されるということです。 GPGキーと暗号化の詳細については、How To Use GPG to Sign and Encrypt Messagesに関するチュートリアルを参照してください。
キーリングは、ユーザーアカウントの~/.gnupg
というディレクトリに保存されます。このディレクトリは、キーの生成時に作成されます。 duplicity
コマンドを使用する場合、キーペアを指す公開キー識別子を指定します。 この識別子を使用すると、データの暗号化と秘密鍵の所有権を検証する署名が有効になります。 暗号化されたデータはレポジトリに送信されます。レポジトリでは、ファイル自体からファイルサイズやアップロード時間よりもはるかに多くを推測することは困難です。 これによりデータが保護され、ユーザーは秘密キーを使用していつでも完全に復元できます。
GPGはデフォルトでサーバーにインストールする必要があります。 これをテストするには、次を入力します。
gpg --version
GPGがインストールされていることを確認したら、次のようにキーペアを生成できます。
gpg --gen-key
キーを構成するための一連の質問が表示されます。
-
キーのタイプ。 (1) RSA and RSA (default)を選択します。
-
キーのサイズ。
ENTER
を押すと、2048ビットのデフォルトサイズが確認されます。 -
キーの有効期限。 1yと入力すると、1年後に有効期限が切れるキーが作成されます。
-
選択を確認します。 これを行うには、yと入力します。
-
ユーザーID /実名。 your nameと入力します。
-
電子メールアドレス。 your email addressと入力します。
-
コメント。 ここでは、署名とともに表示されるoptional commentを入力できます。
-
(N)ame、©omment、(E)mail、または(O)kay /(Q)uit? 続行する準備ができたら、Oと入力します。
-
パスフレーズを入力します。 ここにpassphraseを入力するように求められます。 Be sure to take note of this passphrase。 このチュートリアルの残りの部分では、
your-GPG-key-passphrase
として参照します。
これらの設定を作成した後、gpg
はシステムのエントロピーのレベルに基づいてキーを生成します。 haveged
をインストールしたので、キーは非常に迅速に、またはすぐに生成されるはずです。 次を含む出力が表示されます。
Output...
gpg: /home/sammy/.gnupg/trustdb.gpg: trustdb created
gpg: key your-GPG-public-key-id marked as ultimately trusted
public and secret key created and signed.
...
次のセクションでローカル環境変数を構成するために使用するので、your-GPG-public-key-id
に注意してください。
手動バックアップの作成
ここで、環境変数を設定して、duplicity
コマンドの実行中にコマンドラインに機密情報を入力する必要がないようにします。 これらの変数は、現在のセッション中にユーザーが使用できるようになり、後で使用できるように非表示のディレクトリに保存します。 duplicity
が必要とする変数(環境変数として定義します)には、Spaces Access KeyとSecret、およびGPG公開鍵IDとパスフレーズが含まれます。
まず、設定ファイルを保存するユーザーのホームディレクトリに隠しディレクトリを作成します。
mkdir ~/.duplicity
次に、.env_variables.conf
というファイルを作成して変数を定義します。これは、export
ステートメントを使用して行います。 これらのステートメントは、後で使用するためにプログラムで変数を使用できるようにします。 次を入力してファイルを開きます。
nano ~/.duplicity/.env_variables.conf
ファイル内で、スペースアクセスキーとシークレット、およびGPG公開キーIDとパスフレーズを設定します。
~/.duplicity/.env_variables.conf
export AWS_ACCESS_KEY_ID="your-access-key"
export AWS_SECRET_ACCESS_KEY="your-secret-key"
export GPG_KEY="your-GPG-public-key-id"
export PASSPHRASE="your-GPG-key-passphrase"
完了したら、ファイルを保存して閉じます。
これで、ファイルにパーミッションを設定して、現在の非rootユーザーのみが読み取りおよび書き込みアクセスできるようにできます。
chmod 0600 ~/.duplicity/.env_variables.conf
次のように入力して、これらの変数を現在のBashセッションで使用できるようにします。
source ~/.duplicity/.env_variables.conf
次に、duplicity
を実行して、~/sammy_backups
ディレクトリの手動の完全バックアップを作成します。 full
アクションなしでduplicity
を実行すると、最初の完全バックアップが作成され、その後に増分バックアップが作成されます。 コマンドの最初の使用時に完全バックアップを作成しますが、このディレクトリの別の完全手動バックアップを作成する場合は、full
アクションを指定する必要があります。
コマンドで定義するその他のオプションは次のとおりです。
-
--verbosity
:これは、出力に必要な情報のレベルを指定します。info
を指定します。これにより、デフォルトのnotice
設定よりも詳細が提供されます。 -
--encrypt-sign-key
:これは、GPG_KEY
変数のyour-GPG-public-key-id
で識別したペアの公開鍵に暗号化するようにduplicity
に指示します。 また、同じ識別子を使用して署名機能を有効にするようにduplicity
に指示します。 -
--log-file
:このオプションは、他のプログラムでも使用できるログファイルの場所を指定します。 これにより、トラブルシューティングが必要な場合に簡単に確認できます。 ログファイルの場所を/home/sammy/.duplicity/info.log
として指定します。
最後に、バックアップするディレクトリとリポジトリエンドポイントを指定します。 ユーザーのホームディレクトリにある~/sammy_backups
ディレクトリをバックアップします。 リポジトリはスペースになり、次の情報を使用して定義します:s3://spaces_endpoint/bucket_name/
。 エンドポイントとバケット名は次のように決定できます。スペースのURLがhttps://sammys-bucket.nyc3.digitaloceanspaces.com
の場合、sammys-bucket
がバケット名、nyc3.digitaloceanspaces.com
がエンドポイントです。
duplicity
コマンドは、最終的に次のようになります。
duplicity --verbosity info --encrypt-sign-key=$GPG_KEY --log-file /home/sammy/.duplicity/info.log /home/sammy/sammy_backups \
s3://nyc3.digitaloceanspaces.com/sammys-bucket/
このコマンドを実行すると、次のような出力が表示されます。
Output...
--------------[ Backup Statistics ]--------------
StartTime 1522417021.39 (Fri Mar 30 13:37:01 2018)
EndTime 1522417021.40 (Fri Mar 30 13:37:01 2018)
ElapsedTime 0.01 (0.01 seconds)
SourceFiles 2
SourceFileSize 4226 (4.13 KB)
NewFiles 2
NewFileSize 4226 (4.13 KB)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 2
RawDeltaSize 130 (130 bytes)
TotalDestinationSizeChange 955 (955 bytes)
Errors 0
-------------------------------------------------
意図したとおりにスペースにアップロードされたファイルを確認するには、Spaces page in the DigitalOcean control panelに移動して、ファイルがそこにあることを確認します。
ファイルの復元
データを復元できることをテストするために、サンプルファイルを削除してリポジトリから復元します。 Duplicityでファイルを復元するには、--file-to-restore
オプションを使用できます。 また、duplicity
コマンドの項目の順序を逆にする必要があります。リポジトリのURLが起点として機能し、バックアップディレクトリが復元されたファイルの宛先になります。
次のように入力してファイルを削除します。
rm ~/sammy_backups/historical_sharks.txt
ファイルが削除されたことを確認してください:
cat ~/sammy_backups/historical_sharks.txt
次のような出力が表示されるはずです。
Outputcat: /home/sammy/sammy_backups/historical_sharks.txt: No such file or directory
次に、このファイルをスペースから復元しましょう。 --file-to-restore
オプションを使用すると、復元するファイルのパスを指定できます。 このパスは、バックアップしたディレクトリからの相対パスである必要があります。この場合、相対パスはhistorical_sharks.txt
になります。 また、スペースURLとバックアップディレクトリの順序を逆にして、リポジトリからファイルを復元していることを示します。
duplicity --verbosity info --encrypt-sign-key=$GPG_KEY --log-file /home/sammy/.duplicity/info.log --file-to-restore historical_sharks.txt \
s3://nyc3.digitaloceanspaces.com/sammys-bucket /home/sammy/sammy_backups/historical_sharks.txt
次のような出力が表示されます。
Output...
Processing local manifest /home/sammy/.cache/duplicity/d9911d387bb9ee345a171141106ab714/duplicity-full.20180402T170008Z.manifest (195)
Found 1 volumes in manifest
Deleting /tmp/duplicity-e66MEL-tempdir/mktemp-_A24DP-6
Processed volume 1 of 1
cat
を再度実行すると、復元されたhistorical_sharks.txt
ファイルの内容が出力されます。
cat ~/sammy_backups/historical_sharks.txt
OutputThe ancient Megalodon shark reached lengths of up to 59 feet, and is widely regarded as one of history's most fearsome predators.
~/sammy_backups
ディレクトリの手動バックアップを作成し、リポジトリからデータを復元したので、バックアッププロセスの自動化に進む準備ができました。
バックアップの自動化
バックアッププロセスを自動化すると、~/sammy_backups
ディレクトリ内のデータを確実に回復可能で最新の状態に保つことができます。 cron
ジョブスケジューラを使用して、毎週の完全バックアップとそれ以外の増分バックアップを含むバックアップスケジュールを作成できます。 cron
を使用してタスクをスケジュールする方法の詳細については、How To Schedule Routine Tasks With Cron and Anacron on a VPSに関するチュートリアルを確認してください。
まず、~/.duplicity
ディレクトリにバックアップスクリプトを作成しましょう。
nano ~/.duplicity/.backup.sh
このファイル内で、最初にこのスクリプトがBashシェルによって実行されるように指定します。
~/.duplicity/.backup.sh
#!/bin/bash
次に、source
およびduplicity
コマンドで使用するHOME
変数を作成します。 強調表示されているユーザー名、バックアップディレクトリ、およびバケット名を必ず情報に置き換えてください。
~/.duplicity/.backup.sh
...
HOME="/home/sammy"
source "$HOME/.duplicity/.env_variables.conf"
duplicity \
--verbosity info \
--encrypt-sign-key="$GPG_KEY" \
--full-if-older-than 7D \
--log-file "$HOME/.duplicity/info.log" \
/home/sammy/sammy_backups \
s3://nyc3.digitaloceanspaces.com/sammys-bucket/
source
およびduplicity
コマンドは、手動バックアップを作成したときと同じ作業をここで実行します。source
は環境変数を現在のコンテキストにロードし、duplicity
は暗号化を作成しますリポジトリに送信するtarボリューム。 --full-if-older-than
オプションが追加されていることを除いて、すべてのオプションは同じままです。 7D
に設定すると、このオプションは、最後の完全バックアップが7日より古い場合に、毎週完全バックアップが実行されることを指定します。
スクリプトの最後の要素は、セキュリティ対策として環境変数を削除するunset
コマンドです。
~/.duplicity/.backup.sh
...
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset GPG_KEY
unset PASSPHRASE
完全なスクリプトは次のようになります。
~/.duplicity/.backup.sh
#!/bin/bash
HOME="/home/sammy"
source "$HOME/.duplicity/.env_variables.conf"
duplicity \
--verbosity info \
--encrypt-sign-key="$GPG_KEY" \
--full-if-older-than 7D \
--log-file "$HOME/.duplicity/info.log" \
/home/sammy/sammy_backups \
s3://nyc3.digitaloceanspaces.com/sammys-bucket/
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset GPG_KEY
unset PASSPHRASE
スクリプトに満足したら、ファイルを保存して閉じることができます。 また、現在の非sudoユーザーのみがファイルの読み取り、書き込み、実行を行えるようにアクセス許可を設定します。
chmod 0700 ~/.duplicity/.backup.sh
最後に、ユーザーのcrontab
ファイルを編集することで、バックアップスケジュールを自動化できます。 次のように入力して、このファイルを編集用に開きます。
crontab -e
このファイルを編集するのは今回が初めてなので、エディターを選択するよう求められます。
crontab
no crontab for root - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/ed
2. /bin/nano <---- easiest
3. /usr/bin/vim.basic
4. /usr/bin/vim.tiny
Choose 1-4 [2]:
...
nanoの場合は2
を選択するか、選択したエディターに対応する番号を入力できます。
ファイルの最後に、スクリプトを実行する頻度を指定する行を追加します。 その機能をテストするために、次のように時間間隔を2分に設定できます。
crontab
...
*/2 * * * * /home/sammy/.duplicity/.backup.sh
ファイルを保存して閉じます。 2分後、Spaces page in the DigitalOcean control panelに移動できます。ここで、増分バックアップファイルが表示されます。 crontab
ファイルを変更して、増分バックアップに使用する時間間隔を指定できるようになりました。
結論
このチュートリアルでは、特定のディレクトリの内容をSpacesリポジトリにバックアップする方法について説明しました。 構成ファイルを使用してリポジトリ情報を保存し、データの手動バックアップを作成しました。サンプルファイルを復元してテストし、自動バックアップスケジュールを作成しました。
重複の詳細については、project websiteとduplicity
man pageを確認できます。 このドキュメントでは、Duplicityの多くの機能について説明し、システム全体のバックアップの作成に関するガイダンスを提供します。