Introducción
La automatización no debería ser difícil ni arriesgada. Si alguna vez ha probado unir herramientas con scripts personalizados o zaps SaaS pagos, conoce el problema: lógica frágil, dependencia de proveedores y costos crecientes. n8n soluciona eso. Es una plataforma de automatización de código abierto y autohospedable que conecta sus aplicaciones y API con un generador visual limpio y al mismo tiempo le brinda control total.
En esta guía, aprenderá cómo instalar n8n en macOS con Docker Desktop de la manera correcta: almacenamiento persistente, PostgreSQL (no SQLite), credenciales cifradas, webhooks seguros y rutinas limpias de actualización/respaldo. Mantendremos las cosas rápidas y amigables para principiantes sin saltarnos los detalles de producción. Al final, tendrá un centro de automatización local confiable que podrá utilizar para el trabajo real (probar webhooks, crear flujos de captura de clientes potenciales u orquestar canalizaciones de IA) y luego promocionarlo a un servidor con confianza.
Lo que construirás
- Una instancia local n8n que se ejecuta en contenedores Docker
- Base de datos PostgreSQL para almacenamiento duradero
- Una carpeta de proyecto ordenada con volúmenes para copias de seguridad y exportaciones compatibles con Git
- Un webhook funcional y una automatización sencilla que puedes reutilizar en cualquier lugar
- Extras opcionales (trabajadores de cola de Redis, HTTPS, túnel para webhooks públicos)
¿Para quién es esta guía?
- Desarrolladores que desean un entorno local seguro para crear y probar automatizaciones
- Creadores y especialistas en marketing que necesitan flujos de trabajo estilo Zapier sin la factura mensual
- Equipos que planean autohospedar n8n más adelante pero quieren comenzar en una Mac hoy
Requisitos previos
- macOS (Apple Silicon o Intel)
- Docker Desktop instalado y ejecutándose
- Comodidad básica de la terminal
- (Opcional) Homebrew para instalar extras como ngrok o Cloudflare Tunnel
El panorama general (por qué Docker + Postgres)
¿Por qué Docker? Consistencia. Obtiene el mismo entorno a nivel local y en producción, sin el drama de "funciona en mi máquina". ¿Por qué PostgreSQL? Es robusto y preferido en producción. SQLite está bien para pruebas rápidas, pero Postgres mantiene sus flujos de trabajo, registros de ejecución y credenciales sólidos y recuperables. ¿Por qué lo local primero? Puede iterar de forma segura. Una vez que su flujo de trabajo sea estable, puede trasladar la configuración exacta a un VPS casi sin cambios.
Paso 1: crear un proyecto limpio
Abra Terminal y cree una carpeta dedicada:
mkdir -p ~/n8n-stack/{n8n_data,db_data}
cd ~/n8n-pila
n8n_dataalmacena la configuración, las credenciales y las exportaciones de n8ndb_dataalmacena sus archivos de base de datos PostgreSQL- Mantenerlos uno al lado del otro simplifica las copias de seguridad (simplemente copie la carpeta)
Paso 2: Agregar variables de entorno
Cree un archivo .env en ~/n8n-stack. Estos valores configuran sus contenedores y mantienen los secretos fuera del control de versiones.
# ---- núcleo n8n ----
N8N_HOST=host local
N8N_PORT=5678
N8N_PROTOCOL=http
NODE_ENV=producción
# Utilice una cadena aleatoria larga (guárdela en su administrador de contraseñas)
N8N_ENCRYPTION_KEY=CAMBIAR_ME_TO_A_LONG_RANDOM_64_CHAR_STRING
# Configuración de privacidad y UX
N8N_USER_MANAGEMENT_DISABLED=falso
N8N_DIAGNOSTICS_ENABLED=falso
N8N_PERSONALIZATION_ENABLED=falso
# Limpieza de ejecución (mantiene la base de datos delgada)
EXECUTIONS_DATA_PRUNE=verdadero
EXECUTIONS_DATA_MAX_AGE=336 # horas (14 días)
EXECUTIONS_DATA_PRUNE_MAX_COUNT=10000
# ---- base de datos ----
DB_TYPE=postgresdb
DB_POSTGRESDB_HOST=db
DB_POSTGRESDB_PORT=5432
DB_POSTGRESDB_DATABASE=n8n
DB_POSTGRESDB_USER=n8n_usuario
DB_POSTGRESDB_PASSWORD=CAMBIAR_ESTA_STRONG_PASSWORD
# ---- modo cola (opcional) ----
N8N_EXECUTIONS_MODE=normal
QUEUE_BULL_REDIS_HOST=redis
QUEUE_BULL_REDIS_PORT=6379
Consejo profesional: Genere una clave segura directamente en la Terminal:
python3 - <<'PY'
importar secretos, cadena
alfabeto = cadena.letras_ascii + cadena.dígitos + cadena.puntuación
print(''.join(secrets.choice(alfabeto) para _ en el rango(80)))
PY
Pegue el resultado en N8N_ENCRYPTION_KEY.
Paso 3: cree el archivo Docker Compose
Agregue un docker-compose.yml en la misma carpeta:
versión: "3.8"
servicios:
n8n:
imagen: n8nio/n8n:último
reiniciar: a menos que se detenga
archivo_env: .env
puertos:
- "5678:5678"
ambiente:
- WEBHOOK_URL=${N8N_PROTOCOL}://${N8N_HOST}:${N8N_PORT}/
volúmenes:
- ./n8n_data:/home/nodo/.n8n
depende_de:
- base de datos
base de datos:
imagen: postgres:15
reiniciar: a menos que se detenga
ambiente:
-POSTGRES_USER=${DB_POSTGRESDB_USER}
-POSTGRES_PASSWORD=${DB_POSTGRESDB_PASSWORD}
-POSTGRES_DB=${DB_POSTGRESDB_DATABASE}
volúmenes:
- ./db_data:/var/lib/postgresql/data
# Opcional: habilitar más tarde para ejecuciones en paralelo/en cola
#redis:
# imagen: redis:7-alpine
# reiniciar: a menos que se detenga
Por qué funciona este diseño:
- El contenedor n8n conserva todo lo importante dentro de
./n8n_data - Los datos de Postgres se encuentran en
./db_data env_filemantiene secretos fuera de YAML y fuera de Git
Paso 4: Inicie n8n
De ~/n8n-stack:
ventana acoplable componer -d
abrir http://localhost:5678
Verás la pantalla configuración del propietario. Cree su cuenta de administrador con una contraseña segura.
Paso 5: Bloquee la configuración de su base
Vaya a Configuración → General y confirme:
- Zona horaria: configura tu hora local
- URL de webhook:
http://localhost:5678/para pruebas locales - Ejecuciones: poda habilitada (ya configurada mediante
.env)
Guardar cambios.
Paso 6: Prueba de humo un webhook (tu primera automatización)
-
Haga clic en Crear flujo de trabajo → Empezar desde cero
-
Agregue el nodo Webhook
- Método HTTP:
POST - Ruta:
hola(o dejar la ruta automática)
- Método HTTP:
-
Agregue el nodo Responder al webhook
-
Respuesta: JSON
-
Cuerpo:
{ "ok": verdadero, "recibido": "{{$json.body.ping || 'pong'}}" }
-
-
Conecte Webhook → Responder al Webhook
-
Haga clic en Escuchar evento de prueba en el nodo Webhook.
-
En la terminal:
curl -X POST "http://localhost:5678/webhook-test/<tu-id>" \
-H "Tipo de contenido: aplicación/json" \
-d '{"ping":"pong"}'
Verá que la solicitud llega a la salida del nodo y recibirá una respuesta JSON "200". Haga clic en Activar para obtener una URL de producción a la que pueda llamar incluso cuando el editor no esté escuchando.
Paso 7: Exponga su webhook públicamente (opcional, útil)
Cuando desee probar webhooks de servicios externos (formularios, Stripe, GitHub), utilice un túnel seguro.
Opción A — ngrok
instalar cerveza ngrok/ngrok/ngrok
ngrok http http://localhost:5678
Opción B: Túnel de Cloudflare (gratis, estable)
instalar cerveza en cloudflare/cloudflare/cloudflared
túnel en la nube --url http://localhost:5678
Copie la URL HTTPS que le proporciona. En n8n Configuración → General, establezca temporalmente Webhook URL en ese valor para que sus URL de producción utilicen HTTPS.
Paso 8: Cree una automatización simple pero significativa
Aquí hay un comienzo real y útil: Control de tiempo de actividad y errores.
- Cada 5 minutos: haga ping a una lista de URL
- Si alguno devuelve
>= 400, envía una alerta de Slack con la URL y el código de estado
Importe el flujo de trabajo a continuación (n8n → Importar → pegar JSON). Luego edite la lista de URL y el canal de Slack.
{
"name": "Control de tiempo de actividad y errores",
"nodos": [
{
"parámetros": {
"triggerTimes": { "item": [ { "mode": "everyX", "unit": "minutos", "value": 5 } ] }
},
"identificación": "cron",
"name": "Cron (cada 5 m)",
"tipo": "n8n-nodes-base.cron",
"tipoVersión": 1,
"posición": [220, 280]
},
{
"parámetros": {
"functionCode": "const urls = [\n 'https://www.ramlit.com/',\n 'https://www.colorpark.io/',\n 'https://www.xcybersecurity.io/',\n 'https://www.mejba.me/'\n];\nreturn urls.map(u => ({ url: u }));"
},
"id": "Semilla",
"name": "URL semilla",
"tipo": "n8n-nodes-base.function",
"tipoVersión": 2,
"posición": [440, 280]
},
{
"parámetros": {
"url": "={{$json.url}}",
"responseFormat": "cadena",
"opciones": { "ignoreResponseCode": verdadero, "tiempo de espera": 10000 }
},
"identificación": "HTTP",
"nombre": "Comprobación HTTP",
"tipo": "n8n-nodes-base.httpRequest",
"tipoVersión": 4,
"posición": [660, 280]
},
{
"parámetros": {
"condiciones": {
"número": [ { "valor1": "={{$json.statusCode}}", "operación": "largerEqual", "valor2": 400 } ]
}
},
"identificación": "SI",
"nombre": "Error SI (>=400)",
"tipo": "n8n-nodos-base.if",
"tipoVersión": 1,
"posición": [880, 280]
},
{
"parámetros": {
"canal": "#alertas",
"text": "Alerta de tiempo de actividad: {{$json.url}} devolvió HTTP {{$json.statusCode}}"
},
"id": "Flajo",
"name": "Alerta de holgura",
"tipo": "n8n-nodos-base.slack",
"tipoVersión": 1,
"posición": [1100, 240],
"credenciales": { "slackApi": { "id": "reemplazar-en-ui" } }
}
],
"conexiones": {
"Cron (cada 5 m)": { "principal": [ [ { "nodo": "URL semilla", "tipo": "principal", "índice": 0 } ] ] },
"URL semilla": { "principal": [ [ { "nodo": "Comprobación HTTP", "tipo": "principal", "índice": 0 } ] ] },
"Comprobación HTTP": { "principal": [ [ { "nodo": "Error IF (>=400)", "tipo": "principal", "índice": 0 } ] ] },
"Error IF (>=400)": { "principal": [ [ { "nodo": "Alerta de holgura", "tipo": "principal", "índice": 0 } ], [] ] }
}
}
Por qué esto es valioso: Detectará rápidamente el tiempo de inactividad o los errores de ruta, antes de que lo hagan los clientes. Amplíelo registrando fallas en Google Sheets o Notion.
Paso 9: Credenciales, privacidad y conceptos básicos de seguridad
Incluso a nivel local, trate los secretos con cuidado:
- Almacene tokens de API en Credenciales (están cifrados con su
N8N_ENCRYPTION_KEY). - Para webhooks entrantes, agregue un encabezado secreto (por ejemplo,
X-Webhook-Secret) y verifíquelo con un nodo Función. - Mantenga diagnóstico y personalización desactivados por motivos de privacidad.
- Utilice un administrador de contraseñas para almacenar sus secretos
.env; no los envíe a Git.
Paso 10: Copias de seguridad y exportaciones de flujos de trabajo
Tus activos más importantes se encuentran en dos lugares:
~/n8n-stack/n8n_data(configuración de n8n y almacén de credenciales)~/n8n-stack/db_data(datos de Postgres)
Copia de seguridad manual rápida:
- Detener contenedores:
docker compose down - Copie toda la carpeta
~/n8n-stacka una unidad segura o S3 - Empezar de nuevo:
docker compose up -d
Exportar flujos de trabajo a un único archivo JSON (ideal para Git):
docker exec -it $(docker ps --filter nombre=n8n -q) \
Exportación n8n: flujo de trabajo --all --output=/home/node/.n8n/exports.json
# El archivo aparecerá dentro de ./n8n_data
Paso 11: Actualizar n8n de forma segura
- Exporta tus flujos de trabajo (
exports.json) - Haga una copia rápida de las carpetas
n8n_dataydb_data - Extraiga la imagen más reciente y vuelva a crearla:
ventana acoplable componer tirar
ventana acoplable componer -d
Si algo parece estar mal, puede retroceder intercambiando sus carpetas de respaldo nuevamente.
Paso 12: Aumento de rendimiento opcional (Trabajadores + Redis)
Cuando los flujos de trabajo se vuelven pesados (llamadas de IA, cargas de archivos, API lentas), cambie al modo de cola y genere trabajadores.
-
Descomentar el servicio
redisendocker-compose.yml -
Establecido en
.env:N8N_EXECUTIONS_MODE=cola -
Servicios de inicio y un trabajador:
ventana acoplable componer -d
ventana acoplable componer ejecutar --no-deps --name n8n-worker-1 \
-e N8N_EXECUTIONS_MODE=cola \
-e QUEUE_BULL_REDIS_HOST=redis \
n8n n8n trabajador
Puede ejecutar varios trabajadores para una ejecución paralela.
Paso 13: De Mac a producción (cuando esté listo)
La belleza de Docker es que la promoción es simple. En un VPS (o en Kubernetes):
- Reutilizar las mismas imágenes y variables de entorno
- Ponga n8n detrás de Caddy/Nginx con HTTPS (Let's Encrypt)
- Agregue Cloudflare Access o su SSO para una interfaz de usuario de administrador segura
- Programe copias de seguridad periódicas de la base de datos Postgres y
n8n_data
Sus aprendizajes locales se mueven con usted, no se requiere reconstrucción.
Errores comunes (y soluciones rápidas)
“Puerto ya en uso.”
Cambie N8N_PORT en .env y la asignación de ports en docker-compose.yml, luego docker compose up -d.
“Permiso denegado” en volúmenes. Corregir propiedad/permisos:
chmod -R 775 ~/n8n-stack/n8n_data ~/n8n-stack/db_data
Errores de URL de prueba de webhook.
- Utilice la URL de prueba solo mientras esté activo "Escuchar evento de prueba".
- Después de hacer clic en Activar, utilice la URL de producción.
Gran crecimiento de la base de datos.
- Seguir podando (ya configurado).
- Evite guardar grandes datos binarios en nodos; utilice S3/Drive siempre que sea posible.
Comparaciones: ¿Por qué n8n frente a Zapier/Make?
- Control de costos: n8n es de código abierto y autohospedable: escala sin penalizaciones por zap.
- Flexibilidad: lógica a nivel de código a través de nodos de función; cree nodos personalizados si es necesario.
- Control de datos: ejecútelo en su hardware; alinearse con el cumplimiento o las demandas del cliente.
- Portabilidad: La configuración Dockerizada refleja la producción: cambie los entornos fácilmente.
Casos de uso del mundo real que puedes crear a continuación
- Admisión de clientes potenciales: Webhook → Normalizar → Notificar Slack → Agregar Google Sheets
- Resumen diario de IA: Cron → API de búsqueda → Resumen de OpenAI → Publicar en Notion
- Enrutamiento de incidentes: GitHub/CI Webhook → Analizar registros → Alerta de Slack/PagerDuty
- Operaciones financieras: Importación CSV → limpiar datos → almacenar en Postgres → informe por correo electrónico
- Operaciones de ventas: Evento de Stripe → enriquecer con CRM → notificar y etiquetar en Slack
Cada uno de estos puede iniciarse en su Mac y ponerse en producción más tarde con colas y HTTPS.
Viñetas / Conclusiones rápidas
- Docker + Postgres te ofrece un n8n estable y similar a una producción en macOS.
- Cifre las credenciales con
N8N_ENCRYPTION_KEYy evite cometer secretos. - Utilice URL de prueba mientras escucha; URL de producción después de la activación.
- Haga una copia de seguridad de
n8n_dataydb_datao exporte flujos de trabajo con regularidad. - Agregar Redis + trabajadores cuando los flujos sean más intensos; ganarás paralelismo.
- Los túneles (ngrok/Cloudflare) hacen que las pruebas de webhooks externos sean simples y seguras.
- La promoción a un VPS es principalmente copiar y pegar: mismo archivo de redacción, perímetro más fuerte.
Llamado a la acción
Si se toma en serio la automatización, no se detenga en "hola mundo". Elija un proceso (ingreso de clientes potenciales, alertas de tiempo de actividad o un informe diario de IA) y envíelo hoy. ¿Quiere un flujo de trabajo inicial personalizado (Slack + Sheets o resumen de IA → Notion)? Dígame sus herramientas de destino y le proporcionaré un JSON listo para importar que puede ejecutar de inmediato.
🤝 Contrata/Trabaja conmigo:
- 🔗 Fiverr (compilaciones personalizadas, integraciones, rendimiento): https://www.fiverr.com/s/EgxYmWD
- 🌐 Portafolio Personal Mejba: https://www.mejba.me
- 🏢 Ramlit Limitado: https://www.ramlit.com
- 🎨 Agencia Creativa ColorPark: https://www.colorpark.io
- 🛡 Servicios globales de xCyberSecurity: https://www.xcybersecurity.io
Preguntas frecuentes
1) ¿Puedo usar SQLite en lugar de Postgres? Puedes hacerlo, pero no es ideal para nada más que experimentos rápidos. Postgres es más confiable, más fácil de respaldar y recomendado para trabajos reales.
2) ¿Necesito HTTPS en mi Mac? Para el desarrollo local, no. Si expone webhooks públicamente, utilice un túnel (ngrok/Cloudflare). Para producción, coloque n8n detrás de un proxy inverso con HTTPS.
3) ¿Cómo mantengo seguros mis flujos de trabajo durante las actualizaciones?
Exporte flujos de trabajo a JSON, haga una copia de seguridad de n8n_data y db_data y luego actualice. Si algo se rompe, retroceda las carpetas.
4) ¿Por qué mi URL de prueba no funciona después de un minuto? Las URL de prueba solo funcionan mientras el editor escucha eventos. Haga clic en "Escuchar evento de prueba" nuevamente o use la URL de producción después de la activación.
5) ¿Puedo ejecutar varios flujos de trabajo en paralelo en mi Mac? Sí. Cambie al modo de cola con Redis e inicie uno o más trabajadores.
6) ¿Cómo me conecto a Slack, Google Sheets o Notion?
Cree credenciales en Credenciales (OAuth o token), luego selecciónelas en el nodo. n8n los almacena cifrados usando su N8N_ENCRYPTION_KEY.
7) ¿N8n es adecuado para empresas? Sí, cuando está autohospedado correctamente con SSO/OIDC, HTTPS, copias de seguridad y acceso basado en roles. La configuración de tu Mac refleja la arquitectura que usarás en producción.
8) ¿Qué pasa con los flujos de trabajo de IA? n8n se integra con OpenAI y otros proveedores. Agregue nodos de función para mensajes personalizados o API en cadena (buscar → resumir → publicar) con reintentos y tiempos de espera.
Ya terminaste. Has instalado n8n en tu Mac con Docker Desktop, has verificado webhooks y has aprendido una forma orientada a la producción para crear automatizaciones en las que puedes confiar. Ahora ponlo a trabajar.