ITは遊び

毎日パソコンのことばかり考えてる

pythonをシェル代わりに使っている自宅サーバ(web、mysql、svn)のバックアップスクリプト

ちょっとメモ代わりに記載。
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() )

まぁ、何かの参考になれば。