从备份数据中恢复脚本

recover.sh
backup.sh脚本备份后的数据进行恢复(恢复前需先确保已部署系统)

#!/bin/bash

#---------------------------------------
# 从备份数据中恢复OA数据
# author: SenSen 1050575278
# date: 2022/04/13
# 需先创建完oa系统后方可使用
# 注意:所有脚本需测试后方可使用!!!
#---------------------------------------

read -p "Warning! Enter 'recover' to continue : " input

if [ "$input" == 'recover' ]; then
  oaDir='/web/oa/'
  backDir='/bak_oa/'
  sysDir=`ls /web/oa`

  for f in ${sysDir}
    do
      if [ ! -f "${backDir}${f}.tar.gz" ]; then
        echo "${f}.tar.gz not found" >> /backup/recover.log
        continue
      fi
      curtime=`date +"%Y/%m/%d %H:%M:%S"`
      tar -zxf ${backDir}${f}.tar.gz -C ${oaDir}${f}
      echo "${curtime} ${f} done" >> /backup/recover.log
    done
else
  echo "Error: invalid input"
fi

批量备份数据到指定目录脚本

backup.sh 后期数据量增大可考虑调整为增量备份(指定备份目录)

#!/bin/bash

#---------------------------------------
# 备份oa数据到指定目录下
# author: SenSen 1050575278
# date: 2022/04/13
# todo 调整为增量备份(当前数据量有限,暂不处理)
# 注意:所有脚本需测试后方可使用!!!
#---------------------------------------

#所在目录
dir='/web/oa/'
dist='/bak_oa/'
#指定天开始备份
backDay=(06 14 21 28)
dayNum=`date +"%d"`
#单次备份的oa数量
perNum=10
day=`date +"%Y%m%d"`
dayFile='/backup/'${day}
#自动获取系统目录文件 仅可包含oa系统文件
sysDir=`ls /web/oa`
num=0
tmp=()

for i in "${backDay[@]}"
  do
    if [[ "${i}" == "${dayNum}" ]]; then

      if [ ! -f "${dayFile}" ]; then
        touch ${dayFile}
      fi

      #获取指定数量的未备份oa
      for f in ${sysDir}
        do
          #判断是否今日已执行备份
          if [ `grep -c ${f} ${dayFile}` -eq 0 ];then
            #记入到新数组
            tmp[${num}]=${f}
            ((num++))
            if [ ${num} -eq ${perNum} ]; then
              break
            fi
          fi
        done

      #执行备份
      for f in "${tmp[@]}"
        do
          curtime=`date +"%Y/%m/%d %H:%M:%S"`
          cd ${dir}${f}
          echo "${f}" >> ${dayFile}
          tar -zcf ${dist}/${f}.tar.gz public/uploads/attach public/uploads/seal_apply public/uploads/ueditor public/uploads/work .env
          echo "${curtime} ${f} done" >> /backup/site.log
        done
    fi
  done

批量导入数据库脚本

import.sh
将宝塔面板自动备份的数据库文件批量创建数据库并导入。

#!/bin/bash

#---------------------------------------
# 批量导入数据库
# author: SenSen 1050575278
# date: 2022/03/28
# 注意:所有脚本需测试后方可使用!!!
#---------------------------------------

read -p "Warning! Enter 'y' to continue : " input

