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.
Nếu bạn sử dụng hệ quản trị khác HocVPS thì sử dụng script 2 và sửa thông tin đăng nhập MySQL, đường dẫn thư mục source code và thư mục Nginx Conf
Script 1: Á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 $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 $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

Lưu ý: tất cả comment đều được kiểm duyệt cẩn thận! Nếu có code bạn hãy up lên pastebin.com rồi để lại link trong comment.

155 Comments

  1. TRI 28 comment

    Nhờ các bạn hướng dẫn chi tiết giúp phần RESTORE lại cho các trang web, và di chuyển VPS.
    Mình đã đọc nhiều lần các câu lệnh căn về nén zip, sql, linux…mà không biết làm sao để phục hồi trang web, trong khi có file backup đầy đủ.
    Bạn nào biết xin hướng dẫn cụ thể giùm mình .
    Hiện tại mình đã làm được file .zip backup và tải về máy tính.
    Đường dẫn thư mục có dạng: /home/domain/public_html
    Bắt đầu từ kết nối SSL, vào tới màn hình console để vào hocvps script, rồi thì mình là gì tiếp để RESTORE lại các trang web.
    ( Xin vui lòng chỉ mình cụ thể, mình đã đọc qua rất nhiều các câu lệnh căn bản … mà không biết vào đâu dùng, và bắt đầu từ đâu.)

    Cảm ơn bạn quan tâm rất nhiều.

  2. quang 1 comment

    mình bị lỗi không sao lưu được DB . ad giúp mình với
    mysqldump: Got error: 2002: “Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (111 “Connection refused”)” when trying to connect

  3. IMTA 1 comment

    Mình đang định chuyển VPS từ Vultr về Việt Nam, có cách nào sao chép toàn bộ VPS từ VULTR về ko bạn? tực là mình snapshot lại rồi qua bên kia cài y hệt như tạo bản ghost vậy đó

  4. TIEN TRI 19 comment

    Xin chào các bạn,
    Trong bài viết có đoạn:
    “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 đó.”

    Nhờ các bạn hướng dẫn chi tiết giúp phần RESTORE lại cho các trang web, và di chuyển VPS.
    Mình đã đọc nhiều lần các câu lệnh căn về nén zip, sql, linux…mà không biết làm sao để phục hồi trang web, trong khi có file backup đầy đủ.
    Bạn nào biết xin hướng dẫn cụ thể giùm mình .
    Hiện tại mình đã làm được file .zip backup và tải về máy tính.
    Đường dẫn thư mục có dạng: /home/domain/public_html
    Bắt đầu từ kết nối SSL, vào tới màn hình console để vào hocvps script, rồi thì mình là gì tiếp để RESTORE lại các trang web.
    ( Xin vui lòng chỉ mình cụ thể, mình đã đọc qua rất nhiều các câu lệnh căn bản … mà không biết vào đâu dùng, và bắt đầu từ đâu.)

    Cảm ơn bạn quan tâm rất nhiều.

  5. 52 comment

    mình có góp ý thêm cho script này là nên nén luôn cả thư mục ssl trong mục /etc/nginx nữa

  6. Thảo 1 comment

    Nếu đường dẫn của website như là
    home/user1/domain1/public_html/
    home/user1/domain2/public_html/
    home/user1/domain3/public_html/
    home/user2/domain1/public_html/
    home/user2/domain2/public_html/
    home/user2/domain3/public_html/
    Chỉnh sửa lệnh ntn cho nó lấy dc hết toàn bộ domain đang có trên đây!
    Cám ơn các bạn

    1. Việt Phương Moderator

      Số lượng ít vậy thì bạn có thể liệt kê luôn trong câu lệnh nén zip của script

  7. chiến 8 comment

    Mình chỉ muốn lưu dữ liệu 3 ngày gần nhất thôi thì chỉnh ntn vậy admin? Chứ nó lưu 14 ngày mà dữ liệu web mấy G nên nặng lắm ạ.

    Cảm ơn ad!

        1. Việt Phương Moderator

          Và bạn nên backup cả lên Cloud Drive, vừa tiết kiệm dung lượng và an toàn nữa

          1. Việt Phương Moderator

            Script này không hỗ trợ backup lên GG Driver nhé bạn. Bạn backup thì dùng script bài viết Rclone

          2. Văn Phong 20 comment

            Mà sao lúc backup test thì nó lại yêu cầu nhập password bạn nhỉ ? Rồi lúc nó chạy cronjob ko nhập pass nó có chạy ko ?

  8. TIEN TRI LE 19 comment

    VPS mình mới tạo tự nhiên có domain tên adlite,net.
    Vào liệt kê domain thấy adlite,net. Mà vào số 3 trong menu hocvps để
    xóa thì báo không phát hiện.
    Khi chạy lệnh /root/backup.sh thì vẫn backup domain này mà báo lỗi.
    Như khi vào /root/backup/ thì lại không thấy adlite,net
    Có bạn nào bị giống mình không à? và không hiểu sao lại có domain đó nữa.
    Xóa không dc luôn

    1. Việt Phương Moderator

      Bạn kiểm tra thư mục nếu không sử dụng thì xóa thủ công đi.
      Kiểm tra trong /etc/nginx/conf.d nữa để xóa thủ công
      Còn backup báo lỗi thì thường thư mục trống

  9. TIEN TRI LE 19 comment

    Nhờ bạn hướng dẫn Restore kỹ hơn phần này không? Phần database có 2 file tenmien.gz và wordpress.gz mà không biết import như thế nào?
    Nếu được bạn hướng dẫn chi tiết giúp.
    Cảm ơn nhiều.

  10. Việt An 12 comment

    Có cách nào để tạo file backup toàn bộ hocvps để chuyển qua một vps mới không bạn?

    1. Việt Phương Moderator

      Hiện không có bạn à. Thường cùng 1 nhà cung cấp VPS thì bạn có thể sử dụng tính năng snapshot của họ

      1. TRI 19 comment

        Mình quan tâm phần này SNAPSHOP của Vultr, bạn có thể cho nói sơ cách dùng dc không?
        Mình rất khó khăn về phần sao lưu và khôi phục, làm vài lần mà khi cần không khôi phục dc.
        Rất mong bạn, nói rõ phần khôi phục chút.
        Chân thành cảm ơn!

        1. Việt Phương Moderator

          Snapshot giống như tạo 1 bản Ghost Windows vậy. Nén lại toàn bộ dữ liệu cùng thông số hệ điều hành tại thời điểm lưu
          Khi bạn backup lại thì cả VPS sẽ quay lại thời điểm đó, không riêng gì web mà toàn bộ mọi thứ

  11. Tuong 6 comment

    Chào admin, mình muốn tắt không cho tự động backup nữa thì làm thế nào ạ? Cho mình xin code với ạ 😀
    Mình đã tắt được không cho tự động upload lên Google Drive rồi, nhưng nó vẫn tự backup và lưu trên VPS

    1. Việt Phương Moderator

      Bạn xóa script backup đi, file /root/backup.sh đó
      Ròi xóa trong crontab lệnh chạy nữa