SSD Nodes Learn Hosting plans →
Hướng dẫn Matt ConnorBởi Matt Connor · Cập nhật ngày 2026-08-27

Tự host NetBird VPN server trên VPS như thế nào

Chạy NetBird mesh VPN trên một VPS: cấu hình DNS, TLS, script quickstart ghim phiên bản, setup key cho peer tự động và so sánh thực tế với Headscale.

Tự host máy chủ VPN NetBird mang lại gì

Tự host máy chủ VPN NetBird đưa control plane lên VPS do bạn sở hữu. Đây là thành phần lưu danh sách peer, quyết định máy nào được truy cập máy nào và giúp hai peer tìm thấy nhau phía sau NAT (network address translation). Các tunnel vẫn sử dụng WireGuard và được mã hóa trực tiếp giữa các máy của bạn. Điểm thay đổi là không có công ty bên ngoài nào lưu inventory thiết bị hoặc quy trình đăng nhập của bạn. Hãy xác định rõ lợi ích thực tế, vì control plane được host bên ngoài cũng không bao giờ giữ các key dùng để mã hóa traffic của bạn, và coordination server thực sự có thể làm gì khi bị breach có phạm vi hẹp hơn nhiều so với điều đa số mọi người nghĩ trước khi đọc phần này.

NetBird nằm giữa hai khái niệm mà có thể bạn đã biết. Đây là mesh overlay, nên các peer kết nối trực tiếp với nhau thay vì gửi toàn bộ traffic qua một gateway. NetBird cũng có thể tự host từ đầu đến cuối, nên cạnh tranh với Headscale, control server tự host của Tailscale. Nếu bạn chỉ từng chạy tunnel qua một gateway duy nhất, hãy đọc trước sự khác biệt giữa WireGuard thông thường và mesh overlay, vì mô hình này giúp bạn hiểu phần còn lại của trang.

Nếu mục tiêu thực tế của bạn là một server duy nhất để toàn bộ traffic đi ra từ đó, mesh có nhiều thành phần hơn mức cần thiết. WireGuard thông thường trên một VPS duy nhất hoặc Tailscale exit node có thể làm việc đó với ít thành phần phải vận hành hơn nhiều. Nếu mục tiêu là truy cập một private network thay vì kết nối các máy với nhau, Tailscale subnet router trên một VPS sẽ quảng bá dải mạng đó đến tailnet bạn đã có mà không cần toàn bộ stack bên dưới.

Stack thực tế chạy gì

Layout gần đây đã thay đổi và phần lớn tài liệu cũ vẫn mô tả layout trước đây. Tính đến August 2026, ở release v0.76.2, quickstart script mặc định ghi một Compose file có 3 service.

  • netbird-server chứa management API, signal service, relay với STUN listener tích hợp sẵn và identity provider tích hợp sẵn. Ở các release cũ, đây là các container riêng biệt, còn identity provider là một bản cài đặt Zitadel riêng mà bạn phải build trước.
  • dashboard là admin web console.
  • traefik xử lý TLS (transport layer security) và yêu cầu chứng chỉ từ Let's Encrypt trong lần khởi động đầu tiên.

Có thêm 2 service, nhưng mặc định ở trạng thái tắt nếu bạn không chọn bật tại prompt. NetBird Proxy service public các service nội bộ trên public hostname. CrowdSec lọc network traffic có hành vi lạm dụng. Không service nào cần thiết để build một mesh hoạt động, và cả 2 đều tiêu tốn memory trên máy nhỏ.

Nếu bạn chuyển từ wg-easy trong một Docker container duy nhất, số lượng thành phần sẽ tăng đáng kể. Đổi lại, bạn có access policy và account riêng cho từng user, cùng các peer kết nối trực tiếp với nhau thay vì đi qua một gateway.

Bạn cần chuẩn bị gì trước khi bắt đầu

Tên miền public là bắt buộc. Dashboard, API và relay đều sử dụng HTTPS trên cổng 443. Traefik lấy chứng chỉ từ Let's Encrypt bằng HTTP challenge. Challenge này cần một tên miền phân giải đến VPS từ Internet public. Địa chỉ IP thuần sẽ không hoạt động trong quy trình này.

Tạo một bản ghi A, netbird.example.com trỏ đến địa chỉ IPv4 public của VPS, rồi chờ bản ghi này có hiệu lực trước khi chạy bất kỳ lệnh nào.

dig +short netbird.example.com

