Agent skill · Audited from source

n8n-self-hosting

skill · czlonkowski/n8n-skillsMIT licenceAudited 28 Oct 2026 · source e25b729cc88a

★ 6,540pushed 4 days ago
!CAUTIONGrade B · 89/100 · 6 findings · e25b729
6,540repo stars · whole czlonkowski/n8n-skills

Is it safe? With care — CAUTION, grade B (89/100). We read this skill's source at commit e25b729cc88a and found no filesystem, network or shell access and no hard-coded secrets. The audit raised 6 findings, 0 critical or high. What it does: Deploy a production self-hosted n8n end-to-end to a fresh Linux VM over SSH, using Docker Compose behind a Caddy reverse proxy with automatic HTTPS. Use whenever the user wants to self-host, install, provision, or…

Ask an AI about this pageGChatGPTCClaudePPerplexityGeGeminiXGrok
More
Cite

Cite this page

ModelsAtlas. “n8n-self-hosting (czlonkowski/n8n-skills)”. Retrieved 28 Oct 2026. https://modelsatlas.com/skills/czlonkowski/n8n-self-hosting

Trust audit

Audit 0.4.1 · source read 28 Oct 2026

Trust score89/100!CAUTION B
0 critical0 high1 medium3 low2 info

CAUTION means the audit found things worth knowing before you trust this skill. Grade B is shared by 13,985 of 14,816 audited skills.

What the source does

  • FilesystemNone observedNo reads or writes in the source
  • NetworkNone observedNo outbound calls in the source
  • ShellNone observedNo commands run in the source
  • DependenciesPinnedNothing floats
  • SecretsNone foundNo keys in source

Five audit layers

LayerWhat we checkResultFindings
L0 ProvenanceRepo owner, licence, archive status, activityPASS2
L1 Static sourceSecrets, path traversal, supply chain, hidden codePASS0
L2 InstructionsPrompt injection, authority framing, hidden directivesWARN4
L3 InventoryThe files and declarations match the sourcePASS0
L4 SandboxRun in isolation and watch behaviourSKIPPED why0

Gates applied: no behavioural pass.

Findings (6)

