SSD Nodes Learn 🎉 VPS mulai $5.50/bln
Panduan Matt ConnorOleh Matt Connor · Diperbarui 2026-08-13

Cara Self-Host open-kritt di VPS dengan Docker Compose

Panduan menjalankan open-kritt di VPS dengan Docker Compose, mengunci versi rilis, membuka UI lewat SSH tunnel pada port 5173, dan menetapkan anggaran provider.

Mengapa melakukan self-hosting open-kritt pada VPS, bukan pada laptop

Lakukan self-hosting open-kritt pada server yang dapat Anda hapus dan bangun ulang. Tool ini menjalankan agen analisisnya sebagai root di dalam container pekerjaan yang dapat dibuang, memberikan masing-masing agen salinan kode yang dapat ditulis serta akses Internet langsung, dan memasang socket Docker host ke service engine-nya. Trade-off ini wajar pada mesin yang khusus digunakan untuk pekerjaan tersebut. Namun, trade-off ini berisiko pada mesin yang menyimpan kunci SSH Anda.

Empat karakteristik setup default menjadi dasar saran tersebut. Keempatnya berasal dari README dan compose file milik project itu sendiri.

Agen memang dirancang agar memiliki kemampuan besar. README menyatakan bahwa agen yang mendukung tool berjalan sebagai root di dalam container pekerjaan yang dapat dibuang, dengan salinan repository yang dapat ditulis dan akses Internet langsung. Dengan demikian, agen dapat menginstal tool, mengompilasi target, menjalankan pengujian, dan membuat proof of concept. Scan bukan sekadar linter yang membaca file. Scan adalah eksekusi kode arbitrer yang Anda minta untuk dijalankan. Akses Internet tersebut dapat menimbulkan risiko dari dua arah: apa pun yang diambil agen saat meneliti target adalah teks tidak tepercaya yang masuk ke dalam prompt-nya. Paparan ini sama dengan yang Anda terima ketika memberikan agen akses ke pencarian webnya sendiri.

Engine memegang socket Docker. docker-compose.yml memasang socket Docker host ke service engine karena engine membuat dan menjalankan satu container scan untuk setiap pekerjaan. Proses apa pun yang dapat mengakses socket tersebut dapat memulai container yang memasang filesystem host. Dengan demikian, engine pada dasarnya memiliki akses root pada host yang menjalankannya.

Tidak ada layar login. Backend dirilis tanpa autentikasi aplikasi. Akses ke port berarti akses ke hasil temuan Anda dan kredit provider Anda.

Kode yang Anda scan sering kali bukan milik Anda. Mengarahkan agen ke repository pihak ketiga berarti menjalankan proses build repository tersebut pada mesin Anda, sebagai root, dengan akses jaringan.

Jika Anda telah membaca mengapa agen coding sebaiknya dijalankan di VM yang dapat dibuang, model ancamannya sama, tetapi lebih kuat. Berikan open-kritt sebuah VPS yang tidak menjalankan apa pun selain tool tersebut, lalu kelola VPS itu dari akun pengguna dengan hak akses minimum yang terpisah, bukan dari root.

Apa yang sebenarnya dilakukan open-kritt

open-kritt (repositori ini adalah Kritt-ai/open-kritt dan dilisensikan berdasarkan AGPL-3.0) membagi riset kerentanan menjadi tugas-tugas kecil, menjalankan tugas tersebut secara paralel pada beberapa agen AI, lalu menghapus duplikasi dan memberi peringkat pada hasilnya. Anda mendefinisikan workflow sebagai rangkaian prompt terfokus. Setiap langkah menerima konteks terstruktur dari langkah-langkah sebelumnya. Target pemindaian adalah repositori git remote atau lokal. Mesin analisisnya adalah Codex atau Claude Code. Setelah kandidat ditemukan, post-script opsional dapat mencoba memvalidasinya atau membuat proof of concept.

Pada akhirnya, Anda memperoleh daftar kandidat yang telah diberi peringkat. Perlakukan daftar ini sebagai antrean triase, bukan sebagai laporan.

Hal yang diperlukan sebelum memulai

  • VPS yang menjalankan Ubuntu 24.04, Debian 12, atau Rocky Linux 9. Dokumentasi instalasi mencantumkan distribusi tersebut sebagai distribusi yang telah diuji pada x86_64 dan ARM64.
  • Docker Engine dengan plugin Compose.
  • Node.js 20 atau yang lebih baru pada host, karena CLI ./kritt berjalan pada host, bukan di dalam container.
  • Salah satu penyedia model: login Codex, atau OPENAI_API_KEY, CODEX_API_KEY, ANTHROPIC_API_KEY, atau OPENROUTER_API_KEY.
  • GITHUB_TOKEN hanya jika Anda berencana memindai repository privat. .env.example yang disertakan menyatakannya dengan jelas: token GitHub saja tidak dapat menjalankan pemindaian.

