# Déploiement OVH — portail Lecture en Tête

> Hébergement OVH mutualisé (PHP 8.3). Multi-domaine (association.lecture-en-tete.fr
> + festivalpremierroman.fr). Même logique que le projet CSF.

## Structure serveur (standard, depuis 2026-06)

**Aucun symlink, aucun dossier `lecture`.** Le projet **EST `~/www`** (vendor, composer,
config, deploy.sh, web/, portail/). Le docroot Drupal = **`~/www/web`** (index.php).
Les docroots des domaines se règlent **dans le panel OVH → Multisite** :

| Domaine | Dossier racine OVH |
|---|---|
| `association.lecture-en-tete.fr` | `www/web` |
| `festivalpremierroman.fr` | `www/web` |
| `lecture-en-tete.fr` | `www/portail` |

> ⚠️ Bien mettre **`www/web`** (pas `www` seul) : sinon Apache liste tout le projet —
> `.git/`, vendor, composer servis publiquement (le `.htaccess` de sécurité est dans
> `web/`, pas à la racine projet).

## Déploiement automatique (recommandé)

Chaque push sur `main` déclenche le déploiement via GitHub Actions
(`.github/workflows/deploy.yml`) : SSH sur OVH → `cd ~/www && bash deploy.sh`.

### Prérequis (une seule fois)

**Secrets GitHub** — https://github.com/YomGraphicDesign/lecture-en-tete/settings/secrets/actions
→ **New repository secret** :

| Name | Value |
|------|-------|
| `OVH_SSH_HOST` | `ssh.cluster100.hosting.ovh.net` (cluster OVH du compte lecture) |
| `OVH_SSH_USER` | l'utilisateur SSH OVH |
| `OVH_SSH_PASSWORD` | le mot de passe SSH OVH |

> Le déploiement se déclenche ensuite à chaque `git push origin main`.
> La branche de migration `migration/bootstrap5` doit donc d'abord être **mergée dans `main`**.

---

## Déploiement manuel

```bash
# 1. Pousser sur GitHub
git push origin main

# 2. Lancer le déploiement sur OVH
ssh bpxcowt@ssh.cluster100.hosting.ovh.net 'cd ~/www && bash deploy.sh'
```

`deploy.sh` exécute : `git pull` → `composer install` → permissions `web/libraries/`
→ `drush updb` → `drush cr`. (L'import de config `drush cim` est **commenté** par
défaut — voir ci-dessous.)

---

## Migration D9 → D11 : reset complet du serveur + 1ère mise en prod

> 📜 **Section historique** (faite en juin 2026). Les chemins ci-dessous (`~/lecture`,
> `lecture/www`, symlink `~/www`) décrivent l'install d'origine. Depuis, le serveur a été
> restructuré au standard **projet `~/www` + docroot `~/www/web`, sans symlink** (voir
> « Structure serveur » en tête). Pour une nouvelle install, suivre ce nouveau standard.

> La prod actuelle est en **Drupal 9**. On ne migre pas par-dessus : on **repart de
> zéro** (core/structure D11 différents) et on importe la base **DDEV (déjà en D11)**.
> Tout est destructif côté OVH → **sauvegarder d'abord**.

### 0. Sauvegarder le D9 existant (sécurité / rollback)
```bash
ssh bpxcowt@ssh.cluster100.hosting.ovh.net
# Dump de la base D9 (adapter le nom de connexion si besoin)
~/www/vendor/bin/drush -r ~/www sql:dump --gzip --result-file=~/backup-d9-$(date +%Y%m%d).sql.gz \
  2>/dev/null || mysqldump -h DBHOST -u DBUSER -p DBNAME | gzip > ~/backup-d9-$(date +%Y%m%d).sql.gz
# Archive des fichiers (uploads notamment)
tar czf ~/backup-d9-files-$(date +%Y%m%d).tar.gz -C ~/www sites/default/files 2>/dev/null || true
exit
```
> Récupère ces 2 archives en local (scp) avant de continuer si tu veux un filet de sécurité hors serveur.

### 1. Mettre en place le projet D11 (sur OVH)
```bash
ssh bpxcowt@ssh.cluster100.hosting.ovh.net
cd ~
# Retirer l'ancien docroot D9 (sauvegardé à l'étape 0)
rm -rf ~/www_old && mv ~/www ~/www_old 2>/dev/null || true
# Cloner le projet D11
git clone https://github.com/YomGraphicDesign/lecture-en-tete.git lecture
cd ~/lecture && git checkout main
# Dépendances
php ~/composer.phar install --no-dev --optimize-autoloader --no-interaction
# settings.php prod
cp ~/lecture/www/sites/default/settings.ovh.php.example ~/lecture/www/sites/default/settings.php
nano ~/lecture/www/sites/default/settings.php   # DB OVH + hash_salt + trusted hosts
chmod 444 ~/lecture/www/sites/default/settings.php
# Dossiers writable + privé
mkdir -p ~/lecture/www/sites/default/files && chmod 755 ~/lecture/www/sites/default/files
mkdir -p ~/lecture/private
exit
# → Régler le docroot dans l'espace client OVH → Multisite (PAS de symlink) :
#     association.lecture-en-tete.fr + festivalpremierroman.fr → "lecture/www"
#     lecture-en-tete.fr → "lecture/portail"
```

