मुख्य सामग्री पर जाएं
लक्ष्य: स्थायी स्टोरेज, स्वचालित HTTPS, और Discord/channel एक्सेस के साथ Fly.io मशीन पर चल रहा OpenClaw Gateway।

आपको क्या चाहिए

  • flyctl CLI इंस्टॉल किया हुआ
  • Fly.io खाता (फ्री टियर काम करता है)
  • मॉडल प्रमाणीकरण: आपके चुने हुए मॉडल प्रदाता के लिए API कुंजी
  • Channel क्रेडेंशियल: Discord bot टोकन, Telegram टोकन, आदि।

शुरुआती त्वरित पथ

  1. रेपो क्लोन करें → fly.toml कस्टमाइज़ करें
  2. ऐप + वॉल्यूम बनाएं → सीक्रेट सेट करें
  3. fly deploy के साथ डिप्लॉय करें
  4. कॉन्फ़िग बनाने के लिए SSH करें या Control UI का उपयोग करें
1

Fly ऐप बनाएं

# Clone the repo
git clone https://github.com/openclaw/openclaw.git
cd openclaw

# Create a new Fly app (pick your own name)
fly apps create my-openclaw

# Create a persistent volume (1GB is usually enough)
fly volumes create openclaw_data --size 1 --region iad
टिप: अपने पास का क्षेत्र चुनें। सामान्य विकल्प: lhr (लंदन), iad (वर्जीनिया), sjc (सैन होजे)।
2

fly.toml कॉन्फ़िगर करें

अपने ऐप नाम और आवश्यकताओं से मेल खाने के लिए fly.toml संपादित करें।सुरक्षा नोट: डिफ़ॉल्ट कॉन्फ़िग एक सार्वजनिक URL उजागर करता है। बिना सार्वजनिक IP वाले कठोर डिप्लॉयमेंट के लिए, निजी डिप्लॉयमेंट देखें या deploy/fly.private.toml का उपयोग करें।
app = "my-openclaw"  # Your app name
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 का उपयोग करती है। Fly प्रोसेस कमांड Docker CMD को बदलते हैं, ENTRYPOINT को नहीं, इसलिए प्रोसेस फिर भी tini के तहत चलता है।मुख्य सेटिंग्स:
सेटिंगक्यों
--bind lan0.0.0.0 से बाइंड करता है ताकि Fly का प्रॉक्सी Gateway तक पहुंच सके
--allow-unconfiguredकॉन्फ़िग फ़ाइल के बिना शुरू करता है (आप बाद में एक बनाएंगे)
internal_port = 3000Fly हेल्थ चेक के लिए --port 3000 (या OPENCLAW_GATEWAY_PORT) से मेल खाना चाहिए
memory = "2048mb"512MB बहुत कम है; 2GB अनुशंसित
OPENCLAW_STATE_DIR = "/data"वॉल्यूम पर स्टेट बनाए रखता है
3

सीक्रेट सेट करें

# Required: Gateway token (for non-loopback binding)
fly secrets set OPENCLAW_GATEWAY_TOKEN=$(openssl rand -hex 32)

# Model provider API keys
fly secrets set ANTHROPIC_API_KEY=example-anthropic-key-not-real

# Optional: Other providers
fly secrets set OPENAI_API_KEY=example-openai-key-not-real
fly secrets set GOOGLE_API_KEY=...

# Channel tokens
fly secrets set DISCORD_BOT_TOKEN=example-discord-bot-token
नोट्स:
  • Non-loopback बाइंड (--bind lan) के लिए मान्य Gateway प्रमाणीकरण पथ आवश्यक है। यह Fly.io उदाहरण OPENCLAW_GATEWAY_TOKEN का उपयोग करता है, लेकिन gateway.auth.password या सही ढंग से कॉन्फ़िगर किया गया non-loopback trusted-proxy डिप्लॉयमेंट भी आवश्यकता पूरी करता है।
  • इन टोकन को पासवर्ड की तरह संभालें।
  • सभी API कुंजियों और टोकन के लिए कॉन्फ़िग फ़ाइल की बजाय env vars को प्राथमिकता दें। इससे सीक्रेट openclaw.json से बाहर रहते हैं, जहां वे गलती से उजागर या लॉग हो सकते हैं।
4

डिप्लॉय करें

