#ごあいさつ
はじめましてyktdと申します。
のっぴきならない事情により記事を記載する事になりました。
あまりネタも無いのですが、過去にZenlogicで検証した事を記載したいと思います。
拙い説明になると思いますが、ご容赦を...
#お題
バックアップの取得についてはcronを利用して定期的に取得する事が可能ですが、
今回のお題は『外部ストレージへファイル転送』とさせていただきます。
取得したバックアップデータを外部ストレージに転送し保全するのが目的ですね。
#外部ストレージ
今回は dropbox を利用してファイルの転送を試みます。
何故 dropbox なのか?と言われるとAPI等が既に準備されているため、「これなら行けるんちゃう?」と思ったからです。(既に参考になるサイトも沢山あったし...)
#注意事項
動作検証を行ってたのが2016年2月頃で、確認してみたら APIv2 になってました><
またAPIv2になっていることでPHPのAPIが無くなってましたが、まぁ...気にしないで進めることにします。
#準備
- dropboxで新規アカウントを作成します。[https://www.dropbox.com/ja]
- 諸々初期設定を終わらせ、アドレスバーから [https://www.dropbox.com/deveropers] を入力し、開発者ページを開きます。
- 左側メニューの下の方に[API v1]がありますので、[API v1]をクリックします。
- 左側メニューの[API v1 (Core API)]をクリックします。
- 各種APIが表示されますので、[PHP] 行の [Install SDK] をクリックします。
- 開かれたページの中から[Download PHP SDK] をクリックし、APIを任意の場所にダウンロードします。
- ダウンロードしたファイルを解凍し、フォルダ名を「dropbox」にリネームしちゃいます。
#dropbox側の設定
- 開発者ページ [https://www.dropbox.com/deveropers] を開き、左側メニューの[My apps]をクリック。
- [My apps]画面が表示されるので、[Create app]をクリックします。
3. [Create a new app on the Dropbox platform]画面が表示される事を確認します。
4. [Choose an API] に [Dropbox API]を選択。
5. [Choose the type of access you need] に [App folder]を選択。
6. [Name your app] に任意の名前を設定します。※他のユーザーで使用されている名称は利用できません。ユニークな名称で設定して下さい。
7. [Create app]ボタンをクリックします。 - 作成したアプリ情報が表示されることを確認します。
- 「OAuth2」項目にある[Generated access token] にある[Generate]ボタンをクリックします ※[App key], [App secret], [token]情報は第三者に知られないように知られないようにして下さい。
- dropbox側([https://www.dropbox.com/] )に戻り、新しく「アプリ」フォルダが作成されていることを確認します。
- 「アプリ」を開き、先ほど作成したアプリが存在していることを確認します。
#APIと転送スクリプトのアップロード
- 「準備」で取得していたAPI(解凍、リネーム済みの物)をサーバーの[/cgi-data/Backup]にフォルダごとアップロードします。 ※ ここではcgi-data/Backupにアップロードするものとして説明します。
- アップロードスクリプト(samplescriptは以下)を準備し、[/cgi-data/Backup]にアップロードし、パーミッションを[755]とします。
<?php
require_once('dropbox/lib/Dropbox/autoload.php');
$dropbox = new \Dropbox\Client('アクセストークン',Backup);
// アップロードファイルの指定
$fpath = "/virtual/cgi-data/Backup";
$fname = "/".date('Ymd').".zip";
$fpn = $fpath.$fname;
// アップロードの実施
$fp = fopen("$fpn", 'rb');
$res = $dropbox->uploadFile("$fname", \Dropbox\WriteMode::add(), $fp);
fclose($fp);
var_dump($res);
?>
※アクセストークンは先のアプリ作成時に[generate access token]で生成したコードになります。
#バックアップ及び転送スクリプト
ざっくりバックアップするスクリプト
バックアップ処理の後にdropbox にアップロードしてます。
バックアップ取得対象として[/virtual/htdocs/default]としてます。環境に応じて変更する必要がありますね。
#!/bin/bash
# 基本変数
TIMESTAMP=`date +%Y%m%d`
WORKDIR=/virtual/cgi-data
TARGETDIR=/virtual/htdocs/default/
BKDIR=$WORKDIR/Backup/$TIMESTAMP
LOGDIR=$WORKDIR/logs/Backup
LOG=$LOGDIR/`basename $0 .sh`-$TIMESTAMP.log
# 環境に合わせて入力
DBNAME="データベース名"
DBPW="データベース パスワード"
ARCPW="圧縮時パスワード"
#----------------------#
# バックアップ処理開始
#----------------------#
mkdir -p $BKDIR
mkdir -p $LOGDIR
echo "`date +%Y/%m/%d-%H:%M` --- `basename $0 .sh` の処理を開始します" >$LOG
cd $WORKDIR/Backup
# アーカイブ化
echo "`date +%Y/%m/%d-%H:%M` --- Webコンテンツのアーカイブを開始します" >>$LOG
tar cvf $BKDIR/webcontents.tar -C $TARGETDIR ./ >>$LOG
# DBエクスポート
echo "`date +%Y/%m/%d-%H:%M` --- MySQL のエクスポートを開始します" >>$LOG
mysqldump -u root -p$DBPW $DBNAME >$BKDIR/$DBNAME.sql
# パスワード付きZIP化
echo "`date +%Y/%m/%d-%H:%M` ---圧縮処理を開始します">>$LOG
zip -r -P $ARCPW $TIMESTAMP.zip $TIMESTAMP >>$LOG 2>&1
rm -rf $BKDIR
echo "`date +%Y/%m/%d-%H:%M` --- Dropboxへのアップロードを開始します">>$LOG
php autoupload.php >>$LOG 2>&1
sleep 30
# 削除処理
echo "ローカルのバックアップファイル削除処理を開始します" >>$LOG
rm -rf $BKDIR.zip
echo "処理が完了しました">>$LOG
#cron設定
zenlogic のカスタマーポータルにログインしてcron設定を行います。
cron 実行時間は更新が行われていない深夜帯がよいかと考えられます。
因みにバックアップ取得時にI/Oが発生していると取得したデータが破損する可能性もありますので、
その辺りはうまいことやってください。
#最後に
期限に間に合わず...結構 駆け足で手順のみ記載したので、分かりにくい表記等があるかもしれません。
※ついでにコードミスもあるかも...汗
でも、基本的な考え方としては利用できるはずなので、興味があれば是非お試しください。
あ、ローカルバックアップの処理の中で「世代管理」や「バックアップ失敗時メール送信」等の処理を行う事もできます。
今回は単純処理としていますので、このままで利用するとバックアップデータで容量が枯渇する可能性があるので、ご注意くださいませ。