Cara Self-Host Rakazo di VPS dengan Docker Compose
Pelajari cara menjalankan Rakazo di VPS dengan Node 22, pnpm, Postgres, Graphile Worker, Docker Compose, pilihan sandbox, pengelolaan kunci, dan kebutuhan sumber daya.
Apa yang sebenarnya dijalankan oleh self-hosting Rakazo
Self-hosting Rakazo berarti menjalankan lima komponen pada satu server Linux: PostgreSQL, proses Graphile Worker, API, aplikasi web, dan satu container sandbox untuk setiap bot yang aktif. Rakazo adalah alternatif open-source untuk Grok Bot yang diterbitkan oleh elie222 di bawah lisensi Apache 2.0. Setiap bot memiliki thread, komputer, memori, dan riwayatnya sendiri. Bot juga dapat membuat peer atau subagent yang berumur singkat.
Bagian terakhir itulah alasan Rakazo sebaiknya dijalankan pada VPS (virtual private server), bukan desktop. Bot yang menyimpan memori dan menjalankan tugas terjadwal harus tetap dapat dijangkau saat Anda tidur. Laptop yang masuk mode suspend akan menghentikan antrean.
Per Agustus 2026, Rakazo masih berada pada tahap beta awal. Jadi, anggap ini sebagai setup yang dapat digunakan, bukan appliance yang sudah selesai. Seluruh stack menggunakan TypeScript: React 19 dan Vite untuk aplikasi web, Hono untuk API, Postgres dengan Prisma, Better Auth untuk akun, dan Graphile Worker untuk job latar belakang. Graphile Worker menyimpan antreannya di dalam Postgres. Jadi, Anda tidak perlu menjalankan Redis atau penyimpanan data kedua. .env.example menetapkan WAKEUP_DRIVER=graphile, yang berarti bot yang aktif kembali diproses sebagai job berbasis Postgres. Jika Postgres dihentikan, semua tindakan bot terjadwal ikut berhenti. Jika Anda lebih memilih merakit agent dari berbagai komponen daripada menjalankan produk pihak lain, membangun agent sendiri dari berbagai komponen adalah pilihan lainnya.
Mengapa paket 1 GB tidak akan cukup
Hitung jumlah prosesnya. Postgres adalah satu proses. API adalah proses Node. Worker adalah proses kedua. Aplikasi web adalah proses ketiga. Supervisor sandbox adalah proses keempat. Selain itu, setiap bot yang berjalan mendapatkan container yang berisi desktop Linux grafis dan browser.
Dokumentasi self-host proyek ini memberikan satu angka yang realistis: mesin dengan 2 vCPU dan 4 GB cukup untuk API, worker, dan Postgres ketika E2B mengelola desktop bot. Angka tersebut hanya berlaku untuk control plane, sementara bagian yang membutuhkan banyak sumber daya di-host di tempat lain. Jika SANDBOX_PROVIDER=docker diaktifkan, desktop tersebut dipindahkan ke VPS Anda. Dengan demikian, 4 GB menjadi batas minimum, bukan target. Mulailah dengan 8 GB jika Anda berencana menjaga lebih dari satu bot tetap aktif. Ukur penggunaan sebenarnya dengan docker stats saat bot bekerja. Browser di dalam sandbox adalah faktor yang paling memengaruhi penggunaan memori, sehingga spesifikasi server saja tidak dapat memberi jawaban yang akurat. Untuk metode umum dalam menentukan ukuran server untuk pekerjaan agen, berapa RAM dan CPU yang sebenarnya dibutuhkan VPS agen menjelaskan pengukuran tersebut secara rinci.
Satu pengaturan mencegah penggunaan sumber daya ini terus meningkat. .env.example menyediakan SANDBOX_IDLE_MS=600000 dengan komentar bahwa pengaturan tersebut akan menjeda komputer E2B, atau menghentikan komputer Docker, setelah mencapai jumlah milidetik tanpa aktivitas tersebut. Setelah tidak aktif selama sepuluh menit, komputer akan dihapus. Nilai minimum yang diterima adalah 30000. Tanpa pengaturan ini, setiap bot yang pernah Anda buka akan terus menggunakan memori.
Kapasitas disk juga harus diperhitungkan. Image sandbox, modul Node, dan volume Postgres menggunakan disk yang sama. Karena itu, 40 GB adalah titik awal yang wajar.
Pin versi sebelum melakukan clone
Rakazo berkembang cepat dan main bukan merupakan rilis. Per 16 August 2026, repositori tersebut hanya memiliki satu tag, v0.1.0-beta, yang diterbitkan pada 13 August 2026 dan ditandai sebagai prerelease.
git clone https://github.com/elie222/rakazo.git
cd rakazo
git checkout 53b119a68d9ef843d23aa3b7e3719b6be7b51fdb
git log -1 --format='%H %ci'Commit tersebut adalah commit yang ditunjuk oleh v0.1.0-beta. Pin commit, bukan branch atau tag. Branch dapat berubah pada git pull berikutnya, sedangkan tag adalah label yang dapat dipindahkan dan diarahkan ulang oleh maintainer. Karena itu, keduanya tidak mengidentifikasi tree yang dapat Anda gunakan kembali. Identifier commit tidak dapat berubah. Catat identifier tersebut bersama informasi server lainnya. Jika upgrade menyebabkan masalah, perbaikan murahnya adalah git checkout <old commit> dan melakukan rebuild. Cara ini hanya berhasil jika Anda mengetahui commit yang sebelumnya berfungsi.
Persyaratan: Node 22, pnpm 9, dan Docker
node -v
pnpm -v
docker --versionpackage.json mendeklarasikan "engines": { "node": ">=22" } dan "packageManager": "pnpm@9.15.0", sehingga node -v harus mencetak v22 atau yang lebih tinggi. Paket Node dalam arsip Ubuntu biasanya lebih lama dari versi tersebut, jadi instal dari NodeSource atau nvm. pnpm disertakan bersama Node melalui corepack:
corepack enable
corepack prepare pnpm@9.15.0 --activateDocker Engine dan plugin compose sudah mencakup kebutuhan lainnya, dan pengguna Anda harus dapat mengakses daemon tersebut. Jika docker ps menghasilkan permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock, tambahkan pengguna Anda ke grup docker lalu buka shell login baru. Pahami terlebih dahulu hak akses yang diberikan: keanggotaan dalam docker setara dengan akses root pada mesin, karena siapa pun dalam grup tersebut dapat menjalankan container yang memasang filesystem host.
Konfigurasikan .env, lalu jalankan Postgres
cp .env.example .env
chmod 600 .envDua nilai harus diubah sebelum apa pun dapat diakses melalui jaringan. .env.example menyertakan BETTER_AUTH_SECRET=replace-with-32-plus-character-secret dan ENCRYPTION_KEY=replace-with-64-char-hex-or-passphrase. Rakazo menolak nilai placeholder tersebut di luar lingkungan pengembangan. Dengan demikian, deployment yang belum dikonfigurasi sepenuhnya gagal secara jelas, bukan berjalan menggunakan secret yang dipublikasikan di repositori.
openssl rand -base64 48
openssl rand -hex 32Selanjutnya, jalankan database secara terpisah dan jalankan migration.
docker compose --env-file .env -f infra/compose/docker-compose.yml up postgres -d
pnpm install
pnpm db:generate
pnpm db:migrate
pnpm sandbox:buildpnpm sandbox:build membangun image komputer bot, yang didefinisikan dalam package.json sebagai docker build -t rakazo/computer:local infra/sandboxes/computer. Image ini memiliki antarmuka grafis, sehingga proses build pertama mengunduh banyak data dan memerlukan waktu. Pastikan image tersebut berhasil dibuat dengan docker image ls rakazo/computer. Perintah ini seharusnya mencetak satu baris.
File compose memublikasikan Postgres sebagai 127.0.0.1:5433:5432, yang hanya dapat diakses melalui loopback. Biarkan konfigurasi tersebut. Kredensial pengembangan adalah rakazo:rakazo dan tersedia di repositori. Port Postgres yang dapat dijangkau dari Internet dengan password yang dipublikasikan akan ditemukan scanner dalam hitungan jam. File compose produksi menggunakan POSTGRES_PASSWORD, jadi tetapkan nilai tersebut ke string acak saat Anda sampai pada tahap itu.
Menjalankan untuk pertama kali
pnpm devPerintah tersebut menjalankan empat komponen: API pada port 3100, Graphile Worker, aplikasi web Vite pada port 5173, dan supervisor sandbox pada port 7091. Aplikasi tersedia di http://127.0.0.1:5173, dan Anda akan melihat halaman masuk.
Pada VPS, Anda tidak berada langsung di mesin tersebut. Anda juga tidak boleh mempublikasikan port 5173 untuk mengaksesnya. Teruskan port melalui SSH (secure shell) dari mesin Anda sendiri.
ssh -L 5173:127.0.0.1:5173 -L 3100:127.0.0.1:3100 you@your-serverPerhatikan perbedaan antara kedua cara menjalankannya. pnpm dev menjalankan Vite pada host dan mengikatnya secara lokal. Service web dalam file compose mempublikasikan 5173:5173 pada semua interface. Jika Anda menjalankan seluruh stack compose pengembangan pada VPS publik, aplikasi akan terekspos. Karena itu, gunakan file produksi dan reverse proxy-nya untuk layanan apa pun yang tetap berjalan.
Penyedia sandbox mana yang aman di server?
Ini adalah satu-satunya pengaturan yang harus dikonfigurasi dengan benar. SANDBOX_PROVIDER di .env menerima empat nilai.
dockeradalah nilai default. Setiap bot mendapatkan container sendiri pada mesin Anda, yang dibuat dari image yang dihasilkan olehpnpm sandbox:build. Ini adalah setup self-hosted yang paling cepat.e2bmenjalankan komputer bot di E2B dan memerlukanE2B_API_KEY. Proyek ini merekomendasikannya untuk deployment publik atau multi-pengguna karena komputer bot tetap terpisah dari host yang menjalankan API dan database Anda.desktopmenjalankan command bot langsung pada host API dan worker. Instruksi repositori ini tegas: jangan gunakan opsi ini pada server publik atau server bersama.fakeadalah emulator in-process untuk pengujian. Opsi ini bukan runtime.
Pahami peringatan tentang mode desktop secara harfiah. Dalam mode desktop, tidak ada batas isolasi sama sekali. Bot menjalankan shell command sebagai pengguna yang menjalankan proses API, dengan home directory pengguna tersebut, SSH key pengguna tersebut, kredensial cloud pengguna tersebut, dan .env pengguna tersebut. Teks dalam halaman web yang dibaca bot dapat menjadi command pada server Anda. Menggunakan mode desktop pada server dapat membuat bot menguasai kredensial Anda. Gunakan mode ini pada mesin yang Anda gunakan secara langsung, atau jangan gunakan sama sekali.
docker adalah batas isolasi nyata, tetapi tidak sempurna. Satu bot tidak dapat membaca file bot lain karena masing-masing memiliki container sendiri. Namun, supervisor yang membuat container tersebut memasang /var/run/docker.sock, dan penguasaan atas Docker socket host berarti penguasaan atas host. Karena itu, jaga supervisor tetap privat. .env.example mendokumentasikan SANDBOX_SUPERVISOR_TOKEN sebagai kredensial service terpisah yang bersifat opsional dan secara default menggunakan BETTER_AUTH_SECRET jika nilainya kosong. Artinya, membiarkan secret tersebut menggunakan placeholder-nya akan melindungi service pembuat container dengan string yang dapat dibaca siapa pun di GitHub. Tetapkan kedua nilai tersebut. Untuk pemisahan terkuat yang tersedia di sini, gunakan e2b, atau berikan Rakazo sebuah mesin yang tidak menyimpan apa pun selain itu. Inilah alasan yang sama di balik menjalankan coding agent dalam VM sekali pakai: cara termurah untuk menghadapi agent yang melakukan kesalahan adalah memastikan mesin yang digunakannya tidak memiliki nilai apa pun.
Di mana kunci API model disimpan?
Rakazo tidak menyediakan penagihan model terkelola. Anda harus menyediakan kuncinya sendiri. .env.example menetapkan PI_DEFAULT_PROVIDER=openrouter, sehingga OPENROUTER_API_KEY adalah tempat yang umum digunakan, dan kunci provider berfungsi melalui pengaturan yang sama.
Simpan kunci di .env dan jangan masukkan ke file apa pun yang Anda commit. Kedua perintah compose di repositori meneruskan --env-file .env, sehingga nilainya sampai ke container tanpa pernah ditulis ke YAML yang dilacak oleh git. Anda juga dapat membiarkan OPENROUTER_API_KEY kosong lalu menempelkan kunci di aplikasi saat onboarding. Ini adalah alasan lain ENCRYPTION_KEY harus menggunakan nilai acak yang sebenarnya, bukan placeholder bawaan.
Tetapkan batas pengeluaran untuk kunci tersebut di provider sebelum bot menggunakannya. Bot yang mengalami loop akan terus mengeluarkan biaya, dan batas per kunci adalah satu-satunya penghentian yang tidak bergantung pada pemantauan Anda. Beri kunci ini nama khusus agar Anda dapat mencabutnya tanpa memengaruhi kunci lain.
Beralih dari mode pengembangan ke konfigurasi yang dapat dibiarkan berjalan
Repositori ini menyediakan file compose untuk produksi yang menjalankan Postgres, API, worker, aplikasi web, dan Caddy untuk sertifikat TLS (keamanan lapisan transport) yang diperolehnya secara otomatis. Konfigurasi ini mengharuskan Anda menggunakan E2B untuk komputer bot.
sudo DEPLOY_USER=deploy bash infra/compose/harden-host.sh
docker compose --env-file .env -f infra/compose/docker-compose.prod.yml up -d --buildharden-host.sh menonaktifkan login SSH menggunakan kata sandi, menetapkan aturan UFW (uncomplicated firewall) untuk SSH, HTTP, dan HTTPS, mengaktifkan fail2ban, serta menerapkan profil AppArmor. Baca file tersebut sebelum menjalankannya karena file tersebut mengubah cara Anda login. Biarkan sesi SSH kedua tetap terbuka saat proses berjalan.
.env produksi memerlukan lebih banyak hal daripada konfigurasi pengembangan. Dokumentasi self-host mencantumkan persyaratan minimum berikut.
NODE_ENV=production
RAKAZO_HOST=app.example.com
BETTER_AUTH_URL=https://app.example.com
WEB_ORIGIN=https://app.example.com
API_URL=https://app.example.com
POSTGRES_PASSWORD=<random>
BETTER_AUTH_SECRET=<random>
ENCRYPTION_KEY=<random>
E2B_API_KEY=<your key>
OPENROUTER_API_KEY=<your key>
SANDBOX_PROVIDER=e2b
AGENT_RUNTIME=pi
DATA_DIR=/dataArahkan A record ke server sebelum up pertama dijalankan. Caddy meminta sertifikat untuk nama dalam RAKAZO_HOST, dan permintaan tersebut gagal jika nama itu tidak mengarah ke server ini atau jika port 80 tertutup dari luar.
Tetapkan juga SIGNUP_ALLOWLIST=you@example.com. SIGNUPS_ENABLED=true adalah nilai default. Artinya, instance dengan nama publik menerima pendaftaran dari siapa pun yang menemukannya, dan setiap akun baru mendapatkan sebuah komputer. Gunakan allowlist terlebih dahulu. Anda dapat melonggarkannya nanti jika diperlukan.
Anggap docs/self-host.md dalam repositori sebagai sumber kebenaran untuk pengaturan produksi karena isinya berubah mengikuti kode, sedangkan panduan ini tidak. Karena Compose yang menjalankan prosesnya, aturan umum tetap berlaku, dan dasar-dasar Docker Compose untuk VPS menjelaskan mengapa --env-file dan named volumes menjadi lebih penting setelah sebuah stack dibiarkan berjalan selama berbulan-bulan.
Cadangan
Postgres dan direktori data/ mencakup seluruh instance.
./scripts/backup.sh
./scripts/restore.sh backups/BACKUP_TIMESTAMPbackup.sh mencadangkan Postgres dan mengarsipkan data/. Untuk mesin yang menjadi dependensi Anda, instal infra/compose/backup-prod.sh sebagai /usr/local/sbin/rakazo-backup dengan timer yang disediakan repositori agar rotasi berjalan otomatis. Cadangan yang berada pada disk yang sama dengan database bukanlah cadangan, jadi salin cadangan tersebut ke server lain. Kemudian, lakukan pemulihan satu kali pada server cadangan sebelum Anda membutuhkannya.
Penyebab kegagalan dan hal yang akan Anda lihat
pnpm db:migrate tidak dapat menjangkau database. Migrasi melaporkan bahwa server database pada 127.0.0.1:5433 tidak dapat dijangkau. Container Postgres mungkin belum berjalan, atau sudah berjalan tetapi belum siap. Jalankan docker compose --env-file .env -f infra/compose/docker-compose.yml ps dan pastikan service postgres berstatus healthy, karena compose file menetapkan health check yang berjalan setiap tiga detik. Container yang terus-menerus restart biasanya menunjukkan bahwa volume pgdata dibuat dengan kredensial yang berbeda. docker compose ... down -v menghapus volume tersebut beserta datanya.
Port sudah digunakan. Menjalankan Postgres gagal dengan bind: address already in use jika proses lain menggunakan port 5433. Penyebab yang paling sering adalah stack Rakazo sebelumnya yang belum dihentikan. sudo ss -lntp | grep 5433 menampilkan nama proses tersebut.
Bot tidak pernah mendapatkan komputer. Jika SANDBOX_PROVIDER=docker dijalankan tanpa image rakazo/computer:local, tidak ada yang dapat dijalankan. docker image ls rakazo/computer menjawabnya dalam satu baris, dan pnpm sandbox:build memperbaikinya. Jika supervisor tidak dapat mengakses Docker socket, supervisor juga tidak dapat membuat container. Pesan error akan menyebutkan path-nya: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock.
Perintah yang panjang berhenti di tengah jalan. .env.example menetapkan SANDBOX_COMMAND_TIMEOUT_MS=300000, sehingga satu perintah di dalam komputer bot dihentikan setelah lima menit. Naikkan nilai tersebut untuk build yang lambat, bukan langsung menganggap sandbox mengalami crash.
pnpm install gagal dengan cara yang membingungkan. Periksa node -v terlebih dahulu. Workspace menetapkan >=22, sedangkan Node versi lama biasanya gagal di dalam kode dependency tanpa menampilkan pesan tentang versi.
Sign-in berhasil secara lokal, tetapi gagal melalui domain. BETTER_AUTH_URL, WEB_ORIGIN, dan API_URL semuanya harus menggunakan public origin yang sama dengan address bar, termasuk scheme. http://127.0.0.1:5173 yang masih tersisa pada salah satunya biasanya menyebabkan session tidak pernah bertahan.
Memperbarui checkout yang dipatok
Jalur upgrade dalam dokumentasi self-host cukup singkat: ambil source terbaru, jalankan migrasi database, lalu restart API dan worker.
./scripts/backup.sh
git fetch --all
git checkout NEW_COMMIT_SHA
pnpm install
pnpm --filter @rakazo/db migrate
docker compose --env-file .env -f infra/compose/docker-compose.prod.yml up -d --buildBuat cadangan terlebih dahulu. Migrasi berjalan ke depan, dan versi beta tidak menyediakan jalur pembalikan yang dapat diandalkan. Baca commit antara SHA yang dipatok dan SHA baru sebelum menerapkannya, karena project yang masih sangat baru seperti ini dapat mengganti nama variabel lingkungan tanpa pemberitahuan, dan variabel yang hilang dapat menyebabkan service start lalu langsung berhenti. Jika Anda masih menentukan apakah Rakazo memang tepat untuk dijalankan, rangkuman agen AI self-hosted membahas pilihan lain dalam kategori ini serta biaya untuk mempertahankan masing-masing agen tetap berjalan.
FAQ
Apakah Rakazo dapat dijalankan pada VPS 1 GB?
Tidak. Postgres, API, worker, sandbox supervisor, dan aplikasi web berjalan secara bersamaan. Dengan SANDBOX_PROVIDER=docker, setiap bot yang aktif menambahkan sebuah container yang memuat desktop grafis dan browser. Dokumentasi proyek menyebutkan bahwa 2 vCPU dan 4 GB cukup untuk API, worker, dan Postgres hanya jika E2B menyediakan desktop bot. Anggap 4 GB sebagai kapasitas minimum untuk control plane. Gunakan kapasitas yang lebih besar jika desktop dijalankan pada mesin Anda.
Apakah penyedia sandbox desktop aman digunakan pada server?
Tidak. desktop menjalankan perintah bot secara langsung pada host API dan worker, sebagai pengguna yang menjalankan proses tersebut. File dan kredensial pengguna itu juga dapat diakses. Repositori menyatakan bahwa fitur ini tidak boleh digunakan pada server publik atau server bersama. Gunakan docker untuk satu container per bot, atau e2b jika lebih dari satu orang akan masuk.
Versi Rakazo mana yang harus saya instal?
Per 16 August 2026, hanya ada satu tag, yaitu v0.1.0-beta, yang diterbitkan pada 13 August 2026 dan ditandai sebagai prerelease. Checkout commit yang dirujuk oleh tag tersebut, yaitu 53b119a68d9ef843d23aa3b7e3719b6be7b51fdb, bukan mengikuti main. Branch dapat berubah setelah Anda menggunakannya, dan tag dapat diarahkan ulang. Karena itu, keduanya tidak menjamin identitas tree yang dapat Anda gunakan untuk kembali ke versi yang sama. Catat commit tersebut, karena rollback hanya dapat dilakukan jika Anda mengetahui commit yang pernah berfungsi.
Di mana saya harus menyimpan OpenRouter API key?
Simpan di .env sebagai OPENROUTER_API_KEY, dan jangan pernah menyimpannya dalam compose file yang Anda commit. Kedua perintah compose di repositori meneruskan --env-file .env, sehingga nilainya masuk ke container tanpa ditulis ke dalam YAML yang dilacak. Anda juga dapat membiarkannya kosong dan menempelkan key di aplikasi selama onboarding. Tetapkan batas pengeluaran untuk key tersebut di penyedia layanan. Bot yang berjalan dalam loop akan terus memanggil model sampai ada sesuatu yang menghentikannya.
Apakah saya memerlukan nama domain dan TLS?
Untuk penggunaan selain pengujian awal, ya. Production compose file menjalankan Caddy dan memperoleh sertifikat secara otomatis. Selain itu, RAKAZO_HOST, BETTER_AUTH_URL, WEB_ORIGIN, dan API_URL harus semuanya menggunakan origin HTTPS publik yang sama. Untuk pengujian awal, Anda dapat melewati penggunaan domain. Jalankan pnpm dev dan teruskan port 5173 melalui SSH, bukan memublikasikannya.