Français
Marque blanche
Une instance Mankomail peut porter une autre marque que la sienne : votre nom, vos logos, vos couleurs. Deux façons de la régler.
- Auto-hébergée : des variables d’environnement (
BRAND_*), lues au démarrage. - Reliée à un control plane (une flotte d’instances opérées ensemble) : la marque configurée dans le back-office du control plane, reçue par l’instance et appliquée sans redémarrage.
Quand les deux existent, le control plane l’emporte champ par champ : un champ qu’il ne définit pas garde la valeur de l’environnement, sinon le défaut du produit.
Où la marque apparaît
| Élément | Où il apparaît | Défaut |
|---|---|---|
| Nom | Colonne de navigation, pages de connexion et d’invitation, titre de l’onglet, e-mails système | Mankomail |
| Logo (clair, sombre) | Colonne de navigation, page de connexion. Un logo remplace le monogramme et le texte du nom à côté | Le monogramme |
| Favicon | Onglet du navigateur | Le monogramme, dessiné dans la couleur principale quand il y en a une |
| Couleur principale | L’accent du thème : boutons primaires, item de navigation actif, liens, anneau de focus | L’accent du thème |
| Couleur d’accent | Panneau de la page de connexion | — |
| Lien d’aide | Page de connexion, menu du membre, bandeau de suspension | Aucun |
| « Propulsé par Mankomail » | Page de connexion, e-mails système. Affiché seulement quand le nom de la marque diffère de celui du produit | Affiché |
| Texte et image de la connexion | Sous-titre et panneau gauche de la page de connexion | Le texte du produit, sans image |
| Nom d’expéditeur et pied des e-mails | E-mails de demande d’approbation | Le nom de la marque, sans pied |
| Domaine personnalisé | Liens générés dans les e-mails (boutons d’approbation, liens d’invitation) | PUBLIC_BASE_URL |
Les trois dernières lignes ne se règlent que depuis un control plane.
Des couleurs qui restent lisibles
Une couleur de marque n’est pas toujours lisible comme couleur d’interface : un bordeaux convient sur une page claire et devient illisible sur une page sombre, un jaune pâle l’inverse. L’instance garde la teinte de la couleur principale et recalcule sa clarté pour chacun des trois thèmes, en mode clair et en mode sombre, pour que le texte dans la couleur d’accent reste à 4,5:1 sur la page, que les libellés des boutons restent lisibles et que l’anneau de focus reste visible. La couleur affichée peut donc être un peu plus claire ou plus foncée que celle que vous avez choisie.
Les couleurs calculées sont gardées par le navigateur : au chargement suivant, elles s’affichent dès la première image.
Auto-hébergée : les variables d’environnement
Posez les variables dans .env, puis recréez le conteneur applicatif :
bash
BRAND_NAME="Acme Mail"
BRAND_LOGO_URL=https://cdn.acme.example/logo.svg
BRAND_LOGO_DARK_URL=https://cdn.acme.example/logo-dark.svg
BRAND_FAVICON_URL=https://cdn.acme.example/favicon.png
BRAND_PRIMARY_COLOR=#7A1F35
BRAND_ACCENT_COLOR=#FFE680
BRAND_SUPPORT_URL=https://help.acme.example
BRAND_HIDE_POWERED_BY=falsebash
docker compose -f compose.reference.yaml up -d app- Les images doivent être joignables par les navigateurs des utilisateurs. Utilisez des URL
https: la politique de sécurité de la page autorise les imageshttps:, plus l’origine exacte d’une URLhttp:posée dans ces variables. - Une valeur invalide (une couleur qui n’est pas
#RRGGBB, une URL mal formée) est ignorée avec une ligneconfiguration:dans le journal de démarrage ; le défaut s’applique.
La liste complète est dans Variables d’environnement.
Reliée à un control plane
Un control plane est un service à part qui opère une flotte d’instances (une par organisation cliente) : il reçoit leur usage, leur envoie leur marque, leur plan et leurs droits, et peut les suspendre. L’instance ne fait que des appels HTTPS sortants ; rien ne s’y connecte jamais.
La liaison n’est active que si les trois variables sont posées ensemble :
bash
CONTROL_PLANE_URL=https://api.example.com/api/instances/v1
CONTROL_PLANE_INSTANCE_ID=ins_01k6x…
CONTROL_PLANE_SECRET_FILE=/run/secrets/control_plane_secretSans elles, l’instance n’appelle rien et n’envoie rien nulle part. Si une ou deux seulement sont posées, la liaison reste coupée et le journal de démarrage nomme celle qui manque.
Ce que l’instance envoie et reçoit
Chaque appel est signé avec le secret partagé (HMAC-SHA256 sur la méthode, le chemin, l’horodatage, un nonce à usage unique et le corps). L’horloge de la machine doit être à moins de cinq minutes de l’heure réelle : faites tourner NTP.
| Appel | Fréquence | Contenu |
|---|---|---|
| Heartbeat | Chaque minute | Version et santé : base, migrations en attente, retard de la file de tâches, boîtes en erreur |
| Usage | Toutes les cinq minutes | Totaux par heure : exécutions et étapes par statut final, mails reçus et envoyés par fournisseur, boîtes connectées, membres actifs (venus dans les 30 derniers jours), jetons et coût d’IA par fournisseur et modèle, stockage, appels d’API |
| Configuration | Toutes les cinq minutes, et dès que le heartbeat annonce un changement | Marque, plan, droits, état de l’instance |
L’usage est compté depuis la base de l’instance. Il ne contient aucun contenu de mail, aucune adresse et aucun sujet : seulement des nombres.
Quand le control plane est injoignable
L’instance continue de fonctionner :
- la dernière configuration valide reste appliquée (elle est gardée en base) ;
- les appels en échec sont réessayés avec un délai croissant, jusqu’à 30 minutes ;
- les heures d’usage non acquittées restent en file et partent au retour de la liaison, les plus anciennes d’abord. Chaque heure est remontée comme un total qui remplace le précédent : l’envoyer deux fois ne la compte jamais deux fois.
Suspension
Quand le control plane suspend l’instance, elle passe en lecture seule :
- chaque utilisateur voit un bandeau rouge qui explique la situation, avec le lien d’aide s’il existe ;
- l’API refuse les modifications avec l’erreur
instance.suspended(se connecter et se déconnecter restent possibles) ; - les webhooks entrants reçoivent
503avecRetry-After, pour que l’émetteur les rejoue plus tard au lieu de les perdre ; - les workflows, la synchronisation et les envois sont en pause. Rien n’est perdu : les tâches restent en file et reprennent à la levée de la suspension.
Plan et droits
Le plan et les droits reçus sont visibles des administrateurs et lisibles par l’instance, mais ne brident encore aucune fonctionnalité. Les quotas posés par variables d’environnement continuent de s’appliquer.
Vérifier le résultat
Administration › Instance (administrateurs seulement) montre :
- si la liaison est configurée, l’état annoncé et, pour chaque appel, son dernier succès et sa dernière erreur, en clair ;
- le nombre d’heures d’usage en attente d’envoi ;
- le plan et les droits reçus ;
- chaque champ de marque avec sa valeur et son origine (control plane, environnement, défaut) et, pour ceux réglés par l’environnement, la variable à modifier.
Rien n’est modifiable sur cette page : la marque se change dans le back-office du control plane, ou dans les variables d’environnement suivies d’un redémarrage.