improve security (change RLS, and allow table sensitive access only at server side, with supabase service key)

This commit is contained in:
Yannick Le Duc
2025-08-26 14:51:15 +02:00
parent 4119875f48
commit 0093f4edba
17 changed files with 1240 additions and 285 deletions

141
docs/ADMIN-MANAGEMENT.md Normal file
View File

@@ -0,0 +1,141 @@
# 👥 Gestion des Administrateurs - Mes Budgets Participatifs
## 🔐 **Approche Sécurisée**
La gestion des utilisateurs et administrateurs se fait **uniquement via l'interface Supabase** pour une sécurité maximale. L'application ne permet pas la création d'utilisateurs.
## 📋 **Étapes de Configuration**
### 1. **Créer un utilisateur dans Supabase**
1. Allez dans votre projet Supabase
2. **Authentication** > **Users**
3. Cliquez sur **"Add user"**
4. Remplissez :
- **Email** : `admin@example.com`
- **Password** : Mot de passe sécurisé
- **Email confirm** : ✅ (cochez pour confirmer l'email)
5. Cliquez sur **"Create user"**
### 2. **Ajouter l'utilisateur comme administrateur**
1. Allez dans **SQL Editor**
2. Exécutez cette requête pour ajouter un admin :
```sql
-- Ajouter un administrateur
INSERT INTO admin_users (id, email, role)
VALUES (
'USER_ID_FROM_SUPABASE',
'admin@example.com',
'admin'
);
-- Ou pour un super administrateur
INSERT INTO admin_users (id, email, role)
VALUES (
'USER_ID_FROM_SUPABASE',
'admin@example.com',
'super_admin'
);
```
**Pour obtenir l'USER_ID :**
- Allez dans **Authentication** > **Users**
- Trouvez votre utilisateur
- Copiez l'ID (format UUID)
### 3. **Vérifier la configuration**
Exécutez cette requête pour vérifier :
```sql
SELECT * FROM admin_users;
```
## 🔧 **Gestion des Rôles**
### **Rôles disponibles :**
- **`admin`** : Gestion des campagnes, propositions, participants
- **`super_admin`** : Toutes les permissions admin + gestion des autres administrateurs
### **Changer le rôle d'un administrateur :**
```sql
-- Promouvoir en super admin
UPDATE admin_users
SET role = 'super_admin'
WHERE email = 'admin@example.com';
-- Rétrograder en admin
UPDATE admin_users
SET role = 'admin'
WHERE email = 'admin@example.com';
```
### **Supprimer un administrateur :**
```sql
-- Supprimer de la table admin_users
DELETE FROM admin_users
WHERE email = 'admin@example.com';
-- Note : L'utilisateur reste dans auth.users
-- Pour le supprimer complètement, allez dans Authentication > Users
```
## 🛡️ **Sécurité**
### **Avantages de cette approche :**
-**Aucune création d'utilisateur** depuis l'application
-**Gestion centralisée** via Supabase
-**Audit complet** des utilisateurs
-**Politiques RLS** strictes
-**Pas de clé de service** exposée dans l'app
### **Bonnes pratiques :**
1. **Utilisez des mots de passe forts**
2. **Limitez le nombre de super admins**
3. **Auditez régulièrement** la liste des administrateurs
4. **Supprimez les comptes inactifs**
5. **Utilisez des emails professionnels**
## 🔍 **Vérification**
### **Tester la connexion :**
1. Lancez l'application : `npm run dev`
2. Allez sur `/admin`
3. Connectez-vous avec les identifiants créés
4. Vérifiez que vous avez accès aux fonctionnalités
### **Tester les permissions :**
```sql
-- Vérifier les admins actuels
SELECT id, email, role, created_at
FROM admin_users
ORDER BY created_at DESC;
```
## 🚨 **Dépannage**
### **Problème : "Accès refusé"**
- Vérifiez que l'utilisateur existe dans `auth.users`
- Vérifiez qu'il est bien dans `admin_users`
- Vérifiez le rôle (admin ou super_admin)
### **Problème : "Utilisateur non trouvé"**
- Vérifiez l'email dans `auth.users`
- Vérifiez l'ID utilisé dans `admin_users`
### **Problème : "Permissions insuffisantes"**
- Vérifiez le rôle dans `admin_users`
- Les super admins ont plus de permissions
---
**Note :** Cette approche garantit une sécurité maximale en centralisant la gestion des utilisateurs dans Supabase.

106
docs/PROJECT-STRUCTURE.md Normal file
View File

@@ -0,0 +1,106 @@
# 📁 Structure du Projet - Mes Budgets Participatifs
## 🗂️ **Organisation des dossiers**
```
mes-budgets-participatifs/
├── 📚 docs/ # Documentation complète
│ ├── README.md # Index de la documentation
│ ├── SETUP.md # Guide de configuration
│ ├── MIGRATION-GUIDE.md # Migration vers la sécurité
│ ├── SECURITY-SUMMARY.md # Résumé de la sécurisation
│ └── SETTINGS.md # Configuration avancée
├── 🗄️ database/ # Scripts de base de données
│ └── supabase-schema.sql # Schéma complet avec sécurité
├── 🛠️ scripts/ # Outils et scripts
│ └── test-security.js # Tests de sécurité
├── 📱 src/ # Code source de l'application
│ ├── app/ # Pages Next.js (App Router)
│ ├── components/ # Composants React
│ ├── lib/ # Services et utilitaires
│ └── types/ # Types TypeScript
├── 🎨 public/ # Assets statiques
├── 📦 node_modules/ # Dépendances (généré)
├── ⚙️ Configuration files # Fichiers de configuration
└── 📖 README.md # Documentation principale
```
## 📋 **Fichiers principaux**
### **Configuration**
- `package.json` - Dépendances et scripts
- `tsconfig.json` - Configuration TypeScript
- `next.config.ts` - Configuration Next.js
- `env.example` - Exemple de variables d'environnement
### **Documentation**
- `README.md` - Documentation principale
- `docs/README.md` - Index de la documentation
- `PROJECT-STRUCTURE.md` - Ce fichier
### **Base de données**
- `database/supabase-schema.sql` - Schéma complet avec sécurité
### **Outils**
- `scripts/test-security.js` - Tests de sécurité
## 🔧 **Scripts disponibles**
```bash
# Développement
npm run dev
# Build de production
npm run build
# Tests de sécurité
npm run test:security
# Linting
npm run lint
npm run lint:fix
```
## 📚 **Documentation par type**
### **🚀 Démarrage rapide**
- `docs/SETUP.md` - Installation et configuration
### **🔒 Sécurité**
- `docs/SECURITY-SUMMARY.md` - Vue d'ensemble de la sécurité
- `docs/SETTINGS.md` - Configuration SMTP et paramètres
### **🗄️ Base de données**
- `database/supabase-schema.sql` - Schéma complet avec RLS
## 🎯 **Points d'entrée**
### **Pour les développeurs :**
1. `README.md` - Vue d'ensemble
2. `docs/SETUP.md` - Configuration
3. `src/` - Code source
### **Pour les administrateurs :**
1. `docs/SECURITY-SUMMARY.md` - Sécurité
2. `docs/SETTINGS.md` - Configuration
### **Pour les déploiements :**
1. `database/supabase-schema.sql` - Base de données
2. `scripts/test-security.js` - Vérification
3. `env.example` - Variables d'environnement
## 🔄 **Workflow de développement**
1. **Configuration**`docs/SETUP.md`
2. **Développement**`src/`
3. **Tests**`scripts/test-security.js`
4. **Documentation**`docs/`
5. **Déploiement**`database/` + configuration
---
**Dernière mise à jour :** Réorganisation complète de la structure ✅

55
docs/README.md Normal file
View File

@@ -0,0 +1,55 @@
# 📚 Documentation - Mes Budgets Participatifs
Bienvenue dans la documentation de l'application "Mes Budgets Participatifs".
## 📋 **Table des matières**
### 🚀 **Démarrage rapide**
- [Guide de configuration](SETUP.md) - Installation et configuration initiale
### 🔒 **Sécurité**
- [Résumé de la sécurisation](SECURITY-SUMMARY.md) - Vue d'ensemble de la sécurité
- [Gestion des administrateurs](ADMIN-MANAGEMENT.md) - Configuration des utilisateurs admin
- [Paramètres et configuration](SETTINGS.md) - Configuration SMTP et autres paramètres
### 🗄️ **Base de données**
- [Schéma de base de données](../database/supabase-schema.sql) - Schéma complet avec sécurité
### 🛠️ **Outils**
- [Tests de sécurité](../scripts/test-security.js) - Script de vérification de la sécurité
## 🎯 **Par où commencer ?**
### **Nouvelle installation :**
1. [Guide de configuration](SETUP.md) - Installation complète
2. [Résumé de la sécurisation](SECURITY-SUMMARY.md) - Comprendre la sécurité
### **Configuration avancée :**
1. [Paramètres et configuration](SETTINGS.md) - Configuration SMTP et autres
2. [Tests de sécurité](../scripts/test-security.js) - Vérification
## 🔧 **Commandes utiles**
```bash
# Tests de sécurité
npm run test:security
# Développement
npm run dev
# Build de production
npm run build
```
## 📞 **Support**
Pour toute question ou problème :
1. Consultez le guide approprié ci-dessus
2. Vérifiez les logs Supabase et Next.js
3. Exécutez les tests de sécurité
---
**Dernière mise à jour :** Sécurisation complète de l'application ✅

155
docs/SECURITY-SUMMARY.md Normal file
View File

@@ -0,0 +1,155 @@
# 🔒 Résumé de la Sécurisation - Mes Budgets Participatifs
## ✅ **Application Sécurisée**
Votre application "Mes Budgets Participatifs" est conçue avec un système d'authentification robuste et des politiques RLS appropriées dès le départ.
## 🛡️ **Niveau de Sécurité : ÉLEVÉ**
### **Système de sécurité :**
- ✅ Politiques RLS granulaires et sécurisées
- ✅ Authentification Supabase avec système de rôles
- ✅ Séparation claire entre accès public et administrateur
- ✅ Protection contre les accès non autorisés
- ✅ Clé de service pour les opérations sensibles
## 🔐 **Système d'Authentification**
### **Rôles utilisateurs :**
1. **Anonymes** : Accès en lecture seule aux campagnes publiques
2. **Administrateurs** : Gestion complète des campagnes, propositions, participants
3. **Super Administrateurs** : Gestion des autres administrateurs + toutes les permissions admin
### **Pages d'accès :**
| Page | Accès | Authentification requise |
|------|-------|-------------------------|
| `/` | Public | ❌ |
| `/campaigns/[id]/propose` | Public | ❌ |
| `/campaigns/[id]/vote/[participantId]` | Public | ❌ |
| `/admin/*` | Admin | ✅ |
| `/setup` | Configuration initiale | ❌ (une seule fois) |
## 📊 **Politiques RLS Appliquées**
| Table | Lecture | Écriture | Modification | Suppression |
|-------|---------|----------|--------------|-------------|
| `campaigns` | Public | Admin | Admin | Admin |
| `propositions` | Public | Public | Admin | Admin |
| `participants` | Public | Admin | Admin | Admin |
| `votes` | Public | Public | Public | Admin |
| `settings` | Public | Admin | Admin | Admin |
| `admin_users` | Admin | Super Admin | Super Admin | Super Admin |
## 🔧 **Fichiers Créés/Modifiés**
### **Nouveaux fichiers :**
- `supabase-schema-secure.sql` - Schéma de base de données sécurisé
- `migrate-to-secure.sql` - Script de migration
- `src/lib/supabase-admin.ts` - Client Supabase admin
- `src/lib/auth.ts` - Service d'authentification
- `src/app/api/setup-admin/route.ts` - API de création d'admin
- `src/app/setup/page.tsx` - Page de configuration initiale
- `test-security.js` - Script de test de sécurité
- `MIGRATION-GUIDE.md` - Guide de migration
- `SECURITY-SUMMARY.md` - Ce résumé
### **Fichiers modifiés :**
- `src/components/AuthGuard.tsx` - Composant de protection amélioré
- `env.example` - Variables d'environnement mises à jour
- `package.json` - Script de test ajouté
- `README.md` - Documentation mise à jour
## 🚀 **Fonctionnalités de Sécurité**
### **Authentification robuste :**
- Connexion par email/mot de passe
- Session persistante
- Déconnexion sécurisée
- Validation côté serveur
### **Protection des routes :**
- Vérification automatique des permissions
- Redirection vers la page de connexion
- Messages d'erreur informatifs
- Interface moderne et sécurisée
### **Gestion des administrateurs :**
- Création sécurisée via `/setup`
- Système de rôles hiérarchique
- Gestion des permissions granulaires
- Interface d'administration protégée
### **Sécurité des données :**
- Politiques RLS appropriées
- Accès public limité aux fonctionnalités nécessaires
- Protection contre les manipulations non autorisées
- Validation des données côté serveur
## 🧪 **Tests de Sécurité**
Exécutez le script de test pour vérifier la sécurité :
```bash
npm run test:security
```
Ce script vérifie :
- ✅ Existence des tables
- ✅ Politiques RLS appliquées
- ✅ Accès administrateur fonctionnel
- ✅ Fonctions utilitaires accessibles
## 📋 **Checklist de Validation**
- [x] Sauvegarde de la base de données effectuée
- [x] Variables d'environnement mises à jour
- [x] Script de migration exécuté
- [x] Premier administrateur créé
- [x] Pages publiques testées
- [x] Pages admin protégées
- [x] Fonctionnalités de vote testées
- [x] Gestion des campagnes testée
- [x] Tests de sécurité passés
## 🎯 **Avantages de la Sécurisation**
### **Sécurité :**
- Protection contre les accès non autorisés
- Politiques RLS granulaires
- Authentification robuste
- Validation côté serveur
### **Fonctionnalité :**
- Pages publiques restent accessibles
- Interface d'administration sécurisée
- Gestion des rôles utilisateurs
- Configuration initiale simplifiée
### **Maintenabilité :**
- Code modulaire et séparé
- Documentation complète
- Scripts de test automatisés
- Guide de migration détaillé
## 🔮 **Prochaines Étapes Recommandées**
1. **Surveillance** : Surveillez les logs d'accès
2. **Backup** : Configurez des sauvegardes automatiques
3. **Monitoring** : Ajoutez des alertes de sécurité
4. **Audit** : Effectuez des audits de sécurité réguliers
5. **Formation** : Formez les administrateurs aux bonnes pratiques
## 📞 **Support et Maintenance**
Pour toute question ou problème :
1. Consultez le guide de migration : `MIGRATION-GUIDE.md`
2. Exécutez les tests de sécurité : `npm run test:security`
3. Vérifiez les logs Supabase et Next.js
4. Consultez la documentation Supabase sur les politiques RLS
---
## 🎉 **Application Prête !**
Votre application "Mes Budgets Participatifs" est **sécurisée et prête pour la production** avec un niveau de sécurité élevé et une architecture robuste.

144
docs/SETTINGS.md Normal file
View File

@@ -0,0 +1,144 @@
# Paramètres de l'Application
## Vue d'ensemble
L'application dispose maintenant d'un système de paramètres global qui permet de configurer le comportement de l'application. Les paramètres sont organisés par catégories pour une meilleure organisation.
## Accès aux paramètres
1. Connectez-vous à l'interface d'administration
2. Cliquez sur le bouton "Paramètres" dans la barre d'outils
3. Vous accédez à la page de configuration des paramètres
## Catégories de paramètres
### Affichage
Cette catégorie contient les paramètres liés à l'affichage de l'interface utilisateur.
#### Ordre aléatoire des propositions
- **Clé** : `randomize_propositions`
- **Type** : Booléen (true/false)
- **Valeur par défaut** : `false`
- **Description** : Lorsque activé, les propositions sont affichées dans un ordre aléatoire pour chaque participant lors du vote.
**Comportement :**
- **Désactivé (Off)** : Les propositions sont affichées dans l'ordre chronologique de création
- **Activé (On)** : Les propositions sont mélangées aléatoirement pour chaque participant
**Impact :**
- Ce paramètre affecte uniquement la page de vote (`/campaigns/[id]/vote/[participantId]`)
- L'ordre aléatoire est appliqué à chaque chargement de la page
- Chaque participant voit un ordre différent, ce qui peut réduire les biais liés à l'ordre d'affichage
### Email
Cette catégorie contient les paramètres de configuration SMTP pour l'envoi d'emails automatiques.
#### Configuration SMTP
- **smtp_host** : Serveur SMTP (ex: smtp.gmail.com)
- **smtp_port** : Port SMTP (ex: 587 pour TLS, 465 pour SSL)
- **smtp_username** : Nom d'utilisateur SMTP
- **smtp_password** : Mot de passe SMTP (chiffré automatiquement)
- **smtp_secure** : Connexion sécurisée SSL/TLS (booléen)
- **smtp_from_email** : Adresse email d'expédition
- **smtp_from_name** : Nom d'expédition
**Sécurité :**
- Le mot de passe SMTP est automatiquement chiffré avec AES-256-GCM avant stockage
- La clé de chiffrement est dérivée de `SUPABASE_ANON_KEY`
- Seules les personnes ayant accès à la clé peuvent déchiffrer le mot de passe
**Fonctionnalités :**
- Test de connexion SMTP intégré
- Envoi d'email de test avec template HTML
- Validation des paramètres avant sauvegarde
- Interface avec masquage du mot de passe
- Sauvegarde automatique avec feedback visuel
## Structure technique
### Base de données
La table `settings` contient les paramètres :
```sql
CREATE TABLE settings (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
key TEXT NOT NULL UNIQUE,
value TEXT NOT NULL,
category TEXT NOT NULL,
description TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
```
### Services
Le service `settingsService` fournit les méthodes suivantes :
- `getAll()` : Récupère tous les paramètres
- `getByCategory(category)` : Récupère les paramètres d'une catégorie
- `getByKey(key)` : Récupère un paramètre par sa clé
- `getValue(key, defaultValue)` : Récupère la valeur d'un paramètre
- `getBooleanValue(key, defaultValue)` : Récupère la valeur booléenne d'un paramètre
- `setValue(key, value)` : Définit la valeur d'un paramètre
- `setBooleanValue(key, value)` : Définit la valeur booléenne d'un paramètre
- `getSmtpSettings()` : Récupère tous les paramètres SMTP
- `setSmtpSettings(settings)` : Sauvegarde les paramètres SMTP avec chiffrement
- `testSmtpConnection(settings)` : Teste la connexion SMTP
- `sendTestEmail(settings, toEmail)` : Envoie un email de test
### Chiffrement
Le service `encryptionService` fournit les méthodes suivantes :
- `encrypt(value)` : Chiffre une valeur avec AES-256-GCM
- `decrypt(encryptedValue)` : Déchiffre une valeur chiffrée
- `isEncrypted(value)` : Vérifie si une valeur est chiffrée
- `mask(value)` : Masque une valeur pour l'affichage
### Utilisation dans le code
```typescript
import { settingsService } from '@/lib/services';
// Récupérer un paramètre booléen
const randomizePropositions = await settingsService.getBooleanValue('randomize_propositions', false);
// Utiliser le paramètre
if (randomizePropositions) {
// Mélanger les propositions
propositions.sort(() => Math.random() - 0.5);
}
// Récupérer les paramètres SMTP
const smtpSettings = await settingsService.getSmtpSettings();
// Envoyer un email de test
const result = await settingsService.sendTestEmail(smtpSettings, 'test@exemple.com');
```
## Migration
Pour ajouter la table des paramètres à une base de données existante :
1. **Paramètres de base** : Exécutez le script SQL dans `migration-settings.sql` dans l'éditeur SQL de Supabase
2. **Paramètres SMTP** : Exécutez ensuite le script SQL dans `migration-smtp-settings.sql`
## Ajout de nouveaux paramètres
Pour ajouter un nouveau paramètre :
1. Ajoutez l'insertion dans le script de migration
2. Utilisez le service `settingsService` dans votre code
3. Mettez à jour cette documentation
## Sécurité
- Tous les paramètres sont accessibles en lecture publique
- Seuls les administrateurs peuvent modifier les paramètres via l'interface d'administration
- Les paramètres sont protégés par l'AuthGuard

165
docs/SETUP.md Normal file
View File

@@ -0,0 +1,165 @@
# Guide de Configuration - Mes Budgets Participatifs
## 🚀 Configuration Rapide
### 1. Installation des dépendances
```bash
npm install
```
### 2. Configuration Supabase
#### Étape 1 : Créer un projet Supabase
1. Allez sur [supabase.com](https://supabase.com)
2. Créez un nouveau projet
3. Notez votre URL et votre clé anon dans les paramètres du projet
#### Étape 2 : Configurer la base de données
1. Dans votre projet Supabase, allez dans **SQL Editor**
2. Copiez et exécutez le contenu du fichier `supabase-schema.sql`
3. Vérifiez que les tables sont créées dans **Table Editor**
#### Étape 3 : Configurer les variables d'environnement
1. Copiez le fichier `env.example` vers `.env.local`
2. Remplacez les valeurs par vos vraies informations Supabase :
```env
NEXT_PUBLIC_SUPABASE_URL=https://your-project-id.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key-here
```
### 3. Lancer l'application
```bash
npm run dev
```
L'application sera accessible sur `http://localhost:3000`
## 📊 Structure de la Base de Données
### Tables créées automatiquement :
#### `campaigns`
- **id** : Identifiant unique (UUID)
- **title** : Titre de la campagne
- **description** : Description détaillée
- **status** : État (`deposit`, `voting`, `closed`)
- **budget_per_user** : Budget par participant (€)
- **spending_tiers** : Paliers de dépenses (ex: "10,25,50,100")
- **created_at** : Date de création
- **updated_at** : Date de modification
#### `propositions`
- **id** : Identifiant unique (UUID)
- **campaign_id** : Référence vers la campagne
- **title** : Titre de la proposition
- **description** : Description détaillée
- **created_at** : Date de création
#### `participants`
- **id** : Identifiant unique (UUID)
- **campaign_id** : Référence vers la campagne
- **first_name** : Prénom
- **last_name** : Nom
- **email** : Adresse email
- **created_at** : Date de création
## 🔧 Fonctionnalités Disponibles
### Page d'accueil (`/`)
- Présentation de l'application
- Bouton d'accès à l'administration
- Design moderne et responsive
### Page d'administration (`/admin`)
- **Liste des campagnes** : Affichage de toutes les campagnes avec leur statut
- **Créer une campagne** : Formulaire complet avec validation
- **Ajouter des propositions** : Par campagne
- **Ajouter des participants** : Par campagne
- **Indicateurs visuels** : Statuts colorés pour chaque campagne
### Modals interactifs
- **Création de campagne** : Titre, description, budget, paliers, statut
- **Ajout de proposition** : Titre et description
- **Ajout de participant** : Prénom, nom, email
## 🎨 Interface Utilisateur
### Design System
- **Framework CSS** : Tailwind CSS
- **Composants** : Headless UI pour les modals
- **Icônes** : Heroicons
- **Couleurs** : Palette moderne avec indigo comme couleur principale
### Responsive Design
- Mobile-first approach
- Adaptation automatique sur tous les écrans
- Navigation intuitive
## 🚀 Déploiement
### Vercel (Recommandé)
1. Connectez votre repo GitHub à Vercel
2. Configurez les variables d'environnement dans Vercel
3. Déployez automatiquement
### Variables d'environnement pour la production
```env
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
```
## 🔍 Dépannage
### Erreurs courantes
#### "supabaseUrl is required"
- Vérifiez que vos variables d'environnement sont correctement définies
- Redémarrez le serveur de développement
#### Erreurs de build
- Vérifiez que tous les composants sont correctement importés
- Assurez-vous que les types TypeScript sont corrects
#### Problèmes de base de données
- Vérifiez que le script SQL a été exécuté correctement
- Contrôlez les politiques RLS dans Supabase
### Logs de développement
```bash
# Voir les logs en temps réel
npm run dev
# Build de production
npm run build
# Lancer en production
npm run start
```
## 📈 Prochaines Étapes
### Fonctionnalités prévues
- [ ] Authentification des utilisateurs
- [ ] Interface de vote pour les participants
- [ ] Résultats et statistiques
- [ ] Notifications par email
- [ ] Gestion des permissions
### Améliorations techniques
- [ ] Types TypeScript stricts pour Supabase
- [ ] Tests unitaires et d'intégration
- [ ] Optimisation des performances
- [ ] PWA (Progressive Web App)
## 🤝 Support
Pour toute question ou problème :
1. Vérifiez ce guide de configuration
2. Consultez la documentation Supabase
3. Vérifiez les logs de développement
4. Créez une issue sur GitHub si nécessaire
---
**Application prête à l'emploi pour la démocratie participative ! 🗳️**