Skip to main content
n8n

Instale n8n en Mac con Docker Desktop: guía paso a paso

Install n8n on Mac with Docker: Postgres over SQLite, a persisted encryption key, working webhooks, backups — plus the five upgrades that make it stick.

14 min
Tiempo de lectura
2,750
Palabras
Publicado
Última revisión
Engr Mejba Ahmed

Escrito por

Engr Mejba Ahmed

Compartir Artículo

Instale n8n en Mac con Docker Desktop: guía paso a paso

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_data almacena la configuración, las credenciales y las exportaciones de n8n
  • db_data almacena 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_file mantiene 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)

  1. Haga clic en Crear flujo de trabajo → Empezar desde cero

  2. Agregue el nodo Webhook

    • Método HTTP: POST
    • Ruta: hola (o dejar la ruta automática)
  3. Agregue el nodo Responder al webhook

    • Respuesta: JSON

    • Cuerpo:

      { "ok": verdadero, "recibido": "{{$json.body.ping || 'pong'}}" }
      
  4. Conecte Webhook → Responder al Webhook

  5. Haga clic en Escuchar evento de prueba en el nodo Webhook.

  6. 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-stack a 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

  1. Exporta tus flujos de trabajo (exports.json)
  2. Haga una copia rápida de las carpetas n8n_data y db_data
  3. 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 redis en docker-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_KEY y 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_data y db_data o 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:


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.

Coffee cup

¿Te gustó este artículo?

Tu apoyo me ayuda a crear más contenido técnico detallado, herramientas de código abierto y recursos gratuitos para la comunidad de desarrolladores.

Temas Relacionados

Engr Mejba Ahmed

Engr Mejba Ahmed

Engr. Mejba Ahmed builds AI-powered applications and secure cloud systems for businesses worldwide. With 8+ years shipping production software in Laravel, Python, and AWS, he's helped companies automate workflows, reduce infrastructure costs, and scale without security headaches. He writes about practical AI integration, cloud architecture, and developer productivity.

Artículos Relacionados

Ver Todos

Comments

Leave a Comment

Share a question or add to the discussion.

Comments are moderated before appearing.

Learning Resources

Expand Your Knowledge

Accelerate your growth with structured courses, verified certificates, interactive flashcards, and production-ready AI agent skills.

Sample Certificate of Completion

Sample certificate — complete any course to earn yours

Engr Mejba Ahmed

Engr Mejba Ahmed

AI assistant · trained on my work

👋

Hey there!

Quick Actions

WhatsApp Direct line to me

Chat on WhatsApp

+880 1723 741224 · Replies within the hour on working days

Popular Questions

Engr Mejba Ahmed is connected
Engr Mejba Ahmed is typing...
Engr Mejba Ahmed avatar

✉ Want me to follow up? Drop your email

Engr Mejba Ahmed avatar

📞 Connect Directly

Choose how you'd like to reach me

WhatsApp

+880 1723 741224

Email

mejba.13@gmail.com

✓ Details sent! I'll get back to you shortly.

Powered by Claude

335+

Blog Posts

25

AI Courses

63

Projects

Services & Expertise

Pricing & Process

Learning & Resources

Connect & Support