SSD Nodes Learn 🎉 VPS từ $4.99/tháng
Hướng dẫn Matt ConnorBởi Matt Connor

Syncthing hay Nextcloud cho VPS: chọn cái nào?

Syncthing đồng bộ peer-to-peer, không có bản sao trên server; Nextcloud lưu file trên server và hỗ trợ tài khoản, share link. Chọn đúng mô hình, đừng xem cái nào là backup.

Syncthing và Nextcloud: khác biệt quyết định cách dùng

Syncthing và Nextcloud khác nhau ở một điểm mang tính cấu trúc, và mọi khác biệt khác đều bắt nguồn từ đó. Syncthing hoạt động theo mô hình peer-to-peer. Mỗi thiết bị giữ toàn bộ thư mục và không có bản sao nào là bản chính. Nextcloud là một server. Một máy giữ các file, người dùng truy cập chúng thông qua tài khoản, còn các client tải bản sao xuống.

Đó là lý do Syncthing không có share link và không có giao diện web để xem tài liệu. Không có bản sao trung tâm để cung cấp, nên trình duyệt không có nơi để gửi request. Nextcloud cung cấp cả hai tính năng này. Để làm vậy, Nextcloud cần PHP runtime, database server, web server và reverse proxy cho TLS (transport layer security).

Chọn Syncthing khi mọi thiết bị tham gia đều thuộc quyền quản lý của bạn. Chọn Nextcloud khi cần truy cập các file bằng trình duyệt hoặc cho phép người khác truy cập.

VPS thực sự làm gì trong từng mô hình

VPS chạy Nextcloud là nơi lưu dữ liệu của bạn. Nếu xóa bản sao cục bộ trên laptop, file vẫn còn trên server vì server vốn luôn là nơi lưu bản gốc.

VPS chạy Syncthing làm nhiệm vụ khác: đó là một peer luôn hoạt động. Syncthing truyền dữ liệu trực tiếp giữa hai thiết bị đang online cùng lúc. Vì vậy, hai laptop không bao giờ được bật đồng thời sẽ không thể sync, dù bạn chờ bao lâu. Thêm một peer trên VPS không bao giờ sleep thì vấn đề biến mất. Laptop A đẩy dữ liệu lúc 09:00, laptop B kéo dữ liệu lúc 22:00, còn VPS giữ folder trong khoảng thời gian đó.

Đây là một vai trò thực sự hữu ích và có phạm vi nhỏ hơn so với việc gọi nó là “thay thế Dropbox”. Syncthing sẽ không bao giờ tạo cho bạn một link để gửi cho khách hàng. Nếu đó là yêu cầu của bạn, hãy dừng ở đây và đọc bài tổng hợp các lựa chọn thay thế Dropbox tự host.

Chi phí của từng lựa chọn trên một VPS nhỏ

Syncthing là một binary Go duy nhất. Nó lắng nghe trên một socket, lưu index của các file trong database cục bộ, và đó là toàn bộ stack. Từ version 2.0, index này dùng SQLite thay cho LevelDB, nên khi nâng cấp từ bản cài đặt 1.x, hệ thống sẽ chạy migration một lần trong lần khởi động đầu tiên. Với bộ thư mục lớn, migration này có thể mất nhiều thời gian. Hãy để quá trình hoàn tất. Không cần cài thêm gì và cũng không cần patch thêm thành phần nào.

Nextcloud cần nhiều thành phần hơn. Tính đến tháng 8 năm 2026, Nextcloud 35 hỗ trợ PHP 8.3 đến 8.5, dùng MariaDB hoặc PostgreSQL làm database phía sau và được phục vụ bởi Apache 2.4 hoặc nginx với php-fpm. Tài liệu quản trị khuyến nghị "tối thiểu 512MB RAM cho mỗi process", còn php-fpm chạy nhiều worker process cùng lúc.

