From f3c71c0258b1fa18ebd042e61c5c84b6ba9bfc29 Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Thu, 10 Jul 2025 17:13:56 -0400 Subject: [PATCH 1/2] feat: Add `FrankenPHP` support with docker configuration and `Caddyserver` setup. --- .github/workflows/docker.yml | 25 +++++++++ README.md | 8 +++ docker-compose.frankenphp.yml | 25 +++++++++ docker/frankenphp/Caddyfile | 52 +++++++++++++++++++ docker/frankenphp/Dockerfile | 47 +++++++++++++++++ .../supervisord/conf.d/frankenphp.conf | 12 +++++ .../frankenphp/supervisord/conf.d/queue.conf | 14 +++++ docker/frankenphp/supervisord/log/.gitignore | 2 + .../frankenphp/supervisord/supervisord.conf | 15 ++++++ 9 files changed, 200 insertions(+) create mode 100644 docker-compose.frankenphp.yml create mode 100644 docker/frankenphp/Caddyfile create mode 100644 docker/frankenphp/Dockerfile create mode 100644 docker/frankenphp/supervisord/conf.d/frankenphp.conf create mode 100644 docker/frankenphp/supervisord/conf.d/queue.conf create mode 100644 docker/frankenphp/supervisord/log/.gitignore create mode 100644 docker/frankenphp/supervisord/supervisord.conf diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 9f856a0..ca39572 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -38,6 +38,31 @@ jobs: - name: Run codeception tests. run: docker exec yii2-apache vendor/bin/codecept run + test-frankenphp: + runs-on: ubuntu-latest + + steps: + - name: Checkout. + uses: actions/checkout@v4 + + - name: Install docker compose. + run: | + sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose + sudo chmod +x /usr/local/bin/docker-compose + docker-compose --version + + - name: Build and start containers. + run: docker-compose -f docker-compose.frankenphp.yml build --no-cache && docker-compose -f docker-compose.frankenphp.yml up -d + + - name: Update vendor packages. + run: docker exec yii2-frankenphp composer update --prefer-dist -vvv + + - name: Codeception build. + run: docker exec yii2-frankenphp vendor/bin/codecept build + + - name: Run codeception build and tests. + run: docker exec yii2-frankenphp vendor/bin/codecept run + test-nginx: runs-on: ubuntu-latest diff --git a/README.md b/README.md index 1f6e662..f9b419a 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,7 @@ A modern, Bootstrap 5-powered Yii2 application template designed for rapid web-a ## Environment support [![Apache](https://img.shields.io/badge/apache-%23D42029.svg?style=for-the-badge&label=docker&logo=apache&logoColor=white)](docker-compose.yml) +[![FrankenPHP](https://img.shields.io/badge/frankenphp-%23FF6B35.svg?style=for-the-badge&label=docker&logo=php&logoColor=white)](docker-compose.frankenphp.yml) [![Nginx](https://img.shields.io/badge/nginx-%23009639.svg?style=for-the-badge&label=docker&logo=nginx&logoColor=white)](docker-compose.nginx.yml) ## Quick start @@ -100,6 +101,9 @@ php -S localhost:8080 -t public # For Apache docker-compose up -d +# For FrankenPHP +docker-compose -f docker-compose.frankenphp.yml up -d + # For Nginx docker-compose -f docker-compose.nginx.yml up -d ``` @@ -115,6 +119,9 @@ http://localhost:8080/ # For Apache http://localhost:8080/ +# For FrankenPHP +http://localhost:8082/ + # For Nginx http://localhost:8081/ ``` @@ -132,6 +139,7 @@ root/ │ └── messages.php Translation config ├── docker/ Docker configuration files │ ├── apache/ Apache configuration +│ ├── frankenphp/ FrankenPHP configuration │ ├── nginx/ Nginx configuration │ └── php/ PHP configuration ├── src/ diff --git a/docker-compose.frankenphp.yml b/docker-compose.frankenphp.yml new file mode 100644 index 0000000..cc2a56d --- /dev/null +++ b/docker-compose.frankenphp.yml @@ -0,0 +1,25 @@ + +services: + yii2-frankenphp: + build: + dockerfile: docker/frankenphp/Dockerfile + container_name: yii2-frankenphp + restart: always + working_dir: /app + volumes: + - ./:/app + - ~/.composer-docker/cache:/root/.composer/cache:delegated + - caddy_data:/data + - caddy_config:/config + ports: + - '8082:80' + - '8443:443' + - '8443:443/udp' + environment: + TZ: "UTC" + tty: true + +# Volumes needed for Caddy certificates and configuration +volumes: + caddy_data: + caddy_config: diff --git a/docker/frankenphp/Caddyfile b/docker/frankenphp/Caddyfile new file mode 100644 index 0000000..573f105 --- /dev/null +++ b/docker/frankenphp/Caddyfile @@ -0,0 +1,52 @@ +{ + # Global options + auto_https off +} + +# Main server block +:80 { + # Document root + root * /app/public + + # Enable PHP processing with FrankenPHP + php_server + + # Security headers + header { + X-Frame-Options "SAMEORIGIN" + X-XSS-Protection "1; mode=block" + X-Content-Type-Options "nosniff" + -Server + } + + # Logging + log { + output stdout + format console + } + + # Handle static files + @static { + file + path *.css *.js *.png *.jpg *.jpeg *.gif *.ico *.svg *.woff *.woff2 *.ttf *.eot + } + handle @static { + header Cache-Control "public, max-age=31536000" + file_server + } + + # Block access to sensitive directories + @forbidden { + path /.git/* /vendor/* /runtime/* /.env* + } + respond @forbidden 404 + + # Deny PHP execution in assets directory (Yii2 security) + @assets_php { + path /assets/*.php + } + respond @assets_php 403 + + # Try files for Yii2 URL rewriting + try_files {path} {path}/ /index.php?{query} +} diff --git a/docker/frankenphp/Dockerfile b/docker/frankenphp/Dockerfile new file mode 100644 index 0000000..2ee5d34 --- /dev/null +++ b/docker/frankenphp/Dockerfile @@ -0,0 +1,47 @@ +FROM dunglas/frankenphp:1.8-php8.4 + +# change web server config +COPY docker/frankenphp/Caddyfile /etc/caddy/Caddyfile + +# set document root to /app/public (Yii2 structure) +WORKDIR /app + +# install required system packages for PHP extensions for Yii 2.0 Framework +COPY --from=mlocati/php-extension-installer /usr/bin/install-php-extensions /usr/local/bin/ +RUN install-php-extensions \ + bcmath \ + exif \ + gd \ + imagick \ + intl \ + opcache \ + pdo_mysql \ + pdo_pgsql \ + soap \ + xdebug \ + zip + +# change PHP config +COPY docker/php/php.ini /usr/local/etc/php/conf.d/base.ini + +# install supervisord and Node.js (includes npm) +RUN apt-get update && apt-get install -y \ + supervisor \ + curl \ + --no-install-recommends \ + && curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - \ + && apt-get install -y nodejs \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +# copy supervisord config +COPY docker/frankenphp/supervisord/supervisord.conf /etc/supervisor/supervisord.conf + +# copy supervisord program configs +COPY docker/frankenphp/supervisord/conf.d/frankenphp.conf /etc/supervisor/conf.d/frankenphp.conf + +# copy queue worker config uncommented for use with yii2-queue +#COPY docker/frankenphp/supervisord/conf.d/queue.conf /etc/supervisor/conf.d/queue.conf + +# Run supervisord +CMD ["supervisord", "-c", "/etc/supervisor/supervisord.conf"] diff --git a/docker/frankenphp/supervisord/conf.d/frankenphp.conf b/docker/frankenphp/supervisord/conf.d/frankenphp.conf new file mode 100644 index 0000000..93a0e92 --- /dev/null +++ b/docker/frankenphp/supervisord/conf.d/frankenphp.conf @@ -0,0 +1,12 @@ +[program:frankenphp] +command=/usr/local/bin/frankenphp run --config /etc/caddy/Caddyfile +autostart=true +autorestart=true +priority=10 +killasgroup=true +stopasgroup=true +stopsignal=QUIT +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 diff --git a/docker/frankenphp/supervisord/conf.d/queue.conf b/docker/frankenphp/supervisord/conf.d/queue.conf new file mode 100644 index 0000000..b27b6bb --- /dev/null +++ b/docker/frankenphp/supervisord/conf.d/queue.conf @@ -0,0 +1,14 @@ +[program:yii-queue-worker] +process_name=%(program_name)s_%(process_num)02d +command=/usr/local/bin/php /app/yii queue/listen --verbose=1 --color=0 +autorestart=true +autostart=true +killasgroup=true +numprocs=4 +redirect_stderr=true +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stopasgroup=true +user=www-data diff --git a/docker/frankenphp/supervisord/log/.gitignore b/docker/frankenphp/supervisord/log/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/docker/frankenphp/supervisord/log/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/docker/frankenphp/supervisord/supervisord.conf b/docker/frankenphp/supervisord/supervisord.conf new file mode 100644 index 0000000..694dd21 --- /dev/null +++ b/docker/frankenphp/supervisord/supervisord.conf @@ -0,0 +1,15 @@ +[supervisord] +nodaemon=true +logfile=/dev/stdout +logfile_maxbytes=0 +pidfile=/var/run/supervisord.pid + +[include] +files = /etc/supervisor/conf.d/*.conf + +[supervisorctl] +serverurl=unix:///var/run/supervisor.sock + +[unix_http_server] +file=/var/run/supervisor.sock +chmod=0700 From 44c75a07932a44fa02ec99a89a0338a04fe913d0 Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Thu, 10 Jul 2025 17:44:09 -0400 Subject: [PATCH 2/2] feat: Update Dockerfile to include Composer installation and set environment variable; modify supervisord config to specify user. --- docker/frankenphp/Dockerfile | 6 ++++++ docker/frankenphp/supervisord/conf.d/frankenphp.conf | 1 + 2 files changed, 7 insertions(+) diff --git a/docker/frankenphp/Dockerfile b/docker/frankenphp/Dockerfile index 2ee5d34..9a9d6f4 100644 --- a/docker/frankenphp/Dockerfile +++ b/docker/frankenphp/Dockerfile @@ -10,6 +10,7 @@ WORKDIR /app COPY --from=mlocati/php-extension-installer /usr/bin/install-php-extensions /usr/local/bin/ RUN install-php-extensions \ bcmath \ + @composer \ exif \ gd \ imagick \ @@ -21,6 +22,9 @@ RUN install-php-extensions \ xdebug \ zip +# set composer environment +ENV COMPOSER_ALLOW_SUPERUSER=1 + # change PHP config COPY docker/php/php.ini /usr/local/etc/php/conf.d/base.ini @@ -43,5 +47,7 @@ COPY docker/frankenphp/supervisord/conf.d/frankenphp.conf /etc/supervisor/conf.d # copy queue worker config uncommented for use with yii2-queue #COPY docker/frankenphp/supervisord/conf.d/queue.conf /etc/supervisor/conf.d/queue.conf +RUN mkdir -p /var/run && chown -R www-data:www-data /var/run + # Run supervisord CMD ["supervisord", "-c", "/etc/supervisor/supervisord.conf"] diff --git a/docker/frankenphp/supervisord/conf.d/frankenphp.conf b/docker/frankenphp/supervisord/conf.d/frankenphp.conf index 93a0e92..f60815d 100644 --- a/docker/frankenphp/supervisord/conf.d/frankenphp.conf +++ b/docker/frankenphp/supervisord/conf.d/frankenphp.conf @@ -10,3 +10,4 @@ stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0 +user=www-data