# HandiPartner - Récap sécurisation & récupération (21 → 28 juil. 2026)

Une frayeur transformée en tout-récupéré : spam bloqué, e-mail masqué, base
sécurisée, et les 123 articles de blog perdus restaurés. **1 seule action te reste.**

## ✅ Fait et vérifié en production

### 1. Blog entièrement récupéré ⭐
- **123 articles + 5 pages** réimportés depuis la base MySQL WordPress (toujours
  vivante) vers le blog Laravel, avec leurs images.
- **Sitemap 63 → 211 URLs**, resoumis à Google Search Console.
- Import versionné et idempotent (`wp:import-db`, clé `wp_id`), sauvegarde faite
  avant écriture. Contrôle de cohérence : conforme (WordPress n'avait ni vignette
  ni extrait → normal, images en ligne dans le corps des articles).

### 2. Spam de formulaire bloqué
Les bots postaient en direct sur `/contact` et `/simulateur` (sans charger la page).
Filtres serveur indépendants de l'affichage :
- honeypot (champ caché `website`) ;
- `form_ts` obligatoire (absent = post direct = bot) + rejet si < 2 s ;
- liste noire d'e-mails (`immenseignite.info`) ;
- rejet des téléphones `+1` (service franco-français) ;
- rejet du charabia (nom sans voyelles) ;
- limitation 6 req/min par IP.

Le bot reçoit un faux succès, mais **aucun lead / aucun mail**. Testé en direct.

### 3. Adresse e-mail masquée (anti-scraping)
`contact@handipartner.fr` encodée en entités HTML partout (footer, contact, mentions,
confidentialité, chatbot) + retirée du JSON-LD. **0 occurrence en clair** dans le HTML
servi. Liens `mailto:` toujours cliquables. Partial `resources/views/partials/mail.blade.php`.

### 4. Déploiement sécurisé
`deploy-ovh.sh` n'écrase plus jamais la base de prod (exclusion `database/*.sqlite`
du rsync + étape 3 ne pousse plus le local). C'était la cause de la perte initiale.
Vérifié par rsync --dry-run.

### 5. Sauvegarde quotidienne
Script `backup-db.sh` (hot backup sqlite3, compressé, rétention 30 j, dossier sœur
`backups-handipartner/` hors app/hors déploiement). Plusieurs archives déjà créées.

### 6. Bug 500 corrigé
`simulateurLead` : une soumission sans `societe` provoquait un 500 → sécurisé.

---

## 🟢 Données perdues — résolu
- **Articles** : restaurés depuis WordPress (voir point 1).
- **Leads réels** : rien à restaurer — chaque lead t'avait été envoyé par e-mail,
  tu as déjà l'archive dans ta boîte Mail. Restauration OVH inutile.

---

## ⏳ 1 action qui te reste (côté OVH)

### Activer le cron de sauvegarde (2 min, une fois)
Le cron ne peut se créer que dans le Manager OVH (pas en SSH sur mutualisé).
Manager OVH → Web Cloud → Hébergements → `cluster110` → Tâches planifiées → Ajouter :
- **Commande** : `/usr/bin/bash /homez.608/baumberg/handipartner-laravel/backup-db.sh`
- **Fréquence** : tous les jours, ~03h00
- **E-mail** : ton adresse (rapport quotidien, optionnel)

Puis me dire « cron créé » → je vérifie le lendemain qu'une archive datée apparaît.

---

## Commits livrés (dépôt Handipartner)
- honeypot + piège temporel (contact/simulateur)
- filtres post-direct + rate limit
- fix deploy : ne plus pousser la base locale
- masquage e-mail + fix societe
- script de sauvegarde quotidienne
- commande de réimport WordPress → Laravel (récupération du blog)

_Fiche alignée sur la page web : https://claude.ai/code/artifact/28752114-17f9-4360-95b8-c8193160d0e7_
