ちょっとメモ代わりに記載。
pythonですごいことしているわけではなく、ただpythonをシェル代わりに使っているだけです。
自宅サーバのバックアップは大したことをやっていないので、8GのUSBメモリに3個分のバックアップが出来てしまいます。
バックアップの手法自体は以下の通り。
- apache2 -> /var/wwwを全部コピってるだけ
- mysql -> mysqldump利用
- subversion -> svn-backup-dumps.pyを利用
機能・運用としては以下の通り。
- エラーが出てたら(ファイル読み込めないとかその程度しか機能しないが)、メールで通知する
- メールのスクリプトはどっかからコピった(汗
- 土日しか自分用の開発はしないから、日曜の晩にフルバックアップする
- 以前は、平日は差分バックアップしていたが、社会人になったので、日曜バックアップだけにする
- 三週間分のバックアップを用意する
- USBは/mnt/usbにマウント
- apacheのルートは/var/www
- subversionのルートは/var/svn
- OSはUbuntu9.10サーバ版
- usb上には、bk1_1week、bk2_2week、bk3_3week、svnというディレクトリが作ってある
- 作業ディレクトリは/root/backup
pythonスクリプト
# -*- coding: utf-8 -*- import os,glob,shutil,traceback from email.MIMEText import MIMEText from email.Header import Header from email.Utils import formatdate import json import urllib2 import shelve import smtplib #errorメールの送信 def sendMail( mailtext ): # メール送信準備 msg = MIMEText(mailtext.encode('utf-8'),'plain','utf-8') msg['Subject']=Header('backup error','utf-8') msg['From']='root@zisaba.com' msg['To']='xxxxxxxx@ezweb.ne.jp' msg['Date']=formatdate() # メール送信 sendmail = smtplib.SMTP('プロバイダが用意するOP25用のメールサーバ',587) sendmail.ehlo() sendmail.starttls() sendmail.ehlo() sendmail.login('OP25のメールサーバのユーザID','パスワード') sendmail.sendmail(msg['From'],msg['To'],msg.as_string()) exit() #subversionのフルバックアップ #前ファイルの削除 try: for file in glob.glob('/mnt/usb/svn/*.bz2') : os.remove( file ) except : sendMail( traceback.format_exc() ) #バックアップ try: os.system( 'python /root/backup/svn-backup-dumps.py -b /var/svn/リポジトリ1 /mnt/usb/svn/' ) os.system( 'python /root/backup/svn-backup-dumps.py -b /var/svn/リポジトリ2 /mnt/usb/svn/' ) os.system( 'python /root/backup/svn-backup-dumps.py -b /var/svn/リポジトリ3 /mnt/usb/svn/' ) except : sendMail( traceback.format_exc() ) #一番古いやつの削除して移動 try: for file in glob.glob('/mnt/usb/bk3_3week/*') : os.remove( file ) os.removedirs( '/mnt/usb/bk3_3week' ) os.renames( '/mnt/usb/bk2_2week' , '/mnt/usb/bk3_3week' ) os.renames( '/mnt/usb/bk1_1week' , '/mnt/usb/bk2_2week' ) os.mkdir('/mnt/usb/bk1_1week') except : sendMail( traceback.format_exc() ) try: #mysqlのフルバックアップ os.system('mysqldump -u root --password=MYSQLのパスワード -x --all-databases > /mnt/usb/bk1_1week/mysql.sql') #webのフルバックアップ os.system('zip -r /root/backup/html.zip /var/www') shutil.copy('/root/backup/html.zip','/mnt/usb/bk1_1week/') except : sendMail( traceback.format_exc() )
まぁ、何かの参考になれば。