fly deploy
पहला डिप्लॉय Docker इमेज बनाता है (~2-3 मिनट)। बाद के डिप्लॉय तेज़ होते हैं।डिप्लॉयमेंट के बाद, सत्यापित करें:
fly status
fly logs
आपको यह दिखना चाहिए:
[gateway] listening on ws://0.0.0.0:3000 (PID xxx)
[discord] logged in to discord as xxx
5

कॉन्फ़िग फ़ाइल बनाएं

उचित कॉन्फ़िग बनाने के लिए मशीन में SSH करें:
fly ssh console
कॉन्फ़िग डायरेक्टरी और फ़ाइल बनाएं:
mkdir -p /data
cat > /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": {}
}
EOF
नोट: 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
यदि env var का उपयोग कर रहे हैं, तो कॉन्फ़िग में टोकन जोड़ने की आवश्यकता नहीं है। Gateway DISCORD_BOT_TOKEN को स्वचालित रूप से पढ़ता है।लागू करने के लिए रीस्टार्ट करें:
exit
fly machine restart <machine-id>
6

Gateway एक्सेस करें

Control UI

ब्राउज़र में खोलें:
fly open
या https://my-openclaw.fly.dev/ पर जाएंकॉन्फ़िगर किए गए साझा सीक्रेट से प्रमाणीकरण करें। यह गाइड Gateway टोकन OPENCLAW_GATEWAY_TOKEN से उपयोग करता है; यदि आपने पासवर्ड प्रमाणीकरण पर स्विच किया है, तो उसके बजाय वह पासवर्ड उपयोग करें।

लॉग

fly logs              # Live logs
fly logs --no-tail    # Recent logs

SSH कंसोल

fly ssh console

समस्या निवारण

”App is not listening on expected address”

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 -y
नोट: 512MB बहुत कम है। 1GB काम कर सकता है लेकिन लोड के तहत या विस्तृत लॉगिंग के साथ OOM हो सकता है। 2GB अनुशंसित है।

Gateway लॉक समस्याएं

Gateway “already running” त्रुटियों के साथ शुरू होने से इनकार करता है। यह तब होता है जब कंटेनर रीस्टार्ट होता है लेकिन PID लॉक फ़ाइल वॉल्यूम पर बनी रहती है। समाधान: लॉक फ़ाइल हटाएं:
fly ssh console --command "rm -f /data/gateway.*.lock"
fly machine restart <machine-id>
लॉक फ़ाइल /data/gateway.*.lock पर है (किसी सबडायरेक्टरी में नहीं)।

कॉन्फ़िग पढ़ा नहीं जा रहा

--allow-unconfigured केवल स्टार्टअप गार्ड को बायपास करता है। यह /data/openclaw.json बनाता या सुधारता नहीं है, इसलिए सुनिश्चित करें कि आपका वास्तविक कॉन्फ़िग मौजूद है और सामान्य स्थानीय Gateway स्टार्ट चाहने पर उसमें gateway.mode="local" शामिल है। कॉन्फ़िग मौजूद है यह सत्यापित करें:
fly ssh console --command "cat /data/openclaw.json"

SSH के जरिए कॉन्फ़िग लिखना

fly ssh console -C कमांड शेल रीडायरेक्शन का समर्थन नहीं करता। कॉन्फ़िग फ़ाइल लिखने के लिए:
# Use echo + tee (pipe from local to remote)
echo '{"your":"config"}' | fly ssh console -C "tee /data/openclaw.json"

# Or use sftp
fly sftp shell
> put /local/path/config.json /data/openclaw.json
नोट: यदि फ़ाइल पहले से मौजूद है तो fly sftp विफल हो सकता है। पहले हटाएं:
fly ssh console --command "rm /data/openclaw.json"

स्टेट कायम नहीं रह रहा

यदि रीस्टार्ट के बाद auth profiles, channel/provider स्टेट, या sessions खो जाते हैं, तो स्टेट dir कंटेनर फ़ाइलसिस्टम पर लिख रहा है। समाधान: सुनिश्चित करें कि fly.toml में OPENCLAW_STATE_DIR=/data सेट है और फिर से डिप्लॉय करें।

अपडेट

# Pull latest changes
git pull

# Redeploy
fly deploy

# Check health
fly status
fly logs

