导读:2 个月前,张戈博客分享了一篇Python+Shell 定时备份网站到阿里云 OSS 的教程,已经有非常多的站长朋友用上了,反馈还不错,也有不少朋友提出了很多优化建议,比如上传完成后能否删除本地压缩包之类的,本文将继续分享另一种云端备份方案。
一、优点分析
内网传输:和阿里云 OSS 一样,腾讯云 COS 同样支持内网和外网文件传输,对于腾讯云服务器,使用内网传输绝对是最快、最稳定的备份方案!
免费方案:看了下腾讯云 COS 的定价说明,发现对于备份网站来说简直是绝佳搭档,甚至可以说是钻了个空子(希望腾讯云的同事看到别打我。。。)!为啥这么说?
看下定价方案:
①、入流量免费
相当于我们上传文件的流量都是免费的,不区分内外网哦!内网就不说了,都懂。
②、各种免费额度
以七天循环备份(7 份压缩包)以来算,单压缩包支持 700M+(700M*7≈50G),应付一般网站的备份绝对是足够足够足够了!
从上述摘选的定价方案来看,腾讯云 COS 比阿里云 OSS 更适合做网站备份,关键他还适合在第三方服务器上做远程备份,因为不但入流量(上传)免费,出流量(下载)也免费 10GB。
二、准备工作
①、开通 COS,并创建 Bucket
访问腾讯云 COS开通对象存储服务,然后如图创建 Bucket:
Ps:我们只用于备份,且为私密资料,所以选择私有读写。
②、添加密钥
接着,我们点击左侧的密钥管理,进入密钥界面如图创建密钥,如果先前已经有密钥了,则可以直接使用:
Ps:这里我们需要记住 3 个信息:AppID,SecretID 和 SecretKey,待会要用。
三、备份工具
2019 年 6 月 22 日更新:最近使用 COS 的时候,发现其实 COS 提供了一个更简单的上传下载工具:coscmd,所以上传下载这部分淘汰之前我自己写的 Python 脚本,改为 coscmd,工具详细使用帮助请看官方文档。
①、环境准备
Linux 下执行如下 3 条命令即可安装 coscmd
yum install python-pip
pip install --upgrade pip
pip install coscmd
Ps:如果安装失败,请参考官方文档提供的其他安装途径。
②、工具配置
配置 ~/.cos.conf
文件 (在 Windows 环境下,该文件是位于 我的文档
下的一个隐藏文件),该文件初始时不存在,是通过 coscmd config
命令生成,用户也可以手动创建。
Linux 下直接执行如下命令即可(请先根据实际情况修改 secret_id、secret_key、bucket 和 region):
cat >~/.cos1.conf<<EOF
[common]
secret_id = AChT4ThiXAbpBDEFGhT4ThiXAbp****
secret_key = WE54wreefvds3462refgwewe****
bucket = 请根据实际情况修改
region = 请根据实际情况修改,比如广州区域是 ap-guangzhou
max_thread = 5
part_size = 1
schema = https
EOF
③、上传测试
工具配置好了之后,我们手工执行上传看看验证下结果,Linux 执行如下命令行即可:
echo `date` > /tmp/test_upload.txt
coscmd upload /tmp/test_upload.txt test_upload.txt
执行后正常输出如下:
[email protected]:/# echo `date` > /tmp/test_upload.txt
[email protected]:/# coscmd upload /tmp/test_upload.txt test_upload.txt
Upload /tmp/test_upload.txt => cos://jager/test_upload.txt
如果没有报错,我们登陆腾讯云 COS 就可以看到刚刚上传的文件了:
三、备份脚本(已淘汰)
人生苦短,我用 Python,这里就继续选择 Python SDK 来实现,
①、环境准备
如下顺序安装腾讯云 Python SDK 插件:
#安装 pip yum install python-pip #升级 pip(yum 装的可能版本比较旧) pip install --upgrade pip #安装腾讯云 COS SDK 插件 pip install qcloud_cos_v4
如果不是 Centos,请自行搞定,这里不再赘述。
②、上传脚本
参考官方 SDK 文档,写了一个简单够用的上传脚本:
# -*- coding: utf-8 -*- # Upload File To Qcloud COS from qcloud_cos import CosClient from qcloud_cos import UploadFileRequest import sys region = "shanghai" #替换为 COS 所在区域,可选 shanghai(华东)/guangzhou(华南)/tianjin(华北)/chengdu(西南) #脚本需要传入 6 个参数 if ( len(sys.argv) > 5 ): appid = int(sys.argv[1]) secret_id = sys.argv[2].decode('utf-8') secret_key = sys.argv[3].decode('utf-8') bucket = sys.argv[4].decode('utf-8') domain = sys.argv[5].decode('utf-8') filePath = sys.argv[6].decode('utf-8') fileName = filePath.split("/")[-1] else: print("Example: python %s appid secret_id secret_key Bucket zhang.ge /data/backup.zip" % sys.argv[0]) exit() #认证和上传 cos_client = CosClient(appid, secret_id, secret_key) request = UploadFileRequest(bucket, '/%s/%s' % ( domain, fileName ), filePath) request.set_insert_only(0) upload_file_ret = cos_client.upload_file(request) print 'The File %s Upload to Bucket %s : %s ' % ( filePath , bucket , upload_file_ret.get('message') )
使用方法:将上述代码保存为 cos.upload.py,并上传到服务器,执行如下命令可开始上传文件到 OSS:
python /data/oss.upload.py appid secret_id secret_key Bucket 名称 域名 /data/zhang.ge_1.zip
其中:
- 1~3 个参数是 appid、认证 ID 和认证密钥,也就是前文创建并备忘的密钥信息;
- 第 4 个参数是前文创建的 Bucket 名称,比如 mybackup
- 第 5 个参数是需要备份的域名(新增的:主要是为了区分下)
- 第 6 个参数是要上传的本地文件的绝对路径
- 特别说明:更新到 V4 版本后,才发现还需要传入一个地域的参数,这里就不再修改脚本代码了,请直接修改上述代码的 region 的值,否则会报 404 错误!目前可选有 shanghai(华东)/guangzhou(华南)/tianjin(华北)/chengdu(西南),具体请看自己的 COS 所在地域以及腾讯云关于地域的文档。
执行后,就能在 COS 的 Object 界面看到了上传的文件:
四、定时备份
有了上传脚本,继续结合之前张戈博客分享的七天循环备份脚本,实现循环备份到 COS 了,既安全还节省 COS 空间。
①、适合 COS 七天循环备份脚本
#!/bin/sh
###################################################################
# Web Backup version 1.0.0 Author: Jager <[email protected]> #
# For more information please visit https://zhang.ge/5117.html #
#-----------------------------------------------------------------#
# Copyright ©2016 zhang.ge. All rights reserved. #
###################################################################
isDel=n
args=$#
isDel=${!args}
# 设置压缩包解压密码
mypassword=123456
test -f /etc/profile && . /etc/profile >/dev/null 2>&1
baseDir=$(cd $(dirname $0) && pwd)
zip --version >/dev/null || yum install -y zip
ZIP=$(which zip)
TODAY=`date +%u`
PYTHON=$(which python)
MYSQLDUMP=$(which mysqldump)
# coscmd 工具上传函数
uploadToCOS()
{
file=$2
domain=$1
file_name=$(basename $2)
coscmd upload $file $domain/$file_name
if [[ $? -eq 0 ]] && [[ "$isDel" == "y" ]]
then
test -f $2 && rm -f $2
fi
}
printHelp()
{
clear
printf '
=====================================Help infomation=========================================
1. Use For Backup database:
The $1 must be [db]
$2: [domain]
$3: [dbname]
$4: [mysqluser]
$5: [mysqlpassword]
$6: [back_path]
$7: [isDel]
For example:./backup.sh db zhang.ge zhangge_db zhangge 123456 /home/wwwbackup/zhang.ge
2. Use For Backup webfile:
The $1 must be {file}:
$2: [domain]
$3: [site_path]
$4: [back_path]
$5: [isDel]
For example:./backup.sh file zhang.ge /home/wwwroot/zhang.ge /home/wwwbackup/zhang.ge
=====================================End of Hlep==============================================
'
exit 0
}
backupDB()
{
domain=$1
dbname=$2
mysqluser=$3
mysqlpd=$4
back_path=$5
test -d $back_path || (mkdir -p $back_path || echo "$back_path not found! Please CheckOut Or feedback to zhang.ge..." && exit 2)
cd $back_path
#如果是要备份远程 MySQL,则修改如下语句中 localhost 为远程 MySQL 地址
$MYSQLDUMP -hlocalhost -u$mysqluser -p$mysqlpd $dbname --skip-lock-tables --default-character-set=utf8 >$back_path/$domain\_db_$TODAY\.sql
test -f $back_path/$domain\_db_$TODAY\.sql || (echo "MysqlDump failed! Please CheckOut Or feedback to zhang.ge..." && exit 2)
$ZIP -P$mypassword -m $back_path/$domain\_db_$TODAY\.zip $domain\_db_$TODAY\.sql && \
uploadToCOS $domain $back_path/$domain\_db_$TODAY\.zip
}
backupFile()
{
domain=$1
site_path=$2
back_path=$3
test -d $site_path || (echo "$site_path not found! Please CheckOut Or feedback to zhang.ge..." && exit 2)
test -d $back_path || (mkdir -p $back_path || echo "$back_path not found! Please CheckOut Or feedback to zhang.ge..." && exit 2)
test -f $back_path/$domain\_$TODAY\.zip && rm -f $back_path/$domain\_$TODAY\.zip
$ZIP -P$mypassword -9r $back_path/$domain\_$TODAY\.zip $site_path && \
uploadToCOS $domain $back_path/$domain\_$TODAY\.zip
}
while [ $1 ]; do
case $1 in
'--db' | 'db' )
backupDB $2 $3 $4 $5 $6
exit
;;
'--file' | 'file' )
backupFile $2 $3 $4
exit
;;
* )
printHelp
exit
;;
esac
done
printHelp
②、使用方法
将上述代码作如下修改:
I、根据实际情况修改上述代码中的 COS 上传函数代码,比如密钥对和 Bucket 名称(参考前文)
II、替换代码中的 mypassword=123456 为自己设置的压缩包密码,不修改的话压缩文件解压密码为 123456
然后,将代码保存为 backup.sh,上传到服务器,比如 /data/backup.sh,最后如下添加定时任务:
#编辑 crontab
[[email protected]AlyServer ~]# crontab -e
#然后添加如下内容:
#备份数据库(参数依次为:db、域名、数据库名称、数据库用户名、对应密码、备份路径 [可选:y 删除本地压缩包])
10 3 * * * bash /data/backup.sh db zhang.ge zhangge root 123456 /home/wwwbackup/zhang.ge > /dev/null 2>&1
#备份网站文件(参数依次为:file、域名、网站根目录、备份路径 [可选:y 删除本地压缩包])
15 3 * * * bash /data/backup.sh file zhang.ge /home/wwwroot/zhang.ge /home/wwwbackup/zhang.ge >/dev/null 2>&1
#按下键盘 esc,输入 :wq 保存 crontab 即可
本文就不赘述 7 天循环备份脚本的功能和更详细的使用方法了,若还是不清楚请参考前文:Linux/vps 本地七天循环备份和七牛远程备份脚本
全部完成后,就能实现本地 7 天循环备份和 COS 远程备份了!如果,之前已经做了七牛远程备份的可以放心取消了。
之前有朋友留言说能否自动删除已上传的文件呢?这次修改简单的加入了一个是否删除的功能:只需要在脚本执行的最后追加一个 y 参数,成功上传到 COS 后就会自动删除本次备份的压缩包了(看不懂的慎用)。
在文章的最后,为了方便广大代码小白朋友,特提供本文涉及脚本的打包下载:
五、幕后花絮
在折腾 SDK 的时候,第一眼其实被腾讯云的说明文档虐到了:
只说了如何安装 SDK 插件,然后直接来个 def 函数,然后就没然后了,到底如何 import 这个 SDK?一脸懵逼。。。
最后在 github 的 simple.py 中才找到了完整的 DEMO:
https://github.com/tencentyun/cos-python-sdk/blob/3.3/sample.py
在这懵逼期间,我甚至用上了腾讯云做好的本地迁移工具,实际也是非常好用,简单配置下就能在后台定时上传更新的文件到 COS 了:
篇幅有限,这里就不深入介绍了,除此之外,COS 还提供了其他非常实用的工具,比如 FTP 工具、七牛以及 OSS 迁移工具等,感兴趣的朋友只需要看下 官方文档 就会弄了!
好了,折腾吧,骚年!好用的话,有钱的可以打赏,没钱的欢迎点赞,不怕一万多,不嫌一块少。。。
update.itxueguan.com,将你的腾讯云和我用了qshell来备份七牛做到一起了
666
你可以再集成下阿里云的,我博客也有代码
阿里云的不免费啊!
可以作为可选项目,比如阿里云的服务器用阿里云的备份肯定是最快最稳定的,我记得是9块钱一年40G吧,挺便宜了。
我去看了下还真是40G一年9块,回头搞测试去
你这高手,来一起完善啊!
Python的SDK更新了,得用pip install qcloud_cos_v4,要不然会报ERROR_PROXY_AUTH_FAILED
这个已经更新过了,可能你看到了缓存文章
查看了你的文章我自己搞了搞,发现有点问题也讲得比较繁琐,出于无奈,自己用博主的代码修改了一下,特意贴出来,给有需要的人。[color=red]创建腾讯云COS开通对象存储服务时必须选择华东[/color]
可以跟博主一样 新建成,cos.upload.py然后下面是备份网站数据和MySQL的代码
备份MySQL
是不是比Jager大神的要简单一写呢!
我的文章要是你这么简洁,你确定能看得懂?环境不安装的话,你这脚本根本跑不起来,而且你这个备份从头至尾只是一个文件,文章最有价值的7天循环理念就被你丢弃了。另外,谁说只能选华东了? region = "shanghai" 这个参数是摆看的么。。。
站长,问题来了,看了第一个的,里面的appid secret_id等对应的信息完全不知道填在什么地方,不知道替换方括号里面对应的阿拉伯数字1 2 3 4 5 6呢还是上传认证下的appid secret_id secret_key等,,,我这样类型改的.. appid = int(sys.argv[1008611])
secret_id = sys.argv[AKIDninFqZwfjRH2GC].decode('utf-8')
secret_key = sys.argv[rXg186666FOzyN6YepI1].decode('utf-8')
bucket = sys.argv[niaoge2094].decode('utf-8')
else:
print("Example: python %s appid secret_id secret_key Bucket bucket的名字 /data/backup.zip" % sys.argv[0])
exit()是修改这个吧高手?
你还真是新手中的新手。。。
修改第四部分--定时备份中的【①、适合COS七天循环备份脚本】,第26行
$PYTHON $baseDir/cos.upload.py appID 认证KEY 认证密钥 Bucket名称 $1 $2
改为:
请问博主,也就是说必须要先弄上传脚本然后在弄定时备份脚本才行对吧?我以为直接弄上传脚本就好了诶,这个弄了一周了,简单的备份还是没搞懂,有点晕乎乎的,主要用ftp从服务器上传到cos是走外网,有点懵,谢谢博主指教了啊。这类的在网上找了不下50遍,没基础的不看视频只看文档还真不好搞,
大神,我还是有点懵逼,能求教下我现在应该学什么东西吗?我愿意花一周的时间来学习够用来做好这个cos实时备份的知识,就是无从下口,看了几个别人录制的python基础课程,完全懵逼中
认真按照文章每一步做一遍,肯定能搞定。
感谢
签到成功!签到时间:下午4:52:13,每日签到,生活更精彩哦~
签到成功!签到时间:下午4:21:47,每日签到,生活更精彩哦~
博主用阿里oss是不是要买流量包,