n8n-impl-deployment — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited n8n-impl-deployment (Agent Skill) and scored it 45/100 (orange). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 1 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
A base64 string of 128+ characters appears in a documentation file. Encoded prompt injection hides the hostile instruction in base64 — invisible to keyword filters — and relies on the agent's ability to decode it at runtime. There is no normal authoring reason to embed a multi-hundred-byte base64 blob in skill docs.
*.sig, SIGNATURES) outside the documentation.Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
| Aspect | Value |
|---|---|
| Docker image | docker.n8n.io/n8nio/n8n |
| Default port | 5678 |
| Data volume | /home/node/.n8n |
| Files volume | /files |
| Default DB | SQLite (use PostgreSQL for production) |
| Queue broker | Redis (BullMQ) |
| Config method | Environment variables (primary) |
| Service | Port |
|---|---|
| n8n | 5678 |
| Redis | 6379 |
| PostgreSQL | 5432 |
| Task Runner Broker | 5679 |
Need queue mode or multi-instance?
YES -> ALWAYS use PostgreSQL (DB_TYPE=postgresdb)
NO -> Single user / dev environment?
YES -> SQLite is acceptable (default)
NO -> ALWAYS use PostgreSQL for productionExpected workflow volume?
Low (< 50 active workflows, single user)
-> Single Docker container, regular mode
Medium (50-200 workflows, team use)
-> Docker Compose with PostgreSQL, regular mode
High (200+ workflows, high webhook traffic)
-> Queue mode: main + workers + Redis + PostgreSQL
Very High (enterprise, HA required)
-> Multi-main + workers + Redis + PostgreSQL + load balancerDatabase type?
SQLite -> Volume backup (stop container, tar archive)
PostgreSQL -> pg_dump (ALWAYS preferred for production)
ALWAYS also export workflows/credentials via CLI
ALWAYS back up N8N_ENCRYPTION_KEY separatelyN8N_ENCRYPTION_KEY explicitly in production and back it up. Losing this key means ALL stored credentials become unrecoverable.N8N_ENCRYPTION_KEY across ALL instances (main, workers, webhook processors).NODE_ENV=production for production deployments.N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true in Docker.N8N_RUNNERS_ENABLED=true for task runner support.WEBHOOK_URL when behind a reverse proxy.N8N_ENCRYPTION_KEY in version control.--decrypted flag in production environments.docker volume create n8n_data
docker run -it --rm \
--name n8n \
-p 5678:5678 \
-e GENERIC_TIMEZONE="Europe/Amsterdam" \
-e TZ="Europe/Amsterdam" \
-e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true \
-e N8N_RUNNERS_ENABLED=true \
-v n8n_data:/home/node/.n8n \
docker.n8n.io/n8nio/n8ndocker run -it --rm \
--name n8n \
-p 5678:5678 \
-e DB_TYPE=postgresdb \
-e DB_POSTGRESDB_DATABASE=n8n \
-e DB_POSTGRESDB_HOST=postgres-host \
-e DB_POSTGRESDB_PORT=5432 \
-e DB_POSTGRESDB_USER=postgres \
-e DB_POSTGRESDB_PASSWORD=secret \
-e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true \
-e N8N_RUNNERS_ENABLED=true \
-v n8n_data:/home/node/.n8n \
docker.n8n.io/n8nio/n8n| Volume | Mount Point | Purpose |
|---|---|---|
n8n_data | /home/node/.n8n | SQLite DB, encryption key, settings |
traefik_data | /letsencrypt | TLS/SSL certificates (Let's Encrypt) |
./local-files | /files | Host directory for workflow file access |
-e VAR=value or environment: in Composedocker-compose.ymlDB_POSTGRESDB_PASSWORD_FILE=/run/secrets/db_passworddocker pull docker.n8n.io/n8nio/n8n # Latest
docker pull docker.n8n.io/n8nio/n8n:1.81.0 # Specific version
docker stop <container_id> && docker rm <container_id>
docker run --name n8n [options] -d docker.n8n.io/n8nio/n8nQueue mode separates n8n into distinct scaling components:
+------------------+
| Load Balancer |
+--------+---------+
|
+--------------+--------------+
| |
+--------v--------+ +--------v--------+
| Main Instance | | Webhook Processor|
| (triggers, | | (optional, for |
| scheduling) | | high traffic) |
+--------+--------+ +--------+---------+
| |
+-------------+---------------+
|
+-------v-------+
| Redis |
| (BullMQ) |
+-------+-------+
|
+-------------+-------------+
| | |
+--------v--+ +------v----+ +-----v-----+
| Worker 1 | | Worker 2 | | Worker N |
+--------+---+ +------+----+ +-----+-----+
| | |
+-------------+-------------+
|
+-------v-------+
| PostgreSQL |
+---------------+N8N_ENCRYPTION_KEY on ALL instances# Native
n8n worker
n8n worker --concurrency=5
# Docker
docker run --name n8n-worker \
-e EXECUTIONS_MODE=queue \
-e QUEUE_BULL_REDIS_HOST=redis-host \
-e N8N_ENCRYPTION_KEY=<shared-key> \
-e DB_TYPE=postgresdb \
-e DB_POSTGRESDB_HOST=postgres-host \
-e DB_POSTGRESDB_DATABASE=n8n \
-e DB_POSTGRESDB_PASSWORD=secret \
docker.n8n.io/n8nio/n8n worker# Separate webhook handler for high-traffic setups
docker run --name n8n-webhook -p 5679:5678 \
-e EXECUTIONS_MODE=queue \
-e QUEUE_BULL_REDIS_HOST=redis-host \
-e N8N_ENCRYPTION_KEY=<shared-key> \
docker.n8n.io/n8nio/n8n webhookn8n execute --id <ID> # Execute workflow
n8n update:workflow --id=<ID> --active=true # Activate
n8n update:workflow --id=<ID> --active=false # Deactivate
n8n update:workflow --all --active=false # Deactivate alln8n export:workflow --all --output=backups/ # All workflows
n8n export:workflow --id=<ID> --output=workflow.json # Single workflow
n8n export:workflow --backup --output=backups/latest/ # Backup format
n8n export:credentials --backup --output=backups/creds/ # All credentials
n8n export:credentials --all --decrypted --output=dec.json # DANGER: decryptedn8n import:workflow --input=file.json # From file
n8n import:workflow --separate --input=backups/latest/ # From directory
n8n import:credentials --input=file.json # Credentialsn8n audit # Security audit
n8n license:info # License details
n8n user-management:reset # Reset user mgmt
n8n mfa:disable [email protected] # Disable MFAn8n export:workflow --backup --output=/backups/workflows/
n8n export:credentials --backup --output=/backups/credentials/pg_dump -U postgres n8n > /backups/n8n-$(date +%Y%m%d).sql
# With Docker:
docker exec postgres pg_dump -U postgres n8n > /backups/n8n-$(date +%Y%m%d).sqldocker stop n8n
docker run --rm -v n8n_data:/data -v $(pwd)/backup:/backup \
alpine tar czf /backup/n8n-data.tar.gz /data
docker start n8nN8N_ENCRYPTION_KEY to restore)N8N_ENCRYPTION_KEY itself (store securely, separate from backups)N8N_ENCRYPTION_KEY explicitly set and backed up securelyNODE_ENV=productionN8N_PROTOCOL=https with TLS termination (Traefik/nginx/Caddy)WEBHOOK_URL set to public-facing URLN8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=trueN8N_RUNNERS_ENABLED=trueEXECUTIONS_DATA_PRUNE=true)~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.