आपको क्या चाहिए
- flyctl CLI इंस्टॉल किया हुआ
- Fly.io खाता (फ्री टियर काम करता है)
- मॉडल प्रमाणीकरण: आपके चुने हुए मॉडल प्रदाता के लिए API कुंजी
- Channel क्रेडेंशियल: Discord bot टोकन, Telegram टोकन, आदि।
शुरुआती त्वरित पथ
- रेपो क्लोन करें →
fly.tomlकस्टमाइज़ करें - ऐप + वॉल्यूम बनाएं → सीक्रेट सेट करें
fly deployके साथ डिप्लॉय करें- कॉन्फ़िग बनाने के लिए SSH करें या Control UI का उपयोग करें
Fly ऐप बनाएं
lhr (लंदन), iad (वर्जीनिया), sjc (सैन होजे)।fly.toml कॉन्फ़िगर करें
अपने ऐप नाम और आवश्यकताओं से मेल खाने के लिए OpenClaw Docker इमेज अपने एंट्रीपॉइंट के रूप में
fly.toml संपादित करें।सुरक्षा नोट: डिफ़ॉल्ट कॉन्फ़िग एक सार्वजनिक URL उजागर करता है। बिना सार्वजनिक IP वाले कठोर डिप्लॉयमेंट के लिए, निजी डिप्लॉयमेंट देखें या deploy/fly.private.toml का उपयोग करें।tini का उपयोग करती है। Fly प्रोसेस कमांड Docker CMD को बदलते हैं, 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" | वॉल्यूम पर स्टेट बनाए रखता है |
सीक्रेट सेट करें
- Non-loopback बाइंड (
--bind lan) के लिए मान्य Gateway प्रमाणीकरण पथ आवश्यक है। यह Fly.io उदाहरणOPENCLAW_GATEWAY_TOKENका उपयोग करता है, लेकिनgateway.auth.passwordया सही ढंग से कॉन्फ़िगर किया गया non-loopbacktrusted-proxyडिप्लॉयमेंट भी आवश्यकता पूरी करता है। - इन टोकन को पासवर्ड की तरह संभालें।
- सभी API कुंजियों और टोकन के लिए कॉन्फ़िग फ़ाइल की बजाय env vars को प्राथमिकता दें। इससे सीक्रेट
openclaw.jsonसे बाहर रहते हैं, जहां वे गलती से उजागर या लॉग हो सकते हैं।
डिप्लॉय करें
कॉन्फ़िग फ़ाइल बनाएं
उचित कॉन्फ़िग बनाने के लिए मशीन में SSH करें:कॉन्फ़िग डायरेक्टरी और फ़ाइल बनाएं:नोट:
OPENCLAW_STATE_DIR=/data के साथ, कॉन्फ़िग पथ /data/openclaw.json है।नोट: https://my-openclaw.fly.dev को अपने वास्तविक Fly ऐप
origin से बदलें। Gateway स्टार्टअप runtime
--bind और --port मानों से स्थानीय Control UI origins सीड करता है ताकि पहला बूट कॉन्फ़िग मौजूद होने से पहले आगे बढ़ सके,
लेकिन Fly के जरिए ब्राउज़र एक्सेस के लिए फिर भी
gateway.controlUi.allowedOrigins में सूचीबद्ध सटीक HTTPS origin चाहिए।नोट: Discord टोकन इनमें से किसी से आ सकता है:- Environment variable:
DISCORD_BOT_TOKEN(सीक्रेट के लिए अनुशंसित) - कॉन्फ़िग फ़ाइल:
channels.discord.token
DISCORD_BOT_TOKEN को स्वचालित रूप से पढ़ता है।लागू करने के लिए रीस्टार्ट करें:समस्या निवारण
”App is not listening on expected address”
Gateway0.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 में मेमोरी बढ़ाएं:
Gateway लॉक समस्याएं
Gateway “already running” त्रुटियों के साथ शुरू होने से इनकार करता है। यह तब होता है जब कंटेनर रीस्टार्ट होता है लेकिन PID लॉक फ़ाइल वॉल्यूम पर बनी रहती है। समाधान: लॉक फ़ाइल हटाएं:/data/gateway.*.lock पर है (किसी सबडायरेक्टरी में नहीं)।
कॉन्फ़िग पढ़ा नहीं जा रहा
--allow-unconfigured केवल स्टार्टअप गार्ड को बायपास करता है। यह /data/openclaw.json बनाता या सुधारता नहीं है, इसलिए सुनिश्चित करें कि आपका वास्तविक कॉन्फ़िग मौजूद है और सामान्य स्थानीय Gateway स्टार्ट चाहने पर उसमें gateway.mode="local" शामिल है।
कॉन्फ़िग मौजूद है यह सत्यापित करें:
SSH के जरिए कॉन्फ़िग लिखना
fly ssh console -C कमांड शेल रीडायरेक्शन का समर्थन नहीं करता। कॉन्फ़िग फ़ाइल लिखने के लिए:
fly sftp विफल हो सकता है। पहले हटाएं:
स्टेट कायम नहीं रह रहा
यदि रीस्टार्ट के बाद auth profiles, channel/provider स्टेट, या sessions खो जाते हैं, तो स्टेट dir कंटेनर फ़ाइलसिस्टम पर लिख रहा है। समाधान: सुनिश्चित करें किfly.toml में OPENCLAW_STATE_DIR=/data सेट है और फिर से डिप्लॉय करें।
अपडेट
मशीन कमांड अपडेट करना
यदि आपको पूर्ण रीडिप्लॉय के बिना स्टार्टअप कमांड बदलना हो:fly deploy के बाद, मशीन कमांड fly.toml में मौजूद कमांड पर रीसेट हो सकता है। यदि आपने मैन्युअल बदलाव किए हैं, तो डिप्लॉय के बाद उन्हें फिर से लागू करें।
निजी डिप्लॉयमेंट (कठोर)
डिफ़ॉल्ट रूप से, Fly सार्वजनिक IP आवंटित करता है, जिससे आपका Gatewayhttps://your-app.fly.dev पर एक्सेस योग्य हो जाता है। यह सुविधाजनक है लेकिन इसका मतलब है कि आपका डिप्लॉयमेंट इंटरनेट स्कैनरों (Shodan, Censys, आदि) द्वारा खोजा जा सकता है।
कोई सार्वजनिक एक्सपोज़र नहीं वाले कठोर डिप्लॉयमेंट के लिए, निजी टेम्पलेट का उपयोग करें।
निजी डिप्लॉयमेंट कब उपयोग करें
- आप केवल आउटबाउंड कॉल/संदेश करते हैं (कोई इनबाउंड Webhook नहीं)
- आप किसी भी Webhook कॉलबैक के लिए ngrok या Tailscale टनल उपयोग करते हैं
- आप ब्राउज़र के बजाय SSH, प्रॉक्सी, या WireGuard के जरिए Gateway एक्सेस करते हैं
- आप डिप्लॉयमेंट को इंटरनेट स्कैनरों से छिपा हुआ रखना चाहते हैं
सेटअप
मानक कॉन्फ़िग के बजायdeploy/fly.private.toml उपयोग करें:
fly ips list में केवल private प्रकार का IP दिखना चाहिए:
निजी डिप्लॉयमेंट एक्सेस करना
क्योंकि कोई सार्वजनिक URL नहीं है, इनमें से किसी विधि का उपयोग करें: विकल्प 1: स्थानीय प्रॉक्सी (सबसे सरल)निजी डिप्लॉयमेंट के साथ Webhook
अगर आपको सार्वजनिक एक्सपोज़र के बिना Webhook callback (Twilio, Telnyx, आदि) चाहिए:- ngrok tunnel - कंटेनर के अंदर या sidecar के रूप में ngrok चलाएँ
- Tailscale Funnel - Tailscale के ज़रिए विशिष्ट पाथ एक्सपोज़ करें
- केवल आउटबाउंड - कुछ provider (Twilio) Webhook के बिना आउटबाउंड call के लिए ठीक काम करते हैं
webhookSecurity.allowedHosts को सार्वजनिक tunnel hostname पर सेट करें ताकि forwarded host header स्वीकार किए जाएँ।
सुरक्षा लाभ
| पहलू | सार्वजनिक | निजी |
|---|---|---|
| इंटरनेट scanner | खोजे जा सकने योग्य | छिपा हुआ |
| सीधे हमले | संभव | अवरुद्ध |
| Control UI पहुँच | Browser | Proxy/VPN |
| Webhook डिलीवरी | सीधे | tunnel के ज़रिए |
नोट्स
- Fly.io x86 architecture का उपयोग करता है (ARM नहीं)
- Dockerfile दोनों architecture के साथ संगत है
- WhatsApp/Telegram onboarding के लिए,
fly ssh consoleउपयोग करें - स्थायी data
/dataपर volume में रहता है - Signal को Java + signal-cli की आवश्यकता होती है; custom image उपयोग करें और memory 2GB+ रखें।
लागत
अनुशंसित config (shared-cpu-2x, 2GB RAM) के साथ:
- उपयोग के आधार पर लगभग ~$10-15/माह
- free tier में कुछ allowance शामिल है
अगले चरण
- messaging channel सेट करें: Channels
- Gateway configure करें: Gateway configuration
- OpenClaw को up to date रखें: Updating