目录

备份服务器数据的脚本

使用方法:

  1. 创建文件 .bakdir
  2. 将需要备份的文件夹或文件路径保存到该文件,如下
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
     /etc/cron.d
     /root/proj
     /root/shfiles
     /root/dockers
     /srv
     /data/wwwroot/default/index.html
     /usr/local/nginx/conf/vhost/
     nginx.conf
     rewrite/
     wildcard/   
    
    文件格式说明:
    1. 绝对的文件路径,使用 / 开头,如 /usr/local/nginx/conf/vhost/
    2. 相对的文件路径时,使用非 / 开头,与上一行同一个父级目录,如:
      1
      2
      3
      
      /usr/local/nginx/conf/vhost/
      nginx.conf
      rewrite
      
      nginx.conf => /usr/local/nginx/conf/nginx.conf
      rewrite => /usr/local/nginx/conf/rewrite
  3. 执行脚本
    1
    2
    3
    4
    5
    
     # 保存到临时文件夹
     bash migrate.sh
    
     # 保存到指定的文件夹
     bash migrate.sh target
    

  • 脚本文件:migrate.sh
#!/usr/bin/env bash

set -euo pipefail

main() {
  sync_path=${1:-}
  
  bak_file=".bakdir"
  if [ ! -f "$bak_file" ]; then
    printf "\n\033[1;31mNot found file:\033[0m %s\n" "$bak_file"
    exit 1
  fi

  if [ -d "$sync_path" ]; then 
    printf "\n\033[1;031mFolder is exists:\033[0m %s\n" "$sync_path"
    exit 1
  fi

  if [ -n "$sync_path" ]; then
    mkdir "$sync_path"
  else
    sync_path=$(mktemp -d -t bak.data_XXXXXX)
  fi

  if [ ! -d "$sync_path" ]; then
    printf "\n\033[1;31mNot found:\033[0m %s\n" "$sync_path"
    exit 1
  fi

  echo "Backuping."

  # 读取备份文件列表
  bak_list=$(cat "$bak_file")

  # 进入同步目录
  pushd "${sync_path}" >/dev/null 2>&1 || exit 1
    prev_dir=""

    # 遍历备份文件列表
    while read -r line; do
      if echo "$line" | grep '^/'; then
        prev_dir=$(dirname "$line")
      else
        line="$prev_dir/$line"
      fi

      if [ -f "$line" ] || [ -d "$line" ]; then
        rsync -a --relative "$line" ./
      else
        echo "警告: $line 不存在或不是文件/目录"
      fi
    done <<< "$bak_list"

    # 返回原目录
  popd >/dev/null 2>&1 || exit 1

  printf "Backup done:\n\033[1;33m%s\033[0m\n" "$sync_path"
}

main "$@" || exit 1

# 1. 若使用 oneinstack,请记住要备份整站(数据库和网站),然后再备份,即
#     先安装备份信息:
#       ./oneinstack/backup_setup.sh
#     再备份数据:
#       ./oneinstack/backup.sh
#     同步到目标服务器:
#       rsync -av --relative "/data/backup" remote:/data
#       注意:应该直接备份到目标站点,防止空间不足

# 2. 将所有需要备份的数据迁移到目录 migrate 后,需要再将此目录同步到目标服务器
#       rsync -av --relative ./migrate remote:/migrate

# 3. 若是迁移的源服务器、目标服务器均为腾讯云服务,可以使用 rclone 工具备份到 COS,以方便恢复数据。
#     详情,请查阅 rclone 官方文档:https://rclone.org/
#     其它云平台同理(按 rclone 支持的对象存储,比如阿里云等云服务商),走内网不需要流量。
#
#  使用方法:
#    # 备份列表 .bakdir
#    /srv/dir/mydir2
#    mydir3 => /srv/dir/mydir3  
# 
#    # 保存到临时文件夹
#    bash migrate.sh
#
#    # 保存到指定的文件夹
#    bash migrate.sh target