Hosting
Fly.io
Hedef: OpenClaw Gateway, kalıcı depolama, otomatik HTTPS ve Discord/kanal erişimiyle bir Fly.io makinesinde çalışıyor.
Gerekenler
- flyctl CLI yüklü
- Fly.io hesabı (ücretsiz katman çalışır)
- Model kimlik doğrulaması: Seçtiğiniz model sağlayıcısı için API anahtarı
- Kanal kimlik bilgileri: Discord bot token’ı, Telegram token’ı vb.
Yeni başlayanlar için hızlı yol
- Repoyu klonlayın →
fly.tomldosyasını özelleştirin - Uygulama + volume oluşturun → secret’ları ayarlayın
fly deployile dağıtın- Yapılandırma oluşturmak için SSH ile bağlanın veya Control UI kullanın
Fly uygulamasını oluşturun
# 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
İpucu: Size 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ız ve gereksinimlerinizle eşleşecek şekilde düzenleyin.
Güvenlik notu: Varsayılan yapılandırma herkese açık bir URL açar. Herkese açık IP olmadan sıkılaştırılmış bir dağıtım için Özel Dağıtım bölümüne bakın veya deploy/fly.private.toml kullanın.
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"
Temel ayarlar:
| Ayar | Neden |
|---|---|
--bind lan |
0.0.0.0 adresine bağlanır, böylece Fly proxy’si gateway’e ulaşabilir |
--allow-unconfigured |
Yapılandırma dosyası olmadan başlatır (sonra bir tane oluşturacaksınız) |
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 küçüktür; 2 GB önerilir |
OPENCLAW_STATE_DIR = "/data" |
Durumu volume üzerinde kalıcı hale getirir |
Secret’ları ayarlayın
# 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=sk-ant-...
# Optional: Other providers
fly secrets set OPENAI_API_KEY=sk-...
fly secrets set GOOGLE_API_KEY=...
# Channel tokens
fly secrets set DISCORD_BOT_TOKEN=MTQ...
Notlar:
- local loopback olmayan bağlamalar (
--bind lan) geçerli bir gateway kimlik doğrulama yolu gerektirir. Bu Fly.io örneğiOPENCLAW_GATEWAY_TOKENkullanır, ancakgateway.auth.passwordveya doğru yapılandırılmış local loopback olmayan birtrusted-proxydağıtımı da gereksinimi karşılar. - Bu token’ları parola gibi ele alın.
- Tüm API anahtarları ve token’lar için yapılandırma dosyası yerine env vars tercih edin. Bu, secret’ların yanlışlıkla açığa çıkabilecekleri veya günlüğe yazılabilecekleri
openclaw.jsondışında kalmasını sağlar.
Dağıtın
fly deploy
İlk dağıtım Docker imajını oluşturur (~2-3 dakika). Sonraki dağıtımlar daha hızlıdır.
Dağıtımdan sonra doğrulayın:
fly status
fly logs
Şunu görmelisiniz:
[gateway] listening on ws://0.0.0.0:3000 (PID xxx)
[discord] logged in to discord as xxx
Yapılandırma dosyası oluşturun
Uygun bir yapılandırma oluşturmak için makineye SSH ile bağlanın:
fly ssh console
Yapılandırma dizinini ve dosyasını oluşturun:
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
Not: OPENCLAW_STATE_DIR=/data ile yapılandırma yolu /data/openclaw.json olur.
Not: https://my-openclaw.fly.dev değerini gerçek Fly uygulama
origin’inizle değiştirin. Gateway başlatma, ilk önyüklemenin yapılandırma
yokken de ilerleyebilmesi için yerel Control UI origin’lerini çalışma zamanı
--bind ve --port değerlerinden üretir, ancak Fly üzerinden tarayıcı
erişimi yine de gateway.controlUi.allowedOrigins içinde listelenen tam
HTTPS origin’i gerektirir.
Not: Discord token’ı şunlardan biriyle gelebilir:
- Ortam değişkeni:
DISCORD_BOT_TOKEN(secret’lar için önerilir) - Yapılandırma dosyası:
channels.discord.token
Env var kullanıyorsanız token’ı yapılandırmaya eklemenize gerek yoktur. Gateway DISCORD_BOT_TOKEN değerini otomatik olarak okur.
Uygulamak için yeniden başlatın:
exit
fly machine restart <machine-id>
Gateway’e erişin
Control UI
Tarayıcıda açın:
fly open
Veya https://my-openclaw.fly.dev/ adresini ziyaret edin
Yapılandırılmış paylaşılan secret ile kimlik doğrulaması yapın. Bu kılavuz
OPENCLAW_GATEWAY_TOKEN değerindeki gateway token’ını kullanır; parola
kimlik doğrulamasına geçtiyseniz bunun yerine o parolayı kullanın.
Günlükler
fly logs # Live logs
fly logs --no-tail # Recent logs
SSH Konsolu
fly ssh console
Sorun giderme
"Uygulama beklenen adreste dinlemiyor"
Gateway, 0.0.0.0 yerine 127.0.0.1 adresine bağlanıyor.
Çözüm: fly.toml içindeki işlem komutunuza --bind lan ekleyin.
Sağlık denetimleri başarısız / bağlantı reddedildi
Fly, yapılandırılmış port üzerinden gateway’e ulaşamıyor.
Çözüm: internal_port değerinin gateway portuyla eşleştiğinden emin olun (--port 3000 veya OPENCLAW_GATEWAY_PORT=3000 ayarlayın).
OOM / Bellek sorunları
Container sürekli yeniden başlatılıyor veya sonlandırılıyor. Belirtiler: SIGABRT, v8::internal::Runtime_AllocateInYoungGeneration veya sessiz yeniden başlatmalar.
Çözüm: fly.toml içinde belleği artırın:
[[vm]]
memory = "2048mb"
Veya mevcut bir makineyi güncelleyin:
fly machine update <machine-id> --vm-memory 2048 -y
Not: 512 MB çok küçüktür. 1 GB çalışabilir, ancak yük altında veya ayrıntılı günlüklemeyle OOM yaşayabilir. 2 GB önerilir.
Gateway kilit sorunları
Gateway, "already running" hatalarıyla başlatmayı reddediyor.
Bu, container yeniden başlatıldığında ancak PID kilit dosyası volume üzerinde kaldığında olur.
Çözüm: Kilit dosyasını silin:
fly ssh console --command "rm -f /data/gateway.*.lock"
fly machine restart <machine-id>
Kilit dosyası /data/gateway.*.lock konumundadır (bir alt dizinde değildir).
Yapılandırma okunmuyor
--allow-unconfigured yalnızca başlangıç korumasını atlar. /data/openclaw.json oluşturmaz veya onarmaz; bu yüzden normal bir yerel gateway başlatması istediğinizde gerçek yapılandırmanızın mevcut olduğundan ve 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"
SSH ile yapılandırma yazma
fly ssh console -C komutu shell yönlendirmesini desteklemez. Bir yapılandırma dosyası yazmak için:
# 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
Not: Dosya zaten varsa fly sftp başarısız olabilir. Önce silin:
fly ssh console --command "rm /data/openclaw.json"
Durum kalıcı olmuyor
Yeniden başlatmadan sonra auth profillerini, kanal/sağlayıcı durumunu veya oturumları kaybediyorsanız, state dizini container dosya sistemine yazıyordur.
Çözüm: fly.toml içinde OPENCLAW_STATE_DIR=/data ayarlandığından emin olun ve yeniden dağıtın.
Güncellemeler
# Pull latest changes
git pull
# Redeploy
fly deploy
# Check health
fly status
fly logs
Makine komutunu güncelleme
Tam yeniden dağıtım yapmadan başlangıç komutunu değiştirmeniz gerekiyorsa:
# 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
Not: fly deploy sonrasında makine komutu fly.toml içindekine sıfırlanabilir. Manuel değişiklik yaptıysanız dağıtımdan sonra bunları yeniden uygulayın.
Özel dağıtım (sıkılaştırılmış)
Varsayılan olarak Fly, herkese açık IP’ler ayırır ve gateway’inize https://your-app.fly.dev adresinden erişilebilir hale getirir. Bu kullanışlıdır, ancak dağıtımınızın internet tarayıcıları (Shodan, Censys vb.) tarafından bulunabilir olduğu anlamına gelir.
Herkese açık erişimi olmayan sıkılaştırılmış bir dağıtım için özel şablonu kullanın.
Özel dağıtım ne zaman kullanılmalı
- Yalnızca giden çağrılar/mesajlar yapıyorsunuz (gelen Webhook yok)
- Webhook geri çağrıları için ngrok veya Tailscale tünelleri kullanıyorsunuz
- Gateway’e tarayıcı yerine SSH, proxy veya WireGuard üzerinden erişiyorsunuz
- Dağıtımın internet tarayıcılarından gizli olmasını istiyorsunuz
Kurulum
Standart yapılandırma yerine deploy/fly.private.toml kullanın:
# Deploy with private config
fly deploy -c deploy/fly.private.toml
Veya mevcut bir dağıtımı dönüştürün:
# 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
Bundan sonra fly ips list yalnızca private türünde bir IP göstermelidir:
VERSION IP TYPE REGION
v6 fdaa:x:x:x:x::x private global
Özel dağıtıma erişme
Herkese açık URL olmadığı için şu yöntemlerden birini kullanın:
Seçenek 1: Yerel proxy (en basit)
# Forward local port 3000 to the app
fly proxy 3000:3000 -a my-openclaw
# Then open http://localhost:3000 in browser
Seçenek 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
Seçenek 3: Yalnızca SSH
fly ssh console -a my-openclaw
Özel dağıtımla Webhook'lar
Herkese açık erişim olmadan webhook geri çağrılarına (Twilio, Telnyx vb.) ihtiyacınız varsa:
- ngrok tüneli - ngrok'u konteyner içinde veya sidecar olarak çalıştırın
- Tailscale Funnel - Belirli yolları Tailscale üzerinden açığa çıkarın
- Yalnızca dışa giden - Bazı sağlayıcılar (Twilio), webhook olmadan dışa giden aramalar için sorunsuz çalışır
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 açığa çıkarmadan herkese açık bir webhook URL'si sağlar. İletilen host üstbilgilerinin kabul edilmesi için webhookSecurity.allowedHosts değerini herkese açık tünel ana makine adına ayarlayın.
Güvenlik avantajları
| Boyut | Herkese açık | Özel |
|---|---|---|
| İnternet tarayıcıları | Keşfedilebilir | Gizli |
| Doğrudan saldırılar | Olası | Engellenmiş |
| Control UI erişimi | Tarayıcı | Proxy/VPN |
| Webhook teslimi | Doğrudan | Tünel üzerinden |
Notlar
- Fly.io x86 mimarisi kullanır (ARM değil)
- Dockerfile her iki mimariyle de uyumludur
- WhatsApp/Telegram onboarding için
fly ssh consolekullanın - Kalıcı veriler
/datakonumundaki birimde bulunur - Signal, Java + signal-cli gerektirir; özel bir imaj kullanın ve belleği 2 GB+ tutun.
Maliyet
Önerilen yapılandırmayla (shared-cpu-2x, 2 GB RAM):
- Kullanıma bağlı olarak yaklaşık ayda 10-15 ABD doları
- Ücretsiz katman bir miktar kullanım hakkı içerir
Ayrıntılar 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'ı güncel tutun: Güncelleme