title: Docker | n8n Docs
source: https://docs.n8n.io/hosting/installation/docker/#starting-n8n
author:
- "[[Configure custom SSL certificate authorities]]"
published:
created: 2025-08-27
description: Documentation for n8n, a workflow automation platform.
tags:
- LLM
- Ollama
n8n recommends using Docker for most self-hosting needs. It provides a clean, isolated environment, avoids operating system and tooling incompatibilities, and makes database and environment management simpler.
You can also use n8n in Docker with Docker Compose. You can find Docker Compose configurations for various architectures in the n8n-hosting repository.
Self-hosting knowledge prerequisites
Self-hosting n8n requires technical knowledge, including:
n8n recommends self-hosting for expert users. Mistakes can lead to data loss, security issues, and downtime. If you aren't experienced at managing servers, n8n recommends n8n Cloud.
Before proceeding, install Docker:
Latest and Next versions
n8n releases a new minor version most weeks. The latest
version is for production use. next
is the most recent release. You should treat next
as a beta: it may be unstable. To report issues, use the forum.
Current latest
: 1.108.2
Current next
: 1.109.0
From your terminal, run the following commands, replacing the <YOUR_TIMEZONE>
placeholders with your timezone:
1
2
3
4
5
6
7
8
9
10
11
docker volume create n8n_data
docker run -it --rm \
--name n8n \
-p 5678:5678 \
-e GENERIC_TIMEZONE="<YOUR_TIMEZONE>" \
-e TZ="<YOUR_TIMEZONE>" \
-e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true \
-e N8N_RUNNERS_ENABLED=true \
-v n8n_data:/home/node/.n8n \
docker.n8n.io/n8nio/n8n
This command creates a volume to store persistent data, downloads the required n8n image, and starts the container with the following settings:
5678
on the host.TZ
environment variable sets the system timezone to control what scripts and commands like date
return.GENERIC_TIMEZONE
environment variable sets the correct timezone for schedule-oriented nodes like the Schedule Trigger node.n8n_data
volume to the /home/node/.n8n
directory to persist your data across container restarts.Once running, you can access n8n by opening:http://localhost:5678
By default, n8n uses SQLite to save credentials, past executions, and workflows. n8n also supports PostgreSQL, configurable using environment variables as detailed below.
Persisting the .n8n
directory still recommended
When using PostgreSQL, n8n doesn't need to use the .n8n
directory for the SQLite database file. However, the directory still contains other important data like encryption keys, instance logs, and source control feature assets. While you can work around some of these requirements, (for example, by setting the N8N_ENCRYPTION_KEY
environment variable), it's best to continue mapping a persistent volume for the directory to avoid potential issues.
To use n8n with PostgreSQL, execute the following commands, replacing the placeholders (depicted within angled brackets, for example <POSTGRES_USER>
) with your actual values:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
docker volume create n8n_data
docker run -it --rm \
--name n8n \
-p 5678:5678 \
-e GENERIC_TIMEZONE="<YOUR_TIMEZONE>" \
-e TZ="<YOUR_TIMEZONE>" \
-e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true \
-e N8N_RUNNERS_ENABLED=true \
-e DB_TYPE=postgresdb \
-e DB_POSTGRESDB_DATABASE=<POSTGRES_DATABASE> \
-e DB_POSTGRESDB_HOST=<POSTGRES_HOST> \
-e DB_POSTGRESDB_PORT=<POSTGRES_PORT> \
-e DB_POSTGRESDB_USER=<POSTGRES_USER> \
-e DB_POSTGRESDB_SCHEMA=<POSTGRES_SCHEMA> \
-e DB_POSTGRESDB_PASSWORD=<POSTGRES_PASSWORD> \
-v n8n_data:/home/node/.n8n \
docker.n8n.io/n8nio/n8n
You can find a complete docker-compose
file for PostgreSQL in the n8n hosting repository.
To update n8n, in Docker Desktop, navigate to the Images tab and select Pull from the context menu to download the latest n8n image:
You can also use the command line to pull the latest, or a specific version:
1
2
3
4
5
6
7
8
# Pull latest (stable) version
docker pull docker.n8n.io/n8nio/n8n
# Pull specific version
docker pull docker.n8n.io/n8nio/n8n:1.81.0
# Pull next (unstable) version
docker pull docker.n8n.io/n8nio/n8n:next
After pulling the updated image, stop your n8n container and start it again. You can also use the command line. Replace <container_id>
in the commands below with the container ID you find in the first command:
1
2
3
4
5
6
7
8
9
10
11
# Find your container ID
docker ps -a
# Stop the container with the \`<container_id>\`
docker stop <container_id>
# Remove the container with the \`<container_id>\`
docker rm <container_id>
# Start the container
docker run --name=<container_name> [options] -d docker.n8n.io/n8nio/n8n
If you run n8n using a Docker Compose file, follow these steps to update n8n:
Danger
Use this for local development and testing. It isn't safe to use it in production.
To use webhooks for trigger nodes of external services like GitHub, n8n has to be reachable from the web. n8n runs a tunnel service that can redirect requests from n8n's servers to your local n8n instance.
Start n8n with --tunnel
by running:
1
2
3
4
5
6
7
8
9
10
11
12
docker volume create n8n_data
docker run -it --rm \
--name n8n \
-p 5678:5678 \
-e GENERIC_TIMEZONE="<YOUR_TIMEZONE>" \
-e TZ="<YOUR_TIMEZONE>" \
-e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true \
-e N8N_RUNNERS_ENABLED=true \
-v n8n_data:/home/node/.n8n \
docker.n8n.io/n8nio/n8n \
start --tunnel