# school.kopba.org — première mise en ligne (Namecheap, cPanel)

Ce qui se fait **une seule fois, à la main**, avant que
`deploy/hebergement-mutualise/namecheap.sh` puisse tourner tout seul : le
sous-domaine, la base de données, la clé SSH et le `.env`.

Le script, lui, ne crée aucune de ces quatre choses — il refuserait de
deviner un mot de passe ou d'écraser une base existante.

---

## 1. Le sous-domaine (fait)

cPanel → *Domains* → `school.kopba.org`, **Document Root** réglé sur
`school.kopba.org/public`.

Le code vivra donc dans `~/school.kopba.org/` et seul son `public/` est servi.

## 2. La base de données

cPanel → *MySQL® Databases* :

1. créer la base, par exemple `kopba_ecole` ;
2. créer l'utilisateur `kopba_ecole` avec un mot de passe solide ;
3. l'associer à la base avec **ALL PRIVILEGES**.

Notez les trois valeurs : elles iront dans le `.env`.

## 3. La clé SSH — une par projet

cPanel → *SSH Access* → *Manage SSH Keys* → *Generate a New Key* :

- nom : `ecole_haiti_deploy` (ne pas réutiliser celle de MicroFin : une clé
  par projet reste révocable séparément) ;
- sans phrase de passe (le script n'est pas interactif) ;
- puis **Manage** → *Authorize*.

Téléchargez la clé privée dans `/c/dev/.cles-deploiement/ecole_haiti_deploy`
et restreignez ses droits :

```bash
chmod 600 /c/dev/.cles-deploiement/ecole_haiti_deploy
```

> Le bac à sable de Claude Code refuse de lire `~/.ssh/` : une clé posée
> ailleurs fonctionne.

## 4. Le fichier de réglages (hors du dépôt)

`/c/dev/.cles-deploiement/ecole-haiti.conf` :

```sh
HOTE="serverXXX.web-hosting.com"     # cPanel → Server Information
PORT="21098"                          # Namecheap n'utilise pas 22
UTILISATEUR="kopbaXXXX"               # votre utilisateur cPanel
CLE="/c/dev/.cles-deploiement/ecole_haiti_deploy"
RACINE="/home/kopbaXXXX/school.kopba.org"
DOMAINE="school.kopba.org"
```

Il n'est pas dans le dépôt : il contient l'adresse du serveur et le chemin
de la clé.

## 5. Le `.env` de production

Une seule fois, depuis la racine du projet :

```bash
scp -i /c/dev/.cles-deploiement/ecole_haiti_deploy -P 21098 \
    deploy/serveur-linux/env.production.example \
    kopbaXXXX@serverXXX.web-hosting.com:/home/kopbaXXXX/school.kopba.org/.env
```

Puis, en SSH, renseignez au minimum :

```
APP_URL=https://school.kopba.org
DB_DATABASE=kopba_ecole
DB_USERNAME=kopba_ecole
DB_PASSWORD=…
```

`APP_KEY` est généré par le script au premier passage. `SESSION_SECURE_COOKIE`
est déjà à `true` : le site est en HTTPS.

## 6. Lancer

```bash
powershell -ExecutionPolicy Bypass -File deploy\build-release.ps1
sh deploy/hebergement-mutualise/namecheap.sh --premiere
```

Le script sauvegarde (s'il y a quelque chose), transfère, pose les
`.htaccess`, joue les migrations, met en cache, puis affiche la commande à
lancer pour créer l'établissement :

```bash
ssh -i … -t 'cd ~/school.kopba.org && /usr/local/bin/php artisan school:install'
```

Elle demande le nom de l'école, le code court, le directeur, l'e-mail de
connexion, le mot de passe initial et l'année scolaire.

## 7. Après la première fois

```bash
# Sauvegarde nocturne : cPanel → Cron Jobs → toutes les heures
cd ~/school.kopba.org && /usr/local/bin/php artisan schedule:run >/dev/null 2>&1
```

Vérifiez enfin :

```bash
ssh … 'cd ~/school.kopba.org && /usr/local/bin/php artisan school:check'
```

Il contrôle notamment que **toutes les tables sont en InnoDB** : sur cet
hébergeur, le moteur par défaut a déjà été MyISAM, où les transactions ne
font rien sans le dire.

**Mises à jour** ensuite : `sh deploy/hebergement-mutualise/namecheap.sh`
(sans `--premiere`).

---

## Les pièges de cet hébergeur, déjà payés sur un autre projet

| Piège | Contrepoids dans le script |
|---|---|
| `ea-php83` absent du PATH en SSH non interactif → commandes silencieusement vides | `PHP=/usr/local/bin/php` |
| Composer absent du serveur | `vendor/` est dans l'archive, construit en local |
| Moteur MyISAM par défaut → transactions inopérantes **sans erreur** | `config/database.php` impose InnoDB ; `school:check` vérifie |
| `.htaccess` du répertoire personnel appliqué à `public/` (403 partout) | `Require all granted` ajouté à `public/.htaccess` |
| Manifeste de paquets de la machine de build expédié par erreur | exclu de l'archive, `package:discover` relancé sur place |
