· 11 min read

Install n8n on EC2 AWS server

We created a simple REST API exemplifying how a service would be created to manage movies.

We created a simple REST API exemplifying how a service would be created to manage movies.

Si ya has probado a installar n8n en local podras ver que de echo es bastante sencillo y en muchos casos te bastara con ejecutar un simple comando. Pero cuando se trata de hacerlo en un servidor remoto el proceso puede llegar a complicarse.

En este post ire explicando todos los pasos que tuve que seguir para installar n8n en un servidor EC2 en AWS.

Primero empezemos por aclarar, ¿Que es n8n?

Es una herramienta NoCode que nos ayuda a programar determinadas tareas sin la necesidad de usar codigo. Nos puede resultar muy util para automatizar procesos y ahorrar tiempo.

Aclarado el que es n8n ahora podemos pasar a la instalación como dije antes es una herramienta con una instalación sencilla de echo en su documentación hay varios metodos para poder instalarla y si la instalamos es nuestra maquina es un procedimiento muy sencillo. Pero se puede llegar a complicar bastante si tratamos de hacerlo en un servidor remoto.

¿Que necesitamos para empezar?

En este caso asumire que para continuar con la instalación se tiene acceso ssh a un servidor remoto, puede ser cualquier sevidor en mi caso yo lo hare desde un servidor EC2 de AWS donde para el caso practico una instancia pequeña (t2.small) es más que suficiente para correr n8n ya que no requiere muchos recursos.

Empezemos con la instalación

Necesitaremos tener instalado «Node Js» en nuestro servidor, hasta la fecha de este post la versión minima necesaria para poder instalar n8n es la v18.17.1 para poder instalar node en nuestro servidor hay varios metodos en mi caso yo utilizare NVM

¿Que es nvm?

En sus siglas en ingles Node Version Manager (NVM), como su nombre implica es una herramienta que nos permite gestionar variones de node en nuestro servidor.

Para poder instalar NVM en nuestro servidor podemos ejecutar los siguientes comando.

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash

Toma en cuenta que este comando lo que hace es descargar un script en tu servidor y siempre es recomendable que revises el codigo que se ejecutar para asegurarse de que no se haga nada que no quieras. Para poder ver el codigo que se quiere ejecutar basta con que borres | bash del final.

Esto habra instalado NVM en tu cuenta de usuario. Para poder usarlo tienes que ejecutar la siguiente linea de comando

source ~/.bashrc

Con la siguiente linea de comando hacemos la configuración y ajustamos las variables de entorno para poder usar NVM en nuestra terminal.

Ahora podemos proceder a installar node con el siguiente commando.

nvm install v18.17.1

Lo bueno de utilizar nvm para nuestra instalación es que nos podemos desentender de tener que actualizar los repositorios de node para instalar la versión que necesitamos y tener que instalar la versión de npm correspondiente. Podemos verificar que nuestra instalación se ha echo correctamente ejecutando el siguiente comando.

node -v
npm -v

Una vez ya tengamos instalado node en nuestro servidor podemos pasar a instalar n8n en este punto es bastante sencillo hacer la instalación por que n8n se encarga de hacer la mayoria de la configuración para poder correr el programa ejecutando el siguiente comando.

npm install  n8n -g

Con este comando estaremos installando n8n en nuestro sistema de manera global y solo ejecutando el siguiente comando ya podemos utilizar n8n.

n8n start

Por defecto n8n corre en el puerto 5678 pero como nosotros estamos corriendo nuestro programa en un servidor remoto no tendremos acceso a nuestro programa ya que solo tendremos acceso en local “http://localhost:5678

Para poder acceder utilizaremos NGINX desde el que podremos asignar un dominio de acceso publico a n8n.

¿Qué es NGINX?

NGINX es un servidor web que también puede actuar como proxy inverso, balanceador de carga y proxy para protocolos de correo.

¿Como instalar NGINX?

Para ellos tendremos que instalar NGINX en nuestro servidor para ellos solo tendremos que seguir unos pasos muy sencillos.

sudo apt update
sudo apt install nginx

Con esto ya daberiamos tener instalado nginx en el servidor. Podemos probar si funciona correctamente con el siguiente comando.

systemctl status nginx
# output
 nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2023-08-12 23:19:33 UTC; 1 day 23h ago
       Docs: man:nginx(8)
    Process: 22059 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 22061 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
   Main PID: 22062 (nginx)
      Tasks: 2 (limit: 2338)
     Memory: 18.6M
        CPU: 8.481s
     CGroup: /system.slice/nginx.service
             ├─22062 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
             └─22063 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""

