Deutsch

Blog · Deploy-Anleitungen

So deployst du eine PHP-App 2026: Laravel, Symfony oder reine PHP-Seiten mit einem Befehl

Vom Pethost-Team · · Aktualisiert · 11 Min. Lesezeit

Du hast eine PHP-App, die auf deinem Laptop läuft: ein Laravel-Projekt, ein Symfony-Projekt oder einen Ordner mit .php-Seiten. Du willst sie mit HTTPS online haben, ohne einen Server einzurichten. Bei Pethost ist das ein Befehl, pethost deploy, ausgeführt im Ordner der App: Er schreibt das Dockerfile, baut die App auf deiner Pethost-Maschine und gibt ihre Adresse aus. Ein frisches Projekt aus laravel new war in 1 min 29 s gebaut und gestartet, ein Ordner mit zwei Seiten in 12 s.

Kurz gesagt
  • Ein Befehl: pethost deploy im Ordner mit der composer.json, oder mit der index.php bei reinen Seiten. Du schreibst keine Konfigurationsdatei.
  • Laravel und Symfony laufen auf FrankenPHP mit PHP 8.4. pethost führt composer install aus, baut die Vite-Assets und startet die App im Produktionsmodus.
  • Reine PHP-Seiten laufen auf Apache, mit deinen .htaccess-Dateien und mod_rewrite.
  • Die SQLite-Datenbank von Laravel liegt in einem Volume und wird bei jedem Start migriert, also behält ein neuer Deploy die Daten.
  • Der Preis: 9,99 € im Monat für 2 vCPU, 3 GB und 30 GB, für jedes Projekt, das du hast. Einen Free Tier gibt es nicht.

Was du brauchst, um eine PHP-App 2026 zu deployen

Drei Dinge: die App, den Befehl pethost und ein Pethost-Konto.

Die App ist ein Ordner auf deinem Computer: hier ein Projekt aus laravel new, ein Symfony-Skeleton mit einer Seite und zwei Seiten reines PHP. Docker brauchst du auf deinem Computer nicht: Das Image wird auf deiner Pethost-Maschine gebaut.

Der Befehl ist ein Programm, installiert mit einer Zeile. Jeden seiner Befehle findest du in der Referenz der CLI.

curl -fsSL https://pethost.dev/install.sh | sh      # macOS, Linux
irm https://pethost.dev/install.ps1 | iex           # Windows, in PowerShell

Das Konto braucht einen Tarif. Bist du nicht angemeldet, öffnet pethost deploy deinen Browser und meldet dich an. Hast du noch keinen Tarif, zeigt er dir, wo du einen wählst, und wartet.

Eine Laravel-App deployen

Die App ist die, die der Installer von Laravel hinterlässt: laravel new example-app, ohne Starter Kit, mit SQLite als Datenbank, Pest und dem npm install und Build des Installers. Wechsle in ihren Ordner und führ pethost deploy aus. Das ist der ganze Bildschirm:

$ cd example-app
$ pethost deploy
Name it [example-app]:      it will live at https://example-app.sam.pethost.app
✓ Packed 10.4k files, 51 MB   (left out node_modules · took .env from this folder)
✓ Uploaded straight to your machine
✗ /compose.yaml: the project directory has no compose.yaml at its root: add one
✓ Laravel project detected, wrote Dockerfile and .dockerignore.
~ The database starts empty on the machine and is migrated at each start: pethost run -- php artisan db:seed --force fills it from the project's seeders.
✓ Packed 10.4k files, 51 MB   (left out node_modules · took .env from this folder)
✓ Uploaded straight to your machine
✓ Built and started in 1 min 29 s
  · wrote compose.yaml for the Dockerfile: the service app, reading .env, port 80, a named volume at /app/storage/app
✓ app listens on 80 → https://example-app.sam.pethost.app
  It answers 200.

https://example-app.sam.pethost.app

Wrote .pethost (commit it). Next:   pethost logs -f   ·   pethost open
  1. Er fragt eine Sache Den Namen des Projekts, das erste Wort seiner Adresse. Enter übernimmt den Namen des Ordners.
  2. Die Maschine findet nichts zum Ausführen Die Zeile mit dem Kreuz ist ihre Antwort: Ein Projekt läuft aus einem Dockerfile oder einer Compose-Datei, und der Ordner hat noch keins von beiden.
  3. pethost schreibt das Dockerfile Die composer.json verlangt laravel/framework, also schreibt er das für Laravel und lädt den Ordner noch einmal hoch.
  4. Die Maschine baut und startet es Dann ruft pethost die Adresse auf und gibt die Antwort aus: 200, die Willkommensseite von Laravel.

