> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Deployment

> Leitfaden zur Konfiguration, Optimierung und zum Betrieb einer Laravel-Anwendung in Produktion

## Einführung

Beim Ausrollen einer Laravel-Anwendung in Produktion sind einige Vorbereitungen sinnvoll, damit sie möglichst effizient läuft.
Dieser Leitfaden zeigt die wichtigsten Punkte für ein zuverlässiges Produktions-Deployment.

## Deployment-Ablauf

```mermaid theme={null}
flowchart TD
    A["Code pushen"] --> B["php artisan optimize"]
    B --> C["Auslieferung via Nginx / FrankenPHP"]
    C --> D["php artisan reload"]
    D --> E["Queue-Worker<br>Reverb / Octane neu starten"]
    E --> F["Deployment fertig"]
```

## Server-Voraussetzungen

Laravel benötigt **PHP 8.3 oder höher** und die folgenden Erweiterungen:

| Erweiterung | Beschreibung       |
| ----------- | ------------------ |
| Ctype       | Zeichentyp-Prüfung |
| cURL        | HTTP-Kommunikation |
| DOM         | XML/HTML-DOM       |
| Fileinfo    | MIME-Typ-Erkennung |
| Filter      | Datenfilter        |
| Hash        | Hashing            |
| Mbstring    | Multibyte-Strings  |
| OpenSSL     | Verschlüsselung    |
| PCRE        | Reguläre Ausdrücke |
| PDO         | Datenbank          |
| Session     | Session-Handling   |
| Tokenizer   | PHP-Token          |
| XML         | XML-Verarbeitung   |

## Serverkonfiguration

### Nginx

Für Nginx nutzen Sie folgende Konfiguration als Basis.
Wichtig: **Alle Anfragen an `public/index.php` weiterleiten**.
Verschieben Sie `index.php` nicht in den Projekt-Root – sonst werden vertrauliche Dateien öffentlich.

```nginx theme={null}
server {
    listen 80;
    listen [::]:80;
    server_name example.com;
    root /srv/example.com/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ ^/index\.php(/|$) {
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_hide_header X-Powered-By;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}
```

### FrankenPHP

[FrankenPHP](https://frankenphp.dev/) ist ein moderner, in Go geschriebener PHP-Server.
Sie starten Ihre Laravel-Anwendung mit einem einzigen Befehl:

```shell theme={null}
frankenphp php-server -r public/
```

Details zu HTTP/3, moderner Kompression, [Laravel Octane](https://laravel.com/docs/octane) und Standalone-Binaries finden Sie in der [Laravel-Doku von FrankenPHP](https://frankenphp.dev/docs/laravel/).

### Verzeichnisrechte

Laravel benötigt Schreibrechte auf `bootstrap/cache` und `storage`.
Sorgen Sie dafür, dass der Webserver-Prozess in diese Verzeichnisse schreiben kann.

```shell theme={null}
chmod -R 775 storage bootstrap/cache
chown -R www-data:www-data storage bootstrap/cache
```

## Optimierung

Zur Produktions-Deployzeit sollten Sie Konfiguration, Events, Routen und Views cachen.
Der Befehl `optimize` erledigt alles gebündelt.

```shell theme={null}
php artisan optimize
```

Zum Löschen:

```shell theme={null}
php artisan optimize:clear
```

### Einzelne Optimierungsbefehle

`optimize` führt folgende Befehle aus – bei Bedarf können Sie sie einzeln nutzen.

| Befehl                     | Beschreibung                                    |
| -------------------------- | ----------------------------------------------- |
| `php artisan config:cache` | Konfigurationsdateien zusammenfassen und cachen |
| `php artisan event:cache`  | Event → Listener-Mapping cachen                 |
| `php artisan route:cache`  | Routen cachen                                   |
| `php artisan view:cache`   | Blade-Views vorkompilieren                      |

<Info>
  Nach `config:cache` darf `env()` nur noch innerhalb von Konfigurationsdateien aufgerufen werden.
  Nach dem Cachen wird `.env` nicht mehr gelesen, sodass `env()` außerhalb `null` liefert.
</Info>

## Dienste neu laden

Nach einem Deployment müssen langlaufende Dienste wie Queue-Worker, Laravel Reverb oder Laravel Octane den neuen Code laden – also neu starten.

```shell theme={null}
php artisan reload
```

Der Befehl beendet lade-fähige Dienste. Ihr Prozess-Manager (z. B. Supervisor) soll sie automatisch wieder starten.

<Info>
  Bei Laravel Cloud erfolgt das grazile Reloaden aller Dienste automatisch – der `reload`-Befehl entfällt.
</Info>

## Debug-Modus

Die Option `debug` in `config/app.php` steuert, wie viel Fehlerinformation an Nutzer geht.
Standardmäßig richtet sich der Wert nach `APP_DEBUG` aus `.env`.

<Warning>
  **Setzen Sie `APP_DEBUG` in Produktion unbedingt auf `false`.**
  Bleibt `APP_DEBUG=true`, könnten Zugangsdaten und geheime Schlüssel für Endnutzer sichtbar werden.
</Warning>

```ini theme={null}
# .env (Produktion)
APP_DEBUG=false
```

## Health-Check-Route

Laravel bringt eine Health-Check-Route mit, die sich mit Uptime-Monitoren, Load Balancern oder Kubernetes verbindet.

Standardmäßig gibt es den Endpunkt `/up`. Er antwortet mit `200`, wenn die Anwendung ordnungsgemäß gestartet ist, andernfalls mit `500`.

Der Pfad ist in `bootstrap/app.php` konfigurierbar:

```php theme={null}
->withRouting(
    web: __DIR__.'/../routes/web.php',
    commands: __DIR__.'/../routes/console.php',
    health: '/status', // Default /up
)
```

Beim Aufruf wird das Event `Illuminate\Foundation\Events\DiagnosingHealth` gefeuert, sodass Sie eigene Prüfungen (Datenbank, Cache) in Listenern ergänzen können.

## Deployment mit Laravel Cloud oder Forge

### Laravel Cloud

Suchen Sie eine vollständig verwaltete, automatisch skalierende Plattform, ist [Laravel Cloud](https://cloud.laravel.com) die Empfehlung.
Eine für Laravel optimierte PaaS mit Managed Compute, DB, Cache und Object Storage.

Sie wird vom Laravel-Team direkt getunt und integriert sich nahtlos.

### Laravel Forge

Wenn Sie Server selbst verwalten möchten, sich aber nicht mit dem Setup von Nginx, MySQL usw. befassen wollen, ist [Laravel Forge](https://forge.laravel.com) praktisch.

Forge erstellt Server bei DigitalOcean, Linode, AWS und Co. und installiert Nginx, MySQL, Redis, Memcached, Beanstalk automatisch.

## Nächste Schritte

<Card title="Deployment — Offizielle Doku" icon="arrow-right" href="https://laravel.com/docs/deployment">
  Ausführliche und aktuelle Details zur Deployment-Konfiguration finden Sie in der offiziellen Dokumentation.
</Card>


## Related topics

- [Laravel Cloud CLI – Laravel Cloud vom Terminal aus bedienen](/de/blog/laravel-cloud-cli.md)
- [Copilot CLI bündeln](/de/packages/laravel-copilot-sdk/bundle-cli.md)
- [Feedable](/de/packages/feedable/index.md)
- [laravel/agent-skills – Offizielle KI-Agent-Skills-Sammlung von Laravel](/de/blog/agent-skills-introduction.md)
- [Einführung in Laravel Nightwatch](/de/blog/nightwatch-introduction.md)
