How to Run or Deploy n8n Using Docker

Introduction

In today’s fast-moving world, automation helps businesses and individuals save time and reduce human error. One open-source tool that has gained significant popularity for workflow automation is n8n. Pronounced “n-eight-n,” this platform empowers you to connect different services and applications, automate repetitive tasks, and build complex workflows with ease.

But deploying n8n so it runs reliably and securely can sometimes be tricky—especially if you want to use it on different machines or in production. This is where Docker comes in. Docker is a technology that allows you to package your applications and all their dependencies into containers. Containers run the same way no matter where they are deployed, making your software portable, easy to manage, and isolated from other software on your system.

Using Docker to run n8n is a smart choice for developers, automation engineers, system administrators, and tech-savvy users who want a straightforward and scalable setup. In this guide, we will walk through everything from prerequisites to advanced production tips, helping you understand how to use Docker for running n8n efficiently.

Prerequisites

Before you start running n8n with Docker, there are a few things you’ll need to have in place.

Docker and Docker Compose

First, make sure Docker is installed on your system. Docker is the core platform for running containers. It is available on Windows, macOS, and Linux. Additionally, Docker Compose is a tool that lets you define and manage multi-container Docker applications through a simple YAML file.

Docker Compose is optional if you want to just test out n8n quickly but is strongly recommended for production or more complex setups.

After installation, verify by opening your terminal or command prompt and typing:

Bash
docker --version
docker-compose --version

You should see version numbers confirming the installations.

Basic Command-Line Knowledge

Docker is managed primarily through the command line, so you should be comfortable running commands in your terminal or PowerShell. Tasks such as starting containers, viewing logs, and managing files will require command-line interaction.

Optional: Domain Name and Reverse Proxy

If you want to deploy n8n for use on the internet—say, for your team or customers—you should have a registered domain name and set up a reverse proxy server such as Nginx or Traefik. These tools help secure your n8n instance with HTTPS encryption and manage traffic more effectively.

Understanding the n8n Docker Image

What is the n8n Docker Image?

A Docker image is like a snapshot of a software environment that you can run in a container. The n8n team maintains an official Docker image called n8nio/n8n. This image bundles the n8n software, its dependencies, and a pre-configured Node.js environment.

By using the official image, you avoid manual installation and configuration headaches, and you get a consistent, tested environment that works across different systems.

Environment Variables

Docker images can be configured by setting environment variables—special key-value pairs that change how the software runs inside the container. For n8n, several environment variables allow you to customize behavior without changing the image itself.

Here are some important environment variables and what they do:

VariablePurpose
N8N_BASIC_AUTH_USERSets the username for HTTP basic authentication (adds security)
N8N_BASIC_AUTH_PASSWORDSets the password for basic authentication
N8N_HOSTDefines the hostname your n8n instance will respond to (e.g., n8n.example.com)
N8N_PORTSpecifies the port on which n8n will listen (default is 5678)
N8N_PROTOCOLChoose between http or https depending on your setup
N8N_EDITOR_BASE_URLThe base URL used for editor-generated links (useful when behind proxies)
GENERIC_TIMEZONESet your preferred timezone for workflows and logs (e.g., America/New_York)

Configuring these variables correctly is key to running n8n securely and properly.

Persistent Storage with Volumes

By default, Docker containers are ephemeral—when you delete a container, all data inside it disappears. This is problematic for applications like n8n that save workflows, credentials, and execution history.

To keep data safe, you need persistent storage through Docker volumes or bind mounts. Volumes link a folder on your host machine to a folder inside the container where n8n stores its data.

Example volume mount:

Bash
-v ~/.n8n:/home/node/.n8n

This command mounts the .n8n folder from your home directory on your computer into the container at /home/node/.n8n.

Quick Start with Docker

Now, let’s get n8n running with a simple Docker command.

Basic Docker Run Command

Open your terminal and run:

Bash
docker run -it --rm \
  -p 5678:5678 \
  -v ~/.n8n:/home/node/.n8n \
  n8nio/n8n
  

What Does This Command Do?

  • docker run: Creates and runs a new container.
  • it: Runs interactively, so you can see the logs live in your terminal.
  • -rm: Automatically removes the container when stopped (useful for testing, not recommended for production).
  • p 5678:5678: Maps port 5678 inside the container to port 5678 on your local machine, letting you access the n8n UI via your browser.
  • v ~/.n8n:/home/node/.n8n: Mounts your local .n8n directory to the container, preserving workflow data.
  • n8nio/n8n: The official Docker image for n8n.

Access the Editor

Open your browser and visit:

Plaintext
http://localhost:5678

You should see the n8n editor interface, where you can start creating workflows immediately.

Stop n8n

If you used the --rm flag, simply press Ctrl+C in the terminal to stop and remove the container.

For anything beyond simple testing, Docker Compose offers a more manageable and repeatable approach to running n8n. Compose allows you to describe your containers, volumes, networks, and environment variables in a YAML file.

Sample docker-compose.yml File

Create a new file called docker-compose.yml with the following content:

YAML
version: "3"

services:
  n8n:
    image: n8nio/n8n
    ports:
      - "5678:5678"
    environment:
      - N8N_BASIC_AUTH_USER=admin
      - N8N_BASIC_AUTH_PASSWORD=securepassword
      - N8N_HOST=n8n.example.com
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
    volumes:
      - ~/.n8n:/home/node/.n8n
    restart: always
    

