Trong 1 thời gian rất dài, mình đã Nginx Proxy Manager (NPM) làm Reverse Proxy cho các dịch vụ web trong homelab ở nhà. Rất nhiều các bài viết hướng dẫn về NPM đã được chia sẻ trên blog.

Sau khi khám phá ra Caddy và sự tiện linh hoạt của nó, mình đã dần thay thế tất cả các web server đang sử dụng (OLS, Nginx) bằng Caddy. Đầu tiên là chuyển các website WordPress đang chạy trên nền tảng OpenLiteSpeed qua chạy trên Caddy.

Tiếp theo, mình đã thay thế Nginx Proxy Manager bằng Caddy để làm reverse proxy cho homelab. Bài viết này sẽ ghi lại các thao tác mình đã thực hiện để thay thế NPM bằng Caddy cho homelab ở nhà.

I. Tạo Docker network

Đầu tiên, mình sẽ tạo 1 mạng Docker ảo. Tất cả các dịch vụ mạng được kích hoạt bằng Docker trên cùng máy chủ sẽ được kết nối vào mạng ảo này.

docker network create caddyCode language: Nginx (nginx)

Bằng các kết nối tất cả vào mạng riêng này, Caddy có thể truy cập đến các dịch vụ web khác thông qua tên Docker service, ví dụ: http://memos:5230. Ngoài ra, mình không cũng cần publish các cổng mạng của Docker container ra public, giúp tối ưu bảo mật.

II. Cấu hình Caddy

Tạo các thư mục mới cho Caddy

mkdir -p ~/caddy/sites-enabled
cd ~/caddyCode language: JavaScript (javascript)

Tạo file compose.yml với nội dung sau

services:
  caddy:
    image: caddy:alpine
    container_name: caddy
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - ./caddy_data:/data
      - ./caddy_config:/config
      - ./sites-enabled:/sites-enabled
networks:
  default:
    name: caddy
    external: trueCode language: YAML (yaml)

Tạo file Caddyfile

nano CaddyfileCode language: Nginx (nginx)

và lưu vào nội dung sau

