# Déploiement du service d'authentification sur cPanel — Git Version Control

**Story BE-46.** Déploiement scripté et rejouable, sans construction sur le serveur
(CDC DEP-14/DEP-28), avec retour arrière sans reconstruction (DEP-29).

**Règle de processus (BE-05/AC1)** : une livraison ne part **que** de l'artefact d'un run
**vert** de `v2/main` (ou d'un tag `v*`). Jamais d'une source locale non vérifiée.

---

## Modèle de livraison

```
$HOME/auth/
  livraisons/<version>/   une livraison complète par version
  courant -> livraisons/<version>     lien basculé en dernier, d'un seul geste
  partage/.env                        secrets, hors dépôt et hors racine web (DEP-16)
  partage/storage/                    journaux, sessions, fichiers déposés (DEP-18)
```

La nouvelle livraison est préparée **à côté** de celle en service, caches compris, et
n'entre en service qu'à la bascule finale : un déploiement interrompu laisse la version
précédente servir (BE-46 AC3).

**Racine web du sous-domaine : `auth/courant/public`** (DEP-15 — le code n'est jamais
atteignable par le web ; suppose V5, racine web sur un sous-répertoire).

## 1. Récupérer l'artefact d'un run vert

```bash
gh auth switch --user kodjo007
gh run list --branch v2/main --limit 5          # repérer un run vert
gh run download <id-du-run> --dir /tmp/artefact # zedeca-auth-<version>.tar.gz
```

## 2. Assembler `dist/` (en local)

```bash
bash scripts/assembler-artefact.sh /tmp/artefact/zedeca-auth-<version>/zedeca-auth-<version>.tar.gz
```

Déballe l'archive dans `dist/`, y écrit `VERSION`, puis passe `verifier-artefact.sh` :
présence d'`artisan`, `bootstrap/app.php`, `public/index.php`, `vendor/autoload.php`,
`config/`, `routes/`, `lang/`, `VERSION` — et **absence** de `.env`, `tests/`, `.git`, et de
toute dépendance de développement dans `vendor/`.

Contre-tests : une archive qui n'est pas celle de la CI est refusée sur son nom ; un `.env`
dans l'artefact est refusé (DEP-16) ; un `vendor/` avec PHPUnit est refusé (artefact non
`--no-dev`).

## 3. Publier sur la branche de déploiement

```bash
bash scripts/publier-artefact.sh        # crée/avance la branche locale v2/deploiement
git push origin v2/deploiement          # compte kodjo007
```

La branche ne contient que `dist/` et `.cpanel.yml`. HEAD et la copie de travail ne sont pas
touchés (index temporaire + `commit-tree`).

## 4. Déposer la configuration, une fois

`partage/.env` n'est **jamais** dans le dépôt (DEP-16). À déposer une première fois par le
Gestionnaire de fichiers cPanel dans `auth/partage/.env`, en droits restreints (600), à
partir de `.env.example`. Tant qu'il manque, `.cpanel.yml` refuse de déployer.

## 5. Cloner et déployer dans cPanel

1. cPanel → **Git Version Control** → **Créer**, chemin de la copie de travail
   `auth-deploy` (hors `public_html`), URL du dépôt GitHub, branche `v2/deploiement`.
2. À chaque publication : **Deploy HEAD Commit**.

`.cpanel.yml` exécute alors, dans l'ordre :

| Étape | Effet |
|---|---|
| garde-fous | `RACINE_APP` n'est ni le répertoire personnel ni un dossier qui le contient (chemins résolus) ; artefact complet ; aucun `.env` dans l'artefact ; `partage/.env` présent |
| préparation | `rsync -a --delete` de `dist/` vers `livraisons/<version>/`, hors `.env`, `storage/`, `bootstrap/cache/` |
| état partagé | `storage` et `.env` liés vers `partage/` |
| caches | `optimize:clear` puis `config:cache`, `route:cache`, `event:cache`, `view:cache` **dans la livraison**, avant la bascule (DEP-17) |
| bascule | remplacement du lien `courant` (rename atomique via `mv -T`) |
| purge | les 5 dernières livraisons restent en place ; celle en service n'est jamais purgée |

Aucun `composer install`, aucune compilation : le binaire PHP est explicite
(`/opt/cpanel/ea-php83/root/usr/bin/php`, surchargeable par `PHP_CPANEL`), jamais `php` nu.

## 6. Migrations — hors `.cpanel.yml`, volontairement

Le déploiement ne joue **pas** les migrations : elles ne sont pas idempotentes du point de
vue des données, et les rejouer à chaque « Deploy HEAD Commit » contredirait la maîtrise
exigée par DEP-29 (migrations compatibles avec la version précédente le temps d'un
déploiement).

Elles se lancent explicitement, après la bascule, depuis le dossier en service :

```bash
/opt/cpanel/ea-php83/root/usr/bin/php ~/auth/courant/artisan migrate --force
```

Sans SSH, ce lancement passe par le **Terminal cPanel** (s'il est activé sur le compte) ou
par une **tâche cron ponctuelle**. À vérifier au premier déploiement — c'est le seul point
de la procédure qui ne se fait pas depuis Git Version Control.

## 7. Retour arrière (AC2)

Sans reconstruction, deux chemins :

```bash
# a) revenir à l'artefact précédent : la branche de déploiement porte son historique
git reset --hard v2/deploiement~1 && git push --force origin v2/deploiement
# puis cPanel → Deploy HEAD Commit  (la livraison est déjà sur le serveur : bascule seule)
```

```bash
# b) rebasculer à la main, sans passer par Git (Terminal cPanel)
ln -sfn ~/auth/livraisons/<version-precedente> ~/auth/.courant-nouveau
mv -T ~/auth/.courant-nouveau ~/auth/courant
```

Les migrations ne sont pas défaites : elles sont conçues pour rester compatibles avec la
version précédente (DEP-29). Un retour arrière qui exigerait de défaire une migration est
le signe que cette migration n'aurait pas dû être livrée telle quelle.

## 8. Diagnostic

| Symptôme | Cause probable | Action |
|---|---|---|
| 500 sur tout le domaine | `partage/.env` absent ou illisible, `APP_KEY` manquante | Vérifier `auth/partage/.env` (droits 600) |
| 403 / listing | racine web du sous-domaine ≠ `auth/courant/public` | Corriger la racine web (cPanel → Domaines) |
| Code ancien encore servi | cache de chemins réels / opcode après bascule | Attendre l'expiration (`realpath_cache_ttl`, `opcache.revalidate_freq`) ou redémarrer PHP-FPM depuis WHM |
| `Deploy` échoue au cache | erreur de configuration ou extension PHP manquante | Lire la sortie du déploiement ; la version précédente est **restée en service** |
| Écriture impossible (logs, sessions) | droits de `partage/storage` | `chmod -R u+rwX ~/auth/partage/storage` |

## 9. À vérifier au premier déploiement

- **Racine web sur un sous-répertoire traversant un lien symbolique** (`auth/courant/public`) :
  Apache doit suivre le lien (`SymLinksIfOwnerMatch` sur cPanel). Si la configuration du
  serveur le refuse, replier sur une bascule par renommage de dossier — à trancher avec la
  sortie observée, pas d'avance.
- **`mv -T`** (coreutils GNU) pour une bascule atomique ; le fichier prévoit un repli
  `ln -sfn` non atomique si l'option manque.
- **Terminal cPanel ou cron** disponible pour les migrations (§6).
- **Chemin du binaire PHP 8.3** sur ce serveur (V2) — `PHP_CPANEL` sinon.
