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

3.8 KiB

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).