Lệnh này phải in ra địa chỉ của server. Nếu chạy installer trước khi DNS propagate, yêu cầu chứng chỉ sẽ fail ngay lần khởi động đầu tiên. Các lần validation fail liên tiếp có thể chạm rate limit của Let's Encrypt, khiến bạn phải chờ một giờ mới thử lại được.

Có 3 cổng phải truy cập được từ Internet: TCP 80 cho certificate challenge và redirect sang HTTPS, TCP 443 cho dashboard, API, signal và relay traffic, và UDP 3478 cho STUN.

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 3478/udp
sudo ufw reload
sudo ufw status

Bạn cũng phải mở các cổng này trên network firewall của nhà cung cấp. Đây thường là một lớp kiểm soát riêng trong panel VPS. Vì vậy, dù ufw status của máy vẫn hiển thị đúng, máy vẫn có thể từ chối các kết nối.

STUN (session traversal utilities for NAT) giúp peer biết địa chỉ public và cổng mà NAT của chính nó đã cấp, để hai peer có thể thử thiết lập tunnel trực tiếp. Nếu chặn UDP 3478, các peer vẫn kết nối được qua relay trên TCP 443 nên nhìn bề ngoài không có gì hỏng. Tuy nhiên, mọi peer sẽ nhận Connection type: Relayed, và toàn bộ traffic sẽ đi qua VPS thay vì đi trực tiếp giữa các peer.

Về phần mềm, bạn cần Docker có plugin Compose v2, cùng với jq và curl. Script kiểm tra tất cả các thành phần này và dừng nếu thiếu một thành phần. Nếu Docker mới được cài trên máy này, trước tiên hãy xem Cấu hình Docker Compose hoạt động trên VPS.

Các cổng khi bỏ qua reverse proxy đi kèm

Chạy không có Traefik nghĩa là từng service sẽ được expose trực tiếp và danh sách cổng sẽ dài hơn:

  • TCP 80, redirect HTTP
  • TCP 443, HTTPS
  • TCP 33073, management gRPC
  • TCP 10000, signal gRPC
  • TCP 33080, relay qua WebSocket hoặc QUIC
  • UDP 3478, STUN

Chỉ chọn cách này khi máy đã termination TLS cho một dịch vụ khác. Nếu không, Traefik đi kèm sẽ cần ít rule hơn và ít khả năng mắc lỗi hơn.

Cài server NetBird bằng quickstart script

Lệnh một dòng được tài liệu hướng dẫn sẽ đưa bản release mới nhất thẳng vào shell:

curl -fsSL https://github.com/netbirdio/netbird/releases/latest/download/getting-started.sh | bash

Hãy cố định phiên bản thay vì dùng cách đó. latest thay đổi, nên cùng một lệnh chạy cách nhau 2 tuần sẽ tạo ra 2 bản cài đặt khác nhau, và không có thông tin nào trên đĩa ghi lại bản nào đã ghi cấu hình của bạn. Hãy tải bản release có tag, đọc script, rồi mới chạy.

mkdir -p ~/netbird
cd ~/netbird
curl -fsSL -o getting-started.sh \
  https://github.com/netbirdio/netbird/releases/download/v0.76.2/getting-started.sh
less getting-started.sh
bash getting-started.sh

Script trước tiên hỏi domain:

Enter the domain you want to use for NetBird (e.g. netbird.my-domain.com):

Sau đó script hỏi cách xử lý TLS:

Which reverse proxy will you use?
  [0] Traefik (recommended - automatic TLS, included in Docker Compose)
  [1] Existing Traefik (labels for external Traefik instance)
  [2] Nginx (generates config template)
  [3] Nginx Proxy Manager (generates config + instructions)
  [4] External Caddy (generates Caddyfile snippet)
  [5] Other/Manual (displays setup documentation)
Enter choice [0-5] (default: 0):

Chọn [0]. Các tùy chọn từ 2 đến 5 sẽ ghi một đoạn cấu hình và để bạn tự kết nối các thành phần. Cách này đúng trên máy đã chạy proxy, nhưng không phù hợp trên máy mới cài. Sau đó, tùy chọn 0 sẽ hỏi địa chỉ email Let's Encrypt để gửi thông báo sắp hết hạn.

Trong lần cài đặt đầu tiên, hãy trả lời không với service NetBird Proxy. Service này cần thêm 2 bản ghi DNS, proxy.netbird.example.com và wildcard *.proxy.netbird.example.com, nhưng không mang lại tác dụng gì cho một mesh thông thường. Đồng thời trả lời không với CrowdSec. Bạn có thể thêm cả 2 thành phần này sau.

