- URLs images versionnées (?v=mtime) : une tuile recalculée change d'URL et force le rechargement navigateur (cache heuristique contourné), y compris en plein run via /api/tiles ; veille permanente 15 s sur la carte - simulation locale du mode deux machines (docker-compose.local-2m.yml) : worker GPU :8974 + webapp légère :8973 au cache séparé output-webapp/ - override webapp pour le Pi 5 (192.168.3.3) : volume /srv/lidar/output, rsync vers le worker, labels Traefik (proxy/websecure/myresolver) - purge 0,5 m : worker/process et politique générale passés à 0,2 m seul - intègre le travail parallèle non commité : export mosaïque multi-dalles (export.py + /api/export), sous-tuilage intégral des couches, légendes VIZ_LEGENDS, docs et tests associés (213 tests verts)
73 lines
3.1 KiB
YAML
73 lines
3.1 KiB
YAML
# Simulation LOCALE du mode deux machines (cf. docs/DEPLOY_WEBAPP.md).
|
|
#
|
|
# Fait tourner sur une même machine les deux rôles normalement répartis sur
|
|
# deux machines, dans des conteneurs/images indépendants :
|
|
# - worker : machine de traitement (image complète, GPU) — API de
|
|
# génération sur le port hôte 8974 ;
|
|
# - webapp : interface légère (image Dockerfile.webapp, sans PDAL/GPU) —
|
|
# carte sur le port hôte 8973, avec son PROPRE cache de tuiles
|
|
# (./output-webapp) alimenté par rsync depuis ./output du
|
|
# worker (monté en lecture seule dans la webapp), comme le
|
|
# Raspberry Pi le fait par SSH vers la machine de traitement.
|
|
#
|
|
# Intérêt en local : mettre à jour le code de l'interface (rebuild webapp)
|
|
# sans toucher au worker ni aux générations en cours, et réciproquement.
|
|
#
|
|
# docker compose -f docker-compose.local-2m.yml up -d --build
|
|
# docker compose -f docker-compose.local-2m.yml logs -f webapp worker
|
|
# docker compose -f docker-compose.local-2m.yml down
|
|
# Retour au mode tout-en-un : docker compose up -d --build serve
|
|
services:
|
|
worker:
|
|
build: .
|
|
image: lidar-lidar
|
|
container_name: lidar-worker
|
|
init: true
|
|
user: "1000:1000"
|
|
gpus: all # retirer cette ligne sur une machine sans GPU
|
|
ports:
|
|
- "8974:8973" # API joignable en direct (debug) et par la webapp
|
|
volumes:
|
|
# input/ en écriture : l'API y télécharge les dalles IGN manquantes
|
|
- ./input:/data/input
|
|
- ./output:/data/output
|
|
environment:
|
|
- TZ=Europe/Paris
|
|
- LIDAR_INPUT_DIR=/data/input
|
|
- LIDAR_OUTPUT_DIR=/data/output
|
|
- LIDAR_GPU=1
|
|
- LIDAR_WORKERS=2
|
|
command: python3 -m uvicorn lidar_pipeline.webapp:app --host 0.0.0.0 --port 8973
|
|
restart: unless-stopped
|
|
|
|
webapp:
|
|
build:
|
|
context: .
|
|
dockerfile: Dockerfile.webapp
|
|
image: lidar-webapp
|
|
container_name: lidar-webapp
|
|
init: true
|
|
user: "1000:1000"
|
|
ports:
|
|
- "8973:8973"
|
|
volumes:
|
|
# Cache local propre à la webapp (équivalent du disque du Raspberry
|
|
# Pi) — PAS le ./output du worker : la séparation rendu/interface
|
|
# doit être réelle, les tuiles arrivent par le rsync ci-dessous.
|
|
- ./output-webapp:/data/output
|
|
# Sortie du worker, en lecture seule : source du rsync local qui
|
|
# remplace le "rsync par SSH vers la machine de traitement".
|
|
- ./output:/data/remote:ro
|
|
environment:
|
|
- TZ=Europe/Paris
|
|
- LIDAR_OUTPUT_DIR=/data/output
|
|
# Backend de génération = worker du même réseau compose (DNS docker)
|
|
- LIDAR_GENERATION_URL=http://lidar-worker:8973
|
|
# Rapatriement des tuiles : mêmes exclusions que la prod (les
|
|
# vignettes/sous-tuiles sont régénérées localement par /api/sync)
|
|
- LIDAR_SYNC_CMD=rsync -a --delete --exclude=*.tif --exclude=.generation* --exclude=index_thumbs --exclude=index_subtiles /data/remote/ /data/output/
|
|
# Cache auto-entretenu : resynchronisation + vignettes toutes les
|
|
# 2 min (plus réactif que la prod pour tester en local)
|
|
- LIDAR_AUTO_SYNC_SECONDS=120
|
|
restart: unless-stopped
|