Instal Docker dan Node 20 terlebih dahulu

curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER

Keluar lalu masuk kembali agar keanggotaan grup yang baru berlaku, kemudian pastikan plugin Compose tersedia.

docker compose version

String versi menunjukkan bahwa Compose terpasang sebagai plugin. docker: 'compose' is not a docker command berarti Anda menggunakan biner docker-compose standalone lama, sedangkan open-kritt memanggil docker compose. Keanggotaan grup docker setara dengan akses root pada host. Karena itu, masukkan hanya akun yang menjalankan open-kritt ke grup tersebut. Untuk versi penyiapan yang lebih panjang, lihat menjalankan Docker pada VPS.

Ubuntu 24.04 menyediakan Node 18 di repositorinya sendiri, sedangkan CLI akan keluar jika versinya di bawah 20. Gunakan NodeSource.

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
node -v

node -v harus menampilkan v20. atau yang lebih tinggi. Pada Rocky Linux 9, padanannya adalah sudo dnf module enable nodejs:20 -y lalu sudo dnf install -y nodejs.

Klon open-kritt dan tetapkan rilis bertag

git clone https://github.com/Kritt-ai/open-kritt
cd open-kritt
git fetch --tags
git tag --list
git checkout v1.3.0

main dapat berubah di bawah Anda. Tag tidak berubah. Per Agustus 2026, tag terbaru adalah v1.3.0, yang diterbitkan pada 4 August 2026, dan git tag --list menunjukkan kondisi yang tersedia pada hari Anda melakukan clone. Checkout tag akan menempatkan repository dalam status detached HEAD. Hal ini sesuai untuk kasus ini: Anda menggunakan clone ini sebagai deployment yang ditetapkan versinya, bukan sebagai branch tempat Anda melakukan commit. Untuk melakukan upgrade nanti, baca catatan rilis, lalu jalankan git fetch --tags, checkout tag baru, dan jalankan ./kritt start lagi karena start membangun ulang image.

Jangan jalankan ./kritt bersama sudo. Dokumentasi menyatakannya secara eksplisit. CLI mengelola direktori kredensial lokal proyek di bawah .data/. Jika perintah dijalankan sebagai root, direktori tersebut akan dimiliki oleh root sehingga proses normal berikutnya tidak dapat menulis ke dalamnya.

Konfigurasikan akses model dengan ./kritt setup

./kritt setup

Perintah ini membuat .env dari .env.example jika file tersebut belum ada, menampilkan status setiap kredensial, serta memungkinkan Anda menetapkan atau menghapusnya. Perintah ini tidak pernah menampilkan nilainya kembali ke terminal. .env dan file kredensial engine sama-sama ditulis dengan mode 0600.

Jika Anda ingin melakukannya secara manual:

cp .env.example .env
chmod 600 .env
mkdir -p .data/codex
chmod 700 .data/codex

Kemudian edit kunci provider ke dalam .env dan pertahankan mode file 0600. Dengan cara apa pun, kredensial provider yang berfungsi kini tersimpan di server tersebut. Ini menjadi alasan tambahan agar server itu tidak menjalankan hal lain. Buat kunci khusus untuk proyek ini, sehingga pencabutannya nanti tidak mengganggu hal lain yang masih Anda perlukan. Menjaga rahasia agar tidak dapat dijangkau agen AI membahas kebiasaan ini secara lebih luas.

Tetapkan batas pengeluaran provider sebelum pemindaian pertama

open-kritt dirancang untuk menjalankan banyak tugas secara paralel, dan paralelisasi itulah yang menimbulkan biaya. Nilai default dalam .env.example pada v1.3.0 bersifat konservatif: ENGINE_WORKER_COUNT=2, yang dijelaskan dalam file sebagai nilai default konservatif untuk mesin kecil dengan 2-vCPU, dan ENGINE_MAX_CONCURRENT_SCANS=1. Di atasnya terdapat ENGINE_WORKERS_PER_ACCOUNT=15, yaitu jumlah maksimum pemanggilan model root secara bersamaan yang diizinkan pada satu akun provider, serta ENGINE_CODEX_MAX_SUBAGENTS_PER_SESSION=5, karena satu sesi Codex dapat menjalankan hingga lima child agent. Jika jumlah worker dinaikkan pada VPS yang lebih besar, jumlah pemanggilan model yang berjalan secara bersamaan juga meningkat.

