From 177020383ae27ca2e64089872a295ad8ca266f92 Mon Sep 17 00:00:00 2001 From: apoloz Date: Tue, 28 Nov 2023 08:05:23 +0000 Subject: [PATCH] makefile, nginx, php-fpm configs added --- Makefile | 2 + phpdocker/README.html | 208 ++++++++++++++++++++++++ phpdocker/README.md | 144 ++++++++++++++++ phpdocker/nginx/nginx.conf | 62 +++++++ phpdocker/php-fpm/Dockerfile | 11 ++ phpdocker/php-fpm/php-ini-overrides.ini | 2 + 6 files changed, 429 insertions(+) create mode 100644 Makefile create mode 100644 phpdocker/README.html create mode 100644 phpdocker/README.md create mode 100644 phpdocker/nginx/nginx.conf create mode 100644 phpdocker/php-fpm/Dockerfile create mode 100644 phpdocker/php-fpm/php-ini-overrides.ini diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..942e9f0 --- /dev/null +++ b/Makefile @@ -0,0 +1,2 @@ +init: + git clone https://gittea.eatv.io/eatvio/eatvio.git app diff --git a/phpdocker/README.html b/phpdocker/README.html new file mode 100644 index 0000000..e5ec0b8 --- /dev/null +++ b/phpdocker/README.html @@ -0,0 +1,208 @@ + + + PHPDocker.io Readme + + + + + + +
+
+
+

PHPDocker.io generated environment

+ +

Add to your project

+ +

Simply, unzip the file into your project, this will create docker-compose.yml on the root of your project and a folder +named phpdocker containing nginx and php-fpm config for it.

+ +

Ensure the webserver config on phpdocker/nginx/nginx.conf is correct for your project. PHPDocker.io will have +customised this file according to the front controller location relative to the docker-compose file you chose on the +generator (by default public/index.php).

+ +

Note: you may place the files elsewhere in your project. Make sure you modify the locations for the php-fpm dockerfile, +the php.ini overrides and nginx config on docker-compose.yml if you do so.

+ +

How to run

+ +

Dependencies:

+ + + +

Once you're done, simply cd to your project and run docker-compose up -d. This will initialise and start all the +containers, then leave them running in the background.

+ +

Services exposed outside your environment

+ +

You can access your application via localhost. Mailhog and nginx both respond to any hostname, in case you want to +add your own hostname on your /etc/hosts

+ + + + + + + + + + + + + + + + + + +
ServiceAddress outside containers
Webserverlocalhost:1092
MySQLhost: localhost; port: 1094
+ +

Hosts within your environment

+ +

You'll need to configure your application to use any services you enabled:

+ + + + + + + + + + + + + + + + + + + + + +
ServiceHostnamePort number
php-fpmphp-fpm9000
MySQLmysql3306 (default)
+ +

Docker compose cheatsheet

+ +

Note: you need to cd first to where your docker-compose.yml file lives.

+ +
    +
  • Start containers in the background: docker-compose up -d
  • +
  • Start containers on the foreground: docker-compose up. You will see a stream of logs for every container running. +ctrl+c stops containers.
  • +
  • Stop containers: docker-compose stop
  • +
  • Kill containers: docker-compose kill
  • +
  • View container logs: docker-compose logs for all containers or docker-compose logs SERVICE_NAME for the logs of +all containers in SERVICE_NAME.
  • +
  • Execute command inside of container: docker-compose exec SERVICE_NAME COMMAND where COMMAND is whatever you want +to run. Examples: + +
      +
    • Shell into the PHP container, docker-compose exec php-fpm bash
    • +
    • Run symfony console, docker-compose exec php-fpm bin/console
    • +
    • Open a mysql shell, docker-compose exec mysql mysql -uroot -pCHOSEN_ROOT_PASSWORD
    • +
  • +
+ +

Application file permissions

+ +

As in all server environments, your application needs the correct file permissions to work properly. You can change the +files throughout the container, so you won't care if the user exists or has the same ID on your host.

+ +

docker-compose exec php-fpm chown -R www-data:www-data /application/public

+ +

Recommendations

+ +

It's hard to avoid file permission issues when fiddling about with containers due to the fact that, from your OS point +of view, any files created within the container are owned by the process that runs the docker engine (this is usually +root). Different OS will also have different problems, for instance you can run stuff in containers +using docker exec -it -u $(id -u):$(id -g) CONTAINER_NAME COMMAND to force your current user ID into the process, but +this will only work if your host OS is Linux, not mac. Follow a couple of simple rules and save yourself a world of +hurt.

+ +
    +
  • Run composer outside of the php container, as doing so would install all your dependencies owned by root within your +vendor folder.
  • +
  • Run commands (ie Symfony's console, or Laravel's artisan) straight inside of your container. You can easily open a +shell as described above and do your thing from there.
  • +
