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

  1. Repoyu klonlayın → fly.toml dosyasını özelleştirin
  2. Uygulama + volume oluşturun → secret’ları ayarlayın
  3. fly deploy ile dağıtın
  4. 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ği OPENCLAW_GATEWAY_TOKEN kullanır, ancak gateway.auth.password veya doğru yapılandırılmış local loopback olmayan bir trusted-proxy dağı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.json dışı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:

    1. ngrok tüneli - ngrok'u konteyner içinde veya sidecar olarak çalıştırın
    2. Tailscale Funnel - Belirli yolları Tailscale üzerinden açığa çıkarın
    3. 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 console kullanın
    • Kalıcı veriler /data konumundaki 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

    İlgili