Project Oxygen & Ideo-LabIDEO LAB Dashboard 2026

Toolbox Dev — Ideo-Lab

Mailcow Assisted Installer V3 — User Guide complet

Guide opérationnel pour présenter, installer et utiliser l’outil d’automatisation IDEOLAB permettant de préparer un serveur email autonome Mailcow : préflight Linux, DNS, Cloudflare, installation, Doctor délivrabilité, intégration Django, warm-up et dossier de livraison client.

Python 3

Mailcow

Django / SMTP

DNS / SPF / DKIM / DMARC

1. À quoi sert Mailcow Assisted Installer V3 ?

Mailcow Assisted Installer V3 est un outil Python d’assistance et d’automatisation destiné à transformer l’installation d’un serveur email Mailcow en un processus reproductible, auditable et présentable à un client. L’objectif n’est pas seulement de lancer Docker et Mailcow. L’objectif est de sécuriser tout le parcours : prérequis système, cohérence DNS, configuration SMTP, intégration applicative, test de délivrabilité et dossier de livraison.

Idée centrale : l’outil sert autant à installer qu’à vendre la prestation. Il génère des rapports, un plan DNS, un plan warm-up, des fichiers Django, un runbook d’exploitation et un ZIP de livraison client.

Ce que l’outil automatise

  • préflight Linux, RAM, swap, disque, ports ;
  • installation Docker et Mailcow ;
  • génération du plan DNS ;
  • application DNS Cloudflare optionnelle ;
  • création de rapports JSON/HTML ;
  • génération du snippet SMTP Django ;
  • génération d’un dossier ZIP client.

Ce que l’outil encadre

  • PTR/rDNS côté hébergeur ;
  • clé DKIM générée par Mailcow après création du domaine ;
  • warm-up progressif de l’IP ;
  • validation DMARC avant enforcement ;
  • contrôle DNSBL/blacklist ;
  • readiness score avant bascule en production.

Public cible

  • PME envoyant plus de 100 000 emails/mois ;
  • SaaS Django/Laravel/Symfony ;
  • e-commerce avec emails transactionnels critiques ;
  • clients bloqués par SendGrid, Mailjet, Brevo ou Mailgun ;
  • clients voulant maîtriser leur SMTP et leurs logs.

Les 5 résultats attendus

RésultatDescriptionProduit par l’outil
Installation contrôléeMailcow installé sur un serveur compatible, avec préflight et rapports.preflight, install, all
DNS proprePlan DNS clair : A, MX, SPF, DMARC, DKIM placeholder, autodiscover.dns-plan, dns-apply-cloudflare
Django prêtConfiguration SMTP prête pour settings.py et .env.django-snippet, env-template
Délivrabilité suivieDoctor DNS, PTR, TLS, ports, blacklist et score de readiness.doctor, blacklist-doctor, readiness-score
Dossier clientZIP contenant documents, runbook, checklist, manifest, warm-up.delivery-pack
Positionnement commercial : il ne faut pas vendre un simple script Linux. Il faut vendre un processus d’installation, de validation, de migration et de suivi. Le script devient le moteur technique de la prestation.

2. Architecture fonctionnelle de la V3

La V3 est organisée autour d’actions CLI. Chaque action produit un résultat concret : audit, installation, fichier, rapport, ZIP ou score. L’outil reste volontairement simple : un seul fichier Python, utilisable directement avec python3, sans framework externe obligatoire.

Chaîne d’installation technique

1PréflightVérifie serveur, OS, RAM, swap, disque, ports, Docker, DNS A.
2DNS planGénère les enregistrements nécessaires pour le domaine.
3InstallInstalle paquets, Docker, clone Mailcow, génère mailcow.conf, démarre les containers.
4PostcheckContrôle repository, config, containers et ports après installation.
5DoctorContrôle DNS, PTR, SPF, DMARC, DKIM, TLS, blacklist.

Chaîne de livraison client

1Client profileCrée un JSON réutilisable pour le client.
2Django filesGénère snippet settings.py et .env.example.
3Warm-upProduit un plan progressif par jours/semaines.
4RunbookDocumente exploitation, incidents, queues, logs.
5Delivery packAssemble le tout dans un ZIP vendable.

Actions disponibles

