[{"data":1,"prerenderedAt":269},["ShallowReactive",2],{"seo-verification":3,"blog-installing-temporal-on-a-vps-self-hosted-automation-ma-en":6,"promo-bar-likely":268},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-installing-temporal-on-a-vps-self-hosted-automation-ma-en",{"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":209,"ctaBody":210,"ctaButton":211,"ctaUrl":212,"relatedPosts":213},30,"installing-temporal-on-a-vps-self-hosted-automation",{"fr":12,"en":10,"ar":13,"es":14},"installer-temporal-vps","تثبيت-temporal-على-خادم-vps-أتمتة-ذاتية-الاستضافة","instalar-temporal-en-un-vps","Installing Temporal on a VPS: self-hosted automation","Deploy Temporal on your VPS: durable orchestration of fault-resistant workflows, with Go, Java, Python and TypeScript SDKs, 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,"Automation","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 is a durable workflow orchestration engine: your long-running processes survive restarts, outages and errors, because their state is persisted at every step. Designed for developers through SDKs (Go, Java, Python, TypeScript), it is ideal for complex transactions and sagas. Here's how to install it self-hosted on a VPS.",[34,44,54,64,103,112,146,165,175,185,205],{"type":35,"title":36,"body":37,"items":38},"h2","Why self-host Temporal on a VPS","Temporal Cloud exists, but self-hosting remains relevant for several reasons. Cost: starting from 99 DH\u002Fmonth, a ServOrbit VPS is sufficient for moderate workloads, without per-action or active workflow fees. Data sovereignty: your workflows may process sensitive information that must not pass through a third-party service. Flexibility: you control the deployed version, retention policies and internal network integrations.",[39,40,41,42,43],"Predictable cost: fixed VPS billing, no execution surcharge","Data on your infrastructure: no workflow or payload leaves your network","Private network integration: your Workers directly access internal databases and services","Version control: choose when to migrate to a new Temporal version","Full observability: logs, metrics and traces under your control",{"type":35,"title":45,"body":46,"items":47},"Temporal use cases","Temporal shines where cron jobs and simple queues show their limits. Here are the most common production use cases.",[48,49,50,51,52,53],"E-commerce workflows: sequence order → payment → stock check → shipping → confirmation email over minutes or hours, with automatic retry at each step","Saga pattern for distributed transactions: automatically compensate previous steps if a later step fails","Long user onboarding: send email day 0, wait 48h, send reminder, await KYC verification, unlock access — all in one readable workflow","Resumable data sync: import large CSV files, resume from the last processed record on interruption","Automatic retry with exponential backoff: calls to unstable third-party APIs without writing retry logic in your application code","ETL and ML pipelines: orchestrate data transformations where some steps take several hours",{"type":35,"title":55,"body":56,"items":57},"Architecture of self-hosted Temporal","Understanding the internal components helps you size your VPS and diagnose issues. Temporal consists of four main services that can run in the same process (`temporalio\u002Fauto-setup`) or be deployed separately at scale.",[58,59,60,61,62,63],"Frontend Service: gRPC entry point for Workers and SDK clients. Port 7233","History Service: core engine — persists the immutable history of each workflow in PostgreSQL","Matching Service: dispatches tasks to available Workers via internal queues","Worker Service (internal): executes Temporal's own system workflows","PostgreSQL: primary storage for history and visibility","Elasticsearch (optional): enriches UI search with custom attribute filtering",{"type":65,"title":66,"headers":67,"rows":72},"comparison","Temporal vs BullMQ vs Celery",[68,69,70,71],"Criterion","Temporal","BullMQ","Celery",[73,78,83,88,93,98],[74,75,76,77],"State durability","Full history persisted in database — an interrupted workflow resumes exactly where it left off","State in Redis — a Redis loss means job loss","Optional results backend — no native execution history",[79,80,81,82],"Replay and determinism","Automatic replay from history — workflow code must be deterministic, Temporal handles the rest","No native replay — simple retry on failure","Per-task configurable retry, no multi-step workflow replay",[84,85,86,87],"Observation UI","Rich built-in UI: workflow list, step detail, search, manual actions","Bull Board as third-party plugin — functional but limited","Flower as separate tool — basic metrics, no step history",[89,90,91,92],"Supported languages","Go, TypeScript\u002FJavaScript, Python, Java, ‎.NET, PHP (official SDKs)","Node.js only","Primarily Python",[94,95,96,97],"Performance and latency","Higher overhead per task — optimized for durability over low latency","Very low latency — designed for high-frequency job queues","Variable latency depending on broker",[99,100,101,102],"Ideal use case","Long critical business workflows, saga pattern, multi-step processes over days","High-frequency task queues, image processing, real-time notifications","Python background tasks, data pipelines, existing Python ecosystem",{"type":35,"title":104,"body":105,"items":106},"Technical prerequisites","Before starting, verify your environment is ready.",[107,108,109,110,111],"A VPS running Ubuntu 22.04 or Debian 12 with at least 2 vCPU and 4 GB RAM","Docker 24+ and Docker Compose v2 installed","A domain name pointing to your VPS for HTTPS access to the UI","Ports 7233 (gRPC Frontend) and 8080 (UI) open in your firewall","Go 1.21+ or Node.js 20+ depending on your Worker language",{"type":113,"title":114,"steps":115},"steps","Deploy Temporal with Docker Compose",[116,119,122,125,128,131,134,137,140,143],{"title":117,"body":118},"Create the working directory","Create a dedicated directory and navigate into it.\n\n```bash\nmkdir -p \u002Fopt\u002Ftemporal && cd \u002Fopt\u002Ftemporal\n```",{"title":120,"body":121},"Download the official Docker Compose file","Temporal provides a reference Compose file in its GitHub repository.\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},"Create the environment variables file","Create a `.env` file to customize PostgreSQL credentials. Never leave default passwords in production.\n\n```bash\nchmod 600 .env\n```",{"title":126,"body":127},"Restrict .env file permissions","The `.env` file contains credentials — restrict access.\n\n```bash\nchmod 600 .env\n```",{"title":129,"body":130},"Start the Temporal stack","Launch all services in the background. First startup takes a few minutes as `auto-setup` initializes the PostgreSQL schema.\n\n```bash\ndocker compose up -d\n```",{"title":132,"body":133},"Verify all services are healthy","Wait 60-90 seconds, then check that containers are in `healthy` or `running` state.\n\n```bash\ndocker compose ps\n```",{"title":135,"body":136},"Verify connection to the Frontend Service","Confirm the server responds on the gRPC port.\n\n```bash\ndocker exec temporal-admin-tools temporal operator cluster health\n```",{"title":138,"body":139},"Create a production namespace","Create a dedicated namespace for your application with a 30-day retention.\n\n```bash\ndocker exec temporal-admin-tools temporal operator namespace create --retention 30d myapp\n```",{"title":141,"body":142},"Access the Temporal UI","The web interface is available on port 8080.\n\n```bash\ncurl -s http:\u002F\u002Flocalhost:8080 | grep -o '\u003Ctitle>[^\u003C]*\u003C\u002Ftitle>'\n```",{"title":144,"body":145},"Configure automatic startup","Enable Docker at VPS boot. Containers only come back with it if the Compose file gives them a `restart` policy (for example `restart: unless-stopped`): check it with `grep -n restart docker-compose.yml`.\n\n```bash\nsystemctl enable docker\n```",{"type":35,"title":147,"body":148,"subsections":149},"Configure a simple Go or TypeScript Worker","A Worker is the process that actually executes your business code. It connects to the Frontend Service, polls a task queue and executes the Workflows and Activities that Temporal dispatches to it.",[150,159],{"lang":151,"code_inline":152},"Go",[153,154,155,156,157,158],"go get go.temporal.io\u002Fsdk","c, _ := client.Dial(client.Options{HostPort: \"your-domain.com:7233\", Namespace: \"myapp\"})","w := worker.New(c, \"my-task-queue\", worker.Options{})","w.RegisterWorkflow(MyWorkflow)","w.RegisterActivity(MyActivity)","w.Run(worker.InterruptCh())",{"lang":160,"code_inline":161},"TypeScript",[162,163,164],"npm install @temporalio\u002Fworker @temporalio\u002Fclient","const worker = await Worker.create({ workflowsPath: require.resolve('.\u002Fworkflows'), activities, taskQueue: 'my-task-queue', connection: { address: 'your-domain.com:7233' } });","await worker.run();",{"type":35,"title":166,"body":167,"items":168},"Temporal UI — monitor and debug workflows","The Temporal UI (available on port 8080) is the central tool for observing your workflows in production.",[169,170,171,172,173,174],"List all workflows in a namespace, filtered by status (Running, Completed, Failed, Terminated)","Inspect the complete history of a workflow: each event with its timestamp and payload","Manually restart a failed workflow from the UI without redeploying your code","Send a Signal or Query to a running workflow to unblock it or query its state","Download the full payload of a step to debug a serialization issue","Check active Workers and task queues to verify a Worker is connected before starting a workflow",{"type":35,"title":176,"body":177,"items":178},"PostgreSQL backups and persistence","Temporal's durability relies entirely on PostgreSQL. An unbackedup instance means total history loss on VPS failure.",[179,180,181,182,183,184],"Daily backup with `pg_dump`: `docker exec temporal-postgresql pg_dump -U temporal temporal | gzip > \u002Fbackups\u002Ftemporal-$(date +%F).sql.gz`","Backup rotation: keep at least 7 days, ideally 30","Off-site storage: transfer dumps to object storage or another VPS","Test restoration regularly: an untested dump is not a backup","Named Docker volume: verify the PostgreSQL volume is a named volume, not ephemeral","Workflow retention: set a reasonable retention per namespace to avoid unbounded database growth",{"type":35,"title":186,"body":187,"errors":188},"Troubleshooting — common errors","Here are the four most common errors when installing Temporal on a VPS and their resolution.",[189,193,197,201],{"message":190,"cause":191,"fix":192},"context deadline exceeded (code = DeadlineExceeded)","The Worker cannot reach the Frontend Service. Check that port 7233 is open in the VPS firewall.","Test connectivity: `nc -zv your-domain.com 7233`",{"message":194,"cause":195,"fix":196},"Namespace 'default' is not found","The namespace used by your Worker does not exist on the Temporal server.","List available namespaces: `docker exec temporal-admin-tools temporal operator namespace list`",{"message":198,"cause":199,"fix":200},"FATAL: database 'temporal' does not exist","The PostgreSQL schema was not initialized, often because the `auto-setup` container failed on first startup.","Check logs: `docker compose logs temporal-auto-setup`. Remove volume and restart: `docker compose down -v && docker compose up -d`",{"message":202,"cause":203,"fix":204},"Worker versioning mismatch","Your Workflow code changed in a non-deterministic way and Temporal tries to replay old history with new code.","Use `workflow.GetVersion` (Go) or `patched` (TypeScript SDK) to handle Workflow code migrations without breaking determinism.",{"type":206,"title":207,"body":208},"tip","Security: do not expose Frontend Service without authentication","Port 7233 (gRPC Frontend) and port 8080 (UI) must never be exposed directly to the Internet. Recommended measures: (1) block port 7233 in `ufw` and allow only your Workers' IPs; (2) place the UI behind an nginx reverse proxy with HTTP basic auth or SSO; (3) use a VPN or private network between your Temporal VPS and Worker VPS. In production, consider mTLS (available in Temporal v1.x) to encrypt and authenticate gRPC connections.","A VPS infrastructure for Temporal","Temporal demands solid resources: the ServOrbit Cloud VPS provides the necessary vCPU, RAM and fast disk, with Docker ready to use and automatic SSL to secure the Web UI. Launch your durable orchestration self-hosted.","Deploy my Cloud VPS","\u002Fvps-cloud",[214,234,251],{"id":215,"slug":216,"slugs":217,"title":221,"excerpt":222,"readTime":223,"views":224,"isPinned":19,"noindex":19,"publishedAt":225,"updatedAt":226,"category":227,"categories":228,"featuredImage":29,"bgImage":30,"posterImage":230,"relatedSolution":231},3,"install-n8n-on-vps-with-docker-complete-2026-guide",{"fr":218,"en":216,"ar":219,"es":220},"installer-n8n-vps","تثبيت-n8n-على-vps-مع-docker-دليل-شامل-2026","instalar-n8n-en-vps-con-docker","Install n8n on VPS with Docker: complete 2026 guide","Deploy n8n on VPS with Docker, reverse proxy and HTTPS. Covers V8 crash, 502 nginx, npm migration and execution security (GHSA-vrv8-j27g-g7cr advisory, August 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},[229],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Finstaller-n8n-vps-poster.svg",{"categorySlug":232,"appSlug":233},"automation-workflows","n8n",{"id":235,"slug":236,"slugs":237,"title":241,"excerpt":242,"readTime":224,"views":18,"isPinned":19,"noindex":19,"publishedAt":243,"updatedAt":244,"category":245,"categories":246,"featuredImage":29,"bgImage":30,"posterImage":248,"relatedSolution":249},24,"installing-node-red-on-a-vps-self-hosted-automation",{"fr":238,"en":236,"ar":239,"es":240},"installer-node-red-vps","تثبيت-node-red-على-خادم-vps-أتمتة-ذاتية-الاستضافة","instalar-node-red-en-un-vps","Installing Node-RED on a VPS: self-hosted automation","Install Node-RED on a VPS to automate your flow-based workflows, connect your APIs and IoT devices, all self-hosted and secure.","2026-05-27T00:00:00+00:00","2026-11-04T16:30:24+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[247],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Finstaller-node-red-vps-poster.svg",{"categorySlug":232,"appSlug":250},"node-red",{"id":252,"slug":253,"slugs":254,"title":258,"excerpt":259,"readTime":215,"views":260,"isPinned":19,"noindex":19,"publishedAt":261,"updatedAt":244,"category":262,"categories":263,"featuredImage":29,"bgImage":30,"posterImage":265,"relatedSolution":266},25,"installing-huginn-on-a-vps-self-hosted-automation",{"fr":255,"en":253,"ar":256,"es":257},"installer-huginn-vps","تثبيت-huginn-على-خادم-vps-أتمتة-ذاتية-الاستضافة","instalar-huginn-en-un-vps","Installing Huginn on a VPS: self-hosted automation","Install Huginn on a VPS to build agents that monitor the web, scrape pages and trigger actions, 100% self-hosted.",0,"2026-05-26T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[264],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Finstaller-huginn-vps-poster.svg",{"categorySlug":232,"appSlug":267},"huginn",true,1794270436777]