From f244eb704cb2c1705c97bf6b1ee1f0106efdf228 Mon Sep 17 00:00:00 2001 From: Jonas Kaninda Date: Fri, 27 Dec 2024 19:20:49 +0100 Subject: [PATCH] Update core features --- README.md | 368 +++++++++++++++++++++++++-------------------------- compose.yaml | 29 ++++ 2 files changed, 209 insertions(+), 188 deletions(-) create mode 100644 compose.yaml diff --git a/README.md b/README.md index 18352a2..9f29c84 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,8 @@ +### 🐳 **Docker Image: Laravel PHP-FPM** + +A **ready-to-use container** designed for running PHP-based applications, including Laravel microservices. +This Docker image comes with **PHP-FPM**, offering a robust foundation for your projects with built-in support for essential extensions and configurations. + [![Build](https://github.com/jkaninda/laravel-php-fpm/actions/workflows/build.yml/badge.svg)](https://github.com/jkaninda/laravel-php-fpm/actions/workflows/build.yml) [![Tests](https://github.com/jkaninda/laravel-php-fpm/actions/workflows/tests.yml/badge.svg)](https://github.com/jkaninda/laravel-php-fpm/actions/workflows/tests.yml) ![Docker Image Size (latest by date)](https://img.shields.io/docker/image-size/jkaninda/laravel-php-fpm?style=flat-square) @@ -9,116 +14,76 @@

