VPSプロバイダーとしてDigitalOceanを使用しています。暗号化されたバックアップの重複を設定する方法については チュートリアル がありますが、データベースのバックアップやGoogleドライブのエンドポイントについては説明していません。
DuplicityとGoogleドライブに関する他のチュートリアルをオンラインでいくつか見つけましたが、それらはすべて不完全であるか、古くなっているようです。
必要なすべての情報をまとめるのに12時間強かかりましたが、そのプロセスは次のとおりです。
既存のものを選択するか、バックアップを保存する新しいGoogleアカウントを作成します。私は別のアカウントを持っているのが好きなので、ビジネスのバックアップデータが個人のGoogleアカウントのものと混同されません。
Googleアカウント名を<google_account_name>
と呼びます。
これを行うには、データベースダンプ用の特別なディレクトリを作成し、mysqldump
コマンドを使用します。
私のUbuntuのディストリビューションには、backup
ユーザーとグループおよびvar/backups
ディレクトリが付属していたので、 なぜそれらを使用しないのですか ?
グループをbackup
の所有者にする/var/backups
:
Sudo chgrp backup /var/backups
このディレクトリに対するbackup
グループの読み取りおよび書き込み権限を付与します:
Sudo chmod g+rw /var/backups
自分のアカウントをbackup
グループに追加します:
Sudo usermod -aG backup <username>
これにより、バックアップディレクトリの内容に簡単にアクセスできるようになります。
新しいグループメンバーシップを有効にするには、ログアウトしてから再度ログインする必要がある場合があります。グループメンバーシップを確認するには、コマンドgroups
を使用します。
コマンドラインからMySQLにログインします:
mysql -u root -p
新しいデータベースユーザーアカウントを作成します
絶対に必要な以上の権限を与える によって自分自身を脆弱にしたくありません。したがって、読み取り専用権限を持つ新しいデータベースユーザーアカウントを作成します。一貫性を保つために、私はこのユーザーをbackup
と呼んでいます。 <db_password>
には非常に強力なパスワードを選択してください。
CREATE USER 'backup'@'localhost' IDENTIFIED BY '<db_password>'
読み取り専用特権を付与する:
GRANT SELECT,EVENT,TRIGGER,SHOW DATABASES ON *.* TO 'backup'@'localhost';
ダンプコマンドをテストします(<db_password>
を新しいMySQLユーザー用に以前に設定したパスワードに置き換えます)。
mysqldump --single-transaction --routines --events --triggers --add-drop-table --extended-insert -u backup -h 127.0.0.1 -p<db_password> --all-databases | gzip -9 > /var/backups/sql/all_$(date +"%Y_week_%U").sql.gz
このコマンドは、年と現在の週番号のラベルが付いた単一のファイルにすべてのデータベースをダンプします。これを実行するたびに、現在のダンプファイルが更新されます。ただし、新しい週が始まると、代わりに新しいファイルが作成されます。したがって、データベースの毎週のスナップショットの履歴を維持します。 日付部分 を調整して、データベースのサイズとこれらのスナップショットに寄付するスペースに応じて、これらのスナップショットの頻度を増減できます。
Duplicityの最新バージョンを使用するには、次のライブラリの最新バージョンが必要です。
popt
libbz2
librsync
次のコマンドを実行します。
Sudo apt-get install libpopt-dev libpopt0
Sudo apt-get install libbz2-dev
cd ~
wget https://github.com/librsync/librsync/archive/v2.0.0.tar.gz
tar xzvf v2.0.0.tar.gz -C librsync
cd librsync
Sudo cmake .
Sudo make all check
Sudo make && Sudo make install
2016年10月6日現在の現在の安定バージョンは0.7.10です。
cd ~
wget https://code.launchpad.net/duplicity/0.7-series/0.7.10/+download/duplicity-0.7.10.tar.gz
tar xzvf duplicity*
cd duplicity*
Sudo python setup.py install
LD_LIBRARY_PATH
の定義を設定します( buntuで$ LD_LIBRARY_PATHを設定する方法? を参照):
Duplicityは、以前にインストールされたlibrsync
共有ライブラリオブジェクトを見つけることができるように、この環境変数を必要とします。
Sudo nano /etc/ld.so.conf.d/librsync.so.2.conf
librsync.so.2.conf:
/usr/local/lib
ここで、Ubuntuのldconfigキャッシュをリロードする必要があります。
Sudo ldconfig
これは、DuplicityとGoogle DriveAPIの間のOAuth2ネゴシエーションを処理するライブラリです。
pip install pydrive
これは、Googleの 開発者コンソール を介して行います。見る:
PyDrive このファイルを使用してGoogle APIの認証情報と構成設定を保存します 。
nano /home/<username>/.duplicity/credentials
client_config_backend: settings
client_config:
client_id: <your client ID>.apps.googleusercontent.com
client_secret: <your client secret>
save_credentials: True
save_credentials_backend: file
save_credentials_file: /home/<username>/.duplicity/gdrive.cache
get_refresh_token: True
GOOGLE_DRIVE_SETTINGS
環境変数を設定します。export GOOGLE_DRIVE_SETTINGS=/home/<username>/.duplicity/credentials
また、GOOGLE_DRIVE_SETTINGS
を Sudo環境変数 に追加することをお勧めします。
Sudo visudo
最後に次の行を追加します。
Defaults env_keep += "GOOGLE_DRIVE_SETTINGS"
Duplicityを使用してGoogleドライブに正常に転送できることを確認するために、いくつかのテストファイルを作成します。
cd ~
mkdir test
touch test/file{1..100}
duplicity ~/test gdocs://<google_account_name>@gmail.com/backup
作成された確認リンクをたどり、受け取った確認コードをコピーしてプロンプトに貼り付けます。重複should作成した認証トークンを/home/<username>/.duplicity/gdrive.cache
に保存して、検証手順を再度実行する必要がないようにします(したがって、システムは入力なしで毎晩自動的にこれを実行できます)。
バックアップデータをGoogleドライブに送信する前に暗号化するには、 [〜#〜] gpg [〜#〜] のキーが必要です。キーを生成するには、次のコマンドを実行するだけです。
gpg --gen-key
提供されている指示に従い、適切なパスフレーズを選択してください。 「エントロピーが不十分です」というメッセージが表示されない場合は、Sudo apt-get install rng-tools
を実行してみてください。インストール自体は、GPGが真にランダムなキーを生成できるように十分なエントロピーを生成する必要があります。 https://stackoverflow.com/a/12716881/2970321 を参照してください。
これが完了すると、GPGの「指紋」が表示されます。このフィンガープリントからプライマリ公開鍵IDが必要になります。これは、pub
で始まる行の/
の後の8桁の16進コードです。 https://security.stackexchange.com/a/110146/74909 を参照してください。
Sudo nano /root/.passphrase
Sudo chmod 700 /root/.passphrase
。パスフレーズ:
PASSPHRASE="my passphrase"
GPGキーを紛失すると、暗号化されたバックアップは役に立たなくなります。したがって、GPGキーをVPS以外の場所にバックアップする必要があります。
たとえば、ローカルマシンにバックアップするには:
gpg --list-keys
gpg -ao ~/gpg-public.key --export <gpg_public_key_id>
gpg --list-secret-keys
gpg -ao ~/gpg-private.key --export-secret-keys <gpg_private_key_id>
次に、ローカルマシンで:
scp <username>@<vps_Host>:~/gpg-public.key ~/gpg-public.key
scp <username>@<vps_Host>:~/gpg-private.key ~/gpg-private.key
見る:
https://help.ubuntu.com/community/GnuPrivacyGuardHowto#Backing_up_and_restoring_your_keypair
データの性質によっては、GPGキーのprivate部分を紙に置き、次に その紙を金庫に保管する を検討することをお勧めします。 =。
duplicity --encrypt-key <gpg_public_key_id> --exclude="**" --include="/var/backups/sql" / gdocs://<google_account_name>@gmail.com/backup
cron
スクリプトに入れますこれは毎晩実行され、増分バックアップが作成されます。重複はデフォルトでディスク上のすべてのファイルをバックアップしようとしますが、これはおそらくVPSでは必要ありません。したがって、--exclude
パラメータを使用して、--include
を介して含めるディレクトリを除くすべてを無視します。複数の--include
パラメータを使用して、複数のディレクトリを含めることができます。
Sudo nano /etc/cron.daily/duplicity.inc
duplicity.inc:
#!/bin/sh
test -x $(which duplicity) || exit 0
. /root/.passphrase
export PASSPHRASE
export GOOGLE_DRIVE_SETTINGS=/home/<username>/.duplicity/credentials
# This lets the script find your GPG keys when it is running as root
export GNUPGHOME=/home/<username>/.gnupg
# Run MySQL dump. This will create a weekly file, and then update the file every additional time this script is run
mysqldump --single-transaction --routines --events --triggers --add-drop-table --extended-insert -u backup -h 127.0.0.1 -p<password> --all-databases | gzip -9 > /var/backups/sql/all_$(date +"%Y_week_%U").sql.gz
# Performs an incremental backup by default. Since we create a new dump file every week, we have a history
# of weekly snapshots, and the current week is incrementally updated each day.
duplicity --encrypt-key <gpg_public_key_id> --include="/var/backups/sql" --exclude="**" / gdocs://<google_account_name>@gmail.com/backup
権限の設定:
chmod 755 /etc/cron.daily/duplicity.inc
これは週に1回実行され、完全バックアップを作成し、最後の3つの完全バックアップを除くすべてをクリアしてスペースを節約します。この場合も、状況に応じて、このバックアップの頻度と数を調整して保持できます。
Sudo nano /etc/cron.weekly/duplicity.full
duplicity.full:
#!/bin/sh
test -x $(which duplicity) || exit 0
. /root/.passphrase
export PASSPHRASE
export GOOGLE_DRIVE_SETTINGS=/home/<username>/.duplicity/credentials
# This lets the script find your GPG keys when it is running as root
export GNUPGHOME=/home/<username>/.gnupg
# Run MySQL dump. This will create a weekly file, and then update the file every additional time this script is run
mysqldump --single-transaction --routines --events --triggers --add-drop-table --extended-insert -u backup -h 127.0.0.1 -p<password> --all-databases | gzip -9 > /var/backups/sql/all_$(date +"%Y_week_%U").sql.gz
# Create a brand new full backup, which contains all the weekly dumps located in /var/backups/sql
duplicity full --encrypt-key <gpg_public_key_id> --include="/var/backups/sql" --exclude="**" / gdocs://<google_account_name>@gmail.com/backup
# Clean out old full backups
duplicity remove-all-but-n-full 3 --force gdocs://<google_account_name>@gmail.com/backup
権限の設定:
chmod 755 /etc/cron.weekly/duplicity.full
これらのcron.*
ディレクトリ内のタスクが何らかの理由で(多くの場合、権限の問題のために)自動的に実行されない場合は、次のタスクをルートcronファイルに追加できます。
Sudo crontab -e
行を追加します(奇数回を選択してみてください):
# Incremental backup every day at HH:MM
MM HH * * * /etc/cron.daily/duplicity.inc >> /var/log/backups.log 2>&1
# Full backup every Saturday at HH:MM
MM HH * * 6 /etc/cron.weekly/duplicity.full >> /var/log/backups.log 2>&1
保存して終了。
Googleドライブから~/test
にバックアップをダウンロードしてみてください。
Sudo duplicity gdocs://<google_account_name>@gmail.com/backup ~/test