Tidak ada pengaturan dalam repository yang membatasi pengeluaran Anda. Tidak ada pengaturan anggaran dalam .env.example. Kondisi penghentian internal engine hanya berupa batas worker tersebut dan ENGINE_HARNESS_TIMEOUT_SECONDS, yang secara default menetapkan 7200 detik per eksekusi harness. Karena itu, batas pengeluaran harus ditetapkan pada provider. Buka konsol provider Anda dan tetapkan batas bulanan yang tegas sebelum pemindaian pertama, bukan setelahnya. Mengendalikan biaya agen AI pada VPS menjelaskan pengaturan untuk setiap provider.

Tersedia juga pembatas lokal. Menetapkan ENGINE_WORKER_COUNT=0 akan menghentikan pengambilan job baru, dan nilai worker yang sama dapat diubah pada layar Settings setelah stack berjalan.

Panduan ini tidak mencantumkan harga per pemindaian karena biayanya bergantung pada ukuran repository, workflow yang Anda buat, dan model yang digunakan. Jalankan satu pemindaian pada satu repository kecil, lalu periksa halaman penggunaan provider Anda sebelum menjalankannya pada repository berukuran besar.

Mulai stack dan periksa kesehatannya

./kritt start

Perintah tersebut memeriksa .env dan setidaknya satu kredensial, lalu menjalankan docker compose up --build. Build pertama berjalan lambat karena perintah ini membuat image frontend, backend, engine, executor view, dan database. Proses ini juga berjalan di foreground, sehingga menutup sesi SSH akan menghentikan stack. Jalankan di dalam tmux, atau jalankan dalam mode detached setelah build pertama berhasil. Keduanya tidak bertahan setelah reboot secara otomatis. Jika Anda ingin stack kembali aktif setelah server dimulai ulang, pola unit systemd dalam mempertahankan agent yang di-host sendiri tetap berjalan setelah reboot dapat langsung digunakan.

docker compose up -d --build
docker compose ps

docker compose ps seharusnya menampilkan open-kritt-frontend, open-kritt-backend, open-kritt-engine, open-kritt-executor-view, dan open-kritt-db. Selanjutnya, periksa apakah backend merespons pada server itu sendiri.

curl -s http://127.0.0.1:3002/api/health

Respons JSON berarti backend aktif. Failed to connect to 127.0.0.1 port 3002: Connection refused berarti backend tidak aktif, dan docker compose logs backend akan menjelaskan penyebabnya. Hentikan semuanya dengan docker compose down dari direktori repositori.

Satu opsi tambahan: docker compose exec backend npm run seed memuat data demo. Ini merupakan cara mudah untuk melihat antarmuka sebelum Anda mengeluarkan biaya untuk pemindaian nyata.

Akses UI pada port 5173 melalui tunnel SSH

Setiap service dalam file compose mengikat ke 127.0.0.1 secara default: frontend pada 5173, backend pada 3002, tampilan executor pada 8090, dan Postgres pada 5432. Biarkan binding tersebut dan teruskan port melalui SSH dari komputer Anda sendiri.

ssh -N -L 5173:127.0.0.1:5173 you@your-server-ip

Buka http://localhost:5173 di browser lokal saat perintah tersebut berjalan. -N berarti koneksi meneruskan port tersebut tanpa membuka shell. Tambahkan -L 8090:127.0.0.1:8090 kedua ke perintah yang sama jika Anda juga ingin mengakses tampilan executor.

Anda mungkin tergoda untuk menetapkan FRONTEND_BIND_ADDRESS=0.0.0.0 dan melewati tunnel. Jangan lakukan itu. Backend tidak memiliki layar login, sehingga siapa pun yang dapat mengakses halaman tersebut bisa memulai pemindaian dan menghabiskan kredit provider Anda. Ada jebakan kedua: port container yang dipublikasikan diproses sebelum kebijakan default ufw diterapkan, sehingga aturan ufw deny 5173 tampak benar tetapi tidak memblokir apa pun. Port Docker yang melewati ufw menjelaskan rangkaian aturan yang menyebabkannya.

Ukuran VPS

