Header Ads Widget

Ticker

6/recent/ticker-posts

Hướng dẫn tạo service để Sync data xây dựng backup trên Linux bằng rsync và inotify, git

Keywords: How to create a services sync data backup on linux by rsync and inotify
Một ngày đầu tháng đầy may mắn các bạn nhé, mấy hôm trước mình còn chán nản với việc sẻ nên viết gì tiếp cho Blog bây giờ, vì não mình dường như đang bắt đầu bão hòa, chẳng còn biết nên phải viết gì cả, thì đang trong quá trình làm việc mình lỡ tay xóa sạch toàn bộ data của server vậy là ngày đó mình đã bị ăn hành cả ngày.
Sau đó mình phải bắt đầu xây dựng lại toàn bộ hệ thống nhưng đợt này mình quyết tâm tìm cách backup cho an toàn mới được, suy nghĩ mãi làm thế nào để xây dựng backup trên Linux Server bây giờ, cuối cùng thì cũng đã có 1 cách, mình đã kết hợp 2 thằng inotify và rsync lại với nhau để xây dựng backup cho riêng mình bằng script sh và sau đó mình cho nó chạy như là một services, chắc các bạn cũng hình dung ra rồi đúng không ?

Vậy inotify là gì ?

Nó là một tools trong linux dùng để kiểm tra các tiệp trong thư mục nếu như tiệp đó được chỉnh sửa, được tạo hoặc xóa nó sẻ cho chúng ta biết và để cài đặt nó ta sử dụng lệnh sau
apt install inotify-tools
Sau khi đã cài đặt inotify về máy mình rồi bạn có thể sử dụng nó như sau
inotifywait -r -e modify,create,delete /home/ubuntu
Như các bạn thấy thì ở đây mình có 2 options:
  1. -r có nghĩa là đi sâu vào các thư mục con, nó cũng giống như options của "chmod -R" vậy ak
  2. -e ở đây có nghĩa là cần khai báo những vấn đề để thấy tiệp thay đổi ví dụ với một services sync bình thường thì ta có: chỉnh sửa (modify), tạo mới (create) và xóa (delete).
Còn với rsync thì nó đơn giản hơn nhiều chỉ cần 3 options này là đủ -avz sau đó bạn tiếp tục khai báo đường dẫn cần backup và nơi bạn muốn để các file backup đó là ok
rsync -avz /etc/apache2/sites-available/ /data/backup/apache2-virtual-host
Thực hiện tạo file script bằng lệnh
vi rsync-virtual-host.sh
Câu lệnh trên là mình sẻ backup toàn bộ conf của apache2 vào thư mục backup của mình, ok chỉ cần 2 câu lệnh trên thôi chúng ta thực hiện tạo một con script như sau
#!/bin/bash
#while inotifywait -r -e modify,create,delete originFolder
while inotifywait -r -e modify,create /etc/apache2/sites-available
do
rsync -avz /etc/apache2/sites-available/ /data/backup/apache2-virtual-host
done
Tại sao câu lệnh trên mình không có options delete vì mình nghĩ đã là backup mà nếu mình lỡ tay delete không lẽ thằng thư mục backup nó cũng bị delete theo, nên thôi mình đã tháo options kia ra, chỉ có sửa file và tạo mới thôi còn delete thì không cần để sau này mình có lỡ tay chơi ngu thì còn lấy lại được, sau đó các bạn để file .sh đó vào một thư mục nào đó cũng được tiếp đến là chúng ta phải chạy file đó như là 1 service để nó luôn luôn chạy và check sự thay đổi từ conf, thực hiện truy cập và tạo file services như sau
cd /etc/systemd/system
vi bk-host-ap2.service
Với nội dung của file service như sau
[Unit]
Description=Backup virtual host apache2 conf domain
[Service]
User=root
#change this to your workspace
WorkingDirectory=/data/script/
#path to executable.
#executable is a bash script which run server
ExecStart=/data/script/rsync-virtual-host.sh
SuccessExitStatus=143
TimeoutStopSec=10
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
Ok giờ save lại thôi nào và chạy các câu lệnh sau để tạo services
cd /etc/systemd/system/
sudo systemctl enable pub_server
sudo service pub_server start
Hoặc các bạn cũng có thể sử dụng git để giải quyết các vấn đề sync thay thế cho google sync khi không có trên Linux bằng đoạn code sau
#!/bin/bash

set -e

TARGETDIR="$HOME/yourfolder-repo-on-git/"

stderr () {
    echo "$1" >&2
}

is_command() {
    command -v "$1" &>/dev/null
}

if [ "$(uname)" != "Darwin" ]; then
    INW="inotifywait";
    EVENTS="close_write,move,delete,create";
    INCOMMAND="\"$INW\" -qr -e \"$EVENTS\" --exclude \"\.git\" \"$TARGETDIR\""
else # if Mac, use fswatch
    INW="fswatch";
    # default events specified via a mask, see
    # https://emcrisostomo.github.io/fswatch/doc/1.14.0/fswatch.html/Invoking-fswatch.html#Numeric-Event-Flags
    # default of 414 = MovedTo + MovedFrom + Renamed + Removed + Updated + Created
    #                = 256 + 128+ 16 + 8 + 4 + 2
    EVENTS="--event=414"
    INCOMMAND="\"$INW\" --recursive \"$EVENTS\" --exclude \"\.git\" --one-event \"$TARGETDIR\""
fi

for cmd in "git" "$INW" "timeout"; do
    # in OSX: `timeout` => brew install coreutils
    # in OSX: `fswatch` => brew install fswatch
    is_command "$cmd" || { stderr "Error: Required command '$cmd' not found"; exit 1; }
done

cd "$TARGETDIR"
echo "$INCOMMAND"

while true; do
    eval "timeout 600 $INCOMMAND" || true
    git pull
    sleep 5
    STATUS=$(git status -s)
    if [ -n "$STATUS" ]; then
        echo "$STATUS"
        echo "commit!"
        git add .
        git commit -m "autocommit"
        git push origin
    fi
done
Cẩn thân repo của Git hỏi Password khi Push và Pull nên vì vậy ta cần chạy lệnh sau để hoàn thành
git config credential.helper store
Nhập Password để khi Pull và Push Git không còn hỏi nữa như vây Script sẻ không bị lỗi
Ok chúc các bạn thành công, các bạn cũng có thể xem lại cách tạo services cho script linux ở link dưới nhé

Post a Comment

0 Comments