Action
Rôle
Moment d’utilisation
profile-template
Créer un profil client JSON réutilisable.
Avant mission
preflight
Auditer serveur, ports et prérequis avant installation.
Avant installation
dns-plan
Générer le plan DNS complet.
Avant bascule DNS
dns-apply-cloudflare
Créer ou mettre à jour les DNS Cloudflare.
Si DNS chez Cloudflare
install
Installer Mailcow sans exécuter tout le cycle complet.
Installation contrôlée
all
Préflight + DNS plan + Django snippet + install + postcheck + doctor + artifacts.
Installation complète
postcheck
Contrôler l’état après installation.
Après démarrage
doctor
Contrôler DNS, TLS, PTR, SPF, DKIM, DMARC.
Après DNS
blacklist-doctor
Tester la présence de l’IP sur DNSBL courants.
Avant production
readiness-score
Calculer un score de préparation client.
Go / no-go
django-snippet
Générer la configuration SMTP Django.
Intégration app
env-template
Générer un modèle .env.example.
Intégration app
warmup-plan
Créer le plan de montée en charge.
Après installation
delivery-pack
Créer le ZIP client complet.
Livraison
backup-config
Sauvegarder les fichiers de configuration Mailcow.
Maintenance

Sorties générées

Type de fichierContenuUtilité
*.jsonRapport machine-readable, profil client, manifest.Audit, intégration, preuve de livraison.
*.htmlRapport lisible client ou interne.Présentation et archivage.
*.mdDNS plan, warm-up, runbook, checklist.Documentation opérationnelle.
*.csvWarm-up plan structuré.Suivi quotidien ou import tableur.
*.zipDelivery pack client complet.Livraison commerciale.

3. Pré-requis avant d’utiliser l’outil

L’outil facilite énormément l’installation, mais il ne peut pas contourner les contraintes fondamentales d’un serveur mail. Avant de lancer une installation client, il faut vérifier l’infrastructure, le domaine, les DNS et la capacité du provider à autoriser l’émission SMTP.

Pré-requis serveur

ÉlémentRecommandationRaison
OSDebian 11/12/13 ou Ubuntu 22.04+Base Linux stable pour Docker et Mailcow.
RAM6 GiB minimum ; 8 GiB conseilléMailcow utilise plusieurs containers, Rspamd, MariaDB, Redis, SOGo.
Swap1 GiB minimumSécurité mémoire, surtout sur VPS modestes.
Disque20 GiB minimum ; plus selon volume mailLogs, containers, boîtes, backups.
Architecturex86_64 ou ARM64Compatibilité containers.
Accèsroot ou sudoInstallation paquets, Docker, firewall, services.

Ports utilisés

PortProtocoleUsageCriticité
25SMTPMail server-to-server entrant/sortant.Critique
80HTTPChallenge ACME / redirection HTTPS.Critique
443HTTPSInterface Mailcow, SOGo, API.Critique
465SMTPSEnvoi client TLS implicite.Recommandé
587SubmissionEnvoi applicatif SMTP STARTTLS.Recommandé
993IMAPSClient mail sécurisé.Recommandé
995POP3SPOP sécurisé si nécessaire.Optionnel
4190SieveFiltres côté serveur.Optionnel
Point bloquant absolu : si le port 25 sortant est bloqué et que le provider refuse de l’ouvrir, le serveur ne pourra pas envoyer correctement vers les autres serveurs mail. Il faut changer de provider ou utiliser un relay SMTP externe.

Pré-requis DNS et réputation

  • le domaine doit être modifiable côté DNS ;
  • le sous-domaine serveur doit être clair, par exemple mail.example.com ;
  • l’IP publique doit avoir un PTR/rDNS modifiable ;
  • il ne doit pas y avoir deux SPF contradictoires ;
  • les anciens MX doivent être supprimés lors de la bascule ;
  • le domaine ne doit pas être massivement blacklisté avant démarrage ;
  • la stratégie DMARC doit commencer prudemment puis durcir progressivement.

Pré-requis poste opérateur

Outils locaux utiles
ssh root@mail.example.com
scp mailcow_assisted_installer_v3.py root@mail.example.com:/root/
nslookup -type=mx example.com
dig TXT example.com
dig -x 1.2.3.4

4. Installer l’outil Mailcow Assisted Installer V3

L’outil est un script Python autonome. Il peut être exécuté directement depuis un dossier d’administration, par exemple /opt/ideolab-mail-installer ou /root/mailcow-installer. Pour une utilisation commerciale, il est préférable de conserver chaque mission client dans un dossier séparé avec ses rapports.