### 2. Exporter la base DDEV (D11) en local
```bash
cd "/Volumes/YOM_2/Yom Graphic Design/htdocs/portail-lecture-en-tete"
ddev start
ddev export-db --file=lecture-prod.sql.gz
```

### 3. Transférer le dump + fichiers + libraries vers OVH (local)
```bash
# a) Dump SQL
scp "/Volumes/YOM_2/Yom Graphic Design/htdocs/portail-lecture-en-tete/lecture-prod.sql.gz" \
    bpxcowt@ssh.cluster100.hosting.ovh.net:~/lecture-prod.sql.gz

# b) Médias (sites/default/files) — copiables aussi en local sur le serveur depuis ~/www_old
rsync -avz "/Volumes/YOM_2/Yom Graphic Design/htdocs/portail-lecture-en-tete/www/sites/default/files/" \
    bpxcowt@ssh.cluster100.hosting.ovh.net:~/lecture/www/sites/default/files/

# c) LIBRARIES (www/libraries/) — INDISPENSABLE : slick, mmenu, blazy… sont placées
#    manuellement (gitignorées, non installées par composer) → sinon JS 404 (slick.min.js,
#    mmenu.js) → carrousel vide + menu mobile cassé (`$.fn.slick is not a function`).
rsync -avz "/Volumes/YOM_2/Yom Graphic Design/htdocs/portail-lecture-en-tete/www/libraries/" \
    bpxcowt@ssh.cluster100.hosting.ovh.net:~/lecture/www/libraries/
```
> Les libraries persistent d'un `git pull` à l'autre (gitignorées côté serveur) — à ne refaire que sur un *fresh install*.

### 4. Importer la base D11 sur OVH (vide les tables D9 puis importe)
```bash
ssh bpxcowt@ssh.cluster100.hosting.ovh.net
cd ~/lecture
vendor/bin/drush sql:drop -y \
  && zcat ~/lecture-prod-$(date +%Y%m%d).sql.gz | vendor/bin/drush sqlc \
  && vendor/bin/drush cr
```
> ⚠️ `sql:drop` supprime **toutes** les tables de la base OVH (l'ancien D9) avant import.
> La base importée contient déjà toute la config (blocs, thème par domaine, breadcrumb) →
> **pas de `drush cim`** nécessaire ici.

### 5. Vérifier
- https://association.lecture-en-tete.fr
- https://festivalpremierroman.fr

### 6. Une fois validé
- Supprimer l'ancien D9 : `rm -rf ~/www_old` (après avoir confirmé que tout marche).
- Les déploiements suivants se font par simple `git push origin main` (auto-deploy : updb + cr).

> Le `settings.php` de prod n'est **pas** versionné (il contient les identifiants OVH).
> Le modèle est `settings.ovh.php.example`.

### En cas de `database connection not defined` après un git reset
Recréer le `settings.php` à partir de `settings.ovh.php.example` (étape ci-dessus),
remplir les identifiants, `chmod 444`, puis `vendor/bin/drush cr`.

---

## Portail `lecture-en-tete.fr` (page statique vers les 2 sites)

Page statique HTML/CSS dans `portail/` (versionnée). Sert de splash : moitié gauche → asso, moitié droite → festival.

### Mise en prod sur OVH (après mise à jour des visuels)
1. **Déployer le code** : `git push origin main` → l'auto-deploy fait le `git pull`, le dossier `~/www/portail/` arrive sur le serveur (rien à faire de plus côté Drupal).
2. **Configurer le domaine OVH** (espace client → Hébergement → Multisite) :
   - Ajouter/éditer `lecture-en-tete.fr` (+ `www.`) avec pour **dossier racine** : `www/portail`
   - (le portail est servi en statique, indépendant du Drupal qui est sur `www/web`)
3. **DNS** : repointer `lecture-en-tete.fr` + `www` de l'IP IONOS (`217.160.0.166`) vers l'**IP OVH** (`5.135.23.164`). Propagation : quelques heures.

> Les liens du portail pointent déjà vers `association.lecture-en-tete.fr` et `festivalpremierroman.fr` (les 2 sites D11).
