diff --git a/.gitignore b/.gitignore index 6a783ee..b020775 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .env app/ mysql_data/ +typesense-data/ diff --git a/Makefile b/Makefile index 0298109..71d10cd 100644 --- a/Makefile +++ b/Makefile @@ -17,9 +17,21 @@ status: bash: docker-compose exec php-fpm bash +worker-restart: + docker-compose exec worker supervisorctl restart laravel-worker:* + +clear-images: + docker-compose exec php-fpm ./artisan clear:orphaned-images + +links-images: + jdupes -r -1 -l app/storage/app + tinker: docker-compose exec php-fpm ./artisan tinker +reseed-db: + docker-compose exec php-fpm bash -c "./artisan migrate:refresh; ./artisan db:seed" + setup-laravel-key: docker-compose exec php-fpm php /application/artisan key:generate @@ -69,7 +81,7 @@ node-frontend-deps: docker-compose exec php-fpm npm i --legacy-peer-deps test: - docker-compose exec php-fpm vendor/bin/phpunit + docker-compose exec php-fpm vendor/bin/paratest fix-insights: docker-compose exec php-fpm ./artisan insights --fix @@ -81,9 +93,15 @@ rector: docker-compose exec php-fpm vendor/bin/rector process --dry-run static-analysis: - docker-compose exec php-fpm composer static-analysis + docker-compose exec php-fpm composer static-analysis -ci: test rector insights static-analysis +detect-magic-numbers: + docker-compose exec php-fpm vendor/bin/phpmnd app/ tests/ + +ci: fix-code-style detect-magic-numbers test rector insights static-analysis + +local-ci: + docker-compose exec -T php-fpm composer ci init: clone copy-infra-env restart setup-laravel-packages copy-laravel-env setup-laravel-key run-migrations node-frontend-deps build-frontend-prod fix-permissions make-storage-link diff --git a/docker-compose.yml b/docker-compose.yml index 1486c25..f43dfdb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,90 +1,143 @@ --- -version: '3.1' +version: "3.1" services: - soketi: - image: 'quay.io/soketi/soketi:latest-16-alpine' - environment: - SOKETI_DEBUG: ${SOKETI_DEBUG} - SOKETI_METRICS_SERVER_PORT: ${SOKETI_METRICS_SERVER_PORT} - SOKETI_DEFAULT_APP_ID: ${SOKETI_DEFAULT_APP_ID} - SOKETI_DEFAULT_APP_KEY: ${SOKETI_DEFAULT_APP_KEY} - SOKETI_DEFAULT_APP_SECRET: ${SOKETI_DEFAULT_APP_SECRET} - SOKETI_DEFAULT_APP_ENABLE_CLIENT_MESSAGES: ${SOKETI_DEFAULT_APP_ENABLE_CLIENT_MESSAGES} - SOKETI_DEFAULT_APP_USER_AUTHENTICATION: ${SOKETI_DEFAULT_APP_USER_AUTHENTICATION} - ports: - - '${SOKETI_PORT:-6001}:6001' - - '${SOKETI_METRICS_SERVER_PORT:-9601}:9601' - networks: - ns-eatvio: - ipv4_address: 172.118.0.5 - labels: - - "traefik.enable=false" - restart: always + soketi: + image: "quay.io/soketi/soketi:latest-16-alpine" + environment: + SOKETI_DEBUG: ${SOKETI_DEBUG} + SOKETI_METRICS_SERVER_PORT: ${SOKETI_METRICS_SERVER_PORT} + SOKETI_DEFAULT_APP_ID: ${SOKETI_DEFAULT_APP_ID} + SOKETI_DEFAULT_APP_KEY: ${SOKETI_DEFAULT_APP_KEY} + SOKETI_DEFAULT_APP_SECRET: ${SOKETI_DEFAULT_APP_SECRET} + SOKETI_DEFAULT_APP_ENABLE_CLIENT_MESSAGES: ${SOKETI_DEFAULT_APP_ENABLE_CLIENT_MESSAGES} + SOKETI_DEFAULT_APP_USER_AUTHENTICATION: ${SOKETI_DEFAULT_APP_USER_AUTHENTICATION} + ports: + - "${SOKETI_PORT:-6001}:6001" + - "${SOKETI_METRICS_SERVER_PORT:-9601}:9601" + networks: + - ns-eatvio + labels: + - "traefik.enable=false" + restart: always - mysql: - image: 'mysql:8.0' - working_dir: /application - networks: - ns-eatvio: - ipv4_address: 172.118.0.3 - volumes: - - '.:/application' - - './mysql_data:/var/lib/mysql' - environment: - MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} - MYSQL_DATABASE: ${MYSQL_DATABASE} - MYSQL_USER: ${MYSQL_USER} - MYSQL_PASSWORD: ${MYSQL_PASSWORD} - ports: - - '1094:3306' - labels: - - "traefik.enable=false" - restart: always + mysql: + image: "mysql:8.0" + working_dir: /application + networks: + - ns-eatvio + volumes: + - ".:/application" + - "./mysql_data:/var/lib/mysql" + environment: + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} + MYSQL_DATABASE: ${MYSQL_DATABASE} + MYSQL_USER: ${MYSQL_USER} + MYSQL_PASSWORD: ${MYSQL_PASSWORD} + ports: + - "1094:3306" + labels: + - "traefik.enable=false" + restart: always - php-fpm: - build: phpdocker/php-fpm - working_dir: /application - networks: - ns-eatvio: - ipv4_address: 172.118.0.2 - volumes: - - './app:/application' - - './phpdocker/php-fpm/php-ini-overrides.ini:/etc/php/8.2/fpm/conf.d/99-overrides.ini' - labels: - - "traefik.enable=false" - restart: always - webserver: - image: 'nginx:alpine' - working_dir: /application - restart: always - volumes: - - './app:/application' - - './phpdocker/nginx/nginx.conf:/etc/nginx/conf.d/default.conf' - ports: - - '1092:80' - networks: - - web - - ns-eatvio - labels: - - "traefik.docker.network=web" - - "traefik.enable=true" - - "traefik.frontend.rule=Host:dev2.eatvio.com,socket.eatvio.com" - - "traefik.port=80" - - "traefik.protocol=http" + php-fpm: + build: phpdocker/php-fpm + working_dir: /application + environment: + - TZ=Europe/Moscow + depends_on: + - mysql + networks: + - ns-eatvio + volumes: + - "./app:/application" + - "./phpdocker/php-fpm/php-ini-overrides.ini:/etc/php/8.2/fpm/conf.d/99-overrides.ini" + labels: + - "traefik.enable=false" + restart: always - mailhog: - image: 'mailhog/mailhog' - ports: - - '8082:8025' - networks: - ns-eatvio: - ipv4_address: 172.118.0.4 + frontend: + build: phpdocker/front-end + command: "npm run watch" + working_dir: /application + environment: + - TZ=Europe/Moscow + depends_on: + - mysql + - php-fpm + networks: + - ns-eatvio + volumes: + - "./app:/application" + labels: + - "traefik.enable=false" + restart: always + + worker: + build: phpdocker/worker + working_dir: /application + environment: + - TZ=Europe/Moscow + command: "service supervisor start" + depends_on: + - mysql + - php-fpm + networks: + - ns-eatvio + volumes: + - "./app:/application" + - "./phpdocker/worker/php-ini-overrides.ini:/etc/php/8.2/fpm/conf.d/99-overrides.ini" + - "./phpdocker/worker/laravel-worker.conf:/etc/supervisor/conf.d/laravel-worker.conf" + labels: + - "traefik.enable=false" + restart: always + + webserver: + image: "nginx:alpine" + working_dir: /application + restart: always + depends_on: + - php-fpm + - soketi + volumes: + - "./app:/application" + - "./phpdocker/nginx/nginx.conf:/etc/nginx/conf.d/default.conf" + - "./phpdocker/nginx/alex.eatvio.local+4.pem:/etc/nginx/alex.eatvio.local+4.pem" + - "./phpdocker/nginx/alex.eatvio.local+4-key.pem:/etc/nginx/alex.eatvio.local+4-key.pem" + - "./phpdocker/nginx/socket.alex.eatvio.local+4.pem:/etc/nginx/socket.alex.eatvio.local+4.pem" + - "./phpdocker/nginx/socket.alex.eatvio.local+4-key.pem:/etc/nginx/socket.alex.eatvio.local+4-key.pem" + ports: + - "1092:80" + - "10443:5000" + networks: + - web + - ns-eatvio + + mailhog: + image: "mailhog/mailhog" + ports: + - "8082:8025" + networks: + - ns-eatvio + + typesense: + image: typesense/typesense:26.0 + restart: on-failure + expose: + - 8108 + ports: + - 8108:8108 + networks: + - ns-eatvio + - web + volumes: + - ./typesense-data:/data + command: "--data-dir /data --api-key=typesense --enable-cors" networks: - web: - external: true - ns-eatvio: - external: false - ipam: - config: - - subnet: 172.118.0.0/28 + web: + external: true + ns-eatvio: + external: false + ipam: + config: + - subnet: 172.118.0.0/28 diff --git a/phpdocker/front-end/Dockerfile b/phpdocker/front-end/Dockerfile new file mode 100644 index 0000000..95fc7c4 --- /dev/null +++ b/phpdocker/front-end/Dockerfile @@ -0,0 +1,16 @@ +FROM phpdockerio/php:8.2-fpm +WORKDIR "/application" + +RUN curl -sL https://deb.nodesource.com/setup_20.x | bash - +RUN apt-get update && \ + apt-get -y --no-install-recommends install \ + git \ + php8.2-gd \ + php8.2-mysql \ + php8.2-sqlite3 \ + php8.2-pgsql \ + nodejs && npm install -g npm@10.1.0 \ + apt-get clean; \ + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/* + +ENV PATH=node_modules/.bin:$PATH diff --git a/phpdocker/front-end/laravel-worker.conf b/phpdocker/front-end/laravel-worker.conf new file mode 100644 index 0000000..3826cdc --- /dev/null +++ b/phpdocker/front-end/laravel-worker.conf @@ -0,0 +1,23 @@ +[supervisord] +nodaemon=true + +[program:laravel-worker] +process_name=%(program_name)s_%(process_num)02d +command=php /application/artisan queue:work --sleep=3 --tries=3 --max-time=3600 +autostart=true +autorestart=true +stopasgroup=true +killasgroup=true +user=www-data +numprocs=2 +redirect_stderr=true +stdout_logfile=/application/storage/logs/worker.log +stopwaitsecs=3600 + +[program:php-fpm] +command=php-fpm8.2 -F +process_name=%(program_name)s_%(process_num)02d +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stdderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 diff --git a/phpdocker/front-end/php-ini-overrides.ini b/phpdocker/front-end/php-ini-overrides.ini new file mode 100644 index 0000000..850ae11 --- /dev/null +++ b/phpdocker/front-end/php-ini-overrides.ini @@ -0,0 +1,2 @@ +upload_max_filesize = 100M +post_max_size = 108M diff --git a/phpdocker/php-fpm/Dockerfile b/phpdocker/php-fpm/Dockerfile index edaf199..7739cf8 100644 --- a/phpdocker/php-fpm/Dockerfile +++ b/phpdocker/php-fpm/Dockerfile @@ -1,16 +1,30 @@ FROM phpdockerio/php:8.2-fpm WORKDIR "/application" +# ENV SUPERCRONIC_URL=https://github.com/aptible/supercronic/releases/download/v0.2.29/supercronic-linux-amd64 \ +# SUPERCRONIC=supercronic-linux-amd64 \ +# SUPERCRONIC_SHA1SUM=cd48d45c4b10f3f0bfdd3a57d054cd05ac96812b + RUN curl -sL https://deb.nodesource.com/setup_20.x | bash - -RUN apt-get update; \ - apt-get -y --no-install-recommends install \ - git \ - php8.2-gd \ - php8.2-mysql \ - php8.2-sqlite3 \ - nodejs \ - php8.2-pgsql && npm install -g npm@10.1.0 \ - apt-get clean; \ - rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/* +RUN apt-get update && \ + apt-get -y --no-install-recommends install \ + git \ + php8.2-gd \ + php8.2-mysql \ + php8.2-sqlite3 \ + php8.2-intl \ + php8.2-pgsql \ + python3-pkg-resources supervisor \ + nodejs && npm install -g npm@10.1.0 \ + apt-get clean; \ + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/* + + +RUN apt-get update && \ + apt-get install -y \ + ffmpeg \ + jpegoptim && \ + apt-get clean; \ + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/* ENV PATH=node_modules/.bin:$PATH diff --git a/phpdocker/php-fpm/laravel-worker.conf b/phpdocker/php-fpm/laravel-worker.conf new file mode 100644 index 0000000..3826cdc --- /dev/null +++ b/phpdocker/php-fpm/laravel-worker.conf @@ -0,0 +1,23 @@ +[supervisord] +nodaemon=true + +[program:laravel-worker] +process_name=%(program_name)s_%(process_num)02d +command=php /application/artisan queue:work --sleep=3 --tries=3 --max-time=3600 +autostart=true +autorestart=true +stopasgroup=true +killasgroup=true +user=www-data +numprocs=2 +redirect_stderr=true +stdout_logfile=/application/storage/logs/worker.log +stopwaitsecs=3600 + +[program:php-fpm] +command=php-fpm8.2 -F +process_name=%(program_name)s_%(process_num)02d +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stdderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 diff --git a/phpdocker/worker/Dockerfile b/phpdocker/worker/Dockerfile new file mode 100644 index 0000000..c5e636a --- /dev/null +++ b/phpdocker/worker/Dockerfile @@ -0,0 +1,16 @@ +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-sqlite3 php8.2-pgsql \ + python3-pkg-resources supervisor && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/* + +RUN apt-get update && \ + apt-get install -y \ + ffmpeg \ + jpegoptim && \ + apt-get clean; \ + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/* diff --git a/phpdocker/worker/laravel-worker.conf b/phpdocker/worker/laravel-worker.conf new file mode 100644 index 0000000..cd2a642 --- /dev/null +++ b/phpdocker/worker/laravel-worker.conf @@ -0,0 +1,15 @@ +[supervisord] +nodaemon=true + +[program:laravel-worker] +process_name=%(program_name)s_%(process_num)02d +command=php /application/artisan queue:work --sleep=3 --tries=3 --max-time=3600 +autostart=true +autorestart=true +stopasgroup=true +killasgroup=true +user=www-data +numprocs=2 +redirect_stderr=true +stdout_logfile=/application/storage/logs/worker.log +stopwaitsecs=3600 diff --git a/phpdocker/worker/php-ini-overrides.ini b/phpdocker/worker/php-ini-overrides.ini new file mode 100644 index 0000000..850ae11 --- /dev/null +++ b/phpdocker/worker/php-ini-overrides.ini @@ -0,0 +1,2 @@ +upload_max_filesize = 100M +post_max_size = 108M