Lewati ke konten utama
  1. Server/

Mengakses 9Router di VPS dari Laptop dengan SSH Tunnel

Penulis
GezyTech
Menulis tentang AI, Linux, Server, Docker, dan teknologi lainnya.

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
9Router

Port 20228 hanya digunakan di laptop. Port 20128 tetap merupakan port internal 9Router di VPS.

Prasyarat
#

Siapkan:

  1. VPS dengan akses SSH.
  2. Node.js dan npm di VPS.
  3. 9Router yang sudah terinstal.
  4. Klien SSH di laptop.
  5. Port lokal yang belum digunakan oleh aplikasi lain.

Periksa versi Node.js dan npm di VPS:

node --version
npm --version

Jika 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 9router

Verifikasi instalasi:

command -v 9router
9router --version

Jalankan 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-update

Opsi --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/login

Respons 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 9router

Jika proses bernama 9router sudah ada, jangan menjalankan instance kedua. Gunakan:

pm2 restart 9router
pm2 logs 9router --lines 50

Periksa port sebelum memulai instance baru:

ss -ltnp | grep ':20128'
pm2 list

Native 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 ss atau pm2, 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.
  • ServerAliveInterval dan ServerAliveCountMax: 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/dashboard

Halaman login:

http://127.0.0.1:20228/login

Gunakan 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/login

Menggunakan endpoint API
#

Dari aplikasi yang berjalan di laptop, gunakan URL tunnel:

http://127.0.0.1:20228/v1

Dari aplikasi yang berjalan langsung di VPS, gunakan URL internal VPS:

http://127.0.0.1:20128/v1

Contoh 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_9ROUTER

Nama 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/dashboard

Periksa 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
#

  1. Pastikan proses tunnel masih berjalan.
  2. Gunakan URL yang sama, misalnya http://127.0.0.1:20228/login.
  3. Periksa status proses di VPS:
    pm2 status 9router
    pm2 logs 9router --lines 50
  4. Coba jendela private/incognito untuk menghindari cookie sesi lama.
  5. 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 save

Keamanan
#

  • Jangan membuka port 20128 ke publik hanya agar laptop dapat mengakses 9Router.
  • Gunakan SSH tunnel atau VPN.
  • Jalankan 9Router dan PM2 sebagai user biasa, bukan sebagai root.
  • Gunakan sudo hanya 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-update

Di 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/dashboard

API:

http://127.0.0.1:20228/v1

Dokumentasi resmi: npm 9router