1---2name: pwa-deploiement3description: Déploiement et exploitation d'une PWA Agence Bulles — RUNBOOK, déploiement Coolify + Cloudflare (proxy orange, tunnels Zero Trust), sauvegardes Cloudflare R2 (backup/restore), compression AVIF/WebP, docker-compose, staging. Charger (via ops-quality) dès qu'un déploiement, une sauvegarde, une restauration ou une mise en production est en jeu (Phase 8 du workflow).4license: MIT5---67# pwa-deploiement89## Ce que je fais10- Couvre la **Phase 8** du workflow projet (`~/.config/opencode/WORKFLOW.md`) : déploiement Coolify, configuration Cloudflare, sauvegardes R2 et restauration, migrations + rollback, monitoring, compression médias.11- Fournit les procédures opérationnelles condensées (RUNBOOK).1213## 1. Environnement de staging14- Déploiement totalement séparé de la production : `staging.<domaine>` + **base Turso de staging** distincte (et jeton distinct).15- Backups isolés ; validation fonctionnelle avant mise en ligne.1617## 2. Déploiement Coolify18- Déploiement depuis GitHub (branche `main` après merge), SSL auto via Caddy, variables d'env dans l'UI Coolify.19- Base : **Turso** (cloud libSQL managé) — aucun conteneur de base à héberger, sauvegarder ou mettre à jour côté serveur.20- Micro-services Python (FastAPI) : conteneur Docker multi-stage (`python:3.12-slim` + Uvicorn), healthcheck sur `/health`.21- Vérifier : Dockerfile multi-stage présent, port correct, healthcheck.22- Checklist : `assets/checklists/deploy.md`.2324## 3. Configuration Cloudflare25- **Proxy DNS orange** : masquer l'IP réelle du VPS, SSL Full (Strict).26- **Tunnels Zero Trust** : exposer les consoles d'admin (Coolify) sans ports ouverts → `assets/configs/cloudflared.yml`.27- **Turnstile** sur tous les formulaires ; WAF/DDoS ; règles de cache edge.28- **R2** : stockage médias/uploads/sauvegardes (0 egress).2930## 4. Sauvegardes R2 (quotidiennes)31- Backup automatique : base de données + fichiers médias → bucket R2.32- **Cohérence** : Turso étant managé, la sauvegarde se fait par **export logique** (`turso db shell <db> .dump`) — jamais par copie de fichier. Turso gère par ailleurs ses propres sauvegardes internes, à ne pas confondre avec la sauvegarde applicative.33- Scripts : `assets/scripts/backup-r2.sh` (sauvegarde), `assets/scripts/restore-r2.sh` (restauration).34- **Test de restauration obligatoire et périodique** : restaurer sur un environnement jetable, vérifier l'intégrité, détruire. Tracer la date du dernier test dans `RUNBOOK.md`. Une sauvegarde jamais restaurée n'est pas une sauvegarde.3536## 5. Migrations — ordre impératif371. **Backup** et vérifier qu'il est lisible382. Migration testée sur une **copie de staging**393. Déploiement du code404. Migration en production415. **Vérification** (healthcheck + requêtes de contrôle)426. **Rollback** documenté et **testé en staging**43- ⛔ Aucune migration sur une base non locale sans validation humaine explicite.4445## 6. Monitoring (minimum)46- **Disponibilité** : check uptime sur l'app — alertes vers email/slack.47- **Erreurs applicatives** : remontée et suivi (Sentry / logs Coolify) — alerte sur pic.48- **Jobs critiques** : alerte si la réconciliation des paiements ou les backups ne s'exécutent pas.4950## 7. Compression des médias (obligatoire avant upload)51- Toutes les images/médias utilisateurs compressés en **AVIF ou WebP** avant envoi vers R2.52- Traitement via `sharp` **côté serveur** (runtime Node de SvelteKit), ou côté client avant upload.53- Script : `assets/scripts/compress-avif.sh` (conversion batch).5455## 8. RUNBOOK (docs/RUNBOOK.md)56- Livrable Phase 8 : procédures opérationnelles condensées.57- Contenu : déploiement, staging, migrations + rollback, sauvegardes/restauration (+ test périodique), monitoring, incidents, rotation des clés.58- Template : `assets/templates/RUNBOOK.md`.5960## 9. docker-compose.yml (prod/staging)61- Services : app SvelteKit uniquement (`adapter-node`). Aucun sidecar de base — Turso est managé.62- **n8n : hors MVP sauf besoin avéré** — c'est un composant d'infra supplémentaire à héberger, sécuriser et sauvegarder. Si présent : webhooks entrants authentifiés.63- Template : `assets/configs/docker-compose.yml`.6465## Règles66- Ne jamais exposer les ports d'admin publiquement (tunnels ou firewall).67- Chaque déploiement doit être documenté dans RUNBOOK.md (Living Documentation).68- Toujours charger `shared-eco-tokens` en parallèle.6970## Assets71- `assets/templates/RUNBOOK.md`72- `assets/scripts/backup-r2.sh`73- `assets/scripts/restore-r2.sh`74- `assets/scripts/compress-avif.sh`75- `assets/configs/docker-compose.yml`76- `assets/configs/cloudflared.yml`77- `assets/checklists/deploy.md`