ENGINE_MIN_FREE_STORAGE_GB secara default bernilai 20. Engine menolak memulai container pemindaian baru untuk setiap pekerjaan jika penyimpanan yang tersedia kurang dari nilai tersebut. Image yang telah dibuat, cache checkout, data Postgres, dan ruang kerja pekerjaan semuanya berada pada disk yang sama. Karena itu, VPS 20 GB tidak akan pernah memulai pemindaian. Jadikan 40 GB sebagai batas minimum, dan gunakan kapasitas yang lebih besar jika Anda memindai repositori berukuran besar.

Kebutuhan memori mengikuti perhitungan sederhana. ENGINE_MEMORY_RESERVE_GB=2 menyisihkan memori untuk engine, database, API, dan overhead sementara. Setiap runner pemindaian memiliki reservasi dan batas maksimum sebesar ENGINE_SCAN_RUNNER_MEMORY_MB=1536. Karena itu, dua worker memerlukan sekitar 5 GB sebelum proses lain berjalan. Engine hanya menjalankan runner yang muat dalam anggaran memori yang tersisa. Pada server kecil, pemindaian akan masuk antrean, bukan gagal. Ini jauh lebih baik daripada proses dihentikan oleh out-of-memory killer.

Dua pengaturan prune secara default bernilai true: ENGINE_AUTO_PRUNE_DOCKER_BUILD_CACHE dan ENGINE_AUTO_PRUNE_UNUSED_DOCKER_IMAGES. Setelah tugas selesai, engine menghapus cache build yang tidak digunakan, image yang tidak digunakan, dan container pemindaian yang telah berhenti. Image yang direferensikan oleh container yang sedang berjalan, bind mount, data database, kredensial, dan volume tetap dipertahankan. Ini menjadi alasan lain untuk tidak berbagi host: pruner yang tidak Anda konfigurasi berjalan pada Docker daemon tersebut.

Pengaturan engine yang paling sering diubah
  • ENGINE_WORKER_COUNT: jumlah slot worker yang digunakan bersama oleh langkah pemindaian dan pascapemrosesan. Atur ke 0 untuk menjeda pengambilan pekerjaan baru.
  • ENGINE_MAX_CONCURRENT_SCANS: jumlah pemindaian yang dapat dijalankan secara bersamaan. Pemindaian dalam antrean menunggu hingga pool aktif kosong.
  • ENGINE_MAX_WORKERS_PER_SCAN: nilai 0 membagi slot agregat secara merata di antara pemindaian.
  • ENGINE_HARNESS_TIMEOUT_SECONDS: secara default bernilai 7200. Ini adalah durasi maksimum satu pekerjaan yang berjalan tanpa henti.
  • ENGINE_MIN_FREE_STORAGE_GB: batas minimum penyimpanan. ENGINE_IGNORE_LOW_STORAGE=true menonaktifkan perlindungan ini, dan file tersebut memperingatkan bahwa disk host dapat penuh.
  • ENGINE_SCAN_RUNNER_MEMORY_MB: batas maksimum memori untuk setiap runner. Nilai 0 menghapus batas tersebut.

Memindai repositori lokal tanpa membocorkannya

LOCAL_REPOS_PATH secara default berada di ./local_repos dan di-bind mount ke dalam container backend dan engine pada /local_repos. Dengan demikian, repositori yang Anda masukkan ke folder tersebut pada host langsung terlihat di dalam container. Gunakan clone baru, bukan working tree Anda. Container job mendapatkan salinan yang dapat ditulis, memiliki akses root di dalam container, dan akses Internet keluar. Artinya, apa pun yang berada dalam salinan tersebut dapat diubah atau dikirim keluar dari server. Hapus file .env dan kunci privat sebelum menyalin proyek ke dalamnya.

Yang Anda dapatkan dan yang tidak

Anda mendapatkan temuan kandidat yang telah diurutkan. Anda tidak mendapatkan kerentanan yang telah diverifikasi. Pemeringkatan dan deduplikasi menentukan urutan antrean triase Anda. Keduanya tidak membuktikan bahwa suatu entri benar-benar valid. Post-script dapat mencoba melakukan validasi dan membuat proof of concept. Ini merupakan sinyal terkuat yang ditawarkan alat tersebut. Namun, post-script yang gagal bukan bukti bahwa temuan tersebut keliru. Seseorang tetap harus membaca setiap kandidat.

