Skip to main content
n8n

Install n8n on Mac with Docker Desktop: Step-by-Step Guide

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

10 min
Read time
1,809
Words
Published
Last revised
Engr Mejba Ahmed

Written by

Engr Mejba Ahmed

Share Article

Install n8n on Mac with Docker Desktop: Step-by-Step Guide

Most n8n-on-Mac tutorials teach you an installation you will have to throw away. They run the quick single-container command, default to SQLite, skip the encryption key, and everything works — until the first upgrade eats your credentials or the database file corrupts mid-flow. Installing n8n so it survives is maybe fifteen minutes more work than installing it so it demos, and this guide is the fifteen-minute version: Docker Compose, PostgreSQL, persisted volumes, a backup routine you can actually run — and, because installing is the easy half, the five upgrades that turn a fresh install into an automation habit that sticks.

Docker on a Mac is my daily environment — I run my containers through OrbStack rather than Docker Desktop, and everything below works identically on either, because it is plain Docker Compose. n8n itself has earned a permanent slot in my automation stack, so this setup is the one I actually rebuild from when I move machines.

Install n8n on Mac with Docker Desktop: Step-by-Step Guide - overview of why compose + postgres instead of the quick start, step 1: project folder

Why Compose + Postgres Instead of the Quick Start

Three decisions up front, because they are the whole difference between a toy and a tool:

Docker over a bare npm install for consistency — the exact environment you build locally is the one you will later run on a VPS. No "works on my machine."

PostgreSQL over SQLite because SQLite is fine right up until it is not: concurrent executions, growing execution logs, and backup-while-running are all places the single-file database eventually bites you. Postgres is what n8n recommends for production, and starting on it locally means promotion to a server is a copy, not a migration.

Local first because automations touch credentials and third-party APIs. You want to make your mistakes on localhost.

Step 1: Project Folder

mkdir -p ~/n8n-stack/{n8n_data,db_data}
cd ~/n8n-stack

n8n_data will hold n8n's config, credentials, and exports; db_data holds Postgres. Keeping both side by side makes backup literally "copy this folder."

Step 2: The .env File

Create ~/n8n-stack/.env:

# ---- n8n core ----
N8N_HOST=localhost
N8N_PORT=5678
N8N_PROTOCOL=http
NODE_ENV=production

# The single most important line in this file:
N8N_ENCRYPTION_KEY=CHANGE_ME_TO_A_LONG_RANDOM_STRING

# Privacy
N8N_DIAGNOSTICS_ENABLED=false
N8N_PERSONALIZATION_ENABLED=false

# Keep the database from growing forever
EXECUTIONS_DATA_PRUNE=true
EXECUTIONS_DATA_MAX_AGE=336
EXECUTIONS_DATA_PRUNE_MAX_COUNT=10000

# ---- database ----
DB_TYPE=postgresdb
DB_POSTGRESDB_HOST=db
DB_POSTGRESDB_PORT=5432
DB_POSTGRESDB_DATABASE=n8n
DB_POSTGRESDB_USER=n8n_user
DB_POSTGRESDB_PASSWORD=CHANGE_THIS_STRONG_PASSWORD

Generate the key properly and store it in your password manager:

openssl rand -base64 48

Here is the insight that costs people their entire credential store: n8n encrypts every saved credential with N8N_ENCRYPTION_KEY. If you let n8n auto-generate that key inside a container and the container is ever recreated without the same key, every stored credential decrypts to garbage. Nothing warns you at install time; you find out weeks later when every workflow fails to authenticate at once. Set the key explicitly, on day one, and back it up separately from the data folder. This single habit is most of the difference between this guide and the quick starts.

The execution-pruning block is the second quiet lifesaver — fourteen days of history is plenty for debugging, and without pruning the executions table becomes the reason your "lightweight automation tool" is eating gigabytes.

Step 3: docker-compose.yml

services:
  n8n:
    image: n8nio/n8n:latest
    restart: unless-stopped
    env_file: .env
    ports:
      - "5678:5678"
    environment:
      - WEBHOOK_URL=${N8N_PROTOCOL}://${N8N_HOST}:${N8N_PORT}/
    volumes:
      - ./n8n_data:/home/node/.n8n
    depends_on:
      - db

  db:
    image: postgres:15
    restart: unless-stopped
    environment:
      - POSTGRES_USER=${DB_POSTGRESDB_USER}
      - POSTGRES_PASSWORD=${DB_POSTGRESDB_PASSWORD}
      - POSTGRES_DB=${DB_POSTGRESDB_DATABASE}
    volumes:
      - ./db_data:/var/lib/postgresql/data

Secrets live in .env (never committed), state lives in the two mounted folders, and the YAML stays boring. Boring is the goal.

Step 4: Start It

docker compose up -d
open http://localhost:5678

Create your owner account with a real password, set your timezone under Settings → General, and you are running.

Step 5: Smoke-Test a Webhook

Webhooks are where n8n beginners lose the most time, so verify them before building anything real. Create a workflow with a Webhook node (method POST) connected to a Respond to Webhook node, click Listen for test event, then:

curl -X POST "http://localhost:5678/webhook-test/<your-id>" \
  -H "Content-Type: application/json" -d '{"ping":"pong"}'

The gotcha that generates half of n8n's beginner questions: the Test URL only works while the editor is actively listening. Once you activate the workflow, you get a separate Production URL that works permanently. Those are two different URLs with two different lifecycles — internalize that now and skip the confusion.

