Files
photobooth-qr/docs/decisions.md
T
KevinLecou 2a9cdc4318 Déploie le front en production sur le VPS (photobooth.assistantaikev.eu)
Container nginx dédié, rattaché au réseau Docker de n8n pour réutiliser
Traefik/Let's Encrypt déjà en place. Config versionnée dans deploy/.
APP_BASE_URL configurée sur les Edge Functions pour le CORS. Testé en
conditions réelles : upload invité + galerie admin fonctionnels depuis
le domaine public.
2026-09-16 13:06:36 +02:00

73 lines
3.8 KiB
Markdown

# Journal des décisions
Ce fichier consigne les décisions structurantes actées pour le projet, avec
la date à laquelle elles ont été prises. Toute nouvelle décision structurante
(schéma DB, auth, hébergement, etc.) doit être ajoutée ici après validation
par Kévin.
## 2026-09-15
- **Expiration des données** : suppression à **J+7 à partir de la date de
l'événement** (`date_evenement`), et non à partir de la date de création
de l'événement dans le système.
- **Sécurité admin (V1)** : accès à la galerie admin via un **token secret
dans l'URL** (`admin_token`), pas de système de login/mot de passe. Réévaluer
ce choix avant V2/V3 si le nombre de clients augmente.
- **Suppression des données** : effective à J+7 **dans tous les cas**, y
compris si l'organisateur a déjà téléchargé le ZIP d'export des photos.
- **Hébergement** : utilisation du **VPS existant de Kévin**
(148.230.114.175), pas de nouvel hébergement dédié pour l'instant.
## 2026-09-16
- **Compression image côté client** : utilisation de la lib
**`browser-image-compression`**, plutôt qu'une implémentation maison via
Canvas API. Doit gérer l'orientation EXIF et les formats HEIC (iPhone).
## 2026-09-15 (bis)
- **Préfixage des tables** : le projet Supabase de photobooth-qr sera
mutualisé avec les autres projets de Kévin (KOMI, KAZA...). Tables
préfixées `pq_` (`pq_events`, `pq_photos`), conformément à la convention
du CLAUDE.md global. Les fonctions Postgres exposées au front
(`get_public_event`, `event_accepts_uploads`) restent sans préfixe : ce
sont des points de contrat public, pas des tables internes.
- **Bucket Supabase Storage `event-photos`** : bucket **privé** (pas de
lecture publique). Convention de chemin : `{event_id}/{uuid}.{ext}`.
Consultation admin exclusivement via URLs signées générées par l'Edge
Function `service_role`. Aucune policy SELECT/UPDATE/DELETE publique sur
`storage.objects`. Limité à `file_size_limit = 6 Mo` et
`allowed_mime_types = image/jpeg` (aligné sur la sortie de compression
du front, qui force tout en JPEG y compris les HEIC convertis).
- **`pq_photos.url_storage`** : contrainte `CHECK` garantissant que le
chemin commence par `event_id/`, pour empêcher qu'une ligne de l'event A
pointe vers un fichier de l'event B (isolation multi-tenant), trouvé lors
de la relecture sécurité du 2026-09-15.
- **`get_public_event`** : renvoie l'événement même si son statut n'est pas
`actif` (expiré/archivé), pour permettre au front d'afficher un message
adapté. Risque jugé faible : les slugs sont partagés via QR code, donc
non secrets par nature.
## 2026-09-16 (ter)
- **Domaine de production (V1)** : `photobooth.assistantaikev.eu`, sous-domaine
du domaine déjà utilisé pour n8n. Décision explicitement temporaire : à
déplacer vers un domaine dédié en V2/V3 si le produit est vendu sous sa
propre marque. Front servi par un container nginx sur le VPS existant
(Traefik/Let's Encrypt déjà en place pour n8n), config dans `deploy/`.
`APP_BASE_URL` configurée comme secret sur les 2 Edge Functions pour le
CORS. Déploiement testé en conditions réelles le 2026-09-16 (upload +
galerie admin fonctionnels depuis le domaine public).
## 2026-09-16 (bis)
- **Déclenchement de la purge Storage à J+7** : **option n8n retenue**
(plutôt que `pg_cron`+`pg_net`). Un workflow n8n planifié quotidien
appelle l'Edge Function `expire-events` avec la `service_role` key
(Credentials Store n8n), avec notification Telegram en cas d'échec.
Cohérent avec la stack n8n déjà utilisée pour KOMI/KAZA, et le VPS n8n
existant sert de point d'orchestration commun. Conception du workflow :
`n8n/workflows/purge-storage-j7.json` (JSON importable, **non testé sur
l'instance n8n réelle**, credentials à relier manuellement avant
activation).