Deine .env, samt APP_KEY, ist auf der Maschine zur eigenen des Projekts geworden. Die .pethost sagt, welches Projekt dieser Ordner ist: Committe sie mit dem Dockerfile, und der nächste Deploy fragt nichts mehr.

Das Dockerfile, das pethost für Laravel schreibt

Das sind die wichtigen Zeilen der Datei, die in den Ordner geschrieben wird. Ihre 54 Zeilen sagen in Kommentaren, warum jeder Schritt da ist:

# check=skip=JSONArgsRecommended
# Written by pethost deploy for this Laravel project: composer.json requires
# laravel/framework, package.json builds the assets with "vite build", npm installs it
# (package-lock.json), its SQLite database is kept in storage/app, with the files the
# site is given, it runs in production mode, set over the folder's .env.
# It is yours now: change it as you like. pethost does not write it again.

FROM dunglas/frankenphp:1-php8.4
…
COPY . .

RUN composer install
…
RUN npm run build

ENV DB_DATABASE=/app/storage/app/database.sqlite
# The machine keeps this directory across deploys.
VOLUME /app/storage/app
EXPOSE 80
…
CMD export APP_ENV=production APP_DEBUG=false LOG_CHANNEL=stderr DB_DATABASE=/app/storage/app/database.sqlite && \
    php artisan migrate --force && \
    exec frankenphp run --config /etc/frankenphp/Caddyfile

Artisan-Befehle auf der Maschine ausführen

pethost run führt einen Befehl im Container der App aus. Hier die Migrationen von Laravel selbst, nach drei Deploys:

$ pethost run -- php artisan migrate:status
example-app (.pethost)

  Migration name .............................................. Batch / Status
  0001_01_01_000000_create_users_table ............................... [1] Ran
  0001_01_01_000001_create_cache_table ............................... [1] Ran
  0001_01_01_000002_create_jobs_table ................................ [1] Ran

Alle drei sind in Batch 1: Sie liefen beim ersten Start, und die Datenbank hat die zwei Deploys danach überstanden. pethost run -- php artisan db:seed --force füllt sie aus deinen Seedern, wie die Zeile mit der Tilde sagte, und pethost shell öffnet eine Shell für php artisan tinker.

Ein Laravel-Projekt, dessen .env MySQL oder Postgres nennt, bekommt kein Dockerfile, denn die Datenbank muss daneben laufen. pethost sagt das:

✗ /compose.yaml: the project directory has no compose.yaml at its root: add one
  .env names a database other than SQLite (DB_CONNECTION=pgsql), and the machine runs none beside a Dockerfile: the project needs a compose.yaml with the site and its database.

Eine compose.yaml mit der App und ihrer Datenbank läuft so, wie sie geschrieben ist. Oder erstell mit einem Klick eine Datenbank, ohne Aufpreis, und verbinde sie mit der App: eine MariaDB für eine App, die für MySQL gemacht ist, oder eine Postgres (Postgres zum Festpreis).

Eine Symfony-App deployen

Die App ist das Skeleton von Symfony, composer create-project symfony/skeleton my-project (dasselbe wie symfony new my-project), mit dem Controller aus „Create your First Page“ von Symfony: src/Controller/LuckyController.php, dessen Route /lucky/number mit einer Zufallszahl antwortet. Derselbe Befehl deployt sie:

$ cd my-project
$ pethost deploy
Name it [my-project]:        it will live at https://my-project.sam.pethost.app
✓ Packed 1.7k files, 7.9 MB   (took .env from this folder)
✓ Uploaded straight to your machine
✗ /compose.yaml: the project directory has no compose.yaml at its root: add one
✓ Symfony project detected, wrote Dockerfile and .dockerignore.
✓ Packed 1.7k files, 7.9 MB   (took .env from this folder)
✓ Uploaded straight to your machine
✓ Built and started in 57 s
  · wrote compose.yaml for the Dockerfile: the service app, reading .env, port 80
✓ app listens on 80 → https://my-project.sam.pethost.app
  It answers 404.

https://my-project.sam.pethost.app

Wrote .pethost (commit it). Next:   pethost logs -f   ·   pethost open

