JupyterHub 404 -- Python 3.13.9, NodeJS-v24.11.0, NPM-11.6.1, CHP-5.1.0, Ubuntu 24.04

Error ==
404 : Not Found
You are requesting a page that does not exist!

Have been struggling to make it work.
Wondering
(a.) Is there a page OR a list of Compatible versions of all this software/technologies to make it work.
(b.) Is there a page which lists out the details to make it work and the config file/details and the parameters
(c.) Is there a YouTube/other streams video which shows the Config/Settings of JupyterHub?
(d.) Am getting a 404 Error when am trying to logon to a user spawned page post logon to JupyterHub.But the admin page is working perfectly fine.
User Page URL == http://##.###.###.##:8579/user/id1234/lab?
Admin Page URL ==http://##.###.###.##:8579/hub/admin

~~~~<jupyterhub_config.py>~~~~

import os
import shutil

c = get_config()  #noqa

c.JupyterHub.hub_ip = ‘##.##.##.##’
c.JupyterHub.bind_url = ‘http://##.##.##.##:8579’
c.Spawner.ip = ‘##.##.##.##’
c.JupyterHub.port = 8579
c.JupyterHub.hub_port = 8580
c.JupyterHub.authenticator_class = ‘jupyterhub.auth.PAMAuthenticator’
c.Authenticator.allow_all = True
c.Authenticator.admin_users = {‘id1234’}
c.Spawner.environment = {
“JUPYTERLAB_DIR”:       “/usr/local/share/jupyter/lab”,
“JUPYTER_PATH”:         “/usr/local/share/jupyter”,
“JUPYTER_CONFIG_PATH”:  “/usr/local/etc/jupyter”,
“JUPYTER_CONFIG_DIR”:   “/usr/local/etc/jupyter”,
}

c.Spawner.env_keep = [
“PATH”,
“PYTHONPATH”,
“JUPYTERLAB_DIR”,
“JUPYTER_PATH”,
“JUPYTER_CONFIG_PATH”,
“JUPYTER_CONFIG_DIR”,
]

c.Spawner.cmd = [“jupyterhub-singleuser”]
c.Spawner.default_url = ‘/lab’
c.ServerApp.terminals_enabled = True

c.Application.log_handler = ‘file’
c.Application.log_level = ‘DEBUG’
c.JupyterHub.log_level = ‘DEBUG’
c.Spawner.debug = True
c.ConfigurableHTTPProxy.debug = True

~~~~<jupyterhub_config.py>~~~~

LOG file . . .

nohup: ignoring input
[W 2025-11-12 19:21:49.151 JupyterHub configurable:214] Config option log_handler not recognized by JupyterHub.  Did you mean one of: extra_handlers, extra_log_handlers, logo_file?
[W 2025-11-12 19:21:49.155 JupyterHub app:724] Both bind_url and ip/port/base_url have been configured.  please use just one or the other.
[I 2025-11-12 19:21:49.155 JupyterHub app:3359] Running JupyterHub version 5.4.2
[I 2025-11-12 19:21:49.155 JupyterHub app:8579] Using Authenticator: jupyterhub.auth.PAMAuthenticator-5.4.2
[I 2025-11-12 19:21:49.155 JupyterHub app:8579] Using Spawner: jupyterhub.spawner.LocalProcessSpawner-5.4.2
[I 2025-11-12 19:21:49.155 JupyterHub app:8579] Using Proxy: jupyterhub.proxy.ConfigurableHTTPProxy-5.4.2
/usr/local/lib/python3.13/site-packages/jupyter_events/schema.py:68: JupyterEventsVersionWarning: The version property of an event schema must be a string. It has been type coerced, but in a future version of this library, it will fail to validate. Please update schema: https://schema.jupyter.org/jupyterhub/events/server-action
validate_schema(_schema)
[D 2025-11-12 19:21:49.160 JupyterHub app:1875] Generating new cookie_secret
[I 2025-11-12 19:21:49.160 JupyterHub app:1880] Writing cookie_secret to /etc/jupyterhub/jupyterhub_cookie_secret
[D 2025-11-12 19:21:49.160 JupyterHub app:2010] Connecting to db: sqlite:///jupyterhub.sqlite
[D 2025-11-12 19:21:49.174 JupyterHub orm:1477] Stamping empty database with alembic revision 4621fec11365
[I 2025-11-12 19:21:49.175 alembic.runtime.migration migration:211] Context impl SQLiteImpl.
[I 2025-11-12 19:21:49.175 alembic.runtime.migration migration:214] Will assume non-transactional DDL.
[I 2025-11-12 19:21:49.186 alembic.runtime.migration migration:622] Running stamp_revision  → 4621fec11365
[D 2025-11-12 19:21:49.186 alembic.runtime.migration migration:830] new branch insert 4621fec11365
[I 2025-11-12 19:21:49.424 JupyterHub proxy:556] Generating new CONFIGPROXY_AUTH_TOKEN
[D 2025-11-12 19:21:49.424 JupyterHub app:2350] Loading roles into database
[D 2025-11-12 19:21:49.439 JupyterHub roles:326] Assigning default role to User id1234
[I 2025-11-12 19:21:49.442 JupyterHub roles:281] Adding role admin for User: id1234
[I 2025-11-12 19:21:49.450 JupyterHub roles:281] Adding role user for User: id1234
[D 2025-11-12 19:21:49.469 JupyterHub app:2697] Purging expired APITokens
[D 2025-11-12 19:21:49.470 JupyterHub app:2697] Purging expired OAuthCodes
[D 2025-11-12 19:21:49.472 JupyterHub app:2697] Purging expired Shares
[D 2025-11-12 19:21:49.472 JupyterHub app:2697] Purging expired ShareCodes
[D 2025-11-12 19:21:49.474 JupyterHub app:2471] Loading role assignments from config
[D 2025-11-12 19:21:49.483 JupyterHub app:2982] Initializing spawners
[D 2025-11-12 19:21:49.488 JupyterHub app:3133] Loaded users:

