Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -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 ./
Expand Down
48 changes: 48 additions & 0 deletions docker/php-prod.ini
Original file line number Diff line number Diff line change
@@ -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