Script ghi các tệp vào thư mục hiện tại: docker-compose.yml, config.yaml với mode 600, dashboard.env và traefik-dynamic.yaml nếu bạn chọn Traefik đi kèm. Hãy xem thư mục này là state cần giữ lại, vì config.yaml chứa key dùng để mã hóa dữ liệu trong store. Cài đặt lại không thể khắc phục việc mất key này.

docker compose ps
docker compose logs -f netbird-server

Mọi service phải đọc được running, và log của server phải dừng ổn định thay vì restart liên tục. Hãy theo dõi riêng certificate:

docker compose logs traefik | grep -i acme

ACME (automatic certificate management environment) là protocol Traefik dùng để lấy certificate. Lỗi ở bước này gần như luôn do DNS hoặc cổng 80 bị đóng.

Tạo tài khoản admin đầu tiên

Mở https://netbird.example.com. Với một bản cài đặt mới, trang này sẽ mở trang thiết lập thay vì biểu mẫu đăng nhập. Nhập địa chỉ email, tên và mật khẩu, rồi nhấp vào Create Account. Tài khoản đó trở thành admin đầu tiên và trang sẽ chuyển hướng đến biểu mẫu đăng nhập.

Tài khoản này được lưu trong user store riêng của NetBird, do một identity provider được tích hợp trong container netbird-server cung cấp. Không có thành phần bên ngoài nào được sử dụng. Đây là thay đổi lớn nhất so với NetBird self-hosted của một năm trước. Khi đó, một bản cài đặt hoạt động được yêu cầu phải triển khai Zitadel hoặc Keycloak trước, rồi sao chép 4 giá trị OIDC (OpenID Connect) vào setup.env trước khi bất kỳ thành phần nào có thể khởi động.

Nếu trình duyệt hiển thị cảnh báo certificate thay vì trang thiết lập, certificate chưa được cấp. Hãy xử lý lỗi này trước khi tiếp tục. Dashboard giao tiếp với API qua cùng hostname và có thể gặp lỗi khó xác định khi certificate không hợp lệ.

Thêm peer đầu tiên

Cài client trên bất kỳ máy Linux nào, kể cả chính VPS nếu bạn muốn đưa máy đó vào mesh:

curl -fsSL https://pkgs.netbird.io/install.sh | sh

Trên Debian và Ubuntu, script này cấu hình package repository của NetBird rồi cài client qua apt. Vì vậy, package manager vẫn quản lý client trong cả hai trường hợp. Nếu bạn không muốn pipe script vào shell, hãy lưu script trước bằng curl -fsSL -o install.sh https://pkgs.netbird.io/install.sh rồi đọc nội dung trước khi chạy sh install.sh. Dù dùng cách nào, hãy xác nhận các thành phần đã được cài:

apt-cache policy netbird

netbird là CLI client và daemon. netbird-ui là desktop tray app, không có tác dụng trên headless server.

Bây giờ trỏ client đến server của bạn:

sudo netbird up --management-url https://netbird.example.com

Nếu bỏ --management-url, client sẽ đăng ký với hosted service của NetBird vì đó là giá trị mặc định được tích hợp sẵn. Command vẫn chạy thành công, máy vẫn nhận được một địa chỉ, nhưng dashboard self-hosted của bạn vẫn trống. Hầu như ai cũng mắc lỗi này ít nhất một lần.

Command sẽ in ra một URL. Mở URL đó trong browser để hoàn tất đăng nhập. Sau đó:

netbird status
ip addr show wt0

Đọc 4 dòng từ netbird status: Management: Connected, Signal: Connected, một dòng Relays: liệt kê mọi relay khả dụng, và một dòng NetBird IP: trong dải overlay. wt0 là WireGuard interface do NetBird tạo, và interface này phải có cùng địa chỉ đó.

Đăng ký máy thứ hai ở chế độ không tương tác bằng setup key

Đăng nhập bằng trình duyệt không dùng được cho máy không có trình duyệt và không có người thao tác trực tiếp. Setup key là token xác thực trước, dùng để đăng ký máy mà không cần bước tương tác. Tạo key trong dashboard, tại mục Setup Keys.

Có 2 loại. One-off key xác thực đúng 1 máy rồi được sử dụng hết. Reusable key đăng ký được nhiều máy, và có thể đặt giới hạn số lượng tùy chọn. Cả 2 loại đều có thời hạn và có thể tự động gán peer mới vào một group, để các access rule của group đó được áp dụng ngay khi máy xuất hiện.

