- Tổng hợp một trường hợp xây dựng homelab tự vận hành nhiều dịch vụ như media·AI·ảnh·giám sát bằng cách kết hợp phần cứng nhỏ gọn với đường hầm cloud miễn phí
- Bắt đầu từ OrangePI 5 rồi nâng cấp lên GMKTec NUC (32GB RAM, 1TB NVMe), đồng thời vận hành song song máy ảo Hetzner trong mô hình lai
- Tất cả dịch vụ đều chạy trong container Docker, bảo đảm tính tái lập và bảo mật bằng IaC dựa trên role Ansible và mã hóa SOPS
- Cung cấp truy cập từ bên ngoài qua Cloudflare Tunnel mà không cần mở cổng inbound, đồng thời xử lý reverse proxy và xác thực SSO bằng Traefik + Authentik
- Với chi phí vận hành khoảng 7 euro/tháng, vẫn giữ được quyền sở hữu dữ liệu mà không bị phụ thuộc nhà cung cấp, và coi trọng việc học hỏi cùng niềm vui hơn là sự hoàn hảo
Cấu hình phần cứng
- Ban đầu dùng OrangePI 5, nhưng do vấn đề quản lý nguồn điện và lưu trữ kết nối qua USB nên đã chuyển sang GMKTec NUC
- Trang bị CPU AMD Ryzen 7 5700U, 32GB RAM, lưu trữ 1TB NVMe M2
- Có 2 khe M2 nên cả RAM và ổ đĩa đều có thể mở rộng
- Hoạt động ổn định hơn nhiều khi chạy liên tục quanh năm
- Các dịch vụ cần chạy 24/7 được vận hành riêng trên máy ảo Hetzner
- NAS vẫn chưa được triển khai, dữ liệu quan trọng được đồng bộ bằng Syncthing
- Có quan tâm tới Ugreen NAS, Ubiquiti, v.v., nhưng hiện tại vẫn thích chính quá trình tự tay mày mò hơn
Nguyên tắc vận hành
- Infrastructure-as-Code: tự động hóa càng nhiều cấu hình càng tốt bằng script hoặc nền tảng quản lý như Ansible, rồi lưu dưới dạng mã
- Tính tái lập (Reproducibility): khi xảy ra sự cố hoặc thay máy, phải có thể triển khai và cấu hình lại hạ tầng nhanh chóng; khi gỡ bỏ dịch vụ thử nghiệm cũng không được để lại rác
- Tính dễ dùng: vì đây là dự án sở thích nên ưu tiên cách tiếp cận tiêu chuẩn và quen thuộc
Hệ điều hành
- Cài trực tiếp bản phân phối Debian lên bare metal để sử dụng
- Cũng từng cân nhắc NixOS (build có thể tái lập) hay Talos (cụm k8s), nhưng tạm hoãn vì gánh nặng quản lý workload k8s trên một máy đơn và thiếu thời gian
- Cũng đánh giá rằng hypervisor như ProxMox là không cần thiết, nên không dùng
Kiến trúc mạng
- Chọn Cloudflare Tunnel làm cách công khai dịch vụ ra bên ngoài
- Máy chủ tạo kết nối chỉ outbound tới mạng Cloudflare, nên không cần mở cổng inbound trên firewall
- Sau khi cấu hình tunnel, lưu lượng hai chiều sẽ đi qua tunnel
- Nếu nối domain vào Cloudflare DNS thì có thể ánh xạ theo từng subdomain tới cổng hoặc giao thức cụ thể (HTTP/HTTPS/TCP, v.v.) trên máy
- Được cung cấp hoàn toàn miễn phí và được đánh giá là lựa chọn tốt hơn ngrok
- Phương án IP tĩnh (White IP) vừa tốn chi phí vừa có rủi ro bảo mật; cũng có các lựa chọn như Tailscale Funnel, nhưng Cloudflare Tunnel được chọn vì là giải pháp đơn giản nhất
-
Traefik
- Reverse proxy mã nguồn mở, nhận diện Docker một cách native nên rất thuận lợi cho tự động hóa máy chủ
- Chỉ cần gắn label phù hợp cho container là có thể tự động phát hiện routing, không cần sửa file cấu hình riêng
-
Authentik
- Nền tảng IdP (Identity Provider) và SSO
- Có thể lưu cấu hình dưới dạng blueprint (file YAML) nên vẫn tuân thủ nguyên tắc IaC
- Dùng middleware ForwardAuth để chuyển hướng tới trang đăng nhập khi truy cập các dịch vụ nhạy cảm
Công cụ vận hành
-
Ansible
- Công cụ tự động hóa hạ tầng agentless (chỉ cần SSH), ưu điểm là cấu hình dựa trên YAML và có rất nhiều ví dụ
- Định nghĩa từng dịch vụ theo đơn vị role: gồm tasks, defaults, handlers, templates, files
- tasks: định nghĩa các tác vụ sẽ chạy
- defaults: giá trị mặc định như tag image, cổng, tên container
- handlers: khởi động lại container khi cấu hình thay đổi
- templates: render file
.env, config.yaml dựa trên Jinja2
- files: cấu hình tĩnh, script
- Các bước triển khai dịch vụ điển hình:
- Tạo tài nguyên dùng chung (network, volume) → tạo schema và user trong PostgreSQL → render template cấu hình → pull image Docker → chạy container (bao gồm biến môi trường, cấu hình logging) → provision cấu hình xác thực vào blueprint của Authentik → nếu cần thì cấu hình Cloudflare Tunnel
- Nhược điểm là tài liệu đồ sộ, cấu trúc DSL lặp đi lặp lại và có nhiều boilerplate, nhưng vẫn tiếp tục dùng vì đã quen
- Chạy playbook thủ công, không tích hợp GitOps, và hiện tại như vậy là đủ
-
SOPS (Secrets OPerationS)
- Chỉ mã hóa các giá trị YAML/JSON và giữ nguyên cấu trúc key, nên Git diff vẫn phát huy tác dụng
- Dùng backend mã hóa age — công cụ “đơn giản hóa việc mã hóa mà không cần PGP”
- Với mỗi host, tách riêng file cấu hình thường (
homelab.yaml) và file mã hóa (homelab.sops.yaml)
- Quy trình làm việc:
- Tạo khóa bằng
age-keygen → chỉnh sửa file mã hóa bằng lệnh sops (giải mã trong editor rồi tự mã hóa lại khi lưu) → tự động giải mã khi chạy Ansible
- Do Ansible hỗ trợ SOPS native nên không cần module hay cờ bổ sung
- So với Ansible Vault, ưu điểm là mã hóa theo từng giá trị thay vì cả file, nên vẫn tận dụng được diff
- Giới hạn: phải chia sẻ private key age với thành viên một cách an toàn, và nếu mất khóa thì không thể khôi phục secret
- Với homelab do một người vận hành thì đây là mức độ phức tạp phù hợp
Các dịch vụ đang chạy
-
Quản lý media: stack *arr
- Prowlarr: trình quản lý indexer, chuyển kết quả tìm kiếm sang các dịch vụ *arr khác
- Radarr: trình quản lý bộ sưu tập phim — chỉ định phim mong muốn là hệ thống sẽ tự tìm kiếm, tải xuống và sắp xếp
- Lidarr: chức năng tương tự cho nhạc, tích hợp với Navidrome
- Bazarr: tự động tải phụ đề
- Tidarr: dịch vụ lưu trữ nhạc từ Tidal ở máy cục bộ
- Transmission: client BitTorrent (cổng 9091), xử lý mọi yêu cầu tải xuống từ các dịch vụ *arr
- Tất cả dịch vụ đều đặt sau lớp xác thực Authentik
- Dùng thư mục tải xuống chia sẻ (
/mnt/data/docker/transmission/downloads) và PUID/PGID 1000 để tiết kiệm dung lượng bằng hardlink
- Ví dụ workflow: thêm phim vào Radarr → tìm qua Prowlarr → Transmission tải xuống → Radarr chuyển vào thư viện media → có thể xem bằng Jellyfin
-
Tiêu thụ media
- Jellyfin: máy chủ media mã nguồn mở, không cần đăng nhập cloud như Plex. Dùng xác thực riêng và hỗ trợ nhiều thiết bị, bao gồm ứng dụng Android TV
- Navidrome: máy chủ stream nhạc hỗ trợ Subsonic API, tích hợp với ứng dụng di động (DSub2000, v.v.). Lidarr sẽ đưa nhạc vào thư mục thư viện
- Calibre Web: trình quản lý và đọc thư viện ebook
- Cơ sở dữ liệu metadata do ứng dụng desktop Calibre trên laptop quản lý được đồng bộ lên máy chủ bằng Syncthing
- Có thể truy cập sách từ nhiều trình đọc qua OPDS API
-
AI và chat
- LibreChat: giao diện chat AI self-hosted, có thể kết nối nhiều nhà cung cấp LLM (OpenAI, Anthropic, Ollama cục bộ)
- Hỗ trợ RAG (Retrieval Augmented Generation)
- Cần MongoDB (lịch sử chat), PostgreSQL + pgvector (embedding), MeiliSearch (full-text search) nên cấu hình tương đối nặng
- Do Claude Code dễ tiếp cận hơn nên tần suất sử dụng thấp, đang cân nhắc gỡ bỏ
-
Ảnh và tệp
- Immich: dịch vụ self-hosted thay thế Google Photos
- Tự động sao lưu ảnh từ điện thoại, nhận diện khuôn mặt, sắp xếp album, trích xuất metadata EXIF
- Dùng PostgreSQL riêng (kèm pgvector) và container machine learning (phân loại ảnh), hiện đang lưu trữ vài nghìn bức ảnh
- Syncthing: đồng bộ thư mục giữa laptop, điện thoại và máy chủ. Đồng bộ trực tiếp P2P không qua trung gian cloud
- Đồng bộ Obsidian Vault, tài liệu và nhiều nội dung khác giữa nhiều thiết bị cũng như Android
- MinIO: object storage tương thích S3, dùng cho việc thử nghiệm hoặc ứng dụng cần S3 API
-
Đọc và thông tin
- Miniflux: trình đọc RSS tối giản, đăng ký khoảng 50 nguồn blog và tin tức
- Hỗ trợ phím tắt và cung cấp feed theo thứ tự thời gian mà không có sắp xếp bằng thuật toán
-
Hạ tầng và xác thực
- Traefik: reverse proxy định tuyến traffic tới container Docker dựa trên hostname. Khi container khởi động, chỉ cần có label phù hợp là sẽ được tự động phát hiện
- Authentik: SSO và nhà cung cấp định danh. Bảo vệ dịch vụ bằng middleware ForwardAuth, đồng thời lưu blueprint vào Git để quản lý toàn bộ cấu hình xác thực
- PostgreSQL: máy chủ cơ sở dữ liệu dùng chung; Authentik, Miniflux, Immich, LibreChat, v.v. dùng chung một instance thay vì mỗi dịch vụ một DB riêng để tiết kiệm tài nguyên và dễ sao lưu
- Redis: bộ nhớ đệm và nơi lưu session dùng chung, chủ yếu dùng cho quản lý session và hàng đợi công việc của Authentik cùng các dịch vụ khác
-
Phần mềm tùy chỉnh
- Highlight Exporter: dịch vụ Go trích xuất highlight sách từ KOReader, Readwise, Apple Books rồi chuyển sang Markdown tương thích Obsidian
- Telegram Assistant: bot Telegram cung cấp nhiều tác vụ tự động hóa và quyền truy cập AI trong chat nhóm; là dự án được viết lại thường xuyên nhất để thử công nghệ mới
- Chess-blunder trainer: web app nhập các ván từ chess.com hoặc lichess.com, phân tích bằng Stockfish rồi lọc ra những nước đi sai để luyện tập; sắp được phát hành mã nguồn mở
Giám sát
-
Beszel
- Giải pháp giám sát nhẹ với cấu hình và vận hành đơn giản, có mặc định tốt
- Đánh giá rằng stack Grafana là quá nặng và phức tạp nếu chỉ muốn xem thống kê OS cơ bản trên hai máy
- Cũng thấy các dự án tương tự như Glances cần tinh chỉnh quá nhiều
- Beszel bao phủ 120% nhu cầu trong khi việc cài đặt lại rất đơn giản
-
Statsping
- Công cụ ping dịch vụ tối giản để giám sát chi tiết một số tài nguyên cụ thể
- Gửi ping tới các endpoint đã định nghĩa, báo cáo độ trễ và khả dụng, đồng thời gửi cảnh báo bằng nhiều cách khi dịch vụ gặp sự cố
- Được host trên máy cloud để vẫn sống sót cả khi homelab gặp sự cố, mà không tạo thêm gánh nặng bảo trì
Những điểm hiện còn thiếu
-
Sao lưu
- Dù nhận thức rõ tầm quan trọng của backup, hiện tại vẫn chưa triển khai gì cả
- So với mất dữ liệu phim, nhạc hay ảnh thì việc cần thiết hơn là backup cơ sở dữ liệu của từng dịch vụ, nhưng vẫn chưa quyết định được giải pháp phù hợp (như restic) và cấu hình phần cứng
-
Cấu hình RAID
- Dữ liệu media và hệ thống hiện cùng tồn tại trên một ổ M2 NVMe duy nhất
- Không đủ không gian vật lý để đặt NAS server hoặc máy backup riêng
-
Tính độc lập với cloud
- Khả năng truy cập tài nguyên đang phụ thuộc nhiều vào hạ tầng Cloudflare Tunnel
- Nếu Cloudflare gặp sự cố thì quyền truy cập hạ tầng cũng bị gián đoạn, nên có kế hoạch đầu tư vào giải pháp thay thế trong tương lai
-
IaC và tự động hóa hoàn chỉnh
- Chạy playbook Ansible thủ công, không có pipeline CI hay provision tự động
- Ở thời điểm hiện tại, chưa cảm thấy việc chuyển sang GitOps sẽ mang lại lợi ích lớn
Hiệu quả chi phí và kết luận
- Chi khoảng 7 euro/tháng cho máy ảo Hetzner; điện năng tiêu thụ của home server được ước tính là rất thấp
- Mỗi lần thêm dịch vụ mới hoặc sửa cấu hình mất khoảng 20–30 phút, phần lớn giao cho Claude Code rồi chỉ review nhanh trước khi deploy
- Tổng thời gian đầu tư cho toàn bộ dự án được ước tính khoảng 100–150 giờ trong vài năm
- Vẫn sở hữu dữ liệu với mức phụ thuộc nhà cung cấp tối thiểu, tránh rủi ro mất dữ liệu do thay đổi điều khoản dịch vụ đột ngột, feed theo thuật toán, hay sáp nhập/mua lại
- Mục tiêu không phải là một hệ thống hoàn hảo mà là hiểu hạ tầng và tận hưởng quá trình; mỗi dịch vụ được triển khai, mỗi role Ansible được viết, mỗi secret được mã hóa đều mang giá trị học hỏi
- Nếu muốn bắt đầu với homelab, điều quan trọng là hãy bắt đầu nhỏ và đừng suy nghĩ quá nhiều
19 bình luận
Mình từng dùng Tailscale rồi giờ đang dùng Cloudflare Tunnel, và thật sự rất thích. Dù công dụng của hai cái có phần khác nhau, nhưng trong trường hợp của mình thì Tailscale bị xung đột với AdGuard nên khá khó dùng.
Chẳng phải chỉ cần đặt parent DNS của Tailscale thành AdGuard là được sao?
Không phải
adguard desktop, nhưngadguard mobilehoạt động như một VPN cục bộ nên không thể dùng cùng nhau.Có vẻ như đã xảy ra xung đột ở phần VPN chứ không phải DNS.
Gần đây khi thử đủ cách để phát radio MBC trên Google Nest,
cuối cùng tôi đã dùng Cloudflare Tunnel. Đây là một dịch vụ tốt đến mức khiến người ta phải tự hỏi vì sao lại miễn phí.
Nghe có vẻ thú vị đấy. Kể thêm chút đi.
Tôi đang dùng gói free tier của Oracle Cloud. 4 vCPU, 24 GB RAM, 200 GB, chạy trên nền tảng ARM nên thỉnh thoảng có vài thứ không tương thích, nhưng ngoài điều đó ra thì rất tuyệt để làm đồ chơi vọc vạch.
Nhà mạng tôi mới đăng ký chặn các cổng 80 và 443, nên tôi đang dùng Cloudflare Tunnel để lách qua.
Nếu không có nó thì chắc tôi đã phải chịu phí phạt hợp đồng để đổi nhà mạng rồi
Bạn đang dùng nhà mạng nào mà họ chặn cổng vậy?
Nói chính xác thì không phải tôi tự chặn, mà đúng hơn là modem/router của nhà mạng đã chặn không cho port forwarding cổng 80, 443.
Khi tôi dùng router bên thứ ba để port forwarding thì họ lại âm thầm bóp gói cước đăng ký tùy chọn 1g xuống còn 100mbps.
Trong lúc tìm phương án thay thế, tôi thấy gắn vào cf tunnel là gọn gàng nhất.
Hãy kiểm tra xem router bên thứ ba của bạn có chức năng chuyển đổi địa chỉ MAC hay không, rồi thử đổi sang địa chỉ của router do nhà mạng cung cấp thì có vẻ cũng có thể vượt qua được.
Sau khi thiết lập
cf tunnel, logfail2bantừng chất đống ở cổng 80 và 443 biến mất hẳn, nên tôi bỏ luôn và từ đó không nghĩ ngợi gì nữa.Tôi mua luôn domain trên Cloudflare, cũng thiết lập SSO trên Cloudflare, và chặn không cho dùng dịch vụ nếu không vượt qua SSO, thành ra để Cloudflare đứng ra gánh toàn bộ các cuộc tấn công thay mình.
Vì bên trong chỉ có những dịch vụ mình tôi dùng, nên cấu hình này với tôi cũng đã đủ dùng rồi.
Nếu Cloudflare gặp sự cố thì tôi quyết định chấp nhận mức đó.
Tôi nghe nói thường có trường hợp router do nhà mạng cung cấp chặn port forwarding.
Có thể chỉ cần gắn thêm một router bên thứ ba là mở được thôi... nhưng đúng như bạn nói,
cf tunnelcó sẵn cả WAF cơ bản, thậm chí còn bắt vào region ICN, nên thực sự không có lý do gì lớn để không dùng.Mình đang cài n8n trên homelab rồi kết nối với Anthropic, Telegram, storage các kiểu để chạy mấy tác vụ lặt vặt, mà các connector làm khá ổn nên dùng tiện lắm.
Tôi đang dùng một thiết bị Ryzen 8000 series công suất thấp làm home server chạy 24/7. Bình thường tôi dùng nó như NAS, đồng thời chạy khoảng 70 thứ gồm container và các dịch vụ khác, mà điện năng tiêu thụ mỗi tháng còn chưa tới 10 kWh. Chi phí chỉ khoảng 2.000 won.
Cloudflare Tunnel
Quá tuyệt.
Mấy dịch vụ phản hồi chậm đôi khi hay trả về lỗi 502 cho đến khi hoàn tất phản hồi thôi
Nhưng mà miễn phí mà~
Tôi cũng đang dùng cloud tunnel và thấy nó rất tuyệt.
Thông thường khi modem/router được kết nối vật lý, khá nhiều trường hợp địa chỉ IP bên ngoài sẽ nằm ở router.
Dùng Cloudflare Tunnel thì ngay cả IP nội bộ cũng
có thể kết nối từ bên ngoài thông qua việc đăng ký tên miền~
Thậm chí còn miễn phí nữa,
Ý kiến trên Hacker News
Cái này thực sự rất hay, nhưng không nên dùng Cloudflare Tunnel cho mục đích streaming media
Điều đó bị cấm theo điều khoản sử dụng, hoặc ít nhất cũng không phải mục đích sử dụng như họ dự định. Dịch vụ có thể bị chặn
Thay vào đó nên dùng Wireguard hoặc Tailscale
Bài viết liên quan
Nó cũng tốt để thoát CGNAT, và nếu thích GUI thì tôi khuyên dùng Nginx Proxy Manager
Tôi đang chuyển dần sang tổ hợp rathole + traefik. Thử nghiệm đến tận rạng sáng nên thức trắng luôn
Tailscale (không phải Headscale) có tính năng reverse proxy tên là Funnel, nhưng không dùng được domain riêng
Phương án thay thế gần nhất cho CF Tunnel là Pangolin, và cũng có thể self-host NetBird kèm tính năng reverse proxy
Cái này giống fantasy về việc trở thành quản trị viên hệ thống hơn là fantasy về sự độc lập
Nhưng thành thật mà nói, trả 5 đô/tháng cho Google hay Apple có vẻ vẫn là lựa chọn tốt hơn nhiều. Tôi còn nghi là họ có làm backup 3-2-1 hay không
Sẽ rất tuyệt nếu thư viện địa phương có một nhóm tình nguyện vận hành những dịch vụ như thế này
Đây có thể là cơ hội tốt để trẻ em học cách vận hành dịch vụ, còn những người ít rành công nghệ vẫn có thể tận dụng phần mềm nguồn mở
Không ai muốn làm customer support cả. Vì thế đa số dịch vụ tồn tại theo mô hình trả tiền để có thể nói rằng “hãy liên hệ bộ phận hỗ trợ bên kia”
Tôi dùng fnox để quản lý secret
Nó hỗ trợ nhiều backend hơn
sops, và tôi cũng thấy DX (trải nghiệm lập trình viên) tốt hơnCó câu nói về “fantasy của người đàn ông độc lập và luôn sẵn sàng”, nhưng rốt cuộc vẫn có Cloudflare ở giữa nên cũng không hoàn toàn độc lập
Cloudflare Tunnel thực sự là một công cụ rất tuyệt
Trước đây tôi tự host trực tiếp bằng IP nhà, nhưng giờ quản lý bằng
cloudflareddễ hơn rất nhiềuTôi cũng bớt lo về firewall hay xâm nhập mạng
homelab của tôi giờ được quản lý bằng các script bash idempotent do Claude viết
Tôi cảm thấy dependency trở nên phức tạp vì con người luôn muốn thay đổi thuộc tính, và chính các tương tác đó sinh ra bug
Vì thế biểu diễn mọi thứ bằng các script bash đơn giản lại ổn định hơn
Hiện tại tôi đang dùng systemd + container podman, và có để lại trang ghi chú cho chính mình
Tôi muốn biết liệu sự tiện lợi thực tế có đủ để bù lại nhược điểm đó không
Tôi không hiểu vì sao mọi người cứ đưa mấy thứ này lên Internet công khai. Dùng Tailscale là được mà
Có vẻ tác giả đã nhầm lẫn giữa homelab và self-hosting
self-hosting là vận hành các dịch vụ thực sự dùng hằng ngày, còn homelab là môi trường để thử nghiệm và học tập
Tôi không để dữ liệu hay dịch vụ cá nhân trong homelab. Đó là nơi mọi thứ có thể hỏng bất cứ lúc nào
Tôi từng thấy một công ty SaaS ở Ukraine thực sự xử lý traffic production từ bên trong boong-ke ngầm
Tôi bị sốc khi tiền thuê bao streaming lên tới 1.300 đô mỗi năm
Thế là tôi mua NAS và ổ cứng 36TB, dựng arr stack rồi hủy toàn bộ thuê bao
Cả gia đình tôi cũng làm theo và hiện tiết kiệm được 5–6 nghìn đô mỗi năm
NAS sẽ hoàn vốn chỉ trong vài tháng, sau đó coi như toàn bộ là lợi nhuận
Nhờ Claude Code mà việc cấu hình cũng xong chỉ trong vài giờ
Hơn nữa, tôi còn có thể tự tuyển chọn nội dung không rác như Netflix hay Hulu, nên trải nghiệm vui hơn nhiều
Rip đĩa Blu-ray 4K rồi stream trong nhà cho chất lượng hình ảnh tốt hơn hẳn dịch vụ thương mại
Tôi cảm thấy giá trị trên giá tiền của các dịch vụ streaming hiện nay đã chạm đáy. Nhiều gói đắt tiền cũng chỉ dừng ở 1080p