Docker image
n8n in Docker. Workflow automation, pinned.
n8n is an open-source workflow automation tool with a visual, node-based editor and more than 400 integrations. You build automations by connecting triggers and actions on a canvas, and n8n runs them on a schedule, on demand, or in response to incoming webhooks.
Prefer not to run it yourself? Managed n8n from $6.67/mo
# n8n in Docker, base pinned by digest docker pull ghcr.io/remarkablecloud/n8n:2.38.6-r1 docker compose up -d
- Current build
2.38.6-r1, updated Sep 10, 2026- Base
- n8n official, digest-pinned
- What's inside
- Proxy-correct webhook URLs, persistent data, encryption-key discipline
- Upstream license
- n8n: Sustainable Use License (source-available)
The image
What our image adds.
What changes from upstream n8n, and why it matters in production.
Digest-pinned base
The build pins the exact upstream layer by digest, so a given tag always resolves to the same bytes and is easy to audit.
OCI provenance labels
Title, description, vendor, and source labels travel with the image for supply-chain traceability.
Built-in healthcheck
A container HEALTHCHECK polls n8n's /healthz endpoint, so an orchestrator only sends traffic to a ready instance.
Writable data directory
The build ensures /home/node/.n8n exists and is owned by node, so a mounted persistent volume is writable out of the box. Upstream n8n's features are unchanged. The version is pinned to n8n 2.38.6 in the 2.38.6-r1 tag.
Run it yourself, or not
Same image either way.
Pull it and run it anywhere, or let us run n8n for you on a managed server with updates, monitoring and snapshots.
Run n8n yourself
- Pull it from GHCR and run it on any Docker host
- The guide below: compose, environment, backups, upgrades
- You patch, back up and watch it
n8n on a managed server
- Installed for you from this same image, $0 for the app
- Updates with a snapshot first, monitoring and a managed firewall
- A 2 GB server from $6.67/mo billed annually, with room for more apps
The guide
Run it in production.
Compose file, environment reference, hardening, backups and upgrades, written by the people who build the image.
On this page
docker-compose walkthrough
The image ships a standalone docker-compose.yml:
name: n8n
services:
n8n:
image: ${N8N_IMAGE:-ghcr.io/remarkablecloud/n8n:2.38.6-r1}
restart: unless-stopped
ports: ["${HTTP_PORT:-5678}:5678"]
environment:
N8N_PORT: "5678"
GENERIC_TIMEZONE: ${TZ:-UTC}
N8N_SECURE_COOKIE: ${N8N_SECURE_COOKIE:-false}
volumes:
- n8n-data:/home/node/.n8n
volumes:
n8n-data:
Line by line:
- image pins the RemarkableCloud n8n tag, overridable with the
N8N_IMAGEvariable. - restart: unless-stopped brings n8n back after a crash or host reboot.
- ports publishes container port 5678 on the host (default 5678). This is for standalone runs only. Behind Traefik on the App Platform, no port is published; the proxy routes to the container on the internal network.
- environment sets the listen port, timezone, and cookie policy (see the reference below).
- volumes mounts the named
n8n-datavolume at/home/node/.n8n, which holds the SQLite database and the credential encryption key.
Start it with docker compose up -d, then open http://localhost:5678 and create the owner account on first visit.
Environment variable reference
The App Platform wires these automatically from the app hostname; the standalone column shows the defaults baked into docker-compose.yml. Behind Traefik, TLS terminates at the proxy and the container speaks plain HTTP.
| Variable | App Platform value | Standalone default | Notes |
|---|---|---|---|
N8N_PORT | 5678 | 5678 | Port n8n listens on inside the container. |
N8N_PROTOCOL | https | not set | Tells n8n it is served over HTTPS (TLS terminates at Traefik). |
N8N_HOST | your hostname | not set | Public hostname n8n serves; the platform fills this from the app hostname. |
N8N_EDITOR_BASE_URL | https://your-hostname/ | not set | Base URL of the editor. Note the trailing slash. |
WEBHOOK_URL | https://your-hostname/ | not set | Public base for generated webhook URLs. It must match the real domain or inbound webhooks break. Note the trailing slash. |
N8N_PROXY_HOPS | 1 | not set | Number of trusted proxy hops in front of n8n (Traefik is one), so client IP and cookie handling are correct. |
N8N_SECURE_COOKIE | true | false | Marks the session cookie secure. On over HTTPS in production; off for plain-HTTP local runs. |
GENERIC_TIMEZONE | UTC | UTC | Timezone used by schedule and cron nodes. |
TZ | not applicable | UTC | Standalone compose variable that feeds GENERIC_TIMEZONE. |
HTTP_PORT | not applicable | 5678 | Host port published in standalone compose only (not published behind Traefik). |
N8N_IMAGE | not applicable | ghcr.io/remarkablecloud/n8n:2.38.6-r1 | Image reference override for standalone compose. |
Hardening notes
- Non-root by default. The container runs as the
nodeuser, not root. - TLS at the proxy. In production the container serves plain HTTP and Traefik terminates TLS. Keep the container off any public port and let the proxy reach it on the internal network.
- Secure cookies on. Set
N8N_SECURE_COOKIE=truewhenever n8n is served over HTTPS so session cookies are not sent over plain HTTP. - Trust exactly one proxy.
N8N_PROXY_HOPS=1matches a single Traefik hop. Raise it only if you add another trusted proxy in front. - Protect the instance. Create the owner account immediately on first visit so the editor is not left open. Store secrets in n8n credentials rather than hard-coding them in nodes.
- Healthcheck gating. The
/healthzhealthcheck keeps a not-ready container out of rotation.
Backup and upgrade
Backup. All state lives in the n8n-data volume at /home/node/.n8n: the SQLite database (workflows, executions, settings) and the credential encryption key. Back up the whole volume on a schedule. The encryption key is critical: if you lose it, every stored credential becomes unreadable even if you still have the database. For a consistent copy, snapshot the volume or stop the container briefly before copying.
Upgrade. Pull the newer RemarkableCloud tag (for example a later -rN or a new upstream version), then recreate the container. The named volume persists across the upgrade, so workflows and credentials carry over. Read the CHANGELOG for the target tag before upgrading, and back up the volume first. Because n8n uses SQLite here, an upgrade is a container swap with no separate database migration step to run.
Changelog
Each build is pinned by digest and recorded here, so you can see what changed before you pull a new tag.
-
2.38.6-r1Current Sep 10, 2026 Initial RemarkableCloud build of n8n 2.38.6.
n8n and other product names are trademarks of their respective owners. RemarkableCloud is not affiliated with or endorsed by them.
FAQ
n8n in Docker, answered.
Short answers from the people who build and run this image.
Does this image need an external database?
No. It uses SQLite stored in the data volume. There is no separate database container to run.
Can I run this behind Traefik or another reverse proxy?
Yes. Terminate TLS at the proxy, forward to container port 5678, set N8N_PROTOCOL=https, N8N_HOST, WEBHOOK_URL, and N8N_EDITOR_BASE_URL to your public URL, and set N8N_PROXY_HOPS to the number of proxies in front.
My webhooks return the wrong URL.?
Set WEBHOOK_URL (and N8N_EDITOR_BASE_URL) to your real public HTTPS URL. n8n builds webhook URLs from those values.
Why is the container marked unhealthy at first?
The healthcheck has a start period to let n8n initialize. It reports healthy once /healthz responds.
Where is my data stored?
In the n8n-data volume mounted at /home/node/.n8n, including the SQLite database and the encryption key.
Pull it, or let us run it.
The same image runs n8n on our managed servers, updates and monitoring included.