Tự host website tại nhà bằng Nginx Proxy Manager, Docker và tên miền riêng
Bạn có một chiếc mini PC, NAS, Raspberry Pi, hoặc đơn giản là một máy tính cũ đang nằm im? Bạn muốn chạy blog cá nhân, dashboard nội bộ, app tự viết, media server, hoặc vài dịch vụ nhỏ mà không phải thuê VPS hằng tháng? Tự host website tại nhà là lựa chọn rất đáng thử.
Bộ ba phổ biến, dễ tiếp cận nhất hiện nay:
– Docker → chạy app gọn, tách biệt, dễ backup.
– Nginx Proxy Manager → reverse proxy có giao diện web, tự cấp SSL.
– Tên miền riêng → truy cập đẹp: https://blog.example.com.
Bài này đi từ mô hình, chuẩn bị, cài đặt, trỏ domain, mở port, SSL, bảo mật, backup. Mục tiêu: chạy được thật, hiểu rủi ro thật.
1. Mô hình tổng quan
Khi tự host tại nhà, luồng truy cập thường như sau:
Người dùng Internet
→ domain.com
→ IP nhà bạn
→ router
→ máy chủ Docker
→ Nginx Proxy Manager
→ container website/appVí dụ:
https://blog.example.com → NPM → WordPress container
https://uptime.example.com → NPM → Uptime Kuma container
https://home.example.com → NPM → Home AssistantLợi ích:
– Một IP nhà vẫn chạy nhiều website. – SSL miễn phí qua Let’s Encrypt. – Không cần viết cấu hình Nginx thủ công. – Quản lý qua web UI. – Dễ thêm/xóa dịch vụ.
2. Cần chuẩn bị gì?
Phần cứng
Tối thiểu:
– Raspberry Pi 4, mini PC, laptop cũ, NAS, hoặc desktop. – RAM từ 2GB; khuyến nghị 4GB+. – Ổ SSD tốt hơn HDD nếu chạy nhiều app. – Máy nên bật 24/7.
Nếu chỉ chạy vài site tĩnh, uptime monitor, wiki cá nhân: cấu hình rất nhẹ. Nếu chạy Nextcloud, WordPress nhiều plugin, media server: cần mạnh hơn.
Phần mềm
Khuyến nghị:
– Ubuntu Server / Debian. – Docker. – Docker Compose. – Nginx Proxy Manager. – Một app mẫu để test.
Mạng
Bạn cần biết:
– Router có cho port forwarding không. – Nhà mạng có cấp public IPv4 không. – Có bị CGNAT không.
Kiểm tra nhanh:
1. Vào router xem WAN IP.
2. Vào https://ifconfig.me.
3. So sánh 2 IP.
Nếu khác nhau nhiều khả năng bạn đang sau CGNAT. Khi đó mở port thường không hoạt động. Cách xử lý:
– Gọi nhà mạng xin public IP. – Dùng IPv6 nếu nhà mạng hỗ trợ. – Dùng Cloudflare Tunnel / Tailscale Funnel. – Thuê VPS nhỏ làm reverse proxy trung gian.
3. Cài Docker và Docker Compose
Trên Ubuntu/Debian, cách nhanh:
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USERĐăng xuất/đăng nhập lại, kiểm tra:
docker version
docker compose versionTạo thư mục chứa stack:
mkdir -p ~/docker/npm
cd ~/docker/npm4. Chạy Nginx Proxy Manager bằng Docker
Tạo file docker-compose.yml:
services:
npm:
image: jc21/nginx-proxy-manager:latest
container_name: npm
restart: unless-stopped
ports:
- "80:80"
- "81:81"
- "443:443"
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencryptChạy:
docker compose up -dMở trình duyệt:
http://IP_MAY_CHU:81Tài khoản mặc định:
Email: [email protected]
Password: changemeĐăng nhập xong, đổi email + mật khẩu ngay.
Các port:
– 80 → HTTP, cần cho Let’s Encrypt.
– 443 → HTTPS.
– 81 → giao diện quản trị NPM.
5. Chạy thử một website mẫu
Tạo app web đơn giản bằng Nginx container.
Tạo thư mục:
mkdir -p ~/docker/demo/html
cd ~/docker/demoTạo file html/index.html:
<h1>Website tự host tại nhà</h1>
<p>Chạy qua Docker + Nginx Proxy Manager.</p>Tạo docker-compose.yml:
services:
demo:
image: nginx:alpine
container_name: demo
restart: unless-stopped
volumes:
- ./html:/usr/share/nginx/html:ro
expose:
- "80"Chạy:
docker compose up -dContainer demo không cần publish port ra ngoài. NPM sẽ truy cập qua Docker network hoặc IP nội bộ.
Nếu NPM và demo ở compose khác nhau, cách đơn giản nhất: dùng IP LAN của máy chủ và port đã publish. Nhưng gọn hơn là cho các container dùng chung network.
Tạo network chung:
docker network create proxySửa NPM:
services:
npm:
image: jc21/nginx-proxy-manager:latest
container_name: npm
restart: unless-stopped
ports:
- "80:80"
- "81:81"
- "443:443"
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
networks:
- proxy
networks:
proxy:
external: true
Sửa demo:
services:
demo:
image: nginx:alpine
container_name: demo
restart: unless-stopped
volumes:
- ./html:/usr/share/nginx/html:ro
networks:
- proxy
networks:
proxy:
external: true
Restart:
docker compose up -d6. Trỏ tên miền về nhà
Bạn cần mua domain ở Namecheap, Porkbun, Cloudflare, Google Domains cũ/Squarespace, hoặc nhà cung cấp bất kỳ.
Trong DNS, tạo record:
A demo.example.com YOUR_PUBLIC_IPNếu dùng IPv6:
AAAA demo.example.com YOUR_IPV6Nếu IP nhà thay đổi, dùng Dynamic DNS. Nhiều router hỗ trợ DDNS sẵn. Nếu không, dùng Cloudflare API hoặc container cập nhật IP.
Ví dụ ý tưởng:
IP nhà đổi → DDNS cập nhật DNS → domain vẫn trỏ đúngTTL nên để thấp, ví dụ 300 giây, nếu IP hay đổi.
7. Mở port trên router
Vào trang quản trị router, tìm mục:
– Port Forwarding – NAT – Virtual Server – Firewall Rules
Forward:
WAN 80 → IP_MAY_CHU:80
WAN 443 → IP_MAY_CHU:443Không forward port 81.
Máy chủ nên có IP LAN cố định, ví dụ:
192.168.1.10Có 2 cách:
– Gán static IP trong máy chủ. – DHCP reservation trong router. Cách này thường sạch hơn.
Kiểm tra từ ngoài mạng LAN bằng 4G/5G:
http://demo.example.comNếu không vào được:
– Sai port forwarding. – ISP chặn port 80/443. – Đang bị CGNAT. – Firewall máy chủ chặn. – DNS chưa cập nhật. – Container chưa chạy.
8. Cấu hình Proxy Host trong Nginx Proxy Manager
Vào NPM UI:
Proxy Hosts → Add Proxy HostTab Details:
Domain Names: demo.example.com
Scheme: http
Forward Hostname / IP: demo
Forward Port: 80Nếu dùng Docker network chung, hostname là tên container/service: demo.
Bật:
– Block Common Exploits – Websockets Support nếu app cần realtime, ví dụ Home Assistant, code server.
Lưu lại.
Truy cập:
http://demo.example.comNếu OK, chuyển sang SSL.
9. Cấp SSL miễn phí bằng Let’s Encrypt
Trong Proxy Host vừa tạo:
SSL → Request a new SSL CertificateBật:
– Force SSL – HTTP/2 Support – HSTS nếu đã chắc mọi thứ chạy HTTPS ổn.
Nhập email, đồng ý điều khoản, lưu.
Nếu thành công:
https://demo.example.comLỗi thường gặp:
– Port 80 chưa mở. – DNS chưa trỏ đúng IP. – Domain đang proxy qua Cloudflare sai chế độ SSL. – NPM không truy cập được backend. – Router hairpin NAT không hỗ trợ, test từ LAN bị sai; thử bằng 4G.
Nếu dùng Cloudflare proxy màu cam, SSL mode nên là:
FullTốt hơn:
Full (strict)Nhưng cần cert hợp lệ ở origin.
10. Bảo mật tối thiểu
Tự host nghĩa là bạn đưa máy trong nhà ra Internet. Đừng xem nhẹ.
Nên làm:
– Không public panel quản trị NPM port 81.
– Dùng mật khẩu mạnh, duy nhất.
– Bật 2FA nếu app hỗ trợ.
– Update Docker image định kỳ.
– Chỉ mở port thật cần: 80, 443.
– Không chạy container với quyền privileged nếu không cần.
– Không mount / hoặc Docker socket vào container lạ.
– Backup trước khi update.
– Tách app public và app nội bộ.
Với dịch vụ nhạy cảm như quản lý mật khẩu, tài chính, camera, NAS admin: cân nhắc chỉ truy cập qua VPN như WireGuard hoặc Tailscale.
Một mô hình an toàn hơn:
Public: blog, landing page, status page
Private via VPN: admin panel, file manager, database, home automation11. Backup và khôi phục
Thư mục quan trọng của NPM:
~/docker/npm/data
~/docker/npm/letsencryptBackup toàn bộ thư mục compose:
tar -czf npm-backup.tgz ~/docker/npmVới app khác, backup:
– docker-compose.yml
– volume dữ liệu
– database dump
– file cấu hình .env
Nguyên tắc thực tế:
Không backup → chưa self-host, chỉ đang đánh cược.Ít nhất nên có:
– 1 bản local. – 1 bản ngoài máy, ví dụ NAS khác, ổ rời, cloud storage. – Test restore định kỳ.
12. Khi nào nên tự host, khi nào nên thuê VPS?
Tự host hợp nếu:
– Muốn học hệ thống mạng/web. – Có máy chạy 24/7. – Chấp nhận mất điện/mất mạng. – Site cá nhân, traffic thấp-vừa. – Muốn dữ liệu nằm ở nhà.
Thuê VPS hợp hơn nếu:
– Cần uptime cao. – Website kiếm tiền. – Không muốn xử lý router, NAT, CGNAT. – Nhà mạng không có public IP. – Cần băng thông upload lớn. – Không muốn lộ IP nhà.
Một hướng cân bằng:
Website public quan trọng → VPS
Dịch vụ cá nhân/nội bộ → home serverKết luận thực tế
Tự host website tại nhà bằng Docker + Nginx Proxy Manager + tên miền riêng là cách rất tốt để học, tiết kiệm, kiểm soát dữ liệu. Bạn có thể bắt đầu nhỏ: một trang HTML, một blog, một dashboard. Sau đó mở rộng dần.
Công thức tối thiểu:
Docker chạy app
NPM reverse proxy
Domain trỏ IP nhà
Router forward 80/443
Let’s Encrypt cấp SSL
Backup đềuĐừng public mọi thứ chỉ vì có thể. Dịch vụ nào cần riêng tư, để sau VPN. Dịch vụ nào public, cập nhật thường xuyên, đặt mật khẩu mạnh, backup trước khi nghịch.
Self-host không phải để “miễn phí hoàn toàn”. Nó đổi tiền thuê server lấy thời gian, điện, bảo trì, kiến thức. Nếu bạn thích kiểm soát và học bằng cách làm, đây là một dự án rất đáng bắt đầu.
Bình luận (0)
Chưa có bình luận. Hãy là người đầu tiên!