Hosting
Fly.io
Amaç: Kalıcı depolama, otomatik HTTPS ve Discord/kanal erişimiyle bir Fly.io makinesinde çalışan OpenClaw Gateway.
Gereksinimler
- flyctl CLI yüklü olmalı
- Fly.io hesabı (ücretsiz katman yeterlidir)
- Model kimlik doğrulaması: seçtiğiniz model sağlayıcısı için API anahtarı
- Kanal kimlik bilgileri: Discord bot belirteci, Telegram belirteci vb.
Yeni başlayanlar için hızlı yol
- Depoyu klonlayın,
fly.tomldosyasını özelleştirin - Uygulamayı ve birimi oluşturun, gizli değerleri ayarlayın
fly deployile dağıtın- Yapılandırmayı oluşturmak için SSH ile bağlanın veya Kontrol Arayüzünü kullanın
Fly uygulamasını oluşturun
git clone https://github.com/openclaw/openclaw.gitcd openclaw # kendi adınızı seçinfly apps create my-openclaw # genellikle 1 GB yeterlidirfly volumes create openclaw_data --size 1 --region iadSize yakın bir bölge seçin. Yaygın seçenekler: lhr (Londra), iad (Virginia), sjc (San Jose).
fly.toml dosyasını yapılandırın
fly.toml dosyasını uygulama adınıza ve gereksinimlerinize uyacak şekilde düzenleyin. Depoda izlenen fly.toml, aşağıda gösterilen genel şablondur; deploy/fly.private.toml ise güçlendirilmiş, genel IP içermeyen çeşittir (bkz. Özel dağıtım).
app = "my-openclaw" # uygulamanızın adı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 imajının giriş noktası tini olup varsayılan olarak node openclaw.mjs gateway çalıştırır. Fly [processes], ENTRYPOINT değerine dokunmadan Docker CMD değerini değiştirir (burada aynı derlenmiş giriş noktası olan node dist/index.js gateway ... komutunu doğrudan çalıştırır); dolayısıyla süreç yine tini altında çalışır.
Temel ayarlar:
| Ayar | Nedeni |
|---|---|
--bind lan |
Fly'ın vekil sunucusunun Gateway'e erişebilmesi için 0.0.0.0 adresine bağlanır |
--allow-unconfigured |
Yapılandırma dosyası olmadan başlatır (dosyayı daha sonra oluşturursunuz) |
internal_port = 3000 |
Fly sağlık denetimleri için --port 3000 (veya OPENCLAW_GATEWAY_PORT) ile eşleşmelidir |
memory = "2048mb" |
512 MB çok azdır; 2 GB önerilir |
OPENCLAW_STATE_DIR = "/data" |
Durumu birimde kalıcı hâle getirir |
Gizli değerleri ayarlayın
# gerekli: loopback olmayan bağlantı için gateway kimlik doğrulama belirtecifly secrets set OPENCLAW_GATEWAY_TOKEN=$(openssl rand -hex 32) # model sağlayıcısı API anahtarlarıfly secrets set ANTHROPIC_API_KEY=example-anthropic-key-not-real # isteğe bağlı: diğer sağlayıcılarfly secrets set OPENAI_API_KEY=example-openai-key-not-realfly secrets set GOOGLE_API_KEY=... # kanal belirteçlerifly secrets set DISCORD_BOT_TOKEN=example-discord-bot-tokenLoopback olmayan bağlantılar (--bind lan) geçerli bir Gateway kimlik doğrulama yolu gerektirir. Bu örnekte OPENCLAW_GATEWAY_TOKEN kullanılır ancak gateway.auth.password veya doğru yapılandırılmış, loopback olmayan güvenilir vekil sunucu dağıtımı da bu gereksinimi karşılar. SecretRef sözleşmesi için Gizli değer yönetimi bölümüne bakın.
Bu belirteçlere parola gibi davranın. Gizli değerlerin openclaw.json dosyasına girmemesi için API anahtarları ve belirteçlerde yapılandırma dosyası yerine ortam değişkenlerini/fly secrets komutunu tercih edin.
Dağıtın
fly deployİlk dağıtım Docker imajını oluşturur. Dağıtımdan sonra doğrulayın:
fly statusfly logsHTTP/WebSocket dinleyicisi çalışmaya başladığında Gateway başlangıç günlüklerine gateway ready kaydedilir. Fly'ın kendi sağlık denetimi, fly.toml uyarınca internal_port = 3000 değerini izler; imajın Docker HEALTHCHECK yönergesi ayrıca varsayılan 18789 numaralı bağlantı noktasında /healthz yolunu yoklar ancak bu dağıtım Gateway'i --port 3000 ile geçersiz kıldığı için burada kullanılmaz.
Yapılandırma dosyasını oluşturun
Uygun bir yapılandırma oluşturmak için makineye SSH ile bağlanın:
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 kullanıldığında yapılandırma yolu /data/openclaw.json olur.
https://my-openclaw.fly.dev değerini gerçek Fly uygulamanızın kaynağıyla değiştirin. Gateway başlangıcı, yapılandırma henüz mevcut değilken ilk açılışın devam edebilmesi için çalışma zamanındaki --bind ve --port değerlerinden yerel Kontrol Arayüzü kaynaklarını oluşturur ancak Fly üzerinden tarayıcı erişimi için yine de tam HTTPS kaynağının gateway.controlUi.allowedOrigins içinde listelenmesi gerekir.
Discord belirteci şu kaynaklardan birinden gelebilir:
DISCORD_BOT_TOKENortam değişkeni (gizli değerler için önerilir); yapılandırmaya eklemeniz gerekmez, Gateway bunu otomatik olarak okurchannels.discord.tokenyapılandırma alanı
Uygulamak için yeniden başlatın:
exitfly machine restart <machine-id>Gateway'e erişin
Kontrol Arayüzü
fly openAlternatif olarak https://my-openclaw.fly.dev/ adresini ziyaret edin.
Yapılandırılmış ortak gizli değerle kimlik doğrulaması yapın: OPENCLAW_GATEWAY_TOKEN içindeki Gateway belirteci veya parola tabanlı kimlik doğrulamaya geçtiyseniz parolanız.
Günlükler
fly logs # canlı günlüklerfly logs --no-tail # son günlüklerSSH konsolu
fly ssh consoleSorun giderme
"Uygulama beklenen adresi dinlemiyor"
Gateway, 0.0.0.0 yerine 127.0.0.1 adresine bağlanıyor.
Çözüm: fly.toml içindeki süreç komutunuza --bind lan ekleyin.
Sağlık denetimleri başarısız oluyor / bağlantı reddedildi
Fly, yapılandırılan bağlantı noktasından Gateway'e erişemiyor.
Çözüm: internal_port değerinin Gateway bağlantı noktasıyla (--port 3000 veya OPENCLAW_GATEWAY_PORT=3000) eşleştiğinden emin olun.
OOM / bellek sorunları
Kapsayıcı sürekli yeniden başlıyor veya sonlandırılıyor. Belirtiler: SIGABRT, v8::internal::Runtime_AllocateInYoungGeneration ya da açıklamasız yeniden başlatmalar.
Çözüm: fly.toml içindeki belleği artırın:
[[vm]] memory = "2048mb"Veya mevcut bir makineyi güncelleyin:
fly machine update <machine-id> --vm-memory 2048 -y512 MB çok azdır. 1 GB çalışabilir ancak yük altında veya ayrıntılı günlük kaydı kullanılırken OOM oluşabilir. 2 GB önerilir.
Gateway kilidi sorunları
Kapsayıcı yeniden başlatıldıktan sonra Gateway, "zaten çalışıyor" hatalarıyla başlamayı reddediyor.
Tek örnek kilit dosyası kalıcı /data biriminde değil, <tmpdir>/openclaw-<uid>/gateway.<hash>.lock konumundadır (Linux: /tmp/openclaw-<uid>/gateway.<hash>.lock); bu nedenle kapsayıcının tamamen yeniden başlatılması normalde dosyayı kapsayıcı dosya sisteminin geri kalanıyla birlikte temizler. Kilit varlığını sürdürürse (örneğin kapsayıcı dosya sistemini koruyan bir fly machine restart sonrasında) ve başlatmayı engellerse kilidi elle kaldırın:
fly ssh console --command "rm -f /tmp/openclaw-*/gateway.*.lock"fly machine restart <machine-id>Yapılandırma okunmıyor
--allow-unconfigured yalnızca başlangıç korumasını atlar. /data/openclaw.json dosyasını oluşturmaz veya onarmaz; bu nedenle gerçek yapılandırmanızın mevcut olduğundan ve normal bir yerel Gateway başlangıcı için "gateway": { "mode": "local" } içerdiğinden emin olun.
Yapılandırmanın mevcut olduğunu doğrulayın:
fly ssh console --command "cat /data/openclaw.json"Yapılandırmayı SSH üzerinden yazma
fly ssh console -C, kabuk yeniden yönlendirmesini desteklemez. Yapılandırma dosyası yazmak için:
# echo + tee (yerelden uzağa veri aktarın)echo '{"your":"config"}' | fly ssh console -C "tee /data/openclaw.json" # veya sftpfly sftp shell> put /local/path/config.json /data/openclaw.jsonDosya zaten mevcutsa fly sftp başarısız olabilir; önce dosyayı silin:
fly ssh console --command "rm /data/openclaw.json"Durum kalıcı değil
Yeniden başlatma sonrasında kimlik doğrulama profillerini, kanal/sağlayıcı durumunu veya oturumları kaybediyorsanız durum dizini birim yerine kapsayıcı dosya sistemine yazılıyor demektir.
Çözüm: fly.toml içinde OPENCLAW_STATE_DIR=/data ayarının bulunduğundan emin olun ve yeniden dağıtın.
Güncelleme
git pullfly deployfly statusfly logsBuradaki denetimli yol git pull + fly deploy birleşimidir: imajı Dockerfile dosyasından yeniden oluşturur; böylece CLI/Gateway sürümü, temel işletim sistemi imajı ve tüm Dockerfile değişiklikleri birlikte güncellenir. Çalışan kapsayıcı içinde openclaw update kullanmak aynı işlem değildir çünkü imaj, algılayabileceği bir .git çalışma kopyası ve npm tarafından yönetilen genel kurulum olmadan Docker ile oluşturulmuş bir dist/ ağacı olarak sunulur; sanal makine tarzı kurulumlardaki bu akış için Güncelleme bölümüne bakın.
Makine komutunu güncelleme
Başlangıç komutunu tam bir yeniden dağıtım yapmadan değiştirmek için:
fly machines listfly machine update <machine-id> --command "node dist/index.js gateway --port 3000 --bind lan" -y # veya bellek artışıyla birliktefly machine update <machine-id> --vm-memory 2048 --command "node dist/index.js gateway --port 3000 --bind lan" -yDaha sonraki bir fly deploy, makine komutunu fly.toml içindeki değere geri döndürür; yeniden dağıtımdan sonra elle yaptığınız değişiklikleri tekrar uygulayın.
Özel dağıtım (güçlendirilmiş)
Fly varsayılan olarak genel IP'ler tahsis eder; dolayısıyla Gateway'inize https://your-app.fly.dev adresinden erişilebilir ve internet tarayıcıları (Shodan, Censys vb.) tarafından keşfedilebilir.
Genel IP içermeyen güçlendirilmiş bir dağıtım için deploy/fly.private.toml kullanın: [http_service] bölümünü içermediğinden genel giriş tahsis edilmez.
Özel dağıtım ne zaman kullanılmalı?
- Yalnızca giden çağrılar/mesajlar (gelen Webhook'lar yok)
- Webhook geri çağrılarını ngrok veya Tailscale tünelleri yönetiyorsa
- Gateway erişimi tarayıcı yerine SSH, vekil sunucu veya WireGuard üzerinden sağlanıyorsa
- Dağıtımın internet tarayıcılarından gizlenmesi gerekiyorsa
Kurulum
fly deploy -c deploy/fly.private.tomlVeya mevcut bir dağıtımı dönüştürün:
# mevcut IP'leri listeleyinfly ips list -a my-openclaw # genel IP'leri serbest bırakınfly ips release <public-ipv4> -a my-openclawfly ips release <public-ipv6> -a my-openclaw # gelecekteki dağıtımların yeniden genel IP tahsis etmemesi için özel yapılandırmaya geçinfly deploy -c deploy/fly.private.toml # yalnızca özel IPv6 tahsis edinfly ips allocate-v6 --private -a my-openclawBundan sonra fly ips list yalnızca private türünde bir IP göstermelidir:
VERSION IP TYPE REGIONv6 fdaa:x:x:x:x::x private globalÖzel bir dağıtıma erişme
Seçenek 1: yerel proxy (en basit)
fly proxy 3000:3000 -a my-openclaw# bir tarayıcıda http://localhost:3000 adresini açınSeçenek 2: WireGuard VPN
fly wireguard create# bir WireGuard istemcisine içe aktarın, ardından dahili IPv6 üzerinden erişin# örnek: http://[fdaa:x:x:x:x::x]:3000Seçenek 3: yalnızca SSH
fly ssh console -a my-openclawÖzel dağıtımda Webhook'lar
Herkese açık erişim olmadan Webhook geri çağrıları (Twilio, Telnyx vb.) için:
- ngrok tüneli: ngrok'u konteynerin içinde veya yardımcı konteyner olarak çalıştırın
- Tailscale Funnel: belirli yolları Tailscale aracılığıyla erişime açın
- Yalnızca giden: bazı sağlayıcılar (Twilio), Webhook olmadan giden aramalar için çalışır
plugins.entries.voice-call.config altında ngrok ile örnek sesli arama yapılandırması:
{ plugins: { entries: { "voice-call": { enabled: true, config: { provider: "twilio", tunnel: { provider: "ngrok" }, webhookSecurity: { allowedHosts: ["example.ngrok.app"], }, }, }, }, },}ngrok tüneli konteynerin içinde çalışır ve Fly uygulamasının kendisini erişime açmadan herkese açık bir Webhook URL'si sağlar. İletilen ana makine üstbilgilerinin kabul edilmesi için webhookSecurity.allowedHosts değerini tünelin ana makine adı olarak ayarlayın.
Güvenlik açısından ödünleşimler
| Konu | Herkese açık | Özel |
|---|---|---|
| İnternet tarayıcıları | Keşfedilebilir | Gizli |
| Doğrudan saldırılar | Mümkün | Engellenmiş |
| Denetim kullanıcı arayüzü erişimi | Tarayıcı | Proxy/VPN |
| Webhook teslimi | Doğrudan | Tünel üzerinden |
Notlar
- Fly.io x86 mimarisini kullanır; Dockerfile hem x86 hem de ARM ile uyumludur.
- WhatsApp/Telegram ilk kurulumu için
fly ssh consolekullanın. - Kalıcı veriler
/datakonumundaki birimde bulunur. - Signal, imajda signal-cli (Java tabanlı bir CLI) gerektirir; özel bir imaj kullanın ve belleği 2 GB veya üzerinde tutun.
Maliyet
Önerilen yapılandırmayla (shared-cpu-2x, 2 GB RAM), kullanıma bağlı olarak aylık yaklaşık 10-15 ABD doları maliyet bekleyin; ücretsiz katman temel kullanım kotasının bir bölümünü karşılar. Güncel ücretler için Fly.io fiyatlandırmasına bakın.
Sonraki adımlar
- Mesajlaşma kanallarını ayarlayın: Kanallar
- Gateway'i yapılandırın: Gateway yapılandırması
- OpenClaw'u güncel tutun: Güncelleme