# Déploiement sur OVH mutualisé — guide pas à pas

Hébergement **mutualisé** = PHP + MySQL fournis, **pas de Docker, pas de démon, pas de root**.
Laravel y fonctionne bien, moyennant : bonne version PHP, document root sur `public/`,
un cron pour les tâches, et les médias externalisés.

> ⏱️ Compter ~30–45 min la première fois.

---

## 0. Pré-requis À VÉRIFIER en premier (bloquant)

### a) Version de PHP
Cette application requiert **PHP 8.3 minimum** (idéalement 8.4).

- Espace client OVH → **Hébergements** → votre hébergement → onglet **PHP** :
  sélectionner **PHP 8.3** (ou 8.4 si proposé).
- ⚠️ Si seul PHP ≤ 8.2 est disponible sur votre offre : le site **ne démarrera pas**.
  Solutions : demander la mise à niveau de l'offre, OU me demander de rétrograder
  les dépendances, OU déployer sur VPS / AKS (même code, voir `AKS-AZURE.md`).
- Vérifier les **extensions PHP** activées (onglet PHP) : `pdo_mysql`, `mbstring`,
  `openssl`, `tokenizer`, `xml`, `ctype`, `json`, `bcmath`, `fileinfo`,
  **`gd`** ou **`imagick`** (pour les PDF d'attestation), `zip`, `curl`.

### b) Accès SSH (fortement recommandé)
Les offres « Performance » et « Pro » OVH ont **SSH**. Avec SSH, on lance `composer`,
`artisan migrate`, etc. directement.
- Sans SSH (offre Perso) : il faut **tout préparer en local** et téléverser, puis importer
  la base via phpMyAdmin. C'est faisable mais moins confortable (section 6 ci-dessous).

---

## 1. Préparer le build EN LOCAL

Sur votre poste, dans `plateforme-formation/` :

```bash
# 1. Dépendances PHP de production (sans paquets dev)
composer install --no-dev --optimize-autoloader

# 2. Compiler les assets front (CSS/JS) — génère public/build/
npm install
npm run build
```

> Important : on téléverse **`vendor/` ET `public/build/` déjà construits**, car sur
> mutualisé on ne peut pas toujours lancer composer/npm. (Chez nous, ils sont dans
> `.gitignore` — donc passer par **SFTP** pour ces dossiers, ou les dé-ignorer pour OVH.)

---

## 2. Créer la base MySQL chez OVH

- Espace client → **Bases de données** → créer une base MySQL.
- Noter : **hôte** (ex. `xxxxx.mysql.db`), **nom de base**, **utilisateur**, **mot de passe**.

---

## 3. Téléverser les fichiers (SFTP ou Git)

Structure cible sur le serveur (exemple avec un compte dont la racine web est `www/`) :

```
~/                         (racine du compte SSH/SFTP)
├── geniac/                ← TOUT le projet Laravel ici (hors web)
│   ├── app/  bootstrap/  config/  database/  routes/  resources/
│   ├── vendor/            (téléversé, build local)
│   ├── storage/  artisan  composer.json ...
│   └── .env               ← À CRÉER (voir étape 4), JAMAIS dans le web
└── www/                   ← document root du domaine (public web)
```

Deux approches :

**A. SFTP (FileZilla, WinSCP)** — glisser tout le projet dans `~/geniac/`.

**B. Git (si dispo dans l'espace OVH)** — déployer le dépôt dans `~/geniac/`.

### Faire pointer le domaine sur `public/`
- Espace client → **Multisite** → votre domaine → **dossier racine** =
  `geniac/public` (PAS la racine du projet).
- Cela garantit que seuls les fichiers de `public/` sont accessibles depuis le web ;
  le code, le `.env` et la base restent protégés.

> Si vous ne pouvez pas changer le dossier racine (offre limitée), copier le contenu de
> `public/` dans `www/` et éditer `www/index.php` pour pointer `require __DIR__.'/../geniac/...'`.

---

## 4. Configurer le `.env`

Copier `.env.example` en `.env` dans `~/geniac/.env` et renseigner :

```dotenv
APP_NAME="GenIac Academie"
APP_ENV=production
APP_DEBUG=false
APP_URL=https://votre-domaine.bj
APP_LOCALE=fr

# Base MySQL OVH (valeurs de l'étape 2)
DB_CONNECTION=mysql
DB_HOST=xxxxx.mysql.db
DB_PORT=3306
DB_DATABASE=nom_de_la_base
DB_USERNAME=utilisateur
DB_PASSWORD=motdepasse

# Compatibles mutualisé (pas de Redis/démon)
SESSION_DRIVER=database
CACHE_STORE=database
QUEUE_CONNECTION=database

# Médias : NE PAS stocker les vidéos sur le mutualisé (voir Limites)
FILESYSTEM_DISK=local

# E-mail (SMTP OVH ou autre)
MAIL_MAILER=smtp
MAIL_HOST=ssl0.ovh.net
MAIL_PORT=465
MAIL_USERNAME=no-reply@votre-domaine.bj
MAIL_PASSWORD=...
MAIL_FROM_ADDRESS="no-reply@votre-domaine.bj"

# Paiement (quand les vrais comptes seront prêts)
PAYMENT_DRIVER=fedapay      # ou kkiapay
FEDAPAY_SECRET_KEY=...
FEDAPAY_WEBHOOK_SECRET=...
```

Puis générer la clé d'application :
```bash
php artisan key:generate          # (en SSH) — sinon générer en local et coller APP_KEY
```

---

## 5. Initialiser la base (AVEC SSH)

```bash
cd ~/geniac
php artisan migrate --force        # crée toutes les tables
php artisan db:seed --force        # (optionnel) domaines + comptes + démo
php artisan storage:link           # lien public/storage -> storage/app/public
```

Optimisations (à relancer après chaque déploiement) :
```bash
php artisan config:cache
php artisan route:cache
php artisan view:cache
```

---

## 6. Initialiser la base (SANS SSH)

- Importer le schéma via **phpMyAdmin** (espace OVH) : importer `database/schema.sql`.
- Pour les caches : supprimer `bootstrap/cache/*.php` avant l'upload (l'app régénère seule).
- `APP_KEY` : la générer en local (`php artisan key:generate --show`) et la coller dans `.env`.

---

## 7. Cron (tâches planifiées)

Espace client → **Tâches planifiées (CRON)** → ajouter, **toutes les minutes** :

```
Langage : PHP 8.3 (ou 8.4)
Commande : ~/geniac/artisan schedule:run
```
ou si OVH exige la forme complète :
```
/usr/local/php8.3/bin/php ~/geniac/artisan schedule:run
```

Cela couvre aussi le traitement des **files d'attente** (mails de confirmation, etc.),
traité au fil du cron via le scheduler.

---

## 8. HTTPS

- Espace client → **SSL** : activer le **certificat Let's Encrypt gratuit** d'OVH.
- Forcer le HTTPS : déjà géré par Laravel quand `APP_URL` est en `https://`.

---

## 9. Vérification finale

- Ouvrir `https://votre-domaine.bj` → la page d'accueil GenIac doit s'afficher.
- Tester `/catalogue`, `/login`, créer un compte.
- En cas d'erreur 500 : passer **temporairement** `APP_DEBUG=true`, recharger, lire le
  message, puis **remettre `APP_DEBUG=false`**. Consulter aussi `storage/logs/laravel.log`.

---

## Mettre à jour le site plus tard

```bash
# en local
composer install --no-dev --optimize-autoloader
npm run build
# téléverser les fichiers modifiés (+ vendor/ et public/build/ si changés)
# puis, en SSH :
php artisan migrate --force
php artisan config:cache && php artisan route:cache && php artisan view:cache
```

---

## Limites du mutualisé (à connaître)

- **Vidéos / gros fichiers** : ne PAS stocker sur le mutualisé (quota + lenteur).
  Utiliser **OVH Object Storage** (S3, `FILESYSTEM_DISK=s3`) ou Vimeo/YouTube non listé,
  et ne mettre que l'URL dans les leçons.
- **Webhooks paiement** : l'URL `https://votre-domaine.bj/webhooks/payment/fedapay`
  doit être accessible publiquement (OK sur mutualisé) et déclarée chez FedaPay/KkiaPay.
- Pas de WebSocket persistant — Livewire fonctionne en HTTP classique (OK).
- CPU/RAM limités : adapté au démarrage et à une volumétrie modérée. Quand le trafic
  grandit, basculer sur **VPS ou AKS** (le code est identique, voir `AKS-AZURE.md`).
```
