Páginas

Cómo montar un servidor privado gratuito en AWS de forma segura

Introducción

Este tutorial muestra cómo crear un EC2 de forma segura y privada sin exponerlo en internet para montar un servidor n8n. La instancia tiene IP pública pero ningún puerto abierto, el acceso se gestiona mediante AWS Systems Manager (SSM), que autentican con credenciales IAM de AWS y gracias al port forwarding podremos entrar al panel web de n8n desde nuestro ordenador como si fuera el localhost del servidor. Todo es compatible con el Free Tier o laboratorios de AWS Academy.


Requisitos:


Se recomienda tener un mínimo de experiencia en AWS para este tutorial, aunque está explicado de forma muy sencilla y detallada para que cualquiera entienda que se está haciendo, porqué y así vaya aprendiendo. También es recomendable manejarse con soltura en Linux. Indispensable tener una cuenta de AWS (free tier) o acceso a los laboratorios de AWS Academy.


En mi caso, uso los laboratorios de AWS academy, pero si no tenéis acceso a estos y queréis poner en práctica este tutorial de forma gratuita podéis crearos una cuenta de aws y desde ese momento hasta 12 meses después, usar el free tier que incluye:


  • EC2 = hasta 750 horas/mes de instancia t2.micro o t3.micro (suficiente para tener 1 servidor encendido todo el mes) 


  • EBS = hasta 30 GB de almacenamiento en disco 


¿Qué vas a aprender?


  • Manejarte en AWS.

  • Montar una red privada virtual con VPC.

  • Montar tu propio servidor privado con EC2.

  • Entender cómo funcionan los roles IAM para conectar servicios como SSM.

  • Utilizar EBS para persistencia de datos y facilitar migración.

  • Utilizar docker para levantar infraestructura de forma sencilla y óptima.

Práctica

Red y seguridad

Antes de nada hay que preparar el entorno en la nube, ya que como en una infraestructura on-premises, debemos diseñar, crear y configurar la red de forma que se adecue a nuestra infraestructura haciéndola ágil, segura y escalable. Para ello se utiliza VPC (Virtual Private Network), red virtual lógica y aislada dentro de la nube pública de AWS, dedicada exclusivamente a nuestra cuenta. Dentro de esta se crearán las subredes, tablas de enrutamiento, grupos de seguridad…

Crear VPC

Lo primero será crear la VPC, nuestra red privada dentro de AWS. En la barra de búsqueda ponemos VPC y entramos.



Clicamos en Create VPC.








La configuración es la siguiente:


  • Elegimos VPC and more para que AWS cree automáticamente las subredes, la tabla de rutas y el Internet Gateway de una vez.

  • Marcamos la casilla Auto-generate y le ponemos un nombre que queramos, en mi caso N8N porque es el servicio que voy a usar para este tutorial.

  • El rango de IPs lo podemos dejar como viene y en este caso no vamos a usar IPv6.



Usamos 1 subred pública porque necesitamos que la EC2 tenga salida a internet para poder instalar Docker, actualizar paquetes y descargar n8n. Sin internet no podríamos hacer nada en el servidor. Si usasemos la subred privada tendrias que usar NAT Gateway para la conexión a internet y el costo mensual aprox alcanza los 32€. El hecho de estar en una subred pública no significa que sea accesible desde internet. Lo que controla quién puede entrar al servidor es el Security Group, que configuraremos a continuación sin ninguna regla de entrada. Sin puertos abiertos, nadie puede conectarse aunque tenga la IP pública.



No necesitamos NAT Gateway ni VPC Endpoints porque al ser subred pública el Internet Gateway ya gestiona la salida a internet de forma gratuita. Las opciones de DNS las dejamos marcadas como vienen por defecto y le damos a Create VPC.



Crear Security Group

El security group permite o deniega el acceso y salida de tráfico a nuestro servidor, y para que el nuestro sea privado, vamos a crear un SG que no permita entrar nada. En el menú lateral izquierdo dentro de VPC  vamos al apartado de security y entramos a security groups y hacemos click en el botón situado arriba a la derecha que pone Create security group.



Le ponemos un nombre, una descripción y escogemos la VPC que acabamos de crear.



En las reglas de entrada (Inbound rules) no añadimos ninguna regla, lo dejamos completamente vacío.

Esto significa que ningún tráfico puede entrar al servidor desde internet, independientemente de si tiene IP pública o no. Es el equivalente al firewall de tu router en casa: tienes internet pero nadie de fuera puede conectarse a tu ordenador.

El acceso al servidor lo gestionaremos mediante AWS Systems Manager (SSM), que no necesita ningún puerto abierto porque el propio servidor es quien inicia la conexión hacia AWS, no al revés.

