ethoscopy 2.0.4__tar.gz → 2.0.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. ethoscopy-2.0.5/.claude/settings.local.json +40 -0
  2. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/.pre-commit-config.yaml +2 -2
  3. ethoscopy-2.0.5/Docker/.env.dummy.example +25 -0
  4. ethoscopy-2.0.5/Docker/.env.github.example +39 -0
  5. ethoscopy-2.0.5/Docker/.env.google.example +41 -0
  6. ethoscopy-2.0.5/Docker/.env.keycloak.example +53 -0
  7. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/Docker/Dockerfile +8 -1
  8. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/Docker/README.md +21 -28
  9. ethoscopy-2.0.5/Docker/README_AUTH.md +548 -0
  10. ethoscopy-2.0.5/Docker/config/jupyterhub_config.py +154 -0
  11. ethoscopy-2.0.5/Docker/config/users.py +47 -0
  12. ethoscopy-2.0.5/Docker/docker-compose.yml +57 -0
  13. {ethoscopy-2.0.4/Docker/config → ethoscopy-2.0.5/Docker/jupyterhub_data}/jupyterhub.sqlite +0 -0
  14. ethoscopy-2.0.5/Docker/jupyterhub_data/jupyterhub_cookie_secret +1 -0
  15. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/PKG-INFO +22 -1
  16. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/README.md +21 -0
  17. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/pyproject.toml +8 -1
  18. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/src/ethoscopy/__init__.py +3 -0
  19. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/src/ethoscopy/load.py +36 -11
  20. ethoscopy-2.0.5/src/ethoscopy/misc/__init__.py +0 -0
  21. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/src/ethoscopy/misc/get_HMM.py +8 -18
  22. ethoscopy-2.0.5/src/ethoscopy/misc/get_tutorials.py +220 -0
  23. ethoscopy-2.0.5/tasks/todo.md +90 -0
  24. ethoscopy-2.0.5/tests/test_get_tutorials.py +338 -0
  25. ethoscopy-2.0.5/tests/test_load_metadata_fixes.py +214 -0
  26. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/tutorial_notebook/1_Overview_tutorial.ipynb +26 -0
  27. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/tutorial_notebook/2_HMM_tutorial.ipynb +26 -0
  28. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/tutorial_notebook/3_Circadian_tutorial.ipynb +28 -2
  29. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/tutorial_notebook/5_Ethoscopy_catch22_tutorial.ipynb +26 -0
  30. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/tutorial_notebook/6_Ethoscopy_to_hctsa_tutorial.ipynb +26 -0
  31. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/tutorial_notebook/notebook_paper.ipynb +26 -0
  32. ethoscopy-2.0.4/.claude/settings.local.json +0 -25
  33. ethoscopy-2.0.4/Docker/.claude/settings.local.json +0 -41
  34. ethoscopy-2.0.4/Docker/.env +0 -39
  35. ethoscopy-2.0.4/Docker/config/jupyterhub_cookie_secret +0 -1
  36. ethoscopy-2.0.4/Docker/docker-compose.yml +0 -25
  37. ethoscopy-2.0.4/Docker/jupyterhub_data/jupyterhub-proxy.pid +0 -1
  38. ethoscopy-2.0.4/Docker/jupyterhub_data/jupyterhub.sqlite +0 -0
  39. ethoscopy-2.0.4/Docker/jupyterhub_data/jupyterhub_cookie_secret +0 -1
  40. ethoscopy-2.0.4/QWEN.md +0 -88
  41. ethoscopy-2.0.4/src/ethoscopy/misc/get_tutorials.py +0 -48
  42. ethoscopy-2.0.4/tests/test_get_tutorials.py +0 -136
  43. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/.codecov.yml +0 -0
  44. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/.github/workflows/ci.yml +0 -0
  45. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/.github/workflows/release.yml +0 -0
  46. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/.gitignore +0 -0
  47. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/CLAUDE.md +0 -0
  48. /ethoscopy-2.0.4/src/ethoscopy/misc/__init__.py → /ethoscopy-2.0.5/Docker/.env.gitlab.example +0 -0
  49. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/Docker/.env.keycloak +0 -0
  50. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/Docker/install_r_packages.r +0 -0
  51. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/Docker/jupyterhub_data/jupyterhub_config.py +0 -0
  52. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/LICENSE +0 -0
  53. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/TESTING.md +0 -0
  54. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/_config.yml +0 -0
  55. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/pytest.ini +0 -0
  56. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/run_tests.py +0 -0
  57. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/scripts/README.md +0 -0
  58. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/scripts/convert_databases.sh +0 -0
  59. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/scripts/convert_wal_to_delete.py +0 -0
  60. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/setup.py +0 -0
  61. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/src/ethoscopy/analyse.py +0 -0
  62. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/src/ethoscopy/behavpy.py +0 -0
  63. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/src/ethoscopy/behavpy_HMM_class.py +0 -0
  64. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/src/ethoscopy/behavpy_class.py +0 -0
  65. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/src/ethoscopy/behavpy_core.py +0 -0
  66. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/src/ethoscopy/behavpy_draw.py +0 -0
  67. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/src/ethoscopy/behavpy_periodogram_class.py +0 -0
  68. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/src/ethoscopy/behavpy_plotly.py +0 -0
  69. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/src/ethoscopy/behavpy_seaborn.py +0 -0
  70. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/src/ethoscopy/metadata_db.py +0 -0
  71. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/src/ethoscopy/misc/circadian_bars.py +0 -0
  72. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/src/ethoscopy/misc/general_functions.py +0 -0
  73. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/src/ethoscopy/misc/hmm_functions.py +0 -0
  74. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/src/ethoscopy/misc/periodogram_functions.py +0 -0
  75. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/src/ethoscopy/misc/validate_datetime.py +0 -0
  76. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/tests/__init__.py +0 -0
  77. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/tests/conftest.py +0 -0
  78. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/tests/data/README.md +0 -0
  79. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/tests/data/test_ethoscope.db +0 -0
  80. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/tests/test_analyse.py +0 -0
  81. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/tests/test_baseline_enhancements.py +0 -0
  82. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/tests/test_behavpy.py +0 -0
  83. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/tests/test_behavpy_core_simple.py +0 -0
  84. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/tests/test_compatibility_classes.py +0 -0
  85. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/tests/test_general_functions.py +0 -0
  86. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/tests/test_load.py +0 -0
  87. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/tests/test_load_comprehensive.py +0 -0
  88. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/tests/test_load_optimizations.py +0 -0
  89. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/tutorial_notebook/4_Navigating_db_tutorial.ipynb +0 -0
  90. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/tutorial_notebook/ethoscope_db.csv +0 -0
  91. {ethoscopy-2.0.4 → ethoscopy-2.0.5}/tutorial_notebook/jones_et_al_metadata.csv +0 -0
