用Python写个网站自动备份脚本

又是废话

前几天看到有站长说自己博客莫名其妙的空了,所以不能让我的博客也这样啊,虽然才几十篇文章,但是也都是我这两年来积累的经验,所以就又拿出了我边学边用的Python写了个简单的自动备份脚步,也同时记录加分享;

由于懒癌,此脚本写差不多十天;

工作原理:

导出数据库后将网站目录和数据库打包并压缩为 xxx.tar.gz 文件,最后通过邮件发送备份包到指定邮箱;

开始

首先需要安装一些Python模块

开发版python是必须的
apt-get install python-dev                 # Debian系

yum install python-devel                   # RedHat系  

MySQL-python

这里 下载适合自己系统的版本,Windows系统的直接双击 exe 安装,Linux解压并进入下载的 MySQL-python 然后输入下面命令安装

python setup.py install  

如果提示:

EnvironmentError: mysql_config not found  

输入下面命令安装 mysql_config

apt-get install libmysqlclient-dev                 # Debian系  
yum install libmysqlclient-devel                   # RedHat系  

然后重新安装 MySQL-python

python setup.py install  

ConfigParser模块

这里 下载ConfigParser,解压并进入目录,然后输入下面命令安装

python setup.py install  

脚本

此脚本我也放到 我的Github 了 ,此脚本适用Linux和Windows系统;

程序:site-backup.py

# -*- coding: utf-8 -*-
from email import encoders  
from email.header import Header  
from email.utils import parseaddr, formataddr  
from email.mime.text import MIMEText  
from email.mime.multipart import MIMEMultipart  
from time import strftime,gmtime  
import smtplib, MySQLdb, time, os, tarfile, ConfigParser

config=ConfigParser.ConfigParser()  
config.read("site-backup.cfg")

# 获取时间
serverTime = str(time.strftime("%Y-%m-%d"))  
backTime = float(config.get("time", "backTime"))  
# 邮件变量
from_addr = config.get("mail", "from_addr")  
password = config.get("mail", "password")  
smtp_server = config.get("mail", "smtp_server")  
to_addr = config.get("mail", "to_addr")  
mail_sender = config.get("mail", "mail_sender")  
mail_recipient =  config.get("mail", "mail_recipient")  
mail_title = config.get("mail", "mail_title")  
# Mysql变量
mysql_host = config.get("mysql", "mysql_host")  
mysql_user = config.get("mysql", "mysql_user")  
mysql_password = config.get("mysql", "mysql_password")  
mysql_database = config.get("mysql", "mysql_database")

# 网站文件变量
siteName = config.get("flies", "siteName")  
dirName = siteName + "-" + serverTime  
dirPath = config.get("flies", "dirPath")  
siteBack_name = 'dirName.tar.gz'

# SQL和压缩包变量
backMysql_name = siteName + "-" + serverTime + '.sql'  
sendSitePack = dirName + ".tar.gz"


# 导出数据库函数
def outMysql():  
    mysql_cmd = "mysqldump -u " + mysql_user + " -p" + mysql_password + " " + mysql_database + " > " + dirPath + backMysql_name
    os.system(mysql_cmd)

# 打包网站文件函数
def siteFile():  
    t = tarfile.open(dirName + ".tar.gz", "w:gz")
    for root, dir, files in os.walk(dirPath):
        for file in files:
            fullpath = os.path.join(root, file)
            t.add(fullpath)
    t.close()

# 发送邮件(备份包)函数
def sendMail():  
    message = MIMEMultipart()
    message.attach(MIMEText('备份于' + serverTime, 'plain', 'utf-8'))
    att = MIMEText(open(sendSitePack, 'rb').read(), 'base64', 'gb2312')
    att["Content-Type"] = 'application/octet-stream'
    att["Content-Disposition"] = "attachment; filename=" + sendSitePack
    message.attach(att)
    message['From'] = mail_sender
    message['To'] = mail_recipient
    message['Subject'] = mail_title + serverTime

    server = smtplib.SMTP_SSL(smtp_server, 465)
    server.set_debuglevel(1)
    server.login(from_addr, password)
    server.sendmail(from_addr, [to_addr], message.as_string())
    server.quit()


# 整个任务函数
def backSite():  
    outMysql()
    if os.path.exists(dirPath + backMysql_name):
        siteFile()

    if os.path.exists(sendSitePack):
        sendMail()

    os.remove(dirPath + backMysql_name)
    os.remove(sendSitePack)

# 循环执行备份任务
while True:  
    backSite()
    time.sleep(backTime)

配置文件:site-backup.cfg

[mail]
# 发件人邮箱
from_addr = xxx@qq.com  
# 发件人邮箱密码或者授权码
password = xxxxxxxxxxxxx  
# smtp服务器
smtp_server = smtp.qq.com  
# 收件人邮箱
to_addr = xxx@qq.com  
# 发件人
mail_sender =  
# 收件人
mail_recipient =  
# 邮件标题
mail_title =

[flies]
# 网站名
siteName =  
# 需要备份的网站目录路径,结尾必须加上\(WINDOWS)或/(Linux),例如下面
dirPath = /home/web/sitefile/

[mysql]
# Mysql服务器
mysql_host = loaclhost  
# Mysql用户名
mysql_user =  
# Mysql密码
mysql_password =  
# 需要备份Mysql数据库
mysql_database =

[time]
# 备份时间间隔,单位为秒,建议12小时,即43200秒
backTime = 43200  

让脚本工作起来

你也可以直接运行脚本,但是我建议将此脚本加入后台运行和开机自动运行;

后台运行

这里只有Linux的方法:使用 nohup,关于 nohup 自己Google吧

nohup python site-backup.py > /dev/null &  

然后敲一下回车键就不用管了,如果要结束这个任务的话查下进程

ps aux|grep python  

找出进程后杀掉就行了

kill 进程号  

如果有什么疑问和建议记得在下方评论留言哦;

上一篇:  树莓派Respbian系统安装Nodejs
下一篇:  Ghost博客配置QQ邮箱  

如果我的文章对你有帮助,或许可以打赏一下呀!

支付宝
微信
QQ