Hãy tưởng tượng tình huống này: 2 giờ sáng, hệ thống NAS trung tâm bị treo khi đang thực hiện quét kiểm tra (scrub) dữ liệu, trong khi bạn đang cần gấp một Ansible playbook hoặc SSH key lưu trên đó. Khi mọi thứ phụ thuộc vào một máy chủ duy nhất, chỉ một sự cố phần cứng nhỏ cũng có thể làm gián đoạn toàn bộ quy trình làm việc. Cơ chế đồng bộ ngang hàng (P2P) giải quyết triệt để vấn đề này. Bằng cách duy trì các bản sao cục bộ trên từng thiết bị đang hoạt động, bạn vẫn truy cập được dữ liệu ngay cả khi máy chủ chính gặp sự cố.
So sánh lưu trữ tập trung, Cloud Drive và đồng bộ P2P
Trước khi viết file compose, hãy cùng xem xét cách ba mô hình lưu trữ này xử lý sự cố phân vùng mạng (network split) và sập máy chủ.
| Tính năng | NAS tập trung (NFS / SMB / Nextcloud) | Đám mây độc quyền (Google Drive / Dropbox) | P2P phi tập trung (Syncthing) |
|---|---|---|---|
| Kiến trúc mạng (Topology) | Client-Server (Hub đơn lẻ) | Đám mây tập trung của bên thứ ba | Dạng lưới phi tập trung (Node-to-Node) |
| Băng thông LAN | Tốc độ đường truyền tối đa (1 Gbps / 10 Gbps) | Bị giới hạn bởi tốc độ upload của ISP (thường 20–50 Mbps) | Tốc độ đường truyền tối đa (110+ MB/s qua 1GbE, mã hóa TLS) |
| Khả năng hoạt động Offline | Không hoạt động nếu NAS chính offline | Không hoạt động nếu mất kết nối Internet | Cao: Các thiết bị cùng kết nối LAN vẫn tiếp tục đồng bộ |
| Quyền riêng tư dữ liệu | Tự lưu trữ (Self-hosted) và hoàn toàn riêng tư | Lưu trên hạ tầng máy chủ của doanh nghiệp | Mã hóa TLS đầu cuối; dữ liệu lưu hoàn toàn trên ổ đĩa của bạn |
| Mức chiếm dụng RAM | Trung bình đến cao (500MB–2GB+ cho stack PHP/Database) | Không đáng kể trên server (client desktop độc quyền) | Rất nhẹ (thường chỉ 50MB–120MB RAM với Go) |
Ưu và nhược điểm trong môi trường Self-Hosted
Syncthing là công cụ đồng bộ liên tục ở cấp độ khối (block-level), không phải là công cụ sao lưu lưu trữ (archival backup). Hiểu rõ sự khác biệt này sẽ giúp bạn triển khai nó vào đúng vị trí để phát huy hiệu quả tối đa.
Ưu điểm
- Không giới hạn dung lượng: Dung lượng đồng bộ hoàn toàn phụ thuộc vào khoảng trống ổ đĩa khả dụng trên các node của bạn.
- Tự động tìm kiếm nhanh trong mạng nội bộ: Các node trong cùng subnet sử dụng các gói tin broadcast IPv4/IPv6 (cổng 21027/UDP) để liên kết chỉ trong vài giây, bỏ qua hoàn toàn các relay ngoài WAN.
- Cập nhật vi sai cấp độ khối (Block-Level Delta): Khi thay đổi vài dòng trong một file ảnh đĩa ảo 5GB, hệ thống chỉ truyền tải các khối 128KB–4MB thực sự bị chỉnh sửa.
- Tích hợp sẵn tính năng quản lý phiên bản: Các chính sách Staggered, Trash Can và Simple versioning giúp bảo vệ thư mục trước nguy cơ ghi đè nhầm file hoặc mã độc tống tiền (ransomware).
Hạn chế
- Không có trình duyệt file trên Web: Syncthing đồng bộ trực tiếp file vào ổ đĩa và không tích hợp sẵn trình chỉnh sửa tài liệu hay trình phát media.
- Yêu cầu thiết bị cùng trực tuyến: Dữ liệu được truyền trực tiếp giữa các peer. Ít nhất hai thiết bị phải cùng online để quá trình truyền file hoàn tất, đó là lý do một chiếc mini PC hoặc server luôn bật là điểm tựa (anchor) lý tưởng.
- Cạn kiệt tài nguyên theo dõi file của Kernel: Việc theo dõi các cây thư mục lớn (như thư mục
node_moduleschứa 40.000 file) có thể nhanh chóng làm cạn kiệt giới hạn file watcher mặc định của Linux.
Kiến trúc mạng và cổng kết nối khuyến nghị
Trong mô hình homelab tiêu chuẩn, bạn nên chạy một container Syncthing luôn hoạt động trên máy chủ tiết kiệm điện hoặc NAS. Các thiết bị như laptop, máy tính để bàn và điện thoại di động sẽ ghép nối với node này như một cầu nối đồng bộ luôn sẵn sàng.
Mở trực tiếp các cổng container sau để đảm bảo tìm kiếm nhanh trong mạng LAN và tận dụng hiệu năng tối đa của giao thức QUIC:
8384/tcp: Giao diện quản trị Web (Web GUI).22000/tcp&22000/udp: Luồng dữ liệu đồng bộ TLS chính và truyền tải dữ liệu qua QUIC.21027/udp: Tìm kiếm thiết bị qua broadcast và multicast nội bộ.
Hướng dẫn triển khai từng bước với Docker Compose
Bước 1: Kiểm tra phân quyền và tạo đường dẫn lưu trữ
Trước tiên hãy xác định thông tin user của bạn, sau đó tạo các thư mục riêng cho cấu hình và dữ liệu đồng bộ:
# Kiểm tra user ID và group ID hiện tại
id
# Tạo các thư mục lưu trữ persistent
sudo mkdir -p /srv/syncthing/config /srv/syncthing/data
sudo chown -R $USER:$USER /srv/syncthing
chmod -R 755 /srv/syncthing
Bước 2: Viết file cấu hình Docker Compose
Lưu cấu hình sau vào file /srv/syncthing/docker-compose.yml:
services:
syncthing:
image: syncthing/syncthing:latest
container_name: syncthing
hostname: homelab-syncthing-node01
environment:
- PUID=1000
- PGID=1000
- TZ=Etc/UTC
volumes:
- /srv/syncthing/config:/var/syncthing/config
- /srv/syncthing/data:/var/syncthing/Sync
ports:
- "8384:8384" # Giao diện Web GUI
- "22000:22000/tcp" # Luồng đồng bộ TCP
- "22000:22000/udp" # Luồng đồng bộ QUIC
- "21027:21027/udp" # Tìm kiếm thiết bị nội bộ (Local discovery)
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-fk", "http://localhost:8384/rest/noauth/health"]
interval: 30s
timeout: 10s
retries: 3
Bước 3: Tối ưu giới hạn Inotify của Kernel và khởi chạy
Giới hạn inotify mặc định của Linux (thường là 8.192 watch) có thể gây độ trễ đồng bộ với các thư mục code lớn. Hãy tăng giới hạn này trước khi khởi động container:
# Tăng giới hạn inotify user watch lên 204.800
echo "fs.inotify.max_user_watches=204800" | sudo tee -a /etc/sysctl.d/90-syncthing.conf
sudo sysctl --system
# Khởi chạy Syncthing ở chế độ chạy ngầm (detached mode)
cd /srv/syncthing
docker compose up -d
# Xem log khởi động trực tiếp
docker compose logs -f syncthing
Bước 4: Thiết lập bảo mật ban đầu và ghép nối thiết bị
- Mở trình duyệt và truy cập
http://<YOUR_SERVER_IP>:8384. - Vào Actions > Settings > GUI. Nhập username quản trị, đặt mật khẩu mạnh từ 16 ký tự trở lên và tích chọn Use HTTPS for GUI.
- Nhấp vào Actions > Show ID để sao chép mã định danh thiết bị gồm 56 ký tự được mã hóa.
- Mở Syncthing trên laptop, nhấp vào Add Remote Device, dán Device ID của server vào và xác nhận ghép nối trên cả hai thiết bị.
- Trong tùy chọn thư mục chia sẻ, bật Staggered Versioning. Hệ thống sẽ tự động lưu phiên bản theo giờ trong ngày đầu tiên, bản sao theo ngày trong một tháng và snapshot theo tuần cho khoảng thời gian sau đó.
Bước 5: Các lệnh khắc phục sự cố nhanh
# Nếu các peer hiển thị 'Relayed' thay vì kết nối LAN trực tiếp:
# Đảm bảo firewall cho phép các cổng discovery và đồng bộ
sudo ufw allow 22000/tcp
sudo ufw allow 22000/udp
sudo ufw allow 21027/udp
sudo ufw reload
# Nếu gặp lỗi phân quyền khi đồng bộ thư mục:
# Kiểm tra quyền sở hữu thư mục trên host có khớp với PUID/PGID (1000:1000)
ls -ld /srv/syncthing/data