MEDIUMPrompt injectionreview.data_transfer · SKILL.md
F-01 Prompt injectionCWE-94 · CWE-1427Layer L2
Don't echo it into long-lived logs or chat history beyond what's needed to hand it over.
Why
It directs the agent to disclose the server's encryption secret through chat, moving it off the target machine.
Fix
rewrite it so the instruction says plainly what it does, and asks the user before it acts
LOWInventory / provenanceinv.hidden_file · assets/.env.queue.example
F-13 Inventory / provenanceCWE-1104Layer L0
.env.queue.example
Why
hidden member outside the usual dotfiles
Fix
review its purpose
LOWInventory / provenanceinv.hidden_file · assets/.env.single.example
F-13 Inventory / provenanceCWE-1104Layer L0
.env.single.example
Why
hidden member outside the usual dotfiles
Fix
review its purpose
LOWPrompt injectionprompt.transfer_instruction · SECURITY.md:78
F-01 Prompt injectionCWE-94 · CWE-1427Layer L2
| Owner account + 2FA | hand-off | Whoever completes the owner-setup form first claims the instance — do it before sharing the URL. Enable 2FA (per-user 2FA is free; org-wide *enforcement* via `N8N_MF
Why
an instruction to move sensitive data to an outside destination
Fix
remove; a skill never needs the user's secrets off the machine
INFOPrompt injectionprompt.credential_read · CREDENTIAL_OVERWRITES.md:152
F-01 Prompt injectionCWE-94 · CWE-1427Layer L2
history. Read it from `.env` or a file, or type it into a heredoc.
Why
asks the agent to read credentials
Fix
—
INFOPrompt injectionprompt.credential_read · SECURITY.md:67
F-01 Prompt injectionCWE-94 · CWE-1427Layer L2
| `N8N_BLOCK_ENV_ACCESS_IN_NODE=true` | ✓ | Code-node/expressions can't read `process.env` (your container secrets). Relax only if a workflow genuinely needs an env var. |
Why
asks the agent to read credentials
Fix
—

Audit 0.4.1 · source sha e25b729cc88a · 28 Oct 2026Report an issue or request a re-scan

Provenance

Who published it, and what the verdict is pinned to

  • Publisherczlonkowski GitHub userOwner of the repository this skill is read from
  • Source folderczlonkowski/n8n-skills/skills/n8n-self-hostingThe exact folder we audited
  • LicenceMITAs the repository states it
  • Commit pinned for this verdicte25b729cc88aA new audit runs when the source changes
  • Repository statusNot archivedLast push 4 days ago
  • Sandboxed runNot runSkills are read, not executed; layer L4 is skipped

What it tells the agent

Full source on GitHub ↗

Its description: Deploy a production self-hosted n8n end-to-end to a fresh Linux VM over SSH, using Docker Compose behind a Caddy reverse proxy with automatic HTTPS. Use whenever the user wants to self-host, install, provision, or…

---
name: n8n-self-hosting
description: Deploy a production self-hosted n8n end-to-end to a fresh Linux VM over SSH, using Docker Compose behind a Caddy reverse proxy with automatic HTTPS. Use whenever the user wants to self-host, install, provision, or deploy n8n on their own server/VPS (Hetzner, DigitalOcean, AWS EC2, bare metal) — single/regular mode or queue mode with workers — or to update, back up, restore, or harden such an instance, or make Python Code nodes run on it (task runners). For SELF-HOSTED n8n (Docker), not n8n Cloud and not building workflows. The skill makes the agent ask single-vs-queue first, collect domain/SSH/timezone inputs, generate fresh secrets on the box, and bring the stack up with TLS. Trigger on "deploy n8n", "self-host n8n", "n8n docker compose", "n8n queue mode / workers", "n8n reverse proxy / SSL", "back up / update my n8n", "Python runner unavailable" / "n8nio/runners sidecar", or "we don't want to give every user the OAuth client secret" / "enable Sign in with Google" (credential overwrites).
---

# Deploying self-hosted n8n

This skill takes a **fresh Linux VM** (Ubuntu/Debian, root or sudo SSH) to a **running,
HTTPS, production n8n** via Docker Compose behind **Caddy** (automatic Let's Encrypt TLS).
It is for **self-hosted n8n on Docker** — not n8n Cloud, and not for building workflows
(that's the rest of this pack).

Two deployment modes. The architectures differ, so **pick the mode before doing anything**.

You drive this end-to-end over SSH: preflight → install Docker → lay down the project →
generate secrets → launch → verify TLS → hand off. The template files live in `assets/`;
the per-mode and security depth live in the reference files named below.

## Rule 0 — choose the mode (ask the user)

Do not guess. Ask, then commit to one:

| | **Single / regular** | **Queue** |
|---|---|---|
| Processes | one n8n | main + N workers |
| Extra services | none (SQLite) | Redis (queue) + Postgres (DB) |
| Executes workflows | in the main process | on workers, in parallel |
| Good for | 1 user, light/moderate load, simplest ops | high volume, heavy/long executions, horizontal scale |
| Compose | `assets/docker-compose.single.yml` | `assets/docker-compose.queue.yml` |
| Deep dive | **`SINGLE_MODE.md`** | **`QUEUE_MODE.md`** |

If unsure, start **single** — it's the simplest correct thing and covers most needs. Moving
to queue later means swapping the compose file and migrating SQLite→Postgres, so if the user
already expects real volume, start **queue**.

## Rule 1 — secret hygiene (non-negotiable)

A misstep here leaks client credentials. Be diligent:

1. **Generate every secret fresh, on the target box.** Never copy an encryption key, DB
   password, or `.env` from another n8n instance into this one. See `SECURITY.md` for the
   `openssl` commands.
2. **Secrets live only in `.env`** (mode 600), referenced by the compose as `${VAR}`. Never
   inline a secret into `docker-compose.yml`, the Caddyfile, or anything you commit.
3. **The `N8N_ENCRYPTION_KEY` is sacred.** It encrypts every stored credential. If it's lost
   or changes, all saved credentials become undecryptable. Set it explicitly, and tell the
   user to back it up **off the box**. Don't echo it into long-lived logs or chat history
   beyond what's needed to hand it over.
4. **Never expose internal services.** Only Caddy (80/443) is public. n8n (5678), Postgres
   (5432), Redis (6379) stay on the private Docker network — the templates already omit their
   host port mappings. Don't add them.
5. **`.env` and Caddy's `caddy_data` volume (the issued certs + ACME account key) are not
   artifacts to share.** If you're working inside a git repo, confirm `.env` is git-ignored
   before any commit.

## Inputs to collect up front

- **SSH target** — `user@host` and how you authenticate (key path or the user confirms the agent already has access). Root or a sudo user.
- **Domain** — the full hostname n8n will live at, e.g. `n8n.example.com` (→ `SUBDOMAIN=n8n`, `DOMAIN_NAME=example.com`). The user must control its DNS.
- **TLS email** — for Let's Encrypt (`SSL_EMAIL`).
- **Timezone** — IANA name for Schedule/Cron nodes (e.g. `Europe/Warsaw`), else `Etc/UTC`.
- **Mode** — single or queue (Rule 0). Queue → confirm the box has enough RAM (rough floor ~4 GB; each worker wants ~1–2 GB).
- **Optional modules** — some features (currently **Agents**) are backend modules that stay off
  unless listed in `N8N_ENABLED_MODULES`. Ask only if the user brings one up; if they do, read
  the modules section of `QUEUE_MODE.md` before enabling it, because in queue mode it has to
  reach the workers as well.
- **Python Code nodes / who edits workflows** — ask *"Will workflows use Python Code nodes, or
  will anyone besides you edit workflows?"* A yes to either means task runners in **external
  mode**: a `n8nio/runners` sidecar (one per worker in queue mode). The stock `n8nio/n8n` image has
  no Python 3, so in the default internal mode every Python Code node fails with `Python runner
  unavailable: Python 3 is missing from this system`. Read `TASK_RUNNERS.md` before step 3.

## The deploy flow

Work through these in order. `SINGLE_MODE.md` / `QUEUE_MODE.md` give the mode-specific command
detail; `SECURITY.md` covers secret generation and hardening; `DAY2.md` covers update/backup/restore.

### 1. Preflight (the cheapest failure is the one you catch here)
- SSH in; confirm the OS is Debian/Ubuntu-like (`. /etc/os-release`).
- **DNS must already point at the box.** Compare the box's public IP (`curl -s ifconfig.me`)
  with `dig +short <fqdn>` (run it from the box AND ideally your laptop). If they don't match,
  **stop** — Caddy's ACME challenge will fail. Have the user create the A record, wait for it
  to propagate, then continue.
- Ports **80 and 443** must be reachable from the internet. Check the host firewall AND any
  cloud security group / network firewall (Hetzner Cloud, AWS SG, etc.) — these are outside
  the box and a 

Excerpt, first 6,000 characters of SKILL.md, verbatim from the audited commit. It is text from someone else’s repository, quoted so you can judge it before your agent reads it.

Install

Pinned to the audited commit e25b729

Download folder ↗
git clone https://github.com/czlonkowski/n8n-skills
git -C n8n-skills checkout e25b729cc88a

The author documents no install command, so this uses the repository directly. Our verdict covers commit e25b729cc88a only.

Works in

The author has not said which agents this skill supports, and we have not tested it in any.

Audit history

Every audit, every source change

  1. !CAUTION B 89 / 100

    first audit · source e25b729cc88a

README badge

For maintainers · shows the latest audit

ModelsAtlas: CAUTION BMODELSATLASCAUTION · B
[![ModelsAtlas: CAUTION B](https://modelsatlas.com/skills/czlonkowski/n8n-self-hosting/badge.svg)](https://modelsatlas.com/skills/czlonkowski/n8n-self-hosting/)

The badge shows our verdict and grade for this skill, and links back to this page. It changes when the audit does.

n8n-subworkflows✓SAFE

czlonkowski/n8n-skills

Build reusable, composable n8n sub-workflows. Use when extracting shared logic, building anything multi-step or reused across workflows, or any workflow over ~10 nodes — and whenever the user mentions sub-workflows,…

★ 6.5kGrade B
n8n-validation-expert✓SAFE

czlonkowski/n8n-skills

Interpret validation errors and guide fixing them. Use when encountering validation errors, validation warnings, false positives, operator structure issues, or need help understanding validation results. Also use when…

★ 6.5kGrade B
n8n-node-configuration✓SAFE

czlonkowski/n8n-skills

Operation-aware node configuration guidance. Use when configuring nodes, understanding property dependencies, determining required fields, choosing between get_node detail levels, or learning common configuration…

★ 6.5kGrade B
n8n-multi-instance✓SAFE

czlonkowski/n8n-skills

Use when an n8n-mcp account targets more than one n8n instance — i.e. the `n8n_instances` tool is available, the user mentions multiple n8n instances or environments (prod vs staging, several teams or clients), several…

★ 6.5kGrade B
n8n-mcp-tools-expert✓SAFE

czlonkowski/n8n-skills

Expert guide for using n8n-mcp MCP tools effectively. Use when searching for nodes, validating configurations, accessing templates, managing workflows, organizing workflows into folders, managing credentials, auditing…

★ 6.5kGrade B
n8n-expression-syntax!CAUTION

czlonkowski/n8n-skills

Validate n8n expression syntax and fix common errors. Use when writing n8n expressions, using {{}} syntax, accessing $json/$node variables, troubleshooting expression errors, mapping data between nodes, or referencing…

★ 6.5kGrade B

Add this badge to your README

[![ModelsAtlas: CAUTION B](https://modelsatlas.com/skills/czlonkowski/n8n-self-hosting/badge.svg)](https://modelsatlas.com/skills/czlonkowski/n8n-self-hosting/)

Questions about n8n-self-hosting

What does the n8n-self-hosting skill do?
n8n skillset for Claude Code to build flawless n8n workflows
Is n8n-self-hosting safe to install?
With care. The audit graded it B (89/100) and found 6 things worth knowing before you trust this skill, listed below with the exact line each was found on.
What can n8n-self-hosting access on my machine?
The audit observed no filesystem, network or shell use at all in its source.
How current is this page?
The grade is for one exact copy of the source (e25b729cc88a), read on 2026-10-28. The repository is watched, and a new audit runs when it changes — this is the first audit.

Sources

Spotted something wrong? Report a correction · Methodology

Keep going in your AI

Opens with this page as the source. We add nothing else to the prompt.