When you need an external service (Stripe, GitHub, a form) to reach your Mac, tunnel it:

brew install cloudflare/cloudflare/cloudflared
cloudflared tunnel --url http://localhost:5678

ngrok works equally well. Point the temporary HTTPS URL at n8n's Webhook URL setting while testing, and remember external calls die when the tunnel does.

Step 6: A First Workflow Worth Keeping

Skip "hello world" — build a monitor you will keep. Mine is an uptime watchdog: a Schedule trigger every five minutes feeds a list of URLs (I watch my own properties — ramlit.com, colorpark.io, xcybersecurity.io, and this site) into an HTTP Request node with ignore response code enabled, an IF node checks statusCode >= 400, and failures post to Slack with the URL and status. Ten nodes, twenty minutes, and it has caught real downtime and DNS mistakes before customers did.

The selection principle matters more than the example: automate something you already do manually and repeatedly — data entry, notifications, file organization, report pulls. A workflow that scratches a real itch gets maintained; a demo workflow gets abandoned, and abandoned workflows are how n8n installs die.

After the Install: Five Upgrades That Make n8n Stick

Getting n8n running is a Saturday morning. What separates the people still using it six months later comes down to five habits.

1. Add an error-trigger branch to every workflow you keep. The difference between a demo and a system is what happens when a node fails at 3 AM. n8n has a dedicated Error Trigger node: build one small error workflow that catches failures and posts them somewhere you actually look — Slack, email, a log sheet — including the workflow name, the failing node, and the input that broke it. Then rehearse recovery once: kill a credential on purpose and check whether the alert alone tells you what broke. If it doesn't, enrich it now, while the stakes are zero. Automation you can't debug at a glance isn't automation — it's deferred manual work with interest.

2. Use community nodes — with a credentials-grade trust bar. The community node ecosystem extends n8n far beyond the built-ins, and skipping it means rebuilding solved problems. But a community node runs inside the container that holds your encrypted credentials, so I apply one rule: install only nodes I'd trust with the credentials that container can reach — actively maintained, source I can skim, real adoption. One sketchy node undoes every security decision above.

3. Refine workflows instead of accumulating them. Revisit what you've built monthly: delete redundant nodes, replace copy-pasted branches with IF/Switch logic, and check execution times. The pruning settings in Step 2 keep the database honest; this habit keeps the logic honest.

4. Connect the tools you already live in. The compounding wins come from wiring n8n into your daily stack — Google Sheets for reporting, Slack for alerts, your project tracker for task creation — because every integration multiplies what every other workflow can do. This is also where AI-assisted building changes the economics: I generate and manage workflows from the terminal via the n8n MCP server with Claude Code, which turns "an hour of dragging nodes" into a described sentence.

5. Steal from people ahead of you. The n8n community forum and template library are full of production patterns — error handling, queue setups, credential rotation — that took someone else a painful weekend to learn. Borrowing them is the highest-leverage hour you'll spend. If you want to see which automations are actually worth building first, I keep a field-tested list of automations businesses genuinely pay for.

Backups and Upgrades Without Fear

Everything that matters lives in two folders and one key. So:

Backup: docker compose down, copy ~/n8n-stack somewhere safe, docker compose up -d. For git-friendly exports of just the workflows:

docker exec -it $(docker ps --filter name=n8n -q) \
  n8n export:workflow --all --output=/home/node/.n8n/exports.json

Upgrade: export workflows, copy the two folders, then:

docker compose pull
docker compose up -d

If the new version misbehaves, swap the folder copies back and you have rolled back. I do the folder copy before every upgrade, and the one time an upgrade broke a community node, that habit turned an outage into a two-minute revert.

When flows get heavy — AI calls, file processing, slow APIs — add a redis:7-alpine service, set N8N_EXECUTIONS_MODE=queue, and run one or more worker containers for parallel execution. That is also the architecture you will run in production, which is the payoff of doing this with Compose from the start: promotion to a VPS or a cluster is the same file behind a reverse proxy with HTTPS. My OrbStack Kubernetes writeup covers the heavier end of that path on the same Mac.

Quick Answers

Can I just use SQLite? For an afternoon of experimentation, sure. For anything holding real credentials and running on a schedule, use Postgres — the migration later is more work than starting right.

Do I need HTTPS locally? No. Tunnel for external webhook tests; put HTTPS in front only when you deploy.

Why did all my credentials break after recreating the container? Encryption key. See Step 2 — and if you did not set one explicitly, export your workflows now and fix it before the next recreate.

Are community nodes safe? Treat them like dependencies with database access, because that's what they are. Maintained, inspectable, adopted — or not installed.

Does this play with AI workflows? Yes — n8n chains LLM calls with retries and timeouts nicely, and it pairs well with Claude-driven development; for scheduled AI tasks that don't need a whole n8n flow, I compare the options in my look at Claude's routines-style automation.

The self-hosted automation stack this install anchors — n8n plus monitors, content pipelines, and client systems built on it — is the kind of thing I ship regularly; you can see several of those builds in my projects. Get the boring foundation from this guide running first, and everything you stack on it inherits the durability.

Advertisement
Coffee cup

Enjoyed this article?

Your support helps me create more in-depth technical content, open-source tools, and free resources for the developer community.

Related Topics

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.

Related Articles

Browse All

Comments

Leave a Comment

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 OpenAI

335+

Blog Posts

25

AI Courses

63

Projects

Services & Expertise

Pricing & Process

Learning & Resources

Connect & Support