Cara Self-Host OpenHands di VPS dengan Docker
Pelajari cara memasang OpenHands di VPS dengan Docker, mengamankan Web UI, dan melindungi secret. Waspadai Docker socket karena aksesnya setara root.
Apa itu OpenHands dan satu risiko yang harus dipahami terlebih dahulu
OpenHands, yang sebelumnya bernama OpenDevin, adalah agen rekayasa perangkat lunak otonom. Anda memberinya tugas dalam bahasa biasa, lalu agen ini merencanakan pekerjaan, menulis kode, menjalankan perintah, membaca output, dan mengulang proses hingga tugas selesai. Anda menjalankannya di server sendiri menggunakan Docker dan mengarahkannya ke model bahasa. Pada VPS, OpenHands menjadi agen pemrograman yang dapat bekerja saat Anda tidak berada di depan server.
Satu fakta harus menjadi dasar seluruh konfigurasi Anda. OpenHands tidak hanya menyarankan kode, tetapi juga menjalankannya. Untuk melakukan itu, container pengontrolnya memasang Docker socket milik host pada /var/run/docker.sock agar dapat membuat sandbox container untuk setiap tugas. Apa pun yang dapat berkomunikasi dengan Docker socket dapat menjalankan container baru yang memasang seluruh filesystem host. Artinya, akses ke socket tersebut pada dasarnya setara dengan akses root pada mesin. Karena itu, perlakukan server OpenHands sebagai server yang menjalankan kode tidak tepercaya, karena memang itulah yang dilakukannya. Semua pilihan hardening di bawah ini didasarkan pada hal tersebut.
Yang Anda perlukan
Anda memerlukan VPS yang menjalankan Ubuntu 24.04 dengan Docker Engine versi terbaru, RAM minimal 4 GB, dan API key untuk model bahasa (OpenAI, Anthropic, atau Google), atau model lokal yang disediakan oleh Ollama pada VPS yang sama. OpenHands mendukung puluhan backend model, sehingga Anda dapat memilih sesuai kebutuhan. Jika Anda belum pernah menyiapkan container, dasar-dasar Docker pada VPS membahas hal-hal yang diasumsikan dalam panduan ini.
Instal dengan Docker
OpenHands dirilis sebagai dua image: image aplikasi yang Anda jalankan dan image agent-server yang ditariknya untuk menjalankan sandbox setiap tugas. Jalankan perintah berikut dengan mengganti tag menggunakan tag terbaru dari dokumentasi proyek:
docker run -it --rm --pull=always \
-e AGENT_SERVER_IMAGE_REPOSITORY=ghcr.io/openhands/agent-server \
-e AGENT_SERVER_IMAGE_TAG=1.26.0-python \
-e LOG_ALL_EVENTS=true \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ~/.openhands:/.openhands \
-p 127.0.0.1:3000:3000 \
--add-host host.docker.internal:host-gateway \
--name openhands \
docker.openhands.dev/openhands/openhands:1.8Dua hal berikut dapat mencegah kebingungan yang memakan waktu. Image aplikasi dan image agent-server memang menggunakan nomor versi yang berbeda, jadi jangan mencoba menyamakannya: gunakan tag agent-server yang dipasangkan dalam dokumentasi dengan versi aplikasi Anda. Perhatikan juga -p 127.0.0.1:3000:3000, bukan -p 3000:3000. Perubahan tunggal ini menentukan apakah Web UI hanya dapat Anda akses atau dapat diakses seluruh Internet. Bagian berikut membahas hal tersebut.
Jauhkan Web UI dari internet publik
OpenHands menyediakan antarmukanya pada port 3000. Antarmuka tersebut mengendalikan agent yang menjalankan kode, sehingga mempublikasikannya ke internet memberi siapa pun yang menemukannya jalur jarak jauh ke proses yang mengeksekusi perintah. Ikat antarmuka tersebut ke loopback, seperti yang dilakukan oleh perintah run di atas, lalu akses dari laptop melalui tunnel SSH:
ssh -L 3000:127.0.0.1:3000 you@your-vpsKemudian buka http://127.0.0.1:3000 pada komputer Anda sendiri. Trafik berjalan melalui sesi SSH yang sudah ada, dan tidak ada port baru yang listening pada internet publik. Tidak semua agent memerlukan port: sesi Claude Code pada VPS yang sama saling bertukar pesan melalui terminal, sehingga satu-satunya hal yang perlu diekspos adalah SSH itu sendiri. Kebiasaan menggunakan loopback dan tunnel yang sama juga sebaiknya diterapkan pada setiap dashboard agent yang Anda host; mengakses UI pemindaian open-kritt melalui tunnel bekerja dengan cara yang sama, tetapi menggunakan port 5173. Untuk konfigurasi yang lebih permanen, letakkan layanan tersebut di belakang VPN. Apa pun pilihannya, pasang firewall default-deny di depan server agar tidak ada layanan yang terekspos secara tidak sengaja. Ingat bahwa firewall yang hanya mencakup IPv4 membuat port yang sama tetap terbuka pada IPv6. Inilah celah firewall IPv6 yang sering tidak disadari.
Pisahkan kunci model dan kredensial repo
OpenHands memerlukan API key untuk modelnya, dan sering kali juga token untuk melakukan clone dan push ke repository Anda. Keduanya dapat menimbulkan biaya dan bertindak atas nama Anda, jadi perlakukan seperti password. Simpan keduanya dalam file environment yang hanya dapat dibaca oleh account yang tepat. Jangan pernah menuliskannya dalam perintah eksekusi karena akan tersimpan di shell history dan process list. Jangan pula menyimpannya dalam file di dalam git repository. Jika Anda menyimpan kredensial asli dalam password manager yang di-host sendiri, perkuat keamanan server tersebut juga. Titik lemah vault biasanya adalah admin token dan file backup, bukan item yang telah dienkripsi, sebagaimana dibahas dalam langkah penguatan Vaultwarden.
Jalankan pada server yang dapat Anda buang
Karena controller harus mengakses Docker socket, Anda tidak dapat sepenuhnya melakukan sandbox terhadap OpenHands agar terisolasi dari host-nya. Mitigasi yang realistis adalah isolasi berdasarkan penempatan: jalankan OpenHands pada VPS khusus yang tidak menyimpan hal lain yang penting bagi Anda, bukan pada server yang juga menjalankan database atau situs web. Buat snapshot sebelum memulai, lalu lakukan rebuild dari snapshot tersebut, bukan mengandalkan server yang telah menjalankan kode buatan agent selama seminggu. VPS murah, sekali pakai, dan hanya untuk satu tujuan adalah tempat yang tepat untuk OpenHands. Dalam hal ini, penempatan adalah satu-satunya pengaturan yang benar-benar tersedia di OpenHands. Jika Anda juga ingin mengontrol seberapa banyak tindakan yang boleh dilakukan agent sebelum berhenti untuk meminta persetujuan, mode izin Claude Code menunjukkan bentuk pengaturan kedua tersebut pada server yang tidak sedang diawasi siapa pun.
Perkuat keamanan server di sekitarnya
Langkah selanjutnya adalah kebersihan server standar. Langkah ini lebih penting dari biasanya karena beban kerja tersebut juga memiliki risiko yang lebih tinggi. Buat pengguna admin tanpa hak istimewa, bukan bekerja sebagai root, dengan mengikuti panduan menjalankan service sebagai pengguna tanpa hak istimewa. Ubah SSH agar hanya menggunakan autentikasi berbasis key. Kemudian jalankan checklist di bawah ini dan simpan di tempat yang akan Anda lihat kembali.
Untuk memahami komponen yang terlibat, bukan sekadar menjalankan perintahnya, lihat membangun AI agent sendiri pada VPS. Untuk platform yang membutuhkan lebih sedikit kode, self-hosting Dify adalah langkah awal yang lebih mudah.
FAQ
Apakah OpenHands aman dijalankan pada server?
Bisa, jika dijalankan dengan hati-hati, tetapi risikonya lebih tinggi daripada aplikasi web biasa karena OpenHands menulis dan menjalankan kode, sementara controllernya memegang Docker socket host, yang secara efektif setara dengan akses root pada mesin tersebut. Jalankan OpenHands pada VPS khusus yang dapat dibuang dan tidak menyimpan data penting lain, pertahankan Web UI pada loopback di balik SSH tunnel atau VPN, isolasikan key-nya, lalu perkuat keamanan server. Jangan jalankan OpenHands berdampingan dengan service penting Anda.
Mengapa OpenHands memerlukan Docker socket?
OpenHands menjalankan setiap task dalam container sandbox baru. OpenHands meminta Docker daemon pada host membuat container tersebut dengan me-mount /var/run/docker.sock ke dalam controllernya. Dengan demikian, container controller memiliki kendali atas Docker pada host. Akses ini sangat kuat dan berisiko, sehingga host harus diperlakukan sebagai mesin yang menjalankan kode tidak tepercaya.
Apakah OpenHands dapat menggunakan model lokal, bukan API berbayar?
Ya. OpenHands mendukung model lokal yang disediakan oleh Ollama atau vLLM. Dengan demikian, OpenHands dapat dijalankan sepenuhnya secara self-hosted tanpa biaya per token dan tanpa data keluar dari server Anda. Anda memerlukan mesin dengan memori yang cukup untuk menjalankan model coding yang mumpuni. Pertimbangan ukuran mesin ini sama seperti yang dibahas dalam panduan Ollama.
Sebaiknya OpenHands dijalankan pada server utama saya?
Tidak. Karena OpenHands menjalankan kode yang ditulis oleh agent dan memegang Docker socket, jalankan OpenHands pada VPS terpisah yang hanya digunakan untuk satu tujuan dan siap Anda bangun ulang. Menempatkannya bersama database, website, atau service lain berarti kesalahan agent atau bug dalam OpenHands dapat menjangkau komponen yang seharusnya tidak dapat diaksesnya.