n8n is a workflow automation tool: connect APIs, schedule jobs, and build integrations from a visual editor, on infrastructure you control.
Deploy it from the gallery and it comes up ready to use:
- A managed Postgres, created and connected for you. Workflows, credentials, execution history and the files your workflows handle all live there, so nothing is lost on a redeploy.
- An owner account nobody else can claim. A fresh n8n hands the owner account to whoever opens it first, which on a public URL is a race. This one creates the owner on its first boot, before it takes any traffic, and prints the sign-in details to the deploy log.
- An encryption key that survives. n8n encrypts every credential you store with a key it normally keeps on local disk, and container disks are wiped on every redeploy. This key is generated once and kept in the database, so your credentials stay readable.
- A persistent volume for n8n's own folder (paid plans), so files the Read/Write Files from Disk node writes are still there after a redeploy.
- The right public URL for webhooks, worked out from the app's address, so the webhook URLs n8n hands to third parties point back at it.
Open the app's Logs after the first deploy and look for the box that says n8n owner account created. It has the email and password to sign in with. They are only printed once, so change both under Settings > Personal once you are in.
Lost them? Set N8N_OWNER_EMAIL and N8N_OWNER_PASSWORD on the app's Environment tab and
redeploy: the owner is reset to those. While they are set, n8n manages the account from them and
will not let you change it in the UI, so remove them again once you have signed in.
A thin wrapper, not a fork. package.json depends on the n8n npm package, pinned to an exact
release, and start.js translates what velixir provides into what n8n reads:
| velixir provides | n8n gets |
|---|---|
PORT |
N8N_PORT, listening on 0.0.0.0 |
DATABASE_URL |
DB_TYPE=postgresdb and the DB_POSTGRESDB_* settings, with TLS |
VELIXIR_APP_SLUG |
WEBHOOK_URL, N8N_EDITOR_BASE_URL, N8N_HOST (override with PUBLIC_URL) |
VELIXIR_VOLUME_PATH |
N8N_USER_FOLDER on the volume, when the app has one |
| nothing | a persistent N8N_ENCRYPTION_KEY, binary data in Postgres, telemetry off, editor updates over server-sent events |
Anything you set yourself on the Environment tab wins, so every n8n environment variable still works as documented.
To upgrade n8n, change the version in package.json and deploy. Read n8n's release notes first:
major versions have breaking changes.
This template runs n8n 2. n8n 3 drops npm installs and runs only from n8n's Docker image, so
there is no n8n 3 package for this wrapper to install. Stay on the latest 2.x release, which gets
n8n's security fixes. If package.json ever installs 3.x, the app shows a page saying so instead
of starting, and the included renovate.json keeps Renovate on 2.x.
There is no package-lock.json on purpose. n8n's dependency tree has peer-dependency conflicts
that make npm ci reject a lockfile even when the same npm version wrote it, so the build runs
npm install against the exact n8n version pinned here instead. n8n pins most of its own
dependencies, so builds stay close to reproducible.
Add the domain to the app, then set PUBLIC_URL to https://your.domain and redeploy, so the
webhook URLs n8n generates use it.
It needs an always-on plan with at least 1 GB of memory. Scheduled workflows only run while the app is awake, and n8n is heavier than it looks. The create form will not offer smaller plans.
No email. Outbound SMTP is blocked on velixir, so n8n cannot send invitations or password resets by email, and the Send Email node will not connect. Use an email API node (Resend, Postmark, Brevo, SendGrid) in workflows instead.
Some nodes are off by default. n8n 2 disables the Execute Command and Local File Trigger nodes
unless you change NODES_EXCLUDE. The Read/Write Files from Disk node works and, with the template's
volume, what it writes under n8n's folder survives redeploys. Without a volume that disk is wiped on
every redeploy, so keep files in the database or an external bucket.
One replica. n8n's queue mode, for running executions across several workers, needs a Valkey and separate worker processes. This template runs n8n as a single process.
Live editor updates use server-sent events. n8n pushes execution progress to the editor over a
WebSocket by default; this template sets N8N_PUSH_BACKEND=sse, which is plain HTTP and works
through any proxy. Set it to websocket on the Environment tab if you'd rather use that.
npm install
DATABASE_URL=postgres://user:pass@localhost:5432/n8n PORT=5678 npm startNode 24 or newer, as n8n requires. Without DATABASE_URL you get the setup page rather than an
n8n that would lose everything on restart.
n8n is distributed under the Sustainable Use License (fair-code), not an OSI open-source licence. Running it for your own internal automation is permitted; offering it to others as a service is not. Read it before commercial use. This wrapper is MIT; the licence that matters is upstream's.
- Docs: https://docs.n8n.io
- Source: https://github.com/n8n-io/n8n