# Rollback de la migration Vercel — 2026-05-26

Le 2026-05-26 nous avons commencé la migration de `speed.elevaseo.app` vers
Vercel + backend self-hosted séparé, puis nous sommes revenus à la config
"tout en interne" sur `elevaseo.app`. Ce document trace exactement ce qui a
été défait et où retrouver le travail.

## Travail préservé (résurrection possible)

Tout le code de la migration est intact dans :

- **Branche git** : `backup/vercel-migration` (commit `50c2df875`)
- **Tag git** : `vercel-migration-2026-05-26`
- **Tarball serveur** : `~/eleva-speed-migration-backup-20260526-124532.tgz`
  (contient `.env.prod`, certs PKI, `docker-compose.server.yml`, scripts TLS)

Pour reprendre la migration :

```bash
git checkout backup/vercel-migration
# ou : git checkout vercel-migration-2026-05-26  (le tag)
```

## Ce qui a été défait

### 1. Git — branches main + dev

- **main** : ajout d'un revert commit `e82f377a7 Revert "Merge pull request #3"`
  qui annule tous les changements de la migration. L'historique de la PR est
  conservé (audit trail intact).
- **dev** : `git reset --hard origin/main` (force-push) — dev est désormais
  identique à main.

### 2. Serveur — stack Docker

Stack `eleva-speed-server` (Postgres mTLS + Redis + sitespeed-worker +
tcp-bridge + cloudflared) complètement supprimée :

```bash
docker rm -f $(docker ps -aq --filter "label=com.docker.compose.project=eleva-speed-server")
docker network rm $(docker network ls --filter "label=com.docker.compose.project=eleva-speed-server" -q)
```

Volumes des données conservés dans `/data/eleva-speed-server/{pg,redis,results}`
(au cas où on veut reprendre).

L'OLD stack `eleva-speed-prod` (`eleva-speed-app` + `eleva-speed-prod-*`) n'a
**jamais été arrêtée** pendant la migration — production a tourné en continu.

### 3. Serveur — Traefik

Compose Traefik à `~/infra-169/traefik/docker-compose.yaml` :

- Ligne retirée des args CLI : `- --entrypoints.postgres.address=:5433`
- Ligne retirée des ports : `- "5433:5433"`
- Backup pre-rollback à `~/infra-169/traefik/docker-compose.yaml.bak-pre-rollback-20260526-124830`

Traefik recréé avec `docker compose up -d --force-recreate traefik`. Vérifié :
n'écoute plus que sur `:80` et `:443`.

### 4. Serveur — UFW + cloudflared systemd

Étapes nécessitant `sudo` (à faire manuellement, voir bloc ci-dessous) :

- `sudo ufw delete allow 5433/tcp` (si la règle existait)
- `sudo systemctl stop cloudflared && sudo systemctl disable cloudflared`
  (le tunnel CF reste créé côté dashboard CF Zero Trust mais le daemon
  local ne tourne plus — réversible avec `enable --now`)

One-liner à coller :

```bash
ssh -t egrfkmjgnbmqfcbbce@163.172.71.169 '
sudo ufw status numbered | grep -i 5433 && sudo ufw delete allow 5433/tcp || echo "(no UFW rule for 5433)";
sudo systemctl stop cloudflared 2>&1;
sudo systemctl disable cloudflared 2>&1;
echo "---";
sudo ufw status | head -10;
systemctl is-active cloudflared
'
```

## Ce qui reste à faire — passage `.app` → `.com`

Si on veut servir `speed.elevaseo.com` via la stack interne actuelle plutôt
que `speed.elevaseo.app` :

### A. DNS Cloudflare

Ajouter sur `elevaseo.com` :

| Type | Name    | Content          | Proxy                                                              |
| ---- | ------- | ---------------- | ------------------------------------------------------------------ |
| A    | `speed` | `163.172.71.169` | au choix (le cert Traefik est CF Origin → orange cloud recommandé) |

Garder ou supprimer le DNS `speed.elevaseo.app` selon que tu veux le retirer
complètement ou conserver les deux endpoints en parallèle.