Téléchargement direct de l’installer

Installer Python V3 prêt à télécharger

Le script doit être déposé dans le répertoire public Django suivant afin d’être disponible depuis la ToolBox :

/static/toolbox/mailcow_assisted_installer_v3.py
Télécharger
Téléchargement depuis le serveur cible
mkdir -p /root/mailcow-installer
cd /root/mailcow-installer

curl -fsSL https://www.ideo-lab.com/static/toolbox/mailcow_assisted_installer_v3.py \
  -o mailcow_assisted_installer_v3.py

python3 mailcow_assisted_installer_v3.py --help
Déploiement côté IDEO-Lab : copier le fichier mailcow_assisted_installer_v3.py dans /static/toolbox/, puis vérifier que l’URL publique /static/toolbox/mailcow_assisted_installer_v3.py répond correctement avant de publier ce guide.

Installation simple sur le serveur cible

Copie du script
mkdir -p /root/mailcow-installer
cd /root/mailcow-installer

# Option A: direct download from IDEO-Lab static toolbox.
curl -fsSL https://www.ideo-lab.com/static/toolbox/mailcow_assisted_installer_v3.py \
  -o mailcow_assisted_installer_v3.py

# Option B: copy from your workstation.
# scp mailcow_assisted_installer_v3.py root@mail.example.com:/root/mailcow-installer/

python3 --version
python3 mailcow_assisted_installer_v3.py --help

Installation depuis le ZIP de distribution

Décompression package V3
mkdir -p /root/mailcow-installer
cd /root/mailcow-installer
unzip mailcow_assisted_installer_v3_package.zip
python3 mailcow_assisted_installer_v3.py --help

Organisation conseillée

DossierContenuRôle
/root/mailcow-installer/Script V3 + quickstartOutil d’installation
/root/mailcow-installer/reports/Rapports JSON/HTML/MD/CSVHistorique mission
/opt/mailcow-dockerized/Repository MailcowInstallation Mailcow réelle
/root/mailcow-installer/delivery/ZIP client exportéLivraison commerciale

Premier test sans risque

Dry-run global
sudo python3 mailcow_assisted_installer_v3.py all \
  --domain example.com \
  --hostname mail.example.com \
  --public-ip 1.2.3.4 \
  --target-volume 100000 \
  --service-tier 100k \
  --dry-run
Règle professionnelle : toujours commencer par --dry-run et preflight avant toute installation réelle. Un installateur doit d’abord prouver que la machine est éligible.

5. Quick Start — parcours standard en 10 commandes

Ce parcours correspond à une mission classique : un client dispose d’un domaine, d’un VPS, d’une IP publique et veut installer Mailcow avec génération de tous les documents nécessaires.

1 — Créer un profil client

profile-template
python3 mailcow_assisted_installer_v3.py profile-template \
  --report-dir ./reports

2 — Auditer le serveur

preflight
sudo python3 mailcow_assisted_installer_v3.py preflight \
  --domain example.com \
  --hostname mail.example.com \
  --public-ip 1.2.3.4 \
  --check-outbound-25 \
  --report-dir ./reports

3 — Générer le plan DNS

dns-plan
python3 mailcow_assisted_installer_v3.py dns-plan \
  --domain example.com \
  --hostname mail.example.com \
  --public-ip 1.2.3.4 \
  --report-dir ./reports

4 — Installer tout le système

all
sudo python3 mailcow_assisted_installer_v3.py all \
  --domain example.com \
  --hostname mail.example.com \
  --public-ip 1.2.3.4 \
  --target-volume 100000 \
  --service-tier 100k \
  --remove-conflicting-docker \
  --configure-ufw \
  --yes \
  --report-dir ./reports

5 — Générer la configuration Django

django-snippet + env-template
python3 mailcow_assisted_installer_v3.py django-snippet \
  --domain example.com \
  --hostname mail.example.com \
  --smtp-user noreply@example.com \
  --report-dir ./reports

python3 mailcow_assisted_installer_v3.py env-template \
  --domain example.com \
  --hostname mail.example.com \
  --smtp-user noreply@example.com \
  --report-dir ./reports

6 — Générer le warm-up plan

warmup-plan
python3 mailcow_assisted_installer_v3.py warmup-plan \
  --domain example.com \
  --hostname mail.example.com \
  --target-volume 100000 \
  --service-tier 100k \
  --report-dir ./reports

