114 lines
3.1 KiB
Markdown
114 lines
3.1 KiB
Markdown
# 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. |