Cara Self-host Rakazo AI Bot pada VPS Linux
Panduan lengkap menjalankan Rakazo menggunakan Node 22, pnpm, Postgres dan Graphile Worker dalam Docker Compose. Ketahui cara mengurus kunci API serta saiz VPS yang tepat.
Perkara yang sebenarnya dijalankan oleh Rakazo self-hosted
Self-hosting Rakazo bermaksud menjalankan lima perkara pada satu pelayan Linux: PostgreSQL, proses Graphile Worker, API, aplikasi web, dan satu bekas sandbox bagi setiap bot yang aktif. Rakazo ialah alternatif sumber terbuka kepada Grok Bot, yang diterbitkan oleh elie222 di bawah lesen Apache 2.0. Setiap bot mendapat thread sendiri, komputer sendiri, memori sendiri dan sejarah sendiri, serta ia boleh menjana peer atau subejen yang beroperasi untuk tempoh singkat.
Bahagian terakhir itulah sebabnya perkara ini perlu diletakkan pada VPS (virtual private server) dan bukannya pada desktop. Bot yang menyimpan memori dan menjalankan kerja berjadual perlu boleh dihubungi semasa anda tidur. Komputer riba yang memasuki mod gantung (suspend) akan menggugurkan baris gilir (queue).
Rakazo masih dalam peringkat beta awal setakat Ogos 2026, jadi anggaplah ini sebagai persediaan yang sedang berfungsi dan bukannya perkakas yang sudah siap. Keseluruhan stack menggunakan TypeScript: React 19 dan Vite untuk aplikasi web, Hono untuk API, Postgres dengan Prisma, Better Auth untuk akaun, dan Graphile Worker untuk tugasan latar belakang. Graphile Worker menyimpan baris gilirnya di dalam Postgres, jadi tiada Redis dan tiada storan data kedua yang perlu dijalankan. .env.example menetapkan WAKEUP_DRIVER=graphile, yang bermaksud bot yang bangun merupakan tugasan yang disokong oleh Postgres. Hentikan Postgres dan setiap tindakan bot berjadual akan terhenti bersamanya. Jika anda lebih suka memasang ejen daripada bahagian-bahagian tertentu berbanding menjalankan produk orang lain, membina ejen anda sendiri daripada komponen ialah laluan yang satu lagi.
Mengapa pelan 1 GB tidak mencukupi untuk ini
Kira proses yang terlibat. Postgres adalah satu. API ialah satu proses Node. Worker adalah yang kedua. Aplikasi web adalah yang ketiga. Penyelia sandbox adalah yang keempat. Kemudian, setiap bot yang berjalan akan mendapatkan satu kontena yang mengandungi desktop Linux grafik dan pelayar web.
Dokumentasi self-host projek ini memberikan satu angka yang jujur: mesin dengan 2 vCPU dan 4 GB RAM mencukupi untuk API, worker, dan Postgres apabila E2B menguruskan desktop bot tersebut. Itu adalah angka untuk control plane sahaja, dengan bahagian yang berat dihoskan di tempat lain. Tetapkan SANDBOX_PROVIDER=docker dan desktop tersebut akan berpindah ke VPS anda, jadi 4 GB menjadi tahap minimum dan bukannya sasaran. Mulakan dengan 8 GB jika anda bercadang untuk memastikan lebih daripada satu bot aktif, dan ukur angka sebenar dengan docker stats semasa bot sedang bekerja. Pelayar web di dalam sandbox adalah punca penggunaan memori meningkat, jadi helaian spesifikasi tidak akan memberitahu anda perkara ini. Untuk kaedah umum menentukan saiz pelayan bagi kerja ejen, berapa banyak RAM dan CPU yang sebenarnya diperlukan oleh VPS ejen menerangkan pengukuran tersebut secara terperinci.
Satu tetapan menghalang keadaan ini daripada menjadi lebih buruk. .env.example membekalkan SANDBOX_IDLE_MS=600000 dengan komen bahawa ia menjeda komputer E2B, atau menghentikan komputer Docker, selepas tempoh milisaat melahu tersebut. Selepas sepuluh minit melahu, komputer tersebut akan dibuang. Nilai minimum yang diterima ialah 30000. Tanpanya, setiap bot yang pernah anda buka akan terus menggunakan memori selama-lamanya.
Ruang cakera juga penting. Imej sandbox, modul Node, dan volum Postgres berkongsi satu cakera, jadi 40 GB adalah titik permulaan yang munasabah.
Tetapkan versi sebelum anda melakukan clone
Rakazo berkembang dengan pantas dan main bukanlah satu release. Setakat 16 Ogos 2026, repositori tersebut hanya mempunyai satu tag, iaitu v0.1.0-beta, yang diterbitkan pada 13 Ogos 2026 dan ditandakan 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 dirujuk oleh v0.1.0-beta. Tetapkan commit tersebut dan bukannya branch atau tag. Branch akan berubah di bawah kawalan anda pada git pull yang seterusnya, manakala tag ialah label boleh ubah yang boleh diubah hala oleh penyelenggara, jadi kedua-duanya tidak mengenal pasti tree yang boleh anda kembali semula. Pengecam commit tidak boleh berubah. Catatkan pengecam anda di sebelah fakta pelayan anda yang lain, kerana apabila naik taraf menyebabkan kerosakan, penyelesaian murahnya ialah git checkout <old commit> dan bina semula, dan itu hanya berkesan jika anda tahu commit mana yang berfungsi.
Keperluan: Node 22, pnpm 9, dan Docker
node -v
pnpm -v
docker --versionpackage.json mengisytiharkan "engines": { "node": ">=22" } dan "packageManager": "pnpm@9.15.0", jadi node -v mesti mencetak v22 atau lebih tinggi. Pakej Node dalam arkib Ubuntu biasanya lebih lama daripada itu, jadi pasang daripada NodeSource atau nvm. pnpm disertakan bersama Node melalui corepack:
corepack enable
corepack prepare pnpm@9.15.0 --activateDocker Engine berserta pemalam compose merangkumi selebihnya, dan pengguna anda perlu mempunyai akses kepada daemon tersebut. Jika docker ps menjawab permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock, tambahkan pengguna anda ke dalam kumpulan docker dan buka shell log masuk yang baharu. Ketahui perkara yang diberikan oleh kebenaran ini terlebih dahulu: keahlian dalam docker adalah setara dengan root pada mesin tersebut, kerana sesiapa sahaja dalam kumpulan itu boleh memulakan container yang melekapkan (mount) sistem fail hos.
Konfigurasi .env, kemudian mulakan Postgres
cp .env.example .env
chmod 600 .envDua nilai mesti ditukar sebelum sebarang komponen didedahkan kepada rangkaian. .env.example membekalkan BETTER_AUTH_SECRET=replace-with-32-plus-character-secret dan ENCRYPTION_KEY=replace-with-64-char-hex-or-passphrase. Rakazo menolak nilai pemegang tempat tersebut di luar persekitaran pembangunan, jadi penggunaan yang dikonfigurasikan separuh jalan akan gagal dengan jelas dan bukannya berjalan menggunakan rahsia yang diterbitkan dalam repositori.
openssl rand -base64 48
openssl rand -hex 32Kemudian, naikkan pangkalan data secara berasingan dan jalankan migrasi.
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 membina imej komputer bot, yang ditakrifkan dalam package.json sebagai docker build -t rakazo/computer:local infra/sandboxes/computer. Ia merupakan imej grafik, jadi binaan pertama akan memuat turun banyak data dan mengambil masa. Sahkan ia telah dimuat turun dengan docker image ls rakazo/computer, yang sepatutnya memaparkan satu baris.
Fail compose menerbitkan Postgres sebagai 127.0.0.1:5433:5432, yang hanya terhad kepada loopback. Biarkan ia dalam keadaan tersebut. Kelayakan pembangunan adalah rakazo:rakazo, ia berada dalam repositori, dan port Postgres yang boleh dicapai dari internet dengan kata laluan yang diterbitkan akan ditemui oleh pengimbas dalam masa beberapa jam. Fail compose pengeluaran membaca POSTGRES_PASSWORD sebagai ganti, jadi tetapkan nilai tersebut kepada rentetan rawak apabila anda sampai ke tahap itu.
Jalankan kali pertama
pnpm devPerintah tersebut memulakan empat perkara: API pada port 3100, Graphile Worker, aplikasi web Vite pada 5173, dan penyelia sandbox pada 7091. Aplikasi tersebut berada di http://127.0.0.1:5173, dan anda sepatutnya melihat halaman daftar masuk.
Pada VPS, anda tidak berada di hadapan mesin tersebut, dan anda tidak seharusnya menerbitkan port 5173 untuk mengaksesnya. Sebaliknya, lakukan port forwarding 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-serverBerhati-hati dengan perbezaan antara dua cara menjalankan ini. pnpm dev menjalankan Vite pada hos, terikat secara setempat. Perkhidmatan web dalam fail compose menerbitkan 5173:5173, pada setiap antaramuka. Jika anda menghidupkan keseluruhan stack pembangunan compose pada VPS awam, aplikasi tersebut akan terdedah. Oleh itu, gunakan fail pengeluaran (production) dan reverse proxy-nya untuk sebarang perkhidmatan yang anda biarkan berjalan.
Penyedia sandbox manakah yang selamat digunakan pada pelayan?
Ini adalah satu tetapan yang perlu dilakukan dengan betul. SANDBOX_PROVIDER dalam .env menerima empat nilai.
dockerialah tetapan lalai. Setiap bot mendapat kontena sendiri pada mesin anda, dibina daripada imej yang dihasilkan olehpnpm sandbox:build. Ini adalah persediaan self-hosted yang paling pantas.e2bmenjalankan komputer bot pada E2B dan memerlukanE2B_API_KEY. Projek ini mengesyorkannya untuk penggunaan awam atau berbilang pengguna, kerana ia mengasingkan komputer bot daripada hos yang menjalankan API dan pangkalan data anda.desktopmenjalankan arahan bot secara terus pada hos API dan worker. Arahan dalam repositori adalah jelas: jangan gunakannya pada pelayan awam atau pelayan yang dikongsi.fakeialah emulator dalam proses untuk ujian. Ia bukan runtime.
Ambil amaran desktop tersebut secara literal. Dalam mod desktop, tiada sempadan pengasingan langsung, jadi bot menjalankan arahan shell sebagai pengguna yang menjalankan proses API, dengan direktori home pengguna tersebut, kunci SSH pengguna tersebut, kelayakan cloud pengguna tersebut dan .env pengguna tersebut. Teks dalam halaman web yang dibaca oleh bot akan menjadi arahan pada pelayan anda. Mod desktop pada pelayan adalah punca bot boleh memperoleh kelayakan anda. Gunakannya pada mesin yang anda gunakan sendiri, atau jangan gunakannya langsung.
docker ialah sempadan sebenar namun tidak sempurna. Satu bot tidak boleh membaca fail bot lain, kerana setiap satunya mempunyai kontena sendiri. Walau bagaimanapun, penyelia yang mencipta kontena tersebut melekapkan /var/run/docker.sock, dan kawalan ke atas Docker socket hos bermakna kawalan ke atas hos tersebut. Jadi, pastikan penyelia tersebut kekal peribadi. .env.example mendokumentasikan SANDBOX_SUPERVISOR_TOKEN sebagai kelayakan servis berasingan pilihan yang ditetapkan kepada BETTER_AUTH_SECRET secara lalai apabila kosong, yang bermaksud membiarkan rahsia tersebut pada pemegang tempatnya akan melindungi servis pencipta kontena dengan rentetan yang boleh dibaca oleh sesiapa sahaja di GitHub. Tetapkan kedua-dua nilai tersebut. Untuk pengasingan paling kuat yang tersedia di sini, gunakan e2b, atau berikan Rakazo sebuah mesin yang tidak menyimpan apa-apa perkara lain. Itu adalah alasan yang sama di sebalik menjalankan ejen pengekodan dalam VM pakai buang: cara paling murah untuk bertahan sekiranya ejen melakukan kesilapan adalah dengan memastikan mesin tersebut tidak mempunyai sebarang nilai.
Di manakah kunci API model diletakkan?
Rakazo tidak mempunyai pengebilan model terurus. Anda perlu menyediakan kunci sendiri. .env.example menetapkan PI_DEFAULT_PROVIDER=openrouter, jadi OPENROUTER_API_KEY ialah lokasi biasa, dan kunci pembekal berfungsi melalui tetapan yang sama.
Simpan kunci dalam .env dan jangan masukkan ke dalam mana-mana fail yang anda komit. Kedua-dua arahan compose dalam repositori menghantar --env-file .env, jadi nilai tersebut sampai ke dalam kontena tanpa perlu ditulis ke dalam YAML yang dijejaki oleh git. Anda juga boleh membiarkan OPENROUTER_API_KEY kosong dan menampal kunci dalam aplikasi semasa proses onboarding, yang merupakan satu lagi sebab mengapa ENCRYPTION_KEY memerlukan nilai rawak sebenar dan bukannya pemegang tempat (placeholder) lalai.
Tetapkan had perbelanjaan pada kunci di pihak pembekal sebelum bot menggunakannya. Bot yang terperangkap dalam gelung (loop) akan terus berbelanja, dan had bagi setiap kunci adalah satu-satunya cara untuk menghentikannya tanpa bergantung pada pemantauan anda. Berikan nama khusus untuk kunci ini supaya anda boleh membatalkannya secara berasingan.
Beralih daripada mod pembangunan kepada persekitaran produksi
Repositori ini membekalkan fail compose produksi yang menjalankan Postgres, API, worker, aplikasi web, dan Caddy untuk sijil TLS (transport layer security) yang diperoleh secara automatik. Ia memerlukan 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 melumpuhkan log masuk kata laluan SSH, menetapkan peraturan UFW (uncomplicated firewall) untuk SSH, HTTP dan HTTPS, menghidupkan fail2ban serta menggunakan profil AppArmor. Baca skrip tersebut sebelum menjalankannya, kerana ia mengubah cara anda log masuk. Pastikan sesi SSH kedua dibuka semasa skrip dijalankan.
.env produksi memerlukan lebih banyak sumber berbanding versi pembangunan. Dokumen self-host menyenaraikan keperluan minimum ini.
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=/dataHalakan rekod A ke pelayan sebelum up pertama dijalankan. Caddy akan meminta sijil untuk nama yang dinyatakan dalam RAKAZO_HOST, dan permintaan tersebut akan gagal jika nama itu tidak diselesaikan kepada pelayan ini atau jika port 80 ditutup daripada akses luar.
Tetapkan juga SIGNUP_ALLOWLIST=you@example.com. SIGNUPS_ENABLED=true ialah tetapan lalai, jadi instans pada nama domain awam akan menerima pendaftaran daripada sesiapa sahaja yang menemuinya, dan setiap akaun baharu akan mendapat sebuah komputer. Gunakan senarai putih (allowlist) terlebih dahulu. Anda boleh melonggarkannya kemudian jika perlu.
Jadikan docs/self-host.md dalam repositori sebagai rujukan utama untuk tetapan produksi, kerana ia berubah mengikut kod dan panduan ini mungkin tidak dikemas kini. Memandangkan Compose menguruskan proses ini, peraturan biasa tetap terpakai, dan asas Docker Compose untuk VPS menjelaskan mengapa --env-file dan named volumes menjadi lebih penting apabila sesuatu stack dibiarkan berjalan sendiri selama berbulan-bulan.
Sandaran
Postgres dan direktori data/ merangkumi keseluruhan instans.
./scripts/backup.sh
./scripts/restore.sh backups/BACKUP_TIMESTAMPbackup.sh melakukan dump Postgres dan mengarkibkan data/. Bagi mesin yang kritikal, pasang infra/compose/backup-prod.sh sebagai /usr/local/sbin/rakazo-backup dengan pemasa yang dibekalkan oleh repositori, supaya putaran berlaku secara automatik. Sandaran yang disimpan pada cakera yang sama dengan pangkalan data bukanlah sandaran yang sebenar, jadi salin fail tersebut keluar dari pelayan. Kemudian, lakukan pemulihan sekali, pada pelayan simpanan, sebelum anda benar-benar memerlukannya.
Sebab kegagalan dan perkara yang akan anda lihat
pnpm db:migrate tidak dapat mencapai pangkalan data. Migrasi melaporkan bahawa ia tidak dapat mencapai pelayan pangkalan data di 127.0.0.1:5433. Sama ada kontena Postgres belum berjalan, atau ia sudah berjalan tetapi belum bersedia. Jalankan docker compose --env-file .env -f infra/compose/docker-compose.yml ps dan pastikan servis postgres melaporkan status healthy, kerana fail compose menyertakan pemeriksaan kesihatan yang berjalan setiap tiga saat. Kontena yang memulakan semula secara berulang biasanya bermaksud volum pgdata dicipta dengan kelayakan yang berbeza. docker compose ... down -v akan membersihkannya, dan tindakan ini turut memadamkan data di dalamnya.
Port sudah digunakan. Proses memulakan Postgres gagal dengan bind: address already in use apabila sesuatu yang lain menggunakan port 5433, biasanya disebabkan oleh timbunan Rakazo terdahulu yang anda terlupa untuk hentikan. sudo ss -lntp | grep 5433 akan menamakan proses tersebut.
Bot tidak mendapat komputer. Dengan SANDBOX_PROVIDER=docker dan tanpa imej rakazo/computer:local, tiada apa yang boleh dimulakan. docker image ls rakazo/computer menjawab perkara itu dalam satu baris, dan pnpm sandbox:build membaikinya. Jika penyelia tidak dapat mencapai soket Docker, ia juga tidak dapat mencipta kontena, dan mesej ralat akan menamakan laluan tersebut: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock.
Perintah panjang terhenti di tengah jalan. .env.example menetapkan SANDBOX_COMMAND_TIMEOUT_MS=300000, jadi satu perintah di dalam komputer bot akan diputuskan selepas lima minit. Tingkatkan nilainya untuk binaan yang perlahan dan jangan terus menganggap sandbox telah terhempas.
pnpm install rosak dengan cara yang mengelirukan. Semak node -v sebelum perkara lain. Ruang kerja mengisytiharkan >=22, dan versi Node yang lama akan gagal pada kod dependensi dan bukannya memberikan mesej tentang versi.
Daftar masuk berfungsi secara tempatan tetapi tidak melalui domain. BETTER_AUTH_URL, WEB_ORIGIN dan API_URL kesemuanya perlu memegang origin awam yang sama seperti pada bar alamat, termasuk skema. http://127.0.0.1:5173 yang lapuk yang tertinggal dalam salah satu daripadanya adalah punca biasa bagi sesi yang tidak pernah kekal.
Mengemas kini daftar keluar yang dipinkan
Laluan naik taraf dalam dokumentasi self-host adalah ringkas: tarik sumber baharu, jalankan migrasi pangkalan data, dan mulakan semula API serta 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 --buildLakukan sandaran terlebih dahulu. Migrasi hanya bergerak ke hadapan, dan versi beta tidak menyediakan laluan undur yang boleh dipercayai. Baca commit antara SHA yang dipinkan dengan SHA baharu sebelum menerapkannya. Projek yang masih baharu sering menukar nama pemboleh ubah persekitaran tanpa pengumuman, dan pemboleh ubah yang hilang akan menyebabkan servis bermula kemudian terus keluar. Jika anda masih mempertimbangkan sama ada Rakazo adalah pilihan yang tepat untuk dijalankan, ringkasan ejen AI yang dihoskan sendiri merangkumi pilihan lain dalam kategori ini serta kos penyelenggaraan bagi setiap satunya.
FAQ
Bolehkah saya menjalankan Rakazo pada VPS 1 GB?
Tidak. Postgres, API, worker, sandbox supervisor dan aplikasi web semuanya berjalan serentak, dan dengan SANDBOX_PROVIDER=docker setiap bot yang aktif akan menambah satu kontena yang mengandungi desktop grafik serta pelayar web. Dokumentasi projek itu sendiri menyatakan bahawa 2 vCPU dan 4 GB hanya mencukupi untuk API, worker dan Postgres jika E2B mengehoskan desktop bot tersebut. Anggap 4 GB sebagai keperluan minimum untuk control plane, dan gunakan spesifikasi lebih tinggi apabila desktop dijalankan pada mesin anda sendiri.
Adakah penyedia sandbox desktop selamat pada pelayan?
Tidak. desktop menjalankan arahan bot secara terus pada hos API dan worker, sebagai pengguna yang menjalankan proses tersebut, dengan fail dan kelayakan pengguna itu boleh diakses. Repositori tersebut menyatakan supaya tidak menggunakannya pada pelayan awam atau pelayan kongsi. Gunakan docker untuk satu kontena bagi setiap bot, atau e2b apabila lebih daripada seorang pengguna log masuk.
Versi Rakazo yang manakah perlu saya pasang?
Setakat 16 Ogos 2026, terdapat satu tag, v0.1.0-beta, yang diterbitkan pada 13 Ogos 2026 dan ditandakan sebagai prerelease. Semak commit yang ditunjuk oleh tag tersebut, 53b119a68d9ef843d23aa3b7e3719b6be7b51fdb, berbanding mengikuti main. Cawangan (branch) boleh berubah dan tag boleh diubah halanya, jadi kedua-duanya tidak mengenal pasti tree yang boleh anda kembali semula. Rekodkan commit tersebut, kerana proses rollback hanya boleh dilakukan apabila anda tahu versi mana yang berfungsi.
Di manakah saya perlu meletakkan kunci API OpenRouter saya?
Di dalam .env sebagai OPENROUTER_API_KEY, dan jangan sekali-kali meletakkannya dalam fail compose yang anda commit. Kedua-dua arahan compose dalam repositori tersebut menghantar --env-file .env, jadi nilai tersebut sampai ke kontena tanpa perlu ditulis ke dalam YAML yang dijejak. Anda juga boleh membiarkannya kosong dan menampal kunci tersebut di dalam aplikasi semasa proses onboarding. Tetapkan had perbelanjaan pada kunci tersebut di pihak penyedia, kerana bot yang terperangkap dalam gelung akan terus memanggil model sehingga sesuatu menghentikannya.
Adakah saya memerlukan nama domain dan TLS?
Untuk sebarang penggunaan selain daripada ujian awal, ya. Fail compose pengeluaran (production) menjalankan Caddy dan mendapatkan sijil secara automatik, dan RAKAZO_HOST, BETTER_AUTH_URL, WEB_ORIGIN serta API_URL semuanya mesti membawa origin HTTPS awam yang sama. Untuk percubaan awal, anda boleh melangkau domain: jalankan pnpm dev dan lakukan forwarding port 5173 melalui SSH dan bukannya menerbitkannya secara terus.