# RUNBOOK — PUBLIC_SITE (canonical + sitemap) “anti localhost en prod” > Objectif : ne plus jamais voir `rel="canonical" href="http://localhost:4321/"` en staging/live. ## 0) Pourquoi c’est critique Astro génère : - `` - `sitemap-index.xml` Ces valeurs dépendent de `site` dans `astro.config.mjs`. Si `site` vaut `http://localhost:4321` au moment du build Docker, **la prod sortira des canonical faux** : - SEO / partage / cohérence de navigation impactés - confusion staging/live ## 1) Règle canonique - `astro.config.mjs` : # en js : site: process.env.PUBLIC_SITE ?? "http://localhost:4321" # Donc : En DEV local : pas besoin de PUBLIC_SITE (fallback ok) En build “déploiement” : on DOIT fournir PUBLIC_SITE ## 2) Exigence “antifragile” ### 2.1 Dockerfile (build stage) On injecte PUBLIC_SITE au build et on peut le rendre obligatoire : ARG PUBLIC_SITE ARG REQUIRE_PUBLIC_SITE=0 ENV PUBLIC_SITE=$PUBLIC_SITE # garde-fou : RUN if [ "$REQUIRE_PUBLIC_SITE" = "1" ] && [ -z "$PUBLIC_SITE" ]; then \ echo "ERROR: PUBLIC_SITE is required (REQUIRE_PUBLIC_SITE=1)"; exit 1; \ fi => Si quelqu’un oublie l’URL en prod, le build casse au lieu de produire une release mauvaise. ## 3) docker-compose : blue/staging vs green/live Objectif : injecter deux valeurs différentes, sans bricolage. ### 3.1 .env (NAS) Exemple canonique : PUBLIC_SITE_BLUE=https://staging.archicratie.trans-hands.synology.me PUBLIC_SITE_GREEN=https://archicratie.trans-hands.synology.me ### 3.2 docker-compose.yml web_blue : REQUIRE_PUBLIC_SITE: "1" PUBLIC_SITE: ${PUBLIC_SITE_BLUE} web_green : REQUIRE_PUBLIC_SITE: "1" PUBLIC_SITE: ${PUBLIC_SITE_GREEN} ## 4) Tests (obligatoires après build) ### 4.1 Vérifier l’injection dans compose sudo env DOCKER_API_VERSION=1.43 docker compose config \ | grep -nE 'PUBLIC_SITE|REQUIRE_PUBLIC_SITE|web_blue:|web_green:' | sed -n '1,200p' ### 4.2 Vérifier canonical (upstream direct) curl -sS http://127.0.0.1:8081/ | grep -oE 'rel="canonical" href="[^"]+"' | head -n 1 curl -sS http://127.0.0.1:8082/ | grep -oE 'rel="canonical" href="[^"]+"' | head -n 1 # Attendu : blue : https://staging.../ green : https://archicratie.../ ## 5) Procédure de correction (si canonical est faux) ### 5.1 Vérifier astro.config.mjs dans la release courante cd /volume2/docker/archicratie-web/current grep -nE 'site:\s*process\.env\.PUBLIC_SITE' astro.config.mjs ### 5.2 Vérifier que Dockerfile exporte PUBLIC_SITE grep -nE 'ARG PUBLIC_SITE|ENV PUBLIC_SITE|REQUIRE_PUBLIC_SITE' Dockerfile ### 5.3 Vérifier .env et compose grep -nE 'PUBLIC_SITE_BLUE|PUBLIC_SITE_GREEN' .env grep -nE 'PUBLIC_SITE|REQUIRE_PUBLIC_SITE' docker-compose.yml ### 5.4 Rebuild + recreate sudo env DOCKER_API_VERSION=1.43 docker compose build --no-cache web_blue web_green sudo env DOCKER_API_VERSION=1.43 docker compose up -d --force-recreate web_blue web_green Puis tests section 4. ## 6) Notes Cette mécanique doit être backportée dans Gitea (source canonique), sinon ça re-cassera au prochain pack. En DEV local, conserver le fallback http://localhost:4321 est utile et normal.