# Déploiement Lustra sur o2switch

Backend Node.js / Express / MySQL servi par **Passenger** (cPanel « Setup Node.js App »).
Cette procédure met le SaaS web **et** l'API mobile `/api/mobile/v1` en ligne en HTTPS.

> ⏱️ Compter ~20 min. Aucun Mac ni build local requis.

---

## 0. Ce que contient l'archive

```
app.js, package.json, package-lock.json   Application Express
config/ controllers/ middlewares/ routes/ services/ views/ public/
sql/                                       Schéma de base + migrations + seeds
database.sql                               Schéma initial
database-complete.sql                      ⭐ Import unique (schéma + migrations + démo)
scripts/db-setup.js                        ⭐ Importeur robuste (recommandé)
.env.o2switch.example                      Modèle de configuration
uploads/                                   Dossiers d'upload (créés vides)
DEPLOIEMENT-O2SWITCH.md                     Ce guide
```

---

## 1. Créer la base MySQL (cPanel)

`cPanel > Bases de données MySQL®` :

1. **Créer une base** : ex. `lustra` → nom réel `moncpanel_lustra`.
2. **Créer un utilisateur** + mot de passe fort.
3. **Ajouter l'utilisateur à la base** avec **TOUS LES PRIVILÈGES**.

Notez `DB_NAME`, `DB_USER`, `DB_PASSWORD` (préfixés par votre compte cPanel).

---

## 2. Envoyer le code

**Option A — Gestionnaire de fichiers** : uploadez l'archive dans un dossier
(ex. `~/lustra`) puis *Extraire*.

**Option B — Git** : `git clone` votre dépôt dans `~/lustra`.

> Ne pas uploader `node_modules/` : il sera reconstruit à l'étape 4.

---

## 3. Créer l'application Node (cPanel)

`cPanel > Setup Node.js App > Create Application` :

| Champ                     | Valeur                                  |
| ------------------------- | --------------------------------------- |
| Node.js version           | **20.x** (ou 18.x)                      |
| Application mode          | **Production**                          |
| Application root          | `lustra` (le dossier extrait)           |
| Application URL           | votre domaine / sous-domaine            |
| Application startup file  | `app.js`                                |

Validez. cPanel prépare l'environnement virtuel et le port (Passenger).

---

## 4. Installer les dépendances

Dans l'écran de l'application Node, bouton **« Run NPM Install »**.
(ou via le terminal cPanel, après avoir activé l'environnement affiché en haut de page :)

```bash
npm install --omit=dev
```

---

## 5. Configurer l'environnement

Copiez le modèle et éditez‑le :

```bash
cp .env.o2switch.example .env
nano .env
```

À renseigner impérativement : `APP_URL` (https exact), `DB_NAME`, `DB_USER`,
`DB_PASSWORD`. Les secrets `SESSION_SECRET` et `MOBILE_JWT_SECRET` sont déjà
fournis (régénérables). En production, `SESSION_SECRET` **doit** faire ≥ 32 caractères.

> Vous pouvez aussi définir ces variables dans `Setup Node.js App > Environment variables`.

---

## 6. Importer la base de données

### Option A — Importeur Node (recommandé ⭐)

Schéma complet **et** données de démonstration en une commande :

```bash
node scripts/db-setup.js --seed
```

- Multi‑passes et idempotent : relançable sans risque.
- Sans `--seed` : crée uniquement le schéma.
- `--dry-run` : vérifie le découpage SQL sans toucher à la base.

### Option B — phpMyAdmin

`cPanel > phpMyAdmin` → sélectionnez la base → onglet **Importer** →
fichier **`database-complete.sql`** (schéma + migrations + 3 comptes démo).

> Si phpMyAdmin signale une erreur d'ordre de tables, utilisez l'option A.

Les 3 comptes de démonstration (mot de passe `DemoTest123!`) :
`demo-admin@saas-demo.test`, `demo-client@saas-demo.test`, `demo-employe@saas-demo.test`.

---

## 7. Redémarrer et vérifier

Bouton **« Restart »** dans Setup Node.js App, puis :

| URL                                   | Résultat attendu                          |
| ------------------------------------- | ----------------------------------------- |
| `https://VOTRE-DOMAINE/ping`          | `pong`                                     |
| `https://VOTRE-DOMAINE/healthz`       | `{"ok":true,...,"mysql":"ok"}`             |
| `https://VOTRE-DOMAINE/api/mobile/v1` | `{"success":true,"data":{"status":"ok"}}`  |

Test du login mobile :

```bash
curl -X POST https://VOTRE-DOMAINE/api/mobile/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{"companySlug":"saas-demo","email":"demo-admin@saas-demo.test","password":"DemoTest123!","deviceId":"curl","deviceName":"curl"}'
```

→ doit renvoyer `accessToken`, `refreshToken` et `user`.

---

## 8. Brancher l'application mobile

Dans `apps/mobile/.env` :

```bash
EXPO_PUBLIC_API_URL=https://VOTRE-DOMAINE/api/mobile/v1
```

L'API étant en HTTPS public, elle est accessible depuis un build TestFlight /
appareil réel (contrairement à `localhost`).

---

## 9. Dépannage

- **Page « Configuration production non complète »** → l'app démarre mais `.env`
  ou la base manque. Ouvrez `/healthz` pour le détail, corrigez, puis *Restart*.
- **`/healthz` → `mysql:"error"`** → vérifiez `DB_*` (l'utilisateur est‑il bien
  rattaché à la base avec tous les privilèges ?).
- **502 / 503** → consultez `stderr.log` dans le dossier de l'app, ou les logs
  Passenger via cPanel. Souvent : `npm install` non lancé, ou `SESSION_SECRET` < 32.
- **Uploads non enregistrés** → vérifiez que `uploads/` est inscriptible (755).
- Après chaque modification de `.env` ou du code : **Restart** l'application.