Panduan ini tidak menyatakan berapa banyak bug nyata yang ditemukan oleh open-kritt karena kami belum mengukurnya. Siapa pun yang menyebutkan tingkat deteksi untuk codebase Anda belum menjalankan alat ini pada codebase Anda. Pindai repository yang sudah Anda pahami dengan baik terlebih dahulu. Temuan yang dapat Anda nilai sendiri merupakan cara kalibrasi termurah yang tersedia.

Otorisasi lebih penting dalam konteks ini dibandingkan pada sebagian besar alat self-hosted. Agent mengompilasi dan menjalankan code serta mengakses network, sehingga langkah proof-of-concept dapat menyentuh sistem live. Arahkan alat ke code yang Anda miliki atau yang secara kontraktual boleh Anda uji, lalu tuliskan cakupan target sebelum menjalankan apa pun. Jika Anda mengonfigurasi ANTHROPIC_API_KEY dan menggunakan engine Claude Code, kebiasaan sandboxing dalam menjalankan Claude Code dengan aman pada VPS juga berlaku untuk agent ini.

FAQ

Mengapa open-kritt memerlukan VPS sendiri?

Karena agen analisisnya berjalan sebagai root di dalam container pekerjaan sekali pakai dengan salinan kode Anda yang dapat ditulis dan akses langsung ke Internet. Selain itu, service engine memasang socket Docker host agar dapat menjalankan satu container untuk setiap pekerjaan. Proses apa pun yang dapat mengakses socket tersebut dapat menjalankan container yang memasang filesystem host. Karena itu, seluruh stack harus diperlakukan sebagai root pada host-nya. Pada VPS khusus, konsekuensi ini dapat diterima dan Anda tidak dikenai biaya untuk membangun ulang server tersebut. Pada workstation harian, kunci SSH dan profil browser Anda berada dalam batas kepercayaan yang sama dengan kode yang sedang dipindai.

Apakah saya dapat membuka port 5173 alih-alih menggunakan tunnel SSH?

Sebaiknya jangan. Backend dirilis tanpa autentikasi aplikasi. Jadi, port tersebut menjadi satu-satunya penghalang antara Internet dan hasil pemindaian serta kredit provider Anda. File compose mengikat setiap service ke 127.0.0.1 karena alasan tersebut. Jalankan ssh -N -L 5173:127.0.0.1:5173 you@your-server-ip dan buka http://localhost:5173 secara lokal. Aturan ufw bukan pengganti yang memadai, karena port Docker yang dipublikasikan ditangani sebelum kebijakan default ufw diterapkan.

Bagaimana cara menghentikan open-kritt agar tidak menggunakan biaya melebihi rencana saya?

Tetapkan batas keras di console provider model Anda sebelum pemindaian pertama, karena open-kritt tidak memiliki pengaturan anggaran sendiri. Pertahankan default konkurensi yang disertakan untuk beberapa proses pertama, ENGINE_WORKER_COUNT=2 dan ENGINE_MAX_CONCURRENT_SCANS=1. Ingat bahwa satu akun provider secara default mengizinkan hingga 15 pemanggilan model root secara bersamaan, sedangkan satu sesi Codex dapat menjalankan hingga lima agen turunan. ENGINE_WORKER_COUNT=0 menghentikan pengambilan pekerjaan baru dan merupakan cara penghentian lokal yang paling cepat.

Versi mana yang sebaiknya saya checkout?

Gunakan tag, bukan main. git fetch --tags yang diikuti git tag --list menampilkan versi yang tersedia. v1.3.0, yang diterbitkan pada 4 August 2026, adalah versi terbaru saat dokumentasi ini ditulis. Pinning memastikan bahwa proses build ulang beberapa bulan kemudian menghasilkan stack yang sama. Langkah ini juga menjadikan upgrade sebagai keputusan yang diambil setelah membaca catatan rilis, bukan efek samping dari cloning pada hari yang berbeda.

Pemindaian tidak pernah dimulai. Apa yang harus saya periksa?

Periksa ruang disk yang tersedia terlebih dahulu. Engine tidak akan menjalankan container pemindaian untuk setiap pekerjaan jika ruang penyimpanan yang tersedia kurang dari ENGINE_MIN_FREE_STORAGE_GB, yang secara default adalah 20 GB. Selanjutnya, pastikan ENGINE_WORKER_COUNT bukan 0, karena nilai tersebut menghentikan pengambilan pekerjaan baru. Kemudian, pastikan kredensial model benar-benar dikonfigurasi dengan menjalankan ./kritt setup. GITHUB_TOKEN saja tidak dapat menjalankan pemindaian. docker compose logs engine menyebutkan alasan pekerjaan tersebut dilewati.