Politique de confidentialité — Octavius¶
Version 1.0 — En vigueur à compter du 16 mai 2026.
⚠️ Avis légal : ce document constitue un projet de politique de confidentialité conforme au RGPD (Règlement UE 2016/679). Avant toute mise en production publique, il doit être relu et validé par un avocat ou un DPO. Les variables marquées
[À COMPLÉTER]doivent être renseignées. Phase 4.5 du plan d'action.
1. Identité du responsable de traitement¶
Le responsable du traitement de vos données personnelles est :
- Raison sociale : [À COMPLÉTER]
- Adresse : [À COMPLÉTER]
- SIREN / SIRET : [À COMPLÉTER]
- Contact RGPD :
privacy@octaviusfr.com - Délégué à la protection des données (DPO) : [À COMPLÉTER si désigné — obligatoire au-delà d'un certain seuil de traitement systématique]
2. Principes appliqués¶
Octavius respecte les principes du RGPD :
- Minimisation : seules les données strictement nécessaires sont collectées.
- Finalité : chaque donnée a une finalité explicite et limitée.
- Sécurité : chiffrement Fernet (AES-128-CBC + HMAC-SHA256) pour les contenus sensibles, hash PBKDF2-SHA256 600 000 itérations pour les mots de passe, sanitization stricte des entrées utilisateur, isolation multi-tenant entre serveurs Discord.
- Conservation limitée : purges automatiques (180 jours pour les tickets fermés, 90 jours pour l'audit log avant anonymisation).
- Transparence : ce document décrit l'intégralité des traitements.
- Droit d'effacement : commande
/mydata deletequi supprime ou anonymise vos données en quelques secondes.
3. Données collectées et finalités¶
3.1 Identifiants Discord (obligatoires)¶
| Donnée | Finalité | Base légale | Conservation |
|---|---|---|---|
user_id (Discord) |
Identifier l'utilisateur pour le leveling, les tickets, l'IA, l'audit | Exécution du contrat | Tant que vous utilisez le service ou jusqu'à /mydata delete |
guild_id (serveur) |
Stocker la configuration par serveur, isoler les données entre serveurs | Exécution du contrat | Tant que le bot est sur le serveur |
role_id |
Auto-détection des rôles configurés (Admin/Staff/Membre/Fondateur) | Intérêt légitime | Tant que le rôle existe |
channel_id |
Diriger les logs, les annonces, l'IA dans les bons salons | Exécution du contrat | Tant que la config est active |
Sources : migrations/001_init.sql, cogs/_checks.py (matching NFKD).
3.2 Contenu généré par l'utilisateur¶
Mémoire conversationnelle IA¶
- Stockage : table PostgreSQL
ia_memory(BYTEA chiffré) + cache JSONmemory_state.json. - Chiffrement : Fernet (AES-128-CBC + HMAC-SHA256) avec clé d'environnement
MEMORY_ENCRYPTION_KEY. La base de données ne stocke jamais le texte en clair. - Plafond : 10 à 50 messages selon le plan (Free/Bronze/Silver/Gold).
- Filtrage sensible : avant chiffrement, un filtre regex retire les motifs ressemblant à des tokens, mots de passe ou clés API.
- Reset automatique : 30 minutes d'inactivité, ou mots-clés (« nouvelle question », « change de sujet »).
- Reset manuel :
/memory reset. - Opt-out :
/memory off(cross-conversation, persistant). - Conservation : indéfinie jusqu'à reset, opt-out ou
/mydata delete.
Sources : cogs/ai_bot.py, utils/storage/ia_memory_pg.py, migrations/001_init.sql:102-120.
Tickets de support¶
- Stockage : tables
tickets+ticket_messages(PostgreSQL), transcripts HTML danstranscripts/{guild_id}/{ticket_id}.html. - Chiffrement : non (contenu support, accessible aux administrateurs du serveur uniquement).
- Conservation :
- Ticket ouvert : indéfini.
- Ticket fermé : 180 jours, puis suppression automatique en cascade (ticket + messages + transcript).
- Anonymisation RGPD : via
/mydata delete, lesubjectdevient[anonymisé RGPD], leowner_iddevient0, les messages du client sont supprimés (les réponses staff restent pour la traçabilité support).
Sources : cogs/rgpd.py:412-443 (purge_inactive_tickets, tasks.loop 24h), cogs/rgpd.py:297-407 (mydata_delete).
Custom commands¶
- Stockage : table
custom_commands(response,created_by,use_count). - Effacement RGPD :
created_byest mis àNULLlors d'un/mydata delete.
Sources : migrations/006_custom_commands.sql, cogs/rgpd.py.
Feedback¶
- Stockage : table
feedback(catégorie, message, user_id, guild_id, is_read, read_by). - Sanitization :
InputSanitizer.clean_text(anti-XSS et anti-mention) avant insertion. - Conservation : indéfinie. Les administrateurs du serveur et l'équipe Octavius peuvent les consulter.
Sources : migrations/010_feedback.sql, cogs/feedback.py.
3.3 Données dérivées (statistiques)¶
| Donnée | Finalité | Conservation |
|---|---|---|
user_xp.xp / level |
Gamification leveling | Jusqu'à /mydata delete (suppression complète) |
total_messages |
Statistique d'usage (/rank) |
Idem |
last_message_at |
Cooldown 60 s sur l'attribution XP | Idem |
custom_commands.use_count |
Statistiques d'usage commandes | Indéfinie |
guild_snapshots |
Anti-nuke rollback | 24 h (throttle 1/h, max 24 snapshots/guild) |
Sources : migrations/002_leveling.sql, migrations/005_guild_snapshots.sql, utils/snapshot_history.py.
3.4 Compte web (tableau de bord)¶
- Stockage : table
accounts(username,email,discord_id,pwd_hash,pwd_salt,oauth_access_token,oauth_refresh_token,oauth_expires_at). - Authentification : OAuth2 Discord (méthode principale recommandée depuis Phase 4.1). Le mot de passe applicatif est en voie de dépréciation.
- Sécurité des mots de passe : si encore utilisé, hashé via PBKDF2-SHA256 avec 600 000 itérations et sel aléatoire 32 octets (alignement OWASP 2023).
- Sécurité des tokens OAuth Discord : chiffrés via Fernet avec la clé
OAUTH_TOKEN_ENCRYPTION_KEYavant stockage. - Conservation : tant que le compte est actif. Suppression du compte sur demande (
privacy@octaviusfr.com) ou via fermeture du compte Discord lié.
Sources : migrations/001_init.sql:35-56, utils/crypto.py, api_central.py (Fernet OAuth).
3.5 Paiements¶
- Stockage local : table
subscriptions(stripe_customer_id,stripe_subscription_id,stripe_price_id,tier,status,current_period_end,is_lifetime). - Stockage chez Stripe : nom, adresse de facturation, numéro de carte chiffré, historique des transactions. Octavius ne stocke jamais les données de carte bancaire — tout transite par Stripe via Stripe Checkout.
- Conservation : tant que l'abonnement est actif + 10 ans pour les obligations comptables (article L.123-22 du Code de commerce).
Sources : migrations/008_subscriptions.sql, utils/stripe_client.py.
3.6 Programme d'affiliation¶
- Stockage : tables
affiliates(code, statut, taux de commission,payout_method,payout_detailsJSONB),affiliate_referrals,affiliate_commissions. - Données de paiement affilié : selon le mode choisi (PayPal email, IBAN). Stockés dans
payout_detailsJSONB. Pour les IBAN, un chiffrement applicatif est recommandé (à implémenter en V2). - Conservation : indéfinie tant que l'affilié est actif. Suppression sur demande après règlement des commissions dues.
Sources : migrations/009_affiliates.sql, cogs/affiliate.py.
3.7 Données techniques¶
| Donnée | Finalité | Conservation |
|---|---|---|
| Adresse IP | Anti-bruteforce (/auth/login), anti-flood /ai/* |
Fenêtre glissante du RateLimiter (5 min à 1 h max) |
| Logs nginx | Diagnostic, sécurité (Phase 1.5bis) | Rotation 10 MB × 3 fichiers (auto-purge) |
| Logs bot | Diagnostic application | Rotation 5 MB × 5 fichiers |
| Métriques Prometheus | octavius_http_requests_total, latences |
Compteurs in-memory, exposés sur /metrics |
| Sentry breadcrumbs (optionnel) | Crash reporting | 30 jours côté Sentry (envoi conditionné à SENTRY_DSN, send_default_pii=False) |
Sources : utils/rate_limit.py, utils/observability.py, nginx/nginx.conf.
3.8 Audit de modération¶
- Stockage : table
mod_audit_log(action,actor_id,target_id,reason,metadataJSONB). - Actions tracées : ban, unban, kick, mute, unmute, warn, clear, lockdown, unlockdown, antinuke_restore.
- Conservation :
- 0 à 90 jours : identifiants conservés (enquête support, obligations légales modération).
- À partir de 90 jours : anonymisation automatique (actor_id, target_id, reason et metadata mis à
NULL). L'horodatage, l'action et leguild_idsont conservés pour des statistiques agrégées. - Tâche automatique :
anonymize_loop(tasks.loop(hours=24)) —cogs/audit.py:80-82.
Sources : migrations/007_mod_audit_log.sql, utils/audit_log.py:89-117.
4. Bases légales du traitement (article 6 RGPD)¶
| Traitement | Base légale |
|---|---|
| Fourniture du service (commandes bot, dashboard) | Exécution du contrat (art. 6.1.b) |
| Mémoire conversationnelle IA | Consentement (art. 6.1.a) — opt-in implicite, opt-out via /memory off |
| Modération et audit | Intérêt légitime (art. 6.1.f) — sécurité du serveur, lutte contre les abus |
| Rate-limiting (IP) | Intérêt légitime (art. 6.1.f) — sécurité du Service |
| Paiements (Stripe) | Exécution du contrat (art. 6.1.b) + obligation légale comptable (art. 6.1.c) |
Statistiques agrégées (/analytics) |
Intérêt légitime (art. 6.1.f) — amélioration du Service |
| Logs et monitoring (Sentry, Prometheus, nginx) | Intérêt légitime (art. 6.1.f) — sécurité et continuité |
5. Sous-traitants et destinataires¶
Vos données sont transmises aux sous-traitants suivants, chacun lié par un accord garantissant un niveau de protection conforme au RGPD :
| Sous-traitant | Fonction | Données transmises | Localisation des données | Encadrement juridique |
|---|---|---|---|---|
| Discord Inc. | Plateforme support (le bot tourne sur Discord) | Tout ce que vous y envoyez (messages, IDs, rôles) | États-Unis (transfert hors UE) | Clauses contractuelles types CE 2021 + DPF |
| Google LLC (Gemini) | Inférence IA pour /ia, /ia_image |
Le message courant + la mémoire conversationnelle (déchiffrée juste avant l'appel) | États-Unis | Clauses contractuelles types CE 2021 + DPF |
| Stripe Inc. / Stripe Payments Europe | Encaissement abonnements + Lifetime | Email, nom, adresse, données de carte chiffrées | UE (Irlande) + États-Unis | Stripe Data Processing Agreement |
| Sentry (Functional Software Inc.) | Crash reporting (optionnel, si configuré) | Exception stack traces, breadcrumbs (IP/PII stripped via send_default_pii=False) |
États-Unis | Sentry DPA + Clauses contractuelles types |
| Hébergeur VPS ([À COMPLÉTER : Hetzner GmbH / OVH SAS / etc.]) | Hébergement du bot + base de données | L'ensemble des données du Service | UE | [À COMPLÉTER] |
| PayPal / banque destinataire (affiliés) | Versement des commissions affiliation | Email PayPal ou IBAN, montant | Selon la banque | À mettre en place avec le DPO |
Transferts hors UE : pour les sous-traitants américains (Discord, Google, Sentry), les transferts sont encadrés par les Clauses contractuelles types de la Commission européenne (décision 2021/914), ainsi que, pour Google, l'adhésion au Data Privacy Framework UE–US (juillet 2023).
6. Durées de conservation — récapitulatif¶
| Donnée | Durée |
|---|---|
| Mémoire IA chiffrée | Jusqu'à reset (30 min inactivité) ou /mydata delete |
| Tickets fermés | 180 jours, puis suppression cascade automatique |
| Audit modération identifié | 90 jours, puis anonymisation automatique |
| Audit modération anonymisé | Conservé indéfiniment (stats agrégées) |
| XP / leveling | Jusqu'à /mydata delete |
| Custom commands | Jusqu'à suppression manuelle ou anonymisation /mydata delete |
| Compte web + tokens OAuth chiffrés | Tant que le compte est actif |
| Abonnement Stripe | Tant qu'actif + 10 ans (obligation comptable) |
| Logs nginx / bot | Rotation automatique (taille + nombre de fichiers) |
| Snapshots anti-nuke | 24 dernières entrées par serveur (rolling) |
7. Vos droits¶
Vous disposez des droits suivants (articles 15 à 22 du RGPD) :
7.1 Droit d'accès (art. 15)¶
Consulter l'ensemble des données vous concernant.
- Méthode rapide : commande Discord
/mydata view(affichage immédiat). - Export complet :
/mydata export— produit un fichier JSON conforme à l'art. 20 (portabilité), envoyé en DM éphémère.
7.2 Droit de rectification (art. 16)¶
Modifier les données inexactes. La plupart des données sont auto-modifiables via le dashboard ou les commandes (/setrole, /setchannel, etc.). Pour les données de compte (email, etc.), contactez privacy@octaviusfr.com.
7.3 Droit à l'effacement (art. 17)¶
- Méthode rapide : commande Discord
/mydata delete SUPPRIMER. - Effets : suppression XP cross-guild, anonymisation tickets owned, suppression messages clients, anonymisation custom commands.
- Limites : les réponses staff dans les tickets sont conservées (traçabilité support), les audit logs sont anonymisés au bout de 90 jours selon le calendrier de rétention.
- Effacement complet du compte web :
privacy@octaviusfr.com.
7.4 Droit à la portabilité (art. 20)¶
Export structuré et lisible (/mydata export).
7.5 Droit d'opposition (art. 21)¶
Vous pouvez vous opposer aux traitements fondés sur l'intérêt légitime (audit, stats agrégées). Contactez privacy@octaviusfr.com en motivant votre demande.
7.6 Droit à la limitation (art. 18)¶
Possibilité de geler le traitement en cas de litige sur l'exactitude. Contactez privacy@octaviusfr.com.
7.7 Droit d'opposition au profilage automatisé (art. 22)¶
Octavius ne réalise pas de profilage automatisé produisant des effets juridiques à votre encontre. Les réponses IA sont des sorties stochastiques sans valeur décisionnelle officielle.
7.8 Droit de retirer son consentement (art. 7)¶
Pour la mémoire IA : /memory off. Le retrait n'affecte pas la licéité du traitement préalable.
7.9 Délai de réponse¶
L'Éditeur s'engage à répondre à toute demande RGPD dans un délai maximal d'un mois, prorogeable de deux mois en cas de complexité (avec notification motivée).
7.10 Réclamation auprès d'une autorité de contrôle¶
Vous pouvez introduire une réclamation auprès de la CNIL (autorité française) :
- En ligne : https://www.cnil.fr/fr/plaintes
- Par courrier : CNIL — 3 Place de Fontenoy — TSA 80715 — 75334 Paris Cedex 07
- Téléphone : +33 1 53 73 22 22
8. Sécurité¶
Mesures techniques et organisationnelles en place :
- Chiffrement en transit : TLS 1.2/1.3 obligatoire (HSTS preload, Let's Encrypt).
- Chiffrement au repos : Fernet (AES-128-CBC + HMAC-SHA256) pour la mémoire IA et les tokens OAuth.
- Hashage : PBKDF2-SHA256 à 600 000 itérations pour les mots de passe historiques.
- Sanitization stricte :
utils/sanitize.InputSanitizer(anti-XSS, anti-prompt-injection, anti-image-bomb PIL) avant toute manipulation d'entrée utilisateur. - Rate-limiting : multi-niveaux (nginx + RateLimiter applicatif) sur tous les endpoints sensibles.
- Isolation multi-tenant : audit Phase 2.1 (134 tests dont 11 dédiés à l'isolation entre serveurs Discord).
- Audit log immuable côté code : la table
mod_audit_logn'expose pas d'UPDATE(insert-only + anonymisation programmée). - Bind réseau restrictif : Postgres et Redis ne sont pas exposés sur Internet (réseau interne docker, override
ports: !reset []en prod). - Filtres IA stricts : 9
SafetySettingGemini (BLOCK_LOW_AND_ABOVEsur harassment, hate speech, sexually explicit, dangerous content +BLOCK_MEDIUM_AND_ABOVEsur civic integrity et catégories image). - Anti-image-bomb : décodage Pillow avec limites strictes (dimensions, format).
- Tests automatisés : 134 tests sécurité (sanitization, crypto, rate-limit, schemas Pydantic, isolation).
9. Cookies et traceurs¶
L'interface web utilise uniquement des cookies strictement nécessaires au fonctionnement :
session_token: authentification dashboard (HttpOnly, Secure, SameSite=Lax).csrf_token: protection anti-CSRF.
Aucun cookie de mesure d'audience ou publicitaire n'est posé. Aucun pixel tiers (Google Analytics, Meta Pixel, etc.) n'est intégré. Aucun consentement n'est donc requis au sens de la directive ePrivacy et de l'article 82 de la loi Informatique et Libertés.
Les contenus statiques chargés depuis des CDN tiers (Font Awesome, fontes Google) peuvent involontairement collecter l'adresse IP. Pour la production, l'équipe Octavius prévoit le self-hosting de ces ressources (Phase 3.A.* du plan d'action).
10. Mineurs¶
Le service est destiné à un public ayant au moins 13 ans (ou l'âge minimal Discord dans votre juridiction ; 15 ans en France pour le consentement RGPD autonome). En cas de soupçon de traitement de données d'un mineur en dessous de cet âge sans consentement parental, contactez privacy@octaviusfr.com pour suppression immédiate.
11. Modifications¶
Cette politique peut évoluer. Les modifications substantielles vous seront notifiées :
- bannière dans le tableau de bord pendant 30 jours,
- message dans le serveur de support,
- email aux abonnés payants.
L'historique complet des versions est public dans le dépôt Git (commande git log docs/privacy-policy.md).
12. Contact¶
| Sujet | Contact |
|---|---|
| Demande RGPD générale | privacy@octaviusfr.com |
| Suppression de compte / données | Commande Discord /mydata delete OU privacy@octaviusfr.com |
| Vulnérabilité de sécurité | security@octaviusfr.com (PGP fourni sur demande) |
| Réclamation contractuelle | support@octaviusfr.com |
| Autorité de contrôle | CNIL — https://www.cnil.fr/fr/plaintes |
Document : docs/privacy-policy.md. En cas de divergence entre cette politique et une autre communication, ce document fait foi.