cronのないファーストサーバでサイボウズを自動バックアップ
公開日:
:
最終更新日:2012/07/12
プログラミング
目次
サイボウズのバックアップ
突然ですがサイボウズのバックアップについて記録しておきます。もしかしたらどなたかのお役に立てるかもしれません。
さて、サイボウズ自身にもバックアップ機能がついているのですが、後述するように当方では(少なくとも騒動後に確認した所)機能していませんでした。また、同一サーバー上にバックアップを取っても今回のような自体ではまったく意味をなしませんし、sshやcronの使えない契約プランでは他サーバへのバックアップなどが困難です。
ファーストサーバから逃げ出したところでやっぱりバックアップ体制が必要ですので、取り急ぎ、cronとftpサーバの使える他サーバーよりファーストサーバに置いたPHPスクリプトを呼び出してバックアップした記録を残しておきます。
ファーストサーバ騒動
たまたま出入の業者が選定したファーストサーバにサイボウズ簡単インストール機能というのがあり、これで運用していました。簡単インストールといっても、別段、そんなに簡単になってるわけでもないのですが、サイボウズの動作確認済みサーバみたいなものでしょうか。
しかしなぜかバージョンアップのたびに待たされます。今回サイボウズ9リリース後、半年待たされて出た結論は、
先日ご案内いたしましたように、『サイボウズ Office 9』はサービス仕様上お客様にご契約いただいているサーバー内では動作いたしません。
と。つまり、
現在ご利用中のサービスから『サイボウズ Office 9』対応のサービスに変更していただきます。現在のご利用形態と同様、ご契約サーバー内で『サイボウズ Office 9』ライセンス版をご利用いただけます。
「シリーズ変更」ではサーバーの変更作業を伴うため、お客様にてホームページデータやメールの移行作業が必要となります。
別のプランに契約変更して、移行してね、ということですが、めんどくさいので放置していました。結果的には移行してたら、データ削除の憂き目にあっていたわけで世の中わからないものです(汗)。
バックアップ方法アウトライン
プログラムはいつもどおり下手くそですが、今回は上から順番の簡単なものなのでなんとかなりそうです。なすべきことは、
- 要パックアップなファイルをアーカイブ・圧縮。ファイル名に日付を付与。
- 他のftpサーバにアップロード
- アーカイブ・圧縮したファイルを削除
上記動作をさせるスクリプトをサイボウズと同じサーバに設置すると、自分だけの力ではじーっとしたままですが、ブラウザなどでアクセスされると上記工程が実行されます。実際には別サーバのcronでwgetコマンドにより定期アクセスさせます。転送にftpというのがセキュアではなく残念なのですが、ファーストサーバの契約プランではsshも使えないので。当然のことながら、ftp先のディレクトリは公開されないようにしておきます。
一方、『レンタルサーバーはcronの使えないものがひとつだけ』という場合は日々、ブラウザで手動アクセスしてもよいです。fileディレクトリの圧縮・転送には数分かかりますので時間のないときには注意です。
バックアップするファイル
サイボウズのオンラインマニュアルによると、
バックアップするディレクトリは次のとおりです。
(インストールディレクトリ)/cb5/data/
(インストールディレクトリ)/cb5/file/
1日に1回、バックアップをとることをお奨めします。
とのことです。
実際のインストールディレクトリは「サイボウズのシステム設定」→「サイボウズ(R) Office の実行環境の診断」より(うちが契約しているプランでは)WWWサーバのドキュメントルートは/virtual/www/であり、インストールディレクトリは/virtual/www/cb8/となっています。
そんなわけで、今回は
1 2 |
/virtual/www/cb8/cb5/data/ /virtual/www/cb8/cb5/file/ |
のバックアップを取ります。
バックアップ用スクリプトの作成(tar/ftp)
前述のディレクトリをアーカイブ・圧縮するには
1 |
tar cvfz 作成されるファイル名 まとめるディレクトリ |
でOK。PHPではsystem()関数でコマンドを実行できるようですのでこれを利用。
さて、PHPでftpを利用しようと思ったら、どうやらファーストサーバの現在のプランのPHPでは使えないようです。まったくないないづくしなサーバーだな。ということで検索してみたところ、
FTPクライアント( 18/Mar/2003 23:04)fsockopen()でFTP (Class)
というのを発見しました。作者様に感謝です。9年前のものですが、シンプルな内容のものですので現在でも問題なく動作します。
こちらのftp-class.txtというファイルをダウンロードして、ftp-class.phpとリネーム、今回作成するPHPスクリプトと同じディレクトリに置いて利用します。ftp-classの利用方法はこのファイルの先頭にサンプルコードがありますのでそのまま流用させて頂きます。
ftpが無事に終わったファイルは安全のためにすぐに削除しておきます。これはPHPのunlink()関数を使いました。
スクリプトの自動運用(cron/wget)
このような内容のPHPスクリプトをサイボウズ稼働中のサーバーの外部からアクセス可能なディレクトリに保存します。ブラウザなどからアクセスするとスクリプトの中身が実行されます。つまり、ファイルが日付のついたファイル名となってftpされ、送信元ファイルは削除されます。
サーバで自動実行の際に、ブラウザでアクセスするのと同等のことをするためにはwgetというコマンドを使います。
1 |
wget --spider http://www.hoge.hoge/backup.php > /dev/null 2>&1 |
wgetにspiderオプションをつけるのを忘れると、上記コマンド実行後に、(この場合)backup.phpというファイルg実行側に保存されてしまいます。spiderオプションによってこれを回避できます。
/dev/nullについては「シェルのリダイレクトにまつわる失敗」を読むとよくわかりました。要するに実行はするけど、何も後は残さない、ということです。
定期実行にはcronを使用します。レンタルサーバによっては管理画面から簡単に設定することも可能です。そうじゃなくてコンソールで設定しないといけないサーバの場合、crontabという設定ファイルを変更します。
1 |
crontab -e |
でviエディタによって開かれた状態になります。
viは慣れないと頭が爆発しそうになるのですが、基本的な操作方法だけでOK。
まず、ESCを押してからiを押して、インサートモードに入り(画面の下の方にINSERTと表示されます)、
1 |
0 2 * * * wget --spider http://www.hoge.hoge/backup.php > /dev/null 2>&1 |
のように追記します。削除モードもあるのですが、覚えるのがめんどくさい場合、「ESCを押して:q」で保存せずに終了となりますので、再度同じ事を繰り返せばよいです。
上記の設定の場合、毎日午前2時にwgetで該当スクリプトにアクセスし、その結果は何も表示しない、ということです。よければ、ESCを押して :q!:wqで上書き保存。
1 |
crontab -l |
で設定内容を確認。
以上で最低限のことは出来るのではないかと思います。
参考ソース
なお、こちらで紹介したバックアップ方法は素人である私が個人で実践してみたものです。特に削除コマンドを使用しているため、同じように試される方はくれぐれも十分にご注意の上、テストを繰り返し、自己責任でご利用ください。万が一の誤ってのファイル削除等によって発生した障害/損害に対する責任は一切負いません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
<?php //2012/07/09 //サイボウズのファイルを他サーバにftpする //ftp-classを読み込む(http://www.spencernetwork.org/) require_once("ftp-class.php"); //ファイルに日付 $d=date("Ymd"); //バックアップ一時作成場所 $backup_dir = "/virtual/www/backup/"; //file、data各ディレクトリをアーカイブ・圧縮したファイル名 $backup_file = "cybozu_file".$d.".tar.zip"; $backup_data = "cybozu_data".$d.".tar.zip"; //一応ログ $log_tar = "/virtual/www/backup/ftpbackup_tar.log"; //ftpする先のディレクトリ // /home/hoge/backupみたいな感じ $dist_dir = "backup"; //ftpサーバおよびftpアカウント $ftp_host = "ftp.hoge.hoge"; $ftp_user = "hoge"; $ftp_pass = "hogehoge"; //local_ ftp元 remote_ ftp先 //_file fileディレクトリ _data データディレクトリ $local_file = "backup/".$backup_file; $remote_file = "backup/".$backup_file; $local_data = "backup/".$backup_data; $remote_data = "backup/".$backup_data; // アーカイブ・圧縮 system("cd /virtual/www/cb8/cb5/file ; tar cvfz $backup_dir$backup_file .>>$log_tar"); system("cd /virtual/www/cb8/cb5/data ; tar cvfz $backup_dir$backup_data .>>$log_tar"); //ftp開始 $ftp = new ftp(); //$ftp->debug = TRUE; //接続 if (!$ftp->ftp_connect($ftp_host)) { die("Cannot connect\n"); } //ログイン if (!$ftp->ftp_login($ftp_user, $ftp_pass)) { $ftp->ftp_quit(); die("Login failed\n"); } //ファイルを送信 //送信前に同名ファイルの有無を確認 if ($ftp->ftp_file_exists($remote_file) == 1) { $ftp->ftp_quit(); die($remote_file." already exists\n"); } //fileディレクトリのアーカイブを送信 if ($ftp->ftp_put($remote_file, $local_file)) { echo $local_file." has been uploaded as ".$remote_file."\n"; if (file_exists($local_file)) { //送信済みファイルを削除 unlink($local_file) or die('ファイル削除に失敗¥n'); } } else { $ftp->ftp_quit(); die("Error!!\n"); } //同様にdataディレクトリをftp if ($ftp->ftp_file_exists($remote_data) == 1) { $ftp->ftp_quit(); die($remote_data." already exists\n"); } if ($ftp->ftp_put($remote_data, $local_data)) { echo $local_data." has been uploaded as ".$remote_data."\n"; if (file_exists($local_data)) { unlink($local_data) or die('ファイル削除に失敗¥n'); } } else { $ftp->ftp_quit(); die("Error!!\n"); } $ftp->ftp_quit(); ?> |