# Vérification de mise en production (MG-124)

À dérouler après chaque déploiement, dans l'ordre. Compter vingt minutes.

---

## 1. Le site répond

```bash
for u in / /qui-suis-je /approche /cabinet /visio /ateliers /faq /contact \
         /mentions-legales /politique-confidentialite /sitemap.xml /robots.txt; do
    printf '%-30s %s\n' "$u" "$(curl -s -o /dev/null -w '%{http_code}' "https://www.maud-gaquere.fr$u")"
done
```

- [ ] Les douze URL renvoient **200**
- [ ] `https://www.maud-gaquere.fr/page-inexistante` renvoie **404**
- [ ] `https://www.maud-gaquere.fr/admin` renvoie **302** vers la connexion

## 2. HTTPS et en-têtes

```bash
curl -sI http://maud-gaquere.fr | head -3
curl -sI https://www.maud-gaquere.fr | grep -iE 'x-frame|x-content|referrer|permissions'
```

- [ ] HTTP redirige en 301 vers HTTPS
- [ ] Cadenas fermé, aucune alerte de contenu mixte
- [ ] `X-Frame-Options`, `X-Content-Type-Options`, `Referrer-Policy` présents

## 3. Apparence

Sur ordinateur **et** sur téléphone :

- [ ] Les CSS et JS se chargent (sinon `public/build/` n'est pas téléversé)
- [ ] Les polices Cormorant Garamond et DM Sans s'affichent (pas de substitution)
- [ ] Le logo, le portrait, la rivière et les trois motifs s'affichent
- [ ] Le menu mobile s'ouvre avec l'animation en rideau
- [ ] Le header de l'accueil se compacte au défilement
- [ ] La parallaxe de la rivière fonctionne
- [ ] Les accordéons FAQ s'ouvrent et se referment

Vérifier que les images sont bien servies en WebP :

```bash
curl -sI -H 'Accept: image/webp,*/*' https://www.maud-gaquere.fr/images/riviere.png \
  | grep -iE 'content-type|content-length'
```

- [ ] `content-type: image/webp` et une taille très inférieure au PNG

## 4. Formulaire de contact ⚠️ le plus important

- [ ] Envoyer un vrai message depuis le site
- [ ] Le message s'affiche dans le back-office, rubrique *Messages*
- [ ] **Maud reçoit l'e-mail de notification** — vérifier aussi les indésirables
- [ ] L'expéditeur reçoit l'accusé de réception
- [ ] Répondre à l'e-mail de notification arrive bien chez l'expéditeur
- [ ] Le widget hCaptcha s'affiche et bloque une soumission sans validation
- [ ] Envoi sans cocher le RGPD : refusé, message d'erreur clair
- [ ] Après quatre envois successifs : le quatrième est refusé (message de
      limitation renvoyant au 15)

> Si les e-mails n'arrivent pas, la cause est presque toujours `MAILER_DSN`
> ou un SPF manquant. Voir `infra/EMAILS_OVH_GUIDE.md`.

## 5. Prise de rendez-vous

- [ ] `DOCTOLIB_URL` pointe vers le vrai profil
- [ ] Tester **chaque** bouton : header, hero, 3 cartes d'accueil, bas de
      chaque page, menu mobile, CTA collant, pied de page
- [ ] Les liens s'ouvrent dans un nouvel onglet

## 6. Back-office

- [ ] La connexion fonctionne avec le compte de Maud
- [ ] Les neuf rubriques s'affichent
- [ ] Les compteurs de la sidebar correspondent à la réalité
- [ ] Modifier un texte de page et **voir le changement sur le site**
- [ ] Téléverser une image dans la médiathèque
- [ ] Ouvrir un message : le tiroir latéral s'ouvre
- [ ] « Marquer comme lu » fonctionne et le compteur diminue
- [ ] La déconnexion fonctionne
- [ ] Cinq tentatives de connexion erronées bloquent une minute

## 7. SEO

- [ ] `https://www.maud-gaquere.fr/sitemap.xml` liste les pages avec le **bon
      domaine** (pas `localhost`)
- [ ] `robots.txt` pointe vers le bon sitemap et interdit `/admin`
- [ ] Chaque page a un `title` et une `meta description` distincts
- [ ] Tester une page sur <https://search.google.com/test/rich-results> :
      le JSON-LD `Psychologist` et le `FAQPage` sont reconnus

## 8. RGPD

- [ ] Si `GA4_ID` est renseigné : la bannière s'affiche à la première visite
- [ ] Refuser : aucun cookie Google, aucune requête vers googletagmanager
      (onglet *Réseau* des outils de développement)
- [ ] Accepter : le script se charge, le choix est mémorisé
- [ ] Si `GA4_ID` est vide : **aucune bannière**, aucune requête tierce
- [ ] La purge tourne :
      `php bin/console app:purge-contacts --dry-run --env=prod`
- [ ] La tâche planifiée mensuelle est configurée

## 9. Performance

Lighthouse en navigation privée, profil mobile :

- [ ] Performance ≥ 90
- [ ] Accessibility — noter le score, voir `AUDIT_ACCESSIBILITE.md`
- [ ] Best Practices ≥ 95
- [ ] SEO = 100

## 10. Sécurité

- [ ] `https://www.maud-gaquere.fr/.env` → 403 ou 404
- [ ] `https://www.maud-gaquere.fr/composer.json` → 403 ou 404
- [ ] `https://www.maud-gaquere.fr/var/log/prod.log` → 403 ou 404
- [ ] Aucune page ne révèle de trace d'erreur Symfony (`APP_DEBUG=0`)
- [ ] Le mot de passe d'administration n'est pas celui des fixtures

```bash
for f in .env .env.prod.local composer.json package.json var/log/prod.log; do
    printf '%-24s %s\n' "$f" "$(curl -s -o /dev/null -w '%{http_code}' "https://www.maud-gaquere.fr/$f")"
done
```

## 11. Sauvegarde

- [ ] Une sauvegarde existe dans `var/backups/` (créée par `deploy.sh`)
- [ ] La sauvegarde automatique est en place (`docs/BACKUP_GUIDE.md`)

---

## En cas de problème grave

Revenir à la version précédente :

```bash
cd ~/gaquere
git log --oneline -5
git checkout <commit-precedent>
composer install --no-dev --optimize-autoloader
php bin/console cache:clear --env=prod

# Si une migration est en cause :
gunzip -c var/backups/avant-deploy-AAAAMMJJ-HHMMSS.sql.gz \
  | mysql -h SERVEUR -u UTILISATEUR -p BASE
```

---

**Vérifié le : ……… / ……… / ………  par : ………………………**
