Hosting
Fly.io
लक्ष्य: स्थायी स्टोरेज, स्वचालित HTTPS और Discord/चैनल एक्सेस के साथ Fly.io मशीन पर चलने वाला OpenClaw Gateway।
आपको क्या चाहिए
- flyctl CLI इंस्टॉल किया हुआ
- Fly.io खाता (निःशुल्क टियर काम करता है)
- मॉडल प्रमाणीकरण: आपके चुने हुए मॉडल प्रदाता की API कुंजी
- चैनल क्रेडेंशियल: Discord बॉट टोकन, Telegram टोकन आदि।
शुरुआती लोगों के लिए त्वरित तरीका
- रेपो क्लोन करें,
fly.tomlको अनुकूलित करें - ऐप और वॉल्यूम बनाएँ, सीक्रेट सेट करें
fly deployके साथ डिप्लॉय करें- कॉन्फ़िग बनाने के लिए SSH से कनेक्ट करें या Control UI का उपयोग करें
Fly ऐप बनाएँ
git clone https://github.com/openclaw/openclaw.gitcd openclaw # अपना नाम चुनेंfly apps create my-openclaw # सामान्यतः 1GB पर्याप्त हैfly volumes create openclaw_data --size 1 --region iadअपने निकट का क्षेत्र चुनें। सामान्य विकल्प: lhr (लंदन), iad (वर्जीनिया), sjc (सैन होज़े)।
fly.toml कॉन्फ़िगर करें
अपने ऐप के नाम और आवश्यकताओं से मिलाने के लिए fly.toml संपादित करें। रेपो में ट्रैक किया गया fly.toml नीचे दिखाया गया सार्वजनिक टेम्पलेट है; deploy/fly.private.toml अधिक सुरक्षित, सार्वजनिक-IP-रहित संस्करण है (निजी डिप्लॉयमेंट देखें)।
app = "my-openclaw" # आपके ऐप का नामprimary_region = "iad" [build] dockerfile = "Dockerfile" [env] NODE_ENV = "production" OPENCLAW_PREFER_PNPM = "1" OPENCLAW_STATE_DIR = "/data" NODE_OPTIONS = "--max-old-space-size=1536" [processes] app = "node dist/index.js gateway --allow-unconfigured --port 3000 --bind lan" [http_service] internal_port = 3000 force_https = true auto_stop_machines = false auto_start_machines = true min_machines_running = 1 processes = ["app"] [[vm]] size = "shared-cpu-2x" memory = "2048mb" [mounts] source = "openclaw_data" destination = "/data"OpenClaw Docker इमेज का एंट्रीपॉइंट tini है, जो डिफ़ॉल्ट रूप से node openclaw.mjs gateway चलाता है। Fly [processes], Docker के CMD को बदल देता है (यहाँ यह node dist/index.js gateway ..., उसी कंपाइल किए गए एंट्रीपॉइंट, को सीधे चलाता है), लेकिन ENTRYPOINT को नहीं बदलता, इसलिए प्रक्रिया अब भी tini के अंतर्गत चलती है।
मुख्य सेटिंग्स:
| सेटिंग | कारण |
|---|---|
--bind lan |
0.0.0.0 से बाइंड करता है, ताकि Fly का प्रॉक्सी Gateway तक पहुँच सके |
--allow-unconfigured |
कॉन्फ़िग फ़ाइल के बिना शुरू करता है (आप इसे बाद में बनाते हैं) |
internal_port = 3000 |
Fly स्वास्थ्य जाँचों के लिए --port 3000 (या OPENCLAW_GATEWAY_PORT) से मेल खाना आवश्यक है |
memory = "2048mb" |
512MB बहुत कम है; 2GB अनुशंसित है |
OPENCLAW_STATE_DIR = "/data" |
स्थिति को वॉल्यूम पर स्थायी रखता है |
सीक्रेट सेट करें
# आवश्यक: गैर-लूपबैक बाइंडिंग के लिए Gateway प्रमाणीकरण टोकनfly secrets set OPENCLAW_GATEWAY_TOKEN=$(openssl rand -hex 32) # मॉडल प्रदाता की API कुंजियाँfly secrets set ANTHROPIC_API_KEY=example-anthropic-key-not-real # वैकल्पिक: अन्य प्रदाताfly secrets set OPENAI_API_KEY=example-openai-key-not-realfly secrets set GOOGLE_API_KEY=... # चैनल टोकनfly secrets set DISCORD_BOT_TOKEN=example-discord-bot-tokenगैर-लूपबैक बाइंड (--bind lan) के लिए एक मान्य Gateway प्रमाणीकरण पथ आवश्यक है। यह उदाहरण OPENCLAW_GATEWAY_TOKEN का उपयोग करता है, लेकिन gateway.auth.password या सही ढंग से कॉन्फ़िगर किया गया गैर-लूपबैक विश्वसनीय-प्रॉक्सी डिप्लॉयमेंट भी आवश्यकता पूरी करता है। SecretRef अनुबंध के लिए सीक्रेट प्रबंधन देखें।
इन टोकनों को पासवर्ड की तरह सुरक्षित रखें। API कुंजियों और टोकनों के लिए कॉन्फ़िग फ़ाइल के बजाय env vars/fly secrets को प्राथमिकता दें, ताकि सीक्रेट openclaw.json से बाहर रहें।
डिप्लॉय करें
fly deployपहला डिप्लॉय Docker इमेज बनाता है। डिप्लॉयमेंट के बाद सत्यापित करें:
fly statusfly logsHTTP/WebSocket लिसनर शुरू होने पर Gateway स्टार्टअप लॉग एक बार gateway ready दर्ज करते हैं। Fly की अपनी स्वास्थ्य जाँच fly.toml के अनुसार internal_port = 3000 पर नज़र रखती है; इमेज का Docker HEALTHCHECK निर्देश अतिरिक्त रूप से उसके डिफ़ॉल्ट पोर्ट 18789 पर /healthz को पोल करता है, जिसका यहाँ उपयोग नहीं होता क्योंकि यह डिप्लॉयमेंट Gateway को --port 3000 पर ओवरराइड करता है।
कॉन्फ़िग फ़ाइल बनाएँ
उचित कॉन्फ़िग बनाने के लिए SSH से मशीन में कनेक्ट करें:
fly ssh consolemkdir -p /datacat > /data/openclaw.json << 'EOF'{ "agents": { "defaults": { "model": { "primary": "anthropic/claude-opus-4-6", "fallbacks": ["anthropic/claude-sonnet-4-6", "openai/gpt-5.4"] }, "maxConcurrent": 4 }, "list": [ { "id": "main", "default": true } ] }, "auth": { "profiles": { "anthropic:default": { "mode": "token", "provider": "anthropic" }, "openai:default": { "mode": "token", "provider": "openai" } } }, "bindings": [ { "agentId": "main", "match": { "channel": "discord" } } ], "channels": { "discord": { "enabled": true, "groupPolicy": "allowlist", "guilds": { "YOUR_GUILD_ID": { "channels": { "general": { "allow": true } }, "requireMention": false } } } }, "gateway": { "mode": "local", "bind": "auto", "controlUi": { "allowedOrigins": [ "https://my-openclaw.fly.dev", "http://localhost:3000", "http://127.0.0.1:3000" ] } }, "meta": {}}EOFOPENCLAW_STATE_DIR=/data के साथ, कॉन्फ़िग पथ /data/openclaw.json है।
https://my-openclaw.fly.dev को अपने वास्तविक Fly ऐप ओरिजिन से बदलें। Gateway स्टार्टअप रनटाइम के --bind और --port मानों से स्थानीय Control UI ओरिजिन आरंभिक रूप से भरता है, ताकि कॉन्फ़िग मौजूद होने से पहले पहला बूट आगे बढ़ सके, लेकिन Fly के माध्यम से ब्राउज़र एक्सेस के लिए अब भी gateway.controlUi.allowedOrigins में सटीक HTTPS ओरिजिन सूचीबद्ध होना आवश्यक है।
Discord टोकन इनमें से किसी भी स्रोत से आ सकता है:
- पर्यावरण चर
DISCORD_BOT_TOKEN(सीक्रेट के लिए अनुशंसित); इसे कॉन्फ़िग में जोड़ने की आवश्यकता नहीं है, Gateway इसे स्वचालित रूप से पढ़ता है - कॉन्फ़िग फ़ाइल
channels.discord.token
लागू करने के लिए पुनः आरंभ करें:
exitfly machine restart <machine-id>Gateway एक्सेस करें
Control UI
fly openया https://my-openclaw.fly.dev/ पर जाएँ।
कॉन्फ़िगर किए गए साझा सीक्रेट से प्रमाणीकरण करें: OPENCLAW_GATEWAY_TOKEN का Gateway टोकन, या यदि आपने पासवर्ड प्रमाणीकरण अपनाया है तो आपका पासवर्ड।
लॉग
fly logs # लाइव लॉगfly logs --no-tail # हाल के लॉगSSH कंसोल
fly ssh consoleसमस्या निवारण
"ऐप अपेक्षित पते पर नहीं सुन रहा है"
Gateway 0.0.0.0 के बजाय 127.0.0.1 से बाइंड हो रहा है।
समाधान: fly.toml में अपने प्रक्रिया कमांड में --bind lan जोड़ें।
स्वास्थ्य जाँच विफल / कनेक्शन अस्वीकृत
Fly कॉन्फ़िगर किए गए पोर्ट पर Gateway तक नहीं पहुँच सकता।
समाधान: सुनिश्चित करें कि internal_port, Gateway पोर्ट (--port 3000 या OPENCLAW_GATEWAY_PORT=3000) से मेल खाता है।
OOM / मेमोरी समस्याएँ
कंटेनर बार-बार पुनः आरंभ हो रहा है या बंद किया जा रहा है। संकेत: SIGABRT, v8::internal::Runtime_AllocateInYoungGeneration, या बिना किसी संदेश के पुनः आरंभ होना।
समाधान: fly.toml में मेमोरी बढ़ाएँ:
[[vm]] memory = "2048mb"या किसी मौजूदा मशीन को अपडेट करें:
fly machine update <machine-id> --vm-memory 2048 -y512MB बहुत कम है। 1GB काम कर सकता है, लेकिन लोड या विस्तृत लॉगिंग के दौरान OOM हो सकता है। 2GB अनुशंसित है।
Gateway लॉक समस्याएँ
कंटेनर पुनः आरंभ होने के बाद Gateway "पहले से चल रहा है" त्रुटियों के कारण शुरू होने से मना करता है।
रनटाइम लॉक फ़ाइलें <tmpdir>/openclaw-<uid>/gateway.<hash>.lock
और gateway.state.<hash>.lock (Linux:
/tmp/openclaw-<uid>/gateway.*.lock) पर रहती हैं, स्थायी /data वॉल्यूम पर नहीं, इसलिए
कंटेनर को पूरी तरह पुनः आरंभ करने पर वे सामान्यतः शेष
कंटेनर फ़ाइल सिस्टम के साथ साफ़ हो जाती हैं। यदि कोई लॉक बना रहता है (उदाहरण के लिए ऐसा fly machine restart
जो कंटेनर फ़ाइल सिस्टम को सुरक्षित रखता है) और स्टार्टअप को अवरुद्ध करता है, तो उसे
मैन्युअल रूप से हटाएँ:
fly ssh console --command "rm -f /tmp/openclaw-*/gateway.*.lock"fly machine restart <machine-id>कॉन्फ़िग पढ़ा नहीं जा रहा
--allow-unconfigured केवल स्टार्टअप सुरक्षा जाँच को बायपास करता है। यह /data/openclaw.json को बनाता या सुधारता नहीं है, इसलिए सुनिश्चित करें कि आपका वास्तविक कॉन्फ़िग मौजूद है और सामान्य स्थानीय Gateway स्टार्ट के लिए उसमें "gateway": { "mode": "local" } शामिल है।
सत्यापित करें कि कॉन्फ़िग मौजूद है:
fly ssh console --command "cat /data/openclaw.json"SSH के माध्यम से कॉन्फ़िग लिखना
fly ssh console -C शेल रीडायरेक्शन का समर्थन नहीं करता। कॉन्फ़िग फ़ाइल लिखने के लिए:
# echo + tee (स्थानीय से रिमोट पर पाइप करें)echo '{"your":"config"}' | fly ssh console -C "tee /data/openclaw.json" # या sftpfly sftp shell> put /local/path/config.json /data/openclaw.jsonयदि फ़ाइल पहले से मौजूद है, तो fly sftp विफल हो सकता है; पहले उसे हटाएँ:
fly ssh console --command "rm /data/openclaw.json"स्थिति स्थायी नहीं रह रही
यदि पुनः आरंभ करने के बाद आपके प्रमाणीकरण प्रोफ़ाइल, चैनल/प्रदाता स्थिति या सत्र खो जाते हैं, तो स्टेट डायरेक्टरी वॉल्यूम के बजाय कंटेनर फ़ाइल सिस्टम में लिख रही है।
समाधान: सुनिश्चित करें कि OPENCLAW_STATE_DIR=/data, fly.toml में सेट है और फिर से डिप्लॉय करें।
अपडेट करना
git pullfly deployfly statusfly logsयहाँ git pull + fly deploy पर्यवेक्षित तरीका है: यह Dockerfile से इमेज को फिर से बनाता है, इसलिए CLI/Gateway संस्करण, आधार OS इमेज और Dockerfile में हुए सभी बदलाव एक साथ अपडेट होते हैं। चल रहे कंटेनर के अंदर openclaw update वही प्रक्रिया नहीं है, क्योंकि इमेज Docker द्वारा निर्मित dist/ ट्री के रूप में आती है, जिसमें उसके द्वारा पहचानने के लिए न तो .git चेकआउट होता है, न ही npm-प्रबंधित वैश्विक इंस्टॉलेशन; VM-जैसे इंस्टॉलेशन पर उस प्रक्रिया के लिए अपडेट करना देखें।
मशीन कमांड अपडेट करना
पूर्ण पुनः डिप्लॉय किए बिना स्टार्टअप कमांड बदलने के लिए:
fly machines listfly machine update <machine-id> --command "node dist/index.js gateway --port 3000 --bind lan" -y # या मेमोरी बढ़ाने के साथfly machine update <machine-id> --vm-memory 2048 --command "node dist/index.js gateway --port 3000 --bind lan" -yबाद का fly deploy मशीन कमांड को fly.toml में मौजूद मान पर रीसेट कर देता है; पुनः डिप्लॉय करने के बाद मैन्युअल बदलाव फिर से लागू करें।
निजी डिप्लॉयमेंट (अधिक सुरक्षित)
डिफ़ॉल्ट रूप से Fly सार्वजनिक IP आवंटित करता है, इसलिए आपका Gateway https://your-app.fly.dev पर उपलब्ध होता है और इंटरनेट स्कैनर (Shodan, Censys आदि) उसे खोज सकते हैं।
बिना सार्वजनिक IP वाले अधिक सुरक्षित डिप्लॉयमेंट के लिए deploy/fly.private.toml का उपयोग करें: इसमें [http_service] शामिल नहीं है, इसलिए कोई सार्वजनिक इनग्रेस आवंटित नहीं होता।
निजी डिप्लॉयमेंट का उपयोग कब करें
- केवल आउटबाउंड कॉल/संदेश (कोई इनबाउंड Webhook नहीं)
- ngrok या Tailscale टनल किसी भी Webhook कॉलबैक को संभालती हैं
- Gateway एक्सेस ब्राउज़र के बजाय SSH, प्रॉक्सी या WireGuard के माध्यम से होता है
- डिप्लॉयमेंट को इंटरनेट स्कैनरों से छिपाया जाना चाहिए
सेटअप
fly deploy -c deploy/fly.private.tomlया किसी मौजूदा डिप्लॉयमेंट को रूपांतरित करें:
# वर्तमान IP सूचीबद्ध करेंfly ips list -a my-openclaw # सार्वजनिक IP जारी करेंfly ips release <public-ipv4> -a my-openclawfly ips release <public-ipv6> -a my-openclaw # निजी कॉन्फ़िगरेशन पर स्विच करें, ताकि भविष्य के डिप्लॉयमेंट सार्वजनिक IP फिर से आवंटित न करेंfly deploy -c deploy/fly.private.toml # केवल-निजी IPv6 आवंटित करेंfly ips allocate-v6 --private -a my-openclawइसके बाद, fly ips list में केवल private प्रकार का IP दिखाई देना चाहिए:
संस्करण IP प्रकार क्षेत्रv6 fdaa:x:x:x:x::x निजी वैश्विकनिजी डिप्लॉयमेंट तक पहुँचना
विकल्प 1: स्थानीय प्रॉक्सी (सबसे सरल)
fly proxy 3000:3000 -a my-openclaw# ब्राउज़र में http://localhost:3000 खोलेंविकल्प 2: WireGuard VPN
fly wireguard create# इसे WireGuard क्लाइंट में इम्पोर्ट करें, फिर आंतरिक IPv6 के माध्यम से पहुँचें# उदाहरण: http://[fdaa:x:x:x:x::x]:3000विकल्प 3: केवल SSH
fly ssh console -a my-openclawनिजी डिप्लॉयमेंट के साथ Webhook
सार्वजनिक रूप से उजागर किए बिना Webhook कॉलबैक (Twilio, Telnyx आदि) के लिए:
- ngrok टनल: ngrok को कंटेनर के अंदर या साइडकार के रूप में चलाएँ
- Tailscale Funnel: Tailscale के माध्यम से विशिष्ट पाथ उजागर करें
- केवल आउटबाउंड: कुछ प्रदाता (Twilio) Webhook के बिना आउटबाउंड कॉल के लिए काम करते हैं
plugins.entries.voice-call.config के अंतर्गत ngrok के साथ वॉइस-कॉल कॉन्फ़िगरेशन का उदाहरण:
{ plugins: { entries: { "voice-call": { enabled: true, config: { provider: "twilio", tunnel: { provider: "ngrok" }, webhookSecurity: { allowedHosts: ["example.ngrok.app"], }, }, }, }, },}ngrok टनल कंटेनर के अंदर चलती है और Fly ऐप को स्वयं उजागर किए बिना एक सार्वजनिक Webhook URL प्रदान करती है। फ़ॉरवर्ड किए गए होस्ट हेडर स्वीकार करने के लिए webhookSecurity.allowedHosts को टनल होस्टनेम पर सेट करें।
सुरक्षा संबंधी समझौते
| पहलू | सार्वजनिक | निजी |
|---|---|---|
| इंटरनेट स्कैनर | खोजने योग्य | छिपा हुआ |
| प्रत्यक्ष हमले | संभव | अवरुद्ध |
| कंट्रोल UI पहुँच | ब्राउज़र | प्रॉक्सी/VPN |
| Webhook डिलीवरी | प्रत्यक्ष | टनल के माध्यम से |
टिप्पणियाँ
- Fly.io x86 आर्किटेक्चर का उपयोग करता है; Dockerfile x86 और ARM दोनों के साथ संगत है।
- WhatsApp/Telegram ऑनबोर्डिंग के लिए,
fly ssh consoleका उपयोग करें। - स्थायी डेटा
/dataपर स्थित वॉल्यूम में रहता है। - Signal के लिए इमेज पर signal-cli (Java-आधारित CLI) आवश्यक है; कस्टम इमेज का उपयोग करें और मेमोरी 2GB+ रखें।
लागत
अनुशंसित कॉन्फ़िगरेशन (shared-cpu-2x, 2GB RAM) के साथ, उपयोग के आधार पर लगभग $10-15/माह की अपेक्षा करें; मुफ़्त टियर कुछ आधारभूत भत्ते को कवर करता है। वर्तमान दरों के लिए Fly.io की मूल्य-निर्धारण जानकारी देखें।
अगले चरण
- मैसेजिंग चैनल सेट अप करें: चैनल
- Gateway कॉन्फ़िगर करें: Gateway कॉन्फ़िगरेशन
- OpenClaw को अद्यतित रखें: अपडेट करना