# Mise en ligne sur OVH : guide pas à pas

Hébergement mutualisé OVH, sous-domaine `carrieres.alumneye.fr`. Les étapes sont dans l'ordre ;
chacune indique qui la fait. Rien n'est déployé sans demande explicite de Guillaume (CLAUDE.md).

---

## Étape 0. Avant de toucher à OVH

**0.1 Valider le code sur MySQL** (Claude, en local) : **fait le 23/10/2026**
Migrations `001` à `006` et recette complète (135 contrôles) passées sur MySQL 8.0.46 en mode
strict, la version proposée par OVH. Commande dans CLAUDE.md, section Développement local.

**0.2 Nettoyer le contenu** (Guillaume, dans l'admin locale ou après la mise en ligne)
- Supprimer l'offre « [DÉMO] Growth marketer ».
- Supprimer les candidatures de test (Camille Martin, Test Parcours) : fiche, puis
  « Données personnelles », puis « Supprimer définitivement ».
- La base de production repart de zéro : seules les offres saisies en production y seront.
  Si tu veux garder ton offre Business Developer, recrée-la (copier-coller dans l'éditeur).

---

## Étape 1. Créer la base de données (Guillaume, espace client OVH)

1. Espace client OVH, puis **Web Cloud**, **Hébergements**, ton hébergement.
2. Onglet **Bases de données**, puis **Créer une base de données**.
3. Choisir **MySQL**, version **8.0** (ou la plus récente proposée).
4. Choisir un nom d'utilisateur et un mot de passe solide.
5. Noter les 4 informations affichées une fois la base créée :
   - le **serveur** (de la forme `xxxxxx.mysql.db`) ;
   - le **nom de la base** ;
   - l'**utilisateur** ;
   - le **mot de passe**.

La base est séparée de celle de WordPress (SPEC.md). Si l'offre OVH n'autorise plus de base
supplémentaire, me le dire : c'est le point ouvert « nombre de bases disponibles ».

---

## Étape 2. Déclarer le sous-domaine (Guillaume, espace client OVH)

1. Même hébergement, onglet **Multisite**, puis **Ajouter un domaine ou un sous-domaine**.
2. Domaine : `carrieres.alumneye.fr`.
3. **Dossier racine** : `carrieres-alumneye/public`.
   C'est essentiel : seul `public/` est exposé sur le web ; le code, les CV et le `.env` restent
   hors d'atteinte.
4. Cocher **SSL** (certificat Let's Encrypt gratuit).
5. Si le domaine alumneye.fr est géré chez OVH, cocher la création automatique de
   l'enregistrement DNS. Sinon, créer chez le gestionnaire DNS un enregistrement `CNAME`
   `carrieres` vers l'adresse indiquée par OVH (ou un `A` vers l'IP de l'hébergement).
6. Attendre que le multisite passe en « Activé » et que le SSL soit généré (de quelques
   minutes à quelques heures).

---

## Étape 3. Version de PHP (Claude prépare, Guillaume vérifie)

Le portail demande PHP 8.2 ou plus récent. Le fichier `public/.ovhconfig` (versionné) fixe la
version pour ce sous-domaine uniquement, sans toucher au WordPress d'alumneye.fr.
Vérification après l'envoi des fichiers : la page d'accueil s'affiche. Une page blanche ou une
erreur 500 signale en général une mauvaise version de PHP. Si OVH ignore ce fichier sur ton offre,
régler la version dans l'onglet **Informations générales** de l'hébergement, après avoir vérifié que
le WordPress d'alumneye.fr la supporte (elle s'applique alors à tout l'hébergement).

---

## Étape 4. Envoyer les fichiers (Guillaume avec Claude)

1. Récupérer les accès FTP : onglet **FTP-SSH** de l'hébergement (serveur, identifiant ; le mot
   de passe se redéfinit au même endroit). Si le bouton **SSH** est actif (offres Pro et
   au-delà), noter aussi l'accès SSH : il simplifie l'étape 6.
2. Avec FileZilla (SFTP, port 22) ou en ligne de commande, créer à la racine de l'hébergement
   le dossier `carrieres-alumneye/` et y envoyer :
   - `public/`, `src/`, `migrations/`, `cron/`, `composer.json` ;
   - `storage/` avec seulement ses sous-dossiers vides `cv/` et `logs/` (et leurs `.gitkeep`
     et `.htaccess`).
3. Ne **pas** envoyer : `.env` (créé à l'étape 5), `.git/`, `tests/`, `storage/carrieres.sqlite`,
   le contenu de `storage/cv/` et de `storage/logs/` (données locales de test).

---

## Étape 5. Créer le fichier `.env` de production (Guillaume, avec Claude)

Créer `carrieres-alumneye/.env` sur le serveur (à côté de `public/`, jamais dedans) :

```
APP_ENV=production
APP_URL=https://carrieres.alumneye.fr
APP_SECRET=            # nouveau secret : php -r 'echo bin2hex(random_bytes(32)), PHP_EOL;'

DB_DRIVER=mysql
DB_HOST=               # serveur de l'étape 1 (xxxxxx.mysql.db)
DB_PORT=3306
DB_NAME=               # étape 1
DB_USER=               # étape 1
DB_PASSWORD=           # étape 1

MAIL_DRIVER=brevo
BREVO_API_KEY=         # nouvelle clé dédiée au portail (voir étape 8)
MAIL_FROM_EMAIL=contact@alumneye.fr
MAIL_FROM_NAME=AlumnEye Recrutement

TURNSTILE_SITE_KEY=    # clé publique Cloudflare
TURNSTILE_SECRET_KEY=  # clé secrète Cloudflare

PRIVACY_CONTACT_EMAIL=contact@alumneye.fr
```

Les secrets s'écrivent directement dans ce fichier sur le serveur. Ils ne passent ni par git, ni
par email, ni par la conversation.

---

## Étape 6. Créer les tables et les comptes (Guillaume ou Claude)

**Avec SSH** : se connecter, puis :

```
cd carrieres-alumneye
php migrations/migrate.php        # crée toutes les tables (6 migrations)
php migrations/seed.php --users   # crée les 4 comptes admin, sans offre de démonstration
```

**Sans SSH** : créer à l'étape 7 une tâche planifiée ponctuelle sur `migrations/migrate.php`,
attendre son exécution, la supprimer, puis faire de même avec `migrations/seed.php`. Me prévenir :
je prépare une variante de `seed.php` qui crée uniquement les comptes sans argument.

---

## Étape 7. Tâches planifiées (Guillaume, espace client OVH)

Onglet **Tâches planifiées - Cron**, puis **Ajouter une planification**, deux fois :

| Script | Langage | Fréquence | Rôle |
| --- | --- | --- | --- |
| `carrieres-alumneye/cron/close_expired_jobs.php` | PHP 8.x | toutes les heures | archive les offres dont la date de clôture est passée |
| `carrieres-alumneye/cron/gdpr_purge.php` | PHP 8.x | tous les jours à 3 h | rappel à 11 mois, suppression RGPD à 1 an, purge du journal |

Activer l'envoi des logs par email au début, pour voir la première exécution.

---

## Étape 8. Brevo en production (Guillaume)

1. Créer dans Brevo une **nouvelle clé API dédiée au portail**, la coller dans le `.env` du
   serveur, puis supprimer la clé partagée dans la conversation.
2. Restriction d'IP : ajouter l'IP de sortie de l'hébergement OVH. Sur un mutualisé, cette IP
   n'est pas garantie fixe ; si les envois échouent un jour avec « unrecognised IP », désactiver
   la restriction pour cette clé.
3. Rien à faire côté expéditeur : `contact@alumneye.fr` est actif et le domaine alumneye.fr est
   authentifié (vérifié le 23/10/2026).

---

## Étape 9. Cloudflare Turnstile (Guillaume)

1. Le widget autorise déjà `carrieres.alumneye.fr` (garder `localhost` pour les tests).
2. Dans le widget, régler **Widget Mode** sur **Invisible**. Ce réglage est différent de
   « Pre-clearance », qui peut rester sur « no pre-clearance ».

---

## Étape 10. Recette en production (Guillaume avec Claude)

1. `https://carrieres.alumneye.fr` s'affiche en HTTPS (cadenas) et `http://` redirige.
2. `https://carrieres.alumneye.fr/admin` : demander un lien de connexion, le recevoir par email,
   se connecter.
3. Créer et publier une offre, la voir sur l'accueil.
4. Postuler avec une adresse personnelle : page de confirmation, accusé de réception reçu,
   notification reçue par les responsables de l'offre.
5. Ouvrir la candidature dans l'admin, afficher le CV, la déplacer dans le pipeline.
6. Vérifier que `https://carrieres.alumneye.fr/.env` et `/src/` renvoient une erreur 404.
7. Supprimer la candidature de test (Données personnelles, puis Supprimer définitivement).
8. Le lendemain, vérifier l'email de log du cron de purge.

---

## Étape 11. Sauvegardes (Claude, puis Guillaume)

OVH sauvegarde automatiquement l'hébergement et la base sur quelques jours (onglet
**Bases de données**, puis **Restaurer une sauvegarde**). SPEC.md prévoit en plus une sauvegarde
quotidienne chiffrée de la base et des CV, conservée 30 jours : script `cron/backup.php` à écrire,
puis à planifier comme à l'étape 7.

---

## Étape 12. Bascule depuis Welcome to the Jungle (Guillaume)

1. Sur alumneye.fr (WordPress) : ajouter un lien « Carrières » vers
   `https://carrieres.alumneye.fr` dans le pied de page.
2. Republier chaque offre WTTJ ouverte sur le portail, puis dépublier l'offre WTTJ.
3. Remplacer les liens WTTJ partagés (posts LinkedIn épinglés, signatures email, pages écoles)
   par `https://carrieres.alumneye.fr`, avec `?source=linkedin`, `?source=ecole-xxx`, etc. pour
   mesurer chaque canal dans le tableau de bord.
4. Exporter depuis WTTJ les candidatures en cours et reprendre à la main les process ouverts.
5. Laisser la page entreprise WTTJ jusqu'à la fin du contrat, avec un renvoi vers le portail si
   WTTJ le permet.