### B. Traefik label + env app

Sur le serveur, dans `~/eleva-speed/.env.prod` (ou wherever le fichier vit
actuellement — vérifier `docker inspect eleva-speed-app | grep -i env_file`) :

```bash
# AVANT
ELEVA_PUBLIC_HOST=speed.elevaseo.app

# APRÈS
ELEVA_PUBLIC_HOST=speed.elevaseo.com
```

Et les vars dérivées :

```bash
BETTER_AUTH_URL=https://speed.elevaseo.com
NEXT_PUBLIC_APP_URL=https://speed.elevaseo.com  # si présent
```

Puis recréer le container app pour que Traefik picke up le nouveau label
`Host(\`speed.elevaseo.com\`)` :

```bash
docker compose -f docker-compose.prod.yml up -d --force-recreate app
```

### C. Cert TLS

Le Traefik host-wide utilise un Cloudflare Origin Certificate comme
`defaultCertificate`. Cf. la spec migration §3.1 : ce cert couvre
**`*.elevaseo.com`** (et probablement aussi `*.elevaseo.app` dans ses SANs —
à vérifier).

Si le cert ne couvre que `.com` et `.app` était couvert différemment :
le passage `.com` MARCHERA bien out-of-the-box (puisque le defaultCertificate
est conçu pour `.com`). Pas d'action nécessaire.

Si on veut servir LES DEUX (`.com` ET `.app`) en parallèle pendant la
transition, ajouter un 2e router dans les labels :

```yaml
labels:
  - "traefik.http.routers.eleva-speed.rule=Host(`speed.elevaseo.com`) || Host(`speed.elevaseo.app`)"
```

### D. Stripe webhook + autres intégrations

Reconfigurer les endpoints :

- Stripe dashboard → Developers → Webhooks : `https://speed.elevaseo.com/api/webhooks/stripe`
- Resend / autres si callback URLs configurées

### E. Better Auth — invalidation sessions

Après le changement de `BETTER_AUTH_URL`, les sessions actives sur `.app`
seront invalides pour les requêtes sur `.com` (cookies du mauvais domaine).
Acceptable pour un cutover propre — communique aux utilisateurs si besoin.

## Notes de sécurité post-rollback

- Le `CLOUDFLARED_TUNNEL_TOKEN` reste exposé dans le fichier systemd unit
  (`/etc/systemd/system/cloudflared.service`) tant qu'on n'a pas désinstallé
  le daemon. Pas critique (cloudflared est désactivé), mais à savoir.
- Le repo `~/eleva-speed/.env.prod` (avec `POSTGRES_PASSWORD` pour la stack
  migration) existe encore. À supprimer si on confirme qu'on ne revient
  jamais sur la migration : `rm ~/eleva-speed/.env.prod`. Sinon, garder.
- Le tarball `~/eleva-speed-migration-backup-20260526-124532.tgz` contient
  les certs PKI + .env.prod. Si tu reviens un jour sur la migration, c'est
  ta source de vérité. Sinon : `shred -u` la `client-*.key` une fois la CA
  rotée (les `.key` deviennent inutiles si la CA n'est plus active).

## Resurrection cheatsheet (si on revient sur la migration)

1. `git checkout backup/vercel-migration` (ou `vercel-migration-2026-05-26` tag)
2. Sur le serveur : `git fetch && git checkout backup/vercel-migration`
3. Extract le tarball : `tar xzf ~/eleva-speed-migration-backup-*.tgz -C ~/eleva-speed/`
4. `sudo systemctl enable --now cloudflared`
5. Re-ajoute `--entrypoints.postgres.address=:5433` + port `5433:5433` dans
   `~/infra-169/traefik/docker-compose.yaml`, recreate Traefik.
6. `sudo ufw allow 5433/tcp`
7. `cd ~/eleva-speed && pnpm server:build && pnpm server:up`
8. Continue runbook `docs/deploy-runbook.md` à partir de §5 (CF Tunnel + Vercel).
