JupyterLab is the default workspace for GPU-accelerated Python – notebooks, terminals, file browser and a proper IDE all in one tab. This guide walks a production-grade install on the RTX 5060 Ti 16GB via our dedicated GPU hosting – isolated env, password auth, TLS proxy and a systemd service unit that survives reboots.
Contents
- Prerequisites
- Python environment
- Password and config
- systemd service
- TLS reverse proxy
- GPU sanity check
Prerequisites
| Component | Version | Notes |
|---|---|---|
| Ubuntu | 24.04 LTS | Blackwell-ready driver in-distro |
| NVIDIA driver | 570+ | Required for RTX 5060 Ti |
| CUDA toolkit | 12.6+ | For manual kernel builds |
| Python | 3.11 | Best ecosystem compatibility |
| nginx | 1.24+ | TLS termination |
See Ubuntu driver install and first-day checklist before proceeding.
Python Environment
sudo useradd -m -s /bin/bash jupyter
sudo -iu jupyter
# Isolated venv
python3.11 -m venv ~/venv
source ~/venv/bin/activate
pip install --upgrade pip
pip install jupyterlab==4.2.* ipywidgets
pip install torch --index-url https://download.pytorch.org/whl/cu126
pip install transformers accelerate bitsandbytes peft datasets
pip install vllm # optional, heavy
Password and Config
source ~/venv/bin/activate
jupyter lab --generate-config
# Set password (hashed)
python -c "from jupyter_server.auth import passwd; print(passwd('YOUR-PASS'))"
# argon2:$argon2id$v=19$...
cat >> ~/.jupyter/jupyter_lab_config.py << 'EOF'
c.ServerApp.ip = '127.0.0.1' # nginx fronts it
c.ServerApp.port = 8888
c.ServerApp.open_browser = False
c.ServerApp.root_dir = '/home/jupyter/work'
c.ServerApp.password = 'argon2:...' # paste hash here
c.ServerApp.allow_remote_access = True
c.ServerApp.token = '' # password only
EOF
mkdir -p ~/work
systemd Service
# /etc/systemd/system/jupyterlab.service
[Unit]
Description=JupyterLab
After=network.target
[Service]
Type=simple
User=jupyter
Group=jupyter
WorkingDirectory=/home/jupyter/work
Environment="PATH=/home/jupyter/venv/bin"
ExecStart=/home/jupyter/venv/bin/jupyter lab \
--config=/home/jupyter/.jupyter/jupyter_lab_config.py
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
Enable and start:
sudo systemctl daemon-reload
sudo systemctl enable --now jupyterlab
sudo systemctl status jupyterlab
TLS Reverse Proxy
# /etc/nginx/sites-available/jupyter
server {
listen 443 ssl http2;
server_name notebook.example.com;
ssl_certificate /etc/letsencrypt/live/notebook.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/notebook.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8888;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 86400; # long-lived WS
}
}
Get a certificate with certbot, then reload nginx. The browser loads https://notebook.example.com and prompts for the password.
GPU Sanity Check
Open a new notebook and paste:
import torch
print(torch.cuda.is_available())
print(torch.cuda.get_device_name(0))
print(f"VRAM: {torch.cuda.get_device_properties(0).total_memory / 1e9:.1f} GB")
# Tiny matmul to confirm compute
x = torch.randn(4096, 4096, device='cuda', dtype=torch.bfloat16)
y = x @ x
torch.cuda.synchronize()
print("OK")
Expected output: True, NVIDIA GeForce RTX 5060 Ti, VRAM: 16.0 GB, OK.
JupyterLab on Blackwell 16 GB
Notebook workspace with dedicated GPU. UK dedicated hosting.
Order the RTX 5060 Ti 16GBSee also: VS Code Remote setup, Docker CUDA setup, Ubuntu driver install, first-day checklist, vLLM setup.