Trên VPS 1 GB, Syncthing hoạt động thoải mái còn Nextcloud khá chật vật. Điều đó không có nghĩa Nextcloud là lựa chọn sai. Nó chỉ là một cam kết lớn hơn, vì bạn phải giữ 4 thành phần luôn được cập nhật thay vì 1 thành phần. Cách dùng container trong hướng dẫn chạy Nextcloud trên VPS với Docker, TLS và backup là cách ít vất vả nhất để vận hành toàn bộ stack đó.

Cài đặt Syncthing trên VPS

Ubuntu có sẵn gói syncthing, nhưng phiên bản này đã quá cũ so với bản upstream. Hãy dùng repository chính thức của dự án.

sudo mkdir -p /etc/apt/keyrings
sudo curl -L -o /etc/apt/keyrings/syncthing-archive-keyring.gpg https://syncthing.net/release-key.gpg
echo "deb [signed-by=/etc/apt/keyrings/syncthing-archive-keyring.gpg] https://apt.syncthing.net/ syncthing stable-v2" | sudo tee /etc/apt/sources.list.d/syncthing.list
sudo apt-get update
sudo apt-get install syncthing
syncthing --version

syncthing --version phải in ra một dòng bắt đầu bằng syncthing v2. Nếu thấy v1, nghĩa là apt vẫn ưu tiên gói của bản phân phối. Hãy đặt repository upstream có mức ưu tiên cao hơn rồi cài đặt lại.

printf "Package: *\nPin: origin apt.syncthing.net\nPin-Priority: 990\n" | sudo tee /etc/apt/preferences.d/syncthing.pref

Chạy Syncthing dưới dạng system service bằng một user account thông thường, để service tự khởi động cùng hệ thống ngay cả khi chưa có ai đăng nhập.

sudo systemctl enable --now syncthing@youruser.service
systemctl status syncthing@youruser.service

systemctl status phải in ra active (running). Các file cấu hình và index được lưu trong /home/youruser/.local/state/syncthing, còn file cấu hình là config.xml. Các bản cài đặt được tạo trước Syncthing 1.27 sẽ lưu chúng trong ~/.config/syncthing. Vì vậy, hãy kiểm tra cả hai đường dẫn trước khi sao chép dữ liệu giữa các máy.

Tiếp theo, mở các port. Syncthing dùng 22000/TCP cho giao thức đồng bộ, 22000/UDP cho transport QUIC và 21027/UDP cho cơ chế discovery trong mạng cục bộ. Discovery dùng broadcast và multicast, vốn không đi qua Internet, nên trên VPS bạn chỉ cần mở hai port đầu tiên.

sudo ufw allow 22000/tcp
sudo ufw allow 22000/udp
sudo ufw status

ufw status phải liệt kê cả hai rule. Nếu in ra Status: inactive, nghĩa là ufw không lọc traffic nào và chỉ còn network firewall của nhà cung cấp đang hoạt động. Hãy kiểm tra cả panel đó, vì trên hầu hết host đây là một lớp kiểm soát riêng. Nếu thiết bị từ xa bị kẹt ở Disconnected trong khi service vẫn đang chạy, thường là một trong hai firewall đó vẫn chưa mở port.

Truy cập GUI Syncthing mà không công khai nó

GUI web (giao diện người dùng đồ họa) mặc định lắng nghe trên 127.0.0.1:8384, nên chỉ phản hồi từ chính server. Mặc định này giúp bảo vệ hệ thống, vì GUI chứa API (giao diện lập trình ứng dụng) key có thể thay đổi mọi đường dẫn thư mục trên máy.

Đừng mở GUI ra Internet ngay từ đầu. Tài liệu nêu rõ việc bind vào một địa chỉ mạng không đảm bảo điều này: "chỉ định địa chỉ LAN của máy tính sẽ KHÔNG giới hạn quyền truy cập chỉ còn các thiết bị trong mạng cục bộ!" Thay vào đó, hãy forward port qua SSH từ laptop của bạn.

ssh -L 8384:127.0.0.1:8384 youruser@your.vps.example

Mở http://127.0.0.1:8384 trong browser trên máy local khi session đó vẫn đang hoạt động. Tunnel sẽ đóng cùng session SSH, nên sau đó không còn gì tiếp tục lắng nghe.