+ +

Simple basic Xdebug configuration with integration to PHPStorm

+ +

Xdebug 2

+ +

To configure Xdebug 2 you need add these lines in php-fpm/php-ini-overrides.ini:

+ +

For linux:

+ +
xdebug.remote_enable = 1
+xdebug.remote_connect_back = 1
+xdebug.remote_autostart = 1
+
+ +

For macOS and Windows:

+ +
xdebug.remote_enable = 1
+xdebug.remote_host = host.docker.internal
+xdebug.remote_autostart = 1
+
+ +

Xdebug 3

+ +

To configure Xdebug 3 you need add these lines in php-fpm/php-ini-overrides.ini:

+ +

For linux:

+ +
xdebug.mode = debug
+xdebug.remote_connect_back = true
+xdebug.start_with_request = yes
+
+ +

For macOS and Windows:

+ +
xdebug.mode = debug
+xdebug.remote_host = host.docker.internal
+xdebug.start_with_request = yes
+
+ +

Add the section “environment” to the php-fpm service in docker-compose.yml:

+ +
environment:
+  PHP_IDE_CONFIG: "serverName=Docker"
+
+ +

Create a server configuration in PHPStorm:

+ +
    +
  • In PHPStorm open Preferences | Languages & Frameworks | PHP | Servers
  • +
  • Add new server
  • +
  • The “Name” field should be the same as the parameter “serverName” value in “environment” in docker-compose.yml (i.e. * +Docker* in the example above)
  • +
  • A value of the "port" field should be the same as first port(before a colon) in "webserver" service in +docker-compose.yml
  • +
  • Select "Use path mappings" and set mappings between a path to your project on a host system and the Docker container.
  • +
  • Finally, add “Xdebug helper” extension in your browser, set breakpoints and start debugging
  • +
