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を利用することで、世代管理も自動でやってくれます。
 また、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以下もバックアップしておきたいと考えてます。

コメント

このブログの人気の投稿

突然、Gmailから独自ドメインのメールアドレスから送信ができなくなった

X Pro(旧TweetDeck)が便利すぎる

NASを利用したファイルサーバーからDropboxへの移行の手順