diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..13329d96 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +src/nrtk_explorer/test_data/ +.venv/ +vue-components/node_modules/ diff --git a/docker/Dockerfile b/docker/Dockerfile index 12e00118..f5dce33e 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,3 +1,5 @@ FROM kitware/trame:py3.10-glvnd-2024-09 COPY --chown=trame-user:trame-user ./docker /deploy +ENV NRTK_EXPLORER_NUM_IMAGES=16 +RUN mv /deploy/config/apache/001-trame.tpl /opt/trame/apache.tpl RUN /opt/trame/entrypoint.sh build diff --git a/docker/config/apache/001-trame.tpl b/docker/config/apache/001-trame.tpl new file mode 100644 index 00000000..5416eb8c --- /dev/null +++ b/docker/config/apache/001-trame.tpl @@ -0,0 +1,37 @@ + + DocumentRoot /deploy/server/www + ErrorLog /deploy/server/logs/apache/error.log + CustomLog /deploy/server/logs/apache/access.log combined + + Alias TRAME_URL_PREFIX /deploy/server/www/ + + + Options Indexes FollowSymLinks + AllowOverride None + Require all granted + FallbackResource /index.html + + + # Set CORS headers + Header set Access-Control-Allow-Origin "*" + + # Handle launcher forwarding + ProxyPass TRAME_URL_PREFIX/launcher http://localhost:9000/paraview + ProxyPassReverse TRAME_URL_PREFIX/launcher http://localhost:9000/paraview + + # Handle paraview forwarding + ProxyPass TRAME_URL_PREFIX/paraview http://localhost:9000/paraview + ProxyPassReverse TRAME_URL_PREFIX/paraview http://localhost:9000/paraview + + # Handle WebSocket forwarding + RewriteEngine On + RewriteMap session-to-port txt:/opt/trame/proxy-mapping.txt + RewriteCond %{QUERY_STRING} ^sessionId=(.*)&path=(.*)$ [NC] + RewriteRule ^TRAME_URL_PREFIX/proxy.*$ ws://${session-to-port:%1}/%2 [P] + + # Handle API forwarding + RewriteRule ^TRAME_URL_PREFIX/api/(.*)/original-image/(.*)$ http://${session-to-port:$1}/original-image/$2 [P,L] + RewriteRule ^TRAME_URL_PREFIX/api/(.*)/transform-image/(.*)$ http://${session-to-port:$1}/transform-image/$2 [P,L] + RewriteRule ^TRAME_URL_PREFIX/api/(.*)/(.*)$ http://${session-to-port:$1}/$2 [P,L] + + \ No newline at end of file diff --git a/docker/nrtk_explorer-0.6.0-py2.py3-none-any.whl b/docker/nrtk_explorer-0.6.0-py2.py3-none-any.whl deleted file mode 100644 index c729023f..00000000 Binary files a/docker/nrtk_explorer-0.6.0-py2.py3-none-any.whl and /dev/null differ diff --git a/docker/setup/apps.yml b/docker/setup/apps.yml index 261d220b..d7f0b19d 100644 --- a/docker/setup/apps.yml +++ b/docker/setup/apps.yml @@ -2,9 +2,9 @@ trame: www_modules: - nrtk_explorer.module cmd: - - python - - -m - - nrtk_explorer.app.main + - nrtk-explorer + - --session-id + - ${id} - --host - ${host} - --port @@ -14,4 +14,4 @@ trame: - --server - --banner - --dataset - - /data/OIRDS_v1_0/oirds.json + - /data/coco-od-2017/mini_val2017.json diff --git a/docker/setup/initialize.sh b/docker/setup/initialize.sh deleted file mode 100644 index b54e85f5..00000000 --- a/docker/setup/initialize.sh +++ /dev/null @@ -1 +0,0 @@ -pip install /deploy/nrtk_explorer-0.6.0-py2.py3-none-any diff --git a/docker/setup/requirements.txt b/docker/setup/requirements.txt index 831c5c2d..fa12bf9f 100644 --- a/docker/setup/requirements.txt +++ b/docker/setup/requirements.txt @@ -1,2 +1 @@ -nrtk[headless] -# nrtk-explorer +nrtk-explorer diff --git a/src/nrtk_explorer/app/core.py b/src/nrtk_explorer/app/core.py index 952c7323..5fa97f70 100644 --- a/src/nrtk_explorer/app/core.py +++ b/src/nrtk_explorer/app/core.py @@ -40,7 +40,7 @@ DEFAULT_DATASETS = [ f"{DIR_NAME}/coco-od-2017/test_val2017.json", ] -NUM_IMAGES_DEFAULT = 500 +NUM_IMAGES_DEFAULT = os.environ.get("NRTK_EXPLORER_NUM_IMAGES", 500) NUM_IMAGES_DEBOUNCE_TIME = 0.3 # seconds @@ -101,6 +101,14 @@ def dir_path(arg): "help": "Choose which application features to enable based on a preset name.", }, }, + "session_id": { + "flags": ["--session-id"], + "params": { + "default": "", + "required": False, + "help": "Session ID for deploying to a remote server using Docker", + }, + }, } @@ -115,6 +123,7 @@ def __init__(self, server=None, **kwargs): ) self.context.repository = config["repository"] + self.context.session = config["session_id"] self.state.repository_datasets = [ str(path) for path in discover_datasets(self.context.repository) ] diff --git a/src/nrtk_explorer/app/images/image_server.py b/src/nrtk_explorer/app/images/image_server.py index f596fd24..54afbe9c 100644 --- a/src/nrtk_explorer/app/images/image_server.py +++ b/src/nrtk_explorer/app/images/image_server.py @@ -69,6 +69,10 @@ def __init__(self, server, images: Images): self._state_id_to_dataset_id, ) + self.url_prefix = ( + f"/api/{self.server.context.session}" if self.server.context.session else "" + ) + change_checker(self.server.state, "dataset_ids")(self.on_dataset_ids_change) @controller.add("on_server_bind") @@ -99,7 +103,7 @@ def on_dataset_ids_change(self, old_ids, new_ids): orig_key = str(self._id_counter) self._state_id_to_dataset_id[orig_key] = id self.server.state[dataset_id_to_image_id(id)] = ( - f"/{ORIGINAL_IMAGE_ENDPOINT}/{orig_key}" + f"{self.url_prefix}/{ORIGINAL_IMAGE_ENDPOINT}/{orig_key}" ) # Transform @@ -108,7 +112,7 @@ def on_dataset_ids_change(self, old_ids, new_ids): self._state_id_to_dataset_id[trans_key] = id self._transform_keys.add(trans_key) self.server.state[dataset_id_to_transformed_image_id(id)] = ( - f"/{TRANSFORM_IMAGE_ENDPOINT}/{trans_key}" + f"{self.url_prefix}/{TRANSFORM_IMAGE_ENDPOINT}/{trans_key}" ) @controller.add("apply_transform") @@ -119,5 +123,5 @@ def refresh_transform_images(self, **kwargs): self._state_id_to_dataset_id[trans_key] = id self._transform_keys.add(trans_key) self.server.state[dataset_id_to_transformed_image_id(id)] = ( - f"/{TRANSFORM_IMAGE_ENDPOINT}/{trans_key}" + f"{self.url_prefix}/{TRANSFORM_IMAGE_ENDPOINT}/{trans_key}" )