# OPTIM-06 — Pipeline WebP open-source (libvips, sans plugin)

**Date** : 2026-06-24
**Contexte** : Imagify quota dépassé → solution 100% OSS, sans plugin WP, via outils système + wp-cli.
**Décisions (brainstorming validé utilisateur)** : moteur **libvips** · service **rewrite Apache transparent** ·
resize **cap 2560px + strip EXIF** · automatisation **bulk one-shot** (pas de cron).

## État initial
- 57 833 jpg + 16 905 png = **74 738 sources (11 Go)**, seulement ~3371 `.webp` (Imagify, convention `.ext.webp`).
- Originaux énormes (PNG 46 Mo, 39 Mo ; JPG 31 Mo). uploads total 13 Go. Disque serveur ~85%.
- Aucun outil CLI image installé ; PHP-GD a le WebP. `uploads/backup/` = doublons d'images (bloat).

## Phases
### A. Backup (filet de sécurité) — AVANT tout
- DB → `backup/db-pre-webp-20260624.sql.gz` (rapatrié + SHA vérifié ✅).
- `rsync` complet `uploads/` → `backup/uploads-pre-webp/` (inclut `uploads/backup/` → couvre le "au cas où").

### B. Outillage
- `apt install libvips-tools` (vips + vipsthumbnail). OSS, léger.

### C. Resize originaux (destructif — backup couvre)
- Originaux (sans suffixe `-WxH`) dont max(dim) > 2560 → `vipsthumbnail` cap 2560 + strip EXIF.
- MAJ `_wp_attachment_metadata` (width/height) via wp-cli pour les images recadrées (srcset correct).
- **Skip `uploads/backup/`**. Tailles intermédiaires WP : pas recadrées.

### D. Génération WebP (idempotent)
- Chaque jpg/png sans `.webp` voisin → `vips ... <fichier>.ext.webp` (q≈80, effort 4).
- Skip existants + skip `uploads/backup/`. Convention `image.jpg.webp` (réutilise l'existant).
- **Ordre C avant D** : le resize libère du disque avant que la génération en consomme.

### E. Service WebP — rewrite Apache (uploads/.htaccess)
```apache
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTP_ACCEPT} image/webp
  RewriteCond %{REQUEST_FILENAME}\.webp -f
  RewriteRule (?i)^(.+)\.(jpe?g|png)$ $1.$2.webp [T=image/webp,L]
</IfModule>
<IfModule mod_headers.c>
  Header append Vary Accept
</IfModule>
```
- `<img src=.jpg>` inchangé → Apache sert `.jpg.webp` si `Accept: image/webp` + fichier présent. `Vary: Accept`.

### F. Nettoyage Imagify
- Désactiver Imagify (stoppe ses `<picture>` tags en doublon). Conserver ses `.webp` (réutilisés).

### G. Vérif + mesure
- LCP sert WebP + poids réduit ; site 200 ; pas d'image cassée ; poids total avant/après ; flush cache page.

## Sécurité / rollback
- Backup uploads + DB en local. Resize réversible via restauration du backup. Rewrite réversible (retirer le bloc).
- Disque serveur tendu (85%) → surveiller ; option : supprimer `uploads/backup/` (déjà sauvegardé) pour libérer.

## Statut : ⏳ Phase A en cours
