Header Ads Widget

Đồng bộ dữ liệu giữa 2 VPS sử dụng Rsync

Trong quá trình phát triển website, việc đồng bộ mã nguồn từ server phát triển sang server chạy thực tế là công việc diễn ra thường xuyên. Nếu mỗi lần chạy rsync đều phải nhập mật khẩu sẽ rất bất tiện, đặc biệt khi muốn tự động hóa bằng Cronjob hoặc CI/CD.

Bài viết này hướng dẫn cấu hình SSH Key để có thể đồng bộ dữ liệu giữa hai VPS bằng rsync mà không cần nhập mật khẩu.

Mô hình

Server nguồn

IP: Local Server
User: dev_ssh
Thư mục:
/www/wwwroot/lienvu.com

Server đích

IP: 103.82.20.175
User: root
Thư mục:
/www/wwwroot/lienvu.com
Owner: www:www

Bước 1. Kiểm tra SSH Key

Kiểm tra xem server đã có SSH Key hay chưa:

ls ~/.ssh/id_ed25519*

Nếu đã có kết quả như dưới đây thì không cần tạo mới.

id_ed25519
id_ed25519.pub

Nếu chưa có thì tạo mới:

ssh-keygen -t ed25519 -C "root@tool"

Nhấn Enter liên tục và không đặt passphrase.


Bước 2. Copy SSH Key sang server đích

Thực hiện:

ssh-copy-id root@103.82.20.175

Nếu xuất hiện thông báo:

All keys were skipped because they already exist on the remote system.

Có nghĩa là SSH Key đã được cài đặt từ trước và có thể bỏ qua bước này.


Bước 3. Kiểm tra đăng nhập

Thử đăng nhập:

ssh root@103.82.20.175

Nếu đăng nhập thành công mà không yêu cầu nhập mật khẩu thì việc cấu hình SSH Key đã hoàn tất.


Bước 4. Đồng bộ website bằng Rsync

Thực hiện lệnh:

rsync -azP --delete --chown=www:www /www/wwwroot/lienvu.com/ root@103.82.20.175:/www/wwwroot/lienvu.com/

Ý nghĩa các tham số:

Tham sốChức năng
-aGiữ nguyên quyền, cấu trúc thư mục, symbolic link...
-zNén dữ liệu khi truyền qua mạng
-PHiển thị tiến trình và hỗ trợ resume nếu bị ngắt
--deleteXóa các file trên server đích nếu không còn tồn tại ở server nguồn
--chown=www:wwwĐặt owner toàn bộ file sau khi đồng bộ thành www:www

Chỉ đồng bộ nội dung thư mục

Lưu ý dấu / ở cuối thư mục nguồn:

rsync -azP --delete --chown=www:www /www/wwwroot/lienvu.com/ root@103.82.20.175:/www/wwwroot/lienvu.com/

Nếu bỏ dấu /, rsync sẽ tạo thêm một thư mục con không mong muốn.


Đồng bộ qua SSH Port khác

Ví dụ SSH chạy port 65333:

rsync -azP -e "ssh -p 65333" --delete --chown=www:www /www/wwwroot/lienvu.com/ root@103.82.20.175:/www/wwwroot/lienvu.com/

Tự động đồng bộ bằng Cron

Ví dụ chạy mỗi 5 phút:

*/5 * * * * rsync -az --delete --chown=www:www /www/wwwroot/lienvu.com/ root@103.82.20.175:/www/wwwroot/lienvu.com/ >/dev/null 2>&1

Một số lỗi thường gặp

SSH vẫn yêu cầu nhập mật khẩu

Kiểm tra:

ssh -v root@103.82.20.175

Nếu không sử dụng SSH Key, cần kiểm tra:

  • File /root/.ssh/authorized_keys

  • Quyền thư mục /root/.ssh

  • Quyền file authorized_keys

  • Cấu hình PubkeyAuthentication yes

  • Cấu hình PermitRootLogin


Permission denied

Nếu xuất hiện lỗi:

Permission denied

Kiểm tra quyền của thư mục đích hoặc sử dụng tài khoản root để thực hiện đồng bộ.


Cấu hình SSH Key đã có để rsync không cần nhập mật khẩu

Khi thường xuyên sử dụng rsync hoặc scp để đồng bộ dữ liệu giữa hai máy chủ, việc phải nhập mật khẩu mỗi lần sẽ khá bất tiện. Cách tốt nhất là cấu hình xác thực bằng SSH Key.

Bước 1: Kiểm tra SSH Key trên máy nguồn

Kiểm tra thư mục .ssh:

ls -al ~/.ssh

Nếu đã có các file như id_rsaid_rsa.pub hoặc id_ed25519id_ed25519.pub thì có thể sử dụng ngay.

Bước 2: Copy Public Key sang máy đích

Sử dụng lệnh:

ssh-copy-id -i ~/.ssh/id_rsa.pub -p 65333 dev_ssh@123.456.78.9

Nếu sử dụng key id_ed25519 thì thay id_rsa.pub bằng id_ed25519.pub.

Lần đầu tiên hệ thống sẽ yêu cầu nhập mật khẩu của tài khoản dev_ssh. Sau khi hoàn thành, Public Key sẽ được thêm vào file ~/.ssh/authorized_keys trên máy chủ đích.

Bước 3: Kiểm tra kết nối

Thử SSH đến máy chủ:

ssh -i ~/.ssh/id_rsa -p 65333 dev_ssh@123.456.78.9

Nếu đăng nhập thành công mà không cần nhập mật khẩu thì việc cấu hình đã hoàn tất.

Bước 4: Sử dụng rsync

Từ bây giờ có thể đồng bộ dữ liệu mà không cần nhập mật khẩu:

rsync -avz --delete -e "ssh -i ~/.ssh/id_rsa -p 65333" \
/data/lienvu.com/index.html \
dev_ssh@123.456.78.9:/data/lienvu.com/index.tpl

Xử lý lỗi "REMOTE HOST IDENTIFICATION HAS CHANGED"

Nếu máy chủ đích vừa được cài đặt lại, bạn có thể gặp lỗi:

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
Host key verification failed.

Nguyên nhân là SSH Host Key của máy chủ đã thay đổi, trong khi máy nguồn vẫn lưu Host Key cũ trong file ~/.ssh/known_hosts.

Xóa Host Key cũ:

ssh-keygen -R "[123.456.78.9]:65333"

Sau đó kết nối lại:

ssh -p 65333 dev_ssh@123.456.78.9

yes để xác nhận Host Key mới. Từ những lần kết nối sau, SSH và rsync sẽ hoạt động bình thường mà không còn xuất hiện cảnh báo.

Nhận xét