WEIC`S BLOG

用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 进程号

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

加载评论
打赏本文
二维码