Dropbox API を利用してPHPでVPSサーバーのバックアップ手順
VPSのバックアップをどこにとるか?
VPSサーバーには提供者側からバックアップの仕掛けが用意されていません。そう考えると、バックアップをどこかに取得する必要があります。
以前は、違うブランドのVPSサーバーを借りて、そことrsyncさせる方法をとっていました。
ただ、この方法だと弊社のサーバー管理方法では、一括バックアップを取得しようとするとrootアカウントでやり取りすることになってしまい、気持ち悪さを感じていました。
今回、このブログで初めてコード埋込を実施しました。下記URLを参考にコード埋込をできるようにしました。
https://qiita.com/piro_erdes/items/f133e170a8cf6c10b449
Dropbox API 活用
Dropbox APIを利用することでVPSサーバー内のプログラムを使って、Dropboxへ転送してます。
弊社の場合、Dropbox Business Advancedを利用していますので、容量無制限でアップで利用できます。
Dropboxを利用することで、世代管理も自動でやってくれます。
Dropboxを利用することで、世代管理も自動でやってくれます。
また、APIコール数も月間で100万まで大丈夫のようです。
CURLを活用
基本はCURLの機能で実現していますので、タイトルにPHPと入れていますが、基本的には特別なSDKなどは不要で、応用すれば他の言語でも可能だと思います。
Dropbox APIのAPP作成
手順1
まず、Dropbox APIを利用するためには
へアクセスして、右上にある「App console」ボタンを押します。
ログインしてない場合はログインを促されます。
手順2
Create app のボタンを押します。
すると、下記の様な画面が出てきます。
Businessアカウントなので、右にDropbox Business APIの選択肢も出てきますが、Business APIは「管理機能」での利用なので、今回は左側の普通のDropbox APIを選択します。
手順3
続いて、下記の選択をしますが、今回はバックアップというかuploadの機能だけですので、App folderだけで大丈夫と思います。
手順4
Name your appに名前を入れます。
なんか、他で利用されている名前は利用できないみたいですので、ユニークになるような名前を入れてください。
ここで入力された名前がDropbox内のアプリの下にできます。
最後に、I agree to・・・のチェックボックスに印を入れて「Create app」です。
手順5
ここまで完了するとAppの詳細画面が表示されます。
Setting内のOAuhth2にある「Generated access token」のところにあるGenerateボタンを押すとトークンが生成されますので、コピーしてメモってください。
これが、コード内のAPI KEYにあたります。
ここまでが、Dropbox側の準備です。
VPSサーバー側の準備
弊社管理のVPSの場合、VPSサーバーに複数のVirtualHostを設定して、Linuxのユーザー単位で管理し、コンテンツはユーザーのホームディレクトリ内に置いて管理するように設定しています。
ただ、それぞれのホームディレクトリに対してはRead権限はOtherに与えていますので、誰でも読むことはできます。
ですので、Dropboxバックアップ用ユーザーを設定して、そのユーザーがバックアップを実施するように設定しました。
そうすることで、バックアップ用cronの設定も一括管理できます。
DropboxへアップロードするためのPHPソース
$api_url = 'https://content.dropboxapi.com/2/files/upload'; //dropbox api url $token = '{API KEY}'; // oauth token $filename = $argv[1]; $filerev = filemtime($filename); $headers = array('Authorization: Bearer '. $token, 'Content-Type: application/octet-stream', 'Dropbox-API-Arg: '. json_encode( array( "path"=> '/{Directory}/'. substr($filename,{ファイルまでの文字数}), "mode" => "overwrite", "autorename" => true, "mute" => false ) ) ); $cu = curl_init($api_url); curl_setopt($cu, CURLOPT_HTTPHEADER, $headers); curl_setopt($cu, CURLOPT_POST, true); $path = $filename; $fp = fopen($path, 'rb'); $filesize = filesize($path); curl_setopt($cu, CURLOPT_POSTFIELDS, fread($fp, $filesize)); curl_setopt($cu, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($cu); $http_code = curl_getinfo($cu, CURLINFO_HTTP_CODE); echo($response."\n"); echo($http_code."\n"); curl_close($cu);
こんな感じのソースになっています。1ファイルずつ処理するプログラムです。
コマンドラインでPHPを動かします。
最初はtarで圧縮して、転送させようかとも考えたのですが、ファイルサイズが大きくなる上に毎日すごい転送量になるので、1ファイルずつ処理するというやり方にしました。
コマンドラインは
> find /home/{hoge}/www/ -type f | xargs -n 1 php backup.php
こんな感じで、まず一括バックアップを取得。
一度、全部バックアップを取得した後は
> find /home/{hoge}/www/ -type f -mtime -1 | xargs -n 1 php backup.php
として、前日に変更があったファイルだけを抽出しています。
上記をcronに記述して、夜間に動かすことでバックアップの取得を実施してます。
このPHPプログラムを利用して、同様にDBのダンプもバックアップしています。
今後の予定
今後は、このやり方でyumのログと/etc以下もバックアップしておきたいと考えてます。
コメント
コメントを投稿