Las reglas de salida (Outbound rules) las dejamos como vienen por defecto, permitiendo todo el tráfico saliente, ya que el servidor necesita salir a internet para descargar paquetes e instalar software.

Clicamos en Create security group.

Crear Rol IAM

IAM (Identity and Access Management) es el servicio de AWS que se encarga de administrar de manera centralizada el acceso a los recursos. Hay que crear el rol de IAM para que la instancia EC2 pueda usar SSM. 


Si estáis usando los laboratorios de AWS Academy no os va a dejar crear un rol, tenéis que usar LabRole que ya viene creado y tiene el permiso AmazonSSMManagedInstanceCore. Si estáis con una cuenta free tier de AWS seguid estos pasos para crear el rol:


Buscamos IAM en la barra de búsqueda y hacemos click en la opción de Roles.



Una vez dentro, en la parte superior derecha, hacemos click en el botón Create Role.


Escogemos AWS service y escogemos el servicio EC2.



El permiso que le vamos a dar es AmazonSSMManagedInstanceCore y clicamos en Next. 


El permiso AmazonSSMManagedInstanceCore es el mínimo necesario para que la instancia EC2 pueda registrarse en SSM y aceptar conexiones. Sin él, AWS SSM no reconocería el servidor y no podríamos conectarnos.



Le ponemos un nombre y una descripción para identificarlo y saber que hace. En esta misma pantalla podemos ver la policy, lo dejamos como está y le damos a Create role



Instancia EC2

Ya tenemos el terreno sobre el que trabajar listo, una red privada, con subredes, acceso a internet y seguridad. Ahora toca empezar a construir sobre este terreno, es decir, el servidor (EC2) el cual nos permitirá alojar un servidor n8n y poder usarlo como laboratorio para hacer pruebas, probar flujos, etc…

Crear EC2 (servidor)

En la barra de búsquedas buscamos EC2, entramos y clicamos en el botón Launch Instance.


La configuración:


Le ponemos un nombre al servidor.



Escogemos Ubuntu Server con la AMI que viene por defecto.




El tipo de instancia lo dejamos por defecto t3.micro, ya que entra dentro del Free Tier.



Seleccionamos Proceed without key pair, no necesitamos clave SSH porque nos conectaremos por SSM. Aunque alguien abriese el puerto 22 por error en el Security Group, SSH en Ubuntu rechaza cualquier conexión que no use una clave, por lo que sería imposible entrar. Es una capa de seguridad adicional.



Configuramos la red que hemos creado anteriormente para esta instancia, seleccionando la VPC que hemos creado, la subred pública, la permitimos el auto-assign public IP porque sino la instancia no tendrá una IP pública y seleccionamos el grupo de seguridad que no deja entrar nada. 



El almacenamiento lo dejamos por defecto, después añadiremos un EBS para los volúmenes y datos de docker.



En Advanced DetailsIAM instance profile escogemos el rol que hemos creado en IAM (free tier) o el de LabInstanceProfile (Laboratorios AWS Academy).



La instancia ya está lista, le damos a Launch Instance.

Una vez lanzada la instancia comprobamos que la seguridad funciona correctamente intentando conectarnos por todos los métodos posibles:

  • SSH: conexión rechazada, el puerto 22 está bloqueado.

  • EC2 Instance Connect: no disponible por el mismo motivo.

  • SSM: conexión exitosa.

La única forma de entrar al servidor es por SSM con credenciales IAM de AWS. Exactamente lo que buscábamos.


Montar servidor N8N

Al entrar nos conectamos como el usuario agente-ssm, cambiamos a root con sudo -i y creamos el usuario que usaremos para administrar el servidor (trabajar con root no es una buena práctica). Una vez creado el nuevo usuario, le añadimos al grupo de sudoers.


sudo -i

adduser serveradmin

usermod -aG sudo serveradmin

su - serveradmin


Ahora ya podemos trabajar cómodamente y de forma segura en el servidor. Lo primero será actualizar los paquetes:


sudo apt update

sudo apt upgrade


Vamos a instalar docker. Si escribimos en la terminal docker nos aparecerán las diferentes formas de instalarlo.


sudo apt install docker.io


Nota: La guia oficial de docker nos explica cómo instalarlo con certificados, etc… pero como esto es un laboratorio de pruebas con el comando anterior nos sirve.


Metemos al usuario serveradmin en el grupo de docker para que pueda utilizar docker.


sudo usermod -aG docker serveradmin


Nota: Para que se apliquen los cambios hay que reiniciar la instancia o ejecutar el comando newgrp docker, yo suelo reiniciar el servidor y listo, por si hubiese algún cambio que aplicar, que se apliquen todos.