-# Laravel PHP-FPM Docker image +#### **Features** +- **PHP Application Support**: Optimized to run Laravel or any PHP-based applications. +- **Integrated Extensions**: + - **Database**: MySQL and PostgreSQL. + - **Caching**: Redis and Memcached. + - **Messaging**: Kafka for event-driven architecture. + - **Task Scheduling**: Laravel Scheduler and Cron jobs support. +- **Custom Configuration**: Pre-configured with sensible defaults, allowing seamless customization. +- **Event Handling**: Support for advanced event-driven processes. +- **Optimized for Microservices**: Built with modern PHP microservices in mind. -> 🐳 Full Docker image for a PHP-FPM container created to run Laravel or any php based applications. +This image is ideal for developers looking for a streamlined, high-performance solution to deploy PHP applications with essential tools already integrated. -> PHP Microservices ready Docker container image. +## Links: - [Docker Hub](https://hub.docker.com/r/jkaninda/laravel-php-fpm) - [Github](https://github.com/jkaninda/laravel-php-fpm) +--- +## **Supported PHP Versions** +- 8.4 +- 8.3 +- 8.2 +- 8.1 +- 8.0 +- 7.4 +- 7.2 -## PHP Version: -- 8.4 -- 8.3 -- 8.2 -- 8.1 -- 8.0 -- 7.4 -- 7.2 -## Specifications: +--- -* Composer -* OpenSSL PHP Extension -* XML PHP Extension -* PDO PHP Extension -* PDO Mysql -* PDO Pgsql -* Rdkafka PHP Extension -* Redis PHP Extension -* Mbstring PHP Extension -* PCNTL PHP Extension -* ZIP PHP Extension -* GD PHP Extension -* BCMath PHP Extension -* Memcached -* Opcache -* Laravel Cron Job -* Laravel Schedule -* Laravel Envoy -* Supervisord -* Node -* NPM +## **Specifications** -## Simple docker-compose usage: +### **PHP Extensions** +- Composer +- OpenSSL +- XML +- PDO (MySQL and PostgreSQL) +- Rdkafka +- Redis +- Mbstring +- PCNTL +- ZIP +- GD +- BCMath +- Memcached +- Opcache -```yml -version: '3' +### **Additional Features** +- Laravel Cron Jobs +- Laravel Scheduler +- Supervisord +- Node.js and NPM + +--- + +## **Getting Started** + +### **Simple Docker-Compose Example** +```yaml services: - php-fpm: - image: jkaninda/laravel-php-fpm:latest - container_name: php-fpm - restart: unless-stopped - user: www-data #Use www-data user for production usage - volumes: - #Project root - - ./src:/var/www/html - networks: - - default #if you're using networks between containers - -``` -## Docker: -### Run -```sh - docker compose up -d -``` -### Create Laravel project -```sh -docker compose exec php-fpm composer create-project --prefer-dist laravel/laravel . -``` -### Artisan generate key -```sh -docker compose exec php-fpm php artisan key:generate -``` -### Storage link -```sh -docker compose exec php-fpm php artisan storage:link -``` -### Fix permissions -```sh -docker compose exec php-fpm chmod -R 777 storage bootstrap/cache -``` -### Laravel migration -```sh - docker compose exec php-fpm php artisan migrate -``` -### -```sh -docker exec -it php-fpm bash - -``` - -## Configurations - -- Supervisor config folder: /etc/supervisor/conf.d/ -- PHP ini config foler /usr/local/etc/php/conf.d/ - -## Example Laravel-php-fpm with nginx: -### docker-compose.yml -```yml -services: - php-fpm: - image: jkaninda/laravel-php-fpm - container_name: php-fpm - restart: unless-stopped - volumes: - #Project root - - ./:/var/www/html - networks: - - default #if you're using networks between containers - #Nginx server - nginx-server: + php-fpm: + image: jkaninda/laravel-php-fpm:latest + container_name: php-fpm + restart: unless-stopped + user: www-data # For production + volumes: + - ./:/var/www/html + networks: + - default + nginx-server: image: jkaninda/nginx-fpm:alpine container_name: nginx-server restart: unless-stopped @@ -132,64 +97,64 @@ services: - PHP_FPM_HOST=php-fpm:9000 networks: - default - -``` -## Simple Nginx config file content -### default.conf - -```conf - -server { - listen 80; - index index.php index.html; - error_log /var/log/nginx/error.log; - access_log /var/log/nginx/access.log; - ##Public directory - root /var/www/html/public; - location ~ \.php$ { - try_files $uri =404; - fastcgi_split_path_info ^(.+\.php)(/.+)$; - ## PHP FPM ( php-fpm:9000 ) or [servicename:9000] - fastcgi_pass php-fpm:9000; - fastcgi_index index.php; - include fastcgi_params; - fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; - fastcgi_param PATH_INFO $fastcgi_path_info; - - } - client_max_body_size 15M; - server_tokens off; - - # Hide PHP headers - fastcgi_hide_header X-Powered-By; - fastcgi_hide_header X-CF-Powered-By; - fastcgi_hide_header X-Runtime; - - location / { - try_files $uri $uri/ /index.php?$query_string; - gzip_static on; - } -} ``` -## Advanced Laravel-php-fpm with nginx: -### docker-compose.yml -```yml +### **Basic Commands** +- **Start Containers** + ```sh + docker compose up -d + ``` + +- **Create a Laravel Project** + ```sh + docker compose exec php-fpm composer create-project --prefer-dist laravel/laravel . + ``` + +- **Generate Application Key** + ```sh + docker compose exec php-fpm php artisan key:generate + ``` + +- **Create Storage Symlink** + ```sh + docker compose exec php-fpm php artisan storage:link + ``` + +- **Fix Permissions** + ```sh + docker compose exec php-fpm chmod -R 777 storage bootstrap/cache + ``` + +- **Run Laravel Migrations** + ```sh + docker compose exec php-fpm php artisan migrate + ``` + +- **Access the Container Shell** + ```sh + docker exec -it php-fpm bash + ``` + +--- + +## **Advanced Usage with Nginx** + +### **Docker-Compose with Nginx** +Example of using a custom nginx config: + +```yaml +version: '3' services: - php-fpm: - image: jkaninda/laravel-php-fpm - container_name: php-fpm - restart: unless-stopped - volumes: - #Project root - - ./:/var/www/html - - ~/.ssh:/root/.ssh # If you use private CVS - - ./php.ini:/usr/local/etc/php/conf.d/php.ini # Optional, your custom php init file - environment: - - APP_ENV=development # Optional, or production - #- LARAVEL_PROCS_NUMBER=1 # Optional, Laravel queue:work process number - #Nginx server - nginx-server: + php-fpm: + image: jkaninda/laravel-php-fpm + container_name: php-fpm + restart: unless-stopped + volumes: + - ./:/var/www/html + networks: + - default + + nginx-server: image: nginx:alpine container_name: nginx-server restart: unless-stopped @@ -198,46 +163,68 @@ services: volumes: - ./:/var/www/html - ./default.conf:/etc/nginx/conf.d/default.conf + environment: + - DOCUMENT_ROOT=/var/www/html/public + - CLIENT_MAX_BODY_SIZE=20M + - PHP_FPM_HOST=php-fpm:9000 networks: - default -volumes: - storage-data: ``` -## Docker run -```sh - docker compose up -d +### **Nginx Configuration (default.conf)** -``` -## Build from base +```conf +server { + listen 80; + index index.php index.html; + root /var/www/html/public; -Dockerfile + location ~ \.php$ { + try_files $uri =404; + fastcgi_split_path_info ^(.+\.php)(/.+)$; + fastcgi_pass php-fpm:9000; + fastcgi_index index.php; + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_param PATH_INFO $fastcgi_path_info; + } + + location / { + try_files $uri $uri/ /index.php?$query_string; + gzip_static on; + } + + client_max_body_size 15M; + server_tokens off; + fastcgi_hide_header X-Powered-By; +} +``` + +--- + +## **Custom Build** + +### **Dockerfile Example** ```Dockerfile FROM jkaninda/laravel-php-fpm:8.3 -# Copy laravel project files +# Copy Laravel project files COPY . /var/www/html -# Storage Volume VOLUME /var/www/html/storage - WORKDIR /var/www/html -# Custom cache invalidation / optional -#ARG CACHEBUST=1 -# Run composer install / Optional -#RUN composer install # Fix permissions RUN chown -R www-data:www-data /var/www/html +USER www-data ``` -## Supervisord -### Add supervisor process in -> /etc/supervisor/conf.d/ +--- -In case you want to execute and maintain a task or process with supervisor. +## **Supervisord Integration** -Find below an example with Apache Kafka, when you want to maintain a consumer process. -### Example: +### **Adding Custom Supervisor Processes** +Place configurations in `/etc/supervisor/conf.d/`. +Example Kafka consumer process: ```conf [program:kafkaconsume-worker] process_name=%(program_name)s_%(process_num)02d @@ -250,21 +237,26 @@ redirect_stderr=true stdout_logfile=/var/www/html/storage/logs/kafka.log ``` -### Custom php.ini -> /var/www/html/conf/php/php.ini +--- -### Storage permision issue -```sh - docker compose exec php-fpm /bin/bash - ``` +## **Custom PHP Configurations** +Place your custom `php.ini` file at: +``` +/usr/local/etc/php/conf.d/ +``` + +--- + +## **Storage Permissions Fix** +If you encounter permission issues, run: ```sh - chown -R www-data:www-data /var/www/html - ``` - -> chmod -R 775 /var/www/html/storage - - -> P.S. please give a star if you like it :wink: +docker compose exec php-fpm /bin/bash +chown -R www-data:www-data /var/www/html +chmod -R 775 /var/www/html/storage +``` +--- +### ⭐️ **Support the Project** +If you find this project useful, please give it a ⭐️ on GitHub! 😊 \ No newline at end of file diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 0000000..b4f1d93 --- /dev/null +++ b/compose.yaml @@ -0,0 +1,29 @@ +services: + php-fpm: + image: jkaninda/laravel-php-fpm + container_name: php-fpm + restart: unless-stopped + user: www-data #Use www-data user production usage + volumes: + #Project root + - ./:/var/www/html + networks: + - web #if you're using networks between containers + #Nginx server + nginx-server: + image: jkaninda/nginx-fpm:alpine + container_name: nginx-server + restart: unless-stopped + ports: + - 80:80 + volumes: + - ./:/var/www/html + environment: + - DOCUMENT_ROOT=/var/www/html/public + - CLIENT_MAX_BODY_SIZE=20M + - PHP_FPM_HOST=php-fpm:9000 + networks: + - web +networks: + web: + external: false