Nếu cần truy cập trực tiếp vào GUI, trước tiên hãy đặt thông tin đăng nhập. Server không có browser, nên hãy thực hiện việc này từ CLI.

sudo systemctl stop syncthing@youruser.service
sudo -H -u youruser syncthing generate --gui-user=admin --gui-password=-
sudo systemctl start syncthing@youruser.service

-H rất quan trọng, vì nếu thiếu nó thì sudo sẽ giữ home directory của root và bạn sẽ chỉnh sửa sai config.xml. Đặt giá trị password là một dấu gạch ngang đơn khiến syncthing generate đọc password từ standard input. Cách này không ghi password vào shell history, đồng thời password được hash trước khi ghi vào file. Sau khi đăng nhập được, hãy bật HTTPS trong phần cài đặt GUI.

Vì sao Syncthing phát tán cả những lỗi bạn gây ra

FAQ của Syncthing tự trả lời câu hỏi về backup: "Syncthing không phải là ứng dụng backup tốt vì mọi thay đổi đối với file của bạn (chỉnh sửa, xóa, v.v.) đều được phát tán đến tất cả thiết bị."

Nếu vô tình xóa một thư mục trên laptop, Syncthing sẽ hoạt động đúng theo thiết kế. Nó xóa thư mục đó ở mọi nơi chỉ trong vài giây. Đồng bộ nghĩa là các thiết bị có cùng trạng thái, và trạng thái đó cũng bao gồm việc đồng ý rằng một file đã không còn.

File versioning là biện pháp giảm thiểu, nhưng tính năng này tắt mặc định và chỉ hoạt động khi bạn bật lên. Tài liệu ghi rõ versioning "mặc định là 'không versioning file', tức là không giữ lại các bản sao cũ của file." Có 4 chiến lược cho từng thư mục. Trash Can giữ một bản sao của mỗi file bị xóa hoặc bị thay thế do thay đổi từ xa. Simple giữ một số lượng bản cũ cố định cho mỗi file. Staggered giảm dần lịch sử khi các bản cũ hơn, giữ bản sao theo giờ trong 1 ngày, theo ngày trong 1 tháng, v.v. External chuyển từng quyết định cho một command do bạn viết. Các bản cũ được lưu trong thư mục .stversions bên trong thư mục được chia sẻ.

Đặt Staggered trên peer VPS và tắt versioning trên các laptop. Peer luôn bật sẽ giữ lịch sử, còn các laptop vẫn gọn nhẹ.

Nextcloud xử lý việc này tốt hơn nhưng vẫn không phải là backup. File bị xóa sẽ chuyển vào trash bin, còn các lần chỉnh sửa được giữ bởi ứng dụng Versions, nhưng cả hai đều tự động bị dọn khi ổ đĩa đầy dần. Một process trên laptop mã hóa file sẽ đồng bộ các bản đã mã hóa lên, và các bản tốt sẽ tự hết thời hạn theo lịch riêng của chúng.

Cả hai công cụ đều cần một lớp backup thực sự bên dưới: snapshot do một chương trình riêng tạo ra, ghi vào nơi mà sync client không thể truy cập, và được restore ít nhất 1 lần để bạn biết quá trình restore hoạt động. So sánh restic và BorgBackup trình bày nên trỏ công cụ nào vào thư mục dữ liệu.

Cách xử lý xung đột khác nhau giữa hai công cụ

Cả hai công cụ đều tạo một file xung đột khi hai phía thay đổi cùng một file giữa các lần đồng bộ. Điểm khác nhau là ai sẽ nhìn thấy file đó.

Syncthing đổi tên bản sao bị thua thành <filename>.sync-conflict-<date>-<time>-<modifiedBy>.<ext>. Bản sao có thời gian sửa đổi cũ hơn sẽ thua. Khi thời gian giống nhau, thiết bị có giá trị lớn hơn trong 63 bit đầu tiên của device ID sẽ thua. Quy tắc này là tùy ý, nhưng cho cùng một kết quả trên mọi peer. Phần tiếp theo thường khiến người dùng bất ngờ: các file đó “được xem như file bình thường sau khi tạo, nên sẽ được truyền giữa các thiết bị”. Mọi peer đều nhận được bản sao xung đột. Xóa bản sao này chỉ cần một thao tác xóa và thao tác đó sẽ được đồng bộ, nhưng trước tiên bạn sẽ thấy nó trên tất cả máy của mình.

