From e75933fdddae2590ff682e84e3ecff72059b083e Mon Sep 17 00:00:00 2001 From: Johannes Laurin Hoermann Date: Thu, 26 Mar 2026 12:52:59 +0900 Subject: [PATCH] MAINT: update Docker stack for development environment - Fix healthcheck endpoint: /config/health removed in newer dservercore, use /config/info with 200/401 response check instead - Switch from dserver-token-generator-plugin-oauth2 to dserver-dummy-token-generator in dev stack (accepts any username without OAuth2 setup) - Update npm install to use --legacy-peer-deps for webapp build - Update submodule references to latest commits --- compose/dserver/scripts/make-venv.sh | 4 +- compose/webapp/Dockerfile | 4 +- docker-compose.yml | 2 +- dserver-client-js | 2 +- dserver-dependency-graph-plugin | 2 +- .../dserver_dummy_token_generator/__init__.py | 69 +++++++++++++++++++ dserver-dummy-token-generator/pyproject.toml | 16 +++++ dserver-notification-plugin | 2 +- dserver-retrieve-plugin-mongo | 2 +- dserver-search-plugin-mongo | 2 +- dserver-signed-url-plugin | 2 +- dserver-token-generator-plugin-oauth2 | 2 +- dservercore | 2 +- dtool-dserver | 2 +- dtool-lookup-webapp | 2 +- dtool-s3 | 2 +- dtoolcore | 2 +- 17 files changed, 101 insertions(+), 18 deletions(-) create mode 100644 dserver-dummy-token-generator/dserver_dummy_token_generator/__init__.py create mode 100644 dserver-dummy-token-generator/pyproject.toml diff --git a/compose/dserver/scripts/make-venv.sh b/compose/dserver/scripts/make-venv.sh index c009351..e5d1868 100755 --- a/compose/dserver/scripts/make-venv.sh +++ b/compose/dserver/scripts/make-venv.sh @@ -40,8 +40,8 @@ pip install -e /app/dserver-dependency-graph-plugin echo "==> Installing dserver-signed-url-plugin..." pip install -e /app/dserver-signed-url-plugin -echo "==> Installing dserver-token-generator-plugin-oauth2..." -pip install -e /app/dserver-token-generator-plugin-oauth2 +echo "==> Installing dserver-dummy-token-generator (dev only, accepts any username)..." +pip install -e /app/dserver-dummy-token-generator echo "==> Installing additional dependencies..." pip install gunicorn psycopg2-binary PyJWT requests authlib httpx python-dotenv diff --git a/compose/webapp/Dockerfile b/compose/webapp/Dockerfile index e7e815e..7f39e31 100644 --- a/compose/webapp/Dockerfile +++ b/compose/webapp/Dockerfile @@ -17,14 +17,12 @@ COPY ./dtool-lookup-webapp/dtool-lookup-webapp/package.json ./ RUN sed -i 's|file:../../dserver-client-js|file:/dserver-client-js|g' package.json # Install dependencies (generates fresh lockfile) -RUN npm install +RUN npm install --legacy-peer-deps # Copy source files only (exclude node_modules, package-lock.json which would override) COPY ./dtool-lookup-webapp/dtool-lookup-webapp/src ./src COPY ./dtool-lookup-webapp/dtool-lookup-webapp/public ./public -COPY ./dtool-lookup-webapp/dtool-lookup-webapp/tsconfig*.json ./ COPY ./dtool-lookup-webapp/dtool-lookup-webapp/babel.config.js ./ -COPY ./dtool-lookup-webapp/dtool-lookup-webapp/vue.config.js ./ COPY ./dtool-lookup-webapp/dtool-lookup-webapp/.eslintrc.js ./ COPY ./dtool-lookup-webapp/dtool-lookup-webapp/.browserslistrc ./ diff --git a/docker-compose.yml b/docker-compose.yml index 9b732de..7dca69c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -224,7 +224,7 @@ services: - dserver_net command: /scripts/start-dserver.sh healthcheck: - test: curl -sf http://localhost:5000/config/health || exit 1 + test: curl -sf http://localhost:5000/config/info -o /dev/null -w "%{http_code}" | grep -qE "^(200|401)$" || exit 1 interval: 10s timeout: 5s retries: 5 diff --git a/dserver-client-js b/dserver-client-js index 95facf1..fdd8029 160000 --- a/dserver-client-js +++ b/dserver-client-js @@ -1 +1 @@ -Subproject commit 95facf1753c40e23a327a976b17f29540a1d12c8 +Subproject commit fdd80295f6b75583ae909d7e85fd7df7a4dd8cd7 diff --git a/dserver-dependency-graph-plugin b/dserver-dependency-graph-plugin index 4d201d6..cde5159 160000 --- a/dserver-dependency-graph-plugin +++ b/dserver-dependency-graph-plugin @@ -1 +1 @@ -Subproject commit 4d201d6b5d89c25cc41994c5470c2033d77aa73d +Subproject commit cde515931510a5209ed9d095bfe6510a628befd7 diff --git a/dserver-dummy-token-generator/dserver_dummy_token_generator/__init__.py b/dserver-dummy-token-generator/dserver_dummy_token_generator/__init__.py new file mode 100644 index 0000000..e95bba6 --- /dev/null +++ b/dserver-dummy-token-generator/dserver_dummy_token_generator/__init__.py @@ -0,0 +1,69 @@ +"""Dummy token generator extension for dserver development. +Accepts any username/password and issues a valid JWT. +DO NOT use in production. +""" +__version__ = "0.1.0" + +import datetime +import logging + +import jwt +from flask import current_app, jsonify, request +from flask_smorest import Blueprint + +logger = logging.getLogger(__name__) + +bp = Blueprint("dummy_auth", __name__, url_prefix="/auth") + + +@bp.route("/token", methods=["POST"]) +def create_token(): + data = request.get_json(silent=True) or {} + username = data.get("username") or request.form.get("username") + if not username: + return jsonify({"error": "Missing api_key or username"}), 401 + + import os + private_key_file = current_app.config.get("JWT_PRIVATE_KEY_FILE") or os.environ.get("JWT_PRIVATE_KEY_FILE") + algorithm = current_app.config.get("JWT_ALGORITHM") or os.environ.get("JWT_ALGORITHM", "RS256") + with open(private_key_file, "r") as f: + private_key = f.read() + + payload = { + "sub": username, + "identity": username, + "iat": datetime.datetime.utcnow(), + "exp": datetime.datetime.utcnow() + datetime.timedelta(hours=24), + } + token = jwt.encode(payload, private_key, algorithm=algorithm) + return jsonify({"token": token}) + + +@bp.route("/token", methods=["GET"]) +def get_token_info(): + return jsonify({"msg": 'POST /auth/token with {"username": "..."}'}), 200 + + +@bp.route("/info", methods=["GET"]) +def auth_info(): + return jsonify({"configured": True, "provider": "dummy", "login_url": None}) + + +class DummyTokenGeneratorPlugin: + """dservercore ExtensionABC-compatible dummy token generator.""" + + def __init__(self, app=None): + if app is not None: + self.init_app(app) + + def init_app(self, app, *args, **kwargs): + logger.warning("DummyTokenGeneratorPlugin loaded — dev only, not for production!") + + def get_blueprint(self): + return bp + + def get_config(self): + return {} + + def get_config_secrets_to_obfuscate(self): + return [] diff --git a/dserver-dummy-token-generator/pyproject.toml b/dserver-dummy-token-generator/pyproject.toml new file mode 100644 index 0000000..f93d621 --- /dev/null +++ b/dserver-dummy-token-generator/pyproject.toml @@ -0,0 +1,16 @@ +[build-system] +requires = ["setuptools>=61"] +build-backend = "setuptools.build_meta" + +[project] +name = "dserver-dummy-token-generator" +version = "0.1.0" +description = "Development-only dummy token generator for dserver" +requires-python = ">=3.8" +dependencies = ["PyJWT", "flask", "flask-smorest"] + +[project.entry-points."dservercore.extension"] +dummy = "dserver_dummy_token_generator:DummyTokenGeneratorPlugin" + +[tool.setuptools.packages.find] +include = ["dserver_dummy_token_generator*"] diff --git a/dserver-notification-plugin b/dserver-notification-plugin index 262266a..bc2d32f 160000 --- a/dserver-notification-plugin +++ b/dserver-notification-plugin @@ -1 +1 @@ -Subproject commit 262266a39852ade43120466231b65d98ff5a2929 +Subproject commit bc2d32f768ad0180212157b21288a8be0a8a3d85 diff --git a/dserver-retrieve-plugin-mongo b/dserver-retrieve-plugin-mongo index 2ceb6f6..02e6af5 160000 --- a/dserver-retrieve-plugin-mongo +++ b/dserver-retrieve-plugin-mongo @@ -1 +1 @@ -Subproject commit 2ceb6f6b59c627c70e263b13d97698d06a409000 +Subproject commit 02e6af5f439f0dc45ac19fbb1eec06b15c7290f0 diff --git a/dserver-search-plugin-mongo b/dserver-search-plugin-mongo index 92f9209..e5028d0 160000 --- a/dserver-search-plugin-mongo +++ b/dserver-search-plugin-mongo @@ -1 +1 @@ -Subproject commit 92f92092d96de0bba51d90874f34cfa786e5df22 +Subproject commit e5028d05904713e4b3a78496eb7729fa6478018c diff --git a/dserver-signed-url-plugin b/dserver-signed-url-plugin index 6e5b896..acd61b1 160000 --- a/dserver-signed-url-plugin +++ b/dserver-signed-url-plugin @@ -1 +1 @@ -Subproject commit 6e5b896e43a2cbba2482bfb26725a6a29fd77956 +Subproject commit acd61b18d6cff66c1f09eb3d2607c3e820873108 diff --git a/dserver-token-generator-plugin-oauth2 b/dserver-token-generator-plugin-oauth2 index 5e1b16a..9699e21 160000 --- a/dserver-token-generator-plugin-oauth2 +++ b/dserver-token-generator-plugin-oauth2 @@ -1 +1 @@ -Subproject commit 5e1b16ae9ff46f7c3367ebd376f3a440824ad7e3 +Subproject commit 9699e21b14caa952f4fb3a26ff35e841c3ca10c0 diff --git a/dservercore b/dservercore index 7d4ac82..da5f4af 160000 --- a/dservercore +++ b/dservercore @@ -1 +1 @@ -Subproject commit 7d4ac82e4861fc2c240b8bab2a1637ce7b62f305 +Subproject commit da5f4afea511071e0205556c16ec0c7d085742a2 diff --git a/dtool-dserver b/dtool-dserver index 4a36004..33a7642 160000 --- a/dtool-dserver +++ b/dtool-dserver @@ -1 +1 @@ -Subproject commit 4a36004c5e4182821c70eda565df58a8d124ea2a +Subproject commit 33a7642104f0f83c68058465fab6029dac915824 diff --git a/dtool-lookup-webapp b/dtool-lookup-webapp index ed44544..fe4134d 160000 --- a/dtool-lookup-webapp +++ b/dtool-lookup-webapp @@ -1 +1 @@ -Subproject commit ed44544d8dd6badc52a1168d2013211b0eb7bda3 +Subproject commit fe4134d83ba81f059e3afdd0679466f916f23e08 diff --git a/dtool-s3 b/dtool-s3 index 22e73cc..91559be 160000 --- a/dtool-s3 +++ b/dtool-s3 @@ -1 +1 @@ -Subproject commit 22e73ccf4ae841aee89425bdbcb12a6af9957c36 +Subproject commit 91559be154c3c8c3d8ca8297856c4dd6b71c3ed4 diff --git a/dtoolcore b/dtoolcore index 497c6de..8f43e1d 160000 --- a/dtoolcore +++ b/dtoolcore @@ -1 +1 @@ -Subproject commit 497c6de5b79e5b57b6c1607e2d8b49fc2c61e831 +Subproject commit 8f43e1d8ca0e14ea1a6a3166580c676f479c93a2