dropbox にファイル転送してみる

#ごあいさつ
はじめましてyktdと申します。
のっぴきならない事情により記事を記載する事になりました。
あまりネタも無いのですが、過去にZenlogicで検証した事を記載したいと思います。
拙い説明になると思いますが、ご容赦を...

#お題
バックアップの取得についてはcronを利用して定期的に取得する事が可能ですが、
今回のお題は『外部ストレージへファイル転送』とさせていただきます。
取得したバックアップデータを外部ストレージに転送し保全するのが目的ですね。

#外部ストレージ
今回は dropbox を利用してファイルの転送を試みます。
何故 dropbox なのか？と言われるとAPI等が既に準備されているため、「これなら行けるんちゃう？」と思ったからです。(既に参考になるサイトも沢山あったし...)

#注意事項
動作検証を行ってたのが2016年2月頃で、確認してみたら APIv2 になってました＞＜
またAPIv2になっていることでPHPのAPIが無くなってましたが、まぁ...気にしないで進めることにします。

#準備
1. dropboxで新規アカウントを作成します。[https://www.dropbox.com/ja]
2. 諸々初期設定を終わらせ、アドレスバーから [https://www.dropbox.com/deveropers] を入力し、開発者ページを開きます。
3. 左側メニューの下の方に[API v1]がありますので、[API v1]をクリックします。
4. 左側メニューの[API v1 (Core API)]をクリックします。
5. 各種APIが表示されますので、[PHP] 行の [Install SDK] をクリックします。
6. 開かれたページの中から[Download PHP SDK] をクリックし、APIを任意の場所にダウンロードします。
7. ダウンロードしたファイルを解凍し、フォルダ名を「dropbox」にリネームしちゃいます。

#dropbox側の設定
1. 開発者ページ [https://www.dropbox.com/deveropers] を開き、左側メニューの[My apps]をクリック。
2. [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]ボタンをクリックします。
8. 作成したアプリ情報が表示されることを確認します。
9. 「OAuth2」項目にある[Generated access token] にある[Generate]ボタンをクリックします ※[App key], [App secret], [token]情報は第三者に知られないように知られないようにして下さい。
9. dropbox側([https://www.dropbox.com/] )に戻り、新しく「アプリ」フォルダが作成されていることを確認します。
10. 「アプリ」を開き、先ほど作成したアプリが存在していることを確認します。

#APIと転送スクリプトのアップロード
1. 「準備」で取得していたAPI(解凍、リネーム済みの物)をサーバーの[/cgi-data/Backup]にフォルダごとアップロードします。 ※ ここではcgi-data/Backupにアップロードするものとして説明します。
2. アップロードスクリプト(samplescriptは以下)を準備し、[/cgi-data/Backup]にアップロードし、パーミッションを[755]とします。

```ruby:autoupload.php
<?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]としてます。環境に応じて変更する必要がありますね。

```ruby:SchdBackup.sh
#!/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が発生していると取得したデータが破損する可能性もありますので、
その辺りはうまいことやってください。

#最後に
期限に間に合わず...結構 駆け足で手順のみ記載したので、分かりにくい表記等があるかもしれません。
※ついでにコードミスもあるかも...汗

でも、基本的な考え方としては利用できるはずなので、興味があれば是非お試しください。
あ、ローカルバックアップの処理の中で「世代管理」や「バックアップ失敗時メール送信」等の処理を行う事もできます。
今回は単純処理としていますので、このままで利用するとバックアップデータで容量が枯渇する可能性があるので、ご注意くださいませ。