Installation Guide
This guide covers different installation methods for n8n, from local development to production deployments. Choose the method that best fits your infrastructure and requirements.
Requirements :
Node.js 22.16+ (for npm installation)
Docker 20.10+ (for Docker installation)
PostgreSQL 13+ (recommended for production)
Installation Methods
npm Best for local development and small deployments
Docker Recommended for production and containerized environments
Kubernetes Best for large-scale, highly available deployments
npm Installation
Global Installation
Install n8n globally using npm:
Configure (Optional)
Set environment variables for your setup: export N8N_BASIC_AUTH_ACTIVE = true
export N8N_BASIC_AUTH_USER = admin
export N8N_BASIC_AUTH_PASSWORD = secure_password
n8n
Quick Start (No Installation)
For trying n8n without installation:
Use npx for quick tests and demos. For production, use a proper installation method.
Running Specific Commands
The n8n CLI supports multiple commands:
Start (Default)
Worker Mode
Webhook Mode
Execute Workflow
# Start the main n8n instance
n8n start
# Or simply
n8n
The n8n binary is located at /packages/cli/bin/n8n in the source code. It checks your Node.js version and loads the configuration before starting.
Docker Installation
Basic Docker Setup
Create Data Volume
docker volume create n8n_data
Run n8n Container
docker run -d \
--name n8n \
-p 5678:5678 \
-v n8n_data:/home/node/.n8n \
docker.n8n.io/n8nio/n8n
Check Status
docker ps
docker logs n8n
Docker Compose Setup
For production deployments, use Docker Compose:
version : '3.8'
services :
postgres :
image : postgres:16
restart : unless-stopped
environment :
POSTGRES_USER : n8n
POSTGRES_PASSWORD : n8n_password
POSTGRES_DB : n8n
volumes :
- postgres_data:/var/lib/postgresql/data
healthcheck :
test : [ 'CMD-SHELL' , 'pg_isready -U n8n' ]
interval : 5s
timeout : 5s
retries : 10
n8n :
image : docker.n8n.io/n8nio/n8n
restart : unless-stopped
ports :
- '5678:5678'
environment :
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=n8n_password
- N8N_ENCRYPTION_KEY=your_encryption_key_here
- N8N_WEBHOOK_URL=https://your-domain.com/
- N8N_EDITOR_BASE_URL=https://your-domain.com/
- GENERIC_TIMEZONE=America/New_York
- N8N_LOG_LEVEL=info
volumes :
- n8n_data:/home/node/.n8n
depends_on :
postgres :
condition : service_healthy
volumes :
postgres_data :
n8n_data :
Deploy with:
Always set a strong N8N_ENCRYPTION_KEY in production. This key encrypts sensitive data like credentials. If lost, you cannot decrypt existing credentials.
Docker Compose with Queue Mode
For high-volume workflows, use queue mode with separate worker instances:
version : '3.8'
services :
redis :
image : redis:7
restart : unless-stopped
volumes :
- redis_data:/data
healthcheck :
test : [ 'CMD' , 'redis-cli' , 'ping' ]
interval : 5s
timeout : 5s
retries : 10
postgres :
image : postgres:16
restart : unless-stopped
environment :
POSTGRES_USER : n8n
POSTGRES_PASSWORD : n8n_password
POSTGRES_DB : n8n
volumes :
- postgres_data:/var/lib/postgresql/data
healthcheck :
test : [ 'CMD-SHELL' , 'pg_isready -U n8n' ]
interval : 5s
timeout : 5s
retries : 10
n8n-main :
image : docker.n8n.io/n8nio/n8n
restart : unless-stopped
ports :
- '5678:5678'
environment :
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=n8n_password
- QUEUE_BULL_REDIS_HOST=redis
- EXECUTIONS_MODE=queue
- N8N_ENCRYPTION_KEY=your_encryption_key_here
- N8N_WEBHOOK_URL=https://your-domain.com/
- N8N_EDITOR_BASE_URL=https://your-domain.com/
volumes :
- n8n_data:/home/node/.n8n
depends_on :
postgres :
condition : service_healthy
redis :
condition : service_healthy
n8n-worker :
image : docker.n8n.io/n8nio/n8n
restart : unless-stopped
command : worker
environment :
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=n8n_password
- QUEUE_BULL_REDIS_HOST=redis
- EXECUTIONS_MODE=queue
- N8N_ENCRYPTION_KEY=your_encryption_key_here
volumes :
- n8n_data:/home/node/.n8n
depends_on :
postgres :
condition : service_healthy
redis :
condition : service_healthy
deploy :
replicas : 2
volumes :
redis_data :
postgres_data :
n8n_data :
Queue mode requires Redis and separates the main instance (UI + triggers) from worker instances (workflow execution). This allows horizontal scaling of workers.
Configuration
Essential Environment Variables
n8n is highly configurable through environment variables:
Database Configuration
SQLite (Default)
PostgreSQL (Recommended)
# SQLite is used by default
DB_TYPE = sqlite
# Optional: Run VACUUM on startup
DB_SQLITE_VACUUM_ON_STARTUP = true
SQLite is not recommended for production use. Use PostgreSQL for better performance and reliability.
Security Configuration
# Encryption key for credentials (REQUIRED for production)
N8N_ENCRYPTION_KEY = your_very_long_random_encryption_key
# JWT secret for authentication
N8N_JWT_SECRET = your_jwt_secret
# Basic auth (if not using user management)
N8N_BASIC_AUTH_ACTIVE = true
N8N_BASIC_AUTH_USER = admin
N8N_BASIC_AUTH_PASSWORD = secure_password
Webhook & URL Configuration
# Public URL for webhooks
N8N_WEBHOOK_URL = https://your-domain.com/
# Editor/UI base URL
N8N_EDITOR_BASE_URL = https://your-domain.com/
# Path prefix (if behind reverse proxy)
N8N_PATH = /n8n/
Execution Configuration
# Execution mode: regular or queue
EXECUTIONS_MODE = regular
# Queue mode settings (if using queue)
QUEUE_BULL_REDIS_HOST = localhost
QUEUE_BULL_REDIS_PORT = 6379
QUEUE_BULL_REDIS_PASSWORD = redis_password
# Maximum concurrent executions
N8N_CONCURRENCY_PRODUCTION_LIMIT = 10
Logging & Monitoring
# Log level: error, warn, info, debug, verbose
N8N_LOG_LEVEL = info
# Log output: console, file
N8N_LOG_OUTPUT = console
# Timezone
GENERIC_TIMEZONE = America/New_York
For a complete list of configuration options, see the n8n documentation or check /packages/cli/src/config/ in the source code.
Configuration File
Alternatively, use a configuration file:
{
"database" : {
"type" : "postgresdb" ,
"postgresdb" : {
"host" : "localhost" ,
"port" : 5432 ,
"database" : "n8n" ,
"user" : "n8n" ,
"password" : "secure_password"
}
},
"credentials" : {
"overwrite" : {
"data" : "{}"
}
},
"executions" : {
"mode" : "regular" ,
"timeout" : 3600 ,
"maxTimeout" : 3600
},
"timezone" : "America/New_York"
}
Place this file in the ~/.n8n/config/ directory or set NODE_CONFIG_DIR environment variable.
Production Deployment
Reverse Proxy Setup (nginx)
For production, put n8n behind a reverse proxy:
server {
listen 443 ssl http2;
server_name your-domain.com;
ssl_certificate /etc/ssl/certs/your-domain.crt;
ssl_certificate_key /etc/ssl/private/your-domain.key;
location / {
proxy_pass http://localhost:5678;
proxy_http_version 1.1 ;
proxy_set_header Upgrade $ http_upgrade ;
proxy_set_header Connection 'upgrade' ;
proxy_set_header Host $ host ;
proxy_cache_bypass $ http_upgrade ;
# Required for webhooks
proxy_set_header X-Real-IP $ remote_addr ;
proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for ;
proxy_set_header X-Forwarded-Proto $ scheme ;
# Increase timeouts for long-running workflows
proxy_connect_timeout 3600 ;
proxy_send_timeout 3600 ;
proxy_read_timeout 3600 ;
send_timeout 3600 ;
}
}
Systemd Service
Create a systemd service for n8n:
/etc/systemd/system/n8n.service
[Unit]
Description =n8n - Workflow Automation Tool
After =network.target
[Service]
Type =simple
User =n8n
WorkingDirectory =/home/n8n
Environment = "NODE_ENV=production"
Environment = "N8N_ENCRYPTION_KEY=your_encryption_key"
Environment = "DB_TYPE=postgresdb"
Environment = "DB_POSTGRESDB_HOST=localhost"
Environment = "DB_POSTGRESDB_DATABASE=n8n"
Environment = "DB_POSTGRESDB_USER=n8n"
Environment = "DB_POSTGRESDB_PASSWORD=secure_password"
Environment = "N8N_WEBHOOK_URL=https://your-domain.com/"
Environment = "N8N_EDITOR_BASE_URL=https://your-domain.com/"
ExecStart =/usr/local/bin/n8n start
Restart =always
RestartSec =10
[Install]
WantedBy =multi-user.target
Enable and start:
sudo systemctl enable n8n
sudo systemctl start n8n
sudo systemctl status n8n
Building from Source
For development or custom builds:
Clone Repository
git clone https://github.com/n8n-io/n8n.git
cd n8n
Install Dependencies
# Requires pnpm 10.22.0+
npm install -g pnpm
pnpm install
Build All Packages
pnpm build > build.log 2>&1
Build output is redirected to avoid overwhelming the console. Check build.log for any errors.
Start Development
# Start all services in dev mode
pnpm dev
# Or start only backend
pnpm dev:be
# Or start only frontend
pnpm dev:fe
n8n uses a monorepo structure with pnpm workspaces. Always use pnpm instead of npm or yarn.
Advanced Configuration
Multi-Main Setup (High Availability)
For enterprise deployments, enable multi-main mode:
# Enable multi-main setup (requires Enterprise license)
EXECUTIONS_MODE = queue
N8N_MULTI_MAIN_SETUP_ENABLED = true
QUEUE_BULL_REDIS_HOST = redis_host
Multi-main setup requires:
Queue mode (Redis)
Enterprise license
PostgreSQL database
Multiple n8n main instances
External Secrets
Load sensitive values from external sources:
# Use environment variables for secrets
export N8N_ENCRYPTION_KEY = $( cat /run/secrets/encryption_key )
export DB_POSTGRESDB_PASSWORD = $( cat /run/secrets/db_password )
Custom Node Loading
Load custom nodes from a directory:
N8N_CUSTOM_EXTENSIONS = /path/to/custom/nodes
Upgrading n8n
npm Upgrade
npm install n8n@latest -g
Docker Upgrade
# Pull latest image
docker pull docker.n8n.io/n8nio/n8n:latest
# Restart container
docker-compose down
docker-compose up -d
Always backup your database before upgrading. n8n runs database migrations automatically on startup.
Backup & Recovery
Backup Database
# Backup
pg_dump -U n8n n8n > n8n_backup_ $( date +%Y%m%d ) .sql
# Restore
psql -U n8n n8n < n8n_backup_20260219.sql
Backup n8n Data Directory
tar -czf n8n_data_backup_ $( date +%Y%m%d ) .tar.gz ~/.n8n/
Monitoring & Health Checks
Health Check Endpoint
n8n exposes a health check endpoint:
curl http://localhost:5678/healthz
Metrics (Prometheus)
Enable Prometheus metrics:
N8N_METRICS = true
N8N_METRICS_PORT = 9090
Metrics are available at:
http://localhost:9090/metrics
Troubleshooting
Database Connection Issues
Check Database
# PostgreSQL
psql -U n8n -h localhost -d n8n
# Check connection
\conninfo
Verify Configuration
Check environment variables are set correctly: echo $DB_TYPE
echo $DB_POSTGRESDB_HOST
Check Logs
# Docker
docker logs n8n
# Systemd
journalctl -u n8n -f
Use PostgreSQL instead of SQLite
Enable queue mode for high-volume workflows
Increase worker instances
Configure execution timeouts appropriately
Enable database connection pooling
Permission Errors
# Fix n8n data directory permissions
sudo chown -R $USER : $USER ~/.n8n/
chmod 700 ~/.n8n/
Getting Help
Community Forum Get installation support from the community
Documentation Detailed configuration documentation
GitHub Issues Report installation bugs
Enterprise Support Contact for enterprise installation support