diff --git a/CLAUDE.md b/CLAUDE.md index a398a75..ac695cc 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -56,7 +56,9 @@ Feldnamen ab. - **Upload-Grenzen liegen auf drei Ebenen und müssen zusammenpassen.** Greift die äußerste, scheitert der Upload mit einer Meldung, aus der die Ursache nicht hervorgeht („Feld ist erforderlich" statt einer Aussage zur Größe): - 1. PHP — `docker/uploads-prod.ini` (im Image; php.ini-production erlaubt sonst nur 2 MB) + 1. PHP — `docker/php-prod.ini` (wird im `Dockerfile` nach + `/usr/local/etc/php/conf.d/` kopiert; das FrankenPHP-Basisimage lädt keine php.ini, + PHPs eingebauter Standard erlaubt nur 2 MB) 2. Livewire — `config/livewire.php`, `temporary_file_upload.rules` (Standard sind 12 MB) 3. Filament — `maxSize()` am Feld, aus `MAX_FILE_SIZE_KB` bzw. `MAX_IMAGE_SIZE_KB` Aktuell: Dokumente 25 MB, Bilder 10 MB, darüber 30 MB Puffer bei Livewire und PHP. Die diff --git a/Dockerfile b/Dockerfile index b671e10..8320800 100644 --- a/Dockerfile +++ b/Dockerfile @@ -43,6 +43,10 @@ RUN apt-get update \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* +# Das Basisimage lädt keine php.ini, es gelten PHPs eingebaute Standardwerte. +# Ohne diese Datei begrenzt PHP Uploads auf 2 MB — die Anwendung erlaubt 25 MB. +COPY docker/php-prod.ini /usr/local/etc/php/conf.d/zz-app-prod.ini + COPY --from=composer:2 /usr/bin/composer /usr/bin/composer COPY composer.json composer.lock ./ diff --git a/docker/php-prod.ini b/docker/php-prod.ini new file mode 100644 index 0000000..fc078b2 --- /dev/null +++ b/docker/php-prod.ini @@ -0,0 +1,48 @@ +; PHP-Einstellungen für den Betrieb im Image. +; +; Das FrankenPHP-Basisimage lädt bewusst *keine* php.ini — weder +; php.ini-production noch php.ini-development. Es gelten also PHPs eingebaute +; Standardwerte, und die sind für diese Anwendung an zwei Stellen zu klein. +; Prüfbar im Basisimage mit: +; +; docker run --rm dunglas/frankenphp:1-php8.4 \ +; php -r 'echo ini_get("upload_max_filesize"), " ", php_ini_loaded_file() ?: "keine";' +; -> 2M keine +; +; Diese Datei landet in /usr/local/etc/php/conf.d/ und wird deshalb geladen. + +; --- Upload-Grenzen ------------------------------------------------------- +; +; Der eingebaute Standard ist upload_max_filesize=2M und post_max_size=8M. Die +; Anwendung lässt Fahrzeugdokumente bis 25 MB und Bilder bis 10 MB zu (siehe +; VehicleDocumentsRelationManager::MAX_FILE_SIZE_KB und +; VehicleForm::MAX_IMAGE_SIZE_KB). Ohne diese Werte scheitert ein größerer +; Upload nicht an der Prüfung der Anwendung, sondern schon vorher an PHP — und +; zwar mit einer Meldung, aus der die Ursache nicht hervorgeht („Feld ist +; erforderlich" statt einer Aussage zur Größe). +; +; Wer die Grenzen in der Anwendung ändert, muss diese Werte mitziehen. +; post_max_size muss über upload_max_filesize liegen: der Wert umfasst den +; gesamten Formularinhalt, nicht nur die Datei. +upload_max_filesize = 30M +post_max_size = 32M + +; --- OPcache -------------------------------------------------------------- +; +; Die Erweiterung ist im Basisimage vorhanden, aber ungetunt. +; validate_timestamps bleibt bewusst auf dem Standard (an): bei dieser +; Nutzerzahl kostet der stat-Aufruf nichts Messbares, und ein neues Deployment +; (neues Image, frischer Container) liefert damit immer aktuellen Code, ohne +; dass zusätzlich ein Cache verworfen werden muss. +opcache.enable = 1 +opcache.memory_consumption = 256 +opcache.max_accelerated_files = 20000 +opcache.interned_strings_buffer = 16 + +; --- Betrieb -------------------------------------------------------------- +; +; Laravel schaltet display_errors selbst ab (HandleExceptions), aber erst wenn +; das Framework läuft. Ein Fehler davor — etwa eine fehlende Erweiterung — +; würde sonst mit Pfaden und Codezeilen im Browser landen. +display_errors = Off +expose_php = Off