diff --git a/Dockerfile b/Dockerfile index ca40e83..0861108 100644 --- a/Dockerfile +++ b/Dockerfile @@ -58,6 +58,14 @@ COPY setup.py . COPY lidar_pipeline/ ./lidar_pipeline/ RUN pip3 install --no-cache-dir . +# CSS/JS de l'interface (app.js/app.css + Leaflet) bâchés dans l'image : +# la webapp les sert depuis webapp_assets/ du paquet installé, plus depuis +# le volume (cf. Dockerfile.webapp). cd /tmp : sans lui, python3 -c met le +# répertoire courant (/app, copie source) sur sys.path et le bake atterrirait +# dans la copie au lieu du paquet installé (dist-packages) qu'utilise le +# conteneur au runtime. +RUN cd /tmp && python3 -c "import pathlib, lidar_pipeline.index as i; i._write_ui_assets(pathlib.Path(i.__file__).resolve().parent / 'webapp_assets')" + # Copy backward-compatible entry point COPY process_lidar.py /usr/local/bin/ RUN chmod +x /usr/local/bin/process_lidar.py diff --git a/lidar_pipeline/webapp.py b/lidar_pipeline/webapp.py index 634ba76..015e922 100644 --- a/lidar_pipeline/webapp.py +++ b/lidar_pipeline/webapp.py @@ -147,14 +147,20 @@ async def _log_client_ip(request: Request, call_next): return await call_next(request) # CSS/JS de l'interface : servis depuis l'IMAGE (bâchés au build, cf. -# Dockerfile.webapp), plus depuis le volume — le code de l'interface suit -# l'image, pas le cache de tuiles. En repli (dev, source non bâchée), on les -# régénère depuis les constantes de l'index pour que /assets soit actif même -# avant la première génération. +# Dockerfile / Dockerfile.webapp), plus depuis le volume — le code de +# l'interface suit l'image, pas le cache de tuiles. En repli (dev, source +# non bâchée), on les régénère depuis les constantes de l'index ; si le +# dossier du paquet n'est pas inscriptible (install système sans bake), +# repli dans un répertoire temporaire pour ne pas casser l'import. _assets_dir = Path(__file__).resolve().parent / "webapp_assets" if not (_assets_dir / "app.js").is_file(): from .index import _write_ui_assets - _write_ui_assets(_assets_dir) + try: + _write_ui_assets(_assets_dir) + except OSError: + import tempfile + _assets_dir = Path(tempfile.gettempdir()) / "lidar_webapp_assets" + _write_ui_assets(_assets_dir) # --- Cache à la demande : la visualisation peuple le cache local ------------- # Les images viennent de la machine de traitement par HTTP : une image absente