feat(landing): pages légales + CTAs trial 30 jours
All checks were successful
Build & Deploy Landing / build-and-deploy (push) Successful in 19s

- CGV B2B SaaS (16 sections, conforme avec Stripe en place)
- Mentions légales allégées au strict minimum LCEN
- Politique de confidentialité resserrée :
  - retrait des détails infra (Proxmox, K3s, etc.)
  - sous-traitants par catégorie (Stripe / Resend / Mistral AI)
  - section sécurité standardisée
  - cookies simplifiés
- Période d'essai harmonisée à 30 jours partout (landing + CGV)
- Insistance sur l'hébergement et les données en France
This commit is contained in:
ordinarthur 2026-05-08 14:29:22 +02:00
parent f59b11f836
commit 5127cd2c9e
6 changed files with 610 additions and 66 deletions

View File

@ -1193,6 +1193,97 @@ CronJob K3s qui run `node ace migration:run --force` avant chaque rollout. Alter
---
## 17-bis. Observability — Sentry (ADR-024)
Error monitoring API via `@sentry/node`. Init au plus tôt dans
`bin/server.ts` AVANT le boot Ignitor pour capturer même les erreurs
de bootstrap.
### Configuration
```ts
// apps/api/start/sentry.ts
// No-op si SENTRY_DSN_API absent → dev local sans bruit Sentry par défaut
```
| Aspect | Valeur | Rationale |
|---|---|---|
| Sample rate traces | 10 % prod, 100 % dev | Quota free tier (5K events/mois) |
| Sample rate profiles | 100 % | Sampled par traces de toute façon |
| `release` | `APP_VERSION` runtime (sha git) | Set par `kubectl set env` post-deploy |
| User context | `user.id` UUID seulement | Pas d'email/nom (PII minimisée) |
| `beforeSend` | drop 4xx | Validation, auth invalide = bruit |
### Capture automatique
Le `report()` du `HttpExceptionHandler` (`apps/api/app/exceptions/handler.ts`)
capture **uniquement les 5xx** (status >= 500 ou status absent). Tout le
reste — `E_INVALID_CREDENTIALS`, `E_VALIDATION_ERROR`, custom 4xx —
n'arrive **jamais** dans Sentry.
```ts
// handler.ts:report (extrait)
const isServerError = !status || status >= 500
if (isServerError) {
Sentry.captureException(error, {
tags: {
// PATTERN de route (/api/v1/checkin/:token/paid), pas l'URL réelle
// → les codes OAuth, tokens checkin, etc. ne fuitent JAMAIS dans
// les tags Sentry indexés.
url: ctx.route?.pattern ?? ctx.request.url(false),
method: ctx.request.method(),
status: status?.toString() ?? '500',
},
user: ctx.auth?.user
? { id: String(ctx.auth.user.id) }
: undefined,
})
}
```
### Capturer manuellement (cas métier)
Dans un service ou job où une exception métier doit être tracée :
```ts
import * as Sentry from '@sentry/node'
try {
await mistralOcr.extract(buffer)
} catch (err) {
Sentry.captureException(err, {
tags: { feature: 'ocr', provider: 'mistral' },
extra: { batchId, fileSize: buffer.length },
})
throw err // re-throw pour que le contrôleur fasse son job de réponse
}
```
### Tester l'intégration en prod (E2E)
Endpoint debug `/api/v1/_debug/sentry-test` (gardé par
`NODE_ENV !== 'production'` OU `DEBUG_SENTRY_TEST=true`). Pour activer
temporairement sur la prod et lancer un test :
```bash
KUBECTL="kubectl --kubeconfig ~/dev/perso/proxmox/k3s/kubeconfig.yaml -n rubis"
$KUBECTL set env deploy/rubis-api DEBUG_SENTRY_TEST=true
$KUBECTL rollout status deploy/rubis-api --timeout=120s
curl -i https://app.rubis.pro/api/v1/_debug/sentry-test
# 500 attendu — vérifier Sentry sous 30s
$KUBECTL set env deploy/rubis-api DEBUG_SENTRY_TEST-
```
### Variables d'env requises
- **K3s secret `rubis-app-secrets`** : `SENTRY_DSN_API` (DSN privé du projet rubis-api)
- **K3s ConfigMap (set par CI)** : `APP_VERSION` = sha git pour le tag release
---
## 18. Pointeurs vers l'existant
Avant de coder un endpoint, **toujours consulter** :

