コンピュータシステムの現場というのは実に色々あって、エンジニアの飲み会なんかでは"弊社の酷い環境"なんて話題がよく酒の肴になります。
- 前任者のスパゲッティコード
- テストが無く、デグレしまくるコード
- バージョン管理されていないコード
- バックアップされていないデータ
- sshでログインできないレンタルサーバ
- 穴だらけのセキュリティ
- 実際の仕様とは乖離して久しいドキュメントの更新作業
- プロプライエタリなOS
- 古くさい言語
- 貧弱な処理系
web上や技術雑誌、書籍にある様な最新でスマートな技術、歴史があり学術的裏付けもしっかりした環境。勉強熱心でそうした情報に詳しいエンジニア程、理想と現実の乖離にストレスを感じることでしょう。
こんな泥臭い環境では俺/私の洗練された
「Mavenを使った統一されたプロジェクト管理とビルドプロセス」
とか
「言語内DSLを使ったスマートなメタプログラミング」
が生かせない。ここは自分の働く場所ではない。
しかし、そんな理想的な環境は滅多にありません。
「とんでもない貧民街に生まれついてしまった。」と嘆いたところで、実際"地上の大半は砂漠で、地表の7割は海である。"みたいなのが現実だったりしないでしょうか?
しかし、むしろそんな環境こそ、プログラミングやオープンソースの力を使って劇的に環境を改善できる腕の見せ所であり、とっても楽しい作業なのかもしれません。
そんな時に頭に思い浮かべるのが、レガシー改善の鉄則、
「1回のBestよりBetterの積み重ね」
と
「つまらない・面倒な仕事は技術的問題にすり替えると楽しい」
という二つの言葉です。
地道な改善
web系ベンチャーに絞って言うととりあえず、
- バックアップされてない
- バージョン管理されてない
- テストされてない
というところに入って行って何とかしなければいけないという場面が多い気がします。優先順位から考えるとバージョン管理システムの種類とかプログラム言語の種類は変更の手間の割に重要で無く、兎に角、何人月・何人年も書けてきたコードやデータの消失や不具合に起因する障害が一番の問題だと思います。
rsyncを使ったバックアップ
幸運にもsshアクセスが可能なレンタルサーバーでサイトが稼働している場合はrsyncを使ったバックアップがとても手軽です。下記の様なスクリプトを用意し、cronで1日1回バックアップを取ります。(鍵を登録して置いて)
backup.sh:
#!/bin/sh
if [ ! $1 ] || [ ! $2 ]
then
echo "Usage: backup.sh REMOTE_DIR BACKUP_DIR"
echo "Example: backup.sh foo@example.com:/home/foo/public_html /var/backups"
exit 1
fi
REMOTE_DIR=$1
BACKUP_DIR=$2
TODAY=`/bin/date '+%Y%m%d'`
YESTERDAY=`/bin/date --date='1 day ago' '+%Y%m%d'`
[ -f $BACKUP_DIR/$YESTERDAY ] || mkdir -p $BACKUP_DIR/$YESTERDAY
[ -f $BACKUP_DIR/$TODAY ] || mkdir -p $BACKUP_DIR/$TODAY
cd $BACKUP_DIR/$TODAY && rsync -atrzv --delete --link-dest=../$YESTERDAY $REMOTE_DIR .
UNIXイズムの継承者から言わせれば、「GNUのやり方に汚染された節操のないオプション」という感じかもしれませんが、最近のrsyncにはPlan9のdumpfsみたいなハードリンクを使った差分バックアップができるオプションがあるそうです。(via g:id:g000001)
$ rsync --link-dest=ハードリンク元 コピー元 コピー先
という様に指定するとリモートのディレクトリをハードリンク元を参照しながら差分だけバックアップしていくことができます。(変更の無いファイルはハードリンクが作成される。)
さくらインターネットの500円プランを使っているfjord.jpの例で行くと下記の様な感じになります。
0 5 * * * /usr/local/bin/backup.sh fjord@fjord.jp:/home/fjord/www /var/backups/fjord.jp
このオプションの実装は結構最近の事らしいのでベテランのrsyncユーザーは逆に意外と知らないかもしれません。
ftpしかアクセス方法が無い環境では、lftpで一度ローカルに持ってきてから同じ事をすれば大丈夫だと思います。(lftpにはftpプロトコルでrsyncのようにディレクトリを簡単にmirrorするコマンドがあります。)
fjord,llcではベンチャー勝ち組セットのサーバーにバックアップして、sambaでリードオンリーでLAN内に公開しています。これならデザイナーさんでも使い易いと思います。
XREAのsshアクセス
XREAは無料or格安でWordPressが使えるレンタルサーバーとしてホビーユースやデザイナーの方にも人気のあるレンタルサーバーです。ここ最近のXREAは有料ユーザーを含めて、障害に対する対応や安定性にかなり問題があるので仕事で使うなら別のレンタルサーバーへの引っ越しをおすすめしますが、「そんなことが出来る立場なら苦労しねぇんだよ!」という方も多いと思いますのでXREAでのバックアップ方法を。
XREAではsshアクセスするのに"30日に1度、管理画面からリモートアドレスを登録する必要がある"という面倒な制限があります。Mechanizeを使うのもどうにも面倒です。この管理画面の登録フォームは非sslな上にGETメソッドを許容するのでwget等でアクセスするだけで事足りてしまいます。(via g:id:g000001)
(リンクを辿っていく通常の管理画面は非sslだけど、ssl経由でもアクセスできる。)
0 5 1 * 1 wget "http://www.sサーバー番号.xrea.com/jp/admin.cgi?id=ユーザーID&pass=パスワード&remote_host=アクセスするホストのアドレス&ssh2=on" -O /dev/null
0 5 1 * 1 wget "https://ss2.xrea.com/www.sサーバー番号.xrea.com/jp/admin.cgi?id=ユーザーID&pass=パスワード&remote_host=アクセスするホストのアドレス&ssh2=on" -O /dev/null
上記の様な感じで念のため週に1回アクセスする様にすればあとはさくらと同じ様にバックアップできます。
データベースのバックアップ
DBはほとんどの環境でmysqldumpが使えるので普通にバックアップできます。そうでないところはphpMyAdmin等のwebインターフェースがあるのでそこからのバックアップを自動化します。
水面下で進める
これらの作業は職場で発言権が無い時はメインの業務をこなしつつ同時に水面下で進める必要があります。(それまで基本的なことを行ってこなかった職場でその作業の必要性を説くのは非常に困難です。データ消失などの事件があったときに颯爽とリカバリーして見せた後なら簡単に有効性を理解してもらえるでしょう。)
メイン業務の合間にやるので最小限の手間で最大限の効果を得る必要があります。そこがパズル的でもあり、面白いところだと思い込んでやると楽しいと思います。
関連
参照