# SEO Insight — Déploiement & mise à jour (runbook)

Aide-mémoire des commandes **depuis ma machine** et **sur le serveur**.
`main` = PRODUCTION. La prod tourne `bun run start` (systemd `seo-insight-web`)
sur `127.0.0.1:3000`, frontée par nginx (TLS certbot) sur `dash.seoinsight.app`.

```bash
# Cible SSH (sudo-capable). À exporter une fois dans ton shell.
export SEO_INSIGHT_HOST="sgwsnlcupaqyxdqux@163.172.71.169"
# Dossier app sur le VPS (symlink → /data/seo-insight)
#   APP_DIR=/opt/seo-insight   ·   user app = seoinsight
```

---

## A. Depuis ma machine (local)

### A1. Promouvoir `dev` → `main` (mise en prod)

`dev` doit être vert (build + tests OK) avant de promouvoir.

```bash
cd ~/Github/seo-insight
git checkout dev && git pull
git checkout main && git pull
git merge dev --ff-only          # main avance exactement jusqu'à dev
git push origin main
git checkout dev                 # on revient bosser sur dev
```

> `--ff-only` échoue si `main` a divergé de `dev` → signe qu'un commit traîne
> sur main ; ne jamais committer directement sur main (hook `no-commit-on-main`).

### A2. Déclencher la mise à jour du serveur (à distance)

```bash
cd ~/Github/seo-insight
./seo-insight-update.sh          # SSH dans le VPS + lance deploy/deploy.sh (branche main)
```

Équivaut à lancer la section **B3** sur le serveur. `deploy.sh` force `main`
(pull → wasm → bun install → cargo gsc-worker → migrations → next build → restart).

### A3. Suivre les logs prod (sans se connecter en SSH interactif)

```bash
# Erreurs applicatives (lecture seule, groupe adm — pas besoin de sudo) :
ssh $SEO_INSIGHT_HOST 'journalctl -u seo-insight-web -n 80 --no-pager'
# Statut HTTP public :
curl -s -o /dev/null -w "%{http_code}\n" https://dash.seoinsight.app/
```

---

## B. Sur le serveur (VPS)

Toutes les commandes app tournent sous l'utilisateur `seoinsight` via `sudo -u seoinsight`.
Garde `ssh -t` pour que `sudo` puisse demander le mot de passe.

### B1. Basculer le checkout prod sur `main` (one-shot)

À faire une seule fois si la prod tournait encore `dev` :

```bash
ssh -t $SEO_INSIGHT_HOST \
  'sudo -u seoinsight git -C /opt/seo-insight fetch origin main -q && \
   sudo -u seoinsight git -C /opt/seo-insight checkout -B main origin/main && \
   git -C /opt/seo-insight log -1 --oneline'
```

### B2. Fix nginx « X-Forwarded-Host » (one-shot)

Sans ce header, Next 16 reconstruit l'origine en `https://localhost:3000` pour
les self-fetch RSC (rewrite « En construction ») → `ECONNREFUSED` → 500.
Insertion chirurgicale (garde un `.bak`, `nginx -t` bloque le reload si KO) :

```bash
ssh -t $SEO_INSIGHT_HOST \
  'sudo cp /etc/nginx/sites-available/dash.seoinsight.app /etc/nginx/sites-available/dash.seoinsight.app.bak && \
   sudo sed -i "/X-Forwarded-Proto \$scheme;/a proxy_set_header X-Forwarded-Host \$host;" /etc/nginx/sites-available/dash.seoinsight.app && \
   sudo nginx -t && sudo systemctl reload nginx'
```

> ⚠️ Ne PAS copier `deploy/nginx/dash.seoinsight.app.conf` du repo par-dessus
> la conf live : la live contient les blocs `443 ssl` / redirect 80→443 ajoutés
> par certbot, absents du repo. Le `sed` n'ajoute que la ligne manquante.

### B3. Déployer / mettre à jour l'app

```bash
ssh -t $SEO_INSIGHT_HOST \
  "sudo -u seoinsight bash -lc 'cd /opt/seo-insight && ./deploy/deploy.sh'"
```

`deploy.sh` : `git fetch` + `checkout main` + `reset --hard origin/main` → wasm →
`bun install` (root + analytics) → `cargo build -p gsc-worker` → `db:migrate` →
`next build` → `systemctl restart seo-insight-web seo-insight-analytics`.
Surcharge ponctuelle d'un hotfix : `DEPLOY_BRANCH=fix/xxx ./deploy/deploy.sh`.

### B4. Vérifier après déploiement

```bash
ssh $SEO_INSIGHT_HOST 'systemctl is-active seo-insight-web seo-insight-analytics'
ssh $SEO_INSIGHT_HOST 'journalctl -u seo-insight-web -n 60 --no-pager | grep -iE "error|ECONNREFUSED|500" | tail'
ssh $SEO_INSIGHT_HOST 'curl -s -o /dev/null -w "127.0.0.1:3000 -> %{http_code}\n" http://127.0.0.1:3000/'
```

---

## C. Rollback

```bash
# Revenir à un commit connu sur main, puis redéployer :
ssh -t $SEO_INSIGHT_HOST \
  "sudo -u seoinsight bash -lc 'cd /opt/seo-insight && git checkout main && git reset --hard <SHA_OK> && ./deploy/deploy.sh'"
# (nginx) restaurer la conf : sudo cp .../dash.seoinsight.app.bak .../dash.seoinsight.app && sudo systemctl reload nginx
```