Nextcloud desktop client ghi file thành <name> (conflicted copy YYYY-MM-DD HHMMSS).<ext>, ví dụ mydata (conflicted copy 2018-04-10 093612).txt, và mặc định không upload file đó. Tài liệu của client giải thích rằng người tạo thay đổi là người phù hợp nhất để xử lý xung đột. Hiển thị xung đột cho những người dùng khác chỉ gây nhầm lẫn. Đặt OWNCLOUD_UPLOAD_CONFLICT_FILES=1 trong environment của client nếu bạn muốn hành vi ngược lại.

Vì vậy, xung đột trong Syncthing là sự kiện trên toàn cluster, còn xung đột trong Nextcloud chỉ tồn tại trên một desktop.

Các loại thư mục giúp Syncthing an toàn hơn trên server

Syncthing có ba loại thư mục. Chọn đúng loại trên VPS sẽ loại bỏ nhiều sự cố do thao tác nhầm.

  • Send & Receive là loại mặc định. Các thay đổi được đồng bộ theo cả hai chiều.
  • Send Only bỏ qua mọi thứ mà cluster gửi đến. Dùng loại này khi thiết bị chỉ cần publish dữ liệu. Khi không còn đồng bộ, GUI hiển thị nút màu đỏ "Override Changes". Nút này đẩy trạng thái cục bộ đến mọi thiết bị.
  • Receive Only áp dụng các thay đổi từ cluster và không bao giờ gửi chỉnh sửa cục bộ trở lại. Dùng loại này trên VPS làm archive. Nếu chỉnh sửa cục bộ, GUI sẽ hiển thị nút màu đỏ "Revert Local Changes".

Thư mục Receive Only trên VPS, khi bật versioning kiểu Staggered, sẽ tạo một mirror có version. Nếu xóa một file trên laptop, thay đổi đó vẫn được áp dụng vì thao tác xóa là một thay đổi hợp lệ của cluster. Tuy nhiên, bản cũ được chuyển vào .stversions thay vì biến mất.

Nên chọn phương án nào

7 hàng bên dưới tổng hợp các lý do thực tế khiến mọi người đặt câu hỏi này.

ChartWhich tool fits which job
The data behind this chart
[
  {
    "label": "Keep two of my own laptops in sync",
    "pick": "Syncthing",
    "notes": "No accounts to manage. The VPS is the peer that is always awake."
  },
  {
    "label": "Send a download link to a client",
    "pick": "Nextcloud",
    "notes": "Syncthing has no public link sharing at all."
  },
  {
    "label": "Open a file from a borrowed browser",
    "pick": "Nextcloud",
    "notes": "The Syncthing GUI shows sync state, never file contents."
  },
  {
    "label": "Sync 200 GB between machines I own",
    "pick": "Syncthing",
    "notes": "Peers transfer directly. The VPS copy is optional."
  },
  {
    "label": "Phone photo upload with a store app",
    "pick": "Nextcloud",
    "notes": "The official Syncthing Android app ended in December 2024."
  },
  {
    "label": "Calendar and contacts alongside files",
    "pick": "Nextcloud",
    "notes": "Syncthing syncs files. That is the entire feature set."
  },
  {
    "label": "1 GB VPS with nothing else to spare",
    "pick": "Syncthing",
    "notes": "One Go binary against PHP plus a database plus a web server."
  }
]

Hãy xem hàng đầu tiên. Việc đồng bộ 2 laptop của bạn hướng đến Syncthing, và đây là trường hợp VPS phát huy giá trị khi làm peer luôn hoạt động. Mọi hàng có liên quan đến browser, link hoặc người khác đều hướng đến lựa chọn còn lại.