El siguiente paso es crear el archivo docker-compose.yml para facilitar el lanzamiento de los contenedores y aunque lo vamos a hacer en este paso, no vamos a lanzarlo todavía, ya que los volúmenes los vamos a ubicar en una ruta dentro de un EBS que después vamos a crear y acoplar a la máquina, asegurándonos que los datos queden seguros. El docker-compose.yml irá en la ruta /opt/n8n_server


sudo mkdir -p /opt/n8n_server

sudo chown serveradmin:serveradmin /opt/n8n_server

sudo nano docker-compose.yml



El contenido de docker-compose.yml:


services:


  n8n:

    image: n8nio/n8n:latest

    container_name: n8n

    restart: always

    ports:

      - "5678:5678"

    environment:

      - N8N_HOST=127.0.0.1

      - N8N_PORT=5678

      - N8N_PROTOCOL=http

      - WEBHOOK_URL=http://127.0.0.1:5678/

      - N8N_SECURE_COOKIE=false

    volumes:

      - /mnt/data/n8n_data:/home/node/.n8n

#    depends_on:

#      - db_vector

#      - ollama_server


#  db_vector:

#    image: ankane/pgvector

#    container_name: db_vector

#    restart: always

#    environment:

#      POSTGRES_DB: "bd_n8n" #Escribe aquí el nombre de la base de datos

#      POSTGRES_USER: "postgresqladmin" #Escribe aquí el usuario de la base de datos

#      POSTGRES_PASSWORD: "12345" #Escribe aquí la contraseña de la base de datos

#    ports:

#      - "5432:5432"

#    volumes:

#      - /mnt/data/postgres_data:/var/lib/postgresql/data


#  ollama_server:

#    image: ollama/ollama

#    container_name: ollama_server

#    restart: always

#    ports:

#      - "11434:11434"

#    volumes:

#      - /mnt/data/ollama_data:/root/.ollama




Este docker-compose creará 3 contenedores en la misma red de docker, pero como se puede ver 2 de los servicios están comentados, esto es porque no son necesarios para el servidor n8n y aparte consumen muchos recursos, por lo que con el free tier de AWS se quedaría corto incluso dejando de funcionar. 


Si queréis ejecutar IA en local podemos descomentar la parte del servicio de Ollama, el cual nos deja ejecutar modelo de IA local en el propio servidor sin necesidades APIs ni pagos. 


Por otro lado la imagen ankane/pgvector me parece interesante ya que trae la extensión pgvector ya instalada, lo que facilita la configuración de la base de datos y permite almacenar vectores. Esto complementado con el contenedor de ollama corriendo un modelo de IA de embeddings como nomic-embed-text puede ser una combinación muy potente.


Para aclarar porque se ha creado así la imagen del docker compose:


El parámetro N8N_SECURE_COOKIE=false permite que n8n funcione sin exigir cookies seguras. Esto no es recomendable en un entorno de producción, ya que reduce las medidas de seguridad, pero para un laboratorio o entorno de pruebas simplifica la configuración y evita problemas al acceder desde el navegador.


También aparece el parámetro depends_on (actualmente comentado). Este parámetro indica a Docker que un servicio depende de otro y que, por tanto, debe arrancarlo antes. Sin embargo, depends_on solo controla el orden de arranque de los contenedores, no garantiza que el servicio dentro del contenedor esté completamente listo para aceptar conexiones. Por ejemplo, Docker puede iniciar el contenedor de PostgreSQL, pero n8n podría intentar conectarse antes de que la base de datos haya terminado de inicializarse. En un laboratorio esto suele ser suficiente, pero en producción se suelen usar mecanismos como healthcheck para comprobar que el servicio esté realmente disponible antes de arrancar los servicios dependientes.

Crear y montar EBS

Como se ha mencionado anteriormente, vamos a crear, acoplar y montar un EBS en el servidor n8n. Aquí es a donde apuntan los volúmenes de los contendores. Con esto conseguimos que si la instancia se rompe o falla algo, los datos los sigamos teniendo, manteniendo nuestros workflows, modelos de IA y datos de la base de datos intactos.


Vamos al menú lateral izquierdo de EC2 y buscamos la sección Elastic Block Store (EBS), vamos a volúmenes y clicamos el botón Create volume.



Vamos a crearlo de 30Gb (el límite del free tier) y lo colocamos en la misma zona de disponibilidad que la instancia.


Una vez esté creado y disponible, vamos a acoplarlo a la instancia, seleccionando el EBS que acabamos de crear en la lista de EBS, clicamos en actions y le damos a attach volume.



