Guide d'installation Self-Hosted
Déployez MailDesk sur votre propre infrastructure. Toutes les données restent sur vos serveurs.
Prérequis
| Prérequis | Minimum |
|---|---|
| Docker Engine 24+ | |
| Docker Compose v2.20+ | |
| 4 Go RAM | |
| 20 Go de disque (+ stockage des pièces jointes) | |
| Tout Linux avec support Docker | |
| Clé de licence de maildesk.cloud | |
1. Extraire et charger
Extraire le paquet :
tar xzf maildesk-selfhosted.tar.gz
cd maildeskCharger les images Docker :
docker load < maildesk-images.tar.gz2. Configurer l'environnement
./setup.shExécutez ./setup.sh pour auto-générer tous les secrets. Puis éditez .env pour définir votre APP_URL et clé de licence.
Ouvrez .env et définissez les valeurs suivantes :
Variables requises
| Variable | Description |
|---|---|
| APP_URL | URL publique de votre instance (sans barre finale) |
| MAILDESK_LICENSE_KEY | Votre clé de licence JWT signée Ed25519 |
Auto-généré par setup.sh
Ceux-ci sont générés automatiquement lors de l'exécution de setup.sh. Ne pas modifier sauf en cas de migration de données.
| Variable | Description |
|---|---|
| BETTER_AUTH_SECRET | Clé de signature de session, min. 32 caractères (auto-générée) |
| CREDENTIAL_ENCRYPTION_KEY | Clé AES-256-GCM pour les mots de passe IMAP/SMTP (auto-générée) |
| POSTGRES_PASSWORD | Mot de passe de la base de données PostgreSQL (auto-généré) |
| REDIS_PASSWORD | Mot de passe du cache Redis (auto-généré) |
| MAILDESK_MODE | Défini à selfhosted (auto-configuré par setup.sh) |
Variables optionnelles
| Variable | Description |
|---|---|
| MAILDESK_LICENSE_SERVER_URL | URL du serveur de licence pour vérification en ligne (par défaut : hors ligne uniquement) |
| REGISTRATION_ENABLED | true (par défaut) ou false pour désactiver l'auto-inscription |
| ALLOWED_REGISTER_IPS | IPs séparées par des virgules autorisées à accéder à /register |
| ENABLE_HSTS | true pour envoyer l'en-tête HSTS (activer derrière TLS) |
| LOG_LEVEL | trace, debug, info (par défaut), warn, error, fatal |
| METRICS_AUTH_TOKEN | Token Bearer pour le endpoint /api/metrics (masqué si non défini) |
| OPENAI_EMBEDDING_KEY | Clé API OpenAI pour recherche sémantique KB (optionnel) |
| MAX_ATTACHMENT_SIZE_MB | Taille max. des pièces jointes en Mo (par défaut : 25) |
Exemple .env pour self-hosted
# Only these 2 lines need manual editing after running ./setup.sh:
APP_URL=https://tickets.example.com
MAILDESK_LICENSE_KEY=eyJhbGciOiJFZERTQSIs...your-key-here
# Everything else is auto-generated by ./setup.sh3. Démarrer
docker compose up -dCela démarre 6 services :
| Service | Fonction |
|---|---|
| migrate | Exécute les migrations de base de données, puis se termine |
| app | Application web Next.js (port 3000) |
| worker | Worker en arrière-plan (IMAP/SMTP, traitement des e-mails, tâches) |
| postgres | PostgreSQL 17 avec extension pgvector |
| redis | Redis 7 pour files d'attente et pub/sub |
| clamav | ClamAV antivirus pour l'analyse des pièces jointes |
Le service migrate s'exécute automatiquement avant le démarrage de app et worker. Il crée toutes les tables de manière idempotente — sûr pour les bases de données nouvelles et existantes.
4. Vérifier le déploiement
# Check all services are healthy
docker compose ps
# Check app logs
docker compose logs app
# Check worker logs
docker compose logs worker
# Health check endpoint
curl http://localhost:3000/api/healthUne fois healthy, ouvrez votre APP_URL dans un navigateur. Vous devriez voir la page de connexion/inscription.
5. Configuration initiale
- 1Enregistrez le premier compte administrateur sur votre-domaine.com/register
- 2Créez une organisation — c'est votre espace de travail
- 3Ajoutez une boîte mail dans Paramètres > Boîtes mail (identifiants IMAP/SMTP)
- 4Les e-mails entrants créeront automatiquement des tickets
Vérification d'email (Optionnel)
Configurez SMTP pour activer la vérification d'email pour les nouveaux utilisateurs. Sans SMTP, les nouveaux utilisateurs sont auto-vérifiés et peuvent se connecter immédiatement.
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=you@gmail.com
SMTP_PASS=your-app-password
SMTP_FROM=MailDesk <noreply@yourdomain.com>Configuration du Reverse Proxy
MailDesk nécessite un reverse proxy pour la terminaison TLS. Voici des exemples pour les configurations courantes :
tickets.example.com {
handle /ws* {
reverse_proxy localhost:3002
}
handle {
reverse_proxy localhost:3000
}
}Clé de licence
Votre clé de licence est un JWT signé Ed25519 qui contient votre plan, limites et flags de fonctionnalités.
Ce que la clé contrôle :
- Niveau de plan (Free, Pro, Business)
- Limites : max. agents, boîtes mail, tickets/mois, stockage
- Fonctionnalités : réponse IA, base de connaissances, traduction automatique
Validation :
- La clé est validée hors ligne par défaut avec la clé publique Ed25519 intégrée — aucun appel externe nécessaire
- Si MAILDESK_LICENSE_SERVER_URL est défini, MailDesk vérifiera la clé en ligne périodiquement (optionnel)
- Les données de licence validées sont mises en cache dans Redis pendant 24 heures
- Si Redis est indisponible, le JWT est vérifié directement (Ed25519 n'a pas besoin de serveur)
Clé expirée ou invalide :
- L'application passe en mode lecture seule — les données existantes restent accessibles
- La création de tickets, l'envoi de réponses et les fonctionnalités IA sont désactivés
- Une bannière affiche « Licence expirée » avec un lien de renouvellement
Mise à jour
# Load new images
docker load < maildesk-images.tar.gz
# Restart (migrations run automatically)
docker compose up -dLes migrations s'exécutent automatiquement à chaque démarrage — aucune étape de migration manuelle nécessaire.
Sauvegarde et restauration
Sauvegarde
Base de données
docker compose exec postgres pg_dump -U maildesk maildesk > backup_$(date +%Y%m%d).sqlPièces jointes
docker compose cp worker:/data/attachments ./attachments-backupRedis (optionnel — uniquement des caches, peut être reconstruit)
docker compose exec redis redis-cli BGSAVERestauration
Base de données
docker compose exec -T postgres psql -U maildesk maildesk < backup_20260317.sqlPièces jointes
docker compose cp ./attachments-backup/. worker:/data/attachmentsDépannage
L'application ne démarre pas
docker compose logs app
docker compose logs migrateCauses fréquentes :
- Base de données non prête — Le service migrate attend le health check de Postgres. Vérifiez docker compose ps pour les services unhealthy.
- DATABASE_URL invalide — Assurez-vous que la chaîne de connexion correspond aux identifiants Postgres.
- Conflit de port — Si le port 3000 est occupé, changez le mappage de ports dans docker-compose.yml.
Erreurs de licence
docker compose logs app | grep -i license- « License invalid » — Vérifiez que MAILDESK_LICENSE_KEY est correctement défini dans .env (pas de sauts de ligne, pas de guillemets autour du JWT).
- « License expired » — Renouvelez votre licence sur maildesk.cloud.
ClamAV démarre lentement
ClamAV télécharge les définitions de virus au premier démarrage, ce qui peut prendre 3 à 5 minutes.
docker compose logs clamavLe worker ne traite pas les e-mails
docker compose logs worker- Vérifiez que les identifiants IMAP sont corrects dans les paramètres de la boîte mail
- Vérifiez que le service worker est healthy
- Assurez-vous que Redis est accessible
Vue d'ensemble de l'architecture
┌─────────────┐
│ Reverse │
│ Proxy │
│ (TLS) │
└──────┬──────┘
│ :3000
┌──────▼──────┐
│ App │
│ (Next.js) │
└──┬──────┬───┘
│ │
┌────────▼─┐ ┌─▼────────┐
│ Postgres │ │ Redis │
│ (pgvec) │ │ (queue) │
└────────▲─┘ └─▲────────┘
│ │
┌──┴──────┴───┐
│ Worker │
│ (IMAP/SMTP) │
└──────┬──────┘
│
┌──────▼──────┐
│ ClamAV │
│ (antivirus) │
└─────────────┘- App — App fournit l'interface web et les routes API
- Worker — Worker se connecte aux boîtes mail via IMAP, envoie les réponses via SMTP, traite les tâches en arrière-plan
- Postgres — Postgres stocke toutes les données de l'application (avec pgvector pour les embeddings IA)
- Redis — Redis gère les files d'attente (BullMQ) et le pub/sub en temps réel (WebSocket)
- ClamAV — ClamAV analyse les pièces jointes pour détecter les malwares