ลองใช้ caddy ทำ https server บน docker

Chonlasith Jucksriporn
odds.team
Published in
2 min readJul 22, 2018

ทำ Cotton มาสักพัก อยากจะเพิ่ม feature ให้มันสามารถทดสอบกับ HTTPS ที่มัน verify cerificate ไม่ได้ (เช่น https://localhost หรือ self-signed cert) แต่ไม่รู้จะไปหา site ไหนที่มี cert แบบนั้นมาลอง

อะกิแนะนำ server ตัวนึงที่ชื่อ caddy มาให้ เลยเอามาลองใช้กับ project ที่เป็น headless cms เดิมอยู่ดู

headless cms ที่ว่าเขียนด้วย php บน docker ที่มี environment ที่เป็น nginx + php fpm ทีนี้ จะต้องเปลี่ยน stack ส่วนที่เป็น nginx ออกไปใช้ caddy แทน

เข้าไปดูเว็บ caddy มันบอกว่ามันเป็น web server ที่มาพร้อมกับ https feature เลย ซึ่งเจ๋งมาก ถ้าเป็นตัวอื่นนี่คือต้องเข้าไป config เอง แต่ caddy นี่คือแค่ start เท่านั้น ก็ได้เลย ง่ายโคตร

ทีนี้มาดู docker-compose.yml ของเดิมก่อน


version: '2'
volumes:
database_data:
driver: local
services:
nginx:
image: nginx:latest
ports:
— 8080:80
volumes:
— ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
volumes_from:
— php
php:
build: ./docker/php/
expose:
— 9000
volumes:
— ./html:/var/www/html
environment:
— JWT_SECRET=ThereIsNoAngelAboveButInOurHeart
mariadb:
image: mariadb:latest
ports:
— 3306:3306
volumes:
— ./docker/mariadb:/opt/data
command: — init-file /opt/data/seed.sql
environment:
— MYSQL_ROOT_PASSWORD=qi1234
— MYSQL_DATABASE=qidb
— MYSQL_USER=qi
— MYSQL_PASSWORD=qi1234

ส่วนที่เราต้องเปลี่ยนคือ nginx ออก

nginx:
image: nginx:latest
ports:
— 8080:80
volumes:
— ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
volumes_from:
— php

ของเดิมกำหนดไว้ว่า เอา image จาก nginx:latest และทำการ map port 80 ออกมาเป็น 8080 นอกจากนี้ก็มีการเอา configuration ของ nginx เข้าไปใช้ข้างใน และปิดท้ายด้วยเอา volume ที่อยู่ใน service php มาใช้ด้วย

ดังนั้นเราจะเปลี่ยนเป็น

caddy:
image: abiosoft/caddy:php
ports:
— 8080:80
— 8443:443
volumes:
— ./docker/caddy/Caddyfile:/etc/Caddyfile
links:
— php
volumes_from:
— php
restart: always

ส่วนที่สำคัญคือ เราใช้ image ของ abiosoft/caddy:php และให้ map port 8080 กับ 8443 ไปที่ container บน port 80 กับ 443 ด้วย ที่เหลือก็คล้าย ๆ กับของเดิม รวมถึงมีการกำหนด configuration ให้ caddy ผ่าน Caddyfile ด้วย

Caddyfile

เพื่อให้ใช้ร่วมกับ container php เดิม เรากำหนดให้ Caddyfile มีหน้าตาแบบนี้

:80 {
root /var/www/html/public
gzip
fastcgi / php:9000 php
rewrite {
to {path} {path}/ /index.php/{uri}
}
log /var/log/caddy.log
errors /var/log/caddy.log
}
:443 {
root /var/www/html/public
gzip
fastcgi / php:9000 php
rewrite {
to {path} {path}/ /index.php/{uri}
}
log /var/log/caddy.log
errors /var/log/caddy.log
tls self_signed
}

คือ กำหนดให้ root อยู่ที่ /var/www/html/public และโยนไปรันที่ php:9000 นอกจากนี้ ทำ rewrite เพื่อทำ friendly url ด้วย ปิดท้ายด้วยที่ :443 จะมีการระบุให้ใช้ self_signed

การระบุแบบนี้ caddy จะใช้ cert ที่ไปได้มาจาก Let’s Encrypt ซึ่งให้บริการ free certificate แค่เราต้องไป renew เองตลอด แต่สำหรับ dev environment มันก็ถือว่าสะดวกมาก

ทีนี้พอเรา start docker ขึ้นมา https ก็พร้อมให้เราใช้งานทันที ง่ายสุด ๆ

ผลการทดสอบ headless cms บน https ด้วย cotton

อ้างอิง

ป.ล.

รูปแคดดี้ในรูปจั่วหัวไม่ได้เกี่ยวอะไรเลย แคดดี้ในสนามกอล์ฟสะกดว่า Caddie สะกดคนละแบบนะเออ

pingback: http://www.chonla.com/create-dockerized-caddy-https-server/

--

--