Explanation:

  • version: “3” — Specifies the Compose file format version.
  • services: — Defines the services (containers) in your application. Here, only one service called n8n.
  • image: — Specifies which Docker image to use (n8nio/n8n).
  • ports: — Maps container port 5678 to the host’s 5678 port.
  • environment: — Passes environment variables to the container, including authentication credentials and host info.
  • volumes: — Binds the local .n8n folder to the container, preserving data.
  • restart: — Ensures the container restarts automatically if it crashes or the server reboots.

Starting n8n with Docker Compose

Run the following command in the directory where your docker-compose.yml is located:

Bash
docker-compose up -d

The -d flag runs the container in the background, allowing you to continue using your terminal.

Checking the Container Status

To verify the container is running:

Bash
docker ps

You should see a container running with the n8nio/n8n image.

To view logs for troubleshooting:

Bash
docker-compose logs -f

Access Your Instance

Open your browser and visit:

Plaintext
https://n8n.example.com:5678

or if testing locally:

Plaintext
http://localhost:5678

Use the username and password you set in N8N_BASIC_AUTH_USER and N8N_BASIC_AUTH_PASSWORD.

Production Tips

Running n8n in production requires additional setup beyond just launching containers.

Use a Reverse Proxy

A reverse proxy acts as an intermediary between users and your n8n container. Popular choices include Nginx and Traefik.

Why use a reverse proxy?

  • Enables HTTPS encryption using certificates (Let’s Encrypt can automate this).
  • Routes traffic to multiple containers or services on the same server.
  • Improves security by hiding the internal ports and adding authentication layers.
  • Adds load balancing and rate limiting capabilities.

Setting Up HTTPS

Never expose n8n over plain HTTP on a public server. HTTPS encrypts traffic, protecting your workflows, credentials, and data from interception.

Let’s Encrypt provides free SSL/TLS certificates that can be automatically renewed using tools like Certbot or Traefik’s built-in certificate management.

Running as a Background Service

While docker-compose up -d runs the container in the background, consider integrating Docker with your server’s init system (like systemd) for better management and automatic start on boot.

Example systemd service file:

INI
[Unit]
Description=n8n Docker container
After=docker.service
Requires=docker.service

[Service]
Restart=always
ExecStart=/usr/local/bin/docker-compose -f /path/to/docker-compose.yml up
ExecStop=/usr/local/bin/docker-compose -f /path/to/docker-compose.yml down

[Install]
WantedBy=multi-user.target

Backup Strategies

Backing up your data is critical. Since workflow and credential data are stored in the volume mapped to your host (~/.n8n), regular backups of this directory are essential.

You can use simple cron jobs with rsync or cloud backup services to secure your data.

Logging and Monitoring

Set up logging solutions to monitor container health, errors, and usage patterns. Tools like the ELK stack (Elasticsearch, Logstash, Kibana) or cloud-based log aggregators can help analyze logs.

Monitoring solutions like Prometheus with Grafana dashboards provide insight into container resource usage and performance.

Updating n8n

Keeping your automation platform up to date is important for security, new features, and bug fixes.

How to Update Your Docker Image

  1. Pull the latest image from Docker Hub:
Bash
docker pull n8nio/n8n
  1. Stop your current containers:
Bash
docker-compose down
  1. Relaunch with the new image:
Bash
docker-compose up -d

Your workflow data will remain intact because it’s stored outside the container on your host machine.

Troubleshooting

Common Issues

Port Conflicts

If port 5678 is already in use, Docker won’t be able to bind to it. Change the port mapping in your docker run or docker-compose.yml file, for example:

YAML
ports:
  - "5680:5678"
  

Then access n8n at http://localhost:5680.

Permissions on Bind Mounts

If n8n can’t write to the mounted volume (e.g., no workflow saves), check your folder permissions. Ensure your user has read/write access to the .n8n directory.

On Linux, you can fix permissions with:

Bash
sudo chown -R $USER:$USER ~/.n8n
chmod -R 700 ~/.n8n

Environment Variables Not Taking Effect

Ensure you set environment variables correctly in your docker run or docker-compose.yml. Small typos or missing variables can cause unexpected behavior.

After changing environment variables, always restart the container.

Checking Logs

Logs provide valuable clues. To view logs from your running container, use:

Bash
docker logs <container_id>

or with Docker Compose:

Bash
docker-compose logs -f

Look for error messages related to authentication, database issues, or network errors.

Conclusion

Deploying n8n using Docker combines the power of a modern automation platform with the flexibility and consistency of containerization technology. Whether you are running n8n on your local machine for development or deploying it in production for your team, Docker simplifies the process with portable, isolated, and easy-to-manage containers.

To recap:

  • You learned how to quickly spin up n8n with a single Docker command.
  • You discovered how Docker Compose enables scalable, repeatable production deployments.
  • You explored best practices for securing, backing up, and monitoring your n8n instance.
  • You understood the steps for updating and troubleshooting your Dockerized n8n setup.

The journey doesn’t end here. With n8n and Docker, the possibilities for automating your workflows are vast. Connect APIs, handle events, and orchestrate tasks seamlessly.