Hôm trước mình có chia sẻ một script giúp tự động backup toàn bộ website WordPress hoạt động trên server cài đặt HocVPS Script. Tuy nhiên, hôm nay mình sẽ giới thiệu một bash script khác tốt hơn, backup toàn bộ VPS kèm theo hướng dẫn tạo cronjob tự động chạy hàng ngày luôn.

Đoạn script này tự động backup toàn bộ dữ liệu trên server, bao gồm:

  1. Toàn bộ database MySQL, mỗi database một file .SQL
  2. Toàn bộ code trong thư mục public_html của domain, có dạng /home/domain.com/public_html/
  3. Toàn bộ cấu hình Nginx trong thư mục /etc/nginx/conf.d/

Tất cả dữ liệu sẽ được nén lại thành một file .ZIP và để ở thư mục /root/backup/, đồng thời tự động xóa những file backup cũ, chỉ giữ lại những file trong vòng 14 ngày trở lại.

Như vậy, bạn hoàn toàn có thể sử dụng script này để di chuyển VPS, hoặc khôi phục bất kỳ phần dữ liệu nào đó. Script mình viết tương thích với cấu trúc thư mục do HocVPS Script quản lý, tuy nhiên bạn cũng có thể chỉnh sửa lại để phù hợp với bất kỳ loại server khác cũng được.

Hiện tại, mình đang sử dụng script này để sao lưu dữ liệu hàng ngày và upload lên Google Drive với Rclone.

Hướng dẫn tự động sao lưu toàn bộ VPS

1. Tạo bash script backup

– Tạo file backup.sh ở thư mục /root/

nano /root/backup.sh

Tham khảo thêm hướng dẫn sử dụng nano nếu chưa biết dùng.

– Copy toàn bộ nội dung script bên dưới rồi paste vào.
Áp dụng cho HocVPS Script v2.0 trở lên:

# HocVPS Script Plugin - Backup Server

#!/bin/bash

. /etc/hocvps/scripts.conf

SERVER_NAME=VPS

TIMESTAMP=$(date +"%Y-%m-%d_%H-%M")
BACKUP_DIR="/root/backup/$TIMESTAMP"
MYSQL=/usr/bin/mysql
MYSQLDUMP=/usr/bin/mysqldump
SECONDS=0

mkdir -p "$BACKUP_DIR/mysql"

echo "Starting Backup Database";
databases=`$MYSQL -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql)"`

for db in $databases; do
	$MYSQLDUMP --force --opt --databases $db | gzip > "$BACKUP_DIR/mysql/$db.gz"
done
echo "Finished";
echo '';

