Compare commits
10 Commits
695432f71c
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 85c14a1b33 | |||
|
|
fcf06ebe1a | ||
| cf4291738e | |||
| a425023b2e | |||
| 1f65074684 | |||
| 158c8784b9 | |||
| d092d2e75c | |||
| fc38957b9a | |||
| 6898ef9171 | |||
| 6c56fdc5da |
@@ -6,10 +6,8 @@ services:
|
|||||||
- POSTGRES_DB=${POSTGRES_DB}
|
- POSTGRES_DB=${POSTGRES_DB}
|
||||||
- POSTGRES_USER=${POSTGRES_USER}
|
- POSTGRES_USER=${POSTGRES_USER}
|
||||||
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
|
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
|
||||||
|
|
||||||
- JUPYTERHUB_CRYPT_KEY=${JUPYTERHUB_CRYPT_KEY}
|
- JUPYTERHUB_CRYPT_KEY=${JUPYTERHUB_CRYPT_KEY}
|
||||||
- DOCKER_NETWORK_NAME=${DOCKER_NETWORK_NAME}
|
- DOCKER_NETWORK_NAME=${DOCKER_NETWORK_NAME}
|
||||||
- NBGRADER_DB_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${NBGRADER_DB}
|
|
||||||
ports:
|
ports:
|
||||||
- ${JUPYTERHUB_PORT:-8000}:8000
|
- ${JUPYTERHUB_PORT:-8000}:8000
|
||||||
volumes:
|
volumes:
|
||||||
@@ -19,6 +17,11 @@ services:
|
|||||||
depends_on:
|
depends_on:
|
||||||
- postgres
|
- postgres
|
||||||
|
|
||||||
|
base:
|
||||||
|
container_name: ${COMPOSE_PROJECT_NAME}-base-notebook
|
||||||
|
datasciene:
|
||||||
|
container_name: ${COMPOSE_PROJECT_NAME}-datasciene-notebook
|
||||||
|
|
||||||
postgres:
|
postgres:
|
||||||
container_name: ${COMPOSE_PROJECT_NAME}-postgres
|
container_name: ${COMPOSE_PROJECT_NAME}-postgres
|
||||||
ports:
|
ports:
|
||||||
@@ -28,12 +31,12 @@ services:
|
|||||||
networks:
|
networks:
|
||||||
- jupyterhub-network
|
- jupyterhub-network
|
||||||
|
|
||||||
nginx:
|
# nginx:
|
||||||
container_name: ${COMPOSE_PROJECT_NAME}-nginx
|
#container_name: ${COMPOSE_PROJECT_NAME}-nginx
|
||||||
ports:
|
#ports:
|
||||||
- ${NGINX_HTTP_PORT:-80}:80
|
#- ${NGINX_HTTP_PORT:-80}:80
|
||||||
- ${NGINX_HTTPS_PORT:-443}:443
|
#- ${NGINX_HTTPS_PORT:-443}:443
|
||||||
networks:
|
#networks:
|
||||||
- jupyterhub-network
|
#- jupyterhub-network
|
||||||
depends_on:
|
#depends_on:
|
||||||
- jupyterhub
|
#- jupyterhub
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
include:
|
include:
|
||||||
- jupyterhub/compose.yml
|
- jupyterhub/compose.yml
|
||||||
- postgres/compose.yml
|
- postgres/compose.yml
|
||||||
- nginx/compose.yml
|
# - nginx/compose.yml
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
jupyterhub-network:
|
jupyterhub-network:
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ RUN pip install --no-cache-dir \
|
|||||||
dockerspawner \
|
dockerspawner \
|
||||||
jupyterhub-nativeauthenticator \
|
jupyterhub-nativeauthenticator \
|
||||||
jupyterhub-dummyauthenticator \
|
jupyterhub-dummyauthenticator \
|
||||||
nbgrader \
|
|
||||||
psycopg2-binary
|
psycopg2-binary
|
||||||
|
|
||||||
RUN mkdir -p /srv/nbgrader \
|
RUN mkdir -p /srv/nbgrader \
|
||||||
|
|||||||
@@ -11,7 +11,14 @@ services:
|
|||||||
- /var/run/docker.sock:/var/run/docker.sock
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
- ./templates:/srv/jupyterhub/templates:ro
|
- ./templates:/srv/jupyterhub/templates:ro
|
||||||
- ./jupyterhub_config.py:/srv/jupyterhub/jupyterhub_config.py
|
- ./jupyterhub_config.py:/srv/jupyterhub/jupyterhub_config.py
|
||||||
- ./nbgrader_config.py:/srv/nbgrader/nbgrader_config.py:ro
|
|
||||||
- ../nbgrader/exchange:/srv/nbgrader/exchange
|
|
||||||
- ../nbgrader/courses:/srv/nbgrader/courses
|
|
||||||
|
|
||||||
|
# Just the Hacky way to pull images at startup
|
||||||
|
# It just pulls the image but they wont startup
|
||||||
|
# speeds up first spawn dramatically
|
||||||
|
base:
|
||||||
|
image: jupyter/base-notebook:latest
|
||||||
|
entrypoint: ['echo']
|
||||||
|
|
||||||
|
datasciene:
|
||||||
|
image: jupyter/datascience-notebook:latest
|
||||||
|
entrypoint: ['echo']
|
||||||
|
|||||||
@@ -86,9 +86,10 @@ c.JupyterHub.template_paths = ["/etc/jupyterhub/templates"]
|
|||||||
c.JupyterHub.spawner_class = DockerSpawner
|
c.JupyterHub.spawner_class = DockerSpawner
|
||||||
|
|
||||||
# Spawn Containers from this Image
|
# Spawn Containers from this Image
|
||||||
c.DockerSpawner.image = os.environ.get(
|
c.DockerSpawner.image = os.environ.get("NOTEBOOK_IMAGE", "jupyter/base-notebook:latest")
|
||||||
"NOTEBOOK_IMAGE", "jupyter/datascience-notebook:latest"
|
|
||||||
)
|
# Spawn this "version" of the Notebook
|
||||||
|
c.DockerSpawner.default_url = os.environ.get("SPAWNER_DEFAULT_URL", "/lab")
|
||||||
|
|
||||||
# Connect Containers to this network
|
# Connect Containers to this network
|
||||||
network_name = os.environ.get("DOCKER_NETWORK_NAME", "stack_default")
|
network_name = os.environ.get("DOCKER_NETWORK_NAME", "stack_default")
|
||||||
@@ -155,56 +156,3 @@ c.JupyterHub.concurrent_spawn_limit = 10
|
|||||||
# Allow named servers
|
# Allow named servers
|
||||||
c.JupyterHub.allow_named_servers = True
|
c.JupyterHub.allow_named_servers = True
|
||||||
c.JupyterHub.named_server_limit_per_user = 3
|
c.JupyterHub.named_server_limit_per_user = 3
|
||||||
|
|
||||||
|
|
||||||
# NBgrader
|
|
||||||
c.JupyterHub.services = [
|
|
||||||
{
|
|
||||||
"name": "nbgrader-formgrader",
|
|
||||||
"url": "http://127.0.0.1:9999",
|
|
||||||
"command": [
|
|
||||||
"python",
|
|
||||||
"-m",
|
|
||||||
"nbgrader.apps.formgraderapp",
|
|
||||||
"--FormgradeApp.authenticator_plugin_class=nbgrader.auth.JupyterHubAuthPlugin",
|
|
||||||
"--FormgradeApp.ip=0.0.0.0",
|
|
||||||
"--FormgradeApp.port=9999",
|
|
||||||
f"--FormgradeApp.base_url={base_url}services/nbgrader-formgrader/",
|
|
||||||
],
|
|
||||||
"cwd": "/srv/nbgrader/exchange",
|
|
||||||
"environment": {
|
|
||||||
"JUPYTERHUB_API_TOKEN": "", # Will be set automatically
|
|
||||||
"JUPYTERHUB_API_URL": f"http://jupyterhub:{port}{base_url}hub/api",
|
|
||||||
"JUPYTERHUB_SERVICE_PREFIX": "/services/nbgrader-formgrader/",
|
|
||||||
"POSTGRES_USER": p_user,
|
|
||||||
"POSTGRES_PASSWORD": p_pass,
|
|
||||||
"POSTGRES_HOST": p_host,
|
|
||||||
"POSTGRES_DB": p_db,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
nbgrader_exchange_dir = "/srv/nbgrader/exchange"
|
|
||||||
|
|
||||||
c.DockerSpawner.environment = {
|
|
||||||
"JUPYTERHUB_API_TOKEN": "", # Will be populated automatically
|
|
||||||
"JUPYTERHUB_API_URL": f"http://jupyterhub:{port}{base_url}hub/api",
|
|
||||||
"NBGRADER_EXCHANGE_DIRECTORY": nbgrader_exchange_dir,
|
|
||||||
"NBGRADER_CACHE_DIRECTORY": "/home/jovyan/.cache/nbgrader",
|
|
||||||
"NBGRADER_CONFIG_FILE": "/home/jovyan/.jupyter/nbgrader_config.py",
|
|
||||||
}
|
|
||||||
|
|
||||||
# Configure NBgrader to use the same PostgreSQL database
|
|
||||||
c.NbGrader.db_url = f"postgresql://{p_user}:{p_pass}@{p_host}:5432/{p_db}"
|
|
||||||
|
|
||||||
# NBgrader course configuration
|
|
||||||
c.CourseDirectory.root = "/srv/nbgrader"
|
|
||||||
c.CourseDirectory.course_id = os.environ.get("NBGRADER_COURSE_ID", "default_course")
|
|
||||||
|
|
||||||
# Exchange configuration
|
|
||||||
c.Exchange.root = nbgrader_exchange_dir
|
|
||||||
c.Exchange.course_id = os.environ.get("NBGRADER_COURSE_ID", "default_course")
|
|
||||||
|
|
||||||
# Formgrader configuration
|
|
||||||
c.FormgradeApp.authenticator_plugin_class = "nbgrader.auth.JupyterHubAuthPlugin"
|
|
||||||
c.FormgradeApp.base_url = f"{base_url}services/nbgrader-formgrader/"
|
|
||||||
|
|||||||
@@ -1,30 +0,0 @@
|
|||||||
# /srv/nbgrader/nbgrader_config.py
|
|
||||||
c = get_config()
|
|
||||||
|
|
||||||
# 1. Course Configuration
|
|
||||||
c.CourseDirectory.course_id = "intro-to-python" # Change to your course name
|
|
||||||
c.CourseDirectory.root = '/srv/nbgrader/courses'
|
|
||||||
|
|
||||||
# 2. Exchange Directory (for submitting/collecting assignments)
|
|
||||||
c.Exchange.root = '/srv/nbgrader/exchange'
|
|
||||||
c.Exchange.path_includes_course = True
|
|
||||||
|
|
||||||
# 3. JupyterHub Integration
|
|
||||||
#c.NbGrader.hub_url = 'http://jupyterhub:8081/hub/api'
|
|
||||||
#c.NbGrader.hubapi_token = 'your-hub-token' # Generate with: openssl rand -hex 32
|
|
||||||
|
|
||||||
# 4. Database Configuration
|
|
||||||
c.StudentAssignmentNotebook.database_url = 'sqlite:////srv/nbgrader/nbgrader.sqlite'
|
|
||||||
|
|
||||||
# 5. Assignment Policies
|
|
||||||
c.ExecutePreprocessor.timeout = 300 # 5 minutes timeout per cell
|
|
||||||
c.ClearSolutions.code_stub = "# YOUR CODE HERE"
|
|
||||||
c.ClearSolutions.text_stub = "YOUR ANSWER HERE"
|
|
||||||
|
|
||||||
# 6. Formgrader UI Settings
|
|
||||||
c.FormgradeApp.port = 9999
|
|
||||||
c.FormgradeApp.authenticator_class = 'nbgrader.auth.hubauth.HubAuth'
|
|
||||||
c.FormgradeApp.ip = '0.0.0.0'
|
|
||||||
|
|
||||||
# 7. Permissions
|
|
||||||
c.CourseDirectory.groupshared = True
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
import os
|
|
||||||
|
|
||||||
c = get_config()
|
|
||||||
|
|
||||||
# Database configuration - use the same PostgreSQL as JupyterHub
|
|
||||||
p_user = os.environ.get("POSTGRES_USER", "")
|
|
||||||
p_pass = os.environ.get("POSTGRES_PASSWORD", "")
|
|
||||||
p_host = os.environ.get("POSTGRES_HOST", "postgres")
|
|
||||||
p_db = os.environ.get("POSTGRES_DB", "jupyterhub")
|
|
||||||
|
|
||||||
# NBgrader database URL
|
|
||||||
c.NbGrader.db_url = f"postgresql://{p_user}:{p_pass}@{p_host}:5432/{p_db}"
|
|
||||||
|
|
||||||
# Course configuration
|
|
||||||
course_id = os.environ.get("NBGRADER_COURSE_ID", "default_course")
|
|
||||||
c.CourseDirectory.course_id = course_id
|
|
||||||
c.CourseDirectory.root = "/srv/nbgrader"
|
|
||||||
|
|
||||||
# Exchange directory configuration
|
|
||||||
exchange_dir = os.environ.get("NBGRADER_EXCHANGE_DIRECTORY", "/srv/nbgrader/exchange")
|
|
||||||
c.Exchange.root = exchange_dir
|
|
||||||
c.Exchange.course_id = course_id
|
|
||||||
|
|
||||||
# Authentication
|
|
||||||
c.FormgradeApp.authenticator_plugin_class = "nbgrader.auth.JupyterHubAuthPlugin"
|
|
||||||
|
|
||||||
# Logging
|
|
||||||
c.Application.log_level = "INFO"
|
|
||||||
|
|
||||||
# Formgrader settings
|
|
||||||
c.FormgradeApp.ip = "0.0.0.0"
|
|
||||||
c.FormgradeApp.port = 9999
|
|
||||||
c.FormgradeApp.base_url = "/jupyter/services/nbgrader-formgrader/"
|
|
||||||
|
|
||||||
# Enable tornado debug mode for development
|
|
||||||
# c.FormgradeApp.tornado_settings = {'debug': True}
|
|
||||||
|
|
||||||
# Assignment settings
|
|
||||||
c.AssignmentListApp.assignment_dir = "/home/jovyan/assignments"
|
|
||||||
c.AssignmentListApp.exchange_directory = exchange_dir
|
|
||||||
|
|
||||||
# Grader settings
|
|
||||||
c.AutogradeApp.force = True
|
|
||||||
c.GenerateAssignmentApp.force = True
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 573 B |
Reference in New Issue
Block a user