Hosting
Fly.io
Tujuan: Gateway OpenClaw berjalan pada mesin Fly.io dengan penyimpanan persisten, HTTPS otomatis, dan akses Discord/saluran.
Yang Anda perlukan
- CLI flyctl terinstal
- Akun Fly.io (tingkat gratis dapat digunakan)
- Autentikasi model: kunci API untuk penyedia model yang Anda pilih
- Kredensial saluran: token bot Discord, token Telegram, dan sebagainya.
Jalur cepat untuk pemula
- Kloning repositori, sesuaikan
fly.toml - Buat aplikasi + volume, atur rahasia
- Deploy dengan
fly deploy - Masuk melalui SSH untuk membuat konfigurasi, atau gunakan UI Kontrol
Buat aplikasi Fly
git clone https://github.com/openclaw/openclaw.gitcd openclaw # pilih nama Anda sendirifly apps create my-openclaw # 1GB biasanya cukupfly volumes create openclaw_data --size 1 --region iadPilih wilayah yang dekat dengan Anda. Opsi umum: lhr (London), iad (Virginia), sjc (San Jose).
Konfigurasikan fly.toml
Edit fly.toml agar sesuai dengan nama aplikasi dan kebutuhan Anda. fly.toml yang dilacak dalam repositori adalah templat publik yang ditampilkan di bawah; deploy/fly.private.toml adalah varian yang diperketat tanpa IP publik (lihat Deployment privat).
app = "my-openclaw" # nama aplikasi Andaprimary_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"Titik masuk image Docker OpenClaw adalah tini, yang secara default menjalankan node openclaw.mjs gateway. [processes] Fly menggantikan CMD Docker (di sini menjalankan node dist/index.js gateway ... secara langsung, titik masuk terkompilasi yang sama) tanpa mengubah ENTRYPOINT, sehingga proses tetap berjalan sebagai tini.
Pengaturan utama:
| Pengaturan | Alasan |
|---|---|
--bind lan |
Mengikat ke 0.0.0.0 agar proksi Fly dapat menjangkau gateway |
--allow-unconfigured |
Memulai tanpa berkas konfigurasi (Anda membuatnya setelah itu) |
internal_port = 3000 |
Harus cocok dengan --port 3000 (atau OPENCLAW_GATEWAY_PORT) untuk pemeriksaan kesehatan Fly |
memory = "2048mb" |
512MB terlalu kecil; 2GB direkomendasikan |
OPENCLAW_STATE_DIR = "/data" |
Mempertahankan status pada volume |
Atur rahasia
# wajib: token autentikasi gateway untuk pengikatan non-loopbackfly secrets set OPENCLAW_GATEWAY_TOKEN=$(openssl rand -hex 32) # kunci API penyedia modelfly secrets set ANTHROPIC_API_KEY=example-anthropic-key-not-real # opsional: penyedia lainfly secrets set OPENAI_API_KEY=example-openai-key-not-realfly secrets set GOOGLE_API_KEY=... # token saluranfly secrets set DISCORD_BOT_TOKEN=example-discord-bot-tokenPengikatan non-loopback (--bind lan) memerlukan jalur autentikasi gateway yang valid. Contoh ini menggunakan OPENCLAW_GATEWAY_TOKEN, tetapi gateway.auth.password atau deployment proksi tepercaya non-loopback yang dikonfigurasi dengan benar juga memenuhi persyaratan. Lihat Pengelolaan rahasia untuk kontrak SecretRef.
Perlakukan token-token ini seperti kata sandi. Utamakan variabel lingkungan/fly secrets daripada berkas konfigurasi untuk kunci API dan token agar rahasia tidak masuk ke openclaw.json.
Deploy
fly deployDeployment pertama membangun image Docker. Verifikasi setelah deployment:
fly statusfly logsLog startup Gateway mencatat gateway ready setelah listener HTTP/WebSocket aktif. Pemeriksaan kesehatan Fly sendiri memantau internal_port = 3000 sesuai fly.toml; direktif HEALTHCHECK Docker pada image juga melakukan polling terhadap /healthz di port default 18789, yang tidak digunakan di sini karena deployment ini mengganti gateway menjadi --port 3000.
Buat berkas konfigurasi
Masuk ke mesin melalui SSH untuk membuat konfigurasi yang tepat:
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": {}}EOFDengan OPENCLAW_STATE_DIR=/data, jalur konfigurasi adalah /data/openclaw.json.
Ganti https://my-openclaw.fly.dev dengan origin aplikasi Fly Anda yang sebenarnya. Startup Gateway mengisi origin UI Kontrol lokal dari nilai runtime --bind dan --port agar boot pertama dapat dilanjutkan sebelum konfigurasi tersedia, tetapi akses browser melalui Fly tetap memerlukan origin HTTPS persis yang tercantum dalam gateway.controlUi.allowedOrigins.
Token Discord dapat berasal dari salah satu sumber berikut:
- Variabel lingkungan
DISCORD_BOT_TOKEN(direkomendasikan untuk rahasia); tidak perlu menambahkannya ke konfigurasi, gateway membacanya secara otomatis - Berkas konfigurasi
channels.discord.token
Mulai ulang untuk menerapkan:
exitfly machine restart <machine-id>Akses Gateway
UI Kontrol
fly openAtau kunjungi https://my-openclaw.fly.dev/.
Lakukan autentikasi dengan rahasia bersama yang dikonfigurasi: token gateway dari OPENCLAW_GATEWAY_TOKEN, atau kata sandi Anda jika Anda beralih ke autentikasi kata sandi.
Log
fly logs # log langsungfly logs --no-tail # log terbaruKonsol SSH
fly ssh consolePemecahan masalah
"Aplikasi tidak mendengarkan pada alamat yang diharapkan"
Gateway terikat ke 127.0.0.1, bukan 0.0.0.0.
Perbaikan: tambahkan --bind lan ke perintah proses Anda dalam fly.toml.
Pemeriksaan kesehatan gagal / koneksi ditolak
Fly tidak dapat menjangkau gateway pada port yang dikonfigurasi.
Perbaikan: pastikan internal_port cocok dengan port gateway (--port 3000 atau OPENCLAW_GATEWAY_PORT=3000).
Masalah OOM / memori
Kontainer terus dimulai ulang atau dihentikan. Tandanya: SIGABRT, v8::internal::Runtime_AllocateInYoungGeneration, atau mulai ulang tanpa pesan.
Perbaikan: tingkatkan memori dalam fly.toml:
[[vm]] memory = "2048mb"Atau perbarui mesin yang sudah ada:
fly machine update <machine-id> --vm-memory 2048 -y512MB terlalu kecil. 1GB mungkin dapat digunakan, tetapi bisa mengalami OOM saat beban tinggi atau dengan pencatatan log mendetail. 2GB direkomendasikan.
Masalah kunci Gateway
Gateway menolak dimulai dengan galat "sudah berjalan" setelah kontainer dimulai ulang.
Berkas kunci runtime berada di <tmpdir>/openclaw-<uid>/gateway.<hash>.lock
dan gateway.state.<hash>.lock (Linux:
/tmp/openclaw-<uid>/gateway.*.lock), bukan pada volume persisten /data, sehingga
mulai ulang kontainer secara penuh biasanya menghapusnya bersama seluruh
sistem berkas kontainer lainnya. Jika kunci tetap ada (misalnya fly machine restart
yang mempertahankan sistem berkas kontainer) dan menghalangi startup, hapus
secara manual:
fly ssh console --command "rm -f /tmp/openclaw-*/gateway.*.lock"fly machine restart <machine-id>Konfigurasi tidak dibaca
--allow-unconfigured hanya melewati pengaman startup. Opsi ini tidak membuat atau memperbaiki /data/openclaw.json, jadi pastikan konfigurasi Anda yang sebenarnya tersedia dan menyertakan "gateway": { "mode": "local" } untuk startup gateway lokal normal.
Verifikasi bahwa konfigurasi tersedia:
fly ssh console --command "cat /data/openclaw.json"Menulis konfigurasi melalui SSH
fly ssh console -C tidak mendukung pengalihan shell. Untuk menulis berkas konfigurasi:
# echo + tee (salurkan dari lokal ke jarak jauh)echo '{"your":"config"}' | fly ssh console -C "tee /data/openclaw.json" # atau sftpfly sftp shell> put /local/path/config.json /data/openclaw.jsonfly sftp mungkin gagal jika berkas sudah tersedia; hapus terlebih dahulu:
fly ssh console --command "rm /data/openclaw.json"Status tidak dipertahankan
Jika profil autentikasi, status saluran/penyedia, atau sesi hilang setelah mulai ulang, direktori status ditulis ke sistem berkas kontainer, bukan ke volume.
Perbaikan: pastikan OPENCLAW_STATE_DIR=/data diatur dalam fly.toml, lalu deploy ulang.
Memperbarui
git pullfly deployfly statusfly logsgit pull + fly deploy adalah jalur yang diawasi di sini: jalur ini membangun ulang image dari Dockerfile, sehingga versi CLI/gateway, image OS dasar, dan semua perubahan Dockerfile diperbarui bersama-sama. openclaw update di dalam kontainer yang sedang berjalan bukanlah operasi yang sama karena image dikirim sebagai struktur dist/ yang dibangun dengan Docker tanpa checkout .git dan tanpa instalasi global yang dikelola npm untuk dideteksi; lihat Memperbarui untuk alur tersebut pada instalasi bergaya VM.
Memperbarui perintah mesin
Untuk mengubah perintah startup tanpa deployment ulang penuh:
fly machines listfly machine update <machine-id> --command "node dist/index.js gateway --port 3000 --bind lan" -y # atau dengan peningkatan memorifly machine update <machine-id> --vm-memory 2048 --command "node dist/index.js gateway --port 3000 --bind lan" -yfly deploy berikutnya mengatur ulang perintah mesin ke apa pun yang ada dalam fly.toml; terapkan kembali perubahan manual setelah melakukan deployment ulang.
Deployment privat (diperketat)
Secara default, Fly mengalokasikan IP publik sehingga gateway Anda dapat dijangkau di https://your-app.fly.dev dan ditemukan oleh pemindai internet (Shodan, Censys, dan sebagainya).
Gunakan deploy/fly.private.toml untuk deployment yang diperketat dengan tanpa IP publik: konfigurasi ini tidak menyertakan [http_service], sehingga tidak ada ingress publik yang dialokasikan.
Kapan menggunakan deployment privat
- Hanya panggilan/pesan keluar (tanpa webhook masuk)
- Terowongan ngrok atau Tailscale menangani semua panggilan balik webhook
- Gateway diakses melalui SSH, proksi, atau WireGuard, bukan melalui browser
- Deployment harus disembunyikan dari pemindai internet
Penyiapan
fly deploy -c deploy/fly.private.tomlAtau konversikan deployment yang sudah ada:
# tampilkan IP saat inifly ips list -a my-openclaw # lepaskan IP publikfly ips release <public-ipv4> -a my-openclawfly ips release <public-ipv6> -a my-openclaw # beralih ke konfigurasi privat agar deployment mendatang tidak mengalokasikan ulang IP publikfly deploy -c deploy/fly.private.toml # alokasikan IPv6 khusus privatfly ips allocate-v6 --private -a my-openclawSetelah ini, fly ips list seharusnya hanya menampilkan IP bertipe private:
VERSION IP TYPE REGIONv6 fdaa:x:x:x:x::x private globalMengakses deployment privat
Opsi 1: proksi lokal (paling sederhana)
fly proxy 3000:3000 -a my-openclaw# buka http://localhost:3000 di perambanOpsi 2: VPN WireGuard
fly wireguard create# impor ke klien WireGuard, lalu akses melalui IPv6 internal# contoh: http://[fdaa:x:x:x:x::x]:3000Opsi 3: hanya SSH
fly ssh console -a my-openclawWebhook dengan deployment privat
Untuk callback Webhook (Twilio, Telnyx, dan sebagainya) tanpa paparan publik:
- tunnel ngrok: jalankan ngrok di dalam kontainer, atau sebagai sidecar
- Tailscale Funnel: ekspos path tertentu melalui Tailscale
- Hanya keluar: beberapa penyedia (Twilio) berfungsi untuk panggilan keluar tanpa Webhook
Contoh konfigurasi panggilan suara dengan ngrok, di bawah plugins.entries.voice-call.config:
{ plugins: { entries: { "voice-call": { enabled: true, config: { provider: "twilio", tunnel: { provider: "ngrok" }, webhookSecurity: { allowedHosts: ["example.ngrok.app"], }, }, }, }, },}Tunnel ngrok berjalan di dalam kontainer dan menyediakan URL Webhook publik tanpa mengekspos aplikasi Fly itu sendiri. Atur webhookSecurity.allowedHosts ke nama host tunnel agar header host yang diteruskan dapat diterima.
Pertimbangan keamanan
| Aspek | Publik | Privat |
|---|---|---|
| Pemindai internet | Dapat ditemukan | Tersembunyi |
| Serangan langsung | Mungkin | Diblokir |
| Akses UI kontrol | Peramban | Proksi/VPN |
| Pengiriman Webhook | Langsung | Melalui tunnel |
Catatan
- Fly.io menggunakan arsitektur x86; Dockerfile kompatibel dengan x86 dan ARM.
- Untuk orientasi WhatsApp/Telegram, gunakan
fly ssh console. - Data persisten berada pada volume di
/data. - Signal memerlukan signal-cli (CLI berbasis Java) pada image; gunakan image khusus dan pertahankan memori sebesar 2GB+.
Biaya
Dengan konfigurasi yang direkomendasikan (shared-cpu-2x, RAM 2GB), perkirakan biaya sekitar $10-15/bulan tergantung penggunaan; tingkat gratis mencakup sebagian alokasi dasar. Lihat harga Fly.io untuk tarif saat ini.
Langkah berikutnya
- Siapkan saluran perpesanan: Saluran
- Konfigurasikan Gateway: Konfigurasi Gateway
- Pastikan OpenClaw tetap mutakhir: Memperbarui