Nếu Nextcloud liên tục được chọn nhưng bạn lo ngại về footprint của nó, hãy đọc tiếp so sánh Seafile và Nextcloud, vì Seafile vẫn giữ mô hình server nhưng sử dụng sync engine khác bên dưới.

Chạy cả hai trên một VPS

Chúng không loại trừ lẫn nhau. Dùng Syncthing để đồng bộ file giữa các máy của bạn, trong khi Nextcloud xử lý việc chia sẻ và lịch là một mô hình phổ biến.

Nếu dùng cả hai, hãy tuân thủ một quy tắc: không bao giờ trỏ Syncthing vào thư mục dữ liệu của Nextcloud. Nextcloud theo dõi mọi file trong database, nên các file xuất hiện trên disk từ bên ngoài sẽ không hiển thị trong web interface cho đến khi database được cập nhật. Từ thư mục cài đặt Nextcloud:

sudo -u www-data php occ files:scan --all

Lệnh đó in ra số file và thư mục mà nó đã quét. Chạy lệnh này theo timer chỉ là giải pháp tạm thời, không phải thiết kế đúng. Hãy cấp cho mỗi công cụ một thư mục riêng. Nếu bạn vẫn chưa quyết định nên đặt gì trên máy này, hướng dẫn về những gì nên tự host trong năm 2026 sẽ là điểm bắt đầu tốt hơn so với việc chọn công cụ đồng bộ trước.

FAQ

Syncthing có thể thay thế Dropbox không?

Chỉ cho phần đồng bộ giữa các thiết bị của chính bạn. Syncthing không có public share link và user account. Web interface của nó cũng không bao giờ hiển thị nội dung file, vì không có bản sao tập trung để trình duyệt yêu cầu. Android app chính thức đã ngừng phát hành sau bản release tháng 12 năm 2024 và bị gỡ khỏi Play Store, nên hỗ trợ điện thoại hiện phụ thuộc vào một community fork. Nếu cần gửi link cho người khác, bạn cần một server, tức là Nextcloud hoặc giải pháp tương tự.

Syncthing có phải là một giải pháp backup không?

Không, và project cũng nói rõ điều đó. Thao tác xóa và sửa đổi được đồng bộ đến mọi thiết bị, nên một file bị xóa nhầm sẽ biến mất trên mọi nơi trong vài giây. Bật file versioning cho từng folder, đặc biệt là Staggered trên một peer luôn hoạt động, sẽ tạo thời gian khôi phục thông qua thư mục .stversions. Cách này không thay thế snapshot do một tool riêng tạo trên storage riêng.

Vì sao tôi không thấy file trong Syncthing web GUI?

Vì GUI là control panel cho trạng thái sync, không phải file browser. Nó hiển thị folder, device, tiến trình truyền và số lượng conflict, nhưng không bao giờ liệt kê hoặc mở nội dung file. Đây là hệ quả của thiết kế peer to peer: file nằm trên các thiết bị của bạn, còn GUI trên VPS chỉ quản lý tiến trình di chuyển chúng.

Syncthing cần mở những port nào trên VPS?

Mở 22000/TCP cho sync protocol và 22000/UDP cho QUIC transport. Port 21027/UDP dùng cho local discovery qua broadcast và multicast. Các gói này không đi qua Internet, nên hãy để port này đóng trên public server. Giữ GUI trên port 8384 chỉ bind vào 127.0.0.1 và truy cập qua SSH tunnel. Đồng thời kiểm tra network firewall của provider và ufw, vì đây là hai lớp kiểm soát riêng biệt.

Tôi có thể chạy Syncthing và Nextcloud trên cùng một VPS không?

Có. Cách này phù hợp với máy có từ 2 GB RAM trở lên. Giữ directory của hai ứng dụng tách biệt. Nextcloud index file trong database, nên mọi file Syncthing ghi vào storage của Nextcloud sẽ không xuất hiện trong web interface cho đến khi occ files:scan chạy. Hai tool cùng ghi vào một directory cũng tạo ra các conflict file mà không tool nào trong hai tool này dự kiến xử lý.