View File

@ -738,6 +738,93 @@ Quand tu reconstruis l'app, **rien ne se réinvente sans consulter** :
---
## 12-bis. Observability — Sentry (ADR-024)
Error monitoring + replay sur le SPA via `@sentry/react`. Init au plus tôt
dans `main.tsx` AVANT tout autre import non-essentiel pour capturer les
erreurs de bootstrap.
### Configuration
```ts
// apps/web/src/lib/sentry.ts — init basé sur VITE_SENTRY_DSN_WEB
// (no-op si DSN absent → dev local sans bruit Sentry par défaut)
```
| Aspect | Valeur | Rationale |
|---|---|---|
| Sample rate traces | 10 % prod, 100 % dev | Quota free tier (5K events/mois) |
| Sample rate replay session | **0 %** | Pas de replay sans erreur — économie quota |
| Sample rate replay sur erreur | 100 % | Capture les 30 s précédant le crash |
| `maskAllText` / `blockAllMedia` | true | Privacy par défaut, on relâche après |
| `release` | sha git court (CI build-arg) | Une régression ↔ un commit |
| User context | `user.id` UUID seulement | Pas d'email/nom (PII minimisée) |
### Triggers automatiques (déjà câblés)
- **Erreurs runtime** : `window.onerror` + `unhandledrejection` interceptés par le SDK.
- **`Sentry.ErrorBoundary`** dans `main.tsx` autour de l'app → capture les erreurs React + affiche `<FallbackError />`.
- **User context** : `authStore.setSession` appelle `Sentry.setUser({ id })`, `authStore.clear` reset.
### Capturer manuellement une erreur métier
Dans un component / handler :
```ts
import * as Sentry from "@sentry/react"
try {
await doSomethingRisky()
} catch (err) {
Sentry.captureException(err, {
tags: { feature: "ocr-import" },
extra: { batchId },
})
toast.error("Quelque chose a coincé.")
}
```
### Tester l'intégration en prod
⚠️ Les `throw` tapés dans la console DevTools **ne hittent PAS** `window.onerror`
(ils restent dans le scope d'eval du devtools). Pour un test valide :
```js
// Dans la console DevTools
setTimeout(() => { throw new Error("sentry test") }, 0)
// OU
Promise.reject(new Error("sentry test"))
```
Les deux méthodes traversent la vraie boucle d'événements de la page →
Sentry intercepte. Vérifier ensuite Sentry Dashboard → projet `rubis-web`.
Pour vérifier que le SDK est bien init :
```js
typeof __SENTRY__ // doit être "object" (sinon DSN absent au build)
```
### Source maps
`@sentry/vite-plugin` est actif au build CI (gardé par `SENTRY_AUTH_TOKEN`).
Il :
1. Upload les `.map` à Sentry (désobfuscation des stack traces)
2. **Supprime les `.map` du `dist/` final** (`filesToDeleteAfterUpload`)
→ nginx en prod ne sert pas les sourcemaps publiquement. Sécurité critique.
### Variables CI (secrets Gitea Actions)
Cf. `.gitea/workflows/deploy-web.yml`. Les 4 secrets requis :
- `SENTRY_DSN_WEB` — DSN public projet rubis-web (bake-able dans le bundle)
- `SENTRY_AUTH_TOKEN` — scope `project:releases` + `project:write` (upload sourcemaps)
- `SENTRY_ORG` — slug org Sentry
Le build est tolérant : si `SENTRY_AUTH_TOKEN` manque, le plugin Vite est skip et les sourcemaps ne sont pas uploadées (Sentry capture quand même mais stack traces minifiées).
---
## 13. Points d'attention
- **Auth Bearer en mémoire** : si l'utilisateur reload, l'access token est perdu — toujours appeler `/auth/refresh` au boot avant le render initial (cf. section 7)

406
landing/cgv.html Normal file
View File

@ -0,0 +1,406 @@
<!doctype html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="theme-color" content="#9F1239" />
<meta
name="description"
content="Conditions Générales de Vente du service Rubis sur l'ongle (SaaS de relance de factures impayées)."
/>
<meta name="robots" content="index,follow" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
<link rel="manifest" href="/site.webmanifest" />
<link rel="stylesheet" href="/_legal-shell.css" />
<title>Conditions Générales de Vente · Rubis sur l'ongle</title>
</head>
<body>
<header class="legal-header">
<div class="container">
<a href="/" class="brand">
<svg class="gem-svg" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
<polygon points="100,10 190,100 100,190 10,100" fill="#9F1239" />
<line x1="10" y1="100" x2="190" y2="100" stroke="rgba(255,255,255,0.55)" stroke-width="3" />
<line x1="55" y1="55" x2="100" y2="100" stroke="rgba(255,255,255,0.4)" stroke-width="2" />
<line x1="145" y1="55" x2="100" y2="100" stroke="rgba(255,255,255,0.4)" stroke-width="2" />
</svg>
<span>Rubis<span class="brand-suffix">sur l'ongle</span></span>
</a>
<a href="/" class="back-link">← Retour à l'accueil</a>
</div>
</header>
<main class="legal-main">
<div class="container">
<p class="eyebrow">Conditions contractuelles</p>
<h1>Conditions Générales <em>de Vente</em></h1>
<p class="lede">
Ces conditions encadrent l'utilisation du service Rubis sur l'ongle entre l'éditeur
(Arthur Barré, entrepreneur individuel) et l'utilisateur professionnel (TPE, PME,
freelance, ou personne morale française) qui souscrit à un plan payant ou utilise
la version gratuite.
</p>
<p class="last-updated">Dernière mise à jour : 7 mai 2026</p>
<div class="toc" aria-label="Sommaire">
<p class="toc-title">Sommaire</p>
<ol>
<li><a href="#definitions">Définitions</a></li>
<li><a href="#objet">Objet</a></li>
<li><a href="#acceptation">Acceptation des CGV</a></li>
<li><a href="#compte">Création du compte</a></li>
<li><a href="#service">Description du service</a></li>
<li><a href="#tarifs">Tarifs, essai et facturation</a></li>
<li><a href="#duree">Durée et résiliation</a></li>
<li><a href="#disponibilite">Disponibilité du service</a></li>
<li><a href="#obligations">Obligations de l'utilisateur</a></li>
<li><a href="#propriete">Propriété intellectuelle</a></li>
<li><a href="#donnees">Données personnelles</a></li>
<li><a href="#responsabilite">Responsabilité</a></li>
<li><a href="#force-majeure">Force majeure</a></li>
<li><a href="#modifications">Modification des CGV</a></li>
<li><a href="#cession">Cession</a></li>
<li><a href="#droit">Droit applicable et juridiction</a></li>
</ol>
</div>
<h2 id="definitions">1. Définitions</h2>
<ul>
<li><strong>Éditeur</strong> : Arthur Barré, entrepreneur individuel, responsable
de la publication et de l'édition du service Rubis sur l'ongle (cf.
<a href="/mentions-legales.html">mentions légales</a>).</li>
<li><strong>Utilisateur</strong> : toute personne physique ou morale exerçant à
titre professionnel qui crée un compte et utilise le service.</li>
<li><strong>Service</strong> : la plateforme SaaS « Rubis sur l'ongle » accessible
depuis <a href="https://app.rubis.pro">app.rubis.pro</a>, permettant d'automatiser
la relance de factures impayées.</li>
<li><strong>Compte</strong> : espace utilisateur protégé par un identifiant et un
mot de passe permettant d'accéder au service.</li>
<li><strong>Plan</strong> : formule d'abonnement choisie par l'utilisateur (Free,
Pro ou Business) déterminant le périmètre des fonctionnalités et le tarif.</li>
<li><strong>Client final</strong> : tiers à qui l'utilisateur facture des
prestations et à qui les emails de relance sont adressés.</li>
</ul>
<h2 id="objet">2. Objet</h2>
<p>
Les présentes conditions ont pour objet de définir les modalités contractuelles
applicables à l'utilisation du service Rubis sur l'ongle, qui permet à l'utilisateur
de&nbsp;:
</p>
<ul>
<li>Importer des factures (PDF, image, ou saisie manuelle) ;</li>
<li>Configurer des plans de relance avec emails programmés ;</li>
<li>Envoyer automatiquement ces relances à ses clients finaux selon la cadence
choisie ;</li>
<li>Suivre le statut des factures, valider les paiements, gérer les mises en demeure.</li>
</ul>
<h2 id="acceptation">3. Acceptation des CGV</h2>
<p>
L'inscription au service et la création d'un compte impliquent l'acceptation pleine
et entière des présentes CGV par l'utilisateur, ainsi que de la
<a href="/confidentialite.html">politique de confidentialité</a>.
</p>
<p>
L'utilisateur déclare agir dans le cadre d'une activité professionnelle. Le service
n'est <strong>pas destiné aux consommateurs</strong> au sens du Code de la
consommation.
</p>
<h2 id="compte">4. Création du compte</h2>
<p>
L'inscription nécessite la fourniture d'une adresse email valide et d'un mot de
passe (ou d'une connexion via un fournisseur d'identité tiers — Google, Microsoft).
L'utilisateur s'engage à fournir des informations exactes et à les tenir à jour.
</p>
<p>
L'utilisateur est seul responsable de la confidentialité de ses identifiants et de
toutes les actions effectuées depuis son compte. En cas de soupçon de compromission,
il doit immédiatement réinitialiser son mot de passe et nous prévenir à
<a href="mailto:contact@rubis.pro">contact@rubis.pro</a>.
</p>
<h2 id="service">5. Description du service</h2>
<p>
Le service comprend, selon le plan souscrit, les fonctionnalités suivantes&nbsp;:
</p>
<table class="def-table">
<thead>
<tr>
<th>Plan</th>
<th>Périmètre principal</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Free</strong></td>
<td>
Jusqu'à 5 factures actives en relance simultanément. Plans de relance
standards. OCR limité. Un seul utilisateur.
</td>
</tr>
<tr>
<td><strong>Pro</strong></td>
<td>
Factures et OCR illimités, plans personnalisables, statistiques détaillées,
relances signées au nom de l'utilisateur (sous-domaine Rubis), support
prioritaire. Un seul utilisateur.
</td>
</tr>
<tr>
<td><strong>Business</strong></td>
<td>
Tout du Pro, plus jusqu'à 5 collaborateurs, envoi des relances depuis le
domaine propre de l'utilisateur (configuration DKIM/SPF), onboarding personnel.
</td>
</tr>
</tbody>
</table>
<p>
La liste détaillée et à jour des fonctionnalités est disponible sur la page
<a href="/#pricing">tarifs</a> du site.
</p>
<h2 id="tarifs">6. Tarifs, essai et facturation</h2>
<h3>6.1 Tarifs</h3>
<p>
Les tarifs en vigueur sont indiqués sur la page tarifs du site, en euros et hors
taxes. La TVA, lorsque applicable, est ajoutée selon le taux en vigueur (20 % en
France métropolitaine).
</p>
<h3>6.2 Période d'essai gratuite</h3>
<p>
Tout nouvel utilisateur bénéficie d'une période d'essai de <strong>30 jours</strong>
permettant l'accès au plan Pro sans engagement et sans carte bancaire requise.
À l'issue de cette période, l'utilisateur peut souscrire à un plan payant ou
poursuivre gratuitement avec le plan Free (5 factures actives).
</p>
<h3>6.3 Modalités de paiement</h3>
<p>
Le paiement des plans payants s'effectue en ligne via notre prestataire de
paiement <strong>Stripe</strong>, par carte bancaire ou prélèvement SEPA. Aucune
donnée bancaire n'est stockée sur les serveurs de l'éditeur.
</p>
<p>
Le règlement est effectué d'avance, par mensualités successives, à la date
anniversaire de la souscription.
</p>
<h3>6.4 Facturation</h3>
<p>
Une facture est émise automatiquement à chaque échéance et mise à disposition dans
l'espace utilisateur (rubrique « Paramètres Facturation »). Elle est également
envoyée par email à l'adresse de contact renseignée.
</p>
<h3>6.5 Défaut de paiement</h3>
<p>
En cas de défaut de paiement (rejet bancaire, expiration de la carte, etc.), une
relance automatique est envoyée à l'utilisateur. À défaut de régularisation sous 14
jours, l'éditeur se réserve le droit de suspendre l'accès aux fonctionnalités
payantes du compte. Les données de l'utilisateur restent conservées pendant cette
période, et l'accès est rétabli dès la régularisation.
</p>
<h3>6.6 Évolution tarifaire</h3>
<p>
L'éditeur se réserve le droit de modifier ses tarifs. Toute évolution est notifiée
par email à l'utilisateur au moins <strong>30 jours</strong> avant son entrée en
vigueur. L'utilisateur peut alors résilier son abonnement avant l'application du
nouveau tarif sans pénalité.
</p>
<h2 id="duree">7. Durée et résiliation</h2>
<h3>7.1 Durée</h3>
<p>
L'abonnement est conclu pour une durée d'un mois et se renouvelle tacitement à
chaque échéance, sauf résiliation par l'une des parties.
</p>
<h3>7.2 Résiliation par l'utilisateur</h3>
<p>
L'utilisateur peut résilier son abonnement à tout moment, en un clic, depuis son
espace personnel (« Paramètres Facturation Annuler l'abonnement »). La
résiliation prend effet à la fin de la période en cours (déjà payée). Aucun
remboursement prorata temporis n'est dû.
</p>
<p>
La suppression complète du compte (et de toutes les données associées) peut être
demandée par email à <a href="mailto:contact@rubis.pro">contact@rubis.pro</a> ou
via le bouton dédié dans les paramètres. Voir la
<a href="/confidentialite.html">politique de confidentialité</a> pour les durées
de conservation post-suppression.
</p>
<h3>7.3 Résiliation par l'éditeur</h3>
<p>
L'éditeur peut résilier le compte de l'utilisateur, sans préavis ni indemnité,
dans les cas suivants&nbsp;:
</p>
<ul>
<li>Défaut de paiement persistant (au-delà de 30 jours) ;</li>
<li>Violation manifeste des présentes CGV ou de la législation en vigueur ;</li>
<li>Utilisation du service à des fins illicites, frauduleuses, de harcèlement ou
de spam ;</li>
<li>Atteinte à la sécurité ou à l'intégrité du service.</li>
</ul>
<h2 id="disponibilite">8. Disponibilité du service</h2>
<p>
L'éditeur met en œuvre les moyens raisonnables pour assurer la disponibilité du
service 24h/24 et 7j/7. Aucun engagement de disponibilité chiffré (SLA) n'est
contractuellement garanti dans cette version. Des interruptions peuvent survenir
pour des opérations de maintenance, des mises à jour, ou des causes indépendantes
de la volonté de l'éditeur.
</p>
<p>
Les opérations de maintenance planifiée sont annoncées à l'avance par email ou
notification dans l'application lorsque possible.
</p>
<h2 id="obligations">9. Obligations de l'utilisateur</h2>
<p>L'utilisateur s'engage à&nbsp;:</p>
<ul>
<li>Utiliser le service conformément à sa destination, à la législation française
et aux usages commerciaux loyaux&nbsp;;</li>
<li>Respecter le cadre légal applicable aux relances de factures, notamment la
<strong>loi LME</strong> sur les délais de paiement et les règles de procédure
civile concernant la mise en demeure&nbsp;;</li>
<li>S'assurer du caractère professionnel et licite de ses relations commerciales
avec ses clients finaux&nbsp;;</li>
<li>Ne pas utiliser le service pour adresser des communications non sollicitées
(spam) à des destinataires sans relation commerciale préexistante&nbsp;;</li>
<li>Disposer du droit d'utilisation des données client (email, nom, etc.) qu'il
renseigne dans le service&nbsp;;</li>
<li>Ne pas tenter de contourner les limitations techniques du service ou
d'extraire massivement des données via des moyens automatisés non documentés.</li>
</ul>
<p>
La <strong>mise en demeure</strong> est traitée par le service comme une étape de
plan particulière nécessitant une <strong>validation manuelle</strong> de
l'utilisateur avant envoi. L'éditeur ne saurait être tenu responsable du contenu
ou de la qualification juridique de cette mise en demeure.
</p>
<h2 id="propriete">10. Propriété intellectuelle</h2>
<p>
La marque « Rubis sur l'ongle », le logo (◆), les textes, le code source, les
chartes graphiques et l'ensemble des éléments composant le service sont la propriété
exclusive de l'éditeur ou de ses partenaires.
</p>
<p>
L'utilisateur conserve l'intégralité de la propriété sur les <strong>données qu'il
importe ou crée</strong> dans le service (factures, plans de relance, templates
d'emails personnalisés, données clients). L'éditeur ne dispose que d'un droit
d'usage strictement limité à la fourniture du service.
</p>
<h2 id="donnees">11. Données personnelles</h2>
<p>
Le traitement des données personnelles par l'éditeur est régi par notre
<a href="/confidentialite.html">politique de confidentialité</a>, qui fait partie
intégrante des présentes CGV.
</p>
<p>
Pour les données des <strong>clients finaux</strong> de l'utilisateur (emails,
noms, etc.), l'éditeur agit en tant que <strong>sous-traitant</strong> au sens de
l'article 28 du RGPD. Un avenant DPA (Data Processing Agreement) peut être fourni
sur demande à <a href="mailto:contact@rubis.pro">contact@rubis.pro</a>.
</p>
<h2 id="responsabilite">12. Responsabilité</h2>
<p>
L'éditeur fournit un outil d'assistance à l'envoi de relances automatisées.
L'<strong>utilisateur reste seul responsable</strong>&nbsp;:
</p>
<ul>
<li>Du contenu des emails envoyés à ses clients ;</li>
<li>De la légalité et de la qualité de la relation commerciale qui motive la
relance ;</li>
<li>De la qualification juridique éventuelle d'une mise en demeure ;</li>
<li>De l'exactitude des données saisies dans le service.</li>
</ul>
<p>
La responsabilité de l'éditeur est strictement limitée aux dommages directs et
prévisibles, liés à un défaut prouvé du service. Les dommages indirects
(notamment&nbsp;: perte de données, perte de chiffre d'affaires, perte de clientèle,
atteinte à l'image) sont exclus dans toute la mesure permise par la loi.
</p>
<p>
En tout état de cause, et conformément aux usages commerciaux entre professionnels,
la responsabilité totale de l'éditeur est plafonnée au montant des sommes
effectivement versées par l'utilisateur au titre des 12 mois précédant le fait
générateur de la responsabilité.
</p>
<h2 id="force-majeure">13. Force majeure</h2>
<p>
L'éditeur ne saurait être tenu responsable d'un manquement à ses obligations en
cas de survenance d'un événement de force majeure au sens de l'article 1218 du
Code civil (catastrophe naturelle, attaque informatique majeure, panne réseau
d'envergure, décision gouvernementale, etc.).
</p>
<h2 id="modifications">14. Modification des CGV</h2>
<p>
L'éditeur peut modifier les présentes CGV pour refléter des évolutions du service,
de la législation ou des conditions commerciales. Toute modification substantielle
est notifiée à l'utilisateur par email au moins <strong>30 jours</strong> avant
son entrée en vigueur.
</p>
<p>
La poursuite de l'utilisation du service au-delà de cette période vaut acceptation
des nouvelles CGV. À défaut, l'utilisateur peut résilier son abonnement sans
pénalité avant l'entrée en vigueur des nouvelles conditions.
</p>
<h2 id="cession">15. Cession</h2>
<p>
L'éditeur peut librement céder les présentes CGV ainsi que les contrats en cours
dans le cadre d'une opération de restructuration, de fusion ou de cession
d'activité. L'utilisateur en sera informé par email.
</p>
<h2 id="droit">16. Droit applicable et juridiction</h2>
<p>
Les présentes CGV sont régies par le droit français. Tout litige relatif à leur
formation, exécution ou interprétation, qui n'aurait pu être réglé à l'amiable,
relèvera de la compétence exclusive des tribunaux français du siège de l'éditeur,
y compris en cas de pluralité de défendeurs ou d'appel en garantie, et nonobstant
toute clause contraire éventuelle.
</p>
<p>
Avant toute action contentieuse, les parties s'engagent à rechercher une solution
amiable, par échange écrit à <a href="mailto:contact@rubis.pro">contact@rubis.pro</a>,
dans un délai raisonnable.
</p>
</div>
</main>
<footer class="legal-footer">
<div class="container">
<a href="/" class="brand">
<svg class="gem-svg" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
<polygon points="100,10 190,100 100,190 10,100" fill="#9F1239" />
</svg>
Rubis sur l'ongle
</a>
<nav>
<a href="/">Accueil</a>
<a href="https://app.rubis.pro">Lancer Rubis</a>
<a href="/mentions-legales.html">Mentions légales</a>
<a href="/cgv.html">CGV</a>
<a href="/confidentialite.html">Confidentialité</a>
</nav>
<div>© 2026 · Made in France 🇫🇷</div>
</div>
</footer>
</body>
</html>

View File

@ -78,7 +78,7 @@
<h3>2.1 Données d'inscription et de compte</h3>
<ul>
<li><strong>Email</strong> (identifiant de connexion + canal de notification check-in)</li>
<li><strong>Mot de passe</strong> (stocké hashé via Argon2 — nous ne pouvons pas le lire)</li>
<li><strong>Mot de passe</strong> (stocké de manière chiffrée et irréversible)</li>
<li><strong>Nom complet</strong> (signature des relances)</li>
<li><strong>Nom de l'organisation et SIRET</strong> (optionnel, pour les mises en demeure formelles)</li>
</ul>
@ -98,9 +98,9 @@
<h3>2.3 Données techniques et journaux</h3>
<ul>
<li>Logs serveur (adresse IP, user agent, date/heure de connexion) — conservés 30 jours pour la sécurité</li>
<li>Cookies de session (refresh token httpOnly) — durée de vie 30 jours</li>
<li>Identifiants Stripe Customer/Subscription (en cas d'abonnement payant)</li>
<li>Journaux de connexion (adresse IP, date) — conservés à des fins de sécurité</li>
<li>Cookie de session pour maintenir la connexion</li>
<li>Identifiants techniques de notre prestataire de paiement (en cas d'abonnement payant)</li>
</ul>
<h2 id="finalites">3. Finalités et bases légales</h2>
@ -141,9 +141,9 @@
<h2 id="sous-traitants">4. Sous-traitants et hébergement</h2>
<p>
Tout l'hébergement principal (base de données, fichiers PDF, application) reste sur
notre infrastructure auto-hébergée en France. Quelques services tiers spécialisés
interviennent uniquement pour des fonctions ciblées&nbsp;:
L'application, la base de données et les fichiers utilisateurs sont hébergés
<strong>en France</strong>. Trois sous-traitants spécialisés interviennent pour des
fonctions ciblées&nbsp;:
</p>
<table class="def-table">
<thead>
@ -155,32 +155,21 @@
<tbody>
<tr>
<td><strong>Stripe</strong></td>
<td>
Traitement des paiements et abonnements. Données : email, nom, CB (jamais
stockée chez nous, gérée par Stripe). Stripe est certifié PCI-DSS niveau 1.
Hébergement principal&nbsp;: Irlande (UE).
</td>
<td>Traitement des paiements. Hébergement&nbsp;: Union européenne.</td>
</tr>
<tr>
<td><strong>Resend</strong></td>
<td>
Envoi des emails transactionnels (relances et confirmations). Données :
adresses email, contenu des emails. Hébergement&nbsp;: UE/US avec
clauses contractuelles types.
</td>
<td>Envoi des emails transactionnels et de relance. Hébergement&nbsp;: Union européenne (clauses contractuelles types pour les éventuels traitements hors UE).</td>
</tr>
<tr>
<td><strong>Mistral AI</strong></td>
<td>
OCR sur les factures uploadées. Les fichiers sont envoyés à Mistral pour
extraction du texte puis supprimés de leur côté. Hébergement&nbsp;: France.
</td>
<td>Reconnaissance du texte sur les factures importées. Hébergement&nbsp;: France.</td>
</tr>
</tbody>
</table>
<p>
Aucun transfert hors UE n'a lieu sans encadrement contractuel approprié (clauses
contractuelles types de la Commission européenne).
Aucun transfert de données hors Union européenne n'a lieu sans encadrement
contractuel approprié.
</p>
<h2 id="duree">5. Durée de conservation</h2>
@ -233,44 +222,19 @@
au fonctionnement du service. Aucun cookie publicitaire ni de mesure d'audience
tierce n'est déposé.
</p>
<table class="def-table">
<thead>
<tr>
<th>Cookie</th>
<th>Rôle &amp; durée</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>rubis_refresh</code></td>
<td>Cookie httpOnly maintenant la session connectée. Durée : 30 jours.</td>
</tr>
<tr>
<td>localStorage <code>access_token</code></td>
<td>
Token JWT de courte durée (30 min) pour authentifier les appels API. Pas un
cookie au sens technique mais un stockage local du navigateur.
</td>
</tr>
<tr>
<td>localStorage <code>rubis.sidebar.collapsed</code></td>
<td>Préférence d'affichage (sidebar repliée ou non). Aucun tracking.</td>
</tr>
</tbody>
</table>
<p>
Un cookie de session permet de maintenir la connexion à votre compte. Aucun
consentement préalable n'est requis pour ces cookies fonctionnels (article 82 de
la loi Informatique et Libertés).
</p>
<h2 id="securite">8. Sécurité</h2>
<p>
Nous appliquons les mesures de sécurité usuelles pour un service SaaS&nbsp;:
Nous mettons en œuvre les mesures techniques et organisationnelles appropriées
pour préserver la confidentialité, l'intégrité et la disponibilité de vos données :
chiffrement des échanges, contrôle des accès, sauvegardes régulières et journalisation
des opérations sensibles.
</p>
<ul>
<li>Chiffrement des connexions TLS 1.2+ (Let's Encrypt)</li>
<li>Mots de passe hashés via Argon2id (pas de stockage en clair)</li>
<li>Tokens d'API rotatés (access tokens 30 min, refresh tokens 30 jours)</li>
<li>Restrictions d'accès aux clés Stripe par IP allowlist</li>
<li>Sauvegardes chiffrées de la base de données</li>
<li>Logs d'accès conservés et audités en cas d'incident</li>
</ul>
<h2 id="reclamation">9. Réclamation auprès de la CNIL</h2>
<p>

View File

@ -1954,7 +1954,7 @@
<div class="trust">
<span><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<polyline points="20 6 9 17 4 12" />
</svg> 3 mois gratuits puis Free 5 factures</span>
</svg> 30 jours gratuits puis Free 5 factures</span>
<span class="dot"></span>
<span>Hébergement souverain</span>
<span class="dot"></span>
@ -2511,7 +2511,7 @@
<section class="final-cta" id="lancer">
<div class="container">
<h2>Récupérez vos premières heures dès aujourd'hui.</h2>
<p>3 mois gratuits illimités, puis le plan Free continue avec 5 factures actives. Pas de carte demandée pour démarrer.</p>
<p>30 jours gratuits, puis le plan Free continue avec 5 factures actives. Pas de carte demandée pour démarrer.</p>
<div class="cta-row" style="justify-content: center; margin-top: 24px;">
<a href="https://app.rubis.pro" class="btn btn-primary">
Lancer Rubis →

View File

@ -69,15 +69,11 @@
<h2 id="hebergeur">2. Hébergement</h2>
<p>
Le site et l'application sont hébergés sur une infrastructure auto-hébergée en France
(serveurs Proxmox + cluster Kubernetes K3s) administrée directement par l'éditeur.
Toutes les données utilisateurs (factures, emails) sont stockées sur ce même
environnement, sans externalisation à un cloud tiers grand public.
<strong>Hébergeur</strong> : [À COMPLÉTER : nom de l'hébergeur]<br />
<strong>Adresse</strong> : [À COMPLÉTER : adresse postale de l'hébergeur].
</p>
<p>
Les données techniques (paiements, emails sortants, OCR) transitent par les
sous-traitants listés dans la
<a href="/confidentialite.html">politique de confidentialité</a>.
L'ensemble de l'infrastructure et des données utilisateurs est situé en France.
</p>
<h2 id="publication">3. Directeur de la publication</h2>