Setup frankenphp project

อัพเดต OS package และติดตั้ง package พื้นฐานที่ต้องใช้งาน

sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings

ติดตั้ง docker-ce

เพิ่ม GPG key ของ Docker

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

เพิ่ม Docker respository และทำการติดตั้ง docker-ce พร้อมเครื่องมือที่เกี่ยวข้อง

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

ตรวจสอบการติดตั้ง docker

sudo docker ps

สร้าง Environment สำหรับ frankenphp project

เราจะทำการรัน frankenphp ผ่าน Docker โดยทำการ bind mount volume ของ project เราเข้ากับ environment ต่างๆ ของ frankenphp

frankenphp เป็น Library ที่เสริมการทำงานของ Caddy http server ดังนั้นเราจะรัน web process เราผ่าน docker-compose

mkdir myproject
cd myproject
vi compose.yaml

ตัวอย่างเนื้อหาของ compose.yaml

name: myproject
 services:
   api:
     image: myproject
     ports:
       - "80:80"
     environment:
       - CADDY_GLOBAL_OPTIONS=debug
       - FRANKENPHP_CONFIG="worker ./public/index.php 120"
       - ENABLE_TELEMETRY=false
     volumes:
       - .:/app/public
       - ./Caddyfile:/etc/caddy/Caddyfile

Dockerfile

จากใน Compose file จะเห็นว่าเรามีการเรียกชื่อ Docker image ของเราเอง ซึ่งเราจะสร้าง image นี้ขึ้นมาจากการ build Dockerfile ที่มีลักษณะดังนี้

FROM dunglas/frankenphp:alpine

RUN apk --no-cache add \
    git

RUN install-php-extensions \
    bcmath \
    imagick \
    mongodb \
    opcache \
    zip

WORKDIR /app/public



# Install Composer && Assets Plugin
RUN php -r "readfile('https://getcomposer.org/installer');" | php -- --install-dir=/usr/local/bin --filename=composer \
&& rm -rf /var/cache/apk/*

COPY . .
COPY Caddyfile /etc/caddy/Caddyfile

# Project files
RUN git submodule init; git submodule update;

RUN composer update --optimize-autoloader --no-interaction --no-progress

EXPOSE 80

ส่วนของ install-php-extensions นั้นขึ้นอยู่กับว่า project ของเราต้องการ library ตัวใดบ้าง

สั่งให้ docker build image โดยระบุ tag ให้เป็น myproject ดังนี้

sudo docker build . -t myproject

ตัวอย่าง Caddyfile

{
        auto_https off
        frankenphp
        order php_server before file_server

        servers {
                trusted_proxies static private_ranges
        }
}

http:// {
        encode zstd br gzip
        php_server
        log

        root * "/app/public/web"
        try_files {path} /index.php?{query}&p={path}
}

ในที่นี้เราจะรัน Caddy project หลัง reverse proxy ที่ทำ SSL termination มาให้แล้ว จึงจะปิดฟีเจอร์ด้าน tls จากตัว caddy server ไป และมีการกำหนด php configuration เพื่อให้รัน php source code จาก folder /app/public/web ได้