Skip to content

Basic example singleuser log "No user identified" #153

@girdevstack

Description

@girdevstack

Bug description

As a quick disclaimer, I haven't noticed any problems resulting from this...but just in case something is lurking in the shadows i wanted to share a heads up

When using the basic-example jhub from this repository (some minor changes made), debug logs show "No user identified".

How to reproduce

  1. run docker compose up
  2. log in as admin
  3. run docker logs -f jupyter-admin
  4. observe output that periodically shows "No user identified"

Expected behaviour

Either there would not be a message that is thrown with that warning, or a more clear cause would be raised to direct corrective action.

Actual behaviour

"No user identified" is in logs but no apparent impacts functionality is observed that indicates any problems.

Your personal set up

  • OS: AWS EC2 - RHEL 9
  • Version(s): tested with jupyterhub 5.3.0 and latest. miniforge python version 3.12.9
Full environment
# paste output of `pip freeze` or `conda list` here
$ conda list
# packages in environment at /home/ec2/miniforge3:
#
# Name                    Version                   Build  Channel
_libgcc_mutex             0.1                 conda_forge    conda-forge
_openmp_mutex             4.5                       2_gnu    conda-forge
archspec                  0.2.5              pyhd8ed1ab_0    conda-forge
boltons                   24.0.0             pyhd8ed1ab_1    conda-forge
brotli-python             1.1.0           py312h2ec8cdc_2    conda-forge
bzip2                     1.0.8                h4bc722e_7    conda-forge
c-ares                    1.34.4               hb9d3cd8_0    conda-forge
ca-certificates           2025.6.15            hbd8a1cb_0    conda-forge
certifi                   2025.6.15          pyhd8ed1ab_0    conda-forge
cffi                      1.17.1          py312h06ac9bb_0    conda-forge
charset-normalizer        3.4.1              pyhd8ed1ab_0    conda-forge
colorama                  0.4.6              pyhd8ed1ab_1    conda-forge
conda                     24.11.3         py312h7900ff3_0    conda-forge
conda-libmamba-solver     24.9.0             pyhd8ed1ab_0    conda-forge
conda-package-handling    2.4.0              pyh7900ff3_2    conda-forge
conda-package-streaming   0.11.0             pyhd8ed1ab_1    conda-forge
curl                      8.14.1               h332b0f4_0    conda-forge
distro                    1.9.0              pyhd8ed1ab_1    conda-forge
fmt                       11.0.2               h434a139_0    conda-forge
frozendict                2.4.6           py312h66e93f0_0    conda-forge
h2                        4.2.0              pyhd8ed1ab_0    conda-forge
hpack                     4.1.0              pyhd8ed1ab_0    conda-forge
hyperframe                6.1.0              pyhd8ed1ab_0    conda-forge
icu                       75.1                 he02047a_0    conda-forge
idna                      3.10               pyhd8ed1ab_1    conda-forge
jsonpatch                 1.33               pyhd8ed1ab_1    conda-forge
jsonpointer               3.0.0           py312h7900ff3_1    conda-forge
keyutils                  1.6.1                h166bdaf_0    conda-forge
krb5                      1.21.3               h659f571_0    conda-forge
ld_impl_linux-64          2.43                 h712a8e2_4    conda-forge
libarchive                3.7.7                h4585015_3    conda-forge
libcurl                   8.14.1               h332b0f4_0    conda-forge
libedit                   3.1.20250104    pl5321h7949ede_0    conda-forge
libev                     4.33                 hd590300_2    conda-forge
libexpat                  2.6.4                h5888daf_0    conda-forge
libffi                    3.4.6                h2dba641_0    conda-forge
libgcc                    14.2.0               h767d61c_2    conda-forge
libgcc-ng                 14.2.0               h69a702a_2    conda-forge
libgomp                   14.2.0               h767d61c_2    conda-forge
libiconv                  1.18                 h4ce23a2_1    conda-forge
liblzma                   5.6.4                hb9d3cd8_0    conda-forge
libmamba                  1.5.12               h49b8a8d_0    conda-forge
libmambapy                1.5.12          py312hbaee817_0    conda-forge
libnghttp2                1.64.0               h161d5f1_0    conda-forge
libnsl                    2.0.1                hd590300_0    conda-forge
libsolv                   0.7.30               h3509ff9_0    conda-forge
libsqlite                 3.49.1               hee588c1_1    conda-forge
libssh2                   1.11.1               hf672d98_0    conda-forge
libstdcxx                 14.2.0               h8f9b012_2    conda-forge
libstdcxx-ng              14.2.0               h4852527_2    conda-forge
libuuid                   2.38.1               h0b41bf4_0    conda-forge
libxcrypt                 4.4.36               hd590300_1    conda-forge
libxml2                   2.13.6               h8d12d68_0    conda-forge
libzlib                   1.3.1                hb9d3cd8_2    conda-forge
lz4-c                     1.10.0               h5888daf_1    conda-forge
lzo                       2.10              hd590300_1001    conda-forge
mamba                     1.5.12          py312h9460a1c_0    conda-forge
menuinst                  2.2.0           py312h7900ff3_0    conda-forge
ncurses                   6.5                  h2d0b736_3    conda-forge
openssl                   3.5.0                h7b32b05_1    conda-forge
packaging                 24.2               pyhd8ed1ab_2    conda-forge
pip                       25.0.1             pyh8b19718_0    conda-forge
platformdirs              4.3.6              pyhd8ed1ab_1    conda-forge
pluggy                    1.5.0              pyhd8ed1ab_1    conda-forge
pybind11-abi              4                    hd8ed1ab_3    conda-forge
pycosat                   0.6.6           py312h66e93f0_2    conda-forge
pycparser                 2.22               pyh29332c3_1    conda-forge
pysocks                   1.7.1              pyha55dd90_7    conda-forge
python                    3.12.9          h9e4cc4f_1_cpython    conda-forge
python_abi                3.12                    5_cp312    conda-forge
readline                  8.2                  h8c095d6_2    conda-forge
reproc                    14.2.5.post0         hb9d3cd8_0    conda-forge
reproc-cpp                14.2.5.post0         h5888daf_0    conda-forge
requests                  2.32.3             pyhd8ed1ab_1    conda-forge
ruamel.yaml               0.18.10         py312h66e93f0_0    conda-forge
ruamel.yaml.clib          0.2.8           py312h66e93f0_1    conda-forge
setuptools                75.8.2             pyhff2d567_0    conda-forge
tk                        8.6.13          noxft_h4845f30_101    conda-forge
tqdm                      4.67.1             pyhd8ed1ab_1    conda-forge
truststore                0.10.1             pyh29332c3_0    conda-forge
tzdata                    2025a                h78e105d_0    conda-forge
urllib3                   2.3.0              pyhd8ed1ab_0    conda-forge
wheel                     0.45.1             pyhd8ed1ab_1    conda-forge
yaml-cpp                  0.8.0                h59595ed_0    conda-forge
zstandard                 0.23.0          py312h4c3975b_3    conda-forge
zstd                      1.5.7                hb8e6e7a_2    conda-forge
Configuration
# jupyterhub_config.py
# Copyright (c) Jupyter Development Team.
# Distributed under the terms of the Modified BSD License.