Die Antwort ist 404, weil die App keine Route auf / hat, und in Produktion zeigt Symfony keine Willkommensseite. Ruf die Route auf, die es gibt:

$ curl https://my-project.sam.pethost.app/lucky/number
<html><body>Lucky number: 27</body></html>

Das Dockerfile für Symfony ist das von Laravel ohne Node und Datenbank. APP_ENV=prod wird für composer install gesetzt, das den Cache aufwärmt, und beim Start, über die .env hinweg, die Symfony mit APP_ENV=dev committet. Die Assets von AssetMapper werden im Build kompiliert. Ein Projekt mit Doctrine-Entities in src/Entity bekommt kein Dockerfile: Es braucht eine compose.yaml mit seiner Datenbank.

Reine PHP-Seiten deployen

Kein Framework, kein Composer: ein Ordner mit index.php, die ein Formular zeigt, und hello.php, die $_POST['name'] liest und Hallo sagt.

$ cd my-site
$ pethost deploy
Name it [my-site]:              it will live at https://my-site.sam.pethost.app
✓ Packed 2 files, 604 B
✓ Uploaded straight to your machine
✗ /compose.yaml: the project directory has no compose.yaml at its root: add one
✓ PHP site detected, wrote Dockerfile.
~ Every file of the folder is public at its address, but for the Dockerfile and names that begin with a dot.
✓ Packed 3 files, 1 KB
✓ Uploaded straight to your machine
✓ Built and started in 12 s
  · wrote compose.yaml for the Dockerfile: the service app, reading .env, port 80
✓ app listens on 80 → https://my-site.sam.pethost.app
  It answers 200.

https://my-site.sam.pethost.app

Wrote .pethost (commit it). Next:   pethost logs -f   ·   pethost open
$ curl -d name=Sam https://my-site.sam.pethost.app/hello.php
…
  <p>Hello, Sam!</p>

Das Dockerfile ist das offizielle Image php:8.4-apache von PHP, das den Ordner ausliefert, mit den Produktionseinstellungen von PHP. .htaccess-Dateien funktionieren, mit eingeschaltetem mod_rewrite. Lies die Zeile mit der Tilde: Jede Datei des Ordners ist öffentlich, also gehört ein Secret in die Variablen des Projekts. Seiten, die mit mysqli oder PDO eine Datenbank öffnen, brauchen eine compose.yaml mit ihr, und pethost sagt das.

Den Code ändern und neu deployen

Füg in routes/web.php eine Route hinzu und führ denselben Befehl aus:

Route::get('/hello', function () {
    return 'Hello from Laravel!';
});
$ pethost deploy
example-app (.pethost)
✓ Packed 10.4k files · uploaded · built and started in 48 s
  · kept the project's .env in place of the version's own: after the first deploy the project's is kept
  · wrote compose.yaml for the Dockerfile: the service app, reading .env, port 80, a named volume at /app/storage/app
  · kept the project's x-pethost
  It answers 200.
https://example-app.sam.pethost.app
To send this folder's .env:  pethost env push

Achte auf die zweite Zeile: Nach dem ersten Deploy behält die Maschine die .env des Projekts, nicht die deines Laptops. pethost env set ändert eine Variable und deployt sofort:

$ pethost env set APP_URL=https://example-app.sam.pethost.app
example-app (.pethost)
✓ /.env has APP_URL now. Deployed in 48 s.

Ein Name allein fragt nach einem Secret, ohne es anzuzeigen: pethost env set MAIL_PASSWORD. pethost github sam/example-app deployt ab dann jeden Push, und pethost rollback holt die vorige Version zurück. Ein KI-Agent kann all das über den MCP-Server von Pethost erledigen: wie ein Agent ein Projekt deployt und betreut.

Eine eigene Domain für die PHP-App

Jeder Name unter der Domain deines Kontos funktioniert sofort, mit HTTPS. Eine Domain, die dir gehört, braucht einen Befehl und einen DNS-Eintrag:

pethost domain add www.example.com

Er gibt den Eintrag aus: einen CNAME auf den Namen deiner Maschine. Das Zertifikat kommt, sobald sich der Name auflöst, und erneuert sich selbst.

Was du für den Preis bekommst

Pethost kostet 9,99 € im Monat für alles, was du hostest, auf 2 vCPU, 3 GB RAM und 30 GB Disk. Das ist Platz für die Laravel-App, ihren Queue-Worker, eine Datenbank und dein nächstes Projekt, ohne Gebühr pro Projekt und ohne Abrechnung nach Verbrauch. Die Maschine läuft immer, also wartet niemand, der die Seite öffnet, je auf einen Cold Start.

Was schon für dich erledigt ist: HTTPS mit Zertifikaten, die sich selbst erneuern, Deploys aus GitHub, nächtliche Backups, 14 Tage aufbewahrt, SSH in jeden Container, und jeder Request wird gezählt, ohne Skript in deinen Seiten. Die Tarife stehen im Abschnitt Preise der Startseite.

Jedes Projekt, beschriftet. Sieben Projekte auf einer Starter-Maschine: die Apps mit ihren Adressen und Requests des letzten Tages, die Datenbanken mit den Apps, die sie nutzen.
Die Startseite des Pethost-Panels: CPU, RAM und Disk der Maschine und ihre Projekte als Karten.

Pethost ist die beste Wahl für

  • PHP-Entwickler mit einer Laravel- oder Symfony-App, die sie online haben wollen, ohne einen Server zu betreiben
  • alle, die von Shared Hosting umziehen, mit einem Ordner voller PHP-Seiten und ein paar weiteren Projekten, die noch kommen
  • alle, deren Agent für sie deployt: Claude Code oder Codex bringt die App online und liest ihre Logs
  • junge Startups, die feste monatliche Kosten wollen, solange das Produkt klein ist

Schau dich anderswo um, wenn

  • deine Anwendung mehrere Regionen oder Autoscaling braucht

Fragen

Wie deploye ich eine PHP-App, ohne ein Dockerfile zu schreiben?

Führ pethost deploy im Ordner der App aus. Für ein Laravel- oder Symfony-Projekt oder einen Ordner mit index.php schreibt er das Dockerfile und deployt es. Die Datei bleibt in deinem Ordner, und du kannst sie ändern.

Welche PHP-Version nutzt Pethost?

Die Dockerfiles, die pethost schreibt, laufen mit PHP 8.4: auf FrankenPHP für Laravel und Symfony, auf Apache für reine Seiten. Die Version steht in der Zeile FROM des Dockerfiles, und das gehört dir.

Übersteht die SQLite-Datenbank von Laravel einen neuen Deploy?

Ja. Die Datei liegt in storage/app, das die Maschine in einem Volume behält, und jeder Start führt php artisan migrate --force aus. Zwei Deploys später zeigten die Migrationen immer noch Batch 1.

Kann ich eine Laravel-App mit MySQL oder Postgres deployen?

Ja, mit einer compose.yaml, die die App neben ihrer Datenbank ausführt: pethost schreibt dafür kein Dockerfile und sagt das. Oder verbinde die App mit einer Datenbank, die du mit einem Klick erstellst, ohne Aufpreis: eine MariaDB für eine App, die für MySQL gemacht ist, oder eine Postgres.

Was kostet es, eine PHP-App bei Pethost zu hosten?

9,99 € im Monat für Starter, mit 2 vCPU, 3 GB und 30 GB und ohne Gebühr pro Projekt: Deine anderen Apps und Datenbanken laufen dort auch. Einen Free Tier gibt es nicht. Die Preise verstehen sich zzgl. MwSt.

Die Ausgaben stammen von Deploys auf einer Testmaschine von uns, mit pethost 0.2.4: ein Projekt aus dem Laravel-Installer 5.32.0 (Laravel 13.38.0), das Skeleton von Symfony 8.1.9 und zwei Seiten reines PHP, alle auf PHP 8.4.27. Der Laravel-Deploy kam zuerst; der Symfony-Deploy nutzte das FrankenPHP-Image, das jener gepullt hatte. Das Konto darin ist das Beispielkonto, sam.

  1. Laravel: Installation
  2. Laravel: Deployment
  3. Symfony: das Framework installieren und einrichten
  4. Symfony: die erste Seite erstellen
  5. FrankenPHP: Dokumentation
  6. PHP: das offizielle Docker-Image
  7. pethost, die Kommandozeile von Pethost

Bring deine Projekte noch heute online

Deploy Apps, Bots und Datenbanken aus deinem Agenten, von GitHub oder im Browser, so viele, wie hineinpassen, zu einem festen Preis. Nichts nach Verbrauch, nichts obendrauf.

Alle deine Projekte für 9,99 €/Monat hosten