#判断是否存在参数,不存在则取消
if [ "$input" == 'y' ] || [ "$input" == 'Y' ]; then

  #连接数据库
  mysqlPath=`which mysql`
  db_con="${mysqlPath} -uroot -pxxx"

  #获取备份数据所在目录
  dir=/backup/mysql/
  cd /backup/mysql

  #自动获取系统目录文件 仅可包含oa系统文件
  sysDir=`ls /backup/mysql`

  for db in ${sysDir}
    do
      #获取db的名字 db_t002_20220327_223004.sql.gz
      ext=${db##*.}
      if [ "${ext}" != "sql" ]; then
        dbName=${db:3:4}
        sqlName=${db:0:27}
        gzip -d ${db}
        ${db_con} -e "create database ${dbName} default character set utf8mb4 default collate utf8mb4_general_ci;"
        ${db_con} -e "use ${dbName}; source ${dir}${sqlName};"
        echo "${dbName} done" >> import.txt
      fi
    done
else
  echo "Error: invalid input"
fi

批量替换文件内容脚本

sed.sh
脚本功能:可批量对系统中指定文件替换内容

#!/bin/bash

#---------------------------------------
# 批量替换文件内容
# author: SenSen 1050575278
# date: 2022/03/28
# 注意:所有脚本需测试后方可使用!!!
#---------------------------------------

read -p "Warning! Enter 'y' to continue : " input

#判断是否存在参数,不存在则取消
if [ "$input" == 'y' ] || [ "$input" == 'Y' ]; then
  #所在目录
  dir='/web/oa/'

  #自动获取系统目录文件 仅可包含oa系统文件
  sysDir=`ls /web/oa`

  #排除目录
  excluded=()

  for f in ${sysDir}
    do
      #获取当前时间
      curtime=`date +"%Y/%m/%d %H:%M:%S"`

      #排除指定目录
      if [[ ${excluded[@]/${f}/} != ${excluded[@]} ]]; then
        echo "jump"
        continue
      fi

      #进入目录
     cd ${dir}${f}
     #备份
     cp .env .env.bak
     #执行对应操作
     #sed -i "8s/127.0.0.1/localhost/" .env

      echo "${curtime} ${f} done"
    done
else
  echo "Error: invalid input"
fi

github利用webhooks实现自动部署

基础流程:
提交代码到github -> github通知服务器 -> 服务器执行脚本拉取

服务器软件安装:yumgitgo

安装go
yum install -y golang

安装webhook
go get github.com/adnanh/webhook
注:需配置代理,参考:https://goproxy.cn/

系统部署位置拉取源码,如/www/wwwroot/下拉取test项目;
创建/www/wwwroot/hooks.json文件;

[
  {
    "id": "deploy",
    "execute-command": "./deploy.sh",
    "command-working-directory": "/www/wwwroot/"
  }
]

新建/www/wwwroot/deploy.sh脚本并添加执行权限

#! /bin/bash
cd /root/test/test
git pull

执行nohup /root/go/bin/webhook -hooks hooks.json -verbose >log.txt 2>&1&

浏览器访问http://ip:9000/hooks/deploy
注:需放行服务器、宝塔等9000端口

配置github

efdeb620c034929c3faf51f6a12e6a5d.png

json_last_error 返回JSON 编码解码时发生的错误

程序中使用json_encode($data, 320)对数据进行编码时返回false,通过打印json_last_error()方法返回错误为5
经查由于客户手机号中包含汉字,隐藏手机号中间位方法中包含substr_replace函数,对中文不友好导致。

json_last_error返回值:

微信截图_20220309175643.png

0 = JSON_ERROR_NONE
1 = JSON_ERROR_DEPTH
2 = JSON_ERROR_STATE_MISMATCH
3 = JSON_ERROR_CTRL_CHAR
4 = JSON_ERROR_SYNTAX
5 = JSON_ERROR_UTF8

线上服务器硬盘安装LVM

LVM安装及使用:https://www.r1989.com/linux-1222.html

线上服务器硬盘由标准分区转为LVM

  1. 使用宝塔备份数据库
  2. 停止nginx mysql php
  3. mkdir /{web_bak,mysql_bak,backup_bak}
  4. 转移/web目录文件到/web_bak;转移/mysql目录到/mysql_bak;转移/backup目录到/backup_bak
  5. 执行转移命令:

    rsync -avzh /mysql/* /mysql_bak/
    rsync -avzh /backup/* /backup_bak/

    rsync -avzh /web/shell /web_bak/
    rsync -avzh /web/source /web_bak/
    rsync -avzh /web/upgrade /web_bak/
    rsync -avzh /web/www /web_bak/

    建议同时进行4个拷贝:
    rsync -avzh /web/oa/t0* /web_bak/oa/
    ......

LVM安装流程:

  1. 安装lvm并将vdc转为逻辑分区

    yum install lvm2
    lsblk
    vim /etc/fstab 注释vdc硬盘挂载

  2. 检查三个分区数据是否均已转换完成
  3. 卸载

    umount /backup
    umount /mysql
    umount /web

  4. 转lvm

    fdisk /dev/vdc
    [n -> p -> ...] t -> {1,2,3} -> 8e ->w
    fdisk -lu

    pvcreate /dev/vdc{1,2,3}

    vgcreate lv /dev/vdc1 默认PE为4M( -s 32M lvm1默认lv最多只能包含65536个PE,最大支持256G;lvm2不再限制PE数量)
    vgextend lv /dev/vdc2
    vgextend lv /dev/vdc3

    lvcreate -L 80G -n mysql lv
    lvcreate -L 20G -n backup lv
    vgdisplay
    lvcreate -l 100%FREE -n web lv

    mkfs -t ext4 /dev/lv/backup
    mkfs -t ext4 /dev/lv/mysql
    mkfs -t ext4 /dev/lv/web

    ;resize2fs /dev/lv/backup
    ;resize2fs /dev/lv/mysql
    ;resize2fs /dev/lv/web

    ;mount /dev/lv/backup /backup
    ;mount /dev/lv/mysql /mysql
    ;mount /dev/lv/web /web

    vim /etc/fstab
    /dev/lv/mysql /mysql ext4 defaults 0 0
    /dev/lv/backup /backup ext4 defaults 0 0
    /dev/lv/web /web ext4 defaults 0 0

    mount -a

  5. 数据还原

    rsync -avzh /backup_bak/* /backup/
    rsync -avzh /mysql_bak/* /mysql/

    rsync -avzh /web_bak/shell /web/
    rsync -avzh /web_bak/source /web/
    rsync -avzh /web_bak/upgrade /web/
    rsync -avzh /web_bak/www /web/

    具体依据实际情况转移:
    rsync -avzh /web_bak/oa/t0* /web/oa/
    ......


转移100个系统用时:约40分钟

测试backup分区
`lvreduce -L -4G -r /dev/lv/backup`
`lvextend -L +4G -r /dev/lv/backup`

  1. 检查数据是否完整转移
  2. reboot
  3. 启动各服务