Docker Homelab Series - Phần 5: Hướng dẫn Nginx Proxy Manager

Hướng dẫn Nginx Proxy Manager

Nginx Proxy Manager: Hướng dẫn Proxy & Cloudflare Tunnel

Nginx Proxy Manager

I. Giới thiệu Nginx Proxy Manager

Nginx Proxy Manager là một công cụ quản lý proxy được cài đặt trên Docker, cho phép bạn:

  • Proxy các ứng dụng internal ra ngoài mạng
  • Quản lý SSL certificate (tự động từ Let's Encrypt)
  • Proxy domain local hoặc domain public từ Cloudflare Tunnel
  • Cân bằng tải giữa nhiều backend
  • Quản lý giao diện web dễ dàng

Lợi ích chính:

  • Không cần sửa Nginx config thủ công
  • Giao diện web dễ sử dụng
  • Tự động gia hạn SSL certificate
  • Hỗ trợ HTTP/2, WebSocket, Proxy Pass

II. Triển khai Nginx Proxy Manager với Portainer

1. Chuẩn bị Docker Compose

Dưới đây là file docker-compose.yml cho Nginx Proxy Manager:

version: '3.8'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    privileged: true
    ports:
      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '81:81' # Admin UI
      - '2223:22'
    volumes:
      - /root/nginxproxymanager/data:/data
      - /root/nginxproxymanager/letsencrypt:/etc/letsencrypt
    mem_limit: 1024m
    cpus: 0.1

Giải thích cấu hình:

  • Port 80/443: HTTP/HTTPS public (được reverse proxy qua)
  • Port 81: Admin UI để quản lý
  • Port 2223: SSH (tùy chọn)
  • Volumes: Lưu cấu hình, database, và SSL certificates
  • privileged: true: Cần quyền root để thao tác port 80/443

2. Deploy qua Portainer

Các bước triển khai:

  1. Vào Portainer Dashboard
  2. Chọn StacksAdd stack
  3. Đặt tên Stack: nginx-proxy-manager
  4. Copy/paste nội dung docker-compose vào trường Web editor
  5. Click Deploy the stack

Đợi container khởi động xong, truy cập http://your-ip:81 để vào Admin UI.

3. Đăng nhập Admin UI lần đầu

Thông tin đăng nhập mặc định:

Email: [email protected]
Password: changeme

Sau khi đăng nhập, hệ thống sẽ yêu cầu đổi mật khẩu. Hãy đặt mật khẩu mạnh.

III. Cấu hình Proxy cho Domain Local

1. Tạo Proxy Host cho Domain Local

Để proxy một ứng dụng local (ví dụ: app chạy trên port 3000):

  1. Vào Admin UI → HostsProxy Hosts
  2. Click Add Proxy Host
  3. Điền thông tin:
    • Domain Names: app.local
    • Scheme: http
    • Forward Hostname/IP: 192.168.1.100 (IP máy chủ app)
    • Forward Port: 3000 (port app)
  4. Click Save

Lưu ý: Domain local phải được phân giải bởi DNS local (AdGuard Home) hoặc hosts file.

2. Cấu hình SSL cho Domain Local (Optional)

Nếu muốn HTTPS cho domain local:

  1. Vào Proxy Host vừa tạo → Click Edit
  2. Chọn tab SSL
  3. Chọn SSL Certificate: "Request a new SSL Certificate"
  4. Email: [email protected]
  5. Click Save

3. Test Proxy Local

Mở trình duyệt hoặc terminal test:

curl http://app.local
# Hoặc nslookup app.local để kiểm tra DNS

IV. Proxy Domain Public từ Cloudflare Tunnel

1. Khái niệm Cloudflare Tunnel

Cloudflare Tunnel cho phép bạn:

  • Expose ứng dụng private ra internet mà không cần open port trên router
  • Sử dụng domain public được quản lý bởi Cloudflare
  • Tự động HTTPS với Cloudflare SSL
  • Bảo mật ngoài hộp (DDoS protection, WAF, ...)

2. Cấu hình Cloudflare Tunnel với Docker (Portainer)

Vì bạn đang dùng Portainer, hãy cài Cloudflare Tunnel qua Docker:

Bước 1: Tạo Tunnel trên Cloudflare Dashboard

  1. Đăng nhập Cloudflare Dashboard
  2. Chọn domain của bạn → NetworksTunnel
  3. Click Create a tunnel
  4. Đặt tên: my-tunnel
  5. Chọn connector: Docker
  6. Copy token của tunnel (sẽ dùng ở bước sau)

Bước 2: Tạo Docker Compose cho Cloudflared

Tạo file docker-compose.yml riêng cho cloudflared:

version: '3.8'
services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared-tunnel
    restart: unless-stopped
    command: tunnel run
    environment:
      - TUNNEL_TOKEN=YOUR_TUNNEL_TOKEN_HERE
    mem_limit: 512m
    cpus: 0.1

Hoặc dùng credentials.json (cách khác):

version: '3.8'
services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared-tunnel
    restart: unless-stopped
    command: tunnel --no-autoupdate run --token YOUR_TUNNEL_TOKEN_HERE
    volumes:
      - /root/cloudflared/credentials.json:/root/.cloudflared/credentials.json
    mem_limit: 512m
    cpus: 0.1

Bước 3: Deploy qua Portainer

  1. Vào Portainer Dashboard
  2. Chọn StacksAdd stack
  3. Đặt tên Stack: cloudflared-tunnel
  4. Copy/paste docker-compose vào Web editor
  5. Thay YOUR_TUNNEL_TOKEN_HERE bằng token từ Cloudflare
  6. Click Deploy the stack

Container sẽ khởi động và kết nối đến Cloudflare Tunnel của bạn.

Bước 4: Kiểm tra Tunnel hoạt động

Vào Cloudflare Dashboard → Tunnel → Chọn tunnel của bạn → kiểm tra status "HEALTHY".

Bước 5: Cấu hình Public Hostname

Trên Cloudflare Dashboard:

  1. Vào Tunnel → Public Hostname tab
  2. Click Add a public hostname
  3. Điền thông tin:
    • Subdomain: app
    • Domain: yourdomain.com
    • Type: HTTP
    • URL: http://127.0.0.1:80 (Nginx Proxy Manager)
  4. Click Save

Lưu ý: URL phải trỏ đến Nginx Proxy Manager (port 80 hoặc 443) hoặc ứng dụng của bạn.

3. Tạo Proxy Host với Domain Public

Sau khi Cloudflare Tunnel hoạt động:

  1. Vào Admin UI → HostsProxy Hosts
  2. Click Add Proxy Host
  3. Điền thông tin:
    • Domain Names: app.yourdomain.com
    • Scheme: http
    • Forward Hostname/IP: 127.0.0.1
    • Forward Port: 3000
  4. Tab SSL: Chọn "Let's Encrypt" hoặc "Cloudflare"
  5. Click Save

4. Cấu hình DNS Records trong Cloudflare

Bạn cần point domain đến Cloudflare Tunnel:

  1. Vào Cloudflare Dashboard → Domain
  2. Chọn DNS tab
  3. Thêm CNAME record:
    • Name: app
    • Target: tunnel-name.cfargotunnel.com
  4. Click Save

5. Test Domain Public

Sau vài phút, domain sẽ hoạt động:

curl https://app.yourdomain.com
# Hoặc mở trình duyệt

V. Cấu hình Advanced

1. Custom Headers & Rewrite

Để thêm custom headers hoặc rewrite URL:

  1. Vào Proxy Host → Tab Advanced
  2. Thêm custom Nginx config nếu cần:
proxy_set_header X-Custom-Header "value";
proxy_set_header Host $host;

2. Cân bằng tải (Load Balancing)

Nếu có nhiều backend server:

  1. Vào HostsUpstream
  2. Tạo Upstream mới với nhiều server
  3. Proxy Host sẽ sử dụng Upstream này

3. Redirect & Access Control

Nginx Proxy Manager hỗ trợ:

  • HTTP → HTTPS redirect: Tự động trong SSL tab
  • Basic Auth: Bảo vệ proxy bằng username/password
  • IP Whitelist/Blacklist: Giới hạn IP truy cập

VI. Lưu ý quan trọng

  • Sao lưu cấu hình: Thư mục /root/nginxproxymanager/data chứa database, nên backup định kỳ
  • Port 80/443: Phải open trên firewall/router nếu dùng domain public
  • DNS local: Domain local phải được phân giải bởi DNS server (ví dụ AdGuard Home)
  • Cloudflare Tunnel: Không cần open port, chỉ cần outbound connection
  • SSL Certificate: Let's Encrypt certificates được tự động gia hạn
  • Performance: Giữ container đủ RAM để xử lý requests
  • Logs: Xem logs trong Admin UI → Logs tab để debug vấn đề

Vậy là bạn đã hoàn thành cấu hình Nginx Proxy Manager để proxy domain local và domain public từ Cloudflare Tunnel!

Post a Comment

Previous Post Next Post
QR Code
Quét mã QR để gọi miễn phí