7 — Lancer le doctor

doctor
python3 mailcow_assisted_installer_v3.py doctor \
  --domain example.com \
  --hostname mail.example.com \
  --public-ip 1.2.3.4 \
  --report-dir ./reports

8 — Tester les blacklists

blacklist-doctor
python3 mailcow_assisted_installer_v3.py blacklist-doctor \
  --domain example.com \
  --hostname mail.example.com \
  --public-ip 1.2.3.4 \
  --report-dir ./reports

9 — Calculer le readiness score

readiness-score
python3 mailcow_assisted_installer_v3.py readiness-score \
  --domain example.com \
  --hostname mail.example.com \
  --public-ip 1.2.3.4 \
  --report-dir ./reports

10 — Générer le ZIP client

delivery-pack
python3 mailcow_assisted_installer_v3.py delivery-pack \
  --client-name "Example Client" \
  --domain example.com \
  --hostname mail.example.com \
  --public-ip 1.2.3.4 \
  --smtp-user noreply@example.com \
  --target-volume 100000 \
  --service-tier 100k \
  --report-dir ./reports
Livrables attendus →DNS plan, Django snippet, .env.example, warm-up, runbook, checklist, manifest, reports JSON/HTML, ZIP client

6. Profil client JSON

Le profil client est utile pour éviter de répéter les mêmes paramètres dans toutes les commandes. Il devient aussi un document de cadrage de mission : domaine, hostname, IP, volume cible, tier commercial, utilisateur SMTP, dossier de rapports.

Créer le template

Créer un profil client
python3 mailcow_assisted_installer_v3.py profile-template \
  --report-dir ./reports

Exemple de profil client

mailcow_client_profile.json
{
  "client_name": "Example Client",
  "domain": "example.com",
  "hostname": "mail.example.com",
  "public_ip": "1.2.3.4",
  "ipv6": "",
  "timezone": "Europe/Madrid",
  "smtp_user": "noreply@example.com",
  "target_volume": 100000,
  "service_tier": "100k",
  "install_dir": "/opt/mailcow-dockerized",
  "report_dir": "./reports"
}

Utiliser le profil

Avec --profile
python3 mailcow_assisted_installer_v3.py dns-plan \
  --profile ./reports/mailcow_client_profile.json

python3 mailcow_assisted_installer_v3.py delivery-pack \
  --profile ./reports/mailcow_client_profile.json
Conseil : garder le profil client dans le dossier de mission, mais ne jamais y stocker de mots de passe. Les secrets doivent rester dans des variables d’environnement ou dans un coffre de mots de passe.

7. Gestion DNS avec l’outil

La partie DNS est le cœur de la délivrabilité. L’outil produit un plan clair, mais il ne peut pas toujours tout appliquer, parce que le DNS peut être chez GoDaddy, Cloudflare, OVH, Infomaniak, Gandi ou un autre registrar. La V3 automatise Cloudflare et documente les autres cas.

Générer le plan DNS

dns-plan
python3 mailcow_assisted_installer_v3.py dns-plan \
  --domain example.com \
  --hostname mail.example.com \
  --public-ip 1.2.3.4 \
  --report-dir ./reports

Enregistrements attendus

TypeNomValeur exempleRôle
Amail1.2.3.4Associe le FQDN mail à l’IP publique.
MX@10 mail.example.com.Réception des emails du domaine.
TXT@v=spf1 mx a -allAutorise le serveur à envoyer.
TXT_dmarcv=DMARC1; p=quarantine; rua=...Politique DMARC et reporting.
TXTdkim._domainkeyv=DKIM1; k=rsa; p=...Signature cryptographique Mailcow.
CNAMEautodiscovermail.example.com.Auto-configuration clients.
CNAMEautoconfigmail.example.com.Auto-configuration clients.
DKIM : l’outil met un placeholder DKIM dans le plan. La vraie clé DKIM doit être copiée depuis l’interface Mailcow après création du domaine.

PTR / reverse DNS

Le PTR ne se configure généralement pas dans la zone DNS du domaine. Il se configure côté provider IP : Hetzner, OVH, AWS, Scaleway, etc. Il doit pointer vers le FQDN du serveur mail.

PTR attendu →1.2.3.4 -> mail.example.com

Contrôles manuels utiles

dig / nslookup
dig A mail.example.com +short
dig MX example.com +short
dig TXT example.com +short
dig TXT _dmarc.example.com +short
dig TXT dkim._domainkey.example.com +short
dig -x 1.2.3.4 +short