sudo netbird up --setup-key <SETUP-KEY> \
  --management-url https://netbird.example.com \
  --hostname build-runner-01

--hostname đặt tên hiển thị trong dashboard. Nếu không đặt, peer sẽ dùng tên mà máy tự nhận diện, và một danh sách máy đều có tên ubuntu thì không giúp ích gì.

Với container và build agent có thời gian tồn tại ngắn, hãy đánh dấu key là ephemeral khi tạo. Peer được đăng ký bằng ephemeral key sẽ tự động bị xóa sau khi offline hơn 10 phút, nhờ đó các entry không còn hoạt động sẽ không nằm trong danh sách peer.

Có một giới hạn cần hiểu trước khi lập kế hoạch dùng setup key: khi key hết hạn hoặc bị xóa, key chỉ ngừng cho phép đăng ký mới, không ngắt kết nối các máy đã đăng ký bằng key đó. Muốn thu hồi quyền truy cập của một máy, bạn phải xóa peer đó.

Bạn còn cần một identity provider riêng không?

Với một cài đặt nhỏ thì không. User store tích hợp sẵn xử lý các tài khoản được tạo từ dashboard, và như vậy là đủ cho một nhóm nhỏ người dùng.

Bạn nên dùng external identity provider khi đã có sẵn một provider và không muốn duy trì thêm một danh sách người dùng khác. NetBird chấp nhận mọi provider hỗ trợ OIDC. Hãy đăng ký một confidential OIDC client trong provider của bạn, sau đó thêm client đó vào dashboard của NetBird với 4 giá trị: tên, client ID, client secret và issuer. NetBird sẽ cung cấp redirect URL để bạn dán ngược lại vào provider. NetBird có integration riêng cho Google, Microsoft Entra ID, Okta, Zitadel, Keycloak, Authentik và Pocket ID. Các provider khác dùng cấu hình OIDC generic. Nếu bạn đã chạy Authentik làm hệ thống single sign-on tự host, đây là cách duy trì một danh sách tài khoản duy nhất thay vì hai danh sách.

Local login vẫn khả dụng sau khi bạn thêm provider, và mọi provider đã cấu hình đều xuất hiện trên trang login. Hãy giữ một tài khoản local admin với mật khẩu mạnh. Khi cấu hình OIDC bị lỗi, bạn vẫn còn cách đăng nhập vào hệ thống.

NetBird hay Headscale: nên chạy control plane nào?

Cả hai đều loại bỏ cùng một dependency: hosted control server mà client của bạn thường phải kết nối về. Tuy nhiên, hai dự án có mô hình khác nhau.

Headscale triển khai lại control server của Tailscale, còn bạn tiếp tục dùng client Tailscale chính thức. Dự án không có web console chính thức. Bạn quản lý user và pre-authentication key bằng command headscale, sử dụng một config file. Có các web interface do cộng đồng phát triển, nhưng chúng không thuộc dự án. Mô hình này phù hợp nếu bạn muốn lưu state trong file và quản lý thay đổi bằng version control.

NetBird cung cấp toàn bộ product: client riêng, dashboard riêng, identity provider tích hợp và access policy có thể chỉnh sửa trong browser. VPS của bạn sẽ có nhiều thành phần hơn. Tuy nhiên, việc bàn giao cho đồng nghiệp không bao giờ mở terminal sẽ đơn giản hơn nhiều.

Chạy Headscale nếu bạn đã dùng Tailscale client hoặc muốn control plane nhỏ gọn nhất có thể. Chạy NetBird nếu có nhiều người cần quản lý peer và bạn muốn có console cùng SSO mà không phải tự lắp ghép. Trước khi quyết định, hãy kiểm tra gói miễn phí Tailscale thực sự bao gồm những gì, vì một nhóm có tối đa sáu user với số lượng device không giới hạn sẽ không phải trả phí cho hosted control plane và có thể không cần tự chạy control plane. Vượt quá giới hạn đó, chi phí tăng theo số người thay vì số máy, vì vậy tính chi phí Tailscale cho nhóm của bạn sẽ giúp bạn có một con số để so sánh với chi phí VPS và số giờ cần bỏ ra để vận hành stack này.

VPS nhỏ đến mức nào thì chạy được?