echo "Starting Backup Website";
#Loop through /home directory
for D in /home/*; do
	if [ -d "${D}" ]; then #If a directory
		domain=${D##*/} # Domain name
		echo "- "$domain;
		zip -r $BACKUP_DIR/$domain.zip /home/$domain/public_html/ -q -x /home/$domain/public_html/wp-content/cache/**\* #Exclude cache
	fi
done
echo "Finished";
echo '';

echo "Starting Backup Nginx Configuration";
cp -r /etc/nginx/conf.d/ $BACKUP_DIR/nginx/
echo "Finished";
echo '';

echo "Starting Compress Files";
zip -r /root/backup/$SERVER_NAME-$TIMESTAMP.zip $BACKUP_DIR -q
rm -rf $BACKUP_DIR
size=$(ls -lah /root/backup/$SERVER_NAME-$TIMESTAMP.zip | awk '{ print $5}')
echo "Finished";
echo '';

#Remove older backups (14 days)
find /root/backup/ -mindepth 1 -mtime +14 -delete

duration=$SECONDS
echo "Total $size, $(($duration / 60)) minutes and $(($duration % 60)) seconds elapsed."

# HocVPS Script Plugin - Backup Server

#!/bin/bash

. /etc/hocvps/scripts.conf

SERVER_NAME=VPS

TIMESTAMP=$(date +"%Y-%m-%d_%H-%M")
BACKUP_DIR="/root/backup/$TIMESTAMP"
MYSQL_USER="root"
MYSQL=/usr/bin/mysql
MYSQL_PASSWORD=$mariadbpass
MYSQLDUMP=/usr/bin/mysqldump
SECONDS=0

mkdir -p "$BACKUP_DIR/mysql"

echo "Starting Backup Database";
databases=`$MYSQL --user=$MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql)"`

for db in $databases; do
	$MYSQLDUMP --force --opt --user=$MYSQL_USER -p$MYSQL_PASSWORD --databases $db | gzip > "$BACKUP_DIR/mysql/$db.gz"
done
echo "Finished";
echo '';

echo "Starting Backup Website";
#Loop through /home directory
for D in /home/*; do
	if [ -d "${D}" ]; then #If a directory
		domain=${D##*/} # Domain name
		echo "- "$domain;
		zip -r $BACKUP_DIR/$domain.zip /home/$domain/public_html/ -q -x /home/$domain/public_html/wp-content/cache/**\* #Exclude cache
	fi
done
echo "Finished";
echo '';

echo "Starting Backup Nginx Configuration";
cp -r /etc/nginx/conf.d/ $BACKUP_DIR/nginx/
echo "Finished";
echo '';

echo "Starting Compress Files";
zip -r /root/backup/$SERVER_NAME-$TIMESTAMP.zip $BACKUP_DIR -q
rm -rf $BACKUP_DIR
size=$(ls -lah /root/backup/$SERVER_NAME-$TIMESTAMP.zip | awk '{ print $5}')
echo "Finished";
echo '';

#Remove older backups (14 days)
find /root/backup/ -mindepth 1 -mtime +14 -delete

duration=$SECONDS
echo "Total $size, $(($duration / 60)) minutes and $(($duration % 60)) seconds elapsed."


Giải thích thêm:

  • Tên file backup được tự động đặt theo ngày giờ hiện tại.
  • MYSQL_USER mặc định là root, password được lấy trong file cấu hình /etc/hocvps/scripts.conf.

– Nhấn Ctrl+O, Enter để lưu và Ctrl+X để thoát.

– Phân quyền cho script

chmod +x /root/backup.sh

– Vậy là xong rồi đó, giờ bạn có thể test lại bằng cách chạy lệnh /root/backup.sh

Xong, kiểm tra trong thư mục /root/backup/ có file backup .ZIP chưa nhé.

2. Tạo cronjob tự động backup hàng ngày

Giờ mình sẽ cho script tự động chạy lúc 2h00 sáng.

EDITOR=nano crontab -e

Dán nội dung sau vào cửa sổ Terminal

0 2 * * * /root/backup.sh > /dev/null 2>&1

Nhấn Ctrl+O, Enter để lưu và Ctrl+X để thoát

Vậy là xong, cứ 2h sáng hàng ngày script sẽ tự động chạy, backup toàn bộ dữ liệu của VPS.

Trong bài tiếp theo, mình sẽ hướng dẫn các bạn cách tự động upload file backup này lên Google Drive để tiết kiệm dung lượng cho VPS. Nhớ đón đọc nhé.

Comment của bạn

Your email address will not be published. Required fields are marked *

90 Comments

  1. sven 36 comment

    em vừa mới cài học vps nhưng mà cài xong rồi thì chưa biết làm bài nào tiếp theo
    bởi vì nhiều bài quá loạn hết cả
    anh chỉ em đi từ bài nào đến bài nào với T_T

    1. Việt Phương Moderator

      Cài HocVPS là xong, bạn không cần cải thiện gì thêm cho HocVPS cả. Bạn chỉ cần sử dụng tiếp thôi là OK. Cài đặt site vào và sử dụng thôi:)

        1. Việt Phương Moderator

          Không có đề cập rồi bạn. Bạn đọc thêm các tài liệu về Linux trên mạng vậy. Còn user quyền root thì bạn tìm hiểu về sudoer

  2. sven 36 comment

    lúc nào rảnh bạn làm 1 bài nhé
    mình xem mấy bài trên mạng thấy khá khó hiểu 😀
    thanks

  3. Tung 4 comment

    Phần backup mình thấy hocvps Compress Files dạng zip chạy rất lâu, host mình khoảng 10GB data (code + images) mà chờ cả 30p ko thấy xong, nên đành phải thoát ra.

    Mình thay lệnh zip bằng lệnh tar thì chạy rất nhanh.

    1. Việt Phương Moderator

      Well noted 🙂 Để mình nghiên cứu xem áp dụng. Do zip cũng phổ thông hơn với mọi người dùng, tiện cho ai cơ bản cũng unzip đc 😀

  4. Thanh Hải 14 comment

    anh ơi em bị lỗi như này là sao anh nhỉ

    [root@li1471-240 home]# /root/backup.sh
    /root/backup.sh: line 2: $’\r’: command not found
    /root/backup.sh: line 4: $’\r’: command not found
    : No such file or directorytc/hocvps/scripts.conf
    /root/backup.sh: line 6: $’\r’: command not found
    /root/backup.sh: line 8: $’\r’: command not found
    /root/backup.sh: line 16: $’\r’: command not found
    /root/backup.sh: line 18: $’\r’: command not found
    Starting Backup Database
    /root/backup.sh: line 19: $’\r’: command not found
    : No such file or directoryusr/bin/mysql
    /root/backup.sh: line 21: $’\r’: command not found
    /root/backup.sh: line 22: syntax error near unexpected token `$’do\r”
    ‘root/backup.sh: line 22: `for db in $databases; do
    [root@li1471-240 home]#

    1. Việt Phương Moderator

      Việc copy của bạn khiến tạo kí tự thừa trong scripr rồi. Bạn copy lại toàn bộ script trên nền SSH nhé. Và bạn dùng đúng script cho phiên bản v2.0 trở lên hoặc v1.8 trở xuống chưa

          1. Thanh Hải 14 comment

            vâng, cảm ơn anh nhiều,

            à, anh có thể tạo file đính kèm để tránh các trường hợp như của em anh nhé 😀

            chúc anh 1 ngày vui vẻ

          2. Việt Phương Moderator

            Thôi, cho các bạn làm nhiều cho quen 😀 Dùng VPS cần tìm tòi hơn Hosting 😀 Thế mới thuần thục đc

  5. Duy Vũ 4 comment

    Lúc chạy lệnh backup xong nó bắt nhập pass word database thì nhập cái gì a nhỉ?

    e nhập pass của root vào mà đâu có được.

    1. Việt Phương Moderator

      Bạn dùng HocVPS phiên bản nào? Nếu phiên bản mới nhất thì mình vừa sửa script cho phù hợp, bạn update lại nội dung cho phù hợp nhé

  6. Vi Nguyen 2 comment

    Code chạy rất trơn tru, rất tuyệt vời. Nhưng mình vào kiểm tra thì không thấy nó backup database bạn nhỉ?

  7. nguyễn hong 2 comment

    script này lỗi phần nhập password backup database nhé, mặc dù đánh đúng khi lấy ra tại hình /etc/hocvps/scripts.conf.
    mà nó cứ hiện như thế này hoài
    Starting Backup Database
    Enter password:
    Enter password:

    1. Việt Phương Moderator

      Có phải nhập đâu bạn? Password đã được đọc từ trong script rồi mà

      1. Hai 21 comment

        Của mình nó cũng bắt nhập nha. Chả biết nhập pass root hay admin nữa

        1. Việt Phương Moderator

          Bạn thông cảm update lại script nhé. Mình vừa sửa cho phù hợp phiên bản.

    1. Việt Phương Moderator

      1. HocVPS script bạn phiên bản nào?
      2. Backup script bạn phiên bản nào?
      Thực ra cách fix đơn giản nhất là bạn dùng backup script bản 1.8 trở xuống, điền trực tiếp mật khẩu mysql root vào trong nội dung của script
      MYSQL_USER="root"
      MYSQL=/usr/bin/mysql
      MYSQL_PASSWORD=$mariadbpass

  8. Mến 5 comment

    Mong ad giúp với … minh đã làm đi làm lại mấy làn rồi như vẫn bị lỗi như thế này: Khi mình chạy lệnh /root/backup.sh … Nó cứ hỏi Pass như thế này.

    Starting Backup Database
    Enter password:

    Mình nhập pass ko được bấm Enter luôn.. Thì nó thông báo lỗi như thế này:

    Starting Backup Database
    Enter password:
    ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: YES)
    Finished

    >>> Các mục Backup còn lại thì bình thường … Chỉ lỗi mỗi cái Database … fix lỗi nó như thế này đây ad 🙁

    1. Việt Phương Moderator

      Chắc bạn dùng script backup lệch với phiên bản của hocvps script. Bạn dùng Script Backup bản 1.8 rồi điền trực tiếp user, password MySQL trong nội dung script. Sau đó bạn lưu script lại và chạy

  9. Quy 15 comment

    Cho mình hỏi backup xong cứ download dc 120mb thì nó ngưng 🙁 dùng trên nhiều trình duyệt vẫn thế, ai biết giúp dc ko ạ!

    1. Việt Phương Moderator

      Có thể tốc độ giữa VPS và bạn chậm quá nên quá thời gian truy vấn, dạng request timeout. Bạn chỉnh thông số trong /etc/php.d/00-hocvps-custom.ini nhé

  10. Tạp chí Khỏe 20 comment

    Chào bạn. Nếu mình chỉ muốn backup database (Mysql) thì lược bỏ đoạn nào được bạn
    Cảm ơn bạn !

    1. Việt Phương Moderator

      Bạn bỏ phần
      echo "Starting Backup Website";
      ....
      echo "Starting Backup Nginx Configuration";
      cp -r /etc/nginx/conf.d/ $BACKUP_DIR/nginx/
      echo "Finished";
      echo '';