# Configuration file for JupyterHub
import os

c = get_config()  # noqa: F821

# We rely on environment variables to configure JupyterHub so that we
# avoid having to rebuild the JupyterHub container every time we change a
# configuration parameter.

# Spawn single-user servers as Docker containers
c.JupyterHub.spawner_class = "dockerspawner.DockerSpawner"

# Spawn containers from this image
c.DockerSpawner.image = os.environ["DOCKER_NOTEBOOK_IMAGE"]

# Connect containers to this Docker network
network_name = os.environ["DOCKER_NETWORK_NAME"]
c.DockerSpawner.use_internal_ip = True
c.DockerSpawner.network_name = network_name

# Explicitly set notebook directory because we'll be mounting a volume to it.
# Most `jupyter/docker-stacks` *-notebook images run the Notebook server as
# user `jovyan`, and set the notebook directory to `/home/jovyan/work`.
# We follow the same convention.
notebook_dir = os.environ.get("DOCKER_NOTEBOOK_DIR", "/home/jovyan/work")
c.DockerSpawner.notebook_dir = notebook_dir

# Mount the real user's Docker volume on the host to the notebook user's
# notebook directory in the container
c.DockerSpawner.volumes = {"jupyterhub-user-{username}": notebook_dir}

# Remove containers once they are stopped
c.DockerSpawner.remove = True