@@ -0,0 +1,40 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(wc:*)",
5
+ "Bash(paplay:*)",
6
+ "Bash(ETHOSCOPE_DATA_PATH=/mnt/ethoscope_data docker compose:*)",
7
+ "Bash(docker ps:*)",
8
+ "Bash(docker logs:*)",
9
+ "Bash(docker compose:*)",
10
+ "Bash(curl:*)",
11
+ "Bash(docker exec:*)",
12
+ "Bash(mkdir -p /tmp/ethoscopy_wheel_inspect)",
13
+ "Read(//tmp/**)",
14
+ "Bash(pip download *)",
15
+ "Bash(unzip -l ethoscopy-2.0.4-py3-none-any.whl)",
16
+ "Bash(git check-ignore *)",
17
+ "Bash(/home/gg/Code/ethoscope_project/ethoscopy/.venv/bin/pip install *)",
18
+ "Bash(.venv/bin/python -m pytest tests/test_get_tutorials.py -v)",
19
+ "Bash(.venv/bin/python *)",
20
+ "Bash(.venv/bin/pip install *)",
21
+ "Bash(gh auth *)",
22
+ "Bash(gh repo *)",
23
+ "Bash(docker info *)",
24
+ "mcp__bookstack__bookstack_search",
25
+ "Bash(.venv/bin/ruff check *)",
26
+ "Bash(.venv/bin/black --check src/ tests/)",
27
+ "Bash(.venv/bin/black src/ethoscopy/misc/get_tutorials.py tests/test_get_tutorials.py)",
28
+ "mcp__bookstack__bookstack_pages_read",
29
+ "mcp__bookstack__bookstack_pages_update",
30
+ "Bash(gh issue create --repo gilestrolab/ethoscopy --title 'Tutorial data pickles missing from PyPI wheel \\(2.0.0 – 2.0.4\\)' --body ' *)",
31
+ "Bash(git add *)",
32
+ "Bash(git commit *)",
33
+ "Bash(git push *)",
34
+ "Bash(git tag *)",
35
+ "Bash(gh release create v2.0.5 --repo gilestrolab/ethoscopy --title 'v2.0.5 — package tutorial data separately' --notes ' *)",
36
+ "Bash(gh run *)",
37
+ "Bash(gh issue *)"
38
+ ]
39
+ }
40
+ }
@@ -51,7 +51,7 @@ repos:
51
51
  language: system
