Sandboxesपूर्वावलोकन URL

प्रीव्यू URL: सैंडबॉक्स से पोर्ट खोलें

प्रीव्यू URL, Lizard पर सैंडबॉक्स के अंदर के किसी पोर्ट को एक प्राइवेट HTTPS एड्रेस देता है। 0.0.0.0 पर लिसन करने वाला सर्वर शुरू करें, फिर sandbox.exposePort(3000) (Python: expose_port) कॉल करें या lizard sandbox expose <id> 3000 चलाएँ। आपको https://<sandbox-id>-3000.sandbox.<region>.onlizard.com/?lizard_token=… मिलता है; सैंडबॉक्स के एक्सेस टोकन के बिना भेजी गई रिक्वेस्ट को HTTP 401 मिलता है।

टेस्ट स्टेटस: हमने 2026-10-12 को इस पेज को Lizard SDK, Lizard CLI 4.0.42 और सैंडबॉक्स राउटर के सोर्स से मिलाकर जाँचा। 502 वाला जवाब और आपके सर्वर को मिलने वाला Host हेडर 2026-10-20 को एक लाइव सैंडबॉक्स से लिए गए हैं।

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 टोकन वाला URL प्रिंट करता है; उसे ब्राउज़र में खोलें। स्क्रिप्ट के लिए hostname, url, port और accessToken पाने के लिए --json जोड़ें। URL हटाने के लिए lizard sandbox unexpose $SB 3000 चलाएँ।

Lizard SDK से

exposePort ब्राउज़र के लिए url, सिर्फ़ hostname और accessToken लौटाता है:

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) भी पोर्ट पब्लिश करता है, लेकिन सिर्फ़ होस्टनेम लौटाता है और टोकन को sandbox.accessToken (Python: sandbox.access_token) में रखता है। unexpose(port) URL हटा देता है। ट्रैफ़िक भेजने से पहले सर्वर शुरू करें: जब तक सर्वर लिसन नहीं करता, URL 502 लौटाता है।

एक्सेस कैसे काम करता है

  • हर सैंडबॉक्स का एक टोकन। टोकन सैंडबॉक्स का होता है, पोर्ट का नहीं: उस सैंडबॉक्स पर आपके एक्सपोज़ किए गए हर पोर्ट के लिए यही टोकन चलता है, और सैंडबॉक्स रहने तक यह नहीं बदलता। एक्सेस बंद करने के लिए पोर्ट को अनएक्सपोज़ करें या सैंडबॉक्स हटा दें।
  • टोकन भेजने के तीन तरीके। lizard_token क्वेरी पैरामीटर, X-Lizard-Access-Token हेडर या lizard_access कुकी।
  • ब्राउज़र को कुकी मिलती है। जब ब्राउज़र ?lizard_token= वाला URL खोलता है, तो Lizard उस होस्टनेम के लिए lizard_access कुकी सेट करता है (HttpOnly, Secure, SameSite=None, Partitioned, 30 दिन) और टोकन के बिना उसी एड्रेस पर रीडायरेक्ट करता है। इसके बाद पेज की स्क्रिप्ट, API कॉल और WebSockets कुकी के साथ जाते हैं, और टोकन हिस्ट्री और Referer हेडर में नहीं आता। जब कोई दूसरी साइट पेज को iframe में एम्बेड करती है, तब भी कुकी काम करती है।
  • हर पोर्ट का अलग होस्टनेम। हर पोर्ट का अपना होस्टनेम और अपनी कुकी होती है, इसलिए हर पोर्ट का पूरा URL एक बार खोलें।
  • आपके सर्वर तक टोकन कभी नहीं पहुँचता। रिक्वेस्ट फ़ॉरवर्ड करने से पहले Lizard उसे क्वेरी, हेडर और कुकी से हटा देता है।
  • आपके सर्वर को इंटरनल Host मिलता है। फ़ॉरवर्ड की गई रिक्वेस्ट में प्रीव्यू URL का होस्टनेम नहीं, बल्कि इंटरनल होस्टनेम होता है। एब्सोल्यूट URL Host से नहीं, प्रीव्यू URL से बनाएँ।
  • WebSockets काम करते हैं। अपग्रेड रिक्वेस्ट आगे पहुँचती हैं, इसलिए हॉट रीलोड वाले डेव सर्वर और टर्मिनल UI काम करते हैं।

प्रीव्यू URL को पासवर्ड की तरह संभालें: जिसके पास यह है, वह उस सैंडबॉक्स के सभी एक्सपोज़ किए गए पोर्ट इस्तेमाल कर सकता है।

URL फ़ॉर्मेट और लाइफटाइम

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

URL सिर्फ़ तब तक काम करता है जब तक सैंडबॉक्स चल रहा है। प्लेटफ़ॉर्म पोर्ट 49983 अपने लिए रखता है; इसे एक्सपोज़ नहीं किया जा सकता। SDK या CLI से बना सैंडबॉक्स डिफ़ॉल्ट रूप से पाँच मिनट चलता है; जिस प्रीव्यू को खुला रखना है, उसके लिए लंबा timeoutMs या --timeout दें। लाइफटाइम की लिमिट देखें।

एरर

स्टेटसमैसेजसमाधान
401This sandbox port is private (missing or wrong access token)expose से मिला पूरा URL खोलें, या X-Lizard-Access-Token भेजें।
403Port 3000 is not published for sandbox "…". Published: …उस पोर्ट के लिए lizard sandbox expose या exposePort चलाएँ।
404No running sandbox "…"सैंडबॉक्स नहीं चल रहा। lizard sandbox list से जाँचें।
502"message": "The sandbox is running but port is not open" वाला JSONसर्वर शुरू करें और उसे 127.0.0.1 के बजाय 0.0.0.0 पर बाइंड करें।

डेव सर्वर

ज़्यादातर डेव सर्वर तब तक 127.0.0.1 पर लिसन करते हैं जब तक आप कुछ और न बताएँ। होस्ट और एक तय पोर्ट पास करें:

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

Vite Host हेडर भी जाँचता है और जिन होस्ट को वह नहीं जानता, उनके लिए Blocked request. This host (…) is not allowed. लौटाता है। आपके सर्वर को इंटरनल होस्टनेम मिलता है, इसलिए .onlizard.com नामों की लिस्ट से फ़ायदा नहीं होगा। vite.config.js में सभी होस्ट को अनुमति दें:

import { defineConfig } from 'vite';
 
export default defineConfig({
  server: { allowedHosts: true },
});

पोर्ट अब भी प्रीव्यू URL के एक्सेस टोकन से सुरक्षित रहता है। इसके बाद 5173 एक्सपोज़ करें।

संबंधित

अपडेट: