全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
123
返回列表 发新帖
楼主: Mr.Xu

[Windows VPS] 网站备份问题

[复制链接]
发表于 2020-6-2 23:12:38 来自手机 | 显示全部楼层
sqlite就是一个文件啊。。和程序一起打包不就完了。。。
 楼主| 发表于 2020-6-2 23:18:07 | 显示全部楼层
testsun 发表于 2020-6-2 23:01
SQLite。。。不是直接拷贝文件嘛?

不会玩啊呜呜,我去看看wiki
发表于 2020-6-2 23:33:56 | 显示全部楼层
你可以把宝塔的备份脚本copy下来
发表于 2020-6-3 11:21:44 | 显示全部楼层
  1. #!/usr/bin/env bash
  2. #修改来自 https://github.com/teddysun/lamp

  3. #crontab #[-u username] 省默认当前用户的crontab
  4. # -e      (编辑工作表)
  5. # -l      (列出工作表里的命令)
  6. # -r      (删除工作作)

  7. # crontab的命令构成为 时间表达式 动作
  8. #六个 * 分别表示 分、时、日、月、周
  9. # * 取值范围内的所有数字
  10. # / 每过多少个数字
  11. # - 从X到Z
  12. # ,散列数字

  13. [[ $EUID -ne 0 ]] && echo "错误: 脚本必须以 root 权限运行!" && exit 1

  14. ########## 配置开始 ##########

  15. #是否开启加密
  16. ENCRYPT_**=true

  17. #加密密码
  18. BACKUP_PASS="xxxx"

  19. #---------------------------------------------------------------

  20. #是否删除远程备份中超过保留天数的文件
  21. DELETE_REMOTE_FILE_**=true

  22. #备份保留天数
  23. LOCAL_AGE_DAILIES="7"

  24. #---------------------------------------------------------------

  25. #备份本地存放目录
  26. LOCAL_DIR="/opt/bitwarden/backup/data/"

  27. #临时目录
  28. TEMP_DIR="/opt/bitwarden/backup/temp/"

  29. #日志文件路径
  30. LOG_FILE="/opt/bitwarden/backup/backup.log"

  31. #----------------------------------------------------------------

  32. #要备份的目录或文件列表
  33. BACKUP[0]="/opt/bitwarden/data/"

  34. #要排除的目录或文件列表
  35. EXCLUDE[0]="/opt/bitwarden/data/db.sqlite3" #防止文件损坏, 不直接备份文件,而是通过sqlite3来导出备份

  36. #---------------------------------------------------------------

  37. #是否备份mysql
  38. MYSQL_**=true

  39. #mysqsl数据库密码
  40. MYSQL_ROOT_PASSWORD=""

  41. #mysqsl要备份的数据库名, 留空备份整个数据库
  42. MYSQL_DATABASE_NAME[0]=""

  43. #---------------------------------------------------------------

  44. #是否备份sqlite
  45. SQLITE_**=true

  46. #要备份的SQLite数据库路径
  47. SQLITE_DATABASE_PATH="/opt/bitwarden/data/db.sqlite3"

  48. #-----------------------------------------------------------------

  49. #是否上传到 Rclone
  50. RCLONE_**=true

  51. #Rclone 远程仓库名
  52. RCLONE_NAME="bitwarden"

  53. #Rclone 远程仓库名文件夹
  54. RCLONE_FOLDER=""

  55. #-----------------------------------------------------------------

  56. #是否上传到 FTP
  57. FTP_**=true

  58. #FTP主机名
  59. FTP_HOST=""

  60. #FTP用户名
  61. FTP_USER=""

  62. #FTP密码
  63. FTP_PASS=""

  64. #FTP目录
  65. FTP_DIR=""

  66. ########## 配置结束 ##########

  67. # 重定向所有错误到日志
  68. exec 2>>$LOG_FILE
  69. # 日期和时间
  70. DAY=$(date +%d)
  71. MONTH=$(date +%m)
  72. YEAR=$(date +%C%y)
  73. BACKUP_DATE=$(date +%Y%m%d%H%M%S)
  74. # 备份到目标文件
  75. TAR_FILE="${LOCAL_DIR}""$(hostname)"_"${BACKUP_DATE}".tgz
  76. #加密备份到目标文件
  77. ENC_TARFILE="${TAR_FILE}.enc"
  78. #mysql导出到目标文件
  79. SQL_FILE="${TEMP_DIR}mysql_${BACKUP_DATE}.sql"
  80. #sqlite导出到目标文件
  81. SQLITE_FILE="${TEMP_DIR}dump_${BACKUP_DATE}.sqlite3"

  82. log() {
  83.     echo "$(date "+%Y-%m-%d %H:%M:%S")" "$1"
  84.     echo -e "$(date "+%Y-%m-%d %H:%M:%S")" "$1" >> ${LOG_FILE}
  85. }

  86. # 检测依赖命令是否满足
  87. check_commands() {
  88.     #依赖的命令列表
  89.     BINARIES=( cat cd du date dirname echo pwd rm tar)

  90.     ${RCLONE_**} && BINARIES=(${BINARIES[*]} rclone)

  91.     ${SQLITE_**} && BINARIES=(${BINARIES[*]} sqlite3)

  92.     ${MYSQL_**} && BINARIES=(${BINARIES[*]} mysql mysqldump)  

  93.     ${ENCRYPT_**} && BINARIES=(${BINARIES[*]} openssl)

  94.     ${FTP_**} && BINARIES=(${BINARIES[*]} ftp)
  95.      

  96.      #循环判断
  97.     for BINARY in "${BINARIES[@]}"; do
  98.         # if [ ! "$(command -v "$BINARY")" ]; then
  99.             # log "$BINARY 没有安装, 请安装后再试"
  100.             # exit 1
  101.         # fi
  102.         command -v ${BINARY} >/dev/null 2>&1 || { log "${BINARY} 没有安装, 请安装后再试"; exit 1; }
  103.     done
  104. }

  105. #计算文件大小
  106. calculate_size() {
  107.     local file_name=$1
  108.     local file_size=$(du -h $file_name 2>/dev/null | awk '{print $1}')
  109.     if [ "x${file_size}" = "x" ]; then
  110.         echo "未知"
  111.     else
  112.         echo "${file_size}"
  113.     fi
  114. }


  115. mysql_backup() {
  116.     if ${MYSQL_**}; then
  117.         [ -z "${MYSQL_ROOT_PASSWORD}" ] && log "错误: MySQL 管理员密码不能为空" && exit 1
  118.         log "MySQL 开始导出"
  119.         mysql -u root -p"${MYSQL_ROOT_PASSWORD}" 2>/dev/null <<EOF
  120. exit
  121. EOF
  122.         if [ $? -ne 0 ]; then
  123.             log "MySQL 管理员密码不正确, 请检查后再试"
  124.             exit 1
  125.         fi
  126.         if [ "${MYSQL_DATABASE_NAME[*]}" == "" ]; then
  127.             mysqldump -u root -p"${MYSQL_ROOT_PASSWORD}" --all-databases > "${SQL_FILE}" 2>/dev/null
  128.             if [ $? -ne 0 ]; then
  129.                 log "备份整个 MySQL 数据库失败"
  130.                 exit 1
  131.             fi
  132.             log "MySQL 全部的数据导出到: ${SQL_FILE}"
  133.             #添加导出的文件路径到备份包含路径
  134.             BACKUP=(${BACKUP[*]} ${SQL_FILE})
  135.         else
  136.             for db in ${MYSQL_DATABASE_NAME[*]}; do
  137.                 unset DBFILE
  138.                 DBFILE="${TEMP_DIR}${db}_${BACKUP_DATE}.sql"
  139.                 mysqldump -u root -p"${MYSQL_ROOT_PASSWORD}" ${db} > "${DBFILE}" 2>/dev/null
  140.                 if [ $? -ne 0 ]; then
  141.                     log "MySQL 数据库 [${db}] 备份失败 请检测数据库名是否正确"
  142.                     exit 1
  143.                 fi
  144.                 log "MySQL 数据库 [${db}] 导出到: ${DBFILE}"
  145.                 #添加导出的文件路径到备份包含路径
  146.                 BACKUP=(${BACKUP[*]} ${DBFILE})
  147.             done
  148.         fi
  149.         log "MySQL 数据导出完成"
  150.     fi
  151. }


  152. sqlite_backup() {
  153.     if ${SQLITE_**}; then
  154.         [ ! -f "${SQLITE_DATABASE_PATH}" ] && log "错误: ${SQLITE_DATABASE_PATH} 不是一个文件或文件不存在" && exit 1
  155.         log "SQLite 开始导出"
  156.         sqlite3 ${SQLITE_DATABASE_PATH} ".backup '${SQLITE_FILE}'" 2>/dev/null
  157.         if [ $? -ne 0 ]; then
  158.                 log "错误: 请检查 ${SQLITE_DATABASE_PATH} 否是一个合法的SQLite文件"
  159.                 exit 1
  160.         fi
  161.         log "${SQLITE_DATABASE_PATH} 导出到: ${SQLITE_FILE}"
  162.         #添加导出的文件路径到备份包含路径
  163.         BACKUP=(${BACKUP[*]} ${SQLITE_FILE})
  164.     fi
  165. }

  166. start_backup() {
  167.     [ "${BACKUP[*]}" == "" ] && echo "错误: 要备份的路径不能为空!" && exit 1
  168.    
  169.     #排除的路径列表
  170.     excludeList=''
  171.     for ex in ${EXCLUDE[*]}; do
  172.         excludeList="${excludeList}--exclude=${ex} "
  173.     done

  174.     log "tar 开始打包"
  175.     log "排除路径: ${EXCLUDE[*]}"
  176.     log "包括路径: ${BACKUP[*]}"
  177.     tar -zcPf ${TAR_FILE} ${excludeList} ${BACKUP[*]}
  178.     if [ $? -gt 1 ]; then
  179.         log "tar 备份失败"
  180.         exit 1
  181.     fi
  182.     log "tar 打包结束"

  183.     if ${ENCRYPT_**}; then
  184.         log "开始加密打包的文件"
  185.         openssl enc -aes256 -in "${TAR_FILE}" -out "${ENC_TARFILE}" -pass pass:"${BACKUP_PASS}" -md sha1
  186.         if [ $? -ne 0 ]; then
  187.             log "错误: 备份文件加密失败"
  188.             exit 1
  189.         fi
  190.         log "打包的文件加密完成"

  191.         log "删除未加密的打包文件: ${TAR_FILE}"
  192.         rm -f ${TAR_FILE}
  193.     fi

  194.     if ${MYSQL_**}; then
  195.         for sql in $(ls ${TEMP_DIR}*.sql); do
  196.             log "删除 MySQL 临时导出文件: ${sql}"
  197.             rm -f ${sql}
  198.         done
  199.     fi
  200.    
  201.     if ${SQLITE_**}; then
  202.         for sqli in $(ls ${TEMP_DIR}*.sqlite3); do
  203.             log "删除 SQLite 临时导出文件: ${sqli}"
  204.             rm -f ${sqli}
  205.         done
  206.     fi

  207.     if ${ENCRYPT_**}; then
  208.         OUT_FILE="${ENC_TARFILE}"
  209.     else
  210.         OUT_FILE="${TAR_FILE}"
  211.     fi
  212.     log "最终文件: ${OUT_FILE} 文件大小: $(calculate_size ${OUT_FILE})"
  213. }


  214. rclone_upload() {
  215.     if ${RCLONE_**}; then
  216.         [ -z "${RCLONE_NAME}" ] && log "rclone 错误: RCLONE_NAME 不能为空!" && return 1
  217.         if [ -n "${RCLONE_FOLDER}" ]; then
  218.             rclone ls ${RCLONE_NAME}:${RCLONE_FOLDER} 2>&1 > /dev/null
  219.             if [ $? -ne 0 ]; then
  220.                 log "rclone 创建目录 ${RCLONE_NAME}:${RCLONE_FOLDER}"
  221.                 rclone mkdir ${RCLONE_NAME}:${RCLONE_FOLDER}
  222.             fi
  223.         fi
  224.         log "rclone 正在上传: ${OUT_FILE} 到 ${RCLONE_NAME}:${RCLONE_FOLDER}"
  225.         rclone copy ${OUT_FILE} ${RCLONE_NAME}:${RCLONE_FOLDER} >> ${LOG_FILE}
  226.         if [ $? -ne 0 ]; then
  227.             log "rclone 上传: ${OUT_FILE} 到 ${RCLONE_NAME}:${RCLONE_FOLDER} 错误"
  228.             return 1
  229.         fi
  230.         log "rclone 上传: ${OUT_FILE} 到 ${RCLONE_NAME}:${RCLONE_FOLDER} 完成"
  231.     fi
  232. }

  233. ftp_upload() {
  234.     if ${FTP_**}; then
  235.         [ -z "${FTP_HOST}" ] && log "ftp 错误: FTP_HOST 不能 为空" && return 1
  236.         [ -z "${FTP_USER}" ] && log "ftp 错误: FTP_USER 不能 为空" && return 1
  237.         [ -z "${FTP_PASS}" ] && log "ftp 错误: FTP_PASS 不能 为空" && return 1
  238.         [ -z "${FTP_DIR}" ] && log "ftp 错误: FTP_DIR 不能 为空" && return 1
  239.         local FTP_OUT_FILE=$(basename ${OUT_FILE})
  240.         log "ftp 备份文件: ${FTP_OUT_FILE} 到 FTP 服务器"
  241.         ftp -in ${FTP_HOST} 2>&1 >> ${LOG_FILE} <<EOF
  242. user $FTP_USER $FTP_PASS
  243. binary
  244. lcd $LOCAL_DIR
  245. cd $FTP_DIR
  246. put $FTP_OUT_FILE
  247. quit
  248. EOF
  249.         if [ $? -ne 0 ]; then
  250.             log "ftp 备份文件: ${FTP_OUT_FILE} 到 FTP 服务器 错误"
  251.             return 1
  252.         fi
  253.         log "ftp 备份文件: ${FTP_OUT_FILE} 到 FTP 服务器 完成"
  254.     fi
  255. }
