- docker-compose.yml: bind-mount ./app:/var/www/html on nginx + all PHP
services. CLI dev workflow now uses host code directly (no rebuild
needed for code or CSS changes). Portainer-stack untouched (uses
docker-compose.portainer.yml without bind-mounts).
- AppServiceProvider: Vite::usePreloadTagAttributes(false) drops the
<link rel=preload> tags that triggered 'preloaded but not used within
a few seconds' warnings under wire:navigate.
- vendor/ + composer.lock synced from container to host so bind-mount
exposes a complete tree.
nginx config has static upstream pointing at host.docker.internal:5173 for
Vite dev server. Without extra_hosts the DNS lookup fails at nginx startup
and crashes the container. Added back, harmless in prod (upstream just unused).
- New root Dockerfile: composer-deps + node-build + assembled code stages,
final PHP-FPM and nginx targets both built from same context.
- docker-compose.yml: all services build/use baked images. No ./app or
config bind mounts (broke with Portainer on VM-A + Docker daemon on VM-B).
- app-storage named volume preserves Laravel storage across redeploys.
- Laravel env passed via x-php-env anchor from stack env vars.
- Removed per-service docker/php/Dockerfile and docker/nginx/Dockerfile.
- entrypoint.sh: touch .env, ensure storage dirs, idempotent storage:link.