52
52
  pass_filenames: false
53
53
  always_run: true
54
- stages: [commit]
54
+ stages: [pre-commit]
55
55
 
56
56
  - id: pytest-fast
57
57
  name: pytest-fast
@@ -59,4 +59,4 @@ repos:
59
59
  language: system
60
60
  pass_filenames: false
61
61
  always_run: true
62
- stages: [push]
62
+ stages: [pre-push]
@@ -0,0 +1,25 @@
1
+ # ============================================================================
2
+ # DUMMY AUTHENTICATOR (Simple Shared Password)
3
+ # ============================================================================
4
+ # Default authentication method - all users share the same password
5
+ # Best for: Lab environments, small teams, trusted networks
6
+
7
+ # Authenticator type (must be 'dummy' for this configuration)
8
+ AUTHENTICATOR_CLASS=dummy
9
+
10
+ # Shared password for all users
11
+ DUMMY_PASSWORD=ethoscope
12
+
13
+ # Comma-separated list of allowed users
14
+ ALLOWED_USERS=amadabhushi,ggilestro,mjoyce,lguo,labguest1,labguest2,labguest3,labguest4,labguest5,labguest6,labguest7,labguest8,ethoscopelab
15
+
16
+ # Comma-separated list of admin users
17
+ ADMIN_USERS=ggilestro
18
+
19
+ # Docker user/group (optional, defaults to 1000:1000)
20
+ UID=1000
21
+ GID=1000
22
+
23
+ # JupyterHub and Ethoscope Lab versions
24
+ JUPYTER_HUB_TAG=5.3.0
25
+ ETHOSCOPE_LAB_TAG=1.1
@@ -0,0 +1,39 @@
1
+ # ============================================================================
2
+ # GITHUB OAUTH AUTHENTICATOR
3
+ # ============================================================================
4
+ # Authenticate users via their GitHub accounts
5
+ # Best for: Open source projects, teams already using GitHub
6
+ #
7
+ # Setup Instructions:
8
+ # 1. Go to GitHub Settings > Developer Settings > OAuth Apps
9
+ # 2. Create a new OAuth App
10
+ # 3. Set Homepage URL: http://your-server:8082
11
+ # 4. Set Authorization callback URL: http://your-server:8082/hub/oauth_callback
12
+ # 5. Copy the Client ID and generate a Client Secret
13
+
14
+ # Authenticator type
15
+ AUTHENTICATOR_CLASS=github
16
+
17
+ # OAuth credentials from GitHub OAuth App
18
+ OAUTH_CLIENT_ID=your_github_client_id_here
19
+ OAUTH_CLIENT_SECRET=your_github_client_secret_here
20
+
21
+ # Callback URL (must match what you set in GitHub OAuth App)
22
+ OAUTH_CALLBACK_URL=http://your-server:8082/hub/oauth_callback
23
+
24
+ # (Optional) Restrict to GitHub organization members
25
+ # GITHUB_ORG=your-organization-name
26
+
27
+ # Comma-separated list of allowed users (GitHub usernames)
28
+ ALLOWED_USERS=username1,username2,username3
29
+
30
+ # Comma-separated list of admin users (GitHub usernames)
31
+ ADMIN_USERS=your-github-username
32
+
33
+ # Docker user/group (optional, defaults to 1000:1000)
34
+ UID=1000
35
+ GID=1000
36
+
37
+ # JupyterHub and Ethoscope Lab versions
38
+ JUPYTER_HUB_TAG=5.3.0
39
+ ETHOSCOPE_LAB_TAG=1.1
@@ -0,0 +1,41 @@
1
+ # ============================================================================
2
+ # GOOGLE OAUTH AUTHENTICATOR
3
+ # ============================================================================
4
+ # Authenticate users via their Google accounts
5
+ # Best for: Organizations using Google Workspace, universities with Google
6
+ #
7
+ # Setup Instructions:
8
+ # 1. Go to Google Cloud Console (console.cloud.google.com)
9
+ # 2. Create a new project or select existing
10
+ # 3. Enable Google+ API
11
+ # 4. Go to Credentials > Create Credentials > OAuth 2.0 Client ID
12
+ # 5. Set Application type: Web application
13
+ # 6. Add Authorized redirect URI: http://your-server:8082/hub/oauth_callback
14
+ # 7. Copy the Client ID and Client Secret
15
+
16
+ # Authenticator type
17
+ AUTHENTICATOR_CLASS=google
18
+
19
+ # OAuth credentials from Google Cloud Console
20
+ OAUTH_CLIENT_ID=your_google_client_id.apps.googleusercontent.com
21
+ OAUTH_CLIENT_SECRET=your_google_client_secret_here
22
+
23
+ # Callback URL (must match what you set in Google Cloud Console)
24
+ OAUTH_CALLBACK_URL=http://your-server:8082/hub/oauth_callback
25
+
26
+ # (Optional) Restrict to Google Workspace domain
27
+ # GOOGLE_HOSTED_DOMAIN=yourdomain.com
28
+
29
+ # Comma-separated list of allowed users (Gmail addresses without @gmail.com or @yourdomain.com)
30
+ ALLOWED_USERS=user1,user2,user3
31
+
32
+ # Comma-separated list of admin users
33
+ ADMIN_USERS=your-email-username
34
+
35
+ # Docker user/group (optional, defaults to 1000:1000)
36
+ UID=1000
37
+ GID=1000
38
+
39
+ # JupyterHub and Ethoscope Lab versions
40
+ JUPYTER_HUB_TAG=5.3.0
41
+ ETHOSCOPE_LAB_TAG=1.1
@@ -0,0 +1,53 @@
1
+ # ============================================================================
2
+ # KEYCLOAK / GENERIC OIDC AUTHENTICATOR
3
+ # ============================================================================
4
+ # Authenticate users via Keycloak or any OIDC-compliant provider
5
+ # Best for: Organizations with existing SSO, enterprise environments
6
+ #
7
+ # Setup Instructions for Keycloak:
8
+ # 1. Log into your Keycloak Admin Console
9
+ # 2. Select your realm (e.g., 'gilestro-lab')
10
+ # 3. Go to Clients > Create Client
11
+ # 4. Set Client ID: jupyterhub
12
+ # 5. Set Client Protocol: openid-connect
13
+ # 6. Set Access Type: confidential
14
+ # 7. Set Valid Redirect URIs: http://your-server:8082/hub/oauth_callback
15
+ # 8. Save and go to Credentials tab to get the Client Secret
16
+ # 9. Create users in Keycloak matching your existing home directory names
17
+
18
+ # Authenticator type
19
+ AUTHENTICATOR_CLASS=generic
20
+
21
+ # OAuth credentials from Keycloak client
22
+ OAUTH_CLIENT_ID=jupyterhub
23
+ OAUTH_CLIENT_SECRET=your_keycloak_client_secret_here
24
+
25
+ # Callback URL
26
+ OAUTH_CALLBACK_URL=http://your-server:8082/hub/oauth_callback
27
+
28
+ # Keycloak OIDC endpoints (replace YOUR_KEYCLOAK_SERVER and YOUR_REALM)
29
+ # Example: http://keycloak.example.com/realms/gilestro-lab
30
+ OAUTH_AUTHORIZE_URL=http://YOUR_KEYCLOAK_SERVER/realms/YOUR_REALM/protocol/openid-connect/auth
31
+ OAUTH_TOKEN_URL=http://YOUR_KEYCLOAK_SERVER/realms/YOUR_REALM/protocol/openid-connect/token
32
+ OAUTH_USERDATA_URL=http://YOUR_KEYCLOAK_SERVER/realms/YOUR_REALM/protocol/openid-connect/userinfo
33
+
34
+ # Username claim (Keycloak uses 'preferred_username' by default)
35
+ OAUTH_USERNAME_CLAIM=preferred_username
36
+
37
+ # OAuth scopes (comma-separated, optional)
38
+ OAUTH_SCOPE=openid,profile,email
39
+
40
+ # CRITICAL: Keycloak usernames MUST match existing home directory names exactly
41
+ # Comma-separated list of allowed users
42
+ ALLOWED_USERS=amadabhushi,ggilestro,mjoyce,lguo,labguest1,labguest2,labguest3,labguest4,labguest5,labguest6,labguest7,labguest8,ethoscopelab
43
+
44
+ # Comma-separated list of admin users
45
+ ADMIN_USERS=ggilestro
46
+
47
+ # Docker user/group (optional, defaults to 1000:1000)
48
+ UID=1000
49
+ GID=1000
50
+
51
+ # JupyterHub and Ethoscope Lab versions
52
+ JUPYTER_HUB_TAG=5.3.0
53
+ ETHOSCOPE_LAB_TAG=1.1
@@ -70,16 +70,23 @@ RUN pip3 install jupyterlab-spreadsheet-editor
70
70
  # ============================================================================
