# Déploiement sur OVH mutualisé

Cible : hébergement web OVH (Apache + PHP 8.2/8.3 + MySQL). Pas de Docker, pas de Node requis sur le serveur.

## 1. Côté OVH (panel)

1. **PHP 8.2+** : créez un fichier `.ovhconfig` à la racine de l'hébergement :
   ```
   app.engine=php
   app.engine.version=8.3
   ```
2. **Base MySQL** : créez une base + un utilisateur dans l'espace client OVH. Notez `host`, `dbname`, `user`, `password`.
3. **Racine du domaine** : faites pointer le domaine (ou sous-domaine) sur le dossier **`public/`** du projet
   (OVH → *Multisite* → dossier racine = `…/platevision-php/public`). Le `.htaccess` fourni gère le front controller.

## 2. Build local (à faire sur votre PC, pas sur le serveur)

Le serveur mutualisé ne build pas bien (RAM limitée, binaire Tailwind parfois bloqué). On prépare tout en local :

```bash
# Dépendances de production
composer install --no-dev --optimize-autoloader

# CSS Tailwind minifié + compilation des assets (→ public/assets/)
php -d memory_limit=1G bin/console tailwind:build --minify
php bin/console asset-map:compile
```

## 3. Upload (SFTP/SSH)

Envoyer **tout le projet** sauf : `var/`, `.env.local` (voir étape 4), `node_modules` (inexistant), `.git`.
Inclure bien : `vendor/`, `public/` (avec `assets/` compilés et `.htaccess`), `src/`, `templates/`, `config/`, `bin/`, `composer.*`.

## 4. Configuration serveur (`.env.local` sur le serveur)

Créez `.env.local` à la racine du projet sur le serveur (ne jamais committer) :

```dotenv
APP_ENV=prod
APP_SECRET=<générer: php -r "echo bin2hex(random_bytes(16));">
DATABASE_URL="mysql://UTILISATEUR:MOTDEPASSE@HOTE:3306/BASE?serverVersion=8.0&charset=utf8mb4"
MAILER_DSN=mailjet+api://CLE_PUBLIQUE:CLE_PRIVEE@api.mailjet.com
GEMINI_API_KEY=VOTRE_CLE_GEMINI
# Administrateurs (menu Paramètres / import concessions) — défaut: eric.masse@emilfrey.fr
ADMIN_EMAILS=eric.masse@emilfrey.fr
# ALLOWED_EMAIL_DOMAINS, MAILER_FROM_EMAIL/NAME, GEMINI_MODEL ont des défauts dans .env
```

> Adaptez `serverVersion` à votre MySQL/MariaDB OVH (ex. `8.0` ou `10.11.2-MariaDB`).

Puis, en SSH :
```bash
php bin/console cache:clear --env=prod
```

## 5. Créer le schéma de base

**Avec SSH :**
```bash
php bin/console doctrine:schema:create
```

**Sans SSH** (via phpMyAdmin OVH) : exécutez ce SQL dans la base :
```sql
CREATE TABLE otp_codes (id INT AUTO_INCREMENT NOT NULL, email VARCHAR(180) NOT NULL, code VARCHAR(6) NOT NULL, expires_at DATETIME NOT NULL, used TINYINT NOT NULL, created_at DATETIME NOT NULL, INDEX idx_otp_email_created (email, created_at), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4;
CREATE TABLE scan_sessions (id VARCHAR(36) NOT NULL, user_email VARCHAR(180) NOT NULL, created_at DATETIME NOT NULL, label VARCHAR(255) NOT NULL, count INT NOT NULL, total_files INT NOT NULL, results JSON NOT NULL, INDEX idx_sessions_email_created (user_email, created_at), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4;
CREATE TABLE users (id INT AUTO_INCREMENT NOT NULL, email VARCHAR(180) NOT NULL, roles JSON NOT NULL, concessions JSON NOT NULL, created_at DATETIME NOT NULL, UNIQUE INDEX uniq_user_email (email), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4;
CREATE TABLE concessions (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, UNIQUE INDEX uniq_concession_name (name), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4;
```

> La table `concessions` peut rester vide : l'app utilise alors la liste par défaut (423 entrées). L'admin peut la remplacer via **Paramètres → import Excel**.

## 6. Vérifications

- `https://votre-domaine/` redirige vers `/auth/login`.
- Le CSS s'affiche (assets servis depuis `public/assets/`).
- Un code OTP arrive bien par email (Mailjet).
- Un scan de test renvoie un résultat et l'export Excel se télécharge.

## Notes

- Après chaque mise à jour du code/des assets : refaire l'étape 2 en local, ré-uploader `public/assets/` + le code, puis `cache:clear` en prod.
- Les outils de dev (`web-profiler`, `maker`) ne sont pas installés en prod (`composer install --no-dev`).
- HTTPS est nécessaire pour `crypto.randomUUID()` (génération d'ID de session de scan côté navigateur) — OVH fournit un certificat Let's Encrypt gratuit.
