Pourquoi self-héberger Trigger.dev sur un VPS
Trigger.dev remplace les files d'attente maison (BullMQ, cron fragiles, Lambda qui timeout) par une plateforme unifiée : tâches durables, retries automatiques, gestion des concurrences et tableau de bord en temps réel. La version SaaS facture au nombre d'exécutions et limite la durée des jobs, ce qui devient vite contraignant pour des traitements ETL, des envois d'emails en masse ou des appels d'API lents. En self-hosted sur un VPS, vous gardez vos workers chez vous : vos clés API tierces (OpenAI, Stripe, Resend) ne transitent jamais par un tiers, et vos jobs peuvent tourner 10 minutes ou plusieurs heures sans être coupés. La stack repose sur PostgreSQL, Redis et un orchestrateur Docker, ce qui la rend reproductible et facile à sauvegarder.
Ce que vous gagnez en auto-hébergeant
- Aucune limite sur la durée ou le nombre d'exécutions de vos tâches en arrière-plan.
- Vos secrets (clés API, tokens) restent dans votre infrastructure, jamais sur un SaaS tiers.
- Coût fixe prévisible : un seul VPS au lieu d'une facture qui grimpe avec le volume.
- Latence réduite si vos workers tournent à côté de votre base de données et de votre application.
- Contrôle total sur les versions, les variables d'environnement et la rétention des logs.
- Possibilité de déclencher des jobs depuis vos webhooks internes sans exposer de service externe.
Prérequis matériels et logiciels
Trigger.dev est une stack relativement gourmande car elle combine l'application web, des workers, PostgreSQL et Redis. Prévoyez un VPS avec au minimum 4 Go de RAM et 2 vCPU pour un usage de production léger ; visez 8 Go de RAM et 4 vCPU si vous exécutez beaucoup de jobs concurrents ou des traitements lourds. Comptez 40 Go de disque SSD pour la base de données, les logs et les images Docker. Côté logiciel : Docker Engine 24+ et le plugin Docker Compose v2, un nom de domaine (par exemple trigger.mondomaine.ma) pointant vers l'IP du VPS, et un port 443 ouvert pour le HTTPS. Une clé MAGIC_LINK_SECRET et un ENCRYPTION_KEY (32 caractères hexadécimaux) sont indispensables pour chiffrer les variables d'environnement des projets.
Déployer Trigger.dev avec Docker en 5 étapes
Préparer le VPS et Docker
Connectez-vous en SSH, mettez le système à jour puis installez Docker et Compose : curl -fsSL https://get.docker.com | sh. Créez un utilisateur dédié et un dossier /opt/trigger pour héberger la configuration. Vérifiez avec docker compose version.
Récupérer la stack officielle de self-hosting
Clonez le dépôt de déploiement : git clone https://github.com/triggerdotdev/trigger.dev. Le dossier docker/ contient le docker-compose.yml regroupant l'app web, les workers, PostgreSQL et Redis. Copiez .env.example vers .env.
Générer les secrets et configurer le domaine
Générez vos clés avec openssl rand -hex 16 pour ENCRYPTION_KEY et MAGIC_LINK_SECRET. Renseignez LOGIN_ORIGIN et APP_ORIGIN avec https://trigger.mondomaine.ma. Définissez les identifiants PostgreSQL et l'URL Redis interne.
Lancer la stack
Démarrez l'ensemble avec docker compose up -d. Suivez l'initialisation des migrations via docker compose logs -f webapp. Une fois l'app accessible sur le port interne (3030 par défaut), créez votre premier compte admin via le magic link affiché dans les logs.
Exposer via un reverse proxy HTTPS
Placez Caddy ou Traefik devant l'app pour gérer le TLS automatiquement. Avec Caddy : une ligne trigger.mondomaine.ma { reverse_proxy localhost:3030 } suffit pour obtenir un certificat Let's Encrypt et activer le HTTPS. Connectez ensuite votre projet local avec npx trigger.dev@latest login --api-url https://trigger.mondomaine.ma.
Isolez les workers de l'application web sur des conteneurs séparés et limitez leur concurrence via la variable WORKER_CONCURRENCY. Pour les jobs très gourmands en CPU, ajoutez un second VPS dédié aux workers pointant vers le même PostgreSQL et Redis : vous scalez horizontalement sans toucher au dashboard. Pensez aussi à un cron pg_dump quotidien vers un stockage externe, car toute la logique de vos tâches et leur historique vivent dans PostgreSQL.