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

ทำ 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 ก็พร้อมให้เราใช้งานทันที ง่ายสุด ๆ

![http://chonla.com/wp-content/uploads/2018/07/Screen-Shot-2561-07-22-at-21.01.14-1.png](ผลการทดสอบ headless cms บน https ด้วย cotton)

อ้างอิง

ป.ล.

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

Leave a Reply

Your email address will not be published. Required fields are marked *