[{"data":1,"prerenderedAt":280},["ShallowReactive",2],{"seo-verification":3,"blog-instalar-temporal-en-un-vps-es":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-instalar-temporal-en-un-vps-es",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":27,"featuredImage":29,"bgImage":30,"posterImage":31,"relatedSolution":29,"intro":32,"sections":33,"ctaTitle":222,"ctaBody":223,"ctaButton":224,"ctaUrl":225,"relatedPosts":226},30,"instalar-temporal-en-un-vps",{"fr":12,"en":13,"ar":14,"es":10},"installer-temporal-vps","installing-temporal-on-a-vps-self-hosted-automation","تثبيت-temporal-على-خادم-vps-أتمتة-ذاتية-الاستضافة","Instalar Temporal en un VPS: automatización self-hosted","Despliegue Temporal en su VPS: orquestación duradera de workflows resistentes a fallos, con SDK de Go, Java, Python y TypeScript, self-hosted.",10,0,false,"2026-05-21T00:00:00+00:00","2026-09-16T14:44:15+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},2,"Automatización","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 es un motor de orquestación de workflows duraderos: sus procesos largos sobreviven a los reinicios, a las caídas y a los errores, porque su estado se persiste en cada etapa. Diseñado para desarrolladores mediante SDK (Go, Java, Python, TypeScript), es ideal para las transacciones complejas y las sagas. Así se instala en self-hosted en un VPS.",[34,44,54,64,103,111,155,177,188,198,218],{"type":35,"title":36,"body":37,"items":38},"h2","Por qué alojar Temporal en un VPS","Temporal Cloud existe, pero el self-hosting sigue siendo relevante. Coste: desde 99 DH\u002Fmes\u002Fmes, un VPS ServOrbit es suficiente para cargas moderadas. Soberanía de datos: tus workflows pueden procesar información sensible que no debe pasar por un servicio externo. Flexibilidad: controlas la versión desplegada, las políticas de retención y las integraciones de red internas.",[39,40,41,42,43],"Coste predecible: facturación VPS fija, sin cargo extra por ejecución","Datos en tu infraestructura: ningún workflow ni payload abandona tu red","Integración de red privada: tus Workers acceden directamente a bases de datos y servicios internos","Control de versión: elige cuándo migrar a una nueva versión de Temporal","Observabilidad completa: logs, métricas y trazas bajo tu control",{"type":35,"title":45,"body":46,"items":47},"Casos de uso de Temporal","Temporal destaca donde los cron jobs y las colas simples muestran sus límites. Estos son los casos de uso más comunes en entornos de producción.",[48,49,50,51,52,53],"Workflows e-commerce: secuenciar pedido → pago → verificación de stock → envío → email de confirmación a lo largo de minutos u horas, con reintento automático en cada paso","Patrón Saga para transacciones distribuidas: compensar automáticamente los pasos anteriores si un paso posterior falla (p. ej.: cancelar una reserva si se rechaza el pago)","Onboarding de usuario largo: enviar email día 0, esperar 48 h, enviar recordatorio, esperar verificación KYC, desbloquear el acceso — todo en un único workflow legible","Sincronización de datos periódica con reanudación: importar archivos CSV voluminosos, reanudando desde el último registro procesado en caso de interrupción","Reintento automático con backoff exponencial: llamadas a APIs externas inestables sin escribir lógica de reintento en tu código","Pipelines ETL y ML: orquestar transformaciones de datos cuyas etapas pueden durar varias horas",{"type":35,"title":55,"body":56,"items":57},"Arquitectura de Temporal auto-alojado","Comprender los componentes internos te ayuda a dimensionar tu VPS y a diagnosticar problemas. Temporal está compuesto por cuatro servicios principales que pueden ejecutarse en el mismo proceso (`temporalio\u002Fauto-setup`) o desplegarse por separado a gran escala.",[58,59,60,61,62,63],"Frontend Service: punto de entrada gRPC para los Workers y los clientes SDK. Recibe las solicitudes de inicio de workflow, las señales y las consultas de la UI. Puerto por defecto: 7233","History Service: núcleo del motor. Persiste el historial inmutable de cada workflow en PostgreSQL (o MySQL). Es quien garantiza la durabilidad — incluso tras un fallo, el historial permanece intacto","Matching Service: distribuye las tareas (Activity Tasks, Workflow Tasks) hacia los Workers disponibles mediante un sistema de colas interno. Gestiona el enrutamiento por task queue","Worker Service (interno): ejecuta los workflows del sistema de Temporal (replicación, archivado). No debe confundirse con tus Workers de aplicación","PostgreSQL: almacenamiento principal del historial y la visibilidad. En un VPS individual, una instancia PostgreSQL local es suficiente","Elasticsearch (opcional): enriquece la búsqueda en la UI — filtrar workflows por atributo personalizado, búsqueda de texto completo. No es necesario para empezar",{"type":65,"title":66,"headers":67,"rows":72},"comparison","Temporal vs BullMQ vs Celery",[68,69,70,71],"Criterio","Temporal","BullMQ","Celery",[73,78,83,88,93,98],[74,75,76,77],"Durabilidad del estado","Historial completo persistido en base de datos — un workflow interrumpido se reanuda exactamente donde estaba","Estado en Redis — una pérdida de Redis significa pérdida de jobs","Backend de resultados opcional — sin historial de ejecución nativo",[79,80,81,82],"Replay y determinismo","Replay automático desde el historial — el código de workflow debe ser determinista","Sin replay nativo — reintento simple en caso de fallo","Reintento configurable por tarea, sin replay de workflow multi-paso",[84,85,86,87],"UI de observación","UI rica incluida: lista de workflows, detalle de cada paso, búsqueda, acciones manuales","Bull Board como plugin de terceros","Flower como herramienta separada — métricas básicas",[89,90,91,92],"Lenguajes soportados","Go, TypeScript\u002FJavaScript, Python, Java, ‎.NET, PHP (SDKs oficiales)","Solo Node.js","Principalmente Python",[94,95,96,97],"Rendimiento y latencia","Mayor sobrecarga por tarea — optimizado para durabilidad, no para velocidad","Latencia muy baja — pensado para jobs de alta frecuencia","Latencia variable según el broker",[99,100,101,102],"Caso de uso ideal","Workflows de negocio largos y críticos, patrón Saga, procesos multi-paso durante días","Colas de tareas de alta frecuencia, procesamiento de imágenes, notificaciones en tiempo real","Tareas background Python, pipelines de datos",{"type":35,"title":104,"items":105},"Requisitos técnicos",[106,107,108,109,110],"Un VPS con Ubuntu 22.04 o Debian 12, mínimo 2 vCPU y 4 GB de RAM","Docker 24+ y Docker Compose v2 instalados","Un nombre de dominio apuntando a tu VPS para acceso HTTPS a la UI","Puertos 7233 (gRPC Frontend) y 8080 (UI) abiertos en el firewall","Go 1.21+ o Node.js 20+ según el lenguaje de tu Worker",{"type":112,"title":113,"steps":114},"steps","Desplegar Temporal con Docker Compose",[115,119,123,127,131,135,139,143,147,151],{"title":116,"command":117,"body":118},"Crear el directorio de trabajo","mkdir -p \u002Fopt\u002Ftemporal && cd \u002Fopt\u002Ftemporal","Crea un directorio dedicado y sitúate en él.",{"title":120,"command":121,"body":122},"Descargar el archivo Docker Compose oficial","curl -L https:\u002F\u002Fraw.githubusercontent.com\u002Ftemporalio\u002Fdocker-compose\u002Fmain\u002Fdocker-compose-postgres.yml -o docker-compose.yml","Temporal proporciona un archivo Compose de referencia en su repositorio de GitHub. Descarga la versión PostgreSQL con Elasticsearch desactivado para un inicio sencillo.",{"title":124,"body":125,"command":126},"Crear el archivo de variables de entorno","Crea un archivo `.env` para personalizar las credenciales de PostgreSQL. Nunca dejes contraseñas por defecto en producción.","cat > .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",{"title":128,"body":129,"command":130},"Restringir los permisos del archivo .env","El archivo `.env` contiene credenciales — limita su acceso.","chmod 600 .env",{"title":132,"command":133,"body":134},"Iniciar la stack de Temporal","docker compose up -d","Lanza todos los servicios en segundo plano. El primer arranque tarda unos minutos: `auto-setup` inicializa el esquema de PostgreSQL automáticamente.",{"title":136,"command":137,"body":138},"Verificar que todos los servicios están sanos","docker compose ps","Espera 60 a 90 segundos, luego verifica que los contenedores están en estado `healthy` o `running`.",{"title":140,"command":141,"body":142},"Verificar la conexión al Frontend Service","docker exec temporal-admin-tools temporal operator cluster health","Usa la CLI de Temporal para confirmar que el servidor responde en el puerto gRPC.",{"title":144,"command":145,"body":146},"Crear un namespace de producción","docker exec temporal-admin-tools temporal operator namespace create --retention 30d myapp","Temporal usa namespaces para aislar los workflows. Crea un namespace dedicado a tu aplicación con una retención de 30 días.",{"title":148,"body":149,"command":150},"Acceder a la UI de Temporal","La interfaz web está disponible en el puerto 8080. En producción, coloca un reverse proxy nginx con HTTPS delante de este puerto (ver sección de seguridad).","curl -s http:\u002F\u002Flocalhost:8080 | grep -o '\u003Ctitle>[^\u003C]*\u003C\u002Ftitle>'",{"title":152,"body":153,"command":154},"Configurar el inicio automático","Activa el reinicio automático de la stack tras un reinicio del VPS.","docker compose up -d --restart-policy unless-stopped || true\n# Alternativa systemd:\nsystemctl enable docker",{"type":35,"title":156,"body":157,"subsections":158,"tip":176},"Configurar un Worker simple en Go o TypeScript","Un Worker es el proceso que ejecuta realmente tu código de negocio. Se conecta al Frontend Service, hace polling de una task queue y ejecuta los Workflows y Activities que Temporal le despacha.",[159,169],{"lang":160,"code_inline":161,"body":168},"Go",[162,163,164,165,166,167],"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())","Instala el SDK de Go y crea tu Worker:",{"lang":170,"code_inline":171,"body":175},"TypeScript",[172,173,174],"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();","Instala el SDK de TypeScript y crea tu Worker:","El Worker debe ser determinista en el lado del Workflow: evita llamadas de red, fechas del sistema o números aleatorios directamente en el código Workflow. Aíslados en Activities.",{"type":35,"title":178,"body":179,"items":180,"tip":187},"Temporal UI — monitorear y depurar workflows","La UI de Temporal (disponible en el puerto 8080) es la herramienta central para observar tus workflows en producción. Te permite:",[181,182,183,184,185,186],"Listar todos los workflows de un namespace, filtrados por estado (Running, Completed, Failed, Terminated)","Inspeccionar el historial completo de un workflow: cada evento (WorkflowStarted, ActivityScheduled, ActivityCompleted, etc.) con su timestamp y su payload","Relanzar manualmente un workflow fallido desde la UI sin redesplegar tu código","Enviar una Signal o una Query a un workflow en ejecución para desbloquearlo o consultar su estado","Descargar el payload completo de un paso para depurar un problema de serialización","Consultar los Workers activos y las task queues para verificar que un Worker está conectado antes de iniciar un workflow","En producción, configura una autenticación delante de la UI (ver sección de seguridad). La UI expone los payloads completos, que pueden contener datos sensibles.",{"type":35,"title":189,"body":190,"items":191},"Copias de seguridad de PostgreSQL y persistencia","La durabilidad de Temporal depende íntegramente de PostgreSQL. Una instancia sin copias de seguridad implica la pérdida total del historial de workflows en caso de fallo del VPS.",[192,193,194,195,196,197],"Copia de seguridad diaria con `pg_dump`: `docker exec temporal-postgresql pg_dump -U temporal temporal | gzip > \u002Fbackups\u002Ftemporal-$(date +%F).sql.gz`","Rotación de copias de seguridad: conserva un mínimo de 7 días de copias de seguridad, idealmente 30","Almacenamiento fuera del sitio: transfiere los dumps a un almacenamiento de objetos (S3, Scaleway Object Storage) u otro VPS","Probar la restauración regularmente: un dump no probado no es una copia de seguridad","Volumen Docker con nombre: verifica que el volumen de PostgreSQL sea un volumen con nombre (`docker volume ls`) y no un montaje efímero","Retención de workflows: configura una retención razonable por namespace (`temporal operator namespace update --retention 30d myapp`) para evitar un crecimiento incontrolado de la base de datos",{"type":35,"title":199,"body":200,"errors":201},"Resolución de problemas — errores frecuentes","Estos son los cuatro errores más comunes al instalar Temporal en un VPS y su solución.",[202,206,210,214],{"message":203,"cause":204,"fix":205},"context deadline exceeded (code = DeadlineExceeded)","El Worker no puede alcanzar el Frontend Service. Verifica que el puerto 7233 esté abierto en el cortafuegos del VPS (`ufw allow 7233\u002Ftcp`) y que la dirección configurada en tu SDK sea correcta.","Prueba la conectividad desde el servidor Worker: `nc -zv votre-domaine.com 7233`",{"message":207,"cause":208,"fix":209},"Namespace 'default' is not found","El namespace utilizado por tu Worker no existe en el servidor Temporal. Por defecto, `auto-setup` crea el namespace `default`, pero si creaste un namespace personalizado, asegúrate de especificarlo en las opciones del SDK.","Lista los namespaces disponibles: `docker exec temporal-admin-tools temporal operator namespace list`",{"message":211,"cause":212,"fix":213},"FATAL: database 'temporal' does not exist","El esquema de PostgreSQL no ha sido inicializado, generalmente porque el contenedor `auto-setup` falló durante el primer arranque.","Consulta los logs: `docker compose logs temporal-auto-setup`. Si la base de datos falta, elimina el volumen y reinicia: `docker compose down -v && docker compose up -d`",{"message":215,"cause":216,"fix":217},"Worker versioning mismatch","El código de tu Workflow cambió de forma no determinista (nueva rama, llamada de actividad añadida sin `workflow.GetVersion`) y Temporal intenta reproducir el historial antiguo con el nuevo código.","Usa `workflow.GetVersion` (Go) o `patched` (TypeScript SDK) para gestionar las migraciones de código de Workflow sin romper el determinismo.",{"type":219,"title":220,"body":221},"tip","Seguridad: no expongas el Frontend Service sin autenticación","Los puertos 7233 (gRPC Frontend) y 8080 (UI) nunca deben exponerse directamente a Internet sin protección. El Frontend Service no incluye autenticación nativa en las versiones open-source: cualquiera que pueda conectarse puede iniciar, detener o leer todos tus workflows. Medidas recomendadas: (1) bloquea el puerto 7233 en `ufw` y autoriza solo las IPs de tus Workers (`ufw allow from 10.0.0.0\u002F8 to any port 7233`); (2) coloca la UI detrás de un reverse proxy nginx con autenticación HTTP básica o SSO; (3) usa una VPN o una red privada entre tu VPS de Temporal y tus VPS de Workers. En producción, considera mTLS (disponible en Temporal v1.x) para cifrar y autenticar la conexión gRPC.","Una infraestructura VPS para Temporal","Temporal exige recursos sólidos: el VPS Cloud de ServOrbit aporta los vCPU, la RAM y el disco rápido necesarios, con Docker listo para usar y SSL automático para proteger la Web UI. Ponga en marcha su orquestación duradera en self-hosted.","Desplegar mi VPS Cloud","\u002Fvps-cloud",[227,246,264],{"id":228,"slug":229,"slugs":230,"title":234,"excerpt":235,"readTime":236,"views":23,"isPinned":19,"publishedAt":237,"updatedAt":238,"category":239,"categories":240,"featuredImage":29,"bgImage":30,"posterImage":242,"relatedSolution":243},3,"instalar-n8n-en-vps-con-docker",{"fr":231,"en":232,"ar":233,"es":229},"installer-n8n-vps","install-n8n-on-vps-with-docker-complete-2026-guide","تثبيت-n8n-على-vps-مع-docker-دليل-شامل-2026","Instalar n8n en un VPS con Docker: guía completa 2026","Despliegue n8n en VPS con Docker, reverse proxy y HTTPS. Crash V8, 502 nginx, migración de npm a Docker y seguridad de ejecuciones persistidas (advisory agosto 2026).",12,"2026-06-05T00:00:00+00:00","2026-09-08T22:00:02+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[241],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Finstaller-n8n-vps-poster.svg",{"categorySlug":244,"appSlug":245},"automatizacion","n8n",{"id":247,"slug":248,"slugs":249,"title":253,"excerpt":254,"readTime":255,"views":18,"isPinned":19,"publishedAt":256,"updatedAt":257,"category":258,"categories":259,"featuredImage":29,"bgImage":30,"posterImage":261,"relatedSolution":262},24,"instalar-node-red-en-un-vps",{"fr":250,"en":251,"ar":252,"es":248},"installer-node-red-vps","installing-node-red-on-a-vps-self-hosted-automation","تثبيت-node-red-على-خادم-vps-أتمتة-ذاتية-الاستضافة","Instalar Node-RED en un VPS: automatización self-hosted","Instale Node-RED en un VPS para automatizar sus flujos de trabajo flow-based, conectar sus API y dispositivos IoT, todo self-hosted y seguro.",4,"2026-05-27T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[260],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Finstaller-node-red-vps-poster.svg",{"categorySlug":244,"appSlug":263},"node-red",{"id":265,"slug":266,"slugs":267,"title":271,"excerpt":272,"readTime":228,"views":18,"isPinned":19,"publishedAt":273,"updatedAt":257,"category":274,"categories":275,"featuredImage":29,"bgImage":30,"posterImage":277,"relatedSolution":278},25,"instalar-huginn-en-un-vps",{"fr":268,"en":269,"ar":270,"es":266},"installer-huginn-vps","installing-huginn-on-a-vps-self-hosted-automation","تثبيت-huginn-على-خادم-vps-أتمتة-ذاتية-الاستضافة","Instalar Huginn en un VPS: automatización self-hosted","Instale Huginn en un VPS para crear agentes que vigilan la web, extraen datos de páginas y disparan acciones, 100% self-hosted.","2026-05-26T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[276],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Finstaller-huginn-vps-poster.svg",{"categorySlug":244,"appSlug":279},"huginn",1789665023066]