Mức tối thiểu được ghi trong tài liệu là 1 CPU và 2 GB memory. Ghi chú của NetBird hiện đặt mức tối thiểu thực tế gần 1 GB RAM, vì việc quản lý user hiện đã được thực hiện local. Layout cũ cần 2 GB đến 4 GB khi một deployment Zitadel đầy đủ còn nằm trong stack. Hãy chọn VPS 2 GB. Phần headroom bổ sung cho phép quá trình upgrade pull image mới trong khi image cũ vẫn còn trên disk.

Có 3 thành phần có thể an toàn không cài trên máy nhỏ. Không chọn NetBird Proxy service. Thành phần này dùng để publish service nội bộ bằng public hostname và không liên quan đến việc peer kết nối với nhau. Không chọn CrowdSec. Bạn có thể thêm nó sau khi máy đã exposed, thay vì cài ngay từ đầu. Giữ SQLite store mặc định trong volume netbird_data. Chỉ chuyển sang PostgreSQL khi bạn tách deployment trên nhiều máy hoặc gặp vấn đề concurrency thực tế. Tài liệu có hướng dẫn migration để thực hiện việc này sau.

Relay là component duy nhất không thể bỏ. Nếu NAT của 2 peer gán một port khác nhau cho từng destination, chúng sẽ không bao giờ thiết lập được tunnel trực tiếp. Khi đó relay là path duy nhất giúp chúng kết nối. Tắt relay chỉ tiết kiệm được rất ít memory nhưng làm hỏng connection theo cách khó trace.

Khi một máy không còn đủ, relay là component đầu tiên nên chuyển sang máy khác. Standalone relay chạy với NB_LISTEN_ADDRESS, NB_EXPOSED_ADDRESS, NB_AUTH_SECRET và NB_ENABLE_STUN. Shared secret trên relay và main server phải giống hệt nhau. Nếu không, client sẽ fail khi authenticate với relay.

Các chế độ lỗi và những gì bạn sẽ thấy

Dashboard hiển thị cảnh báo chứng chỉ. Traefik chưa lấy được chứng chỉ. Chạy docker compose logs traefik | grep -i acme. Có hai nguyên nhân. Hoặc dig +short netbird.example.com chưa trỏ về VPS này, hoặc TCP 80 bị chặn ở đâu đó giữa Let's Encrypt và container, thường là trên firewall mạng của nhà cung cấp chứ không phải trên ufw. Hãy khắc phục nguyên nhân trước khi thử lại liên tục, vì các lần xác thực thất bại bị giới hạn rate và bạn sẽ không thể thử lại trong một giờ.

Client báo đã kết nối nhưng dashboard trống. Client đã đăng ký với dịch vụ hosted của NetBird vì thiếu --management-url. Chạy netbird status --detail và đọc dòng Management:, dòng này cho biết server mà client thực sự đang kết nối. Nếu thấy Management: Connected to https://api.netbird.io:443, client đã kết nối đến cloud. Chạy sudo netbird down, sau đó chạy lại sudo netbird up --management-url https://netbird.example.com.

Mọi peer đều hiển thị Connection type: Relayed. Không có tunnel trực tiếp nào được thiết lập, nên toàn bộ traffic đi qua VPS và thêm một hop latency. Kiểm tra UDP 3478 trên firewall của VPS và firewall của nhà cung cấp, vì STUN cho phép peer xác định địa chỉ public và port của chính nó. netbird status --detail cũng in Direct: false và các loại candidate ICE (interactive connectivity establishment) của từng peer, cho biết quá trình kết nối đã đi được đến đâu. Trên một số network, relayed là kết quả duy nhất có thể có và không có lỗi gì.

Một peer tham gia nhưng không truy cập được bất cứ thứ gì. Có mặt trong mesh không có nghĩa là hai peer được phép liên lạc với nhau. Access policy quyết định việc đó, và một group không được gắn policy sẽ không truy cập được gì. Kiểm tra policy trong dashboard trước khi bắt đầu debug route và firewall.

netbird status báo daemon gặp lỗi. Service không chạy. Dùng sudo netbird service status và sudo netbird service start. Client log nằm tại /var/log/netbird/client.log. Với những vấn đề chưa xác định được nguyên nhân, netbird debug bundle --anonymize --system-info sẽ thu thập log, status, route, thiết lập DNS và trạng thái firewall vào một archive duy nhất.

Sao lưu và nâng cấp