मशीन कमांड अपडेट करना

यदि आपको पूर्ण रीडिप्लॉय के बिना स्टार्टअप कमांड बदलना हो:
# Get machine ID
fly machines list

# Update command
fly machine update <machine-id> --command "node dist/index.js gateway --port 3000 --bind lan" -y

# Or with memory increase
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, आदि) द्वारा खोजा जा सकता है। कोई सार्वजनिक एक्सपोज़र नहीं वाले कठोर डिप्लॉयमेंट के लिए, निजी टेम्पलेट का उपयोग करें।

निजी डिप्लॉयमेंट कब उपयोग करें

  • आप केवल आउटबाउंड कॉल/संदेश करते हैं (कोई इनबाउंड Webhook नहीं)
  • आप किसी भी Webhook कॉलबैक के लिए ngrok या Tailscale टनल उपयोग करते हैं
  • आप ब्राउज़र के बजाय SSH, प्रॉक्सी, या WireGuard के जरिए Gateway एक्सेस करते हैं
  • आप डिप्लॉयमेंट को इंटरनेट स्कैनरों से छिपा हुआ रखना चाहते हैं

सेटअप

मानक कॉन्फ़िग के बजाय deploy/fly.private.toml उपयोग करें:
# Deploy with private config
fly deploy -c deploy/fly.private.toml
या मौजूदा डिप्लॉयमेंट को कन्वर्ट करें:
# List current IPs
fly ips list -a my-openclaw

# Release public IPs
fly ips release <public-ipv4> -a my-openclaw
fly ips release <public-ipv6> -a my-openclaw

# Switch to private config so future deploys don't re-allocate public IPs
# (remove [http_service] or deploy with the private template)
fly deploy -c deploy/fly.private.toml

# Allocate private-only IPv6
fly ips allocate-v6 --private -a my-openclaw
इसके बाद, fly ips list में केवल private प्रकार का IP दिखना चाहिए:
VERSION  IP                   TYPE             REGION
v6       fdaa:x:x:x:x::x      private          global

निजी डिप्लॉयमेंट एक्सेस करना

क्योंकि कोई सार्वजनिक URL नहीं है, इनमें से किसी विधि का उपयोग करें: विकल्प 1: स्थानीय प्रॉक्सी (सबसे सरल)
# Forward local port 3000 to the app
fly proxy 3000:3000 -a my-openclaw

# Then open http://localhost:3000 in browser
विकल्प 2: WireGuard VPN
# Create WireGuard config (one-time)
fly wireguard create

# Import to WireGuard client, then access via internal IPv6
# Example: http://[fdaa:x:x:x:x::x]:3000
विकल्प 3: केवल SSH
fly ssh console -a my-openclaw

निजी डिप्लॉयमेंट के साथ Webhook

अगर आपको सार्वजनिक एक्सपोज़र के बिना Webhook callback (Twilio, Telnyx, आदि) चाहिए:
  1. ngrok tunnel - कंटेनर के अंदर या sidecar के रूप में ngrok चलाएँ
  2. Tailscale Funnel - Tailscale के ज़रिए विशिष्ट पाथ एक्सपोज़ करें
  3. केवल आउटबाउंड - कुछ provider (Twilio) Webhook के बिना आउटबाउंड call के लिए ठीक काम करते हैं
ngrok के साथ voice-call config का उदाहरण:
{
  plugins: {
    entries: {
      "voice-call": {
        enabled: true,
        config: {
          provider: "twilio",
          tunnel: { provider: "ngrok" },
          webhookSecurity: {
            allowedHosts: ["example.ngrok.app"],
          },
        },
      },
    },
  },
}
ngrok tunnel कंटेनर के अंदर चलता है और Fly app को स्वयं एक्सपोज़ किए बिना एक सार्वजनिक Webhook URL देता है। webhookSecurity.allowedHosts को सार्वजनिक tunnel hostname पर सेट करें ताकि forwarded host header स्वीकार किए जाएँ।

सुरक्षा लाभ

पहलूसार्वजनिकनिजी
इंटरनेट scannerखोजे जा सकने योग्यछिपा हुआ
सीधे हमलेसंभवअवरुद्ध
Control UI पहुँचBrowserProxy/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 शामिल है
विवरण के लिए Fly.io pricing देखें।

अगले चरण

संबंधित