🧩 Guía de integración ERPNext + n8n en el mismo VPS (usando Docker)

📌 Requisitos previos

  • ERPNext funcionando en https://erp.tudominio.com (según la guía anterior).
  • n8n funcionando en https://n8n.tudominio.com o similar.
  • Ambos contenedores en la misma red Docker (en tu caso, mqtt_network; si usaste la red erp_network de la guía base, deberás crear una red común o conectarlos).

🔗 1. Asegurar que los contenedores están en la misma red Docker

Para que n8n pueda comunicarse con ERPNext usando el nombre del contenedor (erpnext-web), deben compartir red.

Opción A – Si tu n8n ya está en una red existente (por ejemplo mqtt_network):
Conecta el contenedor de ERPNext a esa red:

bash

docker network connect mqtt_network erpnext-web

(Los demás servicios como dbredis, etc., no necesitan ser accesibles desde n8n).

Opción B – Crear una red común dedicada (si no usas mqtt_network):

bash

docker network create integration_net
docker network connect integration_net erpnext-web
docker network connect integration_net n8n

Verifica la conectividad desde n8n:

bash

docker exec -it n8n wget -qO- http://erpnext-web:8000/api/method/ping

Deberías recibir "message":"pong". Si falla, revisa que el nombre del contenedor de ERPNext sea exactamente erpnext-web y que el puerto 8000 esté escuchando dentro del contenedor (está mapeado a 127.0.0.1:8000 en el host, pero internamente es 0.0.0.0:8000).

🔑 2. Obtener credenciales de API en ERPNext

  1. Accede a https://erp.tudominio.com con el usuario Administrator.
  2. Busca en la barra superior “API” y selecciona API Key.
  3. Crea un nuevo API Key (puedes llamarlo “n8n_integration”).
  4. Copia el API Key y el API Secret; solo se muestran una vez.
  5. (Opcional) En la configuración del DocType “User”, asigna a este par de claves los roles necesarios (por ejemplo, “System Manager” para pruebas controladas; en producción limita los permisos).

⚙️ 3. Configurar el nodo en n8n

🌐 Opción recomendada: Nodo HTTP Request

Es el método más universal y robusto. Usa autenticación “Generic Credential Type” o directamente “Header Auth”, pero la autenticación por token de Frappe se pasa como cabecera personalizada. Sigue estos pasos:

  1. Añade un nodo HTTP Request.
  2. Método: según la operación (GET, POST, PUT, DELETE).
  3. URL: la endpoint de ERPNext. Las URLs base son:
    http://erpnext-web:8000/api/resource/{DocType} (para CRUD de documentos)
    http://erpnext-web:8000/api/method/{function} (para métodos remotos)
    Ejemplo: http://erpnext-web:8000/api/resource/Customer
  4. En Headers añade:
    • Authorization con valor token <API_Key>:<API_Secret>
      (Ejemplo: token 4f9e8e5c2b1a4d3:1a2b3c4d5e6f7a8b)
    • Content-Type: application/json (cuando envíes datos)
  5. Para probar, usa un GET a http://erpnext-web:8000/api/method/frappe.auth.get_logged_user; deberías recibir el nombre de usuario.

🧩 Alternativa: Nodo ERPNext (comunitario)

Si tu instancia de n8n tiene disponible el nodo “ERPNext” (instalado desde la comunidad), configúralo así:

  • Hosthttp://erpnext-web:8000
  • API Key: el key del paso anterior
  • API Secret: el secret del paso anterior
  • SSL: desactivado (conexión http interna)

Luego selecciona la operación deseada (Get, Create, Update, Delete) y el DocType.

📦 4. Ejemplo práctico: crear un Cliente en ERPNext desde n8n

Supongamos que tienes un formulario web y quieres crear un cliente en ERPNext.

  1. Nodo Webhook (o el trigger que uses) recibe los datos.
  2. Nodo Set (o Function) para mapear los campos al formato que espera ERPNext.
  3. Nodo HTTP Request con:
    • Método: POST
    • URL: http://erpnext-web:8000/api/resource/Customer
    • Headers:
      • Authorization: token <key>:<secret>
      • Content-Type: application/json
    • Body (JSON):json{ “customer_name”: “Nombre del cliente”, “customer_type”: “Company”, “customer_group”: “All Customer Groups”, “territory”: “All Territories” }
  4. Ejecuta el flujo y comprueba en ERPNext que el cliente se ha creado.

🔄 5. Sincronización inversa: exportar datos de ERPNext a hojas de cálculo o bases de datos

Puedes usar n8n para leer datos de ERPNext y guardarlos en Google Sheets, Excel o PostgreSQL. Ejemplo:

  1. Nodo Schedule Trigger o Webhook.
  2. Nodo HTTP Request (GET) a http://erpnext-web:8000/api/resource/Sales Order?filters=[["status","=","Draft"]]&fields=["name","customer","grand_total"].
  3. Nodo Item Lists (o Function) para iterar los resultados.
  4. Nodo Google Sheets o PostgreSQL para escribir las filas.

La API de ERPNext permite filtros avanzados, limitación, paginación, etc. Documentación completa: Frappe API.

🧪 6. Solución de problemas comunes

  • Error de conexión: comprueba que ambos contenedores estén en la misma red Docker (paso 1) y que el nombre del contenedor sea correcto.
  • 401 Unauthorized: revisa que la cabecera Authorization tenga el formato exacto: token <API_Key>:<API_Secret> (sin espacios extra, los dos puntos juntos).
  • 403 Forbidden: el usuario asociado a la API Key no tiene permisos suficientes sobre el DocType. Otorga los roles adecuados en ERPNext (por ejemplo, “System Manager” o roles específicos).
  • 404 Not Found: verifica la ruta de la API. Usa la barra de herramientas de Frappe (dentro de ERPNext) para explorar los DocTypes y métodos disponibles.
  • Errores de campos: los nombres de campo son los mismos que ves en la interfaz de ERPNext, pero sin espacios (ejemplo: customer_name en lugar de “Customer Name”). Puedes usar el endpoint /api/method/frappe.client.get_meta para obtener los campos de un DocType.

✅ Nota final

Esta configuración te permite automatizar completamente los procesos entre tu app .NET, n8n y ERPNext. Recuerda que puedes crear flujos avanzados combinando webhooks, MQTT (ya tienes Mosquitto), IA (Ollama) y la API de ERPNext. La clave es la conectividad Docker y la API de Frappe bien documentada.

Si en el futuro necesitas exponer la API de ERPNext al exterior (para tu app .NET, por ejemplo), basta con añadir en Nginx un bloque location /api que haga proxy hacia el contenedor, similar a como haces con los estáticos, y usar el mismo dominio o un subdominio. Pero por ahora, la comunicación interna es suficiente para la integración con n8n.

Comments

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *