diff --git a/.env.docker.example b/.env.docker.example index 3403f18..c9cf52c 100644 --- a/.env.docker.example +++ b/.env.docker.example @@ -1,7 +1,7 @@ # Le Tribunal — Docker deployment # --- Domain --- -APP_DOMAIN=acropole.alxczl.fr +APP_DOMAIN=agora.alxczl.fr # --- Traefik --- TRAEFIK_NETWORK=proxy diff --git a/CLAUDE.md b/CLAUDE.md index d605cd8..2b6d28e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -28,7 +28,7 @@ Hors périmètre pour l'instant (voir roadmap en fin de doc) : éditions/saisons - **Style** : Tailwind CSS v4 (design tokens en variables CSS, voir `globals.css`) - **Auth + Base + Stockage + Temps réel** : Supabase (Auth, Postgres, Storage, Realtime) - **Recadrage photo** : `react-easy-crop` + canvas natif (resize/compression client, jamais d'upload de l'image brute) -- **Déploiement** : Vercel (front) + Supabase (managé) — pas encore déployé, tourne en local pour l'instant +- **Déploiement** : self-hosted, Docker Compose + Traefik (reverse proxy), Supabase (managé) — CI via Gitea Actions (`.gitea/workflows/deploy.yml`) qui build le standalone Next.js et le POST à un webhook (`docker/webhook/receive.py`) déclenchant un hot-swap sans downtime (`docker/entrypoint.sh`) ; domaine injecté par `APP_DOMAIN` (`.env.docker`, gitignored — seul `.env.docker.example` est versionné) dans le label Traefik `Host()`. Domaine actuel : `agora.alxczl.fr`. Next.js 16 a renommé `middleware.ts` en `proxy.ts` (fichier `src/proxy.ts`, fonction `proxy`). `src/lib/supabase/middleware.ts` est un nom de fichier utilitaire interne, sans rapport avec cette convention. @@ -197,4 +197,3 @@ Vocabulaire diégétique (toujours accompagné du terme fonctionnel dans le code - **Éditions** : table `editions` (année, mood board) ; les points deviendront rattachables à une édition donnée. Le thème visuel (Grèce antique) reste fixe, ce n'est pas un système de re-thématisation par édition. - **Mode grand écran** : vue leaderboard optimisée pour vidéoprojecteur. -- **Déploiement** : pas encore fait (Vercel + Supabase managé prévus, voir README). diff --git a/README.md b/README.md index 5f00c8e..b5f3bfc 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Application web pour animer et scorer le jeu **« Le Tribunal »** entre amis pe | Auth · Base · Stockage · Temps réel | Supabase (Auth, Postgres, Storage, Realtime) | | Recadrage photo | react-easy-crop + canvas (resize/compression client) | | Email transactionnel | SMTP custom (ex. Resend) branché sur Supabase Auth | -| Déploiement | Vercel + Supabase (managé) | +| Déploiement | Docker Compose + Traefik (self-hosted) + Supabase (managé) | --- @@ -37,7 +37,7 @@ Application web pour animer et scorer le jeu **« Le Tribunal »** entre amis pe - [Node.js](https://nodejs.org/) 20.19+ (Next.js 16 / React 19) - Un compte [Supabase](https://supabase.com/) (offre gratuite suffisante) - Un fournisseur SMTP gratuit (ex. [Resend](https://resend.com/), 100 emails/jour) — le service email intégré de Supabase a un rate limit trop bas pour un usage réel -- Un compte [Vercel](https://vercel.com/) pour le déploiement (optionnel en local) +- Pour le déploiement (optionnel en local) : un serveur avec Docker + Traefik déjà en place, voir [Déploiement](#déploiement) --- @@ -95,11 +95,17 @@ L'application tourne sur [http://localhost:3000](http://localhost:3000). --- -## Déploiement (Vercel) +## Déploiement (Docker + Traefik) -1. Importez le dépôt dans Vercel. -2. Renseignez les variables d'environnement (`NEXT_PUBLIC_SUPABASE_URL`, `NEXT_PUBLIC_SUPABASE_ANON_KEY`). -3. Déployez. Vercel rebuild automatiquement à chaque push sur la branche principale. +Self-hosted, pas de Vercel. Un serveur avec Docker Compose et un reverse proxy [Traefik](https://traefik.io/) déjà en place (réseau externe partagé, voir `TRAEFIK_NETWORK`), plus un pipeline Gitea Actions qui build et déploie automatiquement à chaque push sur la branche principale. + +1. Sur le serveur, copiez `.env.docker.example` en `.env.docker` et renseignez : + - `APP_DOMAIN` : le domaine sur lequel l'app doit répondre (utilisé dans le label Traefik `Host(\`${APP_DOMAIN}\`)`). + - `TRAEFIK_NETWORK` : le nom du réseau Docker externe sur lequel Traefik écoute. + - `WEBHOOK_SECRET` : secret partagé avec le workflow Gitea Actions (`openssl rand -hex 16`). +2. `docker compose up -d` démarre le conteneur `app` (Next.js standalone) et le petit serveur webhook (`docker/webhook/receive.py`) qui reçoit les déploiements. +3. Le workflow `.gitea/workflows/deploy.yml` build l'app à chaque push sur `main` et POST le build vers le webhook, qui déclenche un hot-swap (voir `docker/entrypoint.sh`) sans downtime — pas de rebuild manuel nécessaire une fois configuré. +4. **Changer de domaine** : mettez à jour `APP_DOMAIN` dans `.env.docker` sur le serveur, puis recréez le conteneur (`docker compose up -d --force-recreate app`) pour que Traefik prenne en compte le nouveau label `Host()`. Pensez aussi à mettre à jour, côté Supabase Dashboard, **Authentication → URL Configuration** (Site URL + Redirect URLs) et le template d'email d'invitation (logo en dur), sans quoi les liens d'invitation et le logo pointeront encore vers l'ancien domaine. ---