+
+
+
+ + + + diff --git a/phpdocker/README.md b/phpdocker/README.md new file mode 100644 index 0000000..3452aaa --- /dev/null +++ b/phpdocker/README.md @@ -0,0 +1,144 @@ +PHPDocker.io generated environment +================================== + +# Add to your project # + +Simply, unzip the file into your project, this will create `docker-compose.yml` on the root of your project and a folder +named `phpdocker` containing nginx and php-fpm config for it. + +Ensure the webserver config on `phpdocker/nginx/nginx.conf` is correct for your project. PHPDocker.io will have +customised this file according to the front controller location relative to the docker-compose file you chose on the +generator (by default `public/index.php`). + +Note: you may place the files elsewhere in your project. Make sure you modify the locations for the php-fpm dockerfile, +the php.ini overrides and nginx config on `docker-compose.yml` if you do so. + +# How to run # + +Dependencies: + +* docker. See [https://docs.docker.com/engine/installation](https://docs.docker.com/engine/installation) +* docker-compose. See [docs.docker.com/compose/install](https://docs.docker.com/compose/install/) + +Once you're done, simply `cd` to your project and run `docker-compose up -d`. This will initialise and start all the +containers, then leave them running in the background. + +## Services exposed outside your environment ## + +You can access your application via **`localhost`**. Mailhog and nginx both respond to any hostname, in case you want to +add your own hostname on your `/etc/hosts` + +Service|Address outside containers +-------|-------------------------- +Webserver|[localhost:1092](http://localhost:1092) +MySQL|**host:** `localhost`; **port:** `1094` + +## Hosts within your environment ## + +You'll need to configure your application to use any services you enabled: + +Service|Hostname|Port number +------|---------|----------- +php-fpm|php-fpm|9000 +MySQL|mysql|3306 (default) + +# Docker compose cheatsheet # + +**Note:** you need to cd first to where your docker-compose.yml file lives. + +* Start containers in the background: `docker-compose up -d` +* Start containers on the foreground: `docker-compose up`. You will see a stream of logs for every container running. + ctrl+c stops containers. +* Stop containers: `docker-compose stop` +* Kill containers: `docker-compose kill` +* View container logs: `docker-compose logs` for all containers or `docker-compose logs SERVICE_NAME` for the logs of + all containers in `SERVICE_NAME`. +* Execute command inside of container: `docker-compose exec SERVICE_NAME COMMAND` where `COMMAND` is whatever you want + to run. Examples: + * Shell into the PHP container, `docker-compose exec php-fpm bash` + * Run symfony console, `docker-compose exec php-fpm bin/console` + * Open a mysql shell, `docker-compose exec mysql mysql -uroot -pCHOSEN_ROOT_PASSWORD` + +# Application file permissions # + +As in all server environments, your application needs the correct file permissions to work properly. You can change the +files throughout the container, so you won't care if the user exists or has the same ID on your host. + +`docker-compose exec php-fpm chown -R www-data:www-data /application/public` + +# Recommendations # + +It's hard to avoid file permission issues when fiddling about with containers due to the fact that, from your OS point +of view, any files created within the container are owned by the process that runs the docker engine (this is usually +root). Different OS will also have different problems, for instance you can run stuff in containers +using `docker exec -it -u $(id -u):$(id -g) CONTAINER_NAME COMMAND` to force your current user ID into the process, but +this will only work if your host OS is Linux, not mac. Follow a couple of simple rules and save yourself a world of +hurt. + +* Run composer outside of the php container, as doing so would install all your dependencies owned by `root` within your + vendor folder. +* Run commands (ie Symfony's console, or Laravel's artisan) straight inside of your container. You can easily open a + shell as described above and do your thing from there. + +# Simple basic Xdebug configuration with integration to PHPStorm + +## Xdebug 2 + +To configure **Xdebug 2** you need add these lines in php-fpm/php-ini-overrides.ini: + +### For linux: + +``` +xdebug.remote_enable = 1 +xdebug.remote_connect_back = 1 +xdebug.remote_autostart = 1 +``` + +### For macOS and Windows: + +``` +xdebug.remote_enable = 1 +xdebug.remote_host = host.docker.internal +xdebug.remote_autostart = 1 +``` + +## Xdebug 3 + +To configure **Xdebug 3** you need add these lines in php-fpm/php-ini-overrides.ini: + +### For linux: + +``` +xdebug.mode = debug +xdebug.remote_connect_back = true +xdebug.start_with_request = yes +``` + +### For macOS and Windows: + +``` +xdebug.mode = debug +xdebug.remote_host = host.docker.internal +xdebug.start_with_request = yes +``` + +## Add the section “environment” to the php-fpm service in docker-compose.yml: + +``` +environment: + PHP_IDE_CONFIG: "serverName=Docker" +``` + +### Create a server configuration in PHPStorm: + +* In PHPStorm open Preferences | Languages & Frameworks | PHP | Servers +* Add new server +* The “Name” field should be the same as the parameter “serverName” value in “environment” in docker-compose.yml (i.e. * + Docker* in the example above) +* A value of the "port" field should be the same as first port(before a colon) in "webserver" service in + docker-compose.yml +* Select "Use path mappings" and set mappings between a path to your project on a host system and the Docker container. +* Finally, add “Xdebug helper” extension in your browser, set breakpoints and start debugging + + + diff --git a/phpdocker/nginx/nginx.conf b/phpdocker/nginx/nginx.conf new file mode 100644 index 0000000..24046bb --- /dev/null +++ b/phpdocker/nginx/nginx.conf @@ -0,0 +1,62 @@ +upstream phpupstream { + server php-fpm:9000 fail_timeout=5s max_fails=5; +} + +server { + listen 80; + server_name dev2.eatvio.com; + + client_max_body_size 108M; + + # access_log /var/log/nginx/application.access.log; + + access_log /dev/stdout; + + root /application/public; + index index.php; + + # try to serve file directly, fallback to index.php + location / { + try_files $uri /index.php$is_args$args; + } + + if (!-e $request_filename) { + rewrite ^.*$ /index.php last; + } + + + location ~ \.php$ { + #resolver 127.0.0.11; + #set $upstream php-fpm:9000; + #fastcgi_pass php-fpm:9000; + # nginx will now start if host is not reachable + fastcgi_pass phpupstream; + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_param PHP_VALUE "error_log=/var/log/nginx/application_php_errors.log"; + fastcgi_buffers 16 16k; + fastcgi_buffer_size 32k; + include fastcgi_params; + } +} +server { + listen 80; + server_name socket.eatvio.com; + + location / { + proxy_pass http://172.118.0.5:6001; + proxy_read_timeout 60; + proxy_connect_timeout 60; + proxy_redirect off; + + # Allow the use of websockets + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; + } + + error_log /dev/stdout info; + access_log /dev/stdout; +} diff --git a/phpdocker/php-fpm/Dockerfile b/phpdocker/php-fpm/Dockerfile new file mode 100644 index 0000000..34b02b6 --- /dev/null +++ b/phpdocker/php-fpm/Dockerfile @@ -0,0 +1,11 @@ +FROM phpdockerio/php:8.2-fpm +WORKDIR "/application" + +RUN apt-get update; \ + apt-get -y --no-install-recommends install \ + git \ + php8.2-gd \ + php8.2-mysql \ + php8.2-pgsql; \ + apt-get clean; \ + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/* diff --git a/phpdocker/php-fpm/php-ini-overrides.ini b/phpdocker/php-fpm/php-ini-overrides.ini new file mode 100644 index 0000000..850ae11 --- /dev/null +++ b/phpdocker/php-fpm/php-ini-overrides.ini @@ -0,0 +1,2 @@ +upload_max_filesize = 100M +post_max_size = 108M