Cloud vs Self-Hosted: Sự Khác Biệt Thực Sự Là Gì?
Hầu hết developer đều mặc định dùng cùng một bộ công cụ: LastPass để lưu mật khẩu, GitHub để quản lý code, Pingdom để kiểm tra uptime. Bộ ba này ổn thỏa — cho đến khi không còn ổn nữa. LastPass dính vụ rò rỉ dữ liệu nghiêm trọng năm 2022, làm lộ các vault được mã hóa. Pingdom tăng giá từ ~$15/tháng lên $89/tháng cho tính năng giám sát đa vị trí. Còn GitHub thì đã đổi quy tắc gói miễn phí cho tổ chức hơn một lần.
Đó là lúc self-hosting không còn chỉ là trò chơi của dân mê kỹ thuật mà trở thành một quyết định hợp lý. Không phải vì không tin tưởng — mà vì không muốn phụ thuộc vào chính sách giá hay lịch sử bảo mật của người khác.
Có một vài cách phổ biến để tự chạy dịch vụ:
- Bare metal install — Cài dịch vụ trực tiếp lên hệ điều hành. Ban đầu đơn giản, nhưng việc cập nhật và di chuyển sẽ trở thành cơn ác mộng nhanh thôi.
- Docker (container đơn lẻ) — Chạy mỗi dịch vụ trong container riêng. Ổn như điểm khởi đầu, nhưng quản lý năm lệnh
docker runriêng lẻ sẽ nhanh chóng trở nên lộn xộn. - Docker Compose — Định nghĩa toàn bộ stack trong một file YAML. Lựa chọn hàng đầu cho dân homelab muốn kiểm soát mọi thứ mà không bị rối loạn.
- Kubernetes — Tuyệt vời để học orchestration cấp production. Nhưng quá phức tạp cho một setup cá nhân với ba dịch vụ.
Docker Compose là lựa chọn cân bằng nhất trong trường hợp này. Đủ đơn giản để hiểu trong một buổi chiều, đồng thời phản ánh cách các team nhỏ thực sự quản lý môi trường staging.
Ưu và Nhược Điểm Khi Tự Chạy Stack
Tại sao self-hosting lại có lý
- Làm chủ hoàn toàn dữ liệu — Mật khẩu, repo, và số liệu giám sát đều nằm trên phần cứng của bạn, không phải server của bên thứ ba.
- Không bị ràng buộc nhà cung cấp — Di chuyển, sao lưu, hay tắt hẳn — tất cả đều theo điều kiện của bạn.
- Tiết kiệm chi phí thực sự — Một VPS $5–10/tháng thay thế được các gói đăng ký tốn $30–50/tháng. Riêng LastPass Premium đã là $36/năm; GitHub Team là $4/người dùng/tháng.
- Học qua thực hành — Duy trì các dịch vụ thực tế dạy bạn nhiều hơn về Linux, networking và container so với bất kỳ hướng dẫn nào.
Những gì bạn phải gánh vác
- Bạn chịu trách nhiệm về uptime — Nếu server của bạn chết, password manager cũng chết theo. Hãy lên kế hoạch sẵn sàng cho điều đó.
- Bảo mật là trách nhiệm của bạn — Cập nhật, quy tắc firewall, và sao lưu không tự động xảy ra.
- Thời gian thiết lập ban đầu — Cần khoảng 2–3 giờ để mọi thứ chạy hoàn chỉnh lần đầu.
Chạy homelab đã thay đổi cách tôi tiếp cận debug production. Sáu tháng sau khi stack đầu tiên của tôi ổn định, tôi bắt đầu phát hiện ra các mẫu lỗi tại công việc sớm hơn nhiều. Có cái gì đó đặc biệt trong việc bị gọi dậy lúc 2 giờ sáng vì dịch vụ của chính mình gặp sự cố — nó mài giũa bản năng theo cách mà tài liệu đơn thuần không thể nào thay thế được.
Stack Được Khuyến Nghị
Đây là stack chúng ta sẽ xây dựng:
- Vaultwarden — Server tương thích Bitwarden không chính thức, được viết bằng Rust. Chỉ dùng khoảng 10MB RAM khi nhàn rỗi so với 2GB+ của stack Bitwarden chính thức. Hoàn toàn tương thích với mọi Bitwarden client.
- Gitea — Dịch vụ Git tự host. Nhẹ đến mức có thể chạy trên VPS $5 mà vẫn còn dư RAM.
- Uptime Kuma — Công cụ giám sát uptime gọn gàng với giao diện đẹp. Kiểm tra dịch vụ theo lịch và gửi cảnh báo khi có gì đó im lặng bất thường.
Yêu cầu server: Ubuntu 22.04 hoặc Debian 12, tối thiểu 1–2 GB RAM, đã cài Docker + Docker Compose. Tên miền là tùy chọn nhưng được khuyến nghị mạnh cho Vaultwarden — các trình duyệt chủ động chặn truy cập HTTP đến password manager, nên HTTPS là bắt buộc khi dùng hàng ngày.
Hướng Dẫn Triển Khai
Bước 1: Cài Đặt Docker
# Cài Docker bằng script chính thức
curl -fsSL https://get.docker.com | sh
# Kiểm tra cài đặt
docker --version
docker compose version
Bước 2: Tạo Cấu Trúc Thư Mục Dự Án
mkdir ~/homelab && cd ~/homelab
mkdir -p vaultwarden gitea uptime-kuma
touch docker-compose.yml
Bước 3: Viết File Docker Compose
version: "3.8"
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
volumes:
- ./vaultwarden:/data
environment:
- SIGNUPS_ALLOWED=true # Đổi thành false sau khi tạo tài khoản xong
- WEBSOCKET_ENABLED=true
ports:
- "8080:80"
- "3012:3012"
gitea:
image: gitea/gitea:latest
container_name: gitea
restart: unless-stopped
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=sqlite3
volumes:
- ./gitea:/data
ports:
- "3000:3000"
- "2222:22"
uptime-kuma:
image: louislam/uptime-kuma:1
container_name: uptime-kuma
restart: unless-stopped
volumes:
- ./uptime-kuma:/app/data
ports:
- "3001:3001"
Bước 4: Khởi Động Stack
cd ~/homelab
docker compose up -d
# Kiểm tra xem cả ba container có đang chạy không
docker compose ps
Chờ khoảng 60 giây để khởi tạo. Sau khi các container chạy xong, bạn có thể truy cập dịch vụ tại:
- Vaultwarden:
http://your-server-ip:8080 - Gitea:
http://your-server-ip:3000 - Uptime Kuma:
http://your-server-ip:3001
Bước 5: Cấu Hình Lần Đầu
Vaultwarden — Mở giao diện web, tạo tài khoản, sau đó khóa đăng ký ngay lập tức. Sửa docker-compose.yml và đổi SIGNUPS_ALLOWED thành false, rồi khởi động lại:
docker compose restart vaultwarden
Cài extension Bitwarden chính thức trên trình duyệt. Vào Settings và trỏ URL server về địa chỉ Vaultwarden của bạn thay vì bitwarden.com. Extension không biết và cũng không quan tâm rằng nó đang kết nối với Vaultwarden — hoạt động hoàn toàn giống nhau.
Gitea — Truy cập port 3000 và thực hiện theo wizard cài đặt. SQLite là hoàn toàn đủ dùng cho cá nhân hoặc team nhỏ. Bạn sẽ không chạm đến giới hạn của nó cho đến khi có hàng chục repo đang hoạt động với CI/CD pipeline. Tạo tài khoản admin ở cuối wizard.
Uptime Kuma — Port 3001. Tạo tài khoản admin, sau đó thêm monitor cho các dịch vụ khác để được thông báo trước khi bạn tự mình phát hiện ra có gì đó hỏng:
- Loại monitor:
HTTP(s) - URL:
http://localhost:8080(dùng địa chỉ nội bộ — chính xác hơn so với định tuyến qua IP public) - Interval: 60 giây
Bước 6: Thêm HTTPS với Nginx Reverse Proxy
IP thô và port ổn cho việc test nội bộ. Nhưng với bất cứ thứ gì bạn dùng hàng ngày — đặc biệt là password manager — HTTPS là không thể thiếu. Cài đặt Nginx với Let’s Encrypt:
sudo apt install nginx certbot python3-certbot-nginx -y
sudo nano /etc/nginx/sites-available/vaultwarden
server {
listen 80;
server_name vault.yourdomain.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /notifications/hub {
proxy_pass http://127.0.0.1:3012;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
sudo ln -s /etc/nginx/sites-available/vaultwarden /etc/nginx/sites-enabled/
sudo certbot --nginx -d vault.yourdomain.com
sudo systemctl reload nginx
Lặp lại cấu hình tương tự cho Gitea (git.yourdomain.com) và Uptime Kuma (status.yourdomain.com), trỏ proxy_pass đến port tương ứng của chúng.
Bước 7: Thiết Lập Sao Lưu Tự Động
Mọi người đều bỏ qua bước này cho đến khi thực sự cần đến. Đừng là người đó. Một cron job hàng ngày xử lý việc này chỉ với hai dòng:
# Mở trình chỉnh sửa crontab
crontab -e
# Thêm dòng này — chạy hàng ngày lúc 2:00 sáng
0 2 * * * tar -czf /backup/homelab-$(date +\%Y\%m\%d).tar.gz ~/homelab/vaultwarden ~/homelab/gitea ~/homelab/uptime-kuma
Lưu backup ở nơi nào đó ngoài server — một S3 bucket, NAS nội bộ, hoặc thậm chí USB. Quan trọng hơn: hãy thử restore. Một backup chưa bao giờ được restore chỉ là hy vọng được nén lại.
Duy Trì Stack Luôn Khỏe Mạnh
Việc bảo trì hàng ngày nhẹ nhàng hơn nhiều so với hầu hết mọi người nghĩ. Ba thói quen sau bao phủ 90% công việc:
- Cập nhật container hàng tháng:
docker compose pull && docker compose up -d - Liếc qua dashboard Uptime Kuma mỗi tuần để phát hiện lỗi âm thầm trước khi chúng gây ra vấn đề
- Kiểm tra log Vaultwarden khi có vấn đề đăng nhập:
docker logs vaultwarden
Ba dịch vụ. Một server. Kiểm soát hoàn toàn mật khẩu, code, và khả năng quan sát hạ tầng. Khi bạn đã quen với setup này, việc thêm Nextcloud, Home Assistant hay Portainer cũng theo đúng mô hình Docker Compose tương tự. Công nghệ không phải là phần khó. Duy trì thói quen cập nhật mới là điều khó.

