[{"data":1,"prerenderedAt":194},["ShallowReactive",2],{"seo-verification":3,"blog-instalar-trigger-dev-en-un-vps-es":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-instalar-trigger-dev-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":32,"intro":35,"sections":36,"ctaTitle":137,"ctaBody":138,"ctaButton":139,"ctaUrl":140,"relatedPosts":141},32,"instalar-trigger-dev-en-un-vps",{"fr":12,"en":13,"ar":14,"es":10},"installer-trigger-dev-vps","installing-triggerdev-on-a-vps-self-hosted-automation","تثبيت-triggerdev-على-خادم-vps-أتمتة-ذاتية-الاستضافة","Instalar Trigger.dev en un VPS: guía completa self-hosted","Guía completa para instalar Trigger.dev en un VPS: Docker, proxy inverso, secretos, workers y solución de errores — totalmente gratuito, sin límites SaaS.",9,0,false,"2026-05-19T00:00:00+00:00","2026-09-09T21:41:06+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-trigger-dev-vps-poster.svg",{"categorySlug":33,"appSlug":34},"automatizacion","trigger-dev","Trigger.dev es una plataforma de orquestación de tareas en segundo plano diseñada para desarrolladores: jobs duraderos, reintentos automáticos y panel en tiempo real. Al autoalojarlo en un VPS, obtiene una instalación totalmente gratuita e ilimitada — sin suscripción SaaS, sin cuota de ejecuciones. Esta guía cubre la instalación completa de principio a fin: requisitos previos, generación de secretos, proxy inverso HTTPS, conexión de su primer proyecto TypeScript y solución de los errores más frecuentes.",[37,41,52,88,91,113,116,119,123,126,135],{"type":38,"title":39,"body":40},"h2","Por qué autoalojar Trigger.dev en un VPS","Trigger.dev sustituye las colas caseras (BullMQ, cron frágiles, Lambda que expiran) por una plataforma unificada: tareas duraderas, reintentos automáticos, gestión de la concurrencia y panel en tiempo real. La versión cloud factura por número de ejecuciones y limita la duración de los jobs, algo que enseguida resulta restrictivo para procesos ETL, envíos masivos de correo o llamadas lentas a API.\n\nEn self-hosted sobre un VPS, mantiene sus workers en casa: sus claves API de terceros (OpenAI, Stripe, Resend) nunca pasan por un intermediario, y sus jobs pueden durar 10 minutos o varias horas sin ser interrumpidos. El stack se apoya en PostgreSQL, Redis y Docker, lo que lo hace reproducible y fácil de respaldar. La instalación es **totalmente gratuita**: sin licencia, sin suscripción — solo el coste del VPS.",{"type":42,"title":43,"items":44},"ul","Lo que gana al autoalojarlo",[45,46,47,48,49,50,51],"Ningún límite en la duración ni en el número de ejecuciones de sus tareas en segundo plano.","Sus secretos (claves API, tokens) permanecen en su infraestructura, nunca en un SaaS de terceros.","Coste fijo previsible: un solo VPS en lugar de una factura que crece con el volumen.","Ningún salto por la red pública si sus workers se ejecutan junto a su base de datos y su aplicación.","Control total sobre las versiones, las variables de entorno y la retención de los logs.","Posibilidad de lanzar jobs desde sus webhooks internos sin exponer ningún servicio externo.","Actualización a su ritmo: usted decide cuándo migrar a una nueva versión de Trigger.dev.",{"type":53,"title":54,"headers":55,"rows":59},"comparison","Trigger.dev self-hosted vs cloud: lo que cambia realmente",[56,57,58],"Criterio","Cloud (SaaS)","VPS self-hosted",[60,64,68,72,76,80,84],[61,62,63],"Duración máxima de un job","Limitada (pocos minutos)","Ilimitada",[65,66,67],"Coste por volumen","Crece con las ejecuciones","Fijo (VPS mensual)",[69,70,71],"Secretos \u002F claves API","Pasan por la nube","Se quedan en su infra",[73,74,75],"Actualizaciones","Automáticas, impuestas","A su ritmo",[77,78,79],"Acceso a red interna","Imposible sin túnel","Directo, sin latencia pública",[81,82,83],"Retención de logs","Limitada por el plan","Controlada por usted",[85,86,87],"Configuración inicial","Cero configuración","~30 minutos (esta guía)",{"type":38,"title":89,"body":90},"Requisitos de hardware y software","Trigger.dev es un stack relativamente exigente porque combina la aplicación web, workers, PostgreSQL y Redis. Prevea un VPS con **al menos 4 GB de RAM y 2 vCPU** para un uso de producción ligero; apunte a 8 GB de RAM y 4 vCPU si ejecuta muchos jobs concurrentes o procesos pesados. Cuente con 40 GB de disco SSD para la base de datos, los logs y las imágenes Docker.\n\nEn el plano del software: **Docker Engine 24+** y el plugin Docker Compose v2 (compruébelo con `docker compose version`), un nombre de dominio que apunte a la IP del VPS (por ejemplo `trigger.mondomaine.com`), y el puerto 443 abierto para HTTPS. Dos secretos son imprescindibles: `MAGIC_LINK_SECRET` (autenticación sin contraseña) y `ENCRYPTION_KEY` (32 caracteres hexadecimales, cifra las variables de entorno de los proyectos). Genérelos antes de comenzar — no pueden regenerarse sin romper los datos existentes.",{"type":92,"title":93,"steps":94},"steps","Instalar Trigger.dev con Docker en 6 pasos",[95,98,101,104,107,110],{"title":96,"body":97},"Preparar el VPS e instalar Docker","Conéctese por SSH con un usuario sudo, actualice el sistema (`apt update && apt upgrade -y`) e instale Docker en un solo comando: `curl -fsSL https:\u002F\u002Fget.docker.com | sh`. Añada su usuario al grupo docker (`usermod -aG docker $USER`) para no tener que usar `sudo` siempre. Cree una carpeta dedicada: `mkdir -p \u002Fopt\u002Ftrigger && cd \u002Fopt\u002Ftrigger`. Verifique que Compose v2 está disponible con `docker compose version` — la salida debe mostrar al menos `v2.x.x`.",{"title":99,"body":100},"Obtener el stack oficial de self-hosting","Clone el repositorio oficial: `git clone https:\u002F\u002Fgithub.com\u002Ftriggerdotdev\u002Ftrigger.dev \u002Fopt\u002Ftrigger\u002Fsrc`. Navegue a la subcarpeta de despliegue: `cd \u002Fopt\u002Ftrigger\u002Fsrc\u002Fdocker`. Este directorio contiene el `docker-compose.yml` que orquesta la aplicación web (`webapp`), los workers, PostgreSQL y Redis. Copie el fichero de ejemplo a su configuración: `cp .env.example .env`. No lance nada antes de configurar el `.env` — el stack se negará a arrancar con los valores por defecto.",{"title":102,"body":103},"Generar los secretos y configurar el dominio","Abra `.env` en su editor y rellene como mínimo estas variables:\n\n- `ENCRYPTION_KEY`: `openssl rand -hex 16` (16 bytes = 32 chars hex)\n- `MAGIC_LINK_SECRET`: `openssl rand -hex 16` (igual)\n- `LOGIN_ORIGIN`: `https:\u002F\u002Ftrigger.mondomaine.com`\n- `APP_ORIGIN`: `https:\u002F\u002Ftrigger.mondomaine.com`\n- `POSTGRES_PASSWORD`: una contraseña fuerte (`openssl rand -base64 24`)\n- `REDIS_PASSWORD`: igual\n\nDeje `DATABASE_URL` y `REDIS_URL` tal cual si usa los servicios internos de Compose — hacen referencia a los nombres de servicio de Docker. También defina `SESSION_SECRET` con `openssl rand -hex 32`.",{"title":105,"body":106},"Arrancar el stack y crear la primera cuenta","Inicie el conjunto en segundo plano: `docker compose up -d`. Siga las migraciones de base de datos en tiempo real: `docker compose logs -f webapp`. Espere el mensaje `Listening on port 3030` antes de continuar — las migraciones pueden tardar 30 a 60 segundos en el primer arranque. Una vez iniciada la aplicación, el magic link de registro aparece en los logs: cópielo y ábralo en su navegador para crear la primera cuenta de administrador. Si se perdió el enlace: `docker compose logs webapp | grep magic`.",{"title":108,"body":109},"Exponer la aplicación mediante un proxy inverso HTTPS","Ponga Caddy delante de la aplicación para gestionar el TLS automáticamente. Cree `\u002Fetc\u002Fcaddy\u002FCaddyfile` con este contenido mínimo:\n\n```\ntrigger.mondomaine.com {\n    reverse_proxy localhost:3030\n}\n```\n\nRecargue Caddy (`systemctl reload caddy`): Let's Encrypt emite el certificado en segundos. Con nginx, cree un vhost que haga proxy a `http:\u002F\u002F127.0.0.1:3030` y active un certificado con `certbot --nginx`. Verifique que `https:\u002F\u002Ftrigger.mondomaine.com` responde correctamente antes de continuar.",{"title":111,"body":112},"Conectar su primer proyecto TypeScript","En su proyecto Node.js, instale el SDK: `npm install @trigger.dev\u002Fsdk`. Autentique el CLI contra su instancia: `npx trigger.dev@latest login --api-url https:\u002F\u002Ftrigger.mondomaine.com`. Luego cree su primer proyecto en el panel, recupere la clave secreta del proyecto (`sk_...`) y añádala a su `.env` local: `TRIGGER_SECRET_KEY=sk_...`. Inicialice la configuración con `npx trigger.dev@latest init` y despliegue su primer job con `npx trigger.dev@latest deploy`.",{"type":38,"title":114,"body":115},"Solución de errores: problemas frecuentes y sus soluciones","Estos son los cinco errores más comunes al instalar Trigger.dev en self-hosted.\n\n**`Error: ENCRYPTION_KEY must be 32 characters`** — Ha usado `openssl rand -base64 16` en lugar de `openssl rand -hex 16`. La forma base64 produce caracteres fuera del juego hexadecimal. Regénere con `-hex 16` (exactamente 32 chars).\n\n**`webapp exited with code 1` al arrancar** — Compruebe los logs completos con `docker compose logs webapp`. La causa más frecuente: `DATABASE_URL` incorrecta o PostgreSQL no listo todavía. Espere 10 segundos y reinicie con `docker compose restart webapp`.\n\n**El magic link de creación de cuenta no aparece** — La aplicación puede haber arrancado antes de que terminaran las migraciones. Ejecute `docker compose restart webapp` y observe los logs desde el principio. Si el enlace sigue ausente, compruebe que `LOGIN_ORIGIN` coincide exactamente con su dominio (sin barra final).\n\n**`Failed to connect` en el CLI durante `login`** — El proxy inverso no está aún activo o el DNS no ha propagado todavía hacia su VPS. Pruebe localmente con `curl http:\u002F\u002F127.0.0.1:3030\u002Fhealthcheck` desde el VPS: si responde, el problema está en el proxy o el DNS.\n\n**El job se despliega pero no se ejecuta** — Compruebe que los workers están en marcha: `docker compose ps` debe mostrar el servicio `worker` en estado `running`. Si el worker está detenido, `docker compose up -d worker` lo reinicia. Verifique también que `TRIGGER_SECRET_KEY` en su proyecto coincide con la clave del proyecto correcto en el panel.",{"type":38,"title":117,"body":118},"Proteger y mantener su instancia","Una instancia de Trigger.dev expone el panel y la API en el mismo dominio. Algunas precauciones reducen la superficie de ataque sin complicar la operación.\n\n**Firewall**: bloquee todos los puertos salvo el 22 (SSH), 80 y 443. El puerto 3030 no debe ser accesible directamente desde el exterior — está reservado para el proxy inverso local.\n\n**Rotación de secretos**: `MAGIC_LINK_SECRET` puede rotarse sin romper datos. `ENCRYPTION_KEY`, en cambio, cifra las variables de entorno de los proyectos — su rotación exige una migración de datos. Guárdelos en un gestor de secretos (Bitwarden, 1Password o HashiCorp Vault).\n\n**Actualizaciones**: Trigger.dev publica sus releases en GitHub. Para actualizar, tire de la nueva versión (`git pull` en `\u002Fopt\u002Ftrigger\u002Fsrc`), reconstruya las imágenes (`docker compose pull`) y reinicie (`docker compose up -d`). Las migraciones de base de datos se aplican automáticamente al arrancar `webapp`.\n\n**Copias de seguridad**: programe un volcado diario de PostgreSQL hacia almacenamiento externo. Un cron mínimo: `0 3 * * * docker exec trigger-postgres-1 pg_dump -U postgres trigger | gzip > \u002Fopt\u002Fbackups\u002Ftrigger-$(date +%F).sql.gz`.",{"type":120,"title":121,"body":122},"tip","Escalabilidad horizontal de los workers","Aísle los workers de la aplicación web en contenedores separados y limite su concurrencia con la variable `WORKER_CONCURRENCY` (por defecto: 10). Para los jobs muy exigentes en CPU, añada un segundo VPS dedicado a los workers que apunte al mismo PostgreSQL y Redis: escala horizontalmente sin tocar el panel. Los workers no tienen estado — solo necesitan `DATABASE_URL`, `REDIS_URL` y `ENCRYPTION_KEY` para unirse a la flota. En un VPS pequeño, comience con `WORKER_CONCURRENCY=3` para evitar la saturación de memoria durante picos de jobs.",{"type":38,"title":124,"body":125},"Escribir y desplegar su primer job de Trigger.dev","Un job de Trigger.dev es una función TypeScript exportada desde un fichero `trigger\u002F` de su proyecto. Un ejemplo mínimo de envío de correo diferido:\n\n```typescript\nimport { task } from \"@trigger.dev\u002Fsdk\u002Fv3\";\n\nexport const sendWelcomeEmail = task({\n  id: \"send-welcome-email\",\n  run: async (payload: { userId: string; email: string }) => {\n    \u002F\u002F su lógica de envío aquí\n    await sendEmail(payload.email, \"¡Bienvenido!\");\n    return { sent: true };\n  },\n});\n```\n\nDespliegue con `npx trigger.dev@latest deploy`. El panel muestra entonces su job bajo la pestaña **Tasks**. Ejecute un test desde el panel o desde su código: `await sendWelcomeEmail.trigger({ userId: \"u1\", email: \"test@example.com\" })`. Los reintentos automáticos se aplican en caso de error — configurables con la opción `retry` en `task()`.\n\nPara jobs largos (importación de CSV, procesamiento de imágenes), use `wait.for()` para suspender la ejecución y no bloquear un worker durante pausas de red: Trigger.dev reanuda el job donde lo dejó, incluso tras un reinicio del contenedor.",{"type":42,"title":127,"items":128},"Casos de uso más adecuados para el self-hosting",[129,130,131,132,133,134],"**Procesamiento ETL**: importar, transformar y cargar grandes volúmenes de datos sin timeouts.","**Envíos transaccionales masivos**: campañas de email o notificaciones con throttling controlado.","**Pipelines de IA**: llamadas encadenadas a OpenAI, Anthropic o Hugging Face con gestión de reintentos en rate-limit.","**Sincronización de integraciones de terceros**: webhooks de Stripe, Shopify, HubSpot — sin depender de un SaaS intermediario.","**Tareas programadas críticas**: reemplazar cron frágiles por jobs con historial de ejecución y alertas.","**Generación de informes PDF o exportaciones pesadas**: jobs de varios minutos sin límite de duración.",{"type":120,"body":136},"Trigger.dev es **totalmente gratuito en self-hosted**: no se requiere ninguna licencia comercial para uso privado o profesional en su propia infraestructura. La licencia MIT cubre el código open-source. Solo el código propietario de la versión Enterprise (SSO SAML, audit logs avanzados) está excluido — para la gran mayoría de los equipos, la versión comunitaria autoalojada es más que suficiente.","Despliegue Trigger.dev en unos minutos","Un VPS Cloud de ServOrbit preconfigurado con Docker, un dominio y un certificado SSL listo le permite lanzar su orquestador de tareas self-hosted sin una configuración de sistema tediosa.","Pedir mi VPS Cloud","\u002Fmarketplace\u002Fautomatizacion\u002Ftrigger-dev",[142,160,178],{"id":143,"slug":144,"slugs":145,"title":149,"excerpt":150,"readTime":151,"views":23,"isPinned":19,"publishedAt":152,"updatedAt":153,"category":154,"categories":155,"featuredImage":29,"bgImage":30,"posterImage":157,"relatedSolution":158},3,"instalar-n8n-en-vps-con-docker",{"fr":146,"en":147,"ar":148,"es":144},"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},[156],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Finstaller-n8n-vps-poster.svg",{"categorySlug":33,"appSlug":159},"n8n",{"id":161,"slug":162,"slugs":163,"title":167,"excerpt":168,"readTime":169,"views":18,"isPinned":19,"publishedAt":170,"updatedAt":171,"category":172,"categories":173,"featuredImage":29,"bgImage":30,"posterImage":175,"relatedSolution":176},24,"instalar-node-red-en-un-vps",{"fr":164,"en":165,"ar":166,"es":162},"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},[174],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Finstaller-node-red-vps-poster.svg",{"categorySlug":33,"appSlug":177},"node-red",{"id":179,"slug":180,"slugs":181,"title":185,"excerpt":186,"readTime":143,"views":18,"isPinned":19,"publishedAt":187,"updatedAt":171,"category":188,"categories":189,"featuredImage":29,"bgImage":30,"posterImage":191,"relatedSolution":192},25,"instalar-huginn-en-un-vps",{"fr":182,"en":183,"ar":184,"es":180},"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},[190],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Finstaller-huginn-vps-poster.svg",{"categorySlug":33,"appSlug":193},"huginn",1789665023117]