71
71
 
72
72
  # Install Python data science packages
73
+ # Including oauthenticator for flexible authentication support
73
74
  RUN pip3 install \
75
+ oauthenticator \
74
76
  pandas \
75
77
  seaborn \
76
78
  bokeh \
77
79
  lifelines \
78
80
  opencv-python \
79
81
  mysql-connector \
80
- ethoscopy
82
+ ethoscopy
81
83
  # pycatch22
82
84
 
85
+ # Pre-populate tutorial datasets inside the installed package so non-root
86
+ # JupyterHub users don't have to download them on first notebook run. The
87
+ # pickles (~36 MB total) live in the ethoscopy repo, not the PyPI wheel.
88
+ RUN python3 -c "from ethoscopy.misc.get_tutorials import download_tutorial_data, package_tutorial_data_dir; download_tutorial_data(dest_dir=package_tutorial_data_dir(), verbose=True)"
89
+
83
90
  # Install Ethoscope from source
84
91
  RUN git clone https://github.com/gilestrolab/ethoscope.git /opt/ethoscope && \
85
92
  cd /opt/ethoscope/ && git checkout dev && \
@@ -12,43 +12,36 @@ The command to use to recreate that image is `JUPYTER_HUB_TAG=5.3.0 ETHOSCOPE_LA
12
12
 
13
13
  After creation, the image can be run using the enclosed `docker-compose.yml` file, replacing values as fit.
14
14
 
15
- ## Add new users to the JupyterHub
15
+ ## Authentication and User Management
16
16
 
17
- To add new users to the JupyterHub instance:
17
+ This JupyterHub instance supports multiple authentication methods including:
18
+ - **Keycloak OAuth** (current production setup at auth.gilest.ro)
19
+ - GitHub OAuth
20
+ - Google OAuth
21
+ - GitLab OAuth
22
+ - Dummy authenticator (shared password)
18
23
 
19
- ### 1. Modify the jupyterhub_config.py file
24
+ ### Adding New Users
20
25
 
21
- Edit the `allowed_users` set on lines 14-19 to include your new usernames:
26
+ **⚠️ Important**: Adding a new user requires steps on BOTH the authentication provider AND the JupyterHub host.
22
27
 
23
- ```python
24
- c.Authenticator.allowed_users = {
25
- 'amadabhushi', 'ggilestro', 'mjoyce', 'lguo',
26
- 'labguest1', 'labguest2', 'labguest3', 'labguest4',
27
- 'labguest5', 'labguest6', 'labguest7', 'labguest8',
28
- 'ethoscopelab', 'newuser1', 'newuser2' # Add your new users here
29
- }
30
- ```
31
-
32
- To make a user an admin, add them to the `admin_users` set on line 22:
28
+ For detailed instructions on adding users, making users admins, and switching authentication methods, see:
33
29
 
34
- ```python
35
- c.Authenticator.admin_users = {'ggilestro', 'newadmin'}
36
- ```
30
+ **📖 [README_AUTH.md](./README_AUTH.md) - Complete Authentication and User Management Guide**
37
31
 
38
- ### 2. Restart the Docker container
32
+ ### Quick Reference
39
33
 
40
- After modifying the config file:
34
+ **For Keycloak (current setup)**:
35
+ 1. Add user to Keycloak at `auth.gilest.ro` in the `gilestro-lab` realm
36
+ 2. Create home directory on host: `sudo mkdir -p /mnt/homes/username && sudo chown 1000:1000 /mnt/homes/username`
37
+ 3. (Optional) Add to `config/users.py` if using whitelist enforcement
41
38
 
42
- ```bash
43
- docker compose down
44
- docker compose up -d
45
- ```
39
+ **For Dummy Auth**:
40
+ 1. Add username to `config/users.py` or `.env` file
41
+ 2. Create home directory on host
42
+ 3. Restart container
46
43
 
47
- **Notes:**
48
- - All users share the same password: `ethoscope` (line 11)
49
- - The system uses DummyAuthenticator for simple shared-password authentication
50
- - Each user gets their own home directory at `/home/{username}`
51
- - Home directories are created automatically when users first log in
44
+ See [README_AUTH.md](./README_AUTH.md) for complete step-by-step instructions.
52
45
 
53
46
  ## Mounting Home Directories as Volumes
54
47