复制代码

字数超过, 接楼下
发表于 2020-6-3 11:22:51 | 显示全部楼层
本帖最后由 tkn 于 2020-6-3 11:26 编辑

接楼上
  1. get_file_date() {
  2.     #Approximate a 30-day month and 365-day year
  3.     DAYS=$(( $((10#${YEAR}*365)) + $((10#${MONTH}*30)) + $((10#${DAY})) ))
  4.     unset FILEYEAR FILEMONTH FILEDAY FILEDAYS FILEAGE
  5.     FILEYEAR=$(echo "$1" | cut -d_ -f2 | cut -c 1-4)
  6.     FILEMONTH=$(echo "$1" | cut -d_ -f2 | cut -c 5-6)
  7.     FILEDAY=$(echo "$1" | cut -d_ -f2 | cut -c 7-8)
  8.     if [[ "${FILEYEAR}" && "${FILEMONTH}" && "${FILEDAY}" ]]; then
  9.         #Approximate a 30-day month and 365-day year
  10.         FILEDAYS=$(( $((10#${FILEYEAR}*365)) + $((10#${FILEMONTH}*30)) + $((10#${FILEDAY})) ))
  11.         FILEAGE=$(( 10#${DAYS} - 10#${FILEDAYS} ))
  12.         return 0
  13.     fi
  14.     return 1
  15. }

  16. #删除 rclone 中过期备份文件
  17. delete_rclone_file() {
  18.     local FILENAME=$1
  19.     if ${DELETE_REMOTE_FILE_**} && ${RCLONE_**}; then
  20.         rclone ls ${RCLONE_NAME}:${RCLONE_FOLDER}/${FILENAME} 2>&1 > /dev/null
  21.         if [ $? -eq 0 ]; then
  22.             rclone delete ${RCLONE_NAME}:${RCLONE_FOLDER}/${FILENAME} >> ${LOG_FILE}
  23.             if [ $? -eq 0 ]; then
  24.                 log "rclone ${RCLONE_NAME}:/${RCLONE_PATH} 大于${LOCAL_AGE_DAILIES}天前的旧备份文件: ${FILENAME} 已删除"
  25.             else
  26.                 log "rclone ${RCLONE_NAME}:/${RCLONE_PATH} 大于${LOCAL_AGE_DAILIES}天前的旧备份文件: ${FILENAME} 删除失败"
  27.             fi
  28.         else
  29.             log "rclone ${RCLONE_NAME}:/${RCLONE_PATH} 大于${LOCAL_AGE_DAILIES}天前的旧备份文件: ${FILENAME} 不存在"
  30.         fi
  31.     fi
  32. }

  33. # 删除 ftp 中过期备份文件
  34. delete_ftp_file() {
  35.     local FILENAME=$1
  36.     if ${DELETE_REMOTE_FILE_**} && ${FTP_**}; then
  37.         ftp -in ${FTP_HOST} 2>&1 >> ${LOG_FILE} <<EOF
  38. user $FTP_USER $FTP_PASS
  39. cd $FTP_DIR
  40. del $FILENAME
  41. quit
  42. EOF
  43.         if [ $? -eq 0 ]; then
  44.             log "ftp 大于${LOCAL_AGE_DAILIES}天前的旧备份文件: ${FILENAME} 已删除"
  45.         else
  46.             log "ftp 大于${LOCAL_AGE_DAILIES}天前的旧备份文件: ${FILENAME} 删除失败"
  47.         fi
  48.     fi
  49. }

  50. #删除过期文件
  51. clean_up_files() {
  52.     cd ${LOCAL_DIR} || return 1
  53.     if ${ENCRYPT_**}; then
  54.         LS=($(ls *.enc))
  55.     else
  56.         LS=($(ls *.tgz))
  57.     fi
  58.     for f in ${LS[@]}; do
  59.         get_file_date ${f}
  60.         if [ $? -eq 0 ]; then
  61.             if [[ ${FILEAGE} -gt ${LOCAL_AGE_DAILIES} ]]; then
  62.                 rm -f ${f}
  63.                 log "本地 大于${LOCAL_AGE_DAILIES}天前的旧备份文件: ${f} 已删除"
  64.                 delete_rclone_file ${f}
  65.                 delete_ftp_file ${f}
  66.             fi
  67.         fi
  68.     done
  69. }

  70. #主进程
  71. STARTTIME=$(date +%s)

  72. #检测备份目录和临时目录是否存在和可写
  73. [ ! -d "${LOCAL_DIR}" ] && mkdir -p ${LOCAL_DIR}
  74. [ ! -d "${TEMP_DIR}" ] && mkdir -p ${TEMP_DIR}

  75. log "备份开始"
  76. check_commands
  77. mysql_backup
  78. sqlite_backup
  79. start_backup
  80. log "备份结束"

  81. log "上传开始"
  82. rclone_upload
  83. ftp_upload
  84. log "上传结束"

  85. log "清理过期文件"
  86. clean_up_files
  87. ENDTIME=$(date +%s)
  88. DURATION=$((ENDTIME - STARTTIME))
  89. log "操作耗时 ${DURATION} 秒"
  90. exit 0
复制代码

这是我从lamp修改用来备份bitwarden的, 可以备份mysql sqlite 和直接备份多个文件或文件夹, 可以设置排除多个文件或文件夹, sqlite数据不重要的话可以直接备份文件即可, 重要文件才需要安全的dump后再备份

我擦, 怎么F L G也屏蔽, 变成**了
 楼主| 发表于 2020-6-3 12:07:25 | 显示全部楼层
tkn 发表于 2020-6-3 11:22
接楼上

这是我从lamp修改用来备份bitwarden的, 可以备份mysql sqlite 和直接备份多个文件或文件夹, 可以设 ...

辛苦大佬了!十分感谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2024-5-4 01:11 , Processed in 0.080795 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表