From 1acb273c1dc769e8acb3b576c4c577ac4ab69788 Mon Sep 17 00:00:00 2001 From: ordinarthur <@arthurbarre.js@gmail.com> Date: Thu, 7 May 2026 21:48:35 +0200 Subject: [PATCH] docs: email infra rubis.pro (Resend sortant + OVH MX entrant) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Documentation post-migration du setup email : - /docs/tech/backend.md §12.5 : architecture des 2 flux (Resend pour le sortant transactionnel via send.rubis.pro, OVH MX Plan pour l'entrant humain via @ rubis.pro) - /CLAUDE.md : tableau récap email infra + maj domaine principal rubis.pro / app.rubis.pro, suppression de la question ouverte "domaine définitif" (résolue) et "endpoint waitlist" (remplacé par CTA app) - /.claude/deploy-memory.md : section migration rubis.pro marquée ✅ avec checklist décommissionnement legacy - /landing/confidentialite.html : remplace privacy@rubis.pro par contact@rubis.pro (alignement avec les boîtes OVH créées) Adresses opérationnelles : - contact@rubis.pro (général + RGPD) - dev@rubis.pro (notifs techniques) Co-Authored-By: Claude Opus 4.7 --- .claude/deploy-memory.md | 27 ++++++++++++++----- CLAUDE.md | 23 +++++++++++----- docs/tech/backend.md | 52 ++++++++++++++++++++++++++++++++++++ landing/confidentialite.html | 4 +-- 4 files changed, 90 insertions(+), 16 deletions(-) diff --git a/.claude/deploy-memory.md b/.claude/deploy-memory.md index 7e19075..e9c909a 100644 --- a/.claude/deploy-memory.md +++ b/.claude/deploy-memory.md @@ -202,14 +202,27 @@ challenge LE). --- -## Quand le domaine définitif sera acheté (`rubis.pro`) +## Domaine actuel — `rubis.pro` ✅ migré (2026-05-07) -1. Records DNS chez OVH : A `@`, A `app`, MX/SPF/DKIM pour Resend -2. Modifier les rules dans `rubis.yml.j2` et `rubis-app.yml.j2` (Host) -3. Replay `gateway.yml` -4. Maj `MAIL_FROM_ADDRESS=relances@rubis.pro` dans le secret -5. (Optionnel) supprimer les A records `rubis.pro` et - `app.rubis.pro` chez OVH +- **Landing** : https://rubis.pro +- **App SaaS** : https://app.rubis.pro +- **Compat legacy** : `rubis.arthurbarre.fr` / `app.rubis.arthurbarre.fr` → 301 vers `rubis.pro` / `app.rubis.pro` (Traefik dynamic config dans `~/dev/perso/proxmox/ansible/roles/traefik/templates/rubis*.yml.j2`) + +### Email rubis.pro + +| Flux | Provider | Setup | Adresses | +|---|---|---|---| +| **Sortant** (transactionnel) | Resend | DKIM + SPF + DMARC sur `send.rubis.pro` (verified dashboard Resend) | `relances@rubis.pro` (via `MAIL_FROM_ADDRESS` secret K3s) | +| **Entrant** (humain) | OVH MX Plan (gratuit) | MX `@` → OVH (auto-configuré via Espace Client) | `contact@rubis.pro`, `dev@rubis.pro` | + +⚠️ Resend Inbound (toggle "Enable Receiving") doit rester **OFF** : il veut le MX `@`, qui est pris par OVH MX Plan. + +### Décommissionnement progressif `arthurbarre.fr` (à faire dans 30-90 jours) + +Quand confiance acquise et plus aucune référence vivante : +1. Vire les blocs `rubis-legacy-redirect` / `rubis-app-legacy-redirect` (et middlewares) dans `rubis*.yml.j2` +2. `ansible-playbook playbooks/gateway.yml` +3. Supprime A records `rubis` (id 5413044152) + `app.rubis` (id 5413305619) dans la zone DNS OVH d'`arthurbarre.fr` --- diff --git a/CLAUDE.md b/CLAUDE.md index 274051f..830b1af 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -153,20 +153,29 @@ Voir `/docs/decisions.md` pour le log complet avec rationale. ## Déploiement -- **Image** : `git.arthurbarre.fr/ordinarthur/rubis:latest` -- **Domaine actuel** (temporaire) : https://rubis.pro -- **Build** : `COPY landing/` → nginx servi sur port 80 +- **Domaine principal** : https://rubis.pro (landing) + https://app.rubis.pro (SaaS V1) +- **Image landing** : `git.arthurbarre.fr/ordinarthur/rubis:latest` +- **Build landing** : `COPY landing/` → nginx servi sur port 80 +- **Compat** : `rubis.arthurbarre.fr` / `app.rubis.arthurbarre.fr` redirigent en 301 vers `rubis.pro` / `app.rubis.pro` (config Traefik dans repo proxmox) - Voir `.claude/deploy-memory.md` pour la procédure complète. +## Email infrastructure (`rubis.pro`) + +Deux flux distincts qui cohabitent sur le même domaine via des sous-domaines DNS séparés : + +| Flux | Provider | Adresse | DNS clés | +|---|---|---|---| +| **Sortant** (relances, check-in, auth) | Resend | `relances@rubis.pro` | `send.rubis.pro` (MX + SPF), `resend._domainkey` (DKIM), `_dmarc` | +| **Entrant** (humain) | OVH MX Plan | `contact@rubis.pro` (général + RGPD), `dev@rubis.pro` (notifs tech) | MX `@` → `mx*.mail.ovh.net.` | + +Détails dans `/docs/tech/backend.md` §12.5. + ## Questions ouvertes -- **Stack technique app produit** à formaliser (la landing tourne en static nginx, mais le SaaS lui-même reste à scoper) - **Conversion 1 rubis = 10 min** validée mais à confirmer en user testing après MVP - **Wordmark "rubis" avec gem-i** (direction C) à monter en complément du logo A à un moment - **Provider OCR** à benchmarker (Mindee, Document AI, Textract, Tesseract) -- **Endpoint waitlist** à câbler dans `/landing/index.html` (Resend, Formspree, ou API perso) -- **Domaine définitif** à acheter (le sous-domaine actuel est temporaire) --- -*Dernière mise à jour : 2026-05-05 · Maintenu par Arthur + Claude.* +*Dernière mise à jour : 2026-05-07 · Maintenu par Arthur + Claude.* diff --git a/docs/tech/backend.md b/docs/tech/backend.md index 4eb812b..949e1f0 100644 --- a/docs/tech/backend.md +++ b/docs/tech/backend.md @@ -854,6 +854,58 @@ Recommandation V1 : **Resend** comme default, abstraction `@adonisjs/mail` perme - Vérification de l'adresse expéditrice (DNS configuré, SPF + DKIM signés) - Mention "Envoyé via Rubis" obligatoire en footer (transparence pour le destinataire) +### 12.5 Infrastructure email du domaine `rubis.pro` + +Deux flux distincts, deux providers, **pas de conflit** parce qu'ils utilisent des +sous-domaines différents au niveau DNS. + +#### Sortant (transactionnel) — Resend + +Pour les emails **envoyés depuis l'app** (relances clients, check-in utilisateur, +auth/password-reset, notifications billing). + +| Aspect | Valeur | +|---|---| +| Provider | [Resend](https://resend.com) (cf. ADR-021) | +| Driver AdonisJS | `transports.resend()` (`config/mail.ts`) | +| Adresse expéditrice | `relances@rubis.pro` (configurable via `MAIL_FROM_ADDRESS`) | +| Auth DNS | DKIM (TXT `resend._domainkey`) + SPF (TXT `send`) + return-path MX (`send`) | +| DMARC | TXT `_dmarc` → `v=DMARC1; p=none;` (mode monitoring) | +| Click tracking | CNAME `mail.rubis.pro` → `links1.resend-dns.com.` (optionnel) | + +**Délivrabilité** : tous les records DNS doivent être en statut "Verified" dans le dashboard Resend +avant de switcher `MAIL_FROM_ADDRESS` sur `relances@rubis.pro` côté secret K3s. + +#### Entrant (humain) — OVH MX Plan + +Pour les emails **reçus par l'équipe** (questions support, demandes RGPD, +factures fournisseurs, etc.). **Pas de webhook**, vraies boîtes mail OVH avec +IMAP/SMTP/webmail standard. + +| Adresse | Usage | +|---|---| +| `contact@rubis.pro` | Contact général + demandes RGPD (ref. mentions légales / confidentialité) | +| `dev@rubis.pro` | Notifs techniques, abonnements aux outils dev (Gitea, monitoring, etc.) | + +| Aspect | Valeur | +|---|---| +| Provider | OVH MX Plan (gratuit, inclus avec le domaine acheté chez OVH) | +| Capacité | 5 boîtes 5 Go par domaine | +| MX records | Auto-configurés par OVH (`mx*.mail.ovh.net.`) lors de l'activation MX Plan | +| Webmail | https://www.ovh.com/mail/ | +| Apps mobiles / desktop | IMAP `ssl0.ovh.net:993`, SMTP `ssl0.ovh.net:465` | + +**Important — coexistence avec Resend** : +- Resend utilise le sous-domaine **`send.rubis.pro`** pour son MX return-path. +- OVH MX Plan utilise l'apex **`@`** (`rubis.pro`) pour la réception. +- Les deux MX cohabitent sans conflit dans la zone DNS, chacun sur son hostname. + +⚠️ Si on active un jour Resend Inbound (V2 — capter les replies clients pour +auto-bumper le statut invoice), il **faudra choisir** entre OVH MX Plan et Resend +Inbound : les deux veulent le MX `@`. Plan probable : on garde OVH pour +`contact@`/`dev@`/etc. (humains) et on crée un sous-domaine dédié style +`replies.rubis.pro` pour Resend Inbound (sender Reply-To = `@replies.rubis.pro`). + --- ## 13. Background jobs diff --git a/landing/confidentialite.html b/landing/confidentialite.html index 7198d34..62949d0 100644 --- a/landing/confidentialite.html +++ b/landing/confidentialite.html @@ -65,7 +65,7 @@

Pour toute question liée à vos données : - privacy@rubis.pro + contact@rubis.pro

@@ -221,7 +221,7 @@

Pour exercer ces droits, écrivez-nous à - privacy@rubis.pro en + contact@rubis.pro en précisant l'email associé à votre compte. Nous répondons dans un délai maximal d'un mois (extensible à trois mois pour les demandes complexes, avec information dans le mois initial).