SandboxesVorschau-URLs

Vorschau-URLs: einen Port aus einer Sandbox öffnen

Eine Vorschau-URL gibt einem Port in einer Sandbox auf Lizard (lizard.build) eine private HTTPS-Adresse. Starten Sie einen Server, der auf 0.0.0.0 lauscht, und rufen Sie dann sandbox.exposePort(3000) (Python: expose_port) auf oder führen Sie lizard sandbox expose <id> 3000 aus. Sie erhalten https://<sandbox-id>-3000.sandbox.<region>.onlizard.com/?lizard_token=…; eine Anfrage ohne das Zugriffstoken der Sandbox erhält HTTP 401.

Teststatus: Wir haben diese Seite am 2026-10-12 am Quellcode von Lizard SDK, Lizard CLI 4.0.42 und dem Sandbox-Router geprüft. Einen neuen Live-Test haben wir dafür nicht durchgeführt.

Mit der CLI

lizard sandbox exec $SB -- sh -c "nohup python3 -m http.server 3000 --bind 0.0.0.0 >/tmp/http.log 2>&1 &"
lizard sandbox expose $SB 3000

expose gibt die URL samt Token aus; öffnen Sie sie im Browser. Mit --json erhalten Sie hostname, url, port und accessToken für ein Skript. Entfernen Sie die URL mit lizard sandbox unexpose $SB 3000.

Mit Lizard SDK

exposePort gibt die url für den Browser, den reinen hostname und das accessToken zurück:

import { Sandbox } from '@lizard-build/sdk';
 
const sandbox = await Sandbox.create('base', { projectId: 'proj_123', timeoutMs: 600_000 });
await sandbox.process.exec(
  "nohup python3 -m http.server 3000 --bind 0.0.0.0 --directory /tmp >/tmp/http.log 2>&1 </dev/null &",
);
const { url, hostname, accessToken } = await sandbox.exposePort(3000);
console.log(url); // open in a browser
 
const res = await fetch(`https://${hostname}/`, {
  headers: { 'X-Lizard-Access-Token': accessToken },
});
console.log(res.status);
import httpx
from lizard import Sandbox
 
sandbox = Sandbox.create("base", project_id="proj_123", timeout_ms=600_000)
sandbox.process.exec_(
    "nohup python3 -m http.server 3000 --bind 0.0.0.0 --directory /tmp >/tmp/http.log 2>&1 </dev/null &"
)
exposed = sandbox.expose_port(3000)
print(exposed.url)  # open in a browser
 
res = httpx.get(f"https://{exposed.hostname}/", headers={"X-Lizard-Access-Token": exposed.access_token})
print(res.status_code)

getHost(port) (Python: get_host) veröffentlicht den Port ebenfalls, gibt aber nur den Hostnamen zurück und legt das Token in sandbox.accessToken (Python: sandbox.access_token) ab. unexpose(port) entfernt die URL. Starten Sie den Server, bevor Sie Anfragen senden: Bis er lauscht, antwortet die URL mit 502.

So funktioniert der Zugriff

  • Ein Token pro Sandbox. Das Token gehört zur Sandbox, nicht zu einem Port: Es öffnet jeden Port, den Sie in dieser Sandbox freigeben, und ändert sich nicht, solange die Sandbox existiert. Um den Zugriff zu sperren, nehmen Sie die Freigabe des Ports zurück oder entfernen die Sandbox.
  • Drei Wege, es zu senden. Der Query-Parameter lizard_token, der Header X-Lizard-Access-Token oder das Cookie lizard_access.
  • Browser erhalten ein Cookie. Wenn ein Browser eine URL mit ?lizard_token= öffnet, setzt Lizard für diesen Hostnamen das Cookie lizard_access (HttpOnly, Secure, SameSite=None, Partitioned, 30 Tage) und leitet auf dieselbe Adresse ohne Token weiter. Skripte, API-Aufrufe und WebSockets der Seite senden danach das Cookie mit, und das Token taucht weder im Verlauf noch in Referer-Headern auf. Das Cookie funktioniert auch, wenn eine andere Website die Seite in einem iframe einbettet.
  • Ein Hostname pro Port. Jeder Port hat seinen eigenen Hostnamen und sein eigenes Cookie; öffnen Sie daher die vollständige URL jedes Ports einmal.
  • Ihr Server sieht das Token nie. Lizard entfernt es aus Query, Header und Cookie, bevor es die Anfrage weiterleitet. Die Anfrage behält ihren ursprünglichen Host-Header.
  • WebSockets funktionieren. Upgrade-Anfragen werden durchgereicht, daher funktionieren Dev-Server mit Hot Reload und Terminal-UIs.

Halten Sie eine Vorschau-URL geheim. Wer sie hat, kann jeden freigegebenen Port dieser Sandbox nutzen.

URL-Format und Lebensdauer

https://<sandbox-id>-<port>.sandbox.<region>.onlizard.com

Die URL funktioniert, solange die Sandbox läuft. Mit dem Stopp endet auch der Zugriff. Die Plattform reserviert Port 49983; Sie können ihn nicht freigeben. Eine Sandbox aus dem SDK oder der CLI lebt standardmäßig fünf Minuten; übergeben Sie ein längeres timeoutMs oder --timeout für eine Vorschau, die offen bleiben soll. Siehe Limits für die Lebensdauer.

Fehler

StatusMeldungLösung
401This sandbox port is private (missing or wrong access token)Öffnen Sie die vollständige URL aus expose oder senden Sie X-Lizard-Access-Token.
403Port 3000 is not published for sandbox "…". Published: …Führen Sie für diesen Port lizard sandbox expose oder exposePort aus.
404No running sandbox "…"Die Sandbox läuft nicht. Prüfen Sie lizard sandbox list.
502Sandbox is not listening on port 3000Starten Sie den Server und binden Sie ihn an 0.0.0.0, nicht an 127.0.0.1.

Dev-Server

Die meisten Dev-Server lauschen auf 127.0.0.1, wenn Sie nichts anderes angeben. Übergeben Sie den Host und einen festen Port:

npm run dev -- --host 0.0.0.0 --port 5173

Vite prüft außerdem den Host-Header und antwortet bei Hosts, die es nicht kennt, mit Blocked request. This host (…) is not allowed.. Erlauben Sie die Sandbox-Hostnamen in vite.config.js:

import { defineConfig } from 'vite';
 
export default defineConfig({
  server: { allowedHosts: ['.onlizard.com'] },
});

Ein führender Punkt erlaubt jede Subdomain. Geben Sie danach 5173 frei.

Siehe auch

Aktualisiert