# For debugging arguments passed to spawned containers
c.DockerSpawner.debug = True

# User containers will access hub by container name on the Docker network
c.JupyterHub.hub_ip = "jupyterhub"
c.JupyterHub.hub_port = 8080

# Persist hub data on volume mounted inside container
c.JupyterHub.cookie_secret_file = "/data/jupyterhub_cookie_secret"
c.JupyterHub.db_url = "sqlite:////data/jupyterhub.sqlite"

# Allow all signed-up users to login
c.Authenticator.allow_all = True

# Authenticate users with Native Authenticator
c.JupyterHub.authenticator_class = 'dummy'


# runtime args passed to singleuser-server
c.DockerSpawner.args = [ "--ServerApp.log_level=DEBUG"]

# Allow anyone to sign-up without approval
# c.NativeAuthenticator.open_signup = True

# Allowed admins
admin = os.environ.get("JUPYTERHUB_ADMIN")
if admin:
    c.Authenticator.admin_users = [admin]
Logs
# paste relevant logs here, if any
[D 2025-11-24 23:33:53.394 ServerApp] Checking user admin with scopes ['access:servers!server=admin/', 'read:users:groups!user=admin', 'read:users:name!user=admin'] against {'access:servers!user=admin', 'access:servers!server=admin/'}
[D 2025-11-24 23:33:53.394 ServerApp] Allowing user admin with scopes {'access:servers!server=admin/'}
[I 2025-11-24 23:33:53.398 ServerApp] 200 GET /user/admin/lab/api/settings?ids_only=true&1764027233389 (admin@::ffff:10.112.12.24) 5.91ms
[D 2025-11-24 23:33:53.726 ServerApp] No user identified
[I 2025-11-24 23:33:53.726 ServerApp] 200 GET /user/admin/api (@172.18.0.3) 0.63ms
[D 2025-11-24 23:33:54.389 ServerApp] Checking user admin with scopes ['access:servers!server=admin/', 'read:users:groups!user=admin', 'read:users:name!user=admin'] against {'access:servers!user=admin', 'access:servers!server=admin/'}
[D 2025-11-24 23:33:54.389 ServerApp] Allowing user admin with scopes {'access:servers!server=admin/'}
[I 2025-11-24 23:33:54.390 ServerApp] 204 PUT /user/admin/lab/api/workspaces/auto-e?1764027234386 (admin@::ffff:10.112.12.24) 1.48ms
[D 2025-11-24 23:33:54.399 ServerApp] Checking user admin with scopes ['access:servers!server=admin/', 'read:users:groups!user=admin', 'read:users:name!user=admin'] against {'access:servers!user=admin', 'access:servers!server=admin/'}
[D 2025-11-24 23:33:54.399 ServerApp] Allowing user admin with scopes {'access:servers!server=admin/'}
[I 2025-11-24 23:33:54.401 ServerApp] 200 GET /user/admin/api/contents?content=1&hash=0&1764027234395 (admin@::ffff:10.112.12.24) 2.38ms
[D 2025-11-24 23:33:54.923 ServerApp] Checking user admin with scopes ['access:servers!server=admin/', 'read:users:groups!user=admin', 'read:users:name!user=admin'] against {'access:servers!user=admin', 'access:servers!server=admin/'}
[D 2025-11-24 23:33:54.923 ServerApp] Allowing user admin with scopes {'access:servers!server=admin/'}
[I 2025-11-24 23:33:54.924 ServerApp] 204 PUT /user/admin/lab/api/workspaces/auto-e?1764027234919 (admin@::ffff:10.112.12.24) 1.24ms
[D 2025-11-24 23:33:56.965 ServerApp] No user identified

Thanks for everything that you all do to keep the project alive and healthy, we appreciate it 🙏

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions