Kelola Server JupyterLab Bersama Menggunakan JupyterHub

12 Views

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

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

1. 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 (karena get_config() secara teknis adalah fungsi bawaan runtime JupyterHub yang tidak perlu di-import).
See also  Membuat Service AutoSSH untuk tunneling

2. 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.0 artinya JupyterHub akan mendengarkan (listen) semua koneksi masuk dari jaringan luar, bukan hanya dari komputer itu sendiri (localhost).
        • 8087 adalah port jaringan yang digunakan. Jadi, pengguna akan mengakses JupyterHub ini melalui browser dengan mengetik alamat http://IP_Server_Anda:8087.

3. 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.1 berarti port ini hanya bisa diakses secara lokal dari dalam server itu sendiri demi keamanan.
        • 8088 adalah port khusus internal. Lalu lintas dari pengguna luar tidak akan langsung masuk ke port ini, melainkan dijembatani oleh Configurable HTTP Proxy.

4. 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.

5. 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.

6. 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-labhub adalah perintah khusus yang memastikan JupyterLab berjalan dengan konfigurasi keamanan dan integrasi yang tepat di bawah kendali JupyterHub.

Run Jupyterhub

Jika semuanya sudah OK, bisa kita jalankan dengan perintah berikut
/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

 

See also  Membuat Service Tunneling di NGROK