JupyterHub adalah server multi-pengguna yang dirancang untuk mengelola dan melayani banyak instance Jupyter Notebook secara bersamaan. Platform ini sangat ideal digunakan oleh tim peneliti, kelas, atau perusahaan karena memungkinkan setiap pengguna memiliki lingkungan komputasi yang terisolasi dengan sumber daya CPU, RAM, dan instalasi package yang independen.
Sebelum saya mengenal jupyterhub, maka setiap user yang running maka akan dibuat jupyter notebook yang baru, tentu hal ini sangat boros memory. Apalagi sudah terlanjur install anaconda di /root/anconda3, jadi sangat repot. Untuk itu ada solusi lain yaitu menggunakan jupyterhub. Berikut langkah yang bisa kalian kerjakan untuk install jupyterhub. Install NodejS
Install NodeJS, Jupyterhub, dan proxy
Contents
sudo apt update sudo apt install nodejs npm -y
langkah selanjutnya install juptyerhub
/root/anaconda3/bin/pip install jupyterhub
juga install proxy
npm install -g configurable-http-proxy
Bikin User di Ubuntu
Kalian bisa menggunakan user ubuntu yang sudah ada atau tambah user baru via terminal. Misalkan kalian punya user seperti berikut
sudo adduser user1 sudo adduser user2 sudo adduser user3
sehingga tercipta home direktori masing-masing user sebagai berikut
/home/user1 /home/user2 /home/user3
Kalau kalian sudah ada user, maka langkah diatas tidak perlu dilakukan kok karena login user dan password di jupyterhub menggunakan PAM (Pluggable Authentication Modules)Digunakan pada: Instalasi standar JupyterHub dan The Littlest JupyterHub (TLJH).Cara kerja: Menggunakan username dan password dari akun user sistem operasi Linux tempat JupyterHub diinstal.
Bikin file konfigurasi
Untuk file konfigurasi di linux, akan diletakan di folder /etc saja
mkdir -p /etc/jupyterhub cd /etc/jupyterhub
bikin template file konfigurasi dengan perintah
/root/anaconda3/bin/jupyterhub --generate-config
pakai editor nano buat edit ya
nano /etc/jupyterhub/jupyterhub_config.py
Saya pakai customs no port karena port default dari jupyterhub sudah terpakai
c = get_config() #noqa
c.JupyterHub.bind_url = 'http://0.0.0.0:8087'
c.JupyterHub.hub_bind_url = 'http://127.0.0.1:8088'
c.Spawner.default_url = '/lab'
c.Authenticator.allow_all = True
c.Spawner.cmd = [
'/root/anaconda3/bin/jupyter-labhub'
]
dengan keterangan sebagai berikut
c = get_config() #noqa-
- Fungsi: Menginisialisasi objek konfigurasi JupyterHub (disimpan dalam variabel
c). - Detail: Baris ini wajib ada di setiap awal file konfigurasi JupyterHub agar sistem tahu bahwa baris-baris berikutnya adalah pengaturan untuk aplikasi. Komentar
#noqa(No Quality Assurance) digunakan untuk memberi tahu alat pemeriksa kode (seperti Flake8/Pylint) agar mengabaikan peringatan error (karenaget_config()secara teknis adalah fungsi bawaan runtime JupyterHub yang tidak perlu di-import).
- Fungsi: Menginisialisasi objek konfigurasi JupyterHub (disimpan dalam variabel
c.JupyterHub.bind_url = 'http://0.0.0.0:8087'-
- Fungsi: Mengatur alamat IP dan port utama tempat pengguna mengakses halaman web JupyterHub.
- Detail:
-
0.0.0.0artinya JupyterHub akan mendengarkan (listen) semua koneksi masuk dari jaringan luar, bukan hanya dari komputer itu sendiri (localhost).8087adalah port jaringan yang digunakan. Jadi, pengguna akan mengakses JupyterHub ini melalui browser dengan mengetik alamathttp://IP_Server_Anda:8087.
-
c.JupyterHub.hub_bind_url = 'http://127.0.0.1:8088'-
- Fungsi: Mengatur alamat internal untuk proses pusat JupyterHub (The Hub) berkomunikasi dengan komponen internal lainnya (seperti proxy).
- Detail:
-
127.0.0.1berarti port ini hanya bisa diakses secara lokal dari dalam server itu sendiri demi keamanan.8088adalah port khusus internal. Lalu lintas dari pengguna luar tidak akan langsung masuk ke port ini, melainkan dijembatani oleh Configurable HTTP Proxy.
-
c.Spawner.default_url = '/lab'-
- Fungsi: Mengubah tampilan halaman utama saat pengguna berhasil login.
- Detail: Secara bawaan, pengguna akan diarahkan ke tampilan Jupyter Notebook klasik (
/tree). Dengan mengubahnya ke/lab, setiap kali pengguna masuk, mereka akan langsung disajikan antarmuka JupyterLab yang lebih modern, lengkap dengan fitur multi-tab dan manajemen file yang lebih baik.
c.Authenticator.allow_all = True-
- Fungsi: Mengizinkan semua pengguna yang valid di sistem autentikasi untuk masuk ke JupyterHub.
- Detail: Jika Anda menggunakan PAM (sistem user Linux), baris ini memastikan bahwa semua user OS Linux yang terdaftar dan memasukkan password dengan benar di server tersebut otomatis diizinkan masuk ke JupyterHub tanpa perlu didaftarkan satu per satu secara manual di daftar putih (allowlist) JupyterHub.
c.Spawner.cmd = ['/root/anaconda3/bin/jupyter-labhub']- Fungsi: Menentukan file eksekusi (executable binary) spesifik yang digunakan untuk menjalankan server notebook setiap pengguna.
- Detail:
- Konfigurasi ini memaksa JupyterHub untuk menggunakan package dari instalasi Anaconda yang terletak di direktori
/root/anaconda3/. jupyter-labhubadalah perintah khusus yang memastikan JupyterLab berjalan dengan konfigurasi keamanan dan integrasi yang tepat di bawah kendali JupyterHub.
- Konfigurasi ini memaksa JupyterHub untuk menggunakan package dari instalasi Anaconda yang terletak di direktori
Run Jupyterhub
/opt/anaconda3/bin/jupyterhub --debug -f /etc/jupyterhub/jupyterhub_config.py
kalian bisa login dengan port http://IP_SERVER:8087. Nanti kalian akan diminta username dan password seperti login di desktop/terminal.

Bikin Service
Agar lebih mantap, kalian bisa bikin service, misalkan kita beri nama jupyterhub.service
sudo nano /etc/systemd/system/jupyterhub.service
isi dengan kode berikut
[Unit]
Description=JupyterHub
After=network.target
[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/etc/jupyterhub
ExecStart=/root/anaconda3/bin/jupyterhub \
-f /etc/jupyterhub/jupyterhub_config.py
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
Jika ingin membatasi hanya user tertentu
Tambahkan di jupyterhub_config.py:
c.Authenticator.allowed_users = {
'user1',
'user2',
'user3'
}
kenapa ketika mematikan jupyterhub masih harus perlu mematikan pkill -f configurable-http-proxy
Yup hal ini terjadi kalau kalian menjalankan jupyterhub di terminal manual tanpa dibuat service. Alasan utama mengapa Anda masih harus menjalankan perintah pkill -f configurable-http-proxy setelah mematikan JupyterHub adalah karena proses Proxy berjalan terpisah sebagai sub-proses independen (Detached Process).
Ketika JupyterHub dimatikan secara paksa atau tidak sempurna, hubungan induk-anak (parent-child) antar proses tersebut terputus, membuat Proxy tertinggal di latar belakang sebagai proses hantu (Zombie/Orphan Process).
Berikut adalah penjelasan teknis mengapa hal ini sering terjadi:
1. Cara Mematikan JupyterHub Kurang Tepat
Jika Anda mematikan JupyterHub menggunakan kombinasi tombol Ctrl + C berkali-kali secara cepat, atau menggunakan perintah kill -9 , Anda memaksa proses utama (Hub) langsung mati seketika.
- Akibatnya: Hub tidak sempat menjalankan fungsi cleanup (pembersihan) untuk mengirimkan sinyal mati ke komponen pendukungnya, termasuk configurable-http-proxy.
2. Fitur “Resilience” (Ketahanan) JupyterHub
Secara arsitektur, configurable-http-proxy dirancang agar bisa terus hidup meskipun aplikasi utama JupyterHub sedang mengalami crash atau sedang di-restart.
- Tujuannya: Agar pengguna yang sedang aktif menggunakan JupyterLab di browser tidak langsung terputus koneksinya saat server JupyterHub utama sedang diperbarui atau dinyalakan ulang. Namun, efek sampingnya adalah proxy ini sering tertinggal saat Anda berniat mematikan seluruh server.
3. Konfigurasi cleanup_proxy Tidak Aktif
JupyterHub memiliki pengaturan internal untuk membersihkan proxy secara otomatis. Jika pengaturan ini tidak sengaja berubah menjadi False baik secara sengaja maupun tidak sengaja, server tidak akan pernah menyentuh proses proxy saat dimatikan. [1, 2, 6]
Jika baris ini ada di jupyterhub_config.py Anda, proxy tidak akan ikut mati
c.JupyterHub.cleanup_proxy = False
Efek Jika Proxy Tidak Dimatikan
Jika Anda membiarkan proses proxy lama tetap berjalan, Anda akan menghadapi error Address already in use (Port 8087 atau 8001 macet) saat mencoba menyalakan kembali JupyterHub. JupyterHub yang baru tidak akan bisa berjalan karena jalurnya masih dikuasai oleh proxy yang lama.
Solusi Praktis Agar Tidak Perlu pkill Terus-Menerus
Daripada menjalankan JupyterHub secara manual di terminal biasa, sangat disarankan untuk membungkus JupyterHub ke dalam Systemd Service Linux.
Dengan membuat file service di OS Linux, sistem operasi yang akan bertanggung jawab memastikan seluruh pohon proses (Hub, Proxy, dan Notebook User) mati secara bersih dan serentak cukup dengan satu perintah:
sudo systemctl stop jupyterhub