Guide d'installation Self-Hosted

Déployez MailDesk sur votre propre infrastructure. Toutes les données restent sur vos serveurs.

Prérequis

PrérequisMinimum
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
L'application écoute sur le port 3000 par défaut. Placez un reverse proxy (Caddy, Nginx, Traefik) devant pour le TLS.

1. Extraire et charger

Extraire le paquet :

shell
tar xzf maildesk-selfhosted.tar.gz
cd maildesk

Charger les images Docker :

shell
docker load < maildesk-images.tar.gz

2. Configurer l'environnement

shell
./setup.sh

Exé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

VariableDescription
APP_URLURL publique de votre instance (sans barre finale)
MAILDESK_LICENSE_KEYVotre 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.

VariableDescription
BETTER_AUTH_SECRETClé de signature de session, min. 32 caractères (auto-générée)
CREDENTIAL_ENCRYPTION_KEYClé AES-256-GCM pour les mots de passe IMAP/SMTP (auto-générée)
POSTGRES_PASSWORDMot de passe de la base de données PostgreSQL (auto-généré)
REDIS_PASSWORDMot de passe du cache Redis (auto-généré)
MAILDESK_MODEDéfini à selfhosted (auto-configuré par setup.sh)

Variables optionnelles

VariableDescription
MAILDESK_LICENSE_SERVER_URLURL du serveur de licence pour vérification en ligne (par défaut : hors ligne uniquement)
REGISTRATION_ENABLEDtrue (par défaut) ou false pour désactiver l'auto-inscription
ALLOWED_REGISTER_IPSIPs séparées par des virgules autorisées à accéder à /register
ENABLE_HSTStrue pour envoyer l'en-tête HSTS (activer derrière TLS)
LOG_LEVELtrace, debug, info (par défaut), warn, error, fatal
METRICS_AUTH_TOKENToken Bearer pour le endpoint /api/metrics (masqué si non défini)
OPENAI_EMBEDDING_KEYClé API OpenAI pour recherche sémantique KB (optionnel)
MAX_ATTACHMENT_SIZE_MBTaille max. des pièces jointes en Mo (par défaut : 25)

Exemple .env pour self-hosted

env
# 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.sh

3. Démarrer

shell
docker compose up -d

Cela démarre 6 services :

ServiceFonction
migrateExécute les migrations de base de données, puis se termine
appApplication web Next.js (port 3000)
workerWorker en arrière-plan (IMAP/SMTP, traitement des e-mails, tâches)
postgresPostgreSQL 17 avec extension pgvector
redisRedis 7 pour files d'attente et pub/sub
clamavClamAV 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

shell
# 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/health

Une fois healthy, ouvrez votre APP_URL dans un navigateur. Vous devriez voir la page de connexion/inscription.

5. Configuration initiale

  1. 1Enregistrez le premier compte administrateur sur votre-domaine.com/register
  2. 2Créez une organisation — c'est votre espace de travail
  3. 3Ajoutez une boîte mail dans Paramètres > Boîtes mail (identifiants IMAP/SMTP)
  4. 4Les e-mails entrants créeront automatiquement des tickets
Tip: Utilisez ALLOWED_REGISTER_IPS pour restreindre qui peut créer des comptes, ou définissez REGISTRATION_ENABLED=false après avoir créé le compte administrateur.

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.

.env
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=you@gmail.com
SMTP_PASS=your-app-password
SMTP_FROM=MailDesk <noreply@yourdomain.com>
Sans SMTP : La vérification d'email est automatiquement ignorée. Les nouveaux utilisateurs peuvent s'inscrire et se connecter sans confirmer leur email. Vous pouvez ajouter SMTP à tout moment.

Configuration du Reverse Proxy

MailDesk nécessite un reverse proxy pour la terminaison TLS. Voici des exemples pour les configurations courantes :

Caddyfile
tickets.example.com {
    handle /ws* {
        reverse_proxy localhost:3002
    }
    handle {
        reverse_proxy localhost:3000
    }
}
WebSocket: MailDesk utilise WebSocket pour les mises à jour en temps réel (chat, notifications, événements de tickets). La route /ws doit pointer vers le port 3002 (worker).

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

shell
# Load new images
docker load < maildesk-images.tar.gz

# Restart (migrations run automatically)
docker compose up -d

Les migrations s'exécutent automatiquement à chaque démarrage — aucune étape de migration manuelle nécessaire.

Sauvegarde et restauration

Sauvegarde

Base de données

shell
docker compose exec postgres pg_dump -U maildesk maildesk > backup_$(date +%Y%m%d).sql

Pièces jointes

shell
docker compose cp worker:/data/attachments ./attachments-backup

Redis (optionnel — uniquement des caches, peut être reconstruit)

shell
docker compose exec redis redis-cli BGSAVE

Restauration

Base de données

shell
docker compose exec -T postgres psql -U maildesk maildesk < backup_20260317.sql

Pièces jointes

shell
docker compose cp ./attachments-backup/. worker:/data/attachments

Dépannage

L'application ne démarre pas

shell
docker compose logs app
docker compose logs migrate

Causes 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

shell
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.

shell
docker compose logs clamav

Le worker ne traite pas les e-mails

shell
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