Una vez hayamos verifica que nuestro nginx esta funcionando correctamente ahora tendremos que configurar nuestro proxy inverso.

¿Qué es un proxy inverso?

A remote image with query params

Un proxy inverso es un servidor web que se situa en frente del servidor web y reenvia todas las solicitudes del cliente a otro servidor web de esta manera el cliente no tiene conexión directa con el servidor web.

Como un dato extra a diferencia con un proxy de reenvio que se el proxy mayor mente conocido el proxy de reenvio se situa en frente del cliente y reenviado todas las solicitures al servidor web logrando de esta manera que el servidor web no tenga contacto directo con el cliente.

Las razones de para que se utilizán los proxy inverso son varias que darián para otro post. En nuestro caso en concreto lo que nosotros buscamos lograr es poder asignar un dominio de acceso publico a nuestro programa de n8n y asignarle un SSL.

¿Cómo creamos un proxy inverso en NGINX?

Para poder crear un proxy inverso con NGINX, simplemente podemos levantar un nuevo sitio donde configuraremos que todo el tráfico que entra en nuestro servidor por un dominio de nuestra elección se redirija a la ruta http://localhost:5678 que es donde se encuentra corriendo n8n.

Primeramente, nos crearemos un nuevo fichero de configuración para NGINX.

vi /etc/nginx/sites-available/n8n.your-domain.com.conf

En el cual especificaremos la siguiente configuración.

server {
    server_name your-domain.com;

    location / {
        proxy_pass http://localhost:5678;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Connection "";
        proxy_http_version 1.1;
        chunked_transfer_encoding off;
        proxy_buffering off;
        proxy_request_buffering off;
        proxy_cache off;
    }
}

Como podemos ver, lo único que hace la siguiente configuración es redirigir todo el tráfico que entre de your-domain.com a nuestro localhost en el puerto 5678

Con esto ya podemos acceder a nuestra página n8n desde nuestro servidor.

A remote image with query params

Pero como habremos visto, todavía no tenemos nuestro certificado SSL configurado en nuestro dominio. Para poder segurizar nuestro dominio con SSL utilizaremos una herramienta llamada Certbot.

¿Qué es Certbot?

Certbot es una herramienta de software gratuita y de código abierto para usar automáticamente certificados de Let’s Encrypt en sitios web para habilitar HTTPS.

Con el siguiente comando podemos configurar el HTTPS en nuestro dominio. Lo que esto hará es generarnos un certificado Let’s Encrypt y lo configurará en el fichero donde definimos la configuración de nuestro dominio en NGINX.

sudo certbot --nginx -d your-domain.com

Si ahora revisamos nuestro fichero de configuración NGINX, veremos que se han generado algunas nuevas líneas para configurar el HTTPS en nuestro dominio.

server {
    server_name your-domain.com;

    location / {
        proxy_pass http://localhost:5678;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Connection "";
        proxy_http_version 1.1;
        chunked_transfer_encoding off;
        proxy_buffering off;
        proxy_request_buffering off;
        proxy_cache off;
    }
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/n8n.ngch.website/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/n8n.ngch.website/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = your-domain.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    server_name your-domain.com;
    return 404; # managed by Certbot

}

Como podemos ver, todas las líneas que tengan «# managed by Certbot» fueron generadas para configurar nuestro dominio.

Con esto ya tenemos configurado n8n en nuestro servidor. Ahora si nos registramos para poder acceder nuestra aplicación donde responderemos algunas preguntas. Ya podemos hacer uso de la herramienta.

Pero ahora, si lo vemos más detalladamente, veremos que se nos presentan dos problemas.

Conexión Perdida

A remote image with query params

Este es un error que aparece cuando la aplicación no puede establecer conexión con el servidor remoto. n8n utiliza una tecnología llamada Server-Sent Events (SSE) para poder establecer comunicación continua desde el lado del servidor al cliente. Esto es particularmente útil cuando hay eventos que suceden en el servidor y queremos que el lado del cliente se modifique en consecuencia.

Si nosotros abrimos nuestra consola de desarrollo.

A remote image with query params

Podemos ver que la aplicación lanza una petición para ver si hay eventos sucediendo desde el lado del servidor, pero no se puede establecer conexión.

Esto pasa por qué nosotros para poder acceder a la aplicación de n8n por un dominio hemos configurado un proxy reverso y este proxy reverso no redirige correctamente la petición de conexión a la aplicación correctamente.

Para solucionar este problema debemos actualizar la configuración de nuestro proxy.

