From a2caa43bc99ac280a26d93324613c0c21bc2becd Mon Sep 17 00:00:00 2001 From: Konstantinos Arvanitakis Date: Thu, 9 Jul 2026 01:09:44 +0300 Subject: [PATCH 1/3] Feature: Syncing composer .env.example and docker-compose.dev.yml from starter --- .env.example | 23 ++--- composer.json | 2 +- composer.lock | 190 ++++++++++++++++++++++++++++------------- docker-compose.dev.yml | 2 + docker/entrypoint.sh | 8 ++ 5 files changed, 152 insertions(+), 73 deletions(-) diff --git a/.env.example b/.env.example index e710a5e..89d6438 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,6 @@ # Unique per VPS deployment: namespaces containers/volumes/networks and the built image tag, # so multiple sites from this same starter can coexist on one host without collisions. -COMPOSE_PROJECT_NAME=boboko-starter +COMPOSE_PROJECT_NAME=3dealer APP_NAME=Laravel APP_ENV=local @@ -25,11 +25,11 @@ LOG_DEPRECATIONS_CHANNEL=null LOG_LEVEL=debug DB_CONNECTION=pgsql -DB_HOST=127.0.0.1 +DB_HOST=postgres DB_PORT=5432 DB_DATABASE=boboko DB_USERNAME=root -DB_PASSWORD= +DB_PASSWORD=dev SESSION_DRIVER=database SESSION_LIFETIME=120 @@ -47,14 +47,14 @@ CACHE_STORE=database MEMCACHED_HOST=127.0.0.1 REDIS_CLIENT=phpredis -REDIS_HOST=127.0.0.1 +REDIS_HOST=valkey REDIS_PASSWORD=null REDIS_PORT=6379 -MAIL_MAILER=log +MAIL_MAILER=smtp MAIL_SCHEME=null -MAIL_HOST=127.0.0.1 -MAIL_PORT=2525 +MAIL_HOST=mailpit +MAIL_PORT=1025 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_FROM_ADDRESS="hello@example.com" @@ -68,17 +68,18 @@ AWS_USE_PATH_STYLE_ENDPOINT=false VITE_APP_NAME="${APP_NAME}" -OTEL_SERVICE_NAME= +OTEL_SERVICE_NAME=boboko-starter OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf OTEL_PROPAGATORS=baggage,tracecontext OTEL_PHP_AUTOLOAD_ENABLED=true OTEL_EXPORTER_OTLP_ENDPOINT= -STOIC_SECRET= -STOIC_SSO_SECRET= +# Stoic is the headless CMS, proxied at /stoic/ behind the app in prod (see docker/nginx/prod.conf) +STOIC_SECRET=dev-secret-change-me +STOIC_SSO_SECRET=dev-sso-secret-change-me STOIC_HOST=http://localhost:2727 -# Host-side ports (change per app if multiple apps share this VPS, or per dev checkout) +# Host-side ports — change these if another project on this machine already uses the defaults APP_PORT=8090 STOIC_PORT=2727 VALKEY_PORT=6339 diff --git a/composer.json b/composer.json index 1a190e0..0587d66 100644 --- a/composer.json +++ b/composer.json @@ -10,7 +10,7 @@ "license": "MIT", "require": { "artesaos/seotools": "^1.4", - "boboko/core": "^0.0.2", + "boboko/core": "0.*", "open-telemetry/exporter-otlp": "^1.4", "open-telemetry/opentelemetry-auto-laravel": "^1.7", "open-telemetry/sdk": "^1.14", diff --git a/composer.lock b/composer.lock index 8d5910a..71919bb 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d159988b8e0edece23fcf2e7b59d1cfa", + "content-hash": "497fd57dba085798efccc5819904020f", "packages": [ { "name": "anourvalar/eloquent-serialize", @@ -565,16 +565,17 @@ }, { "name": "boboko/core", - "version": "0.0.2", + "version": "0.1.0", "source": { "type": "git", "url": "https://code.radical-elements.com/boboko/core.git", - "reference": "ebe905acfa4915a62b409f91480db46f01a5462c" + "reference": "1d2a90059daea13614fe8842d15fb0ea58cabda8" }, "require": { "laravel/framework": "^12.0", "laravel/tinker": "^3.0", "lunarphp/lunar": "1.3.0", + "lunarphp/table-rate-shipping": "^1.3", "php": "^8.5", "symfony/yaml": "^7.0" }, @@ -604,7 +605,7 @@ } }, "description": "Core module — authentication and shared panel behaviour", - "time": "2026-07-03T12:09:28+00:00" + "time": "2026-07-08T21:56:04+00:00" }, { "name": "brick/math", @@ -2472,22 +2473,22 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.13.1", + "version": "7.13.3", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "55901a76dfd2006a0cc012b9e3c5b487f796478d" + "reference": "caa5491e1030fd120247f42fb3331ecf38da3b26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/55901a76dfd2006a0cc012b9e3c5b487f796478d", - "reference": "55901a76dfd2006a0cc012b9e3c5b487f796478d", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/caa5491e1030fd120247f42fb3331ecf38da3b26", + "reference": "caa5491e1030fd120247f42fb3331ecf38da3b26", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^2.5", - "guzzlehttp/psr7": "^2.12.3", + "guzzlehttp/promises": "^2.5.1", + "guzzlehttp/psr7": "^2.12.4", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.5 || ^3.0", @@ -2499,7 +2500,7 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", - "guzzle/client-integration-tests": "3.0.2", + "guzzle/client-integration-tests": "3.0.3", "guzzlehttp/test-server": "^0.6", "php-http/message-factory": "^1.1", "phpunit/phpunit": "^8.5.52 || ^9.6.34", @@ -2580,7 +2581,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.13.1" + "source": "https://github.com/guzzle/guzzle/tree/7.13.3" }, "funding": [ { @@ -2596,20 +2597,20 @@ "type": "tidelift" } ], - "time": "2026-06-29T20:14:18+00:00" + "time": "2026-07-08T16:10:19+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.5.0", + "version": "2.5.1", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "4360e982f87f5f258bf872d094647791db2f4c8e" + "reference": "9ad1e4fc607446a055b95870c7f668e93b5cff29" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/4360e982f87f5f258bf872d094647791db2f4c8e", - "reference": "4360e982f87f5f258bf872d094647791db2f4c8e", + "url": "https://api.github.com/repos/guzzle/promises/zipball/9ad1e4fc607446a055b95870c7f668e93b5cff29", + "reference": "9ad1e4fc607446a055b95870c7f668e93b5cff29", "shasum": "" }, "require": { @@ -2664,7 +2665,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.5.0" + "source": "https://github.com/guzzle/promises/tree/2.5.1" }, "funding": [ { @@ -2680,20 +2681,20 @@ "type": "tidelift" } ], - "time": "2026-06-02T12:23:43+00:00" + "time": "2026-07-08T15:48:39+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.12.3", + "version": "2.12.4", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "7ec62dc3f44aa218487dbed81a9bf9bc647be55d" + "reference": "51e27f9e2b332ab3e72f4520d5ff4f3c68c3577c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/7ec62dc3f44aa218487dbed81a9bf9bc647be55d", - "reference": "7ec62dc3f44aa218487dbed81a9bf9bc647be55d", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/51e27f9e2b332ab3e72f4520d5ff4f3c68c3577c", + "reference": "51e27f9e2b332ab3e72f4520d5ff4f3c68c3577c", "shasum": "" }, "require": { @@ -2783,7 +2784,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.12.3" + "source": "https://github.com/guzzle/psr7/tree/2.12.4" }, "funding": [ { @@ -2799,20 +2800,20 @@ "type": "tidelift" } ], - "time": "2026-06-23T15:21:08+00:00" + "time": "2026-07-08T15:56:20+00:00" }, { "name": "guzzlehttp/uri-template", - "version": "v1.0.8", + "version": "v1.0.9", "source": { "type": "git", "url": "https://github.com/guzzle/uri-template.git", - "reference": "9c19128923b05a5d7355e5d2318d7808b7e33bbd" + "reference": "d7580af6d3f8384325d9cd3e99b21c3ed1848176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/uri-template/zipball/9c19128923b05a5d7355e5d2318d7808b7e33bbd", - "reference": "9c19128923b05a5d7355e5d2318d7808b7e33bbd", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/d7580af6d3f8384325d9cd3e99b21c3ed1848176", + "reference": "d7580af6d3f8384325d9cd3e99b21c3ed1848176", "shasum": "" }, "require": { @@ -2869,7 +2870,7 @@ ], "support": { "issues": "https://github.com/guzzle/uri-template/issues", - "source": "https://github.com/guzzle/uri-template/tree/v1.0.8" + "source": "https://github.com/guzzle/uri-template/tree/v1.0.9" }, "funding": [ { @@ -2885,7 +2886,7 @@ "type": "tidelift" } ], - "time": "2026-06-23T13:02:23+00:00" + "time": "2026-07-08T16:19:22+00:00" }, { "name": "kalnoy/nestedset", @@ -3015,16 +3016,16 @@ }, { "name": "laravel/framework", - "version": "v12.62.0", + "version": "v12.63.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "f7e61eb1e0e06a38996802b769bce9127aec227c" + "reference": "7adfddbf4738f2e6cae5419b0e6bc46d4cccfbcf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/f7e61eb1e0e06a38996802b769bce9127aec227c", - "reference": "f7e61eb1e0e06a38996802b769bce9127aec227c", + "url": "https://api.github.com/repos/laravel/framework/zipball/7adfddbf4738f2e6cae5419b0e6bc46d4cccfbcf", + "reference": "7adfddbf4738f2e6cae5419b0e6bc46d4cccfbcf", "shasum": "" }, "require": { @@ -3233,7 +3234,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2026-06-09T13:50:13+00:00" + "time": "2026-07-07T14:16:35+00:00" }, { "name": "laravel/prompts", @@ -3786,16 +3787,16 @@ }, { "name": "league/flysystem", - "version": "3.35.1", + "version": "3.35.2", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "f23af6c5aafd958a7593029a271d77baf5ed793c" + "reference": "b277b5dc3d56650b68904117124e79c851e12376" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/f23af6c5aafd958a7593029a271d77baf5ed793c", - "reference": "f23af6c5aafd958a7593029a271d77baf5ed793c", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/b277b5dc3d56650b68904117124e79c851e12376", + "reference": "b277b5dc3d56650b68904117124e79c851e12376", "shasum": "" }, "require": { @@ -3863,9 +3864,9 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.35.1" + "source": "https://github.com/thephpleague/flysystem/tree/3.35.2" }, - "time": "2026-06-25T06:52:23+00:00" + "time": "2026-07-06T14:42:07+00:00" }, { "name": "league/flysystem-local", @@ -4575,6 +4576,74 @@ ], "time": "2026-01-29T11:24:01+00:00" }, + { + "name": "lunarphp/table-rate-shipping", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/lunarphp/table-rate-shipping.git", + "reference": "2d272a904136017d53556bb153b198162fa10918" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lunarphp/table-rate-shipping/zipball/2d272a904136017d53556bb153b198162fa10918", + "reference": "2d272a904136017d53556bb153b198162fa10918", + "shasum": "" + }, + "require": { + "lunarphp/lunar": "self.version", + "php": "^8.2" + }, + "type": "library", + "extra": { + "lunar": { + "name": "Table Rate Shipping" + }, + "laravel": { + "providers": [ + "Lunar\\Shipping\\ShippingServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Lunar\\Shipping\\": "src", + "Lunar\\Shipping\\Database\\Factories\\": "database/factories" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lunar", + "homepage": "https://lunarphp.io/" + } + ], + "description": "Lunar Table Rate Shipping Addon", + "keywords": [ + "cart", + "e-commerce", + "ecommerce", + "headless", + "laravel", + "lunar", + "shop", + "store" + ], + "support": { + "issues": "https://github.com/lunarphp/table-rate-shipping/issues", + "source": "https://github.com/lunarphp/table-rate-shipping/tree/1.3.0" + }, + "funding": [ + { + "url": "https://github.com/lunar", + "type": "github" + } + ], + "time": "2025-12-08T13:52:29+00:00" + }, { "name": "maennchen/zipstream-php", "version": "3.2.2", @@ -5088,20 +5157,19 @@ }, { "name": "nikic/php-parser", - "version": "v5.7.0", + "version": "v5.8.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" + "reference": "044a6a392ff8ad0d61f14370a5fbbd0a0107152f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", - "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/044a6a392ff8ad0d61f14370a5fbbd0a0107152f", + "reference": "044a6a392ff8ad0d61f14370a5fbbd0a0107152f", "shasum": "" }, "require": { - "ext-ctype": "*", "ext-json": "*", "ext-tokenizer": "*", "php": ">=7.4" @@ -5140,9 +5208,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.8.0" }, - "time": "2025-12-06T11:56:16+00:00" + "time": "2026-07-04T14:30:18+00:00" }, { "name": "nunomaduro/termwind", @@ -6438,16 +6506,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "2.3.2", + "version": "2.3.3", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a" + "reference": "fb19eedd2bb67ff8cf7a5502ad329e701d6398a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a004701b11273a26cd7955a61d67a7f1e525a45a", - "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fb19eedd2bb67ff8cf7a5502ad329e701d6398a3", + "reference": "fb19eedd2bb67ff8cf7a5502ad329e701d6398a3", "shasum": "" }, "require": { @@ -6479,9 +6547,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.2" + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.3" }, - "time": "2026-01-25T14:56:51+00:00" + "time": "2026-07-08T07:01:06+00:00" }, { "name": "pragmarx/google2fa", @@ -12315,16 +12383,16 @@ }, { "name": "vlucas/phpdotenv", - "version": "v5.6.3", + "version": "v5.6.4", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "955e7815d677a3eaa7075231212f2110983adecc" + "reference": "416df702837983f8d5ff48c9c3fee4f5f57b980b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/955e7815d677a3eaa7075231212f2110983adecc", - "reference": "955e7815d677a3eaa7075231212f2110983adecc", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/416df702837983f8d5ff48c9c3fee4f5f57b980b", + "reference": "416df702837983f8d5ff48c9c3fee4f5f57b980b", "shasum": "" }, "require": { @@ -12383,7 +12451,7 @@ ], "support": { "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.3" + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.4" }, "funding": [ { @@ -12395,7 +12463,7 @@ "type": "tidelift" } ], - "time": "2025-12-27T19:49:13+00:00" + "time": "2026-07-06T19:11:50+00:00" }, { "name": "voku/portable-ascii", diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index cb8094d..7ff5c1f 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -45,6 +45,7 @@ services: queue: image: boboko-app + restart: unless-stopped command: php artisan queue:work --tries=3 --max-jobs=500 --memory=256 env_file: .env environment: @@ -67,6 +68,7 @@ services: profiles: [full] image: boboko-app command: php artisan schedule:work + restart: unless-stopped env_file: .env environment: APP_ENV: local diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index a51547c..7e144ea 100644 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -8,6 +8,14 @@ if [ "$APP_ENV" != "production" ] && [ ! -f vendor/autoload.php ]; then composer install --no-interaction --prefer-dist fi +# In development, re-resolve all boboko/* packages against their local path-repo +# checkouts on every boot, so editing boboko-core and running `./bin/dc-core.sh up` +# is enough. No-op unless the path repo in `_repositories` has been enabled. +if [ "$APP_ENV" != "production" ] && [ -d /var/www/boboko-core ]; then + echo "[entrypoint] Re-resolving boboko/* packages from local path repos..." + composer update "boboko/*" --no-interaction --with-all-dependencies +fi + # In development, the app dir is bind-mounted from a fresh checkout, so package # assets (which the Dockerfile publishes at build time in production) need to be # generated here instead. Cheap and idempotent, safe to repeat on every boot. From 5ecad634e2e6efb7731c1c7d389e88f13f33a7e9 Mon Sep 17 00:00:00 2001 From: Konstantinos Arvanitakis Date: Fri, 10 Jul 2026 12:54:48 +0300 Subject: [PATCH 2/3] Hotfix: Updatin build, fixing vite error, creating separate entrypoints --- .gitignore | 1 + Dockerfile | 3 +- composer.lock | 68 ++++++++++++++++++------------------- docker-compose.dev.yml | 3 ++ docker/entrypoint-worker.sh | 21 ++++++++++++ docker/entrypoint.sh | 54 ++++++++++++++++------------- vite.config.js | 1 + 7 files changed, 93 insertions(+), 58 deletions(-) create mode 100644 docker/entrypoint-worker.sh diff --git a/.gitignore b/.gitignore index 455c4e3..aacff36 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,7 @@ /public/logos/core /public/storage /storage/*.key +/storage/framework/migrated /storage/pail /vendor _ide_helper.php diff --git a/Dockerfile b/Dockerfile index 94ca29f..341cf29 100644 --- a/Dockerfile +++ b/Dockerfile @@ -127,7 +127,8 @@ RUN composer install \ --ignore-platform-reqs COPY docker/entrypoint.sh /entrypoint.sh -RUN chmod +x /entrypoint.sh +COPY docker/entrypoint-worker.sh /entrypoint-worker.sh +RUN chmod +x /entrypoint.sh /entrypoint-worker.sh EXPOSE 9000 ENTRYPOINT ["/entrypoint.sh"] diff --git a/composer.lock b/composer.lock index 71919bb..dec6718 100644 --- a/composer.lock +++ b/composer.lock @@ -565,11 +565,11 @@ }, { "name": "boboko/core", - "version": "0.1.0", + "version": "0.1.1", "source": { "type": "git", "url": "https://code.radical-elements.com/boboko/core.git", - "reference": "1d2a90059daea13614fe8842d15fb0ea58cabda8" + "reference": "96ad89b6b8a99e628e438b6c724c2a0e4dde8c61" }, "require": { "laravel/framework": "^12.0", @@ -605,7 +605,7 @@ } }, "description": "Core module — authentication and shared panel behaviour", - "time": "2026-07-08T21:56:04+00:00" + "time": "2026-07-10T09:51:29+00:00" }, { "name": "brick/math", @@ -2473,16 +2473,16 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.13.3", + "version": "7.14.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "caa5491e1030fd120247f42fb3331ecf38da3b26" + "reference": "aef242412e13128b5049864867bb49fc37dd39de" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/caa5491e1030fd120247f42fb3331ecf38da3b26", - "reference": "caa5491e1030fd120247f42fb3331ecf38da3b26", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/aef242412e13128b5049864867bb49fc37dd39de", + "reference": "aef242412e13128b5049864867bb49fc37dd39de", "shasum": "" }, "require": { @@ -2581,7 +2581,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.13.3" + "source": "https://github.com/guzzle/guzzle/tree/7.14.0" }, "funding": [ { @@ -2597,7 +2597,7 @@ "type": "tidelift" } ], - "time": "2026-07-08T16:10:19+00:00" + "time": "2026-07-08T22:54:09+00:00" }, { "name": "guzzlehttp/promises", @@ -3919,16 +3919,16 @@ }, { "name": "league/mime-type-detection", - "version": "1.16.0", + "version": "1.17.0", "source": { "type": "git", "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" + "reference": "f5f47eff7c48ed1003069a2ca67f316fb4021c76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", - "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/f5f47eff7c48ed1003069a2ca67f316fb4021c76", + "reference": "f5f47eff7c48ed1003069a2ca67f316fb4021c76", "shasum": "" }, "require": { @@ -3938,7 +3938,7 @@ "require-dev": { "friendsofphp/php-cs-fixer": "^3.2", "phpstan/phpstan": "^0.12.68", - "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0 || ^11.0 || ^12.0" }, "type": "library", "autoload": { @@ -3959,7 +3959,7 @@ "description": "Mime-type detection for Flysystem", "support": { "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.17.0" }, "funding": [ { @@ -3971,7 +3971,7 @@ "type": "tidelift" } ], - "time": "2024-09-21T08:32:55+00:00" + "time": "2026-07-09T11:49:27+00:00" }, { "name": "league/uri", @@ -4894,16 +4894,16 @@ }, { "name": "nesbot/carbon", - "version": "3.13.0", + "version": "3.13.1", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "40f6618f052df16b545f626fbf9a878e6497d16a" + "reference": "2937ad3d1d2c506fd2bc97d571438a95641f44e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/40f6618f052df16b545f626fbf9a878e6497d16a", - "reference": "40f6618f052df16b545f626fbf9a878e6497d16a", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/2937ad3d1d2c506fd2bc97d571438a95641f44e2", + "reference": "2937ad3d1d2c506fd2bc97d571438a95641f44e2", "shasum": "" }, "require": { @@ -4995,7 +4995,7 @@ "type": "tidelift" } ], - "time": "2026-06-18T13:49:15+00:00" + "time": "2026-07-09T18:23:49+00:00" }, { "name": "nette/schema", @@ -8057,16 +8057,16 @@ }, { "name": "spatie/laravel-medialibrary", - "version": "11.23.1", + "version": "11.23.2", "source": { "type": "git", "url": "https://github.com/spatie/laravel-medialibrary.git", - "reference": "143106b61b945f1ca815e6a71598c03881469228" + "reference": "cc1fdc4a9a9007101df610cd4a6733be71db4828" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-medialibrary/zipball/143106b61b945f1ca815e6a71598c03881469228", - "reference": "143106b61b945f1ca815e6a71598c03881469228", + "url": "https://api.github.com/repos/spatie/laravel-medialibrary/zipball/cc1fdc4a9a9007101df610cd4a6733be71db4828", + "reference": "cc1fdc4a9a9007101df610cd4a6733be71db4828", "shasum": "" }, "require": { @@ -8151,7 +8151,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-medialibrary/issues", - "source": "https://github.com/spatie/laravel-medialibrary/tree/11.23.1" + "source": "https://github.com/spatie/laravel-medialibrary/tree/11.23.2" }, "funding": [ { @@ -8163,7 +8163,7 @@ "type": "github" } ], - "time": "2026-06-24T08:31:39+00:00" + "time": "2026-07-09T13:26:15+00:00" }, { "name": "spatie/laravel-package-tools", @@ -12120,16 +12120,16 @@ }, { "name": "technikermathe/blade-lucide-icons", - "version": "v3.158.0", + "version": "v3.159.0", "source": { "type": "git", "url": "https://github.com/PascaleBeier/blade-lucide-icons.git", - "reference": "5748736d9c24b152da69779a1ca21bc33620dc6a" + "reference": "b8dec6812bc09ebad05464cc176df4f949e146c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PascaleBeier/blade-lucide-icons/zipball/5748736d9c24b152da69779a1ca21bc33620dc6a", - "reference": "5748736d9c24b152da69779a1ca21bc33620dc6a", + "url": "https://api.github.com/repos/PascaleBeier/blade-lucide-icons/zipball/b8dec6812bc09ebad05464cc176df4f949e146c5", + "reference": "b8dec6812bc09ebad05464cc176df4f949e146c5", "shasum": "" }, "require": { @@ -12179,9 +12179,9 @@ ], "support": { "issues": "https://github.com/PascaleBeier/blade-lucide-icons/issues", - "source": "https://github.com/PascaleBeier/blade-lucide-icons/tree/v3.158.0" + "source": "https://github.com/PascaleBeier/blade-lucide-icons/tree/v3.159.0" }, - "time": "2026-07-02T00:30:05+00:00" + "time": "2026-07-10T01:55:13+00:00" }, { "name": "thecodingmachine/safe", @@ -12771,5 +12771,5 @@ "prefer-lowest": false, "platform": {}, "platform-dev": {}, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.9.0" } diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 7ff5c1f..21146a2 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -46,6 +46,7 @@ services: queue: image: boboko-app restart: unless-stopped + entrypoint: ["/entrypoint-worker.sh"] command: php artisan queue:work --tries=3 --max-jobs=500 --memory=256 env_file: .env environment: @@ -67,6 +68,7 @@ services: scheduler: profiles: [full] image: boboko-app + entrypoint: ["/entrypoint-worker.sh"] command: php artisan schedule:work restart: unless-stopped env_file: .env @@ -138,6 +140,7 @@ services: - "${VITE_PORT:-5173}:5173" environment: - NODE_ENV=development + - VITE_PORT=${VITE_PORT:-5173} volumes: - .:/app - /app/node_modules diff --git a/docker/entrypoint-worker.sh b/docker/entrypoint-worker.sh new file mode 100644 index 0000000..017c2e6 --- /dev/null +++ b/docker/entrypoint-worker.sh @@ -0,0 +1,21 @@ +#!/bin/sh +set -e + +# queue/scheduler: no composer/migrate/asset-publish here (that's entrypoint.sh, run +# by app only) — just wait for app's migration to finish, then start the process. +mkdir -p storage/app/public storage/framework/cache storage/framework/sessions storage/framework/views storage/logs storage/framework bootstrap/cache + +if [ "$APP_ENV" != "production" ]; then + echo "[entrypoint] Waiting for migrations to complete..." + timeout=60 + while [ ! -f storage/framework/migrated ] && [ "$timeout" -gt 0 ]; do + sleep 1 + timeout=$((timeout - 1)) + done + if [ ! -f storage/framework/migrated ]; then + echo "[entrypoint] Timed out waiting for migrations" >&2 + exit 1 + fi +fi + +exec "$@" diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 7e144ea..086c335 100644 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -1,39 +1,47 @@ #!/bin/sh set -e -# In development, install Composer deps if vendor is not present -if [ "$APP_ENV" != "production" ] && [ ! -f vendor/autoload.php ]; then +# Only the app container runs setup; queue/scheduler use entrypoint-worker.sh instead +# and just wait on the migrated marker this script writes below. +if [ "$APP_ENV" != "production" ]; then echo "[entrypoint] Installing Composer dependencies..." git config --global --add safe.directory /var/www/html 2>/dev/null || true composer install --no-interaction --prefer-dist -fi -# In development, re-resolve all boboko/* packages against their local path-repo -# checkouts on every boot, so editing boboko-core and running `./bin/dc-core.sh up` -# is enough. No-op unless the path repo in `_repositories` has been enabled. -if [ "$APP_ENV" != "production" ] && [ -d /var/www/boboko-core ]; then - echo "[entrypoint] Re-resolving boboko/* packages from local path repos..." + # Re-resolve boboko/* on every boot, whether it's a local path-repo checkout + # (../boboko-core mounted via docker-compose.core-dev.yml) or a VCS tag. Rewrites + # composer.lock, which is committed so prod picks up the resolved version via + # `composer install` alone. + echo "[entrypoint] Re-resolving boboko/* packages..." composer update "boboko/*" --no-interaction --with-all-dependencies fi -# In development, the app dir is bind-mounted from a fresh checkout, so package -# assets (which the Dockerfile publishes at build time in production) need to be -# generated here instead. Cheap and idempotent, safe to repeat on every boot. -if [ "$APP_ENV" != "production" ]; then - php artisan vendor:publish --tag=core-assets --force --ansi --quiet - php artisan vendor:publish --tag=public --force --ansi --quiet - php artisan filament:assets --ansi --quiet -fi - -# Everything below runs on every boot of app/queue/scheduler, possibly concurrently, -# so it must be idempotent and safe to run from multiple containers at once. -# Migrations, package publishing, and config/route/view caching are deploy-time -# concerns handled once via Envoy, not here. - -mkdir -p storage/app/public storage/framework/cache storage/framework/sessions storage/framework/views storage/logs bootstrap/cache +mkdir -p storage/app/public storage/framework/cache storage/framework/sessions storage/framework/views storage/logs storage/framework bootstrap/cache chown -R www-data:www-data storage bootstrap/cache chmod -R 775 storage bootstrap/cache php artisan storage:link --quiet 2>/dev/null || true +if [ "$APP_ENV" != "production" ]; then + # The app dir is bind-mounted from a fresh checkout, so package assets (which the + # Dockerfile publishes at build time in production) need to be generated here + # instead. Cheap and idempotent, safe to repeat on every boot. + php artisan vendor:publish --tag=core-assets --force --ansi --quiet + php artisan vendor:publish --tag=public --force --ansi --quiet + php artisan filament:assets --ansi --quiet + + echo "[entrypoint] Running migrations..." + rm -f storage/framework/migrated + php artisan migrate --force + touch storage/framework/migrated + + # boboko/core overrides lunar:install to skip the interactive prompts (migrate + # confirm, admin creation, GitHub star) and just seed the idempotent store + # defaults: countries, channel, language, currency, tax zone, attributes, + # product type. queue/scheduler wait on the marker above rather than running + # this themselves, since the country import's check-then-insert isn't safe to + # run concurrently. + php artisan lunar:install --quiet || true +fi + exec "$@" diff --git a/vite.config.js b/vite.config.js index 98e081a..eb80d8e 100644 --- a/vite.config.js +++ b/vite.config.js @@ -22,6 +22,7 @@ export default defineConfig({ cors: true, hmr: { host: 'localhost', + clientPort: process.env.VITE_PORT || 5173, }, watch: { ignored: ['**/storage/framework/views/**'], From ace8290c627fc66574bc1bb2cc10d9bd419a18c4 Mon Sep 17 00:00:00 2001 From: elvira Date: Fri, 10 Jul 2026 16:55:57 +0300 Subject: [PATCH 3/3] composer lock --- composer.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/composer.lock b/composer.lock index dec6718..9573c6c 100644 --- a/composer.lock +++ b/composer.lock @@ -565,11 +565,11 @@ }, { "name": "boboko/core", - "version": "0.1.1", + "version": "0.2.0", "source": { "type": "git", "url": "https://code.radical-elements.com/boboko/core.git", - "reference": "96ad89b6b8a99e628e438b6c724c2a0e4dde8c61" + "reference": "0524380ab0922729d177e7bf000c61be1fba440a" }, "require": { "laravel/framework": "^12.0", @@ -605,7 +605,7 @@ } }, "description": "Core module — authentication and shared panel behaviour", - "time": "2026-07-10T09:51:29+00:00" + "time": "2026-07-10T12:21:42+00:00" }, { "name": "brick/math",