Fiche STM1-SPEC-07 — Niveau N2 — Modèle prévu opus medium | utilisé claude-opus-5-5 — Agent session « Medium · STM1 » (pas de sous-agent) — Skills sk-protocol # STM1-SPEC-07 : outil de téléchargement des cartes de villes (étude, sans code ni copie UE) (2026-10-20) Ordre : Big Boss (`local_104ff22d`). Décisions de l'utilisateur, tapées dans la session STM1, citées mot pour mot : « gardons paris comme ville de référence.. pour le moment sur Forgejo. on doit mettre en place un outils de download des cartes. Peut on monétiser la solutions sans violé la licence? le cout d'hébergement à 1,75€ la carte ». Lecture retenue par Big Boss, à confirmer par l'utilisateur sur cette fiche : 1. Paris est la ville de référence du pilote ; 2. hébergement sur le Forgejo de l'utilisateur (releases) pour l'instant ; 3. un outil de téléchargement des cartes est à mettre en place. **Donnée d'entrée : coût d'hébergement de 1,75 € par carte (utilisateur). Aucun prix de vente n'est calculé ni proposé ici : c'est une décision de l'utilisateur.** (Correction : la réponse de la session du 2026-10-20 citait « 1,75 € suggéré » dans un exemple de modèle ; cette mention est retirée.) ## 1. Rappel des briques (établi : SPEC-05, SPEC-06, B5) - Chaîne de production d'une ville : - extrait OSM (Overpass, une requête) ; - `LPImportCityOSM` (import en `UStreetMap`, B5 : Paris en 42 s, pic 3,02 Go, 77,2 Mo) ; - maillage `Static` (logique `OnCreateStaticMeshAssetClicked`, à écrire en commandlet) ; - eau (`LPBuildCityWater`). - Mods d'assets : `Mods//` monté au démarrage par le moteur et contrôlé par `LPModGuard` ; cuisson par `BuildMod.ps1` contre une version de référence (`Docs/23_Cycle_De_Vie_Mod.md`). - Résolution des villes : `GI.MoveCity`, puis `ULPAssetRegistryHelpers::GetAssetByObjectPath` (C++), qui est le point de redirection vers un pack. - Moteur 5.8 : - `FHttpModule` ; - `FPlatformMisc::GetSHA256Signature` et `FSHA256Signature` (`GenericPlatformMisc.h:322, 1405`) ; - **pas de zip en Shipping** (`FZipArchiveReader` est en Developer), donc fichiers séparés. ## 2. Questions fermées (décisions 2 à 4 de SPEC-06), avec recommandation | # | Question | Choix | Recommandation et motif | |---|---|---|---| | Q1 | Format d'un pack | **(a) mod d'assets (`Mods//`) avec redirection C++ des chemins** / (b) pak de remplacement des chemins `/Game/…` | **(a)** : garde `LPModGuard` (version), gestionnaire de mods, désinstallation ; aucune modification du GI ; le jeu de base n'est jamais écrasé | | Q2 | Taille de zone par ville (hors Paris, Londres et Bath) | (a) format Paris/Londres (≈ 11 × 8 km) / (b) 5 × 5 km / **(c) 3 × 3 km** | **(c)** pour commencer : hébergement par carte et temps de téléchargement réduits ; centre-ville suffisant pour le jeu (lieux, aménités). À mesurer sur une ville avant le lot. Paris reste au format de référence (≈ 11 × 8 km) | | Q3 | Découpage | **(a) un pack par ville** / (b) un pack par région | **(a)** : correspond au coût par carte donné par l'utilisateur et au bouton « Download » par ville ; mises à jour indépendantes. *Change la recommandation de SPEC-06 (région), au vu du coût par carte* | ## 3. Hébergement sur le Forgejo (releases) - **Dépôt public dédié aux cartes** (par exemple `//LifePlay-Cities`), séparé du dépôt du jeu ; **une release par pack** et par version (`Paris-1.0.0`…). Les pièces jointes (`.uplugin`, `.lpmod`, `CREDITS.txt`, `.pak/.utoc/.ucas`, extrait `.osm` ou méthode) sont téléchargeables **sans authentification**. - **URL en réglage, jamais en dur** : - `Config/DefaultGame.ini`, section `[/Script/LifePlay.LPCityPacksSubsystem]`, `ManifestUrl=` : URL publique du manifeste, attachée à une release fixe ou servie par le dépôt ; - surcharge possible par l'utilisateur dans `GameUserSettings.ini`, sans rebuild. - **Aucun jeton dans le dépôt ni dans le jeu**. La lecture est publique. La **publication** (création des releases, envoi des fichiers) se fait par un script d'outillage local (`Tools/PublishCityPack.ps1`, à écrire) qui lit le jeton Forgejo dans une variable d'environnement ou le gestionnaire d'identifiants de Windows, jamais dans un fichier versionné. Le jeton est créé par l'utilisateur. - Quotas : taille maximale des pièces jointes et bande passante du serveur Forgejo **à vérifier par l'utilisateur** sur son instance (réglage `[attachment] MAX_SIZE` de Forgejo). ## 4. Manifeste JSON publié (une URL), signé en option (étape ultérieure). ```json { "format": 1, "attribution": "Map data © OpenStreetMap contributors, ODbL 1.0", "packs": [{ "id": "LPCity_Paris", "city": "Paris", "version": "1.0.0", "game_version_min": "2026.11.0", "game_version_max": "2026.12.99", "engine": "5.8", "size_bytes": 0, "osm_base": "2026-10-20T12:54:06Z", "source": "Overpass, requête et extrait publiés dans la release", "files": [{ "path": "LPCity_Paris.uplugin", "url": "https://…", "bytes": 0, "sha256": "…" }] }] } ``` Règles : - le jeu ne propose que les packs compatibles (`game_version_min/max`, `engine`) ; - `size_bytes` est affiché avant tout téléchargement ; - le manifeste est relu à chaque ouverture du menu, avec un cache local de 24 h. ## 5. Côté jeu : `ULPCityPacksSubsystem` (C++, module `LifePlay`, aussi en Shipping) 1. **Liste** : lecture du manifeste (`FHttpModule`, délai d'attente de 15 s). Pour chaque ville de `GI.Cities` (lecture seule), l'état est : *installé* (pack monté), *disponible* (dans le manifeste, compatible) ou *carte de base* (gabarit actuel). 2. **Consentement** avant chaque téléchargement, en anglais dans le jeu. Il affiche : - la taille ; - la source (URL de l'hôte) ; - la licence (ODbL, attribution) ; - le fait que le pack sera actif **au prochain lancement**. Pas de case précochée. 3. **Téléchargement**, fichier par fichier : - dans `Saved/Downloads//.part`, avec progression ; - écriture en flux vers le disque (`IHttpRequest::SetResponseBodyReceiveStream`, à vérifier en 5.8), sans tout garder en mémoire. 4. **Erreurs réseau et reprise** : - nouvelle tentative avec attente croissante (2, 4 puis 8 s, au plus 3 essais) ; - **reprise** d'un `.part` par l'en-tête `Range: bytes=-`, si le serveur répond `206` ; sinon, reprise de zéro (prise en charge de `Range` par les pièces jointes Forgejo : **à vérifier**) ; - annulation par l'utilisateur ; - délai d'attente ; - message clair (« Download failed: … ») sans plantage ; - la ville reste sur sa carte de base. 5. **Vérification** : SHA-256 de chaque fichier contre le manifeste (`FPlatformMisc::GetSHA256Signature`). Un écart supprime le `.part` et affiche un message ; **rien n'est installé**. 6. **Installation atomique** : quand tous les fichiers sont vérifiés, déplacement de `Saved/Downloads//` vers `/Mods//`. Si `Mods/` n'est pas inscriptible, message et emplacement indiqué (`Saved` reste intact). 7. **Montage** : au **prochain lancement**, par le moteur (`FPluginManager`), contrôlé par `LPModGuard`. Pas de montage à chaud au départ ; ce serait une étape ultérieure (`FPakPlatformFile::Mount` et registre d'assets). 8. **Redirection** (C++, `LPAssetRegistryHelpers::GetAssetByObjectPath`) : - `/Game/Heavy/StreetMap/[Static/|Water/]` est redirigé vers `//StreetMap/…` si le pack est monté ; - pack absent : la carte de base (gabarit) reste ; - journal `[LPCity]`. 9. **Désinstallation** : par le gestionnaire de mods existant (supprimer `Mods/`). 10. **Interface** : - (i) une fenêtre Slate C++ « City maps », ouverte depuis le menu des villes ou le gestionnaire de mods, **sans modifier de Blueprint** (recommandé au départ) ; - ou (ii) un bouton dans le widget `UI/CityMenu`, par MCP (révision du Blueprint). 11. **Sûreté** : - HTTPS seulement ; - aucun fichier exécuté (paks montés par le moteur) ; - aucune donnée personnelle envoyée ; - en-tête `User-Agent` neutre ; - le manifeste n'est que de la donnée. ## 6. Coût (estimé, en jours) | Lot | Contenu | Jours | |---|---|---| | A | redirection C++ des chemins (`GetAssetByObjectPath`), avec essai sur Paris en pack | 0,5 | | B | production d'un pack : commandlet de maillage `Static` (logique du plugin), découpe à la boîte, eau, `BuildMod`, `CREDITS` (ODbL) | 2 | | C | `Tools/PublishCityPack.ps1` : manifeste, SHA-256, release Forgejo par l'API (jeton hors dépôt) | 1 | | D | `ULPCityPacksSubsystem` : manifeste, HTTP en flux, reprise, SHA-256, installation atomique, journal | 2 | | E | interface Slate (liste, consentement, progression, erreurs) | 1,5 | | F | VAL (réseau coupé, SHA-256 faux, reprise, version incompatible, pack absent) et essai en jeu | 1 | | G | DOC (doc numérotée, crédits, guide de publication) | 0,5 | | | **Total** | **≈ 8,5** | Plus la production des cartes (environ 278 villes) : par ville, une requête Overpass, l'import, le maillage, la cuisson, la publication. C'est automatisable, mais la cadence est limitée par la politique d'usage d'Overpass. ## 7. Monétisation : lecture des licences (pas un avis juridique) **Ce qui suit est une lecture des fichiers de licence du dépôt, pas un avis juridique.** Pour un usage commercial, faire vérifier par un juriste. | Composant | Licence (fichier) | Lecture | |---|---|---| | Données des cartes | ODbL 1.0 (`Licenses/OpenStreetMap_Geodata_License.txt`) | usage commercial permis. Obligations : **attribution** (« © OpenStreetMap contributors ») ; **partage à l'identique** de la base dérivée diffusée (les données de la carte restent sous ODbL : l'acheteur peut les repartager) ; pour un **« Produced Work »** (œuvre produite, par exemple un rendu), licence libre, mais avec attribution et la base dérivée offerte (ou la méthode pour la refaire) ; **pas de mesure technique** de restriction sans version libre parallèle | | Plugin StreetMap | MIT (`StreetMap_Plugin_License.txt`) | aucune contrainte gênante (mention de la licence) | | Code et assets de Vinfamy | MIT (`Vinfamy_License.txt`) | vente permise | | Jeu dans son ensemble | AGPL, à cause de ManuelLab (`AGPL_License.txt`, `Vinfamy_License.txt`) | le **code** du jeu, outil de téléchargement compris, doit rester disponible en source (déjà public) | | Mods | `Licenses/Modding_License.txt` : « completely belong to YOU the modder … even commercially » | un pack de cartes distribué comme mod peut être vendu ; les données qu'il contient restent sous ODbL | Conséquences (lecture) : - **Permis** : - faire payer le **service** (téléchargement intégré, hébergement, mises à jour) ; - l'accès anticipé ; - les dons ; - le prix libre. - **Non permis** : interdire le repartage des **données** de la carte, ou la verrouiller sans version libre. - Les extraits `.osm` (ou la requête et la méthode) doivent être publiés avec chaque pack (pièce jointe de la release). - Le **coût d'hébergement** (1,75 € par carte, donnée de l'utilisateur) **n'entre pas en conflit** avec la licence. - Le choix d'un prix de vente reste à l'utilisateur. - **Hors licence, à vérifier par l'utilisateur** : les conditions des services de paiement envers un jeu pour adultes (le pack de cartes lui-même n'a pas de contenu adulte). ## 7 bis. Conteneurs sur le serveur Forgejo (podman) : étude, rien téléchargé ni exécuté Information de l'utilisateur citée par Big Boss : « sur Forgejo podman est installé on peut descendre des container de produit adapté ». **Aucun `podman pull` ni `podman build` n'est fait ici.** Chacun sera annoncé, soumis à l'accord de l'utilisateur et **lancé par lui** sur son serveur. Les informations des images viennent des pages officielles relues le 2026-10-20 ; ce qui n'y figure pas est marqué « à vérifier ». ### (a) Servir les packs et le manifeste : conteneur de fichiers statiques But : garantir `Range` et `206` (reprise, § 5.4), des en-têtes de cache (`ETag`, `Cache-Control`) et un type MIME correct. Les pièces jointes des releases Forgejo n'ont pas ces garanties (à vérifier). Ce conteneur peut tourner **à côté** des releases (miroir) ou **à leur place** (le manifeste pointe alors vers lui). | Image | Éditeur | Statut | Licence | Taille | Ports | Volumes | Mise à jour | Avis | |---|---|---|---|---|---|---|---|---| | **`docker.io/library/nginx:1.30.6-alpine`** (variante `stable-alpine`) | NGINX Docker Maintainers | **Docker Official Image** | nginx : licence « 2-clause BSD-like » (page de l'image) | non affichée pour `alpine` (60,9 Mo pour `latest` Debian ; `alpine` plus petite, à vérifier) | 80 dans le conteneur | lecture seule : `/usr/share/nginx/html` (packs) et `/etc/nginx/conf.d` (configuration) | suivre les étiquettes `1.30.x-alpine` (correctifs de sécurité) | **recommandée** si un mandataire HTTPS sert déjà Forgejo : nginx derrière lui, sur `127.0.0.1:` ; `Range` natif | | `docker.io/library/caddy:2.11.7-alpine` | Caddy Docker Maintainers | **Docker Official Image** | Apache-2.0 (dépôt caddyserver/caddy ; non affichée sur la page, à relire) | **23,7 Mo** (page de l'image) | 80, 443, 443/udp | `/data`, `/config` (déclarés) ; packs en lecture seule, par exemple `/srv` | étiquettes `2.11.x-alpine` | alternative si aucun mandataire n'existe : HTTPS automatique (Let's Encrypt) | Configuration proposée (nginx) : `location /citypacks/ { root /usr/share/nginx/html; add_header Cache-Control "public, max-age=86400"; }` (`Range` et `ETag` sont natifs) ; manifeste servi avec `Cache-Control: max-age=300`. Sûreté : - podman **rootless** ; - `--read-only` ; - `--cap-drop=ALL` ; - `--security-opt=no-new-privileges` ; - volume des packs monté `:ro` ; - aucune écriture dans le conteneur ; - port lié à `127.0.0.1` derrière le mandataire HTTPS existant. ### (b) Produire les cartes sur le serveur : découper à la boîte sans rien installer sur le poste de jeu Chemin recommandé : **extrait Geofabrik par pays** (fichier `.osm.pbf`, téléchargement annoncé à part), puis **`osmium extract --bbox`** (3 × 3 km par ville), puis **`osmium cat -o ville.osm`** (XML lisible par `LPImportCityOSM`). Ce chemin évite les 278 requêtes à Overpass (saturation constatée le 2026-10-20 : HTTP 502). | Image | Éditeur | Statut | Licence | Taille | Ports | Volumes | Mise à jour | Avis | |---|---|---|---|---|---|---|---|---| | **Image construite localement** : `Containerfile` à partir de `docker.io/library/debian:stable-slim`, plus le paquet Debian `osmium-tool` | Debian (image de base officielle ; paquet signé par Debian) | base **Docker Official Image** ; paquet de l'archive Debian (signatures APT) | osmium-tool : GPL-3.0 (dépôt osmcode/osmium-tool, à relire) ; base Debian : licences libres (DFSG) | à mesurer (base `stable-slim` plus un paquet ; quelques dizaines de Mo, estimé) | **aucun** | `/data` (extraits `.pbf` en lecture seule, sorties `.osm` en écriture) | reconstruire (`podman build --pull`) pour suivre les mises à jour de Debian | **recommandée** : pas d'image tierce, provenance vérifiable | | `docker.io/iboates/osmium` | tiers (iboates) | communautaire, **non officielle** | osmium : GPL-3.0 | non relevée | aucun | `/data` (à vérifier) | reconstruite le 1er de chaque mois, étiquette `nightly` (description Docker Hub) | à défaut : épingler un condensat (`@sha256:`) et relire le `Dockerfile` | | `docker.io/wiktorn/overpass-api:0.7.62` | tiers (wiktorn) | communautaire, **non officielle** | Overpass API : AGPL-3.0 (logiciel drolbr/Overpass-API, à relire) ; licence de l'image non indiquée | **≈ 117,9 Mo compressés** (page des étiquettes), **plus une base de données** de plusieurs dizaines à centaines de Go | 80 | volume de données (`/db`) | — | **non recommandée** : par défaut, l'image clone un serveur du **monde entier** (description Docker Hub) ; trop lourd pour découper 278 villes. Geofabrik + osmium suffit | `Containerfile` proposé pour osmium (texte seulement, **non exécuté**) : ``` FROM docker.io/library/debian:stable-slim RUN apt-get update && apt-get install -y --no-install-recommends osmium-tool && rm -rf /var/lib/apt/lists/* USER 1000:1000 WORKDIR /data ENTRYPOINT ["osmium"] ``` Exemple d'usage (à lancer par l'utilisateur) : `podman run --rm --network=none -v /srv/osm:/data:Z lp-osmium extract --bbox 2.3305,48.8395,2.3715,48.8665 france-latest.osm.pbf -o paris-3x3.osm.pbf`, puis `osmium cat paris-3x3.osm.pbf -o paris-3x3.osm`. `--network=none` : le conteneur de découpe n'a aucun accès réseau. ### (c) Autres images utiles (optionnelles) - **Aucune autre indispensable** : un serveur de fichiers (a) et osmium (b) couvrent le besoin. - Pour automatiser la publication côté serveur : un service planifié (systemd timer et `podman run`) qui régénère un pack depuis un extrait Geofabrik récent. Pas d'image supplémentaire. - Écartés : MinIO/S3 (inutile pour des fichiers statiques), une instance Overpass locale (voir (b)). ### Annonce des `podman pull` (à soumettre à l'utilisateur, aucun lancé) | # | Commande (lancée par l'utilisateur sur son serveur) | Ce qu'elle télécharge | Taille | |---|---|---|---| | C1 | `podman pull docker.io/library/nginx:1.30.6-alpine` | serveur de fichiers statiques, image officielle | à vérifier (variante Alpine) | | C2 | `podman build -t lp-osmium -f Containerfile .` (tire `docker.io/library/debian:stable-slim`, puis le paquet `osmium-tool` depuis l'archive Debian) | base Debian officielle et paquet signé | à mesurer | | C3 (option) | `podman pull docker.io/library/caddy:2.11.7-alpine` | seulement si aucun mandataire HTTPS n'existe | 23,7 Mo | Plus les extraits Geofabrik par pays (fichiers, pas des images), annoncés à part avant chaque téléchargement : URL, taille, licence ODbL. ### État réel du serveur (relevé `podman` collé par l'utilisateur, relayé par Big Boss le 2026-10-20) et révision | Conteneur | Image | Ports | |---|---|---| | `forgejo_db_1` | `docker.io/library/postgres:15-alpine` | 5432/tcp (non publié) | | `forgejo_caddy_1` | `docker.io/library/caddy:2-alpine` | `0.0.0.0:80->80`, `0.0.0.0:443->443`, 443/udp, 2019/tcp | | `forgejo_server_1` | `codeberg.org/forgejo/forgejo:9` | `127.0.0.1:3000->3000`, `0.0.0.0:2222->22` | **Conséquences (révision du (a) et de l'annonce) :** 1. **Un mandataire HTTPS existe : Caddy.** **C3 tombe** (pas de second Caddy). 2. **C1 (nginx) n'est plus utile : recommandation « Caddy seul ».** - La directive `file_server` de Caddy sert des fichiers statiques avec les requêtes partielles (`Range`, réponse `206`), `ETag`, `Last-Modified` et le type MIME (documentation de Caddy, `file_server` ; à relire sur la version installée). - Il suffit d'un **bloc de site en plus** dans le Caddyfile existant, et d'un **volume en lecture seule**, **sans nouvelle image**. - nginx derrière Caddy n'ajouterait qu'un saut de plus et une image à maintenir. Bloc proposé (**texte seulement, non appliqué**), deux variantes au choix de l'utilisateur : ``` # Variante 1 : sous-domaine dédié (DNS à créer), certificat automatique par Caddy cartes. { root * /srv/citypacks @manifest path /manifest.json header @manifest Cache-Control "public, max-age=300" header Cache-Control "public, max-age=86400" file_server } # Variante 2 : chemin sous le domaine actuel de Forgejo (dans son bloc de site existant, avant le reverse_proxy) handle_path /citypacks/* { root * /srv/citypacks header Cache-Control "public, max-age=86400" file_server } ``` - Volume à ajouter au conteneur Caddy : `/srv/citypacks:/srv/citypacks:ro` (option `:Z` sous SELinux). - L'ajout d'un volume demande de **recréer** le conteneur `forgejo_caddy_1` (fichier compose ou commande d'origine) : interruption de quelques secondes. Un simple rechargement du Caddyfile (`caddy reload`) ne suffit pas pour un volume. - Pas de `encode` sur les paks (déjà compressés). - Le `ManifestUrl` du jeu pointe alors vers `https://cartes./manifest.json` (variante 1) ou `https:///citypacks/manifest.json` (variante 2). 3. **Épinglage des images.** - `caddy:2-alpine` est une **étiquette flottante** : elle suit toute la série 2.x, et chaque recréation peut changer de version. À épingler sur une version précise (par exemple `docker.io/library/caddy:2.11.7-alpine`, étiquette officielle relevée le 2026-10-20) ou sur un condensat `@sha256:…`, et à monter volontairement. - Même remarque, hors de la fiche mais visible dans le relevé : `postgres:15-alpine` et `forgejo:9` sont flottantes (par version mineure ou majeure) ; même règle conseillée. 4. **Port d'administration de Caddy (2019).** - Dans le relevé, `2019/tcp` apparaît **sans liaison à l'hôte** (pas de `0.0.0.0:…->2019`). Il est déclaré par l'image, mais **non publié** (estimé, d'après le format de `podman ps`). - Il ne doit **jamais** être publié : l'API d'administration de Caddy modifie la configuration à chaud, sans authentification par défaut. - À vérifier par l'utilisateur : `podman port forgejo_caddy_1` ne doit pas lister 2019. - Option : `admin off`, ou `admin localhost:2019`, dans le bloc global du Caddyfile. 5. **C2 (`lp-osmium`) est inchangé** : image construite localement, sans réseau (§ (b)). Annonce révisée : **C1 retiré**, **C3 retiré** ; reste **C2** (`podman build -t lp-osmium -f Containerfile .`), plus la **modification de Caddy** (bloc de site, volume en lecture seule, épinglage, vérification du port 2019). Ce sont des gestes de l'utilisateur sur son serveur, après son accord. ### Ajouts au projet compose « forgejo » (outil de déploiement : podman-compose) — esquisse, précisée par le sous-§ « Compose réel » ci-dessous Précision de l'utilisateur, citée par Big Boss : « podman-compose est l'outil de déployment ». Les conteneurs `forgejo_db_1`, `forgejo_caddy_1` et `forgejo_server_1` viennent d'un projet compose « forgejo ». Ce qui suit est **du texte à ajouter par l'utilisateur**. Le nom du fichier compose (`compose.yml`, `docker-compose.yml`…) et le chemin actuel du Caddyfile ne sont pas connus : ils sont notés `<…>`. Rien n'est appliqué. **1. Fichier compose : ajouts (service `caddy` existant, service `lp-osmium` neuf)** ```yaml services: caddy: # ÉPINGLAGE : remplace l'étiquette flottante caddy:2-alpine image: docker.io/library/caddy:2.11.7-alpine volumes: # (existant, à garder tel quel) le Caddyfile et les volumes /data et /config du projet # AJOUT : packs de villes et manifeste, en lecture seule - ./citypacks:/srv/citypacks:ro,Z # ports : inchangés (80, 443, 443/udp) ; NE PAS ajouter 2019 # AJOUT : outil de découpe des cartes, lancé à la demande, sans réseau lp-osmium: build: context: ./lp-osmium # dossier contenant le Containerfile du § (b) dockerfile: Containerfile image: localhost/lp-osmium:1 network_mode: none profiles: ["outils"] # jamais démarré par « up » sans --profile volumes: - ./osm:/data:Z # extraits Geofabrik (.pbf) en entrée, .osm en sortie entrypoint: ["osmium"] ``` - `profiles` : pris en charge par podman-compose dans ses versions récentes (à vérifier par `podman-compose version`). - Sinon, solution de repli : mettre `lp-osmium` dans un second fichier `compose.outils.yml`, lancé par `podman-compose -f compose.outils.yml run --rm lp-osmium …`. **2. Caddyfile : ajout** (une des deux variantes du sous-§ précédent, par exemple la variante 1) ``` cartes. { root * /srv/citypacks @manifest path /manifest.json header @manifest Cache-Control "public, max-age=300" header Cache-Control "public, max-age=86400" file_server } ``` Le bloc global n'est pas modifié. Option de durcissement : `{ admin localhost:2019 }`, valeur par défaut, à confirmer dans le bloc global existant. **3. Production d'un pack (à la demande)** : `podman-compose --profile outils run --rm lp-osmium extract --bbox ,,, -latest.osm.pbf -o -3x3.osm.pbf`, puis `podman-compose --profile outils run --rm lp-osmium cat -3x3.osm.pbf -o -3x3.osm`. Les fichiers produits restent dans `./osm/`. Le `.osm` est ensuite importé sur le poste de développement (`LPImportCityOSM`), et le pack cuit est déposé dans `./citypacks/` par le script de publication. **4. Séquence de déploiement (lancée par l'utilisateur sur son serveur, dans le dossier du projet compose)** | Étape | Commande (texte, à adapter) | Attendu | |---|---|---| | 0. État avant | `podman-compose ps` ; `podman image inspect docker.io/library/caddy:2-alpine --format '{{.Digest}}'` | 3 conteneurs actifs ; condensat de l'image Caddy actuelle **noté** (pour le retour arrière) | | 1. Sauvegarde | `cp .yml .yml.bak-20261020` ; `cp .bak-20261020` | deux copies présentes | | 2. Dossiers | `mkdir -p citypacks osm lp-osmium` ; déposer `lp-osmium/Containerfile` ; déposer un fichier d'essai `citypacks/essai.txt` | dossiers créés | | 3. Édition | ajouts des points 1 et 2 dans le compose et le Caddyfile | — | | 4. Image épinglée | `podman-compose pull caddy` (tire `caddy:2.11.7-alpine` : **téléchargement à accepter**) | image présente | | 5. Redéploiement | `podman-compose up -d caddy` (recrée le seul service `caddy` : coupure de quelques secondes du site Forgejo) | `forgejo_caddy_1` recréé et actif | | 6. Vérifications | `podman-compose exec caddy caddy validate --config /etc/caddy/Caddyfile` ; `podman port forgejo_caddy_1` (pas de 2019) ; `curl -I https:///` (Forgejo répond) ; `curl -I -H "Range: bytes=0-3" https://cartes./essai.txt` | « Valid configuration » ; ports 80 et 443 seulement ; Forgejo en `200` ; essai en `206 Partial Content` avec `ETag` | | 7. Outil (option) | `podman-compose --profile outils build lp-osmium` (C2 : tire `debian:stable-slim` et le paquet `osmium-tool`, **à accepter**) ; `podman-compose --profile outils run --rm lp-osmium --version` | version d'osmium affichée | | R. Retour arrière | `cp .yml.bak-20261020 .yml` ; `cp .bak-20261020 ` ; `podman-compose up -d caddy` (l'ancienne image `caddy:2-alpine` est encore locale, voir le condensat de l'étape 0) | retour à l'état d'avant ; Forgejo répond | Précautions : - faire l'étape 5 à un moment creux ; - ne pas lancer `podman-compose down` (il arrêterait Forgejo et la base) ; - les étapes 4 et 7 téléchargent des images : chacune demande l'accord de l'utilisateur. ### Compose réel (`~/forgejo/docker-compose.yml`, VPS Ubuntu, podman-compose) : diff exact et séquence Fichier collé par l'utilisateur et relayé par Big Boss, **secrets masqués**. Aucun secret n'est recopié ici. Établi par ce fichier : - `version: '3.8'` ; - services `db` (`postgres:15-alpine`, aucun port publié), `server` (`codeberg.org/forgejo/forgejo:9`, `127.0.0.1:3000:3000`, `2222:22`) et `caddy` (`docker.io/library/caddy:2-alpine`, `80:80`, `443:443`) ; - volumes de `caddy` : `./Caddyfile:/etc/caddy/Caddyfile:z`, `./data/caddy_data:/data:Z`, `./data/caddy_config:/config:Z` ; - **le port 2019 n'est pas publié (établi).** **1. Diff exact du service `caddy`** (texte ; le reste du fichier est inchangé) ```diff caddy: - image: docker.io/library/caddy:2-alpine + image: docker.io/library/caddy:2.11.7-alpine restart: always ports: - "80:80" - "443:443" volumes: - ./Caddyfile:/etc/caddy/Caddyfile:z - ./data/caddy_data:/data:Z - ./data/caddy_config:/config:Z + - ./data/citypacks:/srv/citypacks:ro,Z ``` (`:Z` sert aux systèmes SELinux ; sur Ubuntu, qui utilise AppArmor, il est sans effet et sans risque, pour garder le même style que les autres volumes.) **2. Bloc à ajouter au `Caddyfile`** - *Variante 1, sous-domaine dédié* (enregistrement DNS `cartes.` vers le VPS à créer d'abord ; certificat automatique) : ajouter **à la fin** du Caddyfile ``` cartes. { root * /srv/citypacks @manifest path /manifest.json header @manifest Cache-Control "public, max-age=300" header Cache-Control "public, max-age=86400" file_server } ``` - *Variante 2, chemin sous le domaine de Forgejo* : à insérer **dans** le bloc de site existant de Forgejo, **avant** son `reverse_proxy` : ``` handle_path /citypacks/* { root * /srv/citypacks header Cache-Control "public, max-age=86400" file_server } ``` **L'utilisateur devra montrer son Caddyfile** (secrets masqués) pour placer ce bloc exactement. Si le `reverse_proxy` est déjà dans un `handle`, il faut un `handle` sœur. **3. Service `lp-osmium`** (à ajouter sous `services:`) ```yaml lp-osmium: build: context: ./lp-osmium dockerfile: Containerfile image: localhost/lp-osmium:1 network_mode: none profiles: ["tools"] volumes: - ./data/osm:/data:Z entrypoint: ["osmium"] ``` - Lancement à la demande : `podman-compose --profile tools run --rm lp-osmium `. `profiles` n'est pas démarré par `up -d`. - `profiles` et `version: '3.8'` : la clé appartient à la Compose Specification. Sa prise en charge par la version de podman-compose installée est **à vérifier** (`podman-compose version`). - À défaut : fichier séparé `docker-compose.tools.yml`, lancé par `podman-compose -f docker-compose.tools.yml run --rm lp-osmium …`. **4. Séquence (lancée par l'utilisateur, dans `~/forgejo`)** | Étape | Commande | Attendu | |---|---|---| | 0. État | `podman-compose ps` ; `podman image inspect docker.io/library/caddy:2-alpine --format '{{.Digest}}'` (noter le condensat) | 3 services actifs | | 1. Sauvegarde | `cp docker-compose.yml docker-compose.yml.bak-20261020 && cp Caddyfile Caddyfile.bak-20261020` | deux copies | | 2. Dossiers | `mkdir -p data/citypacks data/osm lp-osmium` ; `echo essai > data/citypacks/essai.txt` ; déposer `lp-osmium/Containerfile` | — | | 3. Édition | appliquer les points 1, 2 (une variante) et 3 | — | | 4. Image épinglée | `podman-compose pull caddy` (**téléchargement à accepter**) | `caddy:2.11.7-alpine` présente | | 5. Redéploiement | `podman-compose up -d caddy` (coupure de quelques secondes, à un moment creux) | `forgejo_caddy_1` recréé | | 6. Vérifications | `podman-compose exec caddy caddy validate --config /etc/caddy/Caddyfile` ; `curl -I https:///` ; `curl -sI -H "Range: bytes=0-3" https://cartes./essai.txt` (variante 1) ou `https:///citypacks/essai.txt` (variante 2) | « Valid configuration » ; Forgejo en `200` ; essai en **`206 Partial Content`** avec `Content-Range: bytes 0-3/6` et `ETag` | | 7. Outil (option) | `podman-compose --profile tools build lp-osmium` (**téléchargement à accepter** : `debian:stable-slim` et le paquet `osmium-tool`) ; `podman-compose --profile tools run --rm lp-osmium --version` | version d'osmium affichée | | R. Retour arrière | `cp docker-compose.yml.bak-20261020 docker-compose.yml && cp Caddyfile.bak-20261020 Caddyfile && podman-compose up -d caddy` | état d'avant (l'image `caddy:2-alpine` est encore locale) ; Forgejo en `200` | Ne pas lancer `podman-compose down` : il arrêterait aussi Forgejo et la base. **Point de sécurité (sans valeur) : mot de passe de la base.** Big Boss signale que le mot de passe PostgreSQL du compose est **la valeur d'exemple du gabarit**. Recommandations à l'utilisateur : 1. **Le changer.** Attention : l'image `postgres` n'applique `POSTGRES_PASSWORD` **qu'à la première initialisation** du volume `./data/postgres`. Il faut donc : - changer le mot de passe **dans la base** : `podman-compose exec db psql -U -c "ALTER USER WITH PASSWORD '';"`, depuis un terminal non journalisé, ou en le saisissant par `\password` dans `psql` pour qu'il ne reste pas dans l'historique ; - **puis** mettre la même valeur dans `FORGEJO__database__PASSWD` (service `server`) ; - puis `podman-compose up -d server`. 2. **Le sortir du compose** : variables dans `~/forgejo/.env`, lu automatiquement par podman-compose pour la substitution `${…}`. - Par exemple `FORGEJO_DB_PASSWD=…` ; dans le compose, `POSTGRES_PASSWORD: ${FORGEJO_DB_PASSWD}` et `FORGEJO__database__PASSWD: ${FORGEJO_DB_PASSWD}`. - Puis `chmod 600 .env`, et `.env` exclu de toute sauvegarde publique ou de tout dépôt. - Ou un **secret podman** (`podman secret create`) monté en fichier, si la version installée le permet. 3. Sauvegarder `./data/postgres` avant l'opération. Sources : - https://hub.docker.com/_/nginx - https://hub.docker.com/_/caddy - https://hub.docker.com/r/iboates/osmium - https://hub.docker.com/r/wiktorn/overpass-api et https://hub.docker.com/r/wiktorn/overpass-api/tags - recherche « osmium-tool docker image official » : aucune image officielle osmcode trouvée ## 8. Décisions **Décidé (2026-10-20).** Utilisateur, cité par Big Boss (session `local_104ff22d`) : « approuvé », puis « oui » à la question de Big Boss « ce “approuvé” vaut-il aussi pour les 4 recommandations ? ». 1. Lecture confirmée : - Paris est la ville de référence ; - Forgejo (releases d'un **dépôt public dédié**) ; - l'outil de téléchargement est à faire. 2. Q1 format : **(a) mod d'assets avec redirection C++** (décidé). 3. Q2 taille de zone : **(c) 3 × 3 km** (décidé ; Paris compris, voir point 6). 4. Q3 découpage : **(a) un pack par ville** (décidé). 5. Interface : **(i) fenêtre Slate C++**, sans Blueprint (décidé). 6. **Monétisation : reportée en build 3** (décidé, 2026-10-20). Utilisateur, cité par Big Boss : « pour le moment on verra la monétisation en build 3. offrons la carte de Paris pour valider et étudier le modéle technique puis économique ». **Paris est le premier pack, gratuit** : il sert à valider toute la chaîne technique, puis à étudier le modèle économique. La chaîne comprend : - la production en 3 × 3 km ; - la publication sur Forgejo ; - le téléchargement dans le jeu ; - le montage au lancement suivant. Aucun prix n'est fixé. Le coût d'hébergement (1,75 € par carte) reste une donnée d'entrée pour la build 3. **Tranché (2026-10-20)**, utilisateur cité par Big Boss : « À la place : Paris sort du jeu de base et n'existe qu'en pack gratuit de 3 × 3 km. » Conséquences : - le jeu de base garde **Londres et Bath** seulement ; - le paquet d'essai `_Pilot/Paris` (≈ 11 × 8 km, STM1-B5) reste un **essai local**, sans aucune bascule dans le jeu ; - sans le pack, Paris reste la **ville factice** actuelle ; - le **pack Paris de 3 × 3 km** est le premier pack de la chaîne. Cela remplace la décision antérieure « Paris, Londres et Bath dans le jeu de base » (SPEC-06) et la mention « Paris reste au format de référence » de Q2. **Reporté en build 2 (2026-10-20).** Utilisateur, cité par Big Boss : « on passe ce sujet en build 2 ». - Passent en build 2 : - le **déploiement serveur** (Caddy, `data/citypacks`, `lp-osmium`, mot de passe de la base) ; - la **chaîne des packs** (outil de téléchargement, lots A à G, pack Paris de 3 × 3 km). - Aucun geste ni IMPL d'ici là. SPEC-06 et SPEC-07 restent la base de travail. **Restent ouverts** (pour la build 2, via Big Boss) : 7. Conteneurs (§ 7 bis) : - (a) servir les packs par **le Caddy existant** (`file_server`, recommandé après le relevé du serveur) : sous-domaine dédié (variante 1) ou chemin `/citypacks/` (variante 2) ; C1 (nginx) et C3 (second Caddy) **retirés** ; - (b) produire les cartes sur le serveur par osmium dans une image Debian construite localement (recommandé) ; - épingler `caddy:2-alpine` (et, conseillé, `postgres:15-alpine` et `forgejo:9`) ; vérifier que le port 2019 n'est pas publié ; - accord pour C2 et pour la modification de Caddy, gestes lancés par l'utilisateur, exprimés en **ajouts au projet compose « forgejo »** (podman-compose), avec la séquence de déploiement et de retour arrière du § 7 bis. Tours : ≈ 3 / 40 (déclaré ; `FicheStats.py` fait foi). Suite : Big Boss présente le § 8 ; ensuite, lots A à G dans l'ordre (A et B d'abord, avec Paris en pack de test). État : étude close, rien modifié.