ExperimentandoAutomatización

n8n propio: integraciones puntuales, y cada falla avisa sola

Un n8n compartido por todos mis proyectos, con una regla que decide qué entra en el lienzo y qué no, y un workflow de errores que firma cada falla y la convierte en un incidente en Telegram.

act. 2 min de lectura
victor@lab: ~/n8n
infra/n8n/friday-error-reporter.json · nodo «Armar evento»
// FRIDAY Error Reporter (HU-304). Cambia SOURCE por el nombre de esta instancia.// Workflows en CRITICAL avisan al momento con botones; el resto va al briefing.const SOURCE = 'n8n:cambia-esto';const CRITICAL = []; const e = $input.first().json;const exec = e.execution || {};const trigger = e.trigger || {};const workflow = (e.workflow && e.workflow.name) || 'workflow sin nombre';const error = (exec.error && exec.error.message) || (trigger.error && trigger.error.message) || 'falló';const body = JSON.stringify({  source: SOURCE,  type: 'workflow.failed',  dedupe_key: exec.id ? `exec-${exec.id}` : `trigger-${Date.now()}`,  occurred_at: new Date().toISOString(),  severity: CRITICAL.includes(workflow) ? 'critical' : 'warning',  payload: {    workflow,    workflow_id: e.workflow && e.workflow.id,    execution_id: exec.id,    url: exec.url,    node: exec.lastNodeExecuted,    error: String(error).slice(0, 500),  },});return [{ json: { body } }];
JavaScript26 líneasCopiado tal cual del repositorio

La idea

Cada proyecto mío terminaba pidiendo lo mismo: un webhook que reciba algo, una integración puntual con otro servicio, un aviso cuando pasa X. Montarlo dentro de cada sistema es repetir código; montar un n8n por proyecto es repetir servidores.

Así que levanté un solo n8n, compartido por todos mis proyectos, y le puse una regla antes de escribir el primer workflow.

n8n solo emite eventos o hace integraciones puntuales. La lógica de negocio vive en cada producto, no en el lienzo.

Cómo está montado

  • n8n con la versión fijada, sobre PostgreSQL 17 y no sobre SQLite, en Docker y detrás de nginx con TLS.
  • Task runners externos para los nodos de código, en JavaScript y en Python: el código de un workflow no corre dentro del proceso principal. n8n y sus runners se actualizan juntos, siempre a la misma versión.
  • Respaldo diario a las 3:45, con 14 días de historia. Los secretos viven fuera del repositorio; sin la llave de cifrado, un respaldo restaurado no puede leer las credenciales, así que esa llave se guarda aparte.
  • Un workflow de errores que vigila a los demás: si cualquier workflow falla, se dispara solo.

Cuando algo falla

El workflow de errores tiene tres pasos. El fragmento de arriba es el primero: arma el evento con el workflow, el nodo y el error, y una dedupe_key que sale del id de la ejecución. El segundo lo firma con HMAC-SHA256 y el tercero lo manda a FRIDAY, mi asistente.

Del otro lado, cada workflow que falla abre su propio incidente en Telegram. Si está en la lista de críticos, avisa al momento y con botones; si no, entra al resumen del día. El incidente se cierra solo después de 25 horas sin fallas nuevas. Un reenvío con la misma dedupe_key no hace nada, y una firma mala recibe un 404, como si el endpoint no existiera.

Lo que ya funciona

La instancia está en producción desde el 16 de octubre, con el workflow de errores publicado y uno de prueba que falla a propósito para revisar la cadena completa cuando quiero. Cada workflow nuevo, de cualquier proyecto, se conecta a ese reporte de errores antes de publicarse.

Lo aprendido

Una alerta que no suena también es una falla. En n8n 2.x el workflow de errores tiene que estar publicado. Si no lo está, n8n deja una línea en el log («is not active and cannot be executed») y no avisa nada: el sistema que debía avisarme de los errores fallaba en silencio. Por eso existe el workflow de prueba.

La CLI no es la interfaz. Importar y publicar workflows por línea de comandos funciona, pero los cambios de publicación recién se toman al reiniciar el contenedor, y n8n execute no convive con los runners externos. Lo anoté en el runbook en vez de recordarlo.

La regla vale más que el lienzo. n8n hace muy fácil meter un if más, y otro. Si un workflow empieza a decidir cosas del negocio, esa decisión se va al código del producto y n8n se queda con el evento.

Siguiente paso

Que los primeros workflows de mis productos corran aquí, cada uno conectado al reporte de errores desde el primer día.

Cuéntame qué quieres resolver. Si este experimento te sirve de punto de partida, lo adapto a tu caso; si no, te digo qué haría.

Otros experimentos

victor/doctiaConstruyendo

Doctia: responde con citas y pide permiso antes de actuar

Un asistente que contesta solo con los documentos de la empresa, filtra en SQL lo que cada persona puede ver antes de que llegue al modelo, y pausa las acciones de riesgo hasta que alguien las aprueba.

  • Python
  • FastAPI
  • PostgreSQL
  • pgvector
SQLIA
victor/fridayConstruyendo

FRIDAY: un asistente por voz que no puede decir «listo» sin haberlo hecho

Mi asistente personal por Telegram: agenda, correo, tareas y CRM por voz. Lo interesante no es el modelo, es el código que lo rodea: confirmaciones firmadas, privacidad por nivel y un guardián contra el «ya lo hice» sin hacerlo.

  • Python
  • FastAPI
  • PostgreSQL
  • pgvector
PythonIA
victor/acoplaConstruyendo

Acopla: tarjetas para HubSpot con un backend que no confía en nadie

Tarjetas dentro de la ficha de HubSpot con datos peruanos —RUC, DNI y tipo de cambio— alimentadas por un backend propio que funciona en cualquier plan, verifica cada firma y obliga por tipos a confirmar toda escritura.

  • TypeScript
  • NestJS
  • Next.js
  • React
TypeScriptCRM