diff --git a/.env.infra-example b/.env.infra-example index fa34261..208a2b3 100644 --- a/.env.infra-example +++ b/.env.infra-example @@ -11,6 +11,7 @@ MYSQL_ROOT_PASSWORD="nhbnhb22" MYSQL_DATABASE="eatvio" MYSQL_USER="eatvio_user" MYSQL_PASSWORD="eatvio_pass_nhbnhb22" +<<<<<<< HEAD MY_APP_GIT_URL="ssh://git@10.55.5.123:222/alex_chevski/eatvio.git" PROD_DB_USER=readonly_user PROD_DB_PASS=baexueShosei0AiD @@ -18,3 +19,11 @@ PROD_DB_FILE="latest-prod-db.sql" DEV2_DB_USER=readonly_user DEV2_DB_PASS=baexueShosei0AiD DEV2_DB_FILE="latest-dev2-db.sql" +======= +PROD_DB_USER=some_user +PROD_DB_PASS=strong_pass +PROD_DB_FILE="latest-prod-db.sql" +PROD_DB_HOST="10.nn.n.n" +PROD_DB_PORT="10nn" +MY_APP_GIT_URL="ssh://git@10.55.5.123:222/eatvio/eatvio.git" +>>>>>>> eatvio-main diff --git a/.gitea/workflows/test_infra.yaml b/.gitea/workflows/test_infra.yaml new file mode 100644 index 0000000..22db471 --- /dev/null +++ b/.gitea/workflows/test_infra.yaml @@ -0,0 +1,38 @@ +name: "infra 0.0.0.1" +on: + pull_request: + branches: + - main-ci + +jobs: + test: + runs-on: ubuntu-latest + name: Test + steps: + - uses: actions/checkout@v3 + + - name: Add the SSH key to known_hosts + env: + SSH_AUTH_SOCK: /tmp/ssh_agent.sock + run: | + ssh-agent -a $SSH_AUTH_SOCK > /dev/null + mkdir -p ~/.ssh + ssh-add - <<< "${{ vars.SSH_PRIVATE_KEY }}" || true + ssh-keyscan -p 222 10.55.5.123 >> ~/.ssh/known_hosts || true + chmod 644 ~/.ssh/known_hosts || true + chmod 700 ~/.ssh || true + + - name: init containers + env: + SSH_AUTH_SOCK: /tmp/ssh_agent.sock + run: | + apt-get update + apt-get install -y apt-transport-https ca-certificates curl software-properties-common docker.io + curl -L "https://github.com/docker/compose/releases/download/v2.17.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose + chmod +x /usr/local/bin/docker-compose + docker-compose --version + make init + + - name: run CI + run: make ci + diff --git a/Makefile b/Makefile index e7d059f..70e2155 100644 --- a/Makefile +++ b/Makefile @@ -1,19 +1,35 @@ -include .env.infra-example +include .env clone: git clone ${MY_APP_GIT_URL} app +rm-promo-image-assets: + docker compose exec php-fpm rm -rf application/database/assets/images + +clone-promo-image: + git clone http://gitea.office.local:3000/alex_chevski/eatvio_images_assets app/database/assets/images + +reinit-promo-images: rm-promo-image-assets clone-promo-image + start: docker compose up -d stop: - docker compose down --remove-orphans -v + docker compose down restart: stop start status: docker compose ps +rm-promo-image-assets: + rm -rf app/database/assets/images + +clone-promo-image: + git clone http://gitea.office.local:3000/alex_chevski/eatvio_images_assets app/database/assets/images + +reinit-promo-images: rm-promo-image-assets clone-promo-image + bash: docker compose exec php-fpm bash @@ -60,10 +76,10 @@ fix-permissions: docker compose exec php-fpm chown -R www-data:www-data storage fix-code-style: - docker compose exec php-fpm composer php-cs-fixer + docker compose exec -T php-fpm bash -c "vendor/bin/pint --parallel; composer run fix-blade-fomatting" -fix-view-style: - docker compose exec php-fpm composer run-script fix-blade-fomatting +fix-blade-formatting: + docker compose exec -T php-fpm composer run test-blade-formatting artisan: docker compose exec php-fpm ./artisan $(ARGS) @@ -71,50 +87,28 @@ artisan: mysql-console: docker compose exec mysql mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_DATABASE} -mysql-test-console: - docker compose exec mysql mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} eatvio_test +mysql-dump-local: + docker compose exec mysql mysqldump --single-transaction --skip-opt -u${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_DATABASE} -mysql-eatvio-prod-console: - docker compose exec mysql mysql -u readonly_user -pbaexueShosei0AiD eatvio -h 10.55.5.7 -P 1094 - -mysql-dev2-console: - docker compose exec mysql mysql -u readonly_user -pbaexueShosei0AiD eatvio -h 10.55.5.15 -P 1094 +mysql-restore: + docker compose exec mysql bash -c "mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_DATABASE} < /application/eatvio-restore.sql" mysql-save-prod-db: - mysqldump --single-transaction -u${PROD_DB_USER} -p${PROD_DB_PASS} -h10.55.5.7 -P1094 eatvio > ${PROD_DB_FILE} - + mysqldump --single-transaction -u${PROD_DB_USER} -p${PROD_DB_PASS} -h${PROD_DB_HOST} -P${PROD_DB_PORT} eatvio > ${PROD_DB_FILE} + mysql-restore-saved-from-prod-db: docker compose exec mysql bash -c "cat ./${PROD_DB_FILE} | mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_DATABASE}" -mysql-restore-saved-from-dev2-db: - docker compose exec mysql bash -c "cat ./${DEV2_DB_FILE} | mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_DATABASE}" - mysql-remove-latest-prod-db: rm -f ${PROD_DB_FILE} - + mysql-import-db-from-prod: mysql-save-prod-db mysql-restore-saved-from-prod-db mysql-remove-latest-prod-db -mysql-save-dev2-db: - mysqldump --single-transaction -u${DEV2_DB_USER} -p${DEV2_DB_PASS} -h10.55.5.15 -P1094 eatvio > ${DEV2_DB_FILE} - -mysql-remove-latest-dev2-db: - rm -f ${DEV2_DB_FILE} - -mysql-import-db-from-dev2: mysql-save-dev2-db mysql-restore-saved-from-dev2-db mysql-remove-latest-dev2-db - -fetch-media-from-prod: - docker compose exec php-fpm ./artisan imports:images-from-prod - -fetch-media-from-dev2: - docker compose exec php-fpm ./artisan imports:images-from-dev2 - -import-prod-data: mysql-import-db-from-prod fetch-media-from-prod - start-frontend: - docker compose exec php-fpm npm run watch + docker compose exec frontend npm run watch build-frontend-prod: - docker compose exec php-fpm npm run production + docker compose exec php-fpm bash -c "npm install -g npm@latest; npm run production" make-storage-link: docker compose exec php-fpm ./artisan storage:link @@ -122,30 +116,73 @@ make-storage-link: node-frontend-deps: docker compose exec php-fpm npm i --legacy-peer-deps -test: - docker compose exec php-fpm vendor/bin/paratest +paratest-bin: + docker compose exec -u www-data php-fpm vendor/bin/paratest + +paratest-artisan: + docker compose exec -u www-data -T php-fpm ./artisan test --parallel --stop-on-failure --env=testing fix-insights: - docker compose exec php-fpm ./artisan insights --fix + docker compose exec php-fpm vendor/bin/phpinsights --fix --config-path=./config/insights.php --no-interaction --min-quality=80 --min-complexity=90 --min-architecture=75 --min-style=95 insights: - docker compose exec php-fpm vendor/bin/phpinsights --config-path=./config/insights.php --no-interaction --min-quality=80 --min-complexity=90 --min-architecture=75 --min-style=95 + docker compose exec -T php-fpm vendor/bin/phpinsights --config-path=./config/insights.php --no-interaction --min-quality=80 --min-complexity=90 --min-architecture=75 --min-style=95 --flush-cache rector: - docker compose exec php-fpm vendor/bin/rector process --dry-run + docker compose exec -T php-fpm vendor/bin/rector process --dry-run static-analysis: - docker compose exec php-fpm composer static-analysis + docker compose exec -T php-fpm composer static-analysis detect-magic-numbers: - docker compose exec php-fpm vendor/bin/phpmnd app/ tests/ + docker compose exec -u www-data -T php-fpm vendor/bin/phpmnd app/ tests/ -ci: fix-code-style detect-magic-numbers test rector insights static-analysis +fix-web-permissions: + docker compose exec -T php-fpm chown -R www-data:www-data bootstrap/cache storage -local-ci: - docker compose exec -T php-fpm composer ci +clear-app-cache: + docker compose exec php-fpm ./artisan optimize:clear + +build-front: + docker compose exec php-fpm bash -c "npm install -g npm@latest;npm run production" + +reindex-search: + docker compose exec php-fpm ./artisan search:init + +composer-do: + docker compose exec php-fpm composer dump-auto + +run-once-oprations: + docker compose exec php-fpm bash -c "./artisan operations:process" + +reload-wokers: + docker-compose exec worker ./artisan queue:restart + +after-deploy-light: composer-do run-migrations run-once-oprations clear-app-cache build-front fix-permissions reload-wokers + +after-deploy: composer-do clear-app-cache run-migrations run-once-oprations build-front fix-permissions reload-wokers reindex-search + +# ci: fix-web-permissions fix-code-style detect-magic-numbers test rector insights static-analysis fix-web-permissions +ci: fix-web-permissions detect-magic-numbers test rector insights static-analysis fix-web-permissions + +local-composer-ci: + docker compose exec php-fpm composer ci + +test: fix-web-permissions paratest-artisan + +test-file-by-path: + docker compose exec php-fpm ./artisan test --env=testing $(ARGS) + +local-ci: fix-web-permissions local-composer-ci fix-web-permissions 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 -artisan-mcp: - @docker compose exec -T php-fpm ./artisan boost:mcp +rebuild-services: + docker compose build --no-cache + +pull-services: + docker compose pull + +force-rebuild-services: stop rebuild-services pull-services start + + diff --git a/docker-compose.yml b/docker-compose.yml index ffc0475..43d0edb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -37,7 +37,6 @@ services: MYSQL_DATABASE: ${MYSQL_DATABASE} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} - TZ: "Europe/Moscow" ports: - "1094:3306" labels: @@ -52,7 +51,7 @@ services: depends_on: - mysql - worker - # - frontend + - frontend - memcached - typesense networks: @@ -66,19 +65,20 @@ services: - "traefik.enable=false" restart: always - # frontend: - # build: phpdocker/front-end - # command: "npm run dev" - # working_dir: /application - # environment: - # - TZ=Europe/Moscow - # networks: - # - ns-eatvio - # volumes: - # - "./app:/application" - # labels: - # - "traefik.enable=false" - # restart: unless-stopped + frontend: + build: phpdocker/front-end + command: "npm run dev" + working_dir: /application + environment: + - TZ=Europe/Moscow + - CHOKIDAR_USEPOLLING=true + networks: + - ns-eatvio + volumes: + - "./app:/application" + labels: + - "traefik.enable=false" + restart: unless-stopped worker: build: phpdocker/worker @@ -151,3 +151,4 @@ networks: external: true ns-eatvio: external: false + diff --git a/phpdocker/nginx/nginx.conf b/phpdocker/nginx/nginx.conf index 6206370..cbe0da5 100644 --- a/phpdocker/nginx/nginx.conf +++ b/phpdocker/nginx/nginx.conf @@ -25,26 +25,26 @@ server { index index.php; # Vite HMR WebSocket and assets - # location /_vite { - # proxy_pass http://frontend:5173; - # proxy_http_version 1.1; - # - # # WebSocket support - # proxy_set_header Upgrade $http_upgrade; - # proxy_set_header Connection $connection_upgrade; - # - # # Headers - # proxy_set_header Host $host; - # proxy_set_header X-Real-IP $remote_addr; - # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - # proxy_set_header X-Forwarded-Proto $scheme; - # proxy_set_header X-Forwarded-Host $host; - # - # # Timeouts - # proxy_connect_timeout 7d; - # proxy_send_timeout 7d; - # proxy_read_timeout 7d; - # } + location /_vite { + proxy_pass http://frontend:5173; + proxy_http_version 1.1; + + # WebSocket support + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + + # Headers + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Host $host; + + # Timeouts + proxy_connect_timeout 7d; + proxy_send_timeout 7d; + proxy_read_timeout 7d; + } # Production build assets location /build { @@ -67,18 +67,8 @@ server { 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 256k; - fastcgi_buffer_size 512k; - fastcgi_busy_buffers_size 1M; - - fastcgi_buffering off; - - # Таймауты FastCGI - fastcgi_read_timeout 300s; - fastcgi_connect_timeout 300s; - fastcgi_send_timeout 300s; - + fastcgi_buffers 16 16k; + fastcgi_buffer_size 32k; include fastcgi_params; } } diff --git a/phpdocker/worker/laravel-worker.conf b/phpdocker/worker/laravel-worker.conf index cd2a642..8cc5818 100644 --- a/phpdocker/worker/laravel-worker.conf +++ b/phpdocker/worker/laravel-worker.conf @@ -13,3 +13,43 @@ numprocs=2 redirect_stderr=true stdout_logfile=/application/storage/logs/worker.log stopwaitsecs=3600 + +[program:laravel-schedule] +process_name=%(program_name)s_%(process_num)02d +command=php /application/artisan schedule:work +directory=/application +autostart=true +autorestart=true +stopasgroup=true +killasgroup=true +user=www-data +numprocs=1 +redirect_stderr=true +stdout_logfile=/application/storage/logs/schedule.log +stopwaitsecs=3600 + +[program:laravel-feed-generation-worker] +process_name=%(program_name)s_%(process_num)02d +command=php /application/artisan queue:work --queue=feed-generation --sleep=1 --tries=3 --timeout=1800 --max-time=3600 +autostart=true +autorestart=true +stopasgroup=true +killasgroup=true +user=www-data +numprocs=8 +redirect_stderr=true +stdout_logfile=/application/storage/logs/feed-generation-worker.log +stopwaitsecs=3600 + +[program:laravel-scout-worker] +process_name=%(program_name)s_%(process_num)02d +command=php /application/artisan queue:work --queue=scout --sleep=1 --tries=3 --timeout=300 --max-time=3600 +autostart=true +autorestart=true +stopasgroup=true +killasgroup=true +user=www-data +numprocs=8 +redirect_stderr=true +stdout_logfile=/application/storage/logs/scout-worker.log +stopwaitsecs=3600