Trang chủHướng dẫn › Tự host HTTPS bằng DDNS + Docker
Hướng dẫn · DNS động

Tự host site HTTPS từ nhà — 1 Docker lo cert

Biến máy ở nhà/công ty thành web HTTPS công khai: dùng DNS động (DDNS) của entry.io.vn trỏ tên miền về IP của bạn, rồi một container Docker (SWAG = nginx + certbot) tự cấp & tự gia hạn chứng chỉ Let's Encrypt. Không cần VPS, không mua cert.

App local :3000SWAG (nginx+LE)https://tên.ddns.entry.io.vn → 🌍 internet
🎯 Cần: IP public (không sau CGNAT) + quyền forward port ở router + máy chạy Docker. Nếu sau CGNAT/không mở được port → dùng Tunnel của entry.io.vn thay cho cách này.
Bước 1

Tạo tên DDNS trỏ về IP nhà

Vào DashboardDNS động (DDNS) → tạo tên-bạn.ddns.entry.io.vn. Để IP luôn đúng khi mạng nhà đổi IP, dùng DynDNS update (router built-in hoặc ddclient/inadyn) gọi:

# cập nhật IP (token lấy trong Dashboard) — chạy định kỳ / router tự gọi curl "https://USER:TOKEN@entry.io.vn/nic/update?hostname=tên-bạn.ddns.entry.io.vn&myip=$(curl -s https://api.ipify.org)"
📌 Kiểm tra trỏ đúng chưa: dig +short tên-bạn.ddns.entry.io.vn phải ra IP public của nhà bạn (curl https://api.ipify.org).
Bước 2

Mở (forward) port 80 + 443 ở router

Vào trang quản trị router → Port Forwarding / NAT → trỏ cả 80443 về IP nội bộ của máy chạy Docker (vd 192.168.1.50).

Port ngoài→ Máy nội bộVì sao
80 TCP192.168.1.50:80Let's Encrypt HTTP-01 verify + redirect → HTTPS
443 TCP192.168.1.50:443HTTPS thật
⚠️ Thiếu port 80 mở ra internet → Let's Encrypt không verify được → không cấp cert. (Nhiều ISP VN chặn 80/443 hoặc dùng CGNAT — nếu vậy chuyển sang Tunnel.)
Bước 3

Chạy SWAG — 1 container = nginx + Let's Encrypt

docker-compose.yml (đổi tên-bạn + email):

services: swag: image: lscr.io/linuxserver/swag container_name: swag cap_add: [ NET_ADMIN ] environment: - PUID=1000 - PGID=1000 - TZ=Asia/Ho_Chi_Minh - URL=ddns.entry.io.vn - SUBDOMAINS=tên-bạn # = phần trước .ddns.entry.io.vn - ONLY_SUBDOMAINS=true # chỉ cấp cert cho tên-bạn.ddns.entry.io.vn - VALIDATION=http # Let's Encrypt HTTP-01 (cần port 80) - CERTPROVIDER=letsencrypt - EMAIL=ban@email.com # - STAGING=true # bật khi test nhiều lần (tránh rate-limit), chạy thật thì tắt volumes: - ./swag-config:/config ports: - 80:80 - 443:443 restart: unless-stopped
docker compose up -d && docker logs -f swag
⏳ Lần đầu SWAG sẽ tự xin cert — đợi log hiện “Server ready” / Certbot ... Congratulations. Cert lưu ở ./swag-config/etc/letsencrypt, tự gia hạn (khỏi lo).
Bước 4

Xong — kiểm tra HTTPS

Mở https://tên-bạn.ddns.entry.io.vn → thấy trang mặc định SWAG + ổ khóa 🔒 hợp lệ (Let's Encrypt). Kiểm nhanh cert:

curl -I https://tên-bạn.ddns.entry.io.vn # 200/301, không cảnh báo cert
Bước 5

Reverse-proxy app local của bạn

Mặc định SWAG serve trang tĩnh. Để đưa app nội bộ (vd web chạy 192.168.1.50:3000) ra HTTPS — sửa ./swag-config/nginx/site-confs/default.conf, thay khối location /:

location / { proxy_pass http://192.168.1.50:3000; # app local của bạn 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; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # cho websocket }
docker restart swag
💡 Nhiều app cùng lúc? SWAG có sẵn mẫu trong swag-config/nginx/proxy-confs/*.sample — đổi tên bỏ .sample để bật theo subdomain.
Lưu ý

Vài điều hay vấp

Tình huốngXử lý
Cert không cấp đượcPort 80 chưa mở ra internet / DNS chưa trỏ đúng IP. Test: từ mạng ngoài mở http://tên-bạn.ddns.entry.io.vn
Sau CGNAT / ISP chặn 80,443Không tự host kiểu này được → dùng Tunnel của entry.io.vn (1 lệnh ssh, không cần mở port)
IP nhà đổi → site dieBật DDNS auto-update (Bước 1) để tên luôn trỏ đúng IP
Test nhiều lần bị chặn cấp certLet's Encrypt rate-limit → bật STAGING=true lúc thử, xong tắt + xoá swag-config/etc/letsencrypt để cấp cert thật
Có sẵn tên miền riêngTrỏ CNAME www.tenban.com → tên-bạn.ddns.entry.io.vn rồi đặt URL=tenban.com trong SWAG