# 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 :
- `<link rel="canonical" href="...">`
- `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.