8. Application DNS avec Cloudflare

Lorsque la zone DNS du client est chez Cloudflare, l’outil peut créer ou mettre à jour automatiquement les enregistrements nécessaires. C’est très utile pour industrialiser une prestation. Il faut disposer d’un token API limité à la zone concernée.

Préparer le token

  • créer un token Cloudflare limité à la zone du client ;
  • donner le droit DNS Write ;
  • ne jamais mettre le token en dur dans une commande conservée dans l’historique ;
  • préférer une variable d’environnement temporaire.
Variable d’environnement
export CLOUDFLARE_API_TOKEN="replace-me"

Appliquer les records

dns-apply-cloudflare
python3 mailcow_assisted_installer_v3.py dns-apply-cloudflare \
  --domain example.com \
  --hostname mail.example.com \
  --public-ip 1.2.3.4 \
  --cloudflare-zone-id ZONE_ID \
  --cloudflare-overwrite \
  --yes \
  --report-dir ./reports

Ce qui est appliqué

RecordAutomatiséCommentaire
A mailOuiCréation ou update selon --cloudflare-overwrite.
MX @OuiPointe vers mail.example.com.
SPFOuiAttention à ne pas garder deux SPF.
DMARCOuiPolitique de départ à valider selon le client.
Autodiscover / AutoconfigOuiCNAME vers le serveur mail.
DKIMNonÀ coller après génération dans Mailcow.
PTRNonÀ configurer côté provider IP.
Mode production : toujours capturer un export DNS avant modification, surtout si le client a déjà Google Workspace, Microsoft 365, Zoho, Brevo, Mailchimp ou d’autres services actifs.

9. Installation Mailcow avec la V3

L’installation peut se faire action par action ou via all. Pour un client, le mode recommandé est : préflight, validation humaine, dry-run, puis installation réelle. L’outil protège contre certains cas dangereux : ports occupés, OS non supporté, Docker manquant ou trop ancien, RAM/disque insuffisants.

Installation complète recommandée

Installation complète
sudo python3 mailcow_assisted_installer_v3.py all \
  --domain example.com \
  --hostname mail.example.com \
  --public-ip 1.2.3.4 \
  --target-volume 100000 \
  --service-tier 100k \
  --remove-conflicting-docker \
  --configure-ufw \
  --yes \
  --report-dir ./reports

Installation sans démarrer les containers

Préparer sans démarrer
sudo python3 mailcow_assisted_installer_v3.py install \
  --domain example.com \
  --hostname mail.example.com \
  --public-ip 1.2.3.4 \
  --no-start \
  --yes \
  --report-dir ./reports

Mode low-memory

Pour les petites machines, l’option --low-memory configure Mailcow pour désactiver certains composants gourmands. Ce n’est pas conseillé pour de gros volumes, mais c’est utile pour un lab ou une preuve de concept.

Installation low-memory
sudo python3 mailcow_assisted_installer_v3.py all \
  --domain example.com \
  --hostname mail.example.com \
  --public-ip 1.2.3.4 \
  --low-memory \
  --yes

Postcheck

Contrôle après installation
sudo python3 mailcow_assisted_installer_v3.py postcheck \
  --domain example.com \
  --hostname mail.example.com \
  --public-ip 1.2.3.4 \
  --report-dir ./reports

Résultats attendus après installation

  • /opt/mailcow-dockerized existe ;
  • mailcow.conf est généré ;
  • les containers Mailcow sont démarrés ;
  • l’interface admin est disponible sur https://mail.example.com/admin ;
  • le rapport JSON et le rapport HTML sont créés dans ./reports.

10. Intégration Django

Une partie importante de la prestation consiste à connecter l’application du client à son nouveau SMTP. La V3 génère un snippet Django et un fichier .env.example. Le mot de passe SMTP n’est pas écrit dans le code : il doit rester dans l’environnement.

Générer le snippet Django

django-snippet
python3 mailcow_assisted_installer_v3.py django-snippet \
  --domain example.com \
  --hostname mail.example.com \
  --smtp-user noreply@example.com \
  --smtp-password-env EMAIL_HOST_PASSWORD \
  --report-dir ./reports

Exemple de configuration générée

settings.py
import os

EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_HOST = "mail.example.com"
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = "noreply@example.com"
EMAIL_HOST_PASSWORD = os.environ.get("EMAIL_HOST_PASSWORD", "")
DEFAULT_FROM_EMAIL = "noreply@example.com"
SERVER_EMAIL = "noreply@example.com"

EMAIL_TIMEOUT = 20

Générer le fichier .env.example

env-template
python3 mailcow_assisted_installer_v3.py env-template \
  --domain example.com \
  --hostname mail.example.com \
  --smtp-user noreply@example.com \
  --smtp-password-env EMAIL_HOST_PASSWORD \
  --report-dir ./reports

Test depuis Django shell

send_mail test
python manage.py shell

from django.core.mail import send_mail

send_mail(
    "SMTP test",
    "This is a Mailcow SMTP test from Django.",
    "noreply@example.com",
    ["recipient@example.net"],
    fail_silently=False,
)

Checklist Django avant production

ContrôleStatut attendu
Mot de passe SMTPDans variable d’environnement, jamais dans Git.
DEFAULT_FROM_EMAILAdresse existante ou alias valide dans Mailcow.
Timeout SMTPDéfini pour éviter les workers bloqués.
Flux marketingSéparé des emails transactionnels si volume important.
BouncesBoîte de retour surveillée ou traitée par workflow.

11. Warm-up IP et domaine

Le warm-up est indispensable. Même si l’installation est parfaite, un serveur neuf avec une IP neuve ne doit pas envoyer brutalement 100 000 emails. Les fournisseurs comme Gmail, Outlook ou Yahoo observent la réputation de l’IP, du domaine, du sous-domaine et des comportements d’envoi.

Générer un plan warm-up

warmup-plan 100k
python3 mailcow_assisted_installer_v3.py warmup-plan \
  --domain example.com \
  --hostname mail.example.com \
  --target-volume 100000 \
  --service-tier 100k \
  --report-dir ./reports

Exemple de progression

PériodeVolume indicatifObjectifContrôle
Jours 1-3Très faibleTester DNS, DKIM, DMARC, retours réels.Pas de bounce anormal.
Semaine 1Progression prudenteCréer une réputation initiale propre.Gmail inbox/spam, logs Postfix.
Semaine 2Augmentation contrôléeVérifier stabilité des grands providers.Queue SMTP, retards, bounces.
Semaine 3+Approche du volume cibleStabiliser 100k/mois ou plus.Score, blacklist, DMARC reports.

Règles d’arrêt immédiat

  • taux de bounce élevé ;
  • plainte spam ;
  • IP listée sur DNSBL sérieux ;
  • Gmail/Outlook rejette avec erreur réputation ;
  • queue Postfix qui grossit rapidement ;
  • DMARC fail sur des emails légitimes.

Livrables générés

  • plan Markdown lisible par le client ;
  • CSV exploitable dans Excel/Google Sheets ;
  • rapport HTML/JSON de génération ;
  • inclusion automatique dans le delivery pack.

12. Delivery Pack client

Le delivery-pack est la grande nouveauté commerciale de la V3. Il permet de livrer au client un dossier complet, structuré, réutilisable, qui prouve le travail réalisé et donne au client les consignes d’exploitation.

Créer le delivery pack

delivery-pack
python3 mailcow_assisted_installer_v3.py delivery-pack \
  --client-name "Example Client" \
  --domain example.com \
  --hostname mail.example.com \
  --public-ip 1.2.3.4 \
  --smtp-user noreply@example.com \
  --target-volume 100000 \
  --service-tier 100k \
  --report-dir ./reports

Contenu du ZIP

FichierContenuÀ qui il sert
DNS planRecords A, MX, SPF, DMARC, DKIM placeholder, autodiscover.Client / DNS admin
Django SMTP snippetBloc settings.py prêt à intégrer.Développeur
.env.exampleVariables SMTP attendues.DevOps
Warm-up MarkdownPlan progressif expliqué.Client / support
Warm-up CSVPlan tabulaire.Suivi opérationnel
Operations runbookCommandes d’exploitation et incidents.DevOps / support
Client checklistListe des validations avant production.Chef de projet
Manifest JSONIndex technique du pack.Archivage / automatisation

Quand générer le delivery pack ?

  • avant installation, pour présenter le plan au client ;
  • après installation, pour livrer le dossier final ;
  • après correction DNS, pour archiver une version propre ;
  • avant une bascule en production, pour obtenir validation du client.
Objectif commercial →transformer une installation technique en livrable professionnel facturable

