本站的部署方案与数据库备份方案

2020年03月29日

借助npm的scripts功能,添加了npm run deploy脚本命令,而不是在每次发布前先敲git pull 然后npm install,等到install完然后在build,或者npm run serve等等。现在只需要npm run deploy便可自动运行发布的命令流程。

shell脚本代码

#!/bin/bash

echo "拉取代码..."
git reset --hard origin/master
git clean -f
git pull
git checkout master
echo "开始安装依赖..."
npm install
echo "依赖安装结束..."
echo "开始构建..."
npm run build
echo "构建结束 开始启动服务"
pm2 restart blog-static
echo "服务重启完毕."

当然这段shell脚本是针对各自的项目的有一定的局限性,不是真正的devops。这样就减少了很多手敲命令的工作量,自己也很开心,只要等待屏幕输出服务发布成功就可以了。

npm scripts

 "deploy": "sh .deploy/deploy.sh"

定时备份数据库并邮件通知备份结果

数据库的备份功能这次也一并加上了,我采取了一个并不可行的可行方案,把数据库备份到项目的data文件夹下然后自动git提交到项目仓库。说实话这种方案并不好,没有回滚机制,也没有独立的服务空间储存。因为是个人的独立项目所以就不需要考虑这么多了,图个方便和管用~

备份代码

使用shelljs来完成shell命令

const shell = require('shelljs')
exports.dbBackup = cb => {
  const backupPath = './data'
  let backupCommand = `mongodump -h 127.0.0.1 -d blog -o ${backupPath}`
  if (shell.exec(backupCommand).code !== 0) {
    shell.echo('Error: 备份数据失败')
    cb({
      msg: '备份失败!'
    })
    shell.exit(1)
  }
  shell.exec('git add .')
  shell.exec(`git commit -m '数据库自动备份: ${new Date()}'`)
  shell.exec('git push')
  cb(null)
}

定时任务

const schedule = require('node-schedule')
const { dbBackup } = require('../helper/dbHelper')
const { sendMail } = require('../helper/email')
function dbBackupSchedule() {
  // 0 0 0 * * 1
  schedule.scheduleJob('0 0 23 * * *', function() {
    dbBackup(function(err) {
      if (!err) {
        let infoHtml = `<p>数据库备份成功:${new Date()}</p>`
        sendMail(infoHtml)
      } else {
        let infoHtml = `<p>数据库备份失败:${new Date()}</p>`
        sendMail(infoHtml,'数据库备份失败')
      }
    })
  })
}

dbBackupSchedule()

邮件发送

const nodemailer = require('nodemailer')
const { emailConfig } = require('../config/config')
let transporter = nodemailer.createTransport({
  host: 'smtp.qq.com',
  port: 465, // SMTP 端口
  secureConnection: true, // 使用了 SSL
  auth: {
    user: emailConfig.user,
    pass: emailConfig.pass
  }
})

exports.sendMail = (html='hi',subject='数据库备份成功')=>{
  let mailOptions = {
    from: 'helti@qq.com', // sender address
    to: '2991271712@qq.com', // list of receivers
    subject: subject, // Subject line
    html: html // html body
  }

  transporter.sendMail(mailOptions, (error, info) => {
    if (error) {
      return console.log(error)
    }
  })
}

以上就是本站简单的部署方案与数据备份方案。

1 条评论
ttkit
测试一条评论!
2020年03月30日