Nos pedirá que elijamos la instancia a la que acoplar el disco duro (EBS) y que elijamos un nombre de la lista desplegable. Algunos en la lista no están disponibles aunque aparezcan en esta, vamos uno a uno viendo cual está libre, yo por ejemplo tenía el /dev/sdd.



Volvemos a la instancia y vamos a ver si está el disco duro.


lsblk



Nota: A mi me aparece con el nombre de nvme1n1, pero en tu caso puede que sea otro, en el tutorial sigue los pasos pero poniendo el nombre de tu disco, no necesariamente sera nvme1n1.


Vemos que si que esta, pero no está ni formateado ni montado. Para montarlo y poder utilizar seguimos los siguientes pasos:

1. Formatear el disco (solo la primera vez, nunca más o se perderán los datos)

sudo mkfs.ext4 /dev/nvme1n1

2. Crear el punto de montaje

sudo mkdir -p /mnt/data

3. Montar el disco

sudo mount /dev/nvme1n1 /mnt/data

4. Verificar que está montado

lsblk



Importante: Si no ejecutamos el siguiente comando al reiniciarse el servidor el disco duro se desmontará (cada uno el nombre de su disco):


echo '/dev/nvme1n1 /mnt/data ext4 defaults,nofail 0 2' | sudo tee -a /etc/fstab

Lanzar contenedores

Antes de lanzar el docker-compose.yml, debemos crear y darle los permisos necesarios a n8n para que pueda trabajar en el directorio de n8n_data y que el servicio funcione correctamente.

sudo mkdir /mnt/data/n8n_data/

sudo chown -R 1000:1000 /mnt/data/n8n_data/


Ahora sí ya podemos lanzar el docker-compose-yml y comprobar si todo funciona. En la misma ruta donde esta el docker compose, en mi caso /opt/n8n_server/ ejecutamos:


docker-compose up -d

docker ps


Con docker ps nos aparecen los contenedores en ejecución.



Por la forma en la que hemos configurado el servidor, no podemos poner la IP pública en el navegador y esperar que nos salga el servicio, debemos usar Port Forwarding para simular que estamos en la red de AWS y ahi si que podemos ver como “localhost” el panel de n8n.




Entrar al panel N8N


Para ello debemos instalar en la máquina que estemos usando, en mi caso Windows, aws cli y el plugin aws ssm start-session. Os dejo los links de descarga:


DESCARGAR AWS CLI WEB OFICIAL


DESCARGAR PLUGIN WEB OFICIAL 


Primero ejecutamos el .msi para descargar aws cli, para comprobar que está instalado ejecutamos:


aws –version


Si nos da la versión, significa que está instalado.


Ahora ejecutamos el .exe del plugin y seguimos los pasos de instalación.


Nota: Si tenias un CMD abierto antes de las instalación no tendrá los cambios guardados, cierra y vuelve a abrir otra terminal. Sustituye i-XXXXXXX por el ID de tu instancia, lo puedes encontrar en la consola de aws → EC2 → Instancias 



En el CMD ejecutamos (copiar tal cual o escribirlo a mano en una sola línea):


aws ssm start-session --target i-XXXXXXXXX --document-name AWS-StartPortForwardingSession --parameters "{\"portNumber\":[\"5678\"],\"localPortNumber\":[\"5678\"]}"


Ahora solo falta poner en el navegador localhost:5678 y ya estaréis en el panel de configuración de n8n, podéis intentar entrar con la IP pública, desde otro ordenador, lo que queráis, pero no vais a poder entrar más que con la máquina en la que ejecuteis el comando mientras esté en ejecución y pongais en el navegador localhost:5678.


Servidor  N8N

Configurar y conocer el servidor N8N

Al ser la primera vez que entramos en el servidor n8n nos pedirá que pongamos un email, nombre, apellido y contraseña. Recordad las credenciales que pongais aquí porque después cada vez que entréis necesitareis esta información para el login.


Después nos dirá que si nos apuntamos a la comunidad podremos tener más utilidades, por ello recomiendo que pongais un email al que tengais acceso para que os llegue la free license key y podáis crear carpetas de proyectos, debugging avanzado…






Este es el panel principal del servidor n8n, aquí podremos crear flujos, organizarlos, chatear con los modelos conversacionales de IA que alojamos en local (en caso de hacerlo, si usais instancias free tier no es lo más recomendable, incluso no podréis ejecutar IA en local).



No hay comentarios:

Publicar un comentario

Cómo montar un servidor privado gratuito en AWS de forma segura

Introducción Este tutorial muestra cómo crear un EC2 de forma segura y privada sin exponerlo en internet para montar u...