billisdead 45edc1fa77 Licence EUPL-1.2 + hardening anti-abus
P1 — Licence :
- Ajout du fichier LICENSE (EUPL-1.2 complet)
- README mis à jour : section licence, table docs, vars d'environnement
- En-têtes EUPL ajoutés dans les fichiers sources principaux (Flask, React)

P2 — Hardening anti-abus :
- Rate limiting Redis-ready (REDIS_URL) avec clé fingerprint + IP
- Honeypot anti-bot : champ caché côté client + vérification serveur
- Fingerprinting non-PII via FingerprintJS (hash SHA-256, colonne ideas.fingerprint_hash)
- Cooldown session : cookie httpOnly signé HMAC-SHA256 (SECRET_KEY requis)
- Détection de flood : alerte WARNING si > FLOOD_THRESHOLD soumissions / 5 min
- hCaptcha stub : intégré, activable via HCAPTCHA_SECRET_KEY + VITE_HCAPTCHA_SITE_KEY
- Nouvelles dépendances : redis (backend), @fingerprintjs/fingerprintjs + @hcaptcha/react-hcaptcha (frontend)
- docs/SECURITE_ANTI_ABUS.md : documentation complète des seuils et de la configuration

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-23 18:05:46 +02:00
2026-04-02 02:36:40 +00:00
2026-04-02 02:36:40 +00:00
2026-05-23 18:05:46 +02:00
2026-04-02 02:36:40 +00:00
2026-04-02 02:36:40 +00:00
2026-04-02 02:36:40 +00:00
2026-04-02 02:36:40 +00:00

La Voix du Peuple

Plateforme civique de démocratie participative assistée par IA

Un espace d'expression citoyenne — pas un sondage, pas une vérité établie.


Présentation

La Voix du Peuple permet à des citoyens de soumettre librement des propositions politiques en texte libre. Chaque contribution est automatiquement :

  1. Filtrée par une IA selon le droit international des droits humains (DUDH, PIDCP, CEDH, Charte UE, CERD, Statut de Rome)
  2. Intégrée à une synthèse collective structurée par thèmes
  3. Mise à disposition des élus et décideurs sous forme lisible

La plateforme ne produit pas un consensus, ni une vérité : elle donne à voir ce que des citoyens ont choisi d'exprimer, tel quel. La démarche est portée par un auteur attaché à l'expertise et au dialogue fondé sur les preuves.


Captures d'écran

Page principale — soumission et synthèse en temps réel

Page principale

À propos — concept et posture éditoriale

À propos

Fonctionnement — parcours d'une contribution

Fonctionnement

Flyer QR — diffusion physique imprimable

Flyer QR


Fonctionnalités

Fonctionnalité Description
Soumission libre Formulaire texte avec pseudonyme optionnel
Modération IA Filtre automatique fondé sur le droit international
Synthèse thématique Résumé en temps réel par Mistral Large
Export PDF Synthèse mise en page, générée côté client
Partage horodaté Copie dans le presse-papier ou partage natif mobile
Flyer QR imprimable Flyer A4 avec QR code configuré sur votre domaine
Dark mode Thème sombre pétrol
Accessibilité Police dyslexie · Contraste élevé · Texte agrandi · Navigation clavier

Stack technique

Couche Technologie
Frontend React 18 · TypeScript · Vite 7 · Tailwind CSS · shadcn/ui
Backend Python 3.11 · Flask 3 · Gunicorn
Base de données PostgreSQL 15
IA — modération Mistral Small (mistral-small-latest)
IA — synthèse Mistral Large (mistral-large-latest)
QR code qrcode.react

Installation rapide (RockyLinux)

Voir le guide complet → docs/INSTALL_ROCKY.md

# Cloner le dépôt
git clone https://homegit.gyozamancave.fr/billisdead/la-voix-du-peuple.git
cd la-voix-du-peuple

# Configurer l'environnement
cp .env.example .env
vim .env   # DATABASE_URL, MISTRAL_API_KEY, SESSION_SECRET

# Définir le domaine et construire le frontend
bash scripts/set-domain.sh https://votredomaine.fr

# Démarrer les services
systemctl start voix-du-peuple-api
systemctl start nginx

Le site écoute sur le port HTTP 8080. Vous gérez le HTTPS en amont.


Variables d'environnement clés

# Base de données
DATABASE_URL=postgresql://user:pass@localhost:5432/voix_du_peuple

# IA (Mistral recommandé — souveraineté européenne)
MISTRAL_API_KEY=sk-...

# Sécurité (obligatoire en production)
SECRET_KEY=une-longue-chaine-aleatoire-minimum-32-chars
ADMIN_SECRET=votre-mot-de-passe-admin

# Anti-abus (optionnel — valeurs par défaut raisonnables)
REDIS_URL=redis://localhost:6379/0
RATE_LIMIT_CONTRIBUTIONS=5 per minute;3 per hour
CONTRIBUTION_COOLDOWN_SECONDS=3600
FLOOD_THRESHOLD=10

# hCaptcha (optionnel — recommandé en production)
HCAPTCHA_SECRET_KEY=votre-cle-secrete

# Frontend
VITE_APP_URL=https://votredomaine.fr
VITE_HCAPTCHA_SITE_KEY=votre-cle-de-site   # Nécessite rebuild frontend

Changer de domaine (QR code)

bash scripts/set-domain.sh https://nouveaudomaine.fr
systemctl reload nginx

Synchroniser avec ce dépôt (depuis Replit)

bash scripts/push-gitea.sh

Prérequis : secret GITEA_TOKEN configuré dans Replit → Secrets.


Documentation

Document Contenu
docs/DAT.md Architecture technique complète
docs/DEX.md Guide d'exploitation et maintenance
docs/WIKI.md Page wiki — présentation générale
docs/INSTALL_ROCKY.md Installation sur RockyLinux 9
docs/GITEA_TUTO.md Synchronisation Replit → Gitea
docs/SECURITE_ANTI_ABUS.md Protections anti-bot, flood, rate limiting, hCaptcha

Licence

Ce projet est publié sous European Union Public Licence v. 1.2 (EUPL-1.2).

L'EUPL-1.2 est la licence open source officielle de l'Union européenne. Elle est :

  • Compatible avec la GPL v2/v3, l'AGPL v3 et la MPL 2.0 (cf. Appendice)
  • Reconnue par la Commission européenne et les institutions publiques de l'UE
  • Adaptée aux projets civiques et associatifs souhaitant une réutilisation libre sous condition de réciprocité (copyleft)
  • Disponible en 23 langues officielles de l'UE — voir joinup.ec.europa.eu

Ce choix est cohérent avec la posture souveraineté numérique européenne du projet et permet à toute association, mairie ou collectif de reprendre et déployer cet outil sous les mêmes conditions.

S
Description
Site d'expression citoyenne
Readme EUPL-1.2 1.6 MiB
Languages
TypeScript 81.7%
Python 13.8%
CSS 2.5%
Shell 1.3%
HTML 0.7%