TLDR #
9Router adalah router AI yang menyediakan dashboard web dan endpoint API yang kompatibel dengan OpenAI. Daripada membuka port 9Router ke internet (yang rawan serangan), kamu bisa mengaksesnya dari laptop secara aman lewat SSH local port forwarding. Artikel ini memandumu dari instalasi 9Router di VPS, menjalankannya secara persisten dengan PM2, hingga membuat SSH tunnel dan troubleshooting-nya.
Pendahuluan #
Ketika kamu menjalankan 9Router di VPS, dashboard dan API-nya tidak harus dibuka langsung ke internet. Cara yang lebih aman adalah mengaksesnya dari laptop melalui SSH local port forwarding.
Panduan ini menggunakan contoh:
- Port 9Router di VPS:
20128 - Port lokal di laptop:
20228 - Host SSH:
<VPS_USER>@<VPS_HOST>
Ganti placeholder tersebut dengan akun dan alamat VPS Anda sendiri.
Mengapa menggunakan SSH tunnel? #
Membuka port 9Router ke internet membuat dashboard dan endpoint API menjadi sasaran pemindaian serta serangan otomatis. Dengan SSH tunnel, port 9Router tetap diakses melalui koneksi SSH yang sudah terautentikasi.
Alur koneksinya:
Browser/aplikasi laptop
│
│ http://127.0.0.1:20228
▼
SSH tunnel
│
▼
127.0.0.1:20128 di VPS
│
▼
9RouterPort 20228 hanya digunakan di laptop. Port 20128 tetap merupakan port internal 9Router di VPS.
Prasyarat #
Siapkan:
- VPS dengan akses SSH.
- Node.js dan npm di VPS.
- 9Router yang sudah terinstal.
- Klien SSH di laptop.
- Port lokal yang belum digunakan oleh aplikasi lain.
Periksa versi Node.js dan npm di VPS:
node --version
npm --versionJika npm menampilkan pemberitahuan versi baru yang membutuhkan Node.js lebih baru, itu tidak otomatis berarti instalasi 9Router gagal. Hindari mengganti Node.js sistem pada server produksi tanpa memeriksa aplikasi lain yang bergantung padanya.
Instalasi 9Router di VPS #
Login ke VPS:
ssh <VPS_USER>@<VPS_HOST>Instal 9Router secara global:
sudo npm install -g 9routerVerifikasi instalasi:
command -v 9router
9router --versionJalankan perintah instalasi dan proses 9Router sebagai user biasa. Gunakan sudo hanya jika memang diperlukan untuk instalasi global.
Menjalankan 9Router #
Pengujian manual #
Untuk pengujian awal, jalankan:
9router --no-browser --skip-updateOpsi --no-browser mencegah server mencoba membuka browser di VPS. Opsi --skip-update mencegah pemeriksaan pembaruan otomatis saat proses dimulai.
Biarkan terminal tetap terbuka selama pengujian. Dari terminal SSH lain, periksa proses dan port:
pgrep -af '[9]router'
ss -ltnp | grep ':20128'
curl -I http://127.0.0.1:20128/loginRespons HTTP 200 pada halaman /login menunjukkan bahwa dashboard aktif. Respons 401 dari endpoint sesi sebelum login adalah hal yang wajar.
Menjalankan secara persisten dengan PM2 #
Untuk server yang harus selalu aktif, PM2 dapat menjaga proses tetap berjalan setelah sesi SSH ditutup:
ROUTER_BIN=$(command -v 9router)
pm2 start "$ROUTER_BIN" --name 9router -- --no-browser --skip-update
pm2 save
pm2 status 9routerJika proses bernama 9router sudah ada, jangan menjalankan instance kedua. Gunakan:
pm2 restart 9router
pm2 logs 9router --lines 50Periksa port sebelum memulai instance baru:
ss -ltnp | grep ':20128'
pm2 listNative vs Docker: mana yang lebih baik? #
Untuk VPS kecil (misalnya 2 GB atau kurang), menjalankan 9Router secara native (langsung dengan PM2) umumnya lebih bijak daripada memakainya di dalam Docker.
Alasan overhead Docker nyata di RAM kecil:
- Docker daemon (
dockerd+containerd) sendiri memakan sekitar 100–200 MB saat idle, padahal belum menjalankan container apa pun. - Container runtime, network bridge, dan log driver menambah overhead lagi.
- Di VPS 2 GB (apalagi yang 1 core), overhead itu bisa setara 10–15% RAM yang hilang percuma.
Sebaliknya, 9Router cukup ringan dan tunggal:
- Ia hanya satu proses Node.js, sehingga tidak memerlukan isolasi multi-service yang menjadi alasan utama memakai Docker.
- Native berarti satu proses dengan satu service manager (PM2), langsung terlihat lewat
ssataupm2, dan mudah di-debug. - Tidak ada lapisan tambahan untuk membaca log, me-restart, atau memperbarui.
Kapan Docker baru masuk akal:
| Kondisi | Rekomendasi |
|---|---|
| VPS 2 GB, satu service ringan | Native + PM2 ✅ |
| Banyak service yang perlu diisolasi | Docker / docker-compose |
| Butuh deployment seragam lintas server | Docker |
| Khawatir dependency conflict antar aplikasi | Docker |
Dengan kata lain, jalankan 9Router sebagai user biasa dengan PM2, bukan sebagai root dan bukan di dalam container.
Membuat SSH tunnel dari laptop #
Jika port 20128 di laptop sudah digunakan aplikasi lokal, pilih port lain. Contoh berikut menggunakan port lokal 20228:
ssh -N \
-o ExitOnForwardFailure=yes \
-o ServerAliveInterval=30 \
-o ServerAliveCountMax=3 \
-L 127.0.0.1:20228:127.0.0.1:20128 \
<VPS_USER>@<VPS_HOST>Penjelasan opsi penting:
-N: hanya membuat forwarding, tanpa menjalankan shell remote.-L: meneruskan port lokal ke port di VPS.ExitOnForwardFailure=yes: langsung gagal jika port lokal tidak tersedia.ServerAliveIntervaldanServerAliveCountMax: membantu mendeteksi koneksi yang terputus.
Tidak ada output setelah perintah dijalankan adalah normal. Proses SSH tersebut harus tetap hidup selama tunnel digunakan.
Menjalankan tunnel di background #
Jika tidak ingin mempertahankan terminal foreground:
ssh -fN \
-o ExitOnForwardFailure=yes \
-o ServerAliveInterval=30 \
-o ServerAliveCountMax=3 \
-L 127.0.0.1:20228:127.0.0.1:20128 \
<VPS_USER>@<VPS_HOST>Tunnel perlu dibuat ulang setelah laptop reboot atau koneksi SSH terputus. Untuk kebutuhan yang sangat persisten, gunakan autossh atau konfigurasi service pengguna sesuai sistem operasi laptop.
Membuka dashboard #
Setelah tunnel aktif, buka alamat berikut di browser laptop:
http://127.0.0.1:20228/dashboardHalaman login:
http://127.0.0.1:20228/loginGunakan alamat yang sama secara konsisten. Jangan berganti-ganti antara localhost dan 127.0.0.1, atau antara port 20128 dan 20228, karena cookie sesi browser terikat pada host dan port.
Uji tunnel dari terminal laptop:
ss -ltnp | grep ':20228'
curl -I http://127.0.0.1:20228/loginMenggunakan endpoint API #
Dari aplikasi yang berjalan di laptop, gunakan URL tunnel:
http://127.0.0.1:20228/v1Dari aplikasi yang berjalan langsung di VPS, gunakan URL internal VPS:
http://127.0.0.1:20128/v1Contoh pengujian endpoint model dari laptop:
curl -i http://127.0.0.1:20228/v1/models \
-H 'Authorization: Bearer API_KEY_9ROUTER'Ganti API_KEY_9ROUTER dengan API key yang diberikan 9Router. Jangan menaruh API key di repository, screenshot, artikel publik, atau log.
Contoh konfigurasi aplikasi lokal #
Untuk aplikasi di laptop yang mendukung endpoint OpenAI-compatible:
OPENGRIFFIN_PROVIDER=custom
CUSTOM_API_URL=http://127.0.0.1:20228/v1
CUSTOM_API_KEY=API_KEY_9ROUTERNama variabel dapat berbeda pada aplikasi lain. Prinsipnya:
- aplikasi di laptop memakai port tunnel
20228; - aplikasi di VPS memakai port internal
20128; - API key disimpan di file environment yang tidak di-commit.
Memilih port lokal lain #
Jika port 20228 juga sudah digunakan, pilih port lain, misalnya 20229:
ssh -fN -o ExitOnForwardFailure=yes \
-L 127.0.0.1:20229:127.0.0.1:20128 \
<VPS_USER>@<VPS_HOST>Akses dashboard melalui:
http://127.0.0.1:20229/dashboardPeriksa port yang sedang digunakan dengan:
ss -ltnp | grep -E ':20228|:20229'Troubleshooting #
Address already in use
#
Port lokal yang dipilih sudah digunakan:
ss -ltnp | grep ':20228'Identifikasi prosesnya sebelum menghentikannya. Alternatif yang lebih aman adalah memilih port lokal lain.
Dashboard lokal tidak terbuka #
Periksa apakah tunnel memiliki listener:
ss -ltnp | grep ':20228'Jika tidak ada hasil, jalankan kembali perintah SSH tunnel. Kemudian pastikan 9Router aktif di VPS:
ssh <VPS_USER>@<VPS_HOST> \
"ss -ltnp | grep ':20128'; pgrep -af '[9]router'"Login gagal atau tampak tidak stabil #
- Pastikan proses tunnel masih berjalan.
- Gunakan URL yang sama, misalnya
http://127.0.0.1:20228/login. - Periksa status proses di VPS:
pm2 status 9router pm2 logs 9router --lines 50 - Coba jendela private/incognito untuk menghindari cookie sesi lama.
- Pastikan 9Router di VPS tidak menjalankan dua instance pada port yang sama.
9Router berhenti setelah logout SSH #
Jalankan 9Router melalui PM2, lalu simpan konfigurasi:
pm2 saveKeamanan #
- Jangan membuka port
20128ke publik hanya agar laptop dapat mengakses 9Router. - Gunakan SSH tunnel atau VPN.
- Jalankan 9Router dan PM2 sebagai user biasa, bukan sebagai
root. - Gunakan
sudohanya untuk instalasi yang memang membutuhkannya. - Simpan API key dalam environment variable atau secret manager.
- Jangan memasukkan alamat IP, username, password, atau API key pribadi ke artikel publik.
Ringkasan perintah #
Di VPS:
9router --no-browser --skip-updateDi laptop:
ssh -N -L 127.0.0.1:20228:127.0.0.1:20128 \
<VPS_USER>@<VPS_HOST>Dashboard:
http://127.0.0.1:20228/dashboardAPI:
http://127.0.0.1:20228/v1Dokumentasi resmi: npm 9router