# Package serveur NextLimit

Ce dossier est un bundle autonome pour un hôte Debian. L'hôte ne fournit que Bash et Docker :
Python, pyosmium, osmium-tool, SQLite/RTree, gzip et jq sont installés dans l'image de compilation.
Aucun PBF Geofabrik n'est publié vers l'application.

## Contenu utile

```text
Dockerfile
build-europe-preindexed.sh
osm-dataset/
  build_dataset.py
  dataset_schema.py
  requirements.txt
  test_build_dataset.py
  test_dataset_schema.py
```

`build-europe-preindexed.sh` est l'unique point d'entrée. Il construit l'image, exécute les tests du
pipeline dans le conteneur, télécharge les sources Geofabrik et construit les SQLite. Après chaque
zone, il publie dans cet ordre : gzip, checksum, manifest, puis `catalog.json`. Le pays terminé est
donc immédiatement visible par l'application pendant que la zone suivante se construit. Le
catalogue complet est revalidé en fin de série. La génération n'est pas répartie entre plusieurs
scripts concurrents.

Le package courant est contrôlé intégralement avant sa publication. La reconstruction incrémentale
du catalogue relit ensuite les manifests et les tailles sans recalculer les SHA-256 de tous les
anciens pays à chaque zone ; le temps de publication ne croît donc pas quadratiquement.

## Installation Debian

Exemple d'installation sous `/var/www/dl/osm` :

```bash
sudo install -d -o osm-builder -g osm-builder /var/www/dl/osm
sudo cp -a package-serveur/. /var/www/dl/osm/
sudo chmod 0755 /var/www/dl/osm/build-europe-preindexed.sh
```

L'utilisateur `osm-builder` doit uniquement pouvoir utiliser le démon Docker et écrire dans le
dossier de travail/publication. Aucun paquet Python, osmium ou SQLite n'est requis sur Debian.

Commande ciblée lancée par Debian, avec verrou anti-concurrence :

```bash
sudo -u osm-builder /usr/bin/flock -n /var/www/dl/osm/.build.lock \
  /usr/bin/env COUNTRIES=GF /var/www/dl/osm/build-europe-preindexed.sh
```

Reconstruction Europe complète :

```bash
sudo -u osm-builder /usr/bin/flock -n /var/www/dl/osm/.build.lock \
  /var/www/dl/osm/build-europe-preindexed.sh
```

Le même appel peut être placé dans un timer systemd ou `/etc/cron.d`. Ne pas exécuter directement
les commandes Python sur l'hôte : le script transmet le travail au conteneur sans TTY.

## Répertoires persistants

Par défaut, à côté du script :

```text
build/osm-europe/   sources temporaires, SQLite temporaires et rapports privés
public-osm/data/    catalog.json et packages publics
```

Ils sont montés en lecture/écriture dans le conteneur. Le code du pipeline est monté en lecture
seule. Les fichiers publics sont créés avec l'UID/GID de l'utilisateur Debian qui lance Docker.

Variables principales :

```text
COUNTRIES=GF,FR             sélection ISO, vide = Europe
DATASET_REVISION=2          révision fonctionnelle du format v2
KEEP_SOURCE=1               conserve les PBF privés
KEEP_SQLITE=1               conserve les SQLite non compressés
RUN_PIPELINE_TESTS=0        désactive exceptionnellement les tests de prévol
LIST_ONLY=1                 affiche l'ordre sans télécharger de PBF
BUILD_ROOT=/chemin          stockage de construction
PUBLIC_ROOT=/chemin         racine publiée
IMAGE_NAME=nom:tag          image Docker locale
```

Une évolution fonctionnelle du contenu sans changement de schéma doit incrémenter
`DATASET_REVISION`. Les nouveaux noms (`YYYY.MM.DD.REVISION`) restent immuables et déclenchent une
mise à jour Android sans écraser un package déjà mis en cache.

## Ordre de traitement

Sans `COUNTRIES`, les extractions prioritaires sont traitées avant le reste de l'Europe :

```text
FR France
GF Guyane
GP Guadeloupe
MQ Martinique
RE La Réunion
YT Mayotte
NC Nouvelle-Calédonie
PF Polynésie française
WF Wallis-et-Futuna
CP Île de Clipperton
```

Cet ordre est imposé côté serveur car l'index Geofabrik omet certains codes ISO ultramarins et en
attribue d'autres incorrectement. Les URLs restent découvertes dans l'index Geofabrik : elles ne
sont pas codées dans le catalogue mobile. Saint-Barthélemy, Saint-Martin, Saint-Pierre-et-Miquelon
et les Terres australes ne disposent actuellement d'aucun extrait national dédié dans cet index ;
aucun package incomplet n'est inventé pour eux.

## Données de contrôle de vitesse

Le bit `road_flags & 4` marque uniquement une arête dirigée arrivant vers un contrôle. Le pipeline
traite :

- les nœuds `highway=speed_camera` présents sur la route ;
- les relations `type=enforcement` avec `enforcement=maxspeed`, `average_speed` ou
  `speed_camera`, lorsqu'un couple directionnel `from` vers `device`/`to` peut être résolu sur la
  graphe routier, y compris lorsque l'approche traverse plusieurs ways OSM.

Les relations non résolues ne sont pas inventées. Les manifests et le rapport CSV exposent les
compteurs de nœuds, relations, relations résolues et arêtes d'approche. L'application transforme ces
marqueurs en zones de contrôle génériques selon la politique pays ; elle n'affiche pas les
coordonnées exactes du dispositif.

## Validation et publication

Avant publication, le pipeline contrôle au minimum :

- les tests unitaires du filtre, des sens et des relations de contrôle ;
- `PRAGMA quick_check`, `integrity_check` et `rtreecheck` ;
- les trois index du graphe et la couverture RTree ;
- les plages de vitesses, confiances et flags ;
- l'attribution OSM/ODbL ;
- la restitution exacte du SQLite après gzip ;
- le SHA-256, les tailles et toutes les références du catalogue.

Le catalogue public est publié en dernier. Pour une nouvelle révision complète, publier l'APK qui
sait lire les nouveaux flags avant de remplacer le catalogue, puis reconstruire les pays avec une
valeur `DATASET_REVISION` supérieure.
