[{"data":1,"prerenderedAt":276},["ShallowReactive",2],{"seo-verification":3,"blog-installer-temporal-vps-ma-fr":6,"promo-bar-likely":275},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-installer-temporal-vps-ma-fr",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":27,"featuredImage":29,"bgImage":30,"posterImage":31,"relatedSolution":29,"intro":32,"sections":33,"ctaTitle":217,"ctaBody":218,"ctaButton":219,"ctaUrl":220,"relatedPosts":221},30,"installer-temporal-vps",{"fr":10,"en":12,"ar":13,"es":14},"installing-temporal-on-a-vps-self-hosted-automation","تثبيت-temporal-على-خادم-vps-أتمتة-ذاتية-الاستضافة","instalar-temporal-en-un-vps","Installer Temporal sur un VPS : automatisation self-hosted","Déployez Temporal sur votre VPS : orchestration durable de workflows résistants aux pannes, avec SDK Go, Java, Python et TypeScript, en self-hosted.",10,1,false,"2026-05-21T00:00:00+00:00","2026-11-08T16:32:50+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},2,"Automatisation","automatisation","bg-brand-action\u002F10 text-brand-action",[28],{"id":23,"name":24,"slug":25,"color":26,"icon":25},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Finstaller-temporal-vps-poster.svg","Temporal est un moteur d'orchestration de workflows durables : vos processus longs survivent aux redémarrages, aux pannes et aux erreurs, car leur état est persisté à chaque étape. Conçu pour les développeurs via des SDK (Go, Java, Python, TypeScript), il est idéal pour les transactions complexes et les sagas. Voici comment l'installer en self-hosted sur un VPS.",[34,44,54,64,103,112,146,172,183,193,213],{"type":35,"title":36,"body":37,"items":38},"h2","Pourquoi self-héberger Temporal sur un VPS","Temporal Cloud existe, mais le self-hosting reste pertinent pour plusieurs raisons. D'abord, le coût : à partir de 99 DH\u002Fmois, un VPS ServOrbit suffit pour des charges modérées, sans frais à l'action ou au nombre de workflows actifs. Ensuite, la souveraineté des données : vos workflows peuvent traiter des informations sensibles (données clients, tokens d'API internes) qui ne doivent pas transiter par un service tiers. Enfin, la flexibilité : vous contrôlez la version déployée, les politiques de rétention, les intégrations réseau internes.",[39,40,41,42,43],"Coût prévisible : facturation VPS fixe, aucun surcoût à l'exécution","Données sur votre infrastructure : aucun workflow ni payload ne quitte votre réseau","Intégration réseau privée : vos Workers accèdent directement aux bases de données et services internes","Contrôle de version : choisissez quand migrer vers une nouvelle version de Temporal","Observabilité complète : logs, métriques et traces sous votre contrôle",{"type":35,"title":45,"body":46,"items":47},"Cas d'usage de Temporal","Temporal brille là où les cron jobs et queues simples montrent leurs limites. Voici les cas d'usage les plus courants en environnement de production.",[48,49,50,51,52,53],"Workflows e-commerce : séquencer commande → paiement → vérification stock → expédition → email de confirmation sur plusieurs minutes ou heures, avec retry automatique à chaque étape","Saga pattern pour les transactions distribuées : compenser automatiquement les étapes précédentes si une étape ultérieure échoue (ex. : annuler une réservation si le paiement est refusé)","Onboarding utilisateur long : envoyer un email J+0, attendre 48 h, envoyer un rappel, attendre la vérification KYC, débloquer l'accès — tout en un seul workflow lisible","Synchronisation de données périodique avec reprise : importer des fichiers CSV volumineux, reprendre depuis le dernier enregistrement traité en cas d'interruption","Retry automatique avec backoff exponentiel : appels vers des APIs tierces instables sans écrire de logique de retry dans votre code applicatif","Pipelines ETL et ML : orchestrer des transformations de données dont certaines étapes durent plusieurs heures",{"type":35,"title":55,"body":56,"items":57},"Architecture de Temporal auto-hébergé","Comprendre les composants internes vous aide à dimensionner votre VPS et à diagnostiquer les problèmes. Temporal est composé de quatre services principaux qui peuvent tourner dans le même processus (`temporalio\u002Fauto-setup`) ou être déployés séparément à grande échelle.",[58,59,60,61,62,63],"Frontend Service : point d'entrée gRPC pour les Workers et les clients SDK. Reçoit les requêtes de démarrage de workflow, les signaux et les requêtes de l'UI. Port par défaut : 7233","History Service : cœur du moteur. Persiste l'historique immuable de chaque workflow dans PostgreSQL (ou MySQL). C'est lui qui garantit la durabilité — même après un crash, l'historique est intact","Matching Service : dispatch les tâches (Activity Tasks, Workflow Tasks) vers les Workers disponibles via un système de file interne. Gère le routage par task queue","Worker Service (interne) : exécute les workflows système de Temporal lui-même (réplication, archivage). À ne pas confondre avec vos Workers applicatifs","PostgreSQL : stockage principal de l'historique et de la visibilité. Sur un VPS seul, une instance PostgreSQL locale suffit","Elasticsearch (optionnel) : enrichit la recherche dans l'UI — filtrer les workflows par attribut personnalisé, recherche full-text. Non requis pour commencer",{"type":65,"title":66,"headers":67,"rows":72},"comparison","Temporal vs BullMQ vs Celery",[68,69,70,71],"Critère","Temporal","BullMQ","Celery",[73,78,83,88,93,98],[74,75,76,77],"Durabilité de l'état","Historique complet persisté en base — un workflow interrompu reprend exactement où il en était","État en Redis — une perte Redis signifie une perte de jobs (mitigeable avec AOF\u002FRDB)","Résultats optionnels en backend (Redis, DB) — pas d'historique d'exécution natif",[79,80,81,82],"Replay et déterminisme","Replay automatique depuis l'historique — le code workflow doit être déterministe, Temporal gère le reste","Pas de replay natif — retry simple sur échec, sans rejouer les étapes précédentes","Retry configurable par tâche, pas de replay d'un workflow multi-étapes",[84,85,86,87],"UI d'observation","UI riche incluse : liste des workflows, détail de chaque étape, recherche, actions manuelles","Bull Board en plugin tiers — fonctionnel mais limité","Flower en outil séparé — métriques basiques, pas d'historique d'étapes",[89,90,91,92],"Langages supportés","Go, TypeScript\u002FJavaScript, Python, Java, ‎.NET, PHP (SDKs officiels)","Node.js uniquement","Python principalement, portages partiels pour d'autres langages",[94,95,96,97],"Performance et latence","Latence plus haute par tâche — optimisé pour la durabilité, pas la rapidité","Très faible latence — conçu pour les jobs haute fréquence","Latence variable selon le broker (Redis \u003C RabbitMQ) — bon pour le volume moyen",[99,100,101,102],"Cas d'usage idéal","Workflows métier longs et critiques, saga pattern, processus multi-étapes sur plusieurs jours","Files de tâches haute fréquence, traitement d'images, notifications en temps réel","Tâches background Python, pipelines data, intégration dans un écosystème Python existant",{"type":35,"title":104,"body":105,"items":106},"Prérequis techniques","Avant de commencer, vérifiez que votre environnement est prêt.",[107,108,109,110,111],"Un VPS sous Ubuntu 22.04 ou Debian 12 avec au minimum 2 vCPU et 4 Go de RAM","Docker 24+ et Docker Compose v2 installés (`docker compose version` pour vérifier)","Un nom de domaine pointant vers votre VPS pour l'accès HTTPS à l'UI","Ports 7233 (gRPC Frontend) et 8080 (UI) ouverts dans votre pare-feu","Go 1.21+ ou Node.js 20+ selon le langage de votre Worker",{"type":113,"title":114,"steps":115},"steps","Déployer Temporal avec Docker Compose",[116,119,122,125,128,131,134,137,140,143],{"title":117,"body":118},"Créer le répertoire de travail","Créez un répertoire dédié et placez-vous dedans.\n\n```bash\nmkdir -p \u002Fopt\u002Ftemporal && cd \u002Fopt\u002Ftemporal\n```",{"title":120,"body":121},"Télécharger le fichier Docker Compose officiel","Temporal fournit un fichier Compose de référence dans son dépôt GitHub. Téléchargez la version PostgreSQL avec Elasticsearch désactivé pour un démarrage simple.\n\n```bash\ncurl -L https:\u002F\u002Fraw.githubusercontent.com\u002Ftemporalio\u002Fdocker-compose\u002Fmain\u002Fdocker-compose-postgres.yml -o docker-compose.yml\n```",{"title":123,"body":124},"Créer le fichier de variables d'environnement","Créez un fichier `.env` pour personnaliser les credentials PostgreSQL. Ne laissez jamais les mots de passe par défaut en production.\n\n```bash\ncat > .env \u003C\u003C 'EOF'\nDB=postgresql\nDB_PORT=5432\nPOSTGRES_USER=temporal\nPOSTGRES_PWD=changeme_strong_password\nPOSTGRES_SEEDS=postgresql\nTEMPORAL_ADDRESS=temporal:7233\nEOF\n```",{"title":126,"body":127},"Restreindre les permissions du fichier .env","Le fichier `.env` contient des credentials — limitez son accès.\n\n```bash\nchmod 600 .env\n```",{"title":129,"body":130},"Démarrer la stack Temporal","Lancez tous les services en arrière-plan. Le premier démarrage prend quelques minutes : `auto-setup` initialise le schéma PostgreSQL automatiquement.\n\n```bash\ndocker compose up -d\n```",{"title":132,"body":133},"Vérifier que tous les services sont sains","Attendez 60 à 90 secondes, puis vérifiez que les conteneurs sont en état `healthy` ou `running`.\n\n```bash\ndocker compose ps\n```",{"title":135,"body":136},"Vérifier la connexion au Frontend Service","Utilisez `tctl` (Temporal CLI) ou `temporal` CLI pour confirmer que le serveur répond sur le port gRPC.\n\n```bash\ndocker exec temporal-admin-tools temporal operator cluster health\n```",{"title":138,"body":139},"Créer un namespace de production","Temporal utilise des namespaces pour isoler les workflows. Créez un namespace dédié à votre application avec une rétention de 30 jours.\n\n```bash\ndocker exec temporal-admin-tools temporal operator namespace create --retention 30d myapp\n```",{"title":141,"body":142},"Accéder à l'UI Temporal","L'interface web est disponible sur le port 8080. En local : `http:\u002F\u002Flocalhost:8080`. En production, placez un reverse proxy nginx avec HTTPS devant ce port (voir section sécurité).\n\n```bash\ncurl -s http:\u002F\u002Flocalhost:8080 | grep -o '\u003Ctitle>[^\u003C]*\u003C\u002Ftitle>'\n```",{"title":144,"body":145},"Configurer le démarrage automatique","Activez le démarrage de Docker au boot du VPS. Les conteneurs ne repartent avec lui que si le fichier Compose leur donne une politique `restart` (par exemple `restart: unless-stopped`) : vérifiez-la avec `grep -n restart docker-compose.yml`.\n\n```bash\nsystemctl enable docker\n```",{"type":35,"title":147,"body":148,"subsections":149,"tip":171},"Configurer un Worker Go ou TypeScript simple","Un Worker est le processus qui exécute réellement votre code métier. Il se connecte au Frontend Service, poll une task queue et exécute les Workflows et Activities que Temporal lui dispatch. Voici un exemple minimal dans les deux langages les plus courants.",[150,162],{"lang":151,"body":152,"code_inline":153},"Go","Installez le SDK Go puis créez votre Worker :",[154,155,156,157,158,159,160,161],"go get go.temporal.io\u002Fsdk","\u002F\u002F main.go","c, _ := client.Dial(client.Options{HostPort: \"votre-domaine.com:7233\", Namespace: \"myapp\"})","defer c.Close()","w := worker.New(c, \"my-task-queue\", worker.Options{})","w.RegisterWorkflow(MyWorkflow)","w.RegisterActivity(MyActivity)","w.Run(worker.InterruptCh())",{"lang":163,"body":164,"code_inline":165},"TypeScript","Installez le SDK TypeScript puis créez votre Worker :",[166,167,168,169,170],"npm install @temporalio\u002Fworker @temporalio\u002Fclient","\u002F\u002F worker.ts","import { Worker } from '@temporalio\u002Fworker';","const worker = await Worker.create({ workflowsPath: require.resolve('.\u002Fworkflows'), activities, taskQueue: 'my-task-queue', connection: { address: 'votre-domaine.com:7233' } });","await worker.run();","Le Worker doit être déterministe côté Workflow : évitez les appels réseau, les dates système ou les nombres aléatoires directement dans le code Workflow. Isolez-les dans des Activities.",{"type":35,"title":173,"body":174,"items":175,"tip":182},"Temporal UI — surveiller et déboguer les workflows","L'UI Temporal (disponible sur le port 8080) est l'outil central pour observer vos workflows en production. Elle vous permet de :",[176,177,178,179,180,181],"Lister tous les workflows d'un namespace, filtrés par statut (Running, Completed, Failed, Terminated)","Inspecter l'historique complet d'un workflow : chaque événement (WorkflowStarted, ActivityScheduled, ActivityCompleted, etc.) avec son timestamp et son payload","Relancer manuellement un workflow échoué depuis l'UI sans redéployer votre code","Envoyer un Signal ou une Query à un workflow en cours d'exécution pour le débloquer ou interroger son état","Télécharger le payload complet d'une étape pour déboguer un problème de sérialisation","Consulter les Workers actifs et les task queues pour vérifier qu'un Worker est bien connecté avant de démarrer un workflow","En production, configurez une authentification devant l'UI (voir section sécurité). L'UI expose les payloads complets, qui peuvent contenir des données sensibles.",{"type":35,"title":184,"body":185,"items":186},"Sauvegardes PostgreSQL et persistence","La durabilité de Temporal repose entièrement sur PostgreSQL. Une instance non sauvegardée signifie une perte totale de l'historique des workflows en cas de défaillance du VPS.",[187,188,189,190,191,192],"Sauvegarde quotidienne avec `pg_dump` : `docker exec temporal-postgresql pg_dump -U temporal temporal | gzip > \u002Fbackups\u002Ftemporal-$(date +%F).sql.gz`","Rotation des sauvegardes : conservez au minimum 7 jours de sauvegardes, idéalement 30","Stockage hors-site : transférez les dumps vers un stockage objet (S3, Scaleway Object Storage) ou un autre VPS","Tester la restauration régulièrement : un dump non testé n'est pas une sauvegarde","Volume Docker nommé : vérifiez que le volume PostgreSQL est bien un volume nommé (`docker volume ls`) et non un montage éphémère","Rétention des workflows : configurez une rétention raisonnable par namespace (`temporal operator namespace update --retention 30d myapp`) pour éviter une croissance non contrôlée de la base",{"type":35,"title":194,"body":195,"errors":196},"Dépannage — erreurs fréquentes","Voici les quatre erreurs les plus courantes lors de l'installation de Temporal sur un VPS et leur résolution.",[197,201,205,209],{"message":198,"cause":199,"fix":200},"context deadline exceeded (code = DeadlineExceeded)","Le Worker ne peut pas atteindre le Frontend Service. Vérifiez que le port 7233 est ouvert dans le pare-feu du VPS (`ufw allow 7233\u002Ftcp`) et que l'adresse configurée dans votre SDK est correcte.","Testez la connectivité depuis le serveur Worker : `nc -zv votre-domaine.com 7233`",{"message":202,"cause":203,"fix":204},"Namespace 'default' is not found","Le namespace utilisé par votre Worker n'existe pas sur le serveur Temporal. Par défaut, `auto-setup` crée le namespace `default`, mais si vous avez créé un namespace personnalisé, veillez à le spécifier dans les options du SDK.","Listez les namespaces disponibles : `docker exec temporal-admin-tools temporal operator namespace list`",{"message":206,"cause":207,"fix":208},"FATAL: database 'temporal' does not exist","Le schéma PostgreSQL n'a pas été initialisé, souvent parce que le conteneur `auto-setup` a échoué lors du premier démarrage.","Consultez les logs : `docker compose logs temporal-auto-setup`. Si la base est manquante, supprimez le volume et redémarrez : `docker compose down -v && docker compose up -d`",{"message":210,"cause":211,"fix":212},"Worker versioning mismatch","Votre code Workflow a changé de manière non déterministe (nouvelle branche, appel d'activité ajouté sans `workflow.GetVersion`) et Temporal tente de rejouer l'historique ancien avec le nouveau code.","Utilisez `workflow.GetVersion` (Go) ou `patched` (TypeScript SDK) pour gérer les migrations de code Workflow sans casser le déterminisme.",{"type":214,"title":215,"body":216},"tip","Sécurité : ne pas exposer le Frontend Service sans authentification","Le port 7233 (gRPC Frontend) et le port 8080 (UI) ne doivent jamais être exposés directement sur Internet sans protection. Le Frontend Service n'embarque pas d'authentification native dans les versions open-source : quiconque peut s'y connecter peut démarrer, arrêter ou lire tous vos workflows. Mesures recommandées : (1) bloquez le port 7233 dans `ufw` et n'autorisez que les IPs de vos Workers (`ufw allow from 10.0.0.0\u002F8 to any port 7233`) ; (2) placez l'UI derrière un reverse proxy nginx avec authentification HTTP basique ou SSO ; (3) utilisez un VPN ou un réseau privé entre votre VPS Temporal et vos VPS Workers. En production, envisagez mTLS (disponible dans Temporal v1.x) pour chiffrer et authentifier la connexion gRPC.","Une infrastructure VPS pour Temporal","Temporal demande des ressources solides : le VPS Cloud ServOrbit fournit les vCPU, la RAM et le disque rapide nécessaires, avec Docker prêt à l'emploi et SSL automatique pour sécuriser la Web UI. Lancez votre orchestration durable en self-hosted.","Déployer mon VPS Cloud","\u002Fvps-cloud",[222,241,258],{"id":223,"slug":224,"slugs":225,"title":229,"excerpt":230,"readTime":231,"views":232,"isPinned":19,"noindex":19,"publishedAt":233,"updatedAt":234,"category":235,"categories":236,"featuredImage":29,"bgImage":30,"posterImage":238,"relatedSolution":239},3,"installer-n8n-vps",{"fr":224,"en":226,"ar":227,"es":228},"install-n8n-on-vps-with-docker-complete-2026-guide","تثبيت-n8n-على-vps-مع-docker-دليل-شامل-2026","instalar-n8n-en-vps-con-docker","Installer n8n sur VPS avec Docker : guide complet 2026","Déployez n8n sur VPS avec Docker, reverse proxy et HTTPS. Crash V8, 502 nginx, migration npm vers Docker et sécurisation des exécutions persistées (advisory août 2026).",19,4,"2026-06-05T00:00:00+00:00","2026-11-09T20:55:18+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[237],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Finstaller-n8n-vps-poster.svg",{"categorySlug":25,"appSlug":240},"n8n",{"id":242,"slug":243,"slugs":244,"title":248,"excerpt":249,"readTime":232,"views":18,"isPinned":19,"noindex":19,"publishedAt":250,"updatedAt":251,"category":252,"categories":253,"featuredImage":29,"bgImage":30,"posterImage":255,"relatedSolution":256},24,"installer-node-red-vps",{"fr":243,"en":245,"ar":246,"es":247},"installing-node-red-on-a-vps-self-hosted-automation","تثبيت-node-red-على-خادم-vps-أتمتة-ذاتية-الاستضافة","instalar-node-red-en-un-vps","Installer Node-RED sur un VPS : automatisation self-hosted","Installez Node-RED sur un VPS pour automatiser vos workflows en flow-based, connecter vos API et objets IoT, le tout self-hosted et sécurisé.","2026-05-27T00:00:00+00:00","2026-11-04T16:30:24+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[254],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Finstaller-node-red-vps-poster.svg",{"categorySlug":25,"appSlug":257},"node-red",{"id":259,"slug":260,"slugs":261,"title":265,"excerpt":266,"readTime":223,"views":267,"isPinned":19,"noindex":19,"publishedAt":268,"updatedAt":251,"category":269,"categories":270,"featuredImage":29,"bgImage":30,"posterImage":272,"relatedSolution":273},25,"installer-huginn-vps",{"fr":260,"en":262,"ar":263,"es":264},"installing-huginn-on-a-vps-self-hosted-automation","تثبيت-huginn-على-خادم-vps-أتمتة-ذاتية-الاستضافة","instalar-huginn-en-un-vps","Installer Huginn sur un VPS : automatisation self-hosted","Installez Huginn sur un VPS pour créer des agents qui surveillent le web, scrapent des pages et déclenchent des actions, 100% self-hosted.",0,"2026-05-26T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[271],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Finstaller-huginn-vps-poster.svg",{"categorySlug":25,"appSlug":274},"huginn",true,1794270740841]