[I 2025-11-12 19:21:49.488 JupyterHub app:3429] Initialized 0 spawners in 0.005 seconds
[I 2025-11-12 19:21:49.491 JupyterHub metrics:425] Found 0 active users in the last ActiveUserPeriods.twenty_four_hours
[I 2025-11-12 19:21:49.492 JupyterHub metrics:425] Found 0 active users in the last ActiveUserPeriods.seven_days
[I 2025-11-12 19:21:49.492 JupyterHub metrics:425] Found 0 active users in the last ActiveUserPeriods.thirty_days
[W 2025-11-12 19:21:49.492 JupyterHub proxy:748] Running JupyterHub without SSL.  I hope there is SSL termination happening somewhere else…
[I 2025-11-12 19:21:49.492 JupyterHub proxy:752] Starting proxy @ http://:8579/
[D 2025-11-12 19:21:49.492 JupyterHub proxy:753] Proxy cmd: [‘configurable-http-proxy’, ‘–ip’, ‘’, ‘–port’, ‘8579’, ‘–api-ip’, ‘127.0.0.1’, ‘–api-port’, ‘8001’, ‘–error-target’, ‘http://##.###.###.##:8580/hub/error’, ‘–log-level’, ‘debug’]
[D 2025-11-12 19:21:49.493 JupyterHub proxy:670] Writing proxy pid file: jupyterhub-proxy.pid
[D 2025-11-12 19:21:49.494 JupyterHub utils:278] Waiting 10s for server at ip-##-###-###-##:8579
[D 2025-11-12 19:21:49.494 JupyterHub utils:121] Server at ip-##-###-###-##:8579 not ready: [Errno 111] Connection refused
[D 2025-11-12 19:21:49.494 JupyterHub utils:278] Waiting 10s for server at 127.0.0.1:8001
[D 2025-11-12 19:21:49.494 JupyterHub utils:121] Server at 127.0.0.1:8001 not ready: [Errno 111] Connection refused
[D 2025-11-12 19:21:49.550 JupyterHub utils:121] Server at ip-##-###-###-##:8579 not ready: [Errno 111] Connection refused
2025-11-12T19:21:49.593Z [ConfigProxy] e[32minfoe[39m: Proxying http://*:8579 to (no default)
2025-11-12T19:21:49.594Z [ConfigProxy] e[32minfoe[39m: Proxy API at http://127.0.0.1:8001/api/routes
[D 2025-11-12 19:21:49.607 JupyterHub utils:286] Server at 127.0.0.1:8001 responded in 0.11s
[D 2025-11-12 19:21:49.616 JupyterHub utils:286] Server at ip-##-###-###-##:8579 responded in 0.12s
[D 2025-11-12 19:21:49.616 JupyterHub proxy:832] Proxy started and appears to be up
[D 2025-11-12 19:21:49.617 JupyterHub proxy:925] Proxy: Fetching GET http://127.0.0.1:8001/api/routes
2025-11-12T19:21:49.620Z [ConfigProxy] e[32minfoe[39m: 200 GET /api/routes
[I 2025-11-12 19:21:49.620 JupyterHub app:3752] Hub API listening on http://##.###.###.##:8580/hub/
[D 2025-11-12 19:21:49.620 JupyterHub proxy:389] Fetching routes to check
[D 2025-11-12 19:21:49.621 JupyterHub proxy:925] Proxy: Fetching GET http://127.0.0.1:8001/api/routes
2025-11-12T19:21:49.622Z [ConfigProxy] e[32minfoe[39m: 200 GET /api/routes
[D 2025-11-12 19:21:49.622 JupyterHub proxy:392] Checking routes
[I 2025-11-12 19:21:49.622 JupyterHub proxy:477] Adding route for Hub: / => http://##.###.###.##:8580
[D 2025-11-12 19:21:49.622 JupyterHub proxy:925] Proxy: Fetching POST http://127.0.0.1:8001/api/routes/
2025-11-12T19:21:49.622Z [ConfigProxy] e[32minfoe[39m: Adding route / → http://##.###.###.##:8580
2025-11-12T19:21:49.623Z [ConfigProxy] e[32minfoe[39m: Route added / → http://##.###.###.##:8580
2025-11-12T19:21:49.623Z [ConfigProxy] e[32minfoe[39m: 201 POST /api/routes/
[I 2025-11-12 19:21:49.623 JupyterHub app:3783] JupyterHub is now running at http://:8579/
[D 2025-11-12 19:21:49.623 JupyterHub app:3352] It took 0.476 seconds for the Hub to start
2025-11-12T19:22:01.178Z [ConfigProxy] e[34mdebuge[39m: PROXY WEB / to http://##.###.###.##:8580
[I 2025-11-12 19:22:01.182 JupyterHub log:192] 302 GET / → /hub/ (@::ffff:##.###.###.#) 0.53ms
2025-11-12T19:22:01.184Z [ConfigProxy] e[34mdebuge[39m: Not recording activity for status 302 on /
2025-11-12T19:22:01.342Z [ConfigProxy] e[34mdebuge[39m: PROXY WEB /hub/ to http://##.###.###.##:8580
[W 2025-11-12 19:22:01.344 JupyterHub base:482] Invalid or expired cookie token
[I 2025-11-12 19:22:01.345 JupyterHub log:192] 302 GET /hub/ → /hub/login?next=%2Fhub%2F (@::ffff:##.###.###.#) 0.97ms
2025-11-12T19:22:01.345Z [ConfigProxy] e[34mdebuge[39m: Not recording activity for status 302 on /
2025-11-12T19:22:01.498Z [ConfigProxy] e[34mdebuge[39m: PROXY WEB /hub/login to http://##.###.###.##:8580
[I 2025-11-12 19:22:01.500 JupyterHub _xsrf_utils:130] Setting new xsrf cookie for b’6b9aa1787b7345dab5f8cd4fa5b6b97d:dSVWQroDRipobvKyQVPbLCekJ2yTEuT3ISLe92XHBtY=’ {‘path’: ‘/hub/’, ‘max_age’: 3600}
[I 2025-11-12 19:22:01.500 JupyterHub _xsrf_utils:130] Setting new xsrf cookie for b’6b9aa1787b7345dab5f8cd4fa5b6b97d:dSVWQroDRipobvKyQVPbLCekJ2yTEuT3ISLe92XHBtY=’ {‘path’: ‘/hub/’, ‘max_age’: 3600}
[I 2025-11-12 19:22:01.520 JupyterHub log:192] 200 GET /hub/login?next=%2Fhub%2F (@::ffff:##.###.###.#) 20.89ms
2025-11-12T19:22:@fortawesome1.720Z [ConfigProxy] e[34mdebuge[39m: PROXY WEB /hub/static/components/@fortawesome/fontawesome-free/css/solid.css to http://##.###.###.##:8580
2025-11-12T1@fortawesome:22:01.721Z [ConfigProxy] e[34mdebuge[39m: PROXY WEB /hub/static/components/@fortawesome/fontawesome-free/css/fontawesome.css to http://##.###.###.##:8@fortawesome80
[D 2025-11-12 19:22:01.723 JupyterHub log:192] 304 GET /hub/static/components/@fortawesome/fontawesome-free/css/solid.css (@::ffff:##.###.###.#) 2.27ms
2025-11-12T19:22:01.724Z [ConfigProxy] e[34mdebuge[39m: Not recording activity for status 304 o@fortawesome /
[D 2025-11-12 19:22:01.724 JupyterHub log:192] 304 GET /hub/static/components/@fortawesome/fontawesome-free/css/fontawesome.css (@::ffff:##.###.###.#) 0.36ms
2025-11-12T19:22:01.724Z [ConfigProxy] e[34mdebuge[39m: Not recording activity for status 304 on /
2025-11@fortawesome12T19:22:01.915Z [ConfigProxy] e[34mdebuge[39m: PROXY WEB /hub/static/components/@fortawesome/fontawesome-free/webfonts/fa-solid-900.woff2 to http://##.###.###@fortawesome##:8580
[D 2025-11-12 19:22:01.916 JupyterHub log:192] 304 GET /hub/static/components/@fortawesome/fontawesome-free/webfonts/fa-solid-900.woff2 (@::ffff:##.###.###.#) 0.50ms
2025-11-12T19:22:01.917Z [ConfigProxy] e[34mdebuge[39m: Not recording activity for status 304 on /
2025-11-12T19:22:12.357Z [ConfigProxy] e[34mdebuge[39m: PROXY WEB /hub/login to http://##.###.###.##:8580
[D 2025-11-12 19:22:12.574 JupyterHub roles:326] Assigning default role to User id1234
[D 2025-11-12 19:22:12.576 JupyterHub base:685] Setting cookie for id1234: jupyterhub-hub-login
[D 2025-11-12 19:22:12.576 JupyterHub base:681] Setting cookie jupyterhub-hub-login: {‘httponly’: True, ‘path’: ‘/hub/’}
[I 2025-11-12 19:22:12.576 JupyterHub _xsrf_utils:130] Setting new xsrf cookie for b’6b9aa1787b7345dab5f8cd4fa5b6b97d:82dfe834706c4d16a074a1aa9e2451ac’ {‘path’: ‘/hub/’}
[I 2025-11-12 19:22:12.576 JupyterHub base:973] User logged in: id1234
[I 2025-11-12 19:22:12.576 JupyterHub log:192] 302 POST /hub/login?next=%2Fhub%2F → /hub/ (id1234@::ffff:##.###.###.#) 217.89ms
2025-11-12T19:22:12.577Z [ConfigProxy] e[34mdebuge[39m: Not recording activity for status 302 on /
2025-11-12T19:22:12.728Z [ConfigProxy] e[34mdebuge[39m: PROXY WEB /hub/ to http://##.###.###.##:8580
[D 2025-11-12 19:22:12.732 JupyterHub base:366] Recording first activity for <User(id1234 0/1 running)>
[D 2025-11-12 19:22:12.742 JupyterHub user:496] Creating <class ‘jupyterhub.spawner.LocalProcessSpawner’> for id1234:
[I 2025-11-12 19:22:12.743 JupyterHub log:192] 302 GET /hub/ → /hub/spawn (id1234@::ffff:##.###.###.#) 13.73ms
2025-11-12T19:22:12.743Z [ConfigProxy] e[34mdebuge[39m: Not recording activity for status 302 on /
2025-11-12T19:22:12.882Z [ConfigProxy] e[34mdebuge[39m: PROXY WEB /hub/spawn to http://##.###.###.##:8580
[D 2025-11-12 19:22:12.886 JupyterHub scopes:1013] Checking access to /hub/spawn via scope servers!server=id1234/
[D 2025-11-12 19:22:12.886 JupyterHub pages:241] Triggering spawn with default options for id1234
[D 2025-11-12 19:22:12.886 JupyterHub base:1097] Initiating spawn for id1234
[D 2025-11-12 19:22:12.886 JupyterHub base:1101] 0/100 concurrent spawns
[D 2025-11-12 19:22:12.886 JupyterHub base:1106] 0 active servers
[I 2025-11-12 19:22:12.909 JupyterHub provider:661] Creating oauth client jupyterhub-user-id1234
[D 2025-11-12 19:22:12.937 JupyterHub user:913] Calling Spawner.start for id1234
[I 2025-11-12 19:22:12.938 JupyterHub spawner:2068] Spawning jupyterhub-singleuser
[D 2025-11-12 19:22:12.954 JupyterHub spawner:1706] Polling subprocess every 30s
[D 2025-11-12 19:22:12.962 JupyterHub utils:298] Waiting 30s for server at http://##.###.###.##:51541/user/id1234/api
[I 2025-11-12 19:22:13.887 JupyterHub log:192] 302 GET /hub/spawn → /hub/spawn-pending/id1234 (id1234@::ffff:##.###.###.#) 1004.06ms
2025-11-12T19:22:13.887Z [ConfigProxy] e[34mdebuge[39m: Not recording activity for status 302 on /
2025-11-12T19:22:14.026Z [ConfigProxy] e[34mdebuge[39m: PROXY WEB /hub/spawn-pending/id1234 to http://##.###.###.##:8580
[D 2025-11-12 19:22:14.031 JupyterHub scopes:1013] Checking access to /hub/spawn-pending/id1234 via scope servers!server=id1234/
[I 2025-11-12 19:22:14.031 JupyterHub pages:441] id1234 is pending spawn
[I 2025-11-12 19:22:14.034 JupyterHub log:192] 200 GET /hub/spawn-pending/id1234 (id1234@::ff@fortawesomef:##.###.###.#) 6.63ms
2025-11-12T19:22:14.192Z [ConfigProxy] e[34mdebuge[39m: PROXY WEB /hub/static/components/@fortawesome/fontawesome-free/css/fonta@fortawesomeesome.css to http://##.###.###.##:8580
[D 2025-11-12 19:22:14.193 JupyterHub log:192] 304 GET /hub/static/components/@fortawesome/fontawesome-free/css/fontawesome.css (@::ffff:##.###.###.#) 0.45ms
2025-11-12T19:22:14.194Z [ConfigProxy] e[34mdebuge[39m: Not recording @fortawesomectivity for status 304 on /
2025-11-12T19:22:14.199Z [ConfigProxy] e[34mdebuge[39m: PROXY WEB /hub/static/components/@fortawesome/fontawesome-fre@fortawesome/css/solid.css to http://##.###.###.##:8580
[D 2025-11-12 19:22:14.200 JupyterHub log:192] 304 GET /hub/static/components/@fortawesome/fontawesome-free/css/solid.css (@::ffff:##.###.###.#) 0.33ms
2025-11-12T19:22:14.200Z [ConfigProxy] e[34mdebuge[39m: Not recor@fortawesomeing activity for status 304 on /
2025-11-12T19:22:14.353Z [ConfigProxy] e[34mdebuge[39m: PROXY WEB /hub/static/components/@fortawesome/fontawesome-free/webfont@fortawesome/fa-solid-900.woff2 to http://##.###.###.##:8580
[D 2025-11-12 19:22:14.354 JupyterHub log:192] 304 GET /hub/static/components/@fortawesome/fontawesome-free/webfonts/fa-solid-900.woff2 (@::ffff:##.###.###.#) 0.44ms
2025-11-12T19:22:14.355Z [ConfigProxy] e[34mdebuge[39m: Not recording activity for status 304 on /
2025-11-12T19:22:14.356Z [ConfigProxy] e[34mdebuge[39m: PROXY WEB /hub/api/users/id1234/server/progress to http://##.###.###.##:8580
[W 2025-11-12 19:22:14.359 JupyterHub _xsrf_utils:203] Skipping XSRF check for insecure request GET /hub/api/users/id1234/server/progress
[D 2025-11-12 19:22:14.359 JupyterHub scopes:1013] Checking access to /hub/api/users/id1234/server/progress via scope read:servers!server=id1234/
[I 2025-11-12 19:22:14.758 JupyterHubSingleUser] Starting jupyterhub single-user server extension version 5.4.2
[I 2025-11-12 19:22:14.759 JupyterHubSingleUser] Using default url from environment $JUPYTERHUB_DEFAULT_URL: /lab
[I 2025-11-12 19:22:14.760 ServerApp] jupyterhub | extension was successfully linked.
[I 2025-11-12 19:22:14.773 JupyterHub log:192] 200 GET /hub/api (@##.###.###.##) 0.54ms
[I 2025-11-12 19:22:14.773 JupyterHubSingleUser] Updating Hub with activity every 300 seconds
[I 2025-11-12 19:22:14.773 ServerApp] jupyterhub | extension was successfully loaded.
[I 2025-11-12 19:22:14.776 ServerApp] Serving notebooks from local directory: /home/id1234
[I 2025-11-12 19:22:14.776 ServerApp] Jupyter Server 2.17.0 is running at:
[I 2025-11-12 19:22:14.776 ServerApp] http://##.###.###.##:51541/user/id1234/lab?token=…
[I 2025-11-12 19:22:14.776 ServerApp]     http://127.0.0.1:51541/user/id1234/lab?token=…
[I 2025-11-12 19:22:14.776 ServerApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[D 2025-11-12 19:22:14.781 JupyterHub base:366] Recording first activity for <APIToken(‘943d…’, user=‘id1234’, client_id=‘jupyterhub’)>
[D 2025-11-12 19:22:14.793 JupyterHub scopes:1013] Checking access to /hub/api/users/id1234/activity via scope users:activity!user=id1234
[D 2025-11-12 19:22:14.795 JupyterHub users:1005] Activity for user id1234: 2025-11-12T19:22:14.764881Z
[D 2025-11-12 19:22:14.795 JupyterHub users:1023] Activity on server id1234/: 2025-11-12T19:22:14.764881Z
[I 2025-11-12 19:22:14.802 JupyterHub log:192] 200 POST /hub/api/users/id1234/activity (id1234@##.###.###.##) 23.28ms
[I 2025-11-12 19:22:14.809 ServerApp] 200 GET /user/id1234/api (@##.###.###.##) 0.73ms
[D 2025-11-12 19:22:14.809 JupyterHub utils:334] Server at http://##.###.###.##:51541/user/id1234/api responded in 1.85s
[D 2025-11-12 19:22:14.809 JupyterHub _version:73] jupyterhub and jupyterhub-singleuser both on version 5.4.2
[I 2025-11-12 19:22:14.809 JupyterHub base:1126] User id1234 took 1.923 seconds to start
[I 2025-11-12 19:22:14.810 JupyterHub proxy:331] Adding user id1234 to proxy /user/id1234/ => http://##.###.###.##:51541
[D 2025-11-12 19:22:14.810 JupyterHub proxy:925] Proxy: Fetching POST http://127.0.0.1:8001/api/routes/user/id1234
2025-11-12T19:22:14.811Z [ConfigProxy] e[32minfoe[39m: Adding route /user/id1234 → http://##.###.###.##:51541
2025-11-12T19:22:14.811Z [ConfigProxy] e[32minfoe[39m: Route added /user/id1234 → http://##.###.###.##:51541
2025-11-12T19:22:14.811Z [ConfigProxy] e[32minfoe[39m: 201 POST /api/routes/user/id1234
[I 2025-11-12 19:22:14.812 JupyterHub users:899] Server id1234 is ready
[I 2025-11-12 19:22:14.812 JupyterHub log:192] 200 GET /hub/api/users/id1234/server/progress?_xsrf=[secret] (id1234@::ffff:##.###.###.#) 455.44ms
2025-11-12T19:22:14.956Z [ConfigProxy] e[34mdebuge[39m: PROXY WEB /hub/spawn-pending/id1234 to http://##.###.###.##:8580
[D 2025-11-12 19:22:14.960 JupyterHub scopes:1013] Checking access to /hub/spawn-pending/id1234 via scope servers!server=id1234/
[I 2025-11-12 19:22:14.960 JupyterHub log:192] 302 GET /hub/spawn-pending/id1234 → /user/id1234/ (id1234@::ffff:##.###.###.#) 3.50ms
2025-11-12T19:22:14.961Z [ConfigProxy] e[34mdebuge[39m: Not recording activity for status 302 on /
2025-11-12T19:22:15.105Z [ConfigProxy] e[34mdebuge[39m: PROXY WEB /user/id1234/ to http://##.###.###.##:51541
[I 2025-11-12 19:22:15.107 ServerApp] 302 GET /user/id1234/ → /user/id1234/lab? (@::ffff:##.###.###.#) 0.47ms
2025-11-12T19:22:15.108Z [ConfigProxy] e[34mdebuge[39m: Not recording activity for status 302 on /user/id1234
2025-11-12T19:22:15.248Z [ConfigProxy] e[34mdebuge[39m: PROXY WEB /user/id1234/lab to http://##.###.###.##:51541
[W 2025-11-12 19:22:15.259 ServerApp] 404 GET /user/id1234/lab (@::ffff:##.###.###.#) 10.48ms
2025-11-12T19:22:15.260Z [ConfigProxy] e[34mdebuge[39m: Not recording activity for status 404 on /user/id1234
2025-11-12T19:24:25.229Z [ConfigProxy] e[34mdebuge[39m: PROXY WEB /hub/admin to http://##.###.###.##:8580
[D 2025-11-12 19:24:25.240 JupyterHub scopes:1013] Checking access to /hub/admin via scope admin-ui
[I 2025@fortawesome11-12 19:24:25.243 JupyterHub log:192] 200 GET /hub/admin (id1234@::ffff:##.###.###.#) 13.63ms
2025-11-12T19:24:25.407Z [ConfigProxy] e[34md@fortawesomebuge[39m: PROXY WEB /hub/static/components/@fortawesome/fontawesome-free/css/fontawesome.css to http://##.###.###.##:8580
[D 2025-11-12 19:24:25.409 JupyterHub log:192] 304 GET /hub/static/components/@fortawesome/fontawesome-free/css/fontawesome.css (@::ffff:##.###.###.#) 0.40m@fortawesome
2025-11-12T19:24:25.409Z [ConfigProxy] e[34mdebuge[39m: Not recording activity for status 304 on /
2025-11-12T19:24:25.417Z [ConfigPr@fortawesomexy] e[34mdebuge[39m: PROXY WEB /hub/static/components/@fortawesome/fontawesome-free/css/solid.css to http://##.###.###.##:8580
[D 2025-11-12 19:24:25.418 JupyterHub log:192] 304 GET /hub/static/components/@fortawesome/fontawesome-free/css/solid.css (@::ffff:##.###.###.#) @fortawesome.31ms
2025-11-12T19:24:25.419Z [ConfigProxy] e[34mdebuge[39m: Not recording activity for status 304 on /
2025-11-12T19:24:25.586Z [ConfigProxy] e[34@fortawesomedebuge[39m: PROXY WEB /hub/static/components/@fortawesome/fontawesome-free/webfonts/fa-solid-900.woff2 to http://##.###.###.##:8580
[D 2025-11-12 19:24:25.587 JupyterHub log:192] 304 GET /hub/static/components/@fortawesome/fontawesome-free/webfonts/fa-solid-900.woff2 (@::ffff:##.###.###.#) 0.46ms
2025-11-12T19:24:25.587Z [ConfigProxy] e[34mdebuge[39m: Not recording activity for status 304 on /
2025-11-12T19:24:25.592Z [ConfigProxy] e[34mdebuge[39m: PROXY WEB /hub/api/users to http://##.###.###.##:8580
[W 2025-11-12 19:24:25.595 JupyterHub _xsrf_utils:203] Skipping XSRF check for insecure request GET /hub/api/users
[D 2025-11-12 19:24:25.595 JupyterHub scopes:1013] Checking access to /hub/api/users via scope list:users
[I 2025-11-12 19:24:25.610 JupyterHub log:192] 200 GET /hub/api/users?include_stopped_servers=1&offset=0&limit=50&name_filter=&sort=id&state=[secret]&_xsrf=[secret] (id1234@::ffff:##.###.###.#) 17.59ms
2025-11-12T19:24:32.260Z [ConfigProxy] e[34mdebuge[39m: PROXY WEB /hub/api/users/id1234/servers/ to http://##.###.###.##:8580
[D 2025-11-12 19:24:32.264 JupyterHub scopes:1013] Checking access to /hub/api/users/id1234/servers/ via scope delete:servers!server=id1234/
[I 2025-11-12 19:24:32.266 JupyterHub proxy:356] Removing user id1234 from proxy (/user/id1234/)
[D 2025-11-12 19:24:32.266 JupyterHub proxy:925] Proxy: Fetching DELETE http://127.0.0.1:8001/api/routes/user/id1234
2025-11-12T19:24:32.267Z [ConfigProxy] e[32minfoe[39m: Removing route /user/id1234
2025-11-12T19:24:32.267Z [ConfigProxy] e[32minfoe[39m: 204 DELETE /api/routes/user/id1234
[D 2025-11-12 19:24:32.268 JupyterHub user:1097] Stopping id1234
[D 2025-11-12 19:24:32.268 JupyterHub spawner:2156] Interrupting 155252
[I 2025-11-12 19:24:32.268 ServerApp] Interrupted…
[D 2025-11-12 19:24:32.748 JupyterHub user:1119] Deleting oauth client jupyterhub-user-id1234
[D 2025-11-12 19:24:32.759 JupyterHub user:1122] Finished stopping id1234
[I 2025-11-12 19:24:32.779 JupyterHub base:1365] User id1234 server took 0.513 seconds to stop
[I 2025-11-12 19:24:32.779 JupyterHub log:192] 204 DELETE /hub/api/users/id1234/servers/?_xsrf=[secret] (id1234@::ffff:##.###.###.#) 517.75ms
2025-11-12T19:24:32.917Z [ConfigProxy] e[34mdebuge[39m: PROXY WEB /hub/api/users to http://##.###.###.##:8580
[W 2025-11-12 19:24:32.920 JupyterHub _xsrf_utils:203] Skipping XSRF check for insecure request GET /hub/api/users
[D 2025-11-12 19:24:32.921 JupyterHub scopes:1013] Checking access to /hub/api/users via scope list:users
[I 2025-11-12 19:24:32.925 JupyterHub log:192] 200 GET /hub/api/users?include_stopped_servers=1&offset=0&limit=50&name_filter=&sort=id&state=[secret]&_xsrf=[secret] (id1234@::ffff:##.###.###.#) 7.41ms
2025-11-12T19:24:57.387Z [ConfigProxy] e[34mdebuge[39m: PROXY WEB /hub/api/shutdown to http://##.###.###.##:8580
[D 2025-11-12 19:24:57.391 JupyterHub scopes:1013] Checking access to /hub/api/shutdown via scope shutdown
[I 2025-11-12 19:24:57.391 JupyterHub log:192] 202 POST /hub/api/shutdown?_xsrf=[secret] (id1234@::ffff:##.###.###.#) 3.15ms
[C 2025-11-12 19:24:57.392 JupyterHub app:3872] Initiating shutdown…
[I 2025-11-12 19:24:57.392 JupyterHub app:3483] Cleaning up single-user servers…
[D 2025-11-12 19:24:57.392 JupyterHub app:3495] Stopping proxy
[I 2025-11-12 19:24:57.392 JupyterHub proxy:865] Cleaning up proxy[155162]…
[D 2025-11-12 19:24:57.392 JupyterHub proxy:678] Removing proxy pid file jupyterhub-proxy.pid
[I 2025-11-12 19:24:57.392 JupyterHub app:3515] …done
2025-11-12T19:24:57.392Z [ConfigProxy] e[33mwarne[39m: Terminated
[D 2025-11-12 19:24:57.392 JupyterHub app:3881] Cancelling pending tasks
[D 2025-11-12 19:24:57.392 JupyterHub app:3893] Task status: <Task pending name=‘Task-293’ coro=<JupyterHub.shutdown_cancel_tasks() running at /usr/local/lib/python3.13/site-packages/jupyterhub/app.py:3893> cb=[_wrap_awaitable..() at /usr/local/lib/python3.13/site-packages/tornado/gen.py:868, IOLoop.add_future..() at /usr/local/lib/python3.13/site-packages/tornado/ioloop.py:707]>

Can you share pip list? A 404 on /lab suggests that jupyterlab is not in the env. pip install jupyterlab might help

Thanks for looking into it.

Below the details.

id1234@ip-##-###-###-# ~ $ python3.13 -m pip list | grep jupyter
jupyter_client            8.6.3
jupyter_core              5.9.1
jupyter-events            0.12.0
jupyter-lsp               2.3.0
jupyter_server            2.17.0
jupyter_server_terminals  0.5.3
jupyterhub                5.4.2
jupyterhub-idle-culler    1.4.0
jupyterlab                4.4.10
jupyterlab_pygments       0.3.0
jupyterlab_server         2.28.0
id1234@ip-##-###-###-# ~ $
id1234@ip-##-###-###-# ~ $
id1234@ip-##-###-###-# ~ $ python3.13 -c "import jupyterlab; print(jupyterlab.__version__)"
4.4.10
id1234@ip-##-###-###-# ~ $

Can you try providing the full path to jupyterhub-singleuser in the command? Also, how are you running JupyterHub? Using systemd? If so, you need to configure PATH env var on systemd service file to include the path to environment where JupyterHub and JupyterLab are installed for it to be exported to the single user server correctly.