server {
    ....
    location /rest/push {
        proxy_pass http://127.0.0.1:5678/rest/push;  # Cambia esto según la dirección de tu instancia n8n
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 86400;
    }
    ....
}

Si añadimos la siguiente configuración a nuestro proxy las peticiones que se hagan a la ruta /rest/push se redirigirán correctamente a la aplicación de n8n

A remote image with query params

Y como podemos ver el mensaje de «Conexión Perdida» ya no nos aparece.

Webhook URL como localhost

Creo que el error nos los encontraremos cuando queramos configurar una integración que requiera OAuth2 o que sencillamente requiera un Webhook para funcionar. Como en el siguiente ejemplo pasa cuando tratamos de conectar GitHub.

A remote image with query params

Y el problema viene de como n8n monta la URL del webhook él usa 3 variables de sistema «N8N_HOST», «N8N_PORT», «N8N_PROTOCOL» con estas 3 variables n8n configura un Webhook URL nos podemos sentir tentados a configurar nuestro dominio en estas variables, pero n8n funciona como tal en el puerto 5678 y siempre tiene que tener un puerto configurado desde el que escuchar y si tratamos de configurar nuestros puertos 80 o 443 entrará en conflicto con nuestro servidor nginx.

Para solucionar esto n8n nos proporciona una variable que sobreescribe la URL por defecto configurada que es «WEBHOOK_URL» con esta variable nosotros podemos cambiar la URL que la aplicación utiliza.

Para configurar la variable de entorno simplemente corremos la siguiente linea de comando

export WEBHOOK_URL=https://your-domain.com

Esto deberia solucionar nuestro problema.

A remote image with query params

Pero tenemos que tomar algo en cuenta si solo utilizamos la linea de comando.

export WEBHOOK_URL=https://your-domain.com

El valor de esta variable solo se mantendrá lo que llevemos iniciada nuestra conexión ssh si queremos que la variable persista en nuestro sistema debemos configurarlo en las variables de entorno de nuestro usuario.

Para hacer esto debemos identificar cuál es el fichero donde están configuradas las variables de entorno de nuestro usuario. En nuestro caso como utilizamos NVM se nos configuró unas variables de entorno para poder utilizar NVM que es un archivo llamado ~/.bashrc

Lo único que debemos hacer es abrir nuestro fichero.

vi ~/.bashrc

Nos vamos al final del archivo y añadimos la línea de comando.

export WEBHOOK_URL=https://your-domain.com

Y volvemos a cargar nuestra configuración.

	
source ~/.bashrc

Con esto nos aseguramos que si cerramos nuestra conexión o si reiniciamos nuestro servidor, la variable de entorno WEBHOOK_URL se mantendrá correctamente configurada.

¿Como mantener corriendo n8n cuando cierro la conexión ssh?

Si te has dado cuenta hasta ahora hemos estado corriendo n8n con la linea de comando

n8n start

Esto nos funciona bien para probar la aplicación, pero si cerramos nuestra conexión ssh el programa se para inmediatamente.

Si queremos solucionar este problema y hacer que n8n corra continuamente sin necesidad de que estemos conectados a nuestro servidor, utilizaremos la herramienta pm2

¿Qué es pm2?

PM2 es un gestor de procesos en producción para aplicaciones Node.js. Es una herramienta que permite mantener siempre activas las aplicaciones y volver a cargarlas evitando los tiempos de inactividad. Además, facilita tareas comunes de administración del sistema, como el manejo de logs, el balanceo de carga y la supervisión de memoria y CPU.

Para poder instalar pm2 solo debemos correr la siguiente línea de comando.

npm install -g pm2

Con esto instalaremos pm2 de manera global en nuestro servidor.

Y ahora simplemente para correr n8n con pm2 corremos el siguiente comando.

pm2 start n8n
# output
[PM2] Starting /home/ubuntu/.nvm/versions/node/v18.17.1/bin/n8n in fork_mode (1 instance)
[PM2] Done.
┌────┬────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
 id name namespace version mode pid uptime status cpu mem user watching
├────┼────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
 0 n8n default 0.39.1 fork 54148 0s 0 online 0% 13.4mb ubuntu disabled
└────┴────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘

Como vemos ahora tenemos corriendo n8n desde pm2. Esto nos permitirá correr la aplicación de n8n una vez cerremos nuestra conexión n8n.

Pero también debemos tomar en cuenta que pasa si nuestro servidor se reinicia. Para resolver este problema debemos correr el siguiente comando.

pm2 startup

Con estos problemas resueltos ya podemos utilizar n8n desde nuestro servidor propio.

Share:
Back to Blog

Related Posts

View All Posts »