Expose vs. ngrok: Selbsthosting eines PHP-Reverse-Proxy für Laravel

Current comparison
Looking for the main ngrok alternative guide?
We keep the latest ngrok alternative comparison, CLI commands, pricing notes, and webhook examples on one canonical page.
Open the InstaTunnel ngrok alternative guideQuick answer
Expose vs ngrok: Selbsthosting eines PHP-Reverse-Proxy für Laravel: quick answer
If free tunnel limits interrupt your workflow, compare session length, stable URLs, concurrent tunnels, and paid-plan pricing before choosing a localhost tunnel tool.
What free tunnel limits should developers check first?
Check session duration, URL stability, concurrent tunnels, custom subdomains, bandwidth or request limits, and whether webhook callbacks survive restarts.
How does InstaTunnel handle longer development sessions?
InstaTunnel Free is designed around 24-hour sessions, with Pro available for higher limits and MCP endpoint tunnel workflows.
Als moderner PHP- oder Laravel-Entwickler läuft die lokale Entwicklung wie am Schnürchen. Wahrscheinlich nutzt du Tools wie Laravel Herd, Valet oder Sail, um deine Anwendungen auf einer .test-Domain zu servieren. Aber was passiert, wenn du diese lokale Umgebung mit der Außenwelt teilen möchtest — etwa um eine im Aufbau befindliche Funktion einem Kunden zu demonstrieren, Webhooks von Stripe oder GitHub zu testen oder ein responsives Layout auf einem echten Smartphone vorzuschauen? Du brauchst einen Tunnel.
Seit über einem Jahrzehnt ist die Standardlösung ngrok. Es ist robust und funktioniert mit jedem Stack, aber die kostenlose Version hat Einschränkungen, die den Workflow stören können. Eine interessante Alternative ist Expose, ein Open-Source-Tool für Tunneling, das in PHP geschrieben ist und von Marcel Pociot bei Beyond Code entwickelt wurde — dem Team hinter Laravel Herd und Tinkerwell.
Dieser Leitfaden vergleicht die beiden Tools, wie sie heute tatsächlich funktionieren, und zeigt, wie man einen eigenen Expose-Server auf einem günstigen VPS selbst hostet.
Die ngrok Free Tier, präzise beschrieben
ngrok hat sich vom einfachen Tunneling-Utility zu einer vollständigen Ingress-Plattform entwickelt. Das kostenlose Angebot ist großzügiger, als viele Vergleiche vermuten lassen, aber es gibt echte Grenzen, und einige häufig wiederholte Behauptungen stimmen nicht.
Was auf dem kostenlosen Plan tatsächlich begrenzt ist, laut ngrok-Dokumentation:
| Ressource | Limit im Free Tier |
|---|---|
| Datenübertragung ausgehend | 1 GB/Monat |
| HTTP/S-Anfragen | 20.000/Monat |
| Online-Endpunkte | Bis zu 3 |
| Gleichzeitige Agents | 3 |
| TCP-Verbindungen | 5.000/Monat |
| HTTP-Anfrage-Rate | 4.000/min |
| TCP-Verbindungsrate | 100/min |
| Custom/branded Domains | Nicht im Free (Hobbyist; ngrok-branded Domains; eigene Domain nur bei Pay-as-you-go) |
Zwei Punkte sind wichtig, um Missverständnisse zu vermeiden:
- Es gibt kein Session-Timeout im Free Tier. Ngrok-Dokumentation sagt explizit, dass kostenlose Endpunkte unbegrenzt im Hintergrund laufen können — kein “alle paar Stunden neu starten”-Zwang.
- Du musst nicht bei jedem Verbindungsaufbau eine neue zufällige Subdomain erhalten. Seit 2023 kann jedes ngrok-Konto — auch kostenlos — eine statische Domain (z.B.
panda-new-kit.ngrok-free.app) beanspruchen, die dauerhaft dir gehört und sich beim Neustart nicht ändert. Es ist keine vollständig individuelle Domain (das ist kostenpflichtig), aber es löst das Problem, dass du bei jedem Neustart die URL aktualisieren musst, z.B. für Stripe Webhooks. Ohne Anspruch auf eine statische Domain bekommst du bei jeder Verbindung eine neue zufällige URL. - HTTP/S-Traffic im Free Tier zeigt im Browser eine Interstitial-Warnseite “klicken Sie hier, um fortzufahren”, hauptsächlich um Phishing zu verhindern. Das beeinträchtigt keine programmgesteuerten Requests (z.B. Stripe Webhooks) und kann umgangen werden, z.B. durch einen eigenen
User-Agentoder den Headerngrok-skip-browser-warning.
Über das Free Tier hinaus gibt es die Pläne Hobbyist (8–10 USD/Monat, je nach Jahres- oder Monatsabrechnung, ngrok-branded Domains, keine Interstitial), Pay-as-you-go (20 USD/Monat Grundpreis plus verbrauchsabhängige Nutzung, unbegrenzte Endpunkte, eigene Domain) und Enterprise (individuelle Preise, SSO/SCIM/Compliance).
Expose: eine PHP-native, Open-Source-Alternative
Expose unterstützt nur HTTP/HTTPS-Traffic — es ist kein generisches TCP/UDP-Transportmittel wie ngrok, daher tunnelt es keine direkte Datenbankverbindung oder SSH-Sitzungen. Im Gegenzug ist es eng auf Webentwicklung fokussiert, vollständig Open Source (MIT-Lizenz) und in PHP geschrieben, sodass du im Fehlerfall den Code direkt lesen kannst.
Aktuell ist das Projekt aktiv: Das Repository exposedev/expose hat auf GitHub über 4.500 Sterne und 300 Forks, die neueste Version (3.2.2) wurde im März 2026 veröffentlicht. Der Client benötigt PHP 8.2 oder neuer — das ist eine harte Voraussetzung, die in der composer.json des Pakets festgelegt ist. Ältere Hinweise wie “PHP 7.4+” sind veraltet.
Client installieren
Drei unterstützte Methoden:
Laravel Herd — wenn du Herd bereits nutzt, ist Expose darin integriert; setze einfach dein Token in den Herd-Einstellungen.
PHP-Archiv (PHAR) — die primäre, dokumentierte Methode:
curl https://github.com/exposedev/expose/raw/master/builds/expose -L --output expose
chmod +x expose
sudo mv expose /usr/local/bin/expose
Mit Composer:
composer global require exposedev/expose
(Hinweis: Das Paket wurde früher als beyondcode/expose veröffentlicht; dieser Name funktioniert noch auf Packagist, die aktuelle Dokumentation nutzt aber exposedev/expose.) Stelle sicher, dass dein globaler Composer-Bin-Ordner in deinem PATH ist.
Eine Seite teilen
expose token DEIN_TOKEN
Dann, aus einem .test-Projektordner (Herd/Valet-Konvention), einfach expose ohne Argumente ausführen oder eine explizite URL teilen:
expose share http://localhost:8000
Ein Dashboard für lokale Requests unter http://127.0.0.1:4040 erlaubt es, eingehende Requests zu inspizieren und nachzuspielen, ähnlich wie ngrok’s Inspector.
Ein häufiger Irrtum: Benutzerdefinierte Subdomains sind im kostenlosen Expose-Hosting nicht verfügbar. Das --subdomain-Flag erfordert entweder ein Expose Pro/Team-Konto oder einen eigenen Self-Hosting-Server:
expose share my-site.test --subdomain=mein-site
Auf dem kostenlosen Server sharedwithexpose.com (gehostet von Beyond Code in Deutschland) erhält jede Verbindung eine zufällige Subdomain, und die Verbindungen sind zeitlich begrenzt. Das ist der Grund, warum Self-Hosting sinnvoll ist, wenn du stabile, individuelle URLs ohne Kosten pro Sitzplatz möchtest.
Aktuelle Expose-Preise (expose.dev)
| Tarif | Preis | Enthalten |
|---|---|---|
| Hobby | Kostenlos | TLS/SSL, zeitlich begrenzte Verbindungen, zufällige URLs, ein EU-Server |
| Pro | 79 USD/Sitzung/Jahr | Keine Zeitbegrenzung, dauerhafte URLs, eigene Domains und Subdomains, globales Servernetz |
| Team | 229 USD/Team/Jahr (bis zu 10 Nutzer) | Alles in Pro, plus Prioritäts-Support |
Laravel Valet und Herd Integration
Laravel Valet (Taylor Otwells eigenständiges, community-unterhaltenes Tool für lokale Entwicklung) unterstützt drei Share-Tools: ngrok, Expose und Cloudflare’s cloudflared — ausgewählt via valet share-tool ngrok|expose|cloudflared. Valet fragt bei der Auswahl, welches Tool installiert werden soll (Homebrew für ngrok/cloudflared, Composer für Expose), und valet share nutzt es.
Herd — das eigene lokale Umfeld von Beyond Code — hat Expose bereits integriert, konfigurierbar direkt in den Herd-Einstellungen, ohne separaten Installationsschritt.
Feature-Vergleich
| ngrok (Free/Hobbyist) | Expose (Hobby/Pro) | |
|---|---|---|
| Hauptanwendungsfall | Allgemeines Netzwerk-Ingress; API/K8s im Unternehmen | Web-Entwicklung, HTTP/S nur |
| Sprache | Go, Closed-Source-Client/Server | PHP, Open Source (MIT) |
| Protokolle | HTTP/S, TCP, TLS | HTTP/S nur |
| Stabile URL im Free Tier | Ja, wenn eigene statische Domain beansprucht wird | Nein — zufällige Subdomain bei jeder Verbindung |
| Eigene Subdomains | Nur kostenpflichtig | Kostenpflichtig (Pro) oder kostenlos bei Self-Hosting |
| Request-Inspektor | Ja (localhost:4040-Dashboard) |
Ja |
| Self-Hosting | Nicht möglich (nur verwaltet) | Ja, vollständig dokumentiert und Open Source |
Self-Hosting von Expose auf einem günstigen VPS
Wenn du PHP/Laravel-zentriert arbeitest und stabile, individuelle Subdomains ohne jährliche Kosten pro Sitzplatz möchtest, ist Self-Hosting der entscheidende Vorteil. Hier die aktuelle, korrekte Vorgehensweise — das unterscheidet sich in einigen Punkten von älteren Anleitungen (inklusive früherer Entwürfe dieses Textes): Der Self-Hosting-Server ist jetzt ein separates Paket vom Client, mit eigenem Binary und Repository.
Schritt 1: Server provisionieren und DNS konfigurieren
Ein einfacher DigitalOcean-Droplet kostet jetzt ab 4 USD/Monat (512 MiB RAM, 1 vCPU, 10 GiB SSD, 500 GiB Traffic) — ausreichend für einen privaten oder kleinen Team-Expose-Server. Ubuntu 24.04 LTS ist eine solide Wahl.
Füge zwei DNS-A-Records hinzu, die auf die IP deines Droplets zeigen:
- expose (oder eine andere Subdomain, z.B. expose.deinedomain.com)
- *.expose (Wildcard, damit alle Tunnel-Subdomains aufgelöst werden)
Schritt 2: PHP und Composer installieren
Der Server-Teil von Expose benötigt PHP 8.2+:
sudo apt update
sudo apt install php-cli php-curl php-mbstring php-xml php-zip php-sqlite3 unzip git -y
curl -sS https://getcomposer.org/installer -o composer-setup.php
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer
Schritt 3: Expose-Server (nicht den Client) installieren
Der Self-Hosting-Server befindet sich in einem eigenen Repository, exposedev/server, getrennt vom exposedev/expose-Client. Klone es und installiere Abhängigkeiten:
git clone https://github.com/exposedev/server.git
cd server
composer install
Der Open-Source-Server-Kern stellt die Tunneling-Infrastruktur bereit. Er enthält nicht das Expose Pro Dashboard für Team- und Abrechnungsmanagement — das ist nur bei der Managed Plattform expose.dev verfügbar.
Schritt 4: Server starten
php expose-server serve expose.deinedomain.com
Der Server hört standardmäßig auf Port 8080. Du kannst den Port mit --port=3000 ändern und Verbindungen nur mit gültigem Auth-Token zulassen (--validateAuthTokens). Tokens werden dann über die Admin-Oberfläche verwaltet.
Schritt 5: Nginx (oder Apache) für TLS konfigurieren
Der Expose-Server terminiert SSL nicht selbst — du brauchst einen Reverse Proxy. Hole dir ein Wildcard-Zertifikat (z.B. mit Certbot und DNS-Challenge) für *.expose.deinedomain.com, und konfiguriere Nginx:
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name expose.deinedomain.com *.expose.deinedomain.com;
ssl_certificate /etc/letsencrypt/live/expose.deinedomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/expose.deinedomain.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_read_timeout 60;
proxy_connect_timeout 60;
proxy_redirect off;
# Für WebSockets
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
sudo ln -s /etc/nginx/sites-available/expose /etc/nginx/sites-enabled/
sudo systemctl restart nginx
(Bei Apache oder HAProxy sind die Konfigurationen ähnlich, siehe offizielle Expose-Dokumentation.)
Schritt 6: Mit Supervisor dauerhaft laufen lassen
sudo apt install supervisor -y
sudo nano /etc/supervisor/conf.d/expose.conf
[program:expose]
command=/usr/bin/php /pfad/zu/expose-server serve expose.deinedomain.com
numprocs=1
autostart=true
autorestart=true
user=expose
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start expose
(Alternativ: Das docker-compose.yaml im Server-Repo kann genutzt werden. .env-example kopieren, anpassen und docker-compose up -d ausführen, um weniger manuelle Schritte zu haben.)
Schritt 7: Lokalen Client auf den Server zeigen
Auf deinem lokalen Rechner, mit installiertem Expose-Client:
expose default-server expose.deinedomain.com
expose token DEIN_TOKEN
Dann eine Seite mit einer festen Subdomain teilen — das ist im kostenlosen öffentlichen Server nicht möglich:
expose share http://ecommerce.test --subdomain=checkout
Deine App ist jetzt live unter https://checkout.expose.deinedomain.com, auf deiner eigenen Infrastruktur, ohne Zeitlimit pro Verbindung und ohne Sitzplatzkosten.
Welches passt wirklich?
Bleib bei ngrok, wenn du reines TCP/TLS-Tunneling brauchst (Datenbanken, SSH, Spieleserver), Kubernetes-Ingress, org-weites SSO oder Compliance-Dokumentation — das kann Expose nicht.
Überlege, ob dein Traffic nur HTTP/HTTPS ist, du bereits im Laravel/Herd-Ökosystem bist, und du lieber einen 4 USD/Monat VPS laufen hast, als jährlich pro Sitzplatz zu zahlen — oder einfach nur den Tunneling-Tool-Quellcode lesen möchtest.
Changelog
Korrekturen und Ergänzungen basieren auf ngrok- und Expose-Dokumentation, GitHub/Packagist-Metadaten und DigitalOcean-Preisen:
- ngrok Session Timeout — Ursprünglich wurde behauptet, ngrok im Free Tier hätte Timeout, der Neustarts erfordert. Laut ngrok-Dokumentation laufen kostenlose Endpunkte unbegrenzt im Hintergrund. Quelle: ngrok Free Plan Limits.
- ngrok “Zufällige Subdomain bei jedem Neustart” — Ursprünglich wurde das als unbedingte Aussage dargestellt. Seit 2023 kann jedes ngrok-Konto (auch kostenlos) eine dauerhafte statische Domain beanspruchen, die sich beim Neustart nicht ändert; nur Konten ohne Anspruch erhalten bei jedem Neustart eine neue zufällige URL. Quelle: ngrok Blogpost zu statischen Domains.
- ngrok Rate Limits — Ursprünglich 40 Verbindungen pro Minute. Aktuelle Limits sind 100 TCP-Verbindungsversuche/min und 4.000 HTTP-Anfragen/min, getrennt. Quelle: ngrok Limits.
- DigitalOcean Droplet Preis — Ursprünglich 5 USD/Monat. Das günstigste Basic Droplet kostet jetzt 4 USD/Monat (512 MiB RAM, 1 vCPU, 10 GiB SSD, 500 GiB Traffic). Quelle: DigitalOcean Preisübersicht.
- Composer-Paketname — Ursprünglich
beyondcode/expose. Aktuelle offizielle Anleitung nutztexposedev/expose. Das alte Paket existiert noch auf Packagist, ist aber veraltet. Quelle: Expose Installationsanleitung. - PHP-Version — Ursprünglich PHP 7.4+ empfohlen. Der Client erfordert jetzt PHP 8.2 oder neuer, festgelegt in
composer.json. Quelle: exposedev/exposecomposer.json. - Client/Server-Architektur — Das wichtigste Update: Der Self-Hosting-Server ist separat vom Client-Paket. Das
exposedev/expose-Paket enthält nur den Client. Für Self-Hosting nutzt manexposedev/server, das separat installiert wird. Der Befehlexpose serveauf dem Client funktioniert nicht mehr, stattdessen startet man den Server mitexpose-server serve <domain>. Quelle: Expose Server Dokumentation. - Kostenloses Subdomain-Request — Früher konnte man bei Beyond Code im Free Tier eine eigene Subdomain anfragen. Heute erfordert
--subdomainein Pro/Team-Konto oder einen eigenen Server. Das kostenlosesharedwithexpose.comweist zufällige Subdomains zu. Quelle: Expose Sharing Dokumentation. - Expose Preise — Pro 79 USD/Jahr, Team 229 USD/Jahr (bis zu 10 Nutzer), kostenloses Hobby-Tier mit Zeitlimit, zufälligen URLs und einem EU-Server. Quelle: expose.dev Preisseite.
- Nginx-Konfiguration — Ursprünglich Port 80, SSL separat. Jetzt eine Beispielkonfiguration, die SSL direkt auf Port 443 terminiert, gemäß Expose-Dokumentation.
- Supervisor-Konfiguration — Angepasst an den neuen Server-Client-Ansatz, verweist auf
expose-serverBinary mit Domain-Argument. - Laravel-Integration — Valet unterstützt jetzt neben ngrok und Expose auch
cloudflared. Herd ist mit Expose integriert, konfigurierbar in den Einstellungen. - Projektaktivität — Aktuelle GitHub-Statistiken: ca. 4.500+ Sterne, 300+ Forks, Version 3.2.2 (März 2026), MIT-Lizenz.
- Interstitial-Seite — Die Browser-Warnung bei ngrok im Free Tier kann umgangen werden, z.B. durch eigenen User-Agent oder Header.
- Entfernung von werblichen Formulierungen und unbestätigten Behauptungen, stattdessen neutrale, belegte Vergleiche.
Related InstaTunnel pages
Continue from this article into the most relevant product guides and workflows.
Related Topics
Keep building with InstaTunnel
Read the docs for implementation details or compare plans before you ship.