Este guía presenta el proceso de instalación manual del n8n por el terminal vía SSH, ideal para quienes tienen un VPS vacío (solo con el sistema operativo AlmaLinux) y desean personalizar el ambiente o aprender más sobre la infraestructura de su propio VPS.
Consulte a continuación el procedimiento:
- Requisitos
- Etapa 1: Acceder al terminal y actualizar el sistema
- Etapa 2: Instalar Docker y Docker Compose
- Etapa 3: Crear estructura de directorios
- Etapa 4: Crear archivo de configuración (.env)
- Etapa 5: Crear Docker Compose (Configuración básica)
- Etapa 6: Configurar firewall
- Etapa 7: Iniciar el n8n
- Etapa 8: Acceder a n8n
Requisitos
Antes de iniciar, verifique si usted tiene:
- Sistema operativo AlmaLinux 9
- Acceso root vía SSH - Consulte cómo acceder
- Mínimo 2 GB de RAM (recomendado)
- Dominio apuntado al IP de la VPS (Opcional)
Etapa 1: Acceder al terminal y actualizar el sistema
1Conéctese al servidor VPS vía SSH
2En el terminal actualice el sistema:
- A) Para actualizar todos los paquetes, escriba el comando:
dnf update -y
- B) Instalar herramientas esenciales, escriba el comando:
dnf install -y epel-release curl wget git
Etapa 2: Instalar Docker y Docker Compose
1Para agregar el repositorio docker, en el terminal escriba:
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
2Luego, instale el docker:
dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
3Verifique la versión instalada:
docker --version docker compose version
4Inicie el servicio docker con el comando:
systemctl start docker
5Habilite para iniciar en el arranque:
systemctl enable docker
6Ahora verifique el estado - Debe ver “active (running)” en color verde
systemctl status docker
Etapa 3: Crear estructura de directorios
Vamos a incluir todo en un directorio dedicado para mantener todos los datos organizados:
1Para crear el directorio principal, en el terminal escriba:
mkdir -p ~/n8n-docker cd ~/n8n-docker
2Para crear subdirectorios para datos persistentes, escriba:
mkdir -p n8n_data mkdir -p postgres_data
Etapa 4: Crear archivo de configuración (.env)
El archivo “.env” almacena sus configuraciones de forma segura:
1Para crearlo, en el terminal escriba:
nano .env
2 A continuación, agregue la siguiente información:
- A) Configuraciones Generales:
TIMEZONE=America/Mexico_City
Reemplace “America/Mexico_City” por la zona horaria de su región
- B) Configuraciones PostgreSQL:
POSTGRES_USER=Cliente POSTGRES_PASSWORD=SuContraseñaPostgresMuyFuerte123! POSTGRES_DB=n8n
Reemplace “SuContraseñaPostgresMuyFuerte123!” por una contraseña fuerte y única
- C) Configuraciones n8n:
N8N_BASIC_AUTH_ACTIVE=true N8N_BASIC_AUTH_USER=Cliente N8N_BASIC_AUTH_PASSWORD=SuContraseñaAdminFuerte456!
Reemplace “Cliente” por el nombre de usuario que desea y “SuContraseñaAdminFuerte456!” por una contraseña fuerte única
- D) Configuraciones de Red:
N8N_PORT=5678 N8N_PROTOCOL=http N8N_HOST=localhost
- E) Clave de Encriptación:
N8N_ENCRYPTION_KEY=su_clave_unica_aqui_32_caracteres
Consejo: Para generar la clave de encriptación, escriba:
openssl rand -base64 32
Copie el resultado y péguelo en lugar de “su_clave_unica_aqui_32_caracteres”
- F) URL para Webhooks
WEBHOOK_URL=http://SU_IP_AQUI:5678/
Reemplace “SU_IP_AQUI” por el IP de su VPS
Si ha configurado un dominio, reemplace “SU_IP_AQUI” por el nombre del dominio - Por ejemplo: tudominio.com
3Guarde el archivo – En el teclado presione Ctrl + X, luego Y, y a continuación Enter
Etapa 5: Crear Docker Compose (Configuración básica)
1Para crear el archivo que define la aplicación de n8n, en el terminal escriba:
nano docker-compose.yml
2Ahora, de acuerdo a lo que desea, elija una de las opciones a continuación:
- Opción A - Configuración simple (Sin SSL) - Ideal para comenzar o uso interno
- Opción B: Configuración avanzada con SSL (Traefik) - Use esta configuración si usted tiene un dominio y quiere HTTPS automático
Opción A - Configuración simple (Sin SSL)
3En el terminal agregue esta configuración completa:
version: '3.8'
services:
postgres:
image: postgres:15-alpine
container_name: n8n_postgres
restart: unless-stopped
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB}
volumes:
- ./postgres_data:/var/lib/postgresql/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER}']
interval: 10s
timeout: 5s
retries: 5
networks:
- n8n_network
n8n:
image: n8nio/n8n:latest
container_name: n8n
restart: unless-stopped
ports:
- "${N8N_PORT}:5678"
environment:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
- DB_POSTGRESDB_USER=${POSTGRES_USER}
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
- N8N_BASIC_AUTH_ACTIVE=${N8N_BASIC_AUTH_ACTIVE}
- N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER}
- N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}
- N8N_HOST=${N8N_HOST}
- N8N_PORT=5678
- N8N_PROTOCOL=${N8N_PROTOCOL}
- NODE_ENV=production
- WEBHOOK_URL=${WEBHOOK_URL}
- GENERIC_TIMEZONE=${TIMEZONE}
- TZ=${TIMEZONE}
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
volumes:
- ./n8n_data:/home/node/.n8n
depends_on:
postgres:
condition: service_healthy
networks:
- n8n_network
networks:
n8n_network:
driver: bridge
volumes:
postgres_data:
n8n_data:
4Guarde el archivo – En el teclado presione Ctrl + X, luego Y, y después Enter
Opción B: Configuración avanzada con SSL (Traefik)
3Antes de comenzar, apunte su dominio al IP de la VPS - Consulte como realizar
4Actualice el archivo “.env” con el siguiente comando:
nano .env
5A continuación, modifique las siguientes líneas:
N8N_HOST=n8n.seudominio.com N8N_PROTOCOL=https WEBHOOK_URL=https://n8n.seudominio.com/ LETSENCRYPT_EMAIL=contacto@tudominio.com DOMAIN_NAME=n8n.seudominio.com
Reemplace “seudominio.com” por el nombre del dominio real y el “contacto@tudominio.com” por el suyo
6Ahora cree un docker compose con Traefik, para eso escriba:
nano docker-compose.yml
7A continuación, agregue esta configuración completa:
version: '3.8'
services:
traefik:
image: traefik:v2.10
container_name: traefik
restart: unless-stopped
command:
- "--api.insecure=false"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.letsencrypt.acme.tlschallenge=true"
- "--certificatesresolvers.letsencrypt.acme.email=${LETSENCRYPT_EMAIL}"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
- "--entrypoints.web.http.redirections.entrypoint.to=websecure"
- "--entrypoints.web.http.redirections.entrypoint.scheme=https"
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./letsencrypt:/letsencrypt
networks:
- n8n_network
postgres:
image: postgres:15-alpine
container_name: n8n_postgres
restart: unless-stopped
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB}
volumes:
- ./postgres_data:/var/lib/postgresql/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER}']
interval: 10s
timeout: 5s
retries: 5
networks:
- n8n_network
n8n:
image: n8nio/n8n:latest
container_name: n8n
restart: unless-stopped
environment:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
- DB_POSTGRESDB_USER=${POSTGRES_USER}
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
- N8N_BASIC_AUTH_ACTIVE=${N8N_BASIC_AUTH_ACTIVE}
- N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER}
- N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}
- N8N_HOST=${N8N_HOST}
- N8N_PORT=5678
- N8N_PROTOCOL=${N8N_PROTOCOL}
- NODE_ENV=production
- WEBHOOK_URL=${WEBHOOK_URL}
- GENERIC_TIMEZONE=${TIMEZONE}
- TZ=${TIMEZONE}
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
volumes:
- ./n8n_data:/home/node/.n8n
depends_on:
postgres:
condition: service_healthy
networks:
- n8n_network
labels:
- "traefik.enable=true"
- "traefik.http.routers.n8n.rule=Host(`${DOMAIN_NAME}`)"
- "traefik.http.routers.n8n.entrypoints=websecure"
- "traefik.http.routers.n8n.tls.certresolver=letsencrypt"
- "traefik.http.services.n8n.loadbalancer.server.port=5678"
networks:
n8n_network:
driver: bridge
8Para crear el directorio para los certificados, escriba el comando:
mkdir -p letsencrypt chmod 600 letsencrypt
9Iniciar con Traefik:
- A) Detener contenedores si están en ejecución:
docker compose down
- B) Iniciar nueva configuración:
docker compose up -d
- C) Ver logs:
docker compose logs -f traefik docker compose logs -f n8n
Etapa 6: Configurar firewall
1Para habilitar el firewall, escriba:
systemctl enable --now firewalld
2Para permitir el puerto de n8n:
-
Si es por IP (opción A Etapa 5):
firewall-cmd --permanent --add-port=5678/tcp
-
Si va a usar un dominio con Traefik (Opción B Etapa 5):
firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https
3A continuación, para aplicar los cambios, escriba:
firewall-cmd --reload
4Verificar reglas:
firewall-cmd --list-all
Etapa 7: Iniciar el n8n
Ahora vamos a subir los contenedores:
1Asegúrese de estar en el directorio correcto y en el terminal escriba:
cd ~/n8n-docker
2En segundo plano, inicie los contenedores:
docker compose up –d
3Verifique los registros:
- En tiempo real:
docker compose logs -f
- Solo registros de n8n:
docker compose logs -f n8n
4Verifique si está corriendo:
- Listar contenedores activos:
docker compose ps
- Ver estado detallado:
docker ps
En la primera ejecución:
- Docker descarga las imágenes (la primera vez demora algunos minutos)
- Crea los contenedores de PostgreSQL y n8n
- Conecta todo automáticamente
Usted debe ver dos contenedores: “n8n” y “n8n_postgres” con estado “Up”
Etapa 8: Acceder a n8n
1Abra el navegador y escriba:
- Si usa la IP del servidor escriba: http://SU_IP_DEL_VPS:5678
Ejemplo: http://123.123.1.100:5678
- Si usa un dominio configurado, escriba: https://n8n.tudominio.com
Reemplace “tudominio.com” por el que tiene registrado
2En la pantalla de inicio de sesión, ingrese la información:
- Usuario: admin o el que usted definió en .env
- Contraseña: la contraseña que usted definió en .env
¡Listo! Ahora usted ya está en la aplicación (o panel) n8n y con las configuraciones hechas