User Management Guide#
This guide covers user management via the Admin Panel (web interface) and CLI scripts.
Prerequisites#
# Install dependencies
pip install pandas openpyxl requests
Initial Setup#
Auto-Admin on Helm Install#
When custom.adminUser.enabled: true is set in values.yaml, helm install automatically:
Generates random API token and admin password
Creates
jupyterhub-admin-credentialssecretConfigures
adminuser with admin privileges on hub startup
The API token is associated with the admin user for script operations.
Get credentials after install:
# Get admin password
kubectl -n jupyterhub get secret jupyterhub-admin-credentials \
-o go-template='{{index .data "admin-password" | base64decode}}'
# Get API token
export JUPYTERHUB_TOKEN=$(kubectl -n jupyterhub get secret jupyterhub-admin-credentials \
-o go-template='{{index .data "api-token" | base64decode}}')
Manual Setup (if auto-admin disabled)#
If custom.adminUser.enabled: false, create credentials manually:
# Create secret with random token and password
kubectl -n jupyterhub create secret generic jupyterhub-admin-credentials \
--from-literal=api-token=$(openssl rand -hex 32) \
--from-literal=admin-password=$(openssl rand -base64 12)
# Restart hub to apply
kubectl -n jupyterhub rollout restart deployment/hub
Daily Usage#
Set Environment Variables#
# Get token from Kubernetes secret
export JUPYTERHUB_TOKEN=$(kubectl -n jupyterhub get secret jupyterhub-admin-credentials \
-o go-template='{{index .data "api-token" | base64decode}}')
export JUPYTERHUB_URL="http://localhost:30890" # Or your hub URL
Or add to your shell profile (~/.bashrc or ~/.zshrc):
alias jhtoken='export JUPYTERHUB_TOKEN=$(kubectl -n jupyterhub get secret jupyterhub-admin-credentials -o go-template="{{index .data \"api-token\" | base64decode}}")'
Web Interface (Admin Panel)#
Access the Admin Panel at /hub/admin/users.
User Table#
The user table displays:
Username - Click to view user details
Admin - Admin status badge
Quota - Current quota balance (if quota system enabled)
Server - Server status (Running/Stopped)
Last Activity - Last login or activity time
Create User#
Click “Create Users” button
Enter usernames (one per line for batch creation)
Choose password option:
Generate random passwords (default) - Each user gets a unique password
Set password - Enter a password for all users
(Optional) Check “Force password change on first login”
(Optional) Check “Grant admin privileges”
Click “Create Users”
After creation, copy the username/password table to share with users
Edit User#
Click the pencil icon on a user row to view user details
Click “Edit User” to enter edit mode
Available modifications:
Username - Rename the user (warning: user must login with new name)
Admin status - Grant or revoke admin privileges
Groups - Assign user to groups
Click “Save Changes”
Set Password#
Click the key icon on a user row
Enter new password, or click “Generate” for a random password
(Optional) Check “Force password change on next login”
Click “Set Password”
After success, copy the password to share with the user
Server Control#
Stop: Click the red stop button to stop a user’s running server
Start: Click the green play button to start a user’s server
Batch Operations#
Select multiple users using checkboxes
Available batch actions:
Start All Selected - Start servers for selected users
Stop All Selected - Stop servers for selected users
Set Quota - Set quota for selected users (see Quota System)
Search and Filter#
Use the search box to filter users by username
Toggle “Only Active Servers” to show only users with running servers
Click column headers to sort by that column
Manage Groups#
Click “Manage Groups” to navigate to the group management page.
Script Usage#
1. Generate User Templates#
Create user list templates for batch operations.
# Generate 50 students
python scripts/generate_users_template.py --prefix student --count 50 --output users.csv
# Generate AUP users (AUP01, AUP02, ...)
python scripts/generate_users_template.py --prefix AUP --count 30 --start 1 --output aup_users.xlsx
# Generate with 3-digit padding
python scripts/generate_users_template.py --prefix student --count 100 --digits 3 --output users.csv
# Custom usernames
python scripts/generate_users_template.py --names alice bob charlie --output custom.csv
Output format (CSV/Excel):
username,admin
student01,false
student02,false
student03,false
2. Manage Users#
Perform batch operations via JupyterHub API.
# Create users from file
python scripts/manage_users.py create users.csv
# List all users
python scripts/manage_users.py list
# Export users to backup file
python scripts/manage_users.py export backup.xlsx
# Delete users (with confirmation)
python scripts/manage_users.py delete remove_list.csv
# Delete users (skip confirmation)
python scripts/manage_users.py delete remove_list.csv --yes
3. Manage Admin Privileges#
Grant or revoke admin privileges for existing users.
# Grant admin to single user
python scripts/manage_users.py set-admin teacher01
# Grant admin to multiple users
python scripts/manage_users.py set-admin teacher01 teacher02 teacher03
# Grant admin from file
python scripts/manage_users.py set-admin -f admins.csv
# Revoke admin privileges
python scripts/manage_users.py set-admin --revoke student01
# Batch revoke
python scripts/manage_users.py set-admin --revoke -f demote_list.csv
4. Set Passwords#
Set default passwords for users (requires kubectl access).
Note: For quota management commands (
set-quota,add-quota,list-quota), see the User Quota System documentation.
# Set passwords from file with password column
python scripts/manage_users.py set-passwords users_with_passwords.csv
# Generate random passwords for users
python scripts/manage_users.py set-passwords users.csv --generate -o passwords_output.csv
# Set same default password for all users
python scripts/manage_users.py set-passwords users.csv --generate --default-password "Welcome123"
# Set passwords without forcing change on first login
python scripts/manage_users.py set-passwords users.csv --no-force-change
Common Workflows#
Create New Users#
# Step 1: Generate template
python scripts/generate_users_template.py \
--prefix student \
--count 50 \
--output new_students.csv
# Step 2: (Optional) Edit CSV to customize
# Edit new_students.csv if needed
# Step 3: Create users in JupyterHub
python scripts/manage_users.py create new_students.csv
Expected output:
✅ Connected to JupyterHub at http://localhost:30890
📄 Loaded 50 users from new_students.csv
🔄 Creating 50 users...
✅ Created user: student01 (admin=False)
✅ Created user: student02 (admin=False)
...
==================================================
📊 Results:
✅ Created: 50
⚠️ Already exist: 0
❌ Failed: 0
==================================================
Promote Users to Admin#
# Single user
python scripts/manage_users.py set-admin teacher01
# Multiple users
python scripts/manage_users.py set-admin teacher01 teacher02
# From file (any CSV with username column)
python scripts/manage_users.py set-admin -f new_admins.csv
Backup Users#
# Backup current users
python scripts/manage_users.py export users_backup_$(date +%Y%m%d).xlsx
# Later: restore users
python scripts/manage_users.py create users_backup_20260113.xlsx
Remove Users#
# Step 1: Export current users
python scripts/manage_users.py export all_users.csv
# Step 2: Edit CSV, keep only users to delete
# Create remove_list.csv with usernames to delete
# Step 3: Delete users
python scripts/manage_users.py delete remove_list.csv
File Format#
Both scripts support CSV and Excel (.xlsx) formats.
Required column:
username- Username to create/delete
Optional columns:
admin- Set totruefor admin users (default:false)password- Password for set-passwords command
Example CSV:
username,admin
student01,false
student02,false
teacher01,true
Troubleshooting#
Connection Issues#
Symptom: “Connection refused”
Solutions:
# Check hub is running
kubectl --namespace=jupyterhub get pods
# For local dev
export JUPYTERHUB_URL="http://localhost:30890"
# For production
export JUPYTERHUB_URL="https://your-domain.com"
# Test connection
curl $JUPYTERHUB_URL/hub/api/
Authentication Issues#
Symptom: “Authentication failed”
Solutions:
# Verify token is set
echo $JUPYTERHUB_TOKEN
# Test token
curl -X GET $JUPYTERHUB_URL/hub/api/ \
-H "Authorization: token $JUPYTERHUB_TOKEN"
Common Errors#
“User already exists”
This is just a warning, not an error
The user is already in the system
“File must contain ‘username’ column”
Ensure your file has a
usernamecolumn header
Notes#
Auto-Admin: Initial admin is created automatically on helm install
Additional Admins: Use
set-admincommand or Admin PanelFirst Login: Native users must set their password on first login
Safety: Delete operations ask for confirmation (use
--yesto skip)Batch Size: No limit, but larger batches (1000+) may be slow
Help#
Get detailed help for each script:
python scripts/generate_users_template.py --help
python scripts/manage_users.py --help