Hai thành phần này chứa toàn bộ dữ liệu cần thiết cho một bản cài đặt: thư mục chứa docker-compose.yml và config.yaml, cùng Docker volume chứa database và các encryption key. Hãy sao lưu chúng cùng nhau. config.yaml chứa key dùng để mã hóa dữ liệu trong store, vì vậy bản sao database không có key này sẽ không khôi phục được dữ liệu có thể đọc.

docker volume ls
docker compose down
sudo tar czf netbird-config.tgz -C ~ netbird
docker run --rm -v netbird_netbird_data:/data -v "$PWD":/backup \
  alpine tar czf /backup/netbird-data.tgz -C /data .
docker compose up -d

Compose thêm tiền tố là thư mục project vào tên volume, nên volume được ghi là netbird_data thường xuất hiện dưới tên netbird_netbird_data. Chạy docker volume ls trước và dùng tên mà lệnh in ra. Nếu không, docker run sẽ âm thầm tạo một volume rỗng và không archive được dữ liệu nào. Lưu các archive bên ngoài VPS. Nếu đã có công cụ sao lưu, restic hoặc BorgBackup có thể xử lý phần sao lưu offsite.

Nâng cấp server gồm pull image rồi recreate container:

docker compose pull
docker compose up -d
docker compose ps

Trước khi dựa vào quy trình này, hãy chạy docker compose config | grep image:. Mọi tag có giá trị latest nên được pin vào một version, vì cùng lý do bạn đã pin install script: bạn cần biết version nào đang chạy và cần có một version để quay lại khi nâng cấp gặp lỗi. Client được nâng cấp bằng package manager đã dùng để cài chúng.

FAQ

Tôi có cần identity provider riêng để tự host NetBird không?

Không. Các bản phát hành hiện tại có user store tích hợp sẵn, nên bạn tạo tài khoản admin đầu tiên trong trình duyệt tại https://netbird.example.com rồi thêm user từ dashboard. External OIDC provider là tùy chọn và có thể thêm sau bằng 4 giá trị: tên, client ID, client secret và issuer. Các hướng dẫn yêu cầu bạn deploy Zitadel hoặc Keycloak trước NetBird mô tả một mô hình hiện không còn cần thiết. Làm theo các hướng dẫn đó khiến bạn phải vận hành thêm một service.

Vì sao tất cả peer của tôi đều hiển thị Connection type: Relayed?

Kết nối trực tiếp không được thiết lập, nên traffic đi qua relay trên VPS của bạn. Nguyên nhân thường gặp là UDP 3478 bị chặn. Đây là cổng STUN mà peer dùng để phát hiện địa chỉ và cổng public của chính nó. Hãy mở cổng này trên firewall của VPS và firewall mạng riêng của nhà cung cấp, sau đó chạy lại netbird status --detail và đọc dòng Direct:. Trên mạng có NAT gán một cổng khác cho từng đích, relayed là kết quả duy nhất có thể xảy ra và không có gì được cấu hình sai.

Client của tôi đã kết nối nhưng dashboard không hiển thị peer nào. Chuyện gì đã xảy ra?

Client đã đăng ký với hosted service của NetBird thay vì server của bạn. Điều này xảy ra khi --management-url bị bỏ qua. netbird status --detail in ra server mà client đang kết nối trên dòng Management:, nên giá trị như https://api.netbird.io:443 xác nhận điều đó. Chạy sudo netbird down, sau đó chạy sudo netbird up --management-url https://netbird.example.com, và peer sẽ xuất hiện trong dashboard.

NetBird tự host khác Headscale như thế nào?

Cả hai đều thay thế control server được host sẵn bằng một server do bạn tự vận hành. Headscale chỉ là control plane: bạn quản lý nó bằng lệnh headscale và file cấu hình; không có web console chính thức, và nó điều khiển các client Tailscale chính thức. NetBird cung cấp client riêng, admin dashboard và tích hợp identity provider trong cùng một stack. Headscale dễ vận hành hơn và lưu state trong các file. NetBird dễ bàn giao cho những người không dùng terminal hơn.

Server NetBird tự host cần VPS có cấu hình bao nhiêu?

Mức tối thiểu được tài liệu ghi nhận là 1 CPU và 2 GB memory, nên bạn nên mua gói có 2 GB. Mức thực tế đã giảm xuống khoảng 1 GB trong các bản phát hành gần đây vì identity provider hiện được tích hợp sẵn thay vì phải deploy riêng. Từ chối các service proxy và CrowdSec tùy chọn trong quá trình cài đặt, đồng thời giữ SQLite store mặc định cho đến khi bạn thực sự cần PostgreSQL.