Tự động backup lên google drive trên aapanel

Nếu bị bạn sử dụng backup google drive trên aapanel mà bị tình trạng backup thiếu web hay database thì có thể sử dụng rclone để backup tự động theo hướng dẫn sau

Bước 1: Chuẩn bị

  • Tạo folder chứa file backup trên google drive và lấy id thư mục (ID_THU_MUC)
  • Lấy Client IDClient secret theo hướng dẫn: https://rclone.org/drive/#making-your-own-client-id

Bước 2: Thực hiện

Đăng nhập ssh vps

1. Cài đặt rclone

curl https://rclone.org/install.sh | sudo bash

2. Cấu hình rclone

rclone config

Chọn “n” tạo mới

name => nhập gdrive

Nhập số của Google Drive, thường là: 22

Nhập Client IDClient secret t

scope => 1

service_account_file => để trống Enter

Edit advanced config? => n

Use web browser to automatically authenticate rclone with remote? => n

Mở cmd chạy lệnh

rclone authorize "drive" "doan_ma_ngau_nhien"

Trình duyệt web mở lên thì cứ chấp nhận quyền cho email drive là được

Quay lại copy config_token trên CMD rồi dán vào SSH

Configure this as a Shared Drive (Team Drive)? => n

Keep this “gdrive” remote? => y

Nhập q => Enter để thoát

3. Cấu hình folder lưu backup cho rclone, tránh ghi, xóa file, folder khác

nano /root/.config/rclone/rclone.conf

Thêm vào cuối

root_folder_id = ID_THU_MUC

Ctrl + O => Enter => Ctrl + X để lưu và thoát

4. Tạo thông tin root mysql

nano /root/.my.cnf

Nhập nội dung

[client]
user=root
password=ROOT_MYSQL_PASS
host=localhost

Ctrl + O => Enter => Ctrl + X để lưu và thoát

Phân quyền lại file

chmod 600 /root/.my.cnf

Kiểm tra xem lấy được danh sách database chưa

mysql -e "SHOW DATABASES;"

5. Tạo script tự động backup website, database và xóa backup cũ

nano /root/backup.sh

Nhập nội dung

#!/bin/bash

############################################
# CONFIG
############################################
KEEP_NUM=${1:-7} # số bản backup giữ, mặc định 7
WWWROOT="/www/wwwroot"
TMP="/tmp/aapanel_backup"
DATE=$(date +"%Y-%m-%d_%H-%M")
RCLONE_REMOTE="gdrive:"
LOG="/var/log/backup.log"
LOCKFILE="/tmp/backup.lock"

# PATH chuẩn cho cron
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

############################################
# LOCK FILE - tránh chồng lệnh
############################################
if [ -f "$LOCKFILE" ]; then
echo "$DATE: Backup đang chạy, thoát..." | tee -a "$LOG"
exit 1
fi
touch "$LOCKFILE"
trap "rm -f $LOCKFILE" EXIT

mkdir -p "$TMP"

echo "===== BACKUP START $DATE (KEEP_NUM=$KEEP_NUM) =====" | tee -a "$LOG"

############################################
# BACKUP WEBSITE FILES
############################################
for SITE_PATH in "$WWWROOT"/*; do
[ ! -d "$SITE_PATH" ] && continue
SITE=$(basename "$SITE_PATH")

echo "---- BACKUP SITE FILES: $SITE ----" | tee -a "$LOG"

tar --warning=no-file-changed -czf "$TMP/${SITE}_web_$DATE.tar.gz" \
--exclude="wp-content/cache" \
--exclude="wp-content/litespeed" \
--exclude="wp-content/uploads/cache" \
-C "$WWWROOT" "$SITE"

# Upload vào Drive
rclone copy "$TMP/${SITE}_web_$DATE.tar.gz" "$RCLONE_REMOTE/web/$SITE/" >> $LOG 2>&1
rm -f "$TMP/${SITE}_web_$DATE.tar.gz"

# Giữ số bản mới nhất
FILES_TO_DELETE=$(rclone lsf --files-only "$RCLONE_REMOTE/web/$SITE/" | sort | head -n -$KEEP_NUM)
for FILE in $FILES_TO_DELETE; do
rclone delete "$RCLONE_REMOTE/web/$SITE/$FILE" >> $LOG 2>&1
done
done

############################################
# BACKUP DATABASES
############################################
DBS=$(mysql -N -e "SHOW DATABASES;" | grep -Ev "information_schema|mysql|performance_schema|sys")

for DB in $DBS; do
echo "---- BACKUP DB: $DB ----" | tee -a "$LOG"

mysqldump "$DB" | gzip > "$TMP/${DB}_db_$DATE.sql.gz"
rclone copy "$TMP/${DB}_db_$DATE.sql.gz" "$RCLONE_REMOTE/databases/$DB/" >> $LOG 2>&1
rm -f "$TMP/${DB}_db_$DATE.sql.gz"

# Giữ số bản mới nhất
FILES_TO_DELETE=$(rclone lsf --files-only "$RCLONE_REMOTE/databases/$DB/" | sort | head -n -$KEEP_NUM)
for FILE in $FILES_TO_DELETE; do
rclone delete "$RCLONE_REMOTE/databases/$DB/$FILE" >> $LOG 2>&1
done
done

rm -rf "$TMP"
echo "===== BACKUP END =====" | tee -a "$LOG"

Cấp quyền file

chmod +x /root/backup.sh

6. Tạo cron tự backup hằng ngày

  • Thay số 7 bằng số bản backup muốn giữ
  • Thay số 1 bằng số giờ muốn bắt đầu chạy
crontab -e

Nhập vào cuối

0 1 * * * /root/backup.sh 7 >> /var/log/backup.log 2>&1

Chạy thử ngay bằng lệnh

/root/backup.sh
Từ khóa:

Bình luận

0 bình luận

  • Hãy là người đầu tiên để lại bình luận cho bài viết này!