由于想要在服务器上登录qq,所以把服务器的系统换成了windows系统。宝塔面板似乎不想支持windows系统(在windows系统上从来没有安装成功过),所以使用了php_study来搭建网站。而在之前使用宝塔面板的时候由于担心服务器跑路,所以使用了宝塔的七牛云备份插件,每天定时备份到七牛云储存。现在换到了windows系统上,需要自己实现一个七牛云备份的功能。
使用node.js进行编写的脚本,执行后可以将数据库导出,并将网站文件夹打包压缩,上传到七牛云,执行完毕后还会进行邮件通知。以下为具体代码,需要手动安装模块,伸手党或使用方法直接看下面
javascript123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122var accessKey = '';
var secretKey = '';
var bucket='';
var sitePath="";
var DBname="";
var DBpwd="";
var mailHost="";
var mailPort=;
var mailUser="";
var mailPwd="";
var mailTo="";
var log='';
const sd = require('silly-datetime');
function addLog(str){
const time=sd.format(new Date(), 'YYYY-MM-DD HH:mm');
log+='['+time+"]"+str+'<br>';
console.log('['+time+"]"+str+'\n');
}
var fs = require('fs');
var path = require('path');
var archiver = require('archiver');
const { toNamespacedPath } = require('path');
function zipFolder(sourceFolder, destZip, subdir) {
// init
var output = fs.createWriteStream(destZip);
var archive = archiver('zip', {
zlib: { level: 9 }
});
// on
output.on('close', function () {
fs.stat("site.zip", function (error, stats) {
addLog("网站文件压缩完毕,压缩文件大小:"+stats.size/1024/1024+'MB');
upLoadSite();
})
});
archive.on('error', function (err) {
addLog("网站文件压缩失败:"+err);
toEnd();
});
// zip
archive.pipe(output);
archive.directory(sourceFolder, subdir ? sourceFolder.substr(path.dirname(sourceFolder).length + 1) : false);
archive.finalize();
}
addLog("备份任务开始执行");
addLog("正在导出数据库");
const childProcess=require('child_process');
let cmd="mysqldump -uroot -p"+DBpwd+" "+DBname+">"+sitePath+"\\database.sql";
addLog("执行命令:"+cmd);
childProcess.exec(cmd,(error, stdout, stderr)=>{
fs.stat(sitePath+"\\database.sql", function (error, stats) {
addLog("数据库大小:"+stats.size/1024+'KB');
addLog("正在打包站点数据");
zipFolder(sitePath,"site.zip",true);
})
});
var qiniu = require('qiniu');
function upLoadSite(){
addLog("准备上传");
var mac = new qiniu.auth.digest.Mac(accessKey, secretKey);
var options = {
scope: bucket+":site.zip",
expires: 18000
};
var putPolicy = new qiniu.rs.PutPolicy(options);
var uploadToken=putPolicy.uploadToken(mac);
var config = new qiniu.conf.Config();
var formUploader = new qiniu.form_up.FormUploader(config);
var putExtra = new qiniu.form_up.PutExtra();
addLog("开始上传");
//toEnd();
//return;
formUploader.putFile(uploadToken, 'site.zip', 'site.zip', putExtra, function (respErr,
respBody, respInfo) {
if (respErr) {
addLog("遇到未知错误");
toEnd();
}
if (respInfo.statusCode == 200) {
addLog("上传完成!");
toEnd();
}else{
addLog("遇到未知错误"+respInfo.statusCode);
toEnd();
}
});
}
const nodemailer = require('nodemailer');
function toEnd(){
let transporter = nodemailer.createTransport({
host: mailHost,
port: mailPort, // SMTP 端口
auth: { //发送者的账户和授权码
user: mailUser, //账户
pass: mailPwd, //smtp授权码,到邮箱设置下获取
}
});
let mailOptions = {
from: '"Gcteamo" <admin@gcteamo.com>', // 发送者昵称和地址
to: mailTo, // 接收者的邮箱地址
subject: '备份任务执行报告', // 邮件主题
html: "<html><body>网站备份任务执行完毕,下面为执行日志<br><br>"+log+"</body></html>"
};
//发送邮件
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
return console.log(error);
}
console.log('邮件发送成功 ID:', info.messageId);
});
//console.log(log);
}
//var mac = new qiniu.auth.digest.Mac(accessKey, secretKey);
你可以直接下载已经把所有依赖的模块安装好的脚本,下载链接:
https://www.aliyundrive.com/s/QqAsBAGfXgv
(由于特殊原因,下载到的文件是图片,你需要把后缀改成.rar,然后将其视为正常的压缩文件解压)
打开解压后文件夹中的 main.js
文件,填写前11行信息,变量名与说明如下:
\\
你的服务器需要安装node.js才能运行脚本。你可以在命令行中输入 node -v
如果出现类似于下面的输出信息,说明你正常安装了node.js
将脚本文件打包上传到服务器后,进入 控制面板/管理工具/计划任务。
在右边选择 创建任务
在最下面勾选这个
设置触发器,在里面填写好任务执行频率
设置操作,按照下面填写
(添加参数中填写脚本的路径)
成功添加
点击旁边的运行,测试一下
如果一切顺利,就可以在大约5分钟后收到任务执行成功的通知邮件