:80 {
	respond "Hello, world!"
}
import /sites-enabled/*Code language: JavaScript (javascript)

Với thông số này, Caddyfile sẽ tự động tải thêm các file cấu hình nằm trong thư mục sites-enabled.

Kích hoạt Caddy

docker compose up -dCode language: Nginx (nginx)

III. Cấu hình Port Forwading

Nếu thiết lập Caddy trên server ở nhà, bạn cần phải truy cập vào Router để thay đổi cấu hình Port Forwarding port 80/443 (TCP) và 443 (UDP) qua địa chỉ IP đang cài Caddy.

Phần này mình không hướng dẫn vì mỗi Router có cách cấu hình riêng. Google là ra hướng dẫn ngay.

IV. Cấu hình dịch vụ web

Với các dịch vụ web (chạy bằng Docker) hoạt động trên cùng máy chủ với Caddy, mình sẽ thêm vào đoạn cấu hình networks sau để kết nối nó vào cùng mạng riêng với Caddy.

networks:
  default:
    name: caddy
    external: trueCode language: YAML (yaml)

Đồng thời bỏ luôn phần khai báo ports.

Ví dụ như file compose.yml của memos sẽ được sửa lại như sau.

services:
  memos:
    image: neosmemo/memos:stable
    container_name: memos
    volumes:
      - ./memos/:/var/opt/memos
    #ports:
    #  - 5230:5230
networks:
  default:
    name: caddy
    external: true
Code language: YAML (yaml)

Sau đó kích hoạt lại memos để kết nối nó vào mạng mới

docker-compose up -d --force-recreate

V. Tạo Reverse Proxy Host

Mỗi dịch vụ web sẽ được cấu hình Reverse Proxy trong 1 file cấu hình riêng được lưu trong thư mục sites-enabled. Việc này giúp việc quản lý cấu hình tiện lợi hơn so với việc cấu hình tất cả trong 1 file Dockerfile duy nhất.

1. Dịch vụ web nằm cùng máy chủ với Caddy

Trường hợp này áp dụng cho các dịch vụ web nằm cùng máy chủ với Caddy, đã được cập nhật lại cấu hình mạng theo hướng dẫn ở bước IV.

Mình muốn truy cập vào memos theo địa chỉ https://memos.thuanbui.me, tạo file mới như bên dưới. Tên file nên được đặt theo tên miền cho trực quan, dễ hiểu.

cd ~/caddy
nano sites-enabled/memos.thuanbui.meCode language: Bash (bash)

Nhập vào nội dung sau

memos.thuanbui.me {
        reverse_proxy memos:5230
}

2. Dịch vụ web nằm khác máy chủ với Caddy

Với các dịch vụ web được cài đặt ở máy chủ khác với Caddy, file cấu hình cần được sửa lại sử dụng dạng IP:Port.

Ví dụ như cấu hình cho Komga, được cài đặt trên máy chủ 192.168.1.50 sẽ như sau

komga.thuanbui.me {
        reverse_proxy 192.168.1.50:25600
}Code language: YAML (yaml)

3. Khởi động lại Caddy

Sau khi thiết lập các file cấu hình reverse proxy, cấu trúc thư mục caddy sẽ tương tự như sau

.
├── Caddyfile
├── caddy_config
│   └── caddy
├── caddy_data
│   └── caddy
├── compose.yml
└── sites-enabled
    ├── memos.thuanbui.me
    └── komga.thuanbui.me
Code language: CSS (css)

Để Caddy cập nhật thông số từ các file cấu hình vừa tạo, khởi động lại bằng lệnh

docker exec -w /etc/caddy caddy caddy reloadCode language: Bash (bash)

Chờ vài phút để Caddy tự động tạo chứng chỉ SSL cho tên miền, sau đó mình có thể truy cập vào các dịch vụ mạng thông qua các tên miền đã khai báo.


Thiết lập Reverse Proxy cho homelab bằng Caddy được thực hiện hoàn toàn bằng dòng lệnh. Việc này có thể hơi khó khăn cho các bạn chưa quen với Linux. Nhưng một khi đã thành thạo, bạn sẽ thấy việc quản lý nhanh gọn hơn nhiều so với việc cấu hình thông qua giao diện web.

Chúc bạn thực hiện thành công!

Lưu ý: Nếu bạn cần hỗ trợ kỹ thuật, vui lòng gửi câu hỏi trực tiếp ở phần Thảo luận bên dưới, mình sẽ trả lời sớm. Đừng vào hỏi trong fanpage Yêu Chạy Bộ, sẽ không có phản hồi đâu!

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *


6 Comments

  1. Cho em hỏi một chút!! Với bài viết này của anh thì Caddyfile không phải cấu hình đúng không ạ, làm sao để Caddy server có thể biết a đang khai báo các trang với reverse proxy như thế nào để truyền dữ liệu anh nhỉ

    1. À sorry anh, em hiểu rồi, e miss cái vụ khai báo ban đầu, sorry anh.
      Anh cho em hỏi, em đang có 1 NUC PC và muốn làm một server homelab riêng,em đã cài promox, anh cho em hỏi là với promox thì nên cài docker trên nền hệ điều hành nào là tốt nhất ạ, và em định cho plex server cùng wordpress chạy trên homelab NUC đó, nhưng dữ liệu upload hoặc phim lấy từ NAS có sẵn thì làm thế nào ạ, em đang mắc vụ đó

      1. Cảm ơn a đã phản hồi!
        Cho e hỏi một chút khi thao tác với homelab a hay dùng trực tiếp trên proxmox web hay là dùng remote desktop ạ, vì e thấy thao tác web đang hơi khó (remote desktop debian e cũng chưa sử dụng luôn, nhưng chắc làm cũng không khó), hiện tại em dùng Mac thao tác máy ảo debian trên web proxmox đang khó khăn phần gõ phím và copy từ ngoài vào không được cứ phải gõ chay thấy hơi khó chịu

  2. Chỉ có máy ảo Windows là anh phải vô Proxmox để điều khiển. Còn lại máy ảo Linux hay LXC đều là bản Server không có giao diện GUI, kết nối SSH vô để quản lý thôi.