Zum Inhalt springen

Installation

  • Docker (Docker Desktop mit WSL-Integration oder Docker Engine auf Linux)
  • Node.js 22 für den Asset-Build
  • Domain mit TLS-Zertifikat für den Produktivbetrieb

Der Stack besteht aus PHP 8.5 (Laravel 13), MySQL 8.4, Redis und optional Mailpit für die Entwicklung.

Terminal-Fenster
cp .env.example .env # Konfiguration anlegen
docker run --rm -u "$(id -u):$(id -g)" -v "$(pwd):/app" -w /app composer:2 install
./vendor/bin/sail up -d # App, MySQL, Redis, Mailpit starten
./vendor/bin/sail artisan key:generate
./vendor/bin/sail artisan migrate --seed # Tabellen, Rollen, Demodaten
./vendor/bin/sail artisan storage:link # öffentliche Uploads (Logo, Bilder)
./vendor/bin/sail npm install && ./vendor/bin/sail npm run build

Danach ist die Anwendung unter http://localhost:8000 erreichbar. Demo-Zugänge (Passwort password): admin@example.com, anna@example.com, kunde@example.com. Entfernen Sie die Demodaten vor dem Produktivbetrieb (migrate:fresh ohne --seed und anschließend einen Administrator anlegen).

Für den Produktivbetrieb liegt ein eigener Stack bei: docker/prod/Dockerfile baut ein Image mit PHP-FPM, nginx, Horizon und Scheduler (alle unter demselben Benutzer), docker-compose.prod.yml startet App, MySQL und Redis.

Terminal-Fenster
cp .env.production.example .env # Werte in <…> ausfüllen, APP_KEY mit key:generate --show
docker compose -f docker-compose.prod.yml up -d --build
docker compose -f docker-compose.prod.yml exec app php artisan app:install \
--name="Max Admin" --email=admin@firma.de --company="Firma GmbH"

app:install führt Migrationen aus, legt Rollen und Standardwerte an, fragt das Passwort ab (mindestens 12 Zeichen, geprüft gegen bekannte Leaks) und erstellt den ersten Administrator – ohne Demodaten. Der Befehl ist idempotent und kann nach Updates erneut laufen. Beim Containerstart laufen Migrationen und Cache-Aufwärmung automatisch; /health dient als Docker-Healthcheck.

Vor den Container gehört ein Reverse-Proxy mit TLS (z. B. Caddy, Traefik oder nginx), der Port 8080 weiterleitet. Für S3-kompatiblen Speicher (Rechnungen, Anhänge, Backups) FILESYSTEM_DISK=s3 und die AWS_*-Variablen setzen.

Terminal-Fenster
./vendor/bin/sail artisan horizon # Queue-Worker
./vendor/bin/sail artisan schedule:work # Scheduler (Backups, Mahnlauf, Bereinigung)

In Produktion betreiben Sie beide als Supervisor- oder systemd-Dienste unter demselben Unix-Benutzer wie PHP-FPM, sonst sind vom Worker erzeugte PDFs für den Webprozess nicht lesbar.