13. Doctor délivrabilité

Le mode Doctor est destiné à répondre à une question simple : le serveur est-il prêt à envoyer et recevoir correctement ? Il ne remplace pas un test réel Gmail/Outlook, mais il attrape les erreurs les plus fréquentes avant production.

Doctor DNS / SMTP

doctor
python3 mailcow_assisted_installer_v3.py doctor \
  --domain example.com \
  --hostname mail.example.com \
  --public-ip 1.2.3.4 \
  --report-dir ./reports

Blacklist Doctor

blacklist-doctor
python3 mailcow_assisted_installer_v3.py blacklist-doctor \
  --domain example.com \
  --hostname mail.example.com \
  --public-ip 1.2.3.4 \
  --report-dir ./reports

Readiness Score

readiness-score
python3 mailcow_assisted_installer_v3.py readiness-score \
  --domain example.com \
  --hostname mail.example.com \
  --public-ip 1.2.3.4 \
  --report-dir ./reports

Contrôles réalisés

ContrôlePourquoi c’est importantErreur fréquente
A recordLe hostname doit résoudre vers la bonne IP.Ancienne IP ou proxy Cloudflare actif.
MXLe domaine doit recevoir sur Mailcow.Ancien MX Zoho/Google encore actif.
SPFLes serveurs destinataires valident l’origine.Deux SPF TXT différents.
DMARCPolitique d’alignement domaine.Politique trop stricte avant DKIM.
DKIMSignature cryptographique.Clé oubliée après création du domaine.
PTRReputation SMTP et anti-spam.PTR absent ou mauvais hostname.
TLSConnexion sécurisée et crédibilité.Certificat pas encore émis.
DNSBLIP déjà listée avant même la production.IP recyclée avec historique sale.
Go / No-Go : si le readiness score est faible, ne pas basculer le client en production. Corriger d’abord DNS, PTR, DKIM, SPF et blacklist.

14. Backup configuration

La V3 inclut backup-config pour sauvegarder les fichiers de configuration importants. Ce n’est pas un backup complet des boîtes mail. C’est une sauvegarde de configuration destinée aux opérations de maintenance, audit et rollback léger.

Créer un backup config

backup-config
sudo python3 mailcow_assisted_installer_v3.py backup-config \
  --domain example.com \
  --install-dir /opt/mailcow-dockerized \
  --report-dir ./reports \
  --yes

Ce qui est couvert

  • mailcow.conf ;
  • docker-compose.yml si présent ;
  • fichiers de configuration locaux identifiés par l’outil ;
  • rapport JSON/HTML associé.

Ce qui n’est pas couvert

  • contenu complet des boîtes mail ;
  • volumes Docker complets ;
  • backup distant chiffré ;
  • restauration complète après perte du VPS.

Backup complet recommandé en production

Pour une offre client sérieuse, ajouter un vrai backup Mailcow : volumes Docker, base MariaDB, vmail, crypt, Redis, export distant vers Storage Box/S3/restic/borg, test de restauration, rétention, monitoring.

15. Exploitation quotidienne

Après installation, l’enjeu principal devient la stabilité : logs, queue SMTP, bounces, reputation, blacklist, backups, mises à jour et séparation des flux transactionnels/marketing.

Commandes Mailcow utiles

ActionCommande
Voir containerscd /opt/mailcow-dockerized && docker compose ps
Logs Postfixdocker compose logs -f postfix-mailcow
Logs Dovecotdocker compose logs -f dovecot-mailcow
Logs Nginxdocker compose logs -f nginx-mailcow
Queue SMTPdocker exec mailcowdockerized-postfix-mailcow-1 postqueue -p
Redémarrerdocker compose down && docker compose up -d
Mettre à jourdocker compose pull && docker compose up -d

Routine hebdomadaire recommandée

  • lancer doctor ;
  • lancer blacklist-doctor ;
  • vérifier la queue SMTP ;
  • vérifier les bounces récents ;
  • contrôler l’espace disque ;
  • contrôler les backups ;
  • vérifier la réputation Gmail/Outlook sur emails tests.

Routine avant campagne ou volume important

  • ne jamais lancer une campagne massive depuis une IP neuve ;
  • confirmer que SPF/DKIM/DMARC passent ;
  • segmenter les destinataires ;
  • surveiller queue et bounces pendant l’envoi ;
  • avoir une procédure d’arrêt immédiat ;
  • ne pas mélanger transactionnel critique et marketing risqué.
