Cài Caddy trên docker làm reverse-proxy cho Golang chạy trên host

Nghe tiêu đề hơi hoang mang, nhưng về cơ bản, mình sẽ trình bày một vài cài đặt với Caddy để dùng làm reverse-proxy cho ứng dụng Golang chạy trực tiếp trên host.

Nếu dùng curl -I tới trang web đang chạy thì bạn sẽ thấy ngay được server đang dùng là gì. Một số app có thể chạy trực tiếp nhưng do mình muốn dùng nhiều hơn 1 app trên con VPS, nên cần cài reverse-proxy như nginx hay Caddy.

Đây là kết quả curl -I khi mình chưa che IP qua Cloudflare, vì nếu chạy proxy qua Cloudflare, server trả về sẽ là cloudflare.

Do dùng Portainer nên việc cài Caddy của mình đơn giản là click chuột. Điều đáng chú ý nhất là mapping cổng 80 và 443 vào Caddy, thiết lập chính xác volumes để mình có thể lưu trữ dữ liệu của container khi cài hoặc xóa, đồng thời điều chỉnh file Caddyfile.

Đầu tiên mình tạo 2 volumes trên host là caddy_data và caddy_config để mount vào 2 vùng chứa của container /data và /config.

Do Caddy chứa file tùy chỉnh trong container ở địa chỉ /etc/caddy/Caddyfile, nên trên host, mình tạo một file (không có extension) có tên Caddyfile và đặt trong thư mục /var/lib/docker/volumes/caddy_data/_data/Caddyfile.

Nội dung thì chỉ có vầy thôi:

:80 {
	respond "Hello, world!"
}

Việc mount như sau:

Chú ý rằng, khi mình tạo một volumes trên docker là caddy_config, thì nó sẽ tạo ra một thư mục nằm trên host tại địa chỉ: /var/lib/docker/volumes/caddy_data/_data/Caddyfile, trong đó thư mục con _data sẽ được tự động tạo. Do vậy, mình sẽ phải dẫn đường dẫn đầy đủ của Caddyfile như trên và chọn Bind thay vì volume.

Tiếp đến, mình sẽ cấu hình để Caddy forward kết nối từ domain tới hosting qua một cổng tùy chọn:

Nếu dòng reverse_proxy mình dùng localhost:9999 thì container Caddy sẽ hiểu là localhost của chính nó, do đó, mình dùng 172.17.10.1 là cổng của host.

Để tìm được IP này, ta sẽ tìm các check các network trước.

docker network ls

Lệnh trên sẽ liệt kê các network đang có trên docker. Mặc định sẽ có bridge, host và null. Gọi lệnh sau để inspect các network. Giả sử mình inspect network bridge:

docker network inspect bridge

Kết quả như sau:

Gateway của network bridge là 172.17.0.1.

Nếu app golang chạy trên một container khác thì mình có thể thay IP trên của host bằng tên của container luôn. Caddy viết bằng Go nên đây là lí do mình chuyển sang, thay vì nginx quen thuộc.

Leave a Comment