Bonne pratique : créer au moins deux sous-domaines si le client fait aussi du marketing : mail.example.com pour l’infra, notify.example.com pour transactionnel, news.example.com pour marketing.

16. Dépannage

Le port 25 sortant est bloqué

Symptôme : impossible de joindre les MX externes, les emails restent en queue ou échouent.
Test TCP 25
timeout 7 bash -lc '</dev/tcp/gmail-smtp-in.l.google.com/25'

Correction : demander l’ouverture au provider ou choisir un provider compatible email server.

Gmail refuse avec DMARC

Erreur typique
550-5.7.26 Unauthenticated email from domain is not accepted due to DMARC policy
  • vérifier SPF ;
  • vérifier DKIM ;
  • mettre DMARC temporairement en p=none ou p=quarantine selon contexte ;
  • supprimer les anciens SPF contradictoires ;
  • relancer doctor.

DKIM absent

Après création du domaine dans Mailcow, générer la clé DKIM dans l’interface, puis coller le TXT dans la zone DNS. Ensuite attendre la propagation et relancer :

Relancer doctor
python3 mailcow_assisted_installer_v3.py doctor \
  --domain example.com \
  --hostname mail.example.com \
  --public-ip 1.2.3.4

PTR incorrect

  • vérifier dig -x IP ;
  • corriger le reverse DNS côté provider ;
  • le PTR doit pointer vers mail.example.com ;
  • le A record de mail.example.com doit revenir vers l’IP.

Ancien MX encore actif

Si Google Workspace, Zoho ou Microsoft 365 restent dans les MX, une partie des emails partira ailleurs.

Contrôle MX
dig MX example.com +short

Cloudflare proxy activé par erreur

Pour un hostname mail, le record doit être en DNS only. Le proxy orange Cloudflare ne doit pas être utilisé pour SMTP/IMAP.

Docker déjà installé par le provider

Si des paquets Docker conflictuels existent, utiliser --remove-conflicting-docker uniquement sur un serveur neuf ou validé.

Option d’installation
sudo python3 mailcow_assisted_installer_v3.py all \
  --domain example.com \
  --hostname mail.example.com \
  --public-ip 1.2.3.4 \
  --remove-conflicting-docker \
  --yes

17. Utilisation dans une offre commerciale

L’outil est surtout intéressant s’il est intégré dans une offre packagée. Le client ne paie pas uniquement l’installation d’un serveur : il paie un résultat maîtrisé, des livrables, une procédure de validation et un accompagnement pendant la phase sensible.

Offres possibles

OffreVolume cibleLivrablesPrix indicatif
Audit EmailDiagnosticDoctor, blacklist, DNS review, rapport HTML.490 € à 900 €
SMTP Autonome Startjusqu’à 100k/moisInstallation, DNS, Django, warm-up, delivery pack.Setup 950 € + 190 €/mois
SMTP Autonome Projusqu’à 250k/moisStart + monitoring renforcé + support prioritaire.Setup 1 500 € + 390 €/mois
SMTP Businessjusqu’à 500k/moisPro + séparation flux + runbook avancé.Setup 2 500 € + 790 €/mois
Enterprise1M+Architecture spécifique, SLA, HA, plusieurs IP.Sur devis

Argumentaire client

Votre SMTP. Votre domaine. Vos logs. Votre réputation.

Nous installons une infrastructure email autonome basée sur Mailcow, avec DNS propres, SPF/DKIM/DMARC, intégration applicative, rapport de délivrabilité, plan de montée en charge et documentation d’exploitation.

Livrables à remettre au client

  • rapport d’audit initial ;
  • plan DNS ;
  • preuve PTR/rDNS ;
  • snippet Django ou applicatif ;
  • plan warm-up ;
  • runbook exploitation ;
  • checklist de bascule ;
  • rapport final readiness score ;
  • ZIP delivery pack généré par la V3.

Limites à écrire dans le contrat

  • la délivrabilité dépend aussi de la qualité des listes et du comportement d’envoi du client ;
  • une IP neuve nécessite un warm-up ;
  • un serveur autonome n’autorise pas le spam ou l’achat de listes ;
  • un blacklistage peut nécessiter une procédure de remédiation ;
  • le PTR dépend du provider IP ;
  • les secrets SMTP doivent être gérés par le client dans un coffre adapté.