Render
Docker deploy with managed Postgres.
Render runs n8n as a Web Service from the official Docker image, paired with a Render managed Postgres and a persistent disk for /home/node/.n8n.
Pros
- Simple Docker deploys
- Managed Postgres
- Auto TLS + custom domains
Cons
- No community node install without custom image
- Cold starts on free tier
Prerequisites
- A Render account
- A payment method (free tier sleeps and isn't suitable for webhooks)
- Optional custom domain
Step-by-step guide
Step 1
Create a new Web Service
Choose 'Deploy an existing image' and enter n8nio/n8n as the image.
Step 2
Add a persistent disk
Mount a disk at /home/node/.n8n so config/binary data survive redeploys.
Step 3
Add Render Postgres
Create a managed Postgres instance and copy its connection details into DB_* env vars.
Step 4
Set env vars & deploy
Set N8N_HOST to your onrender.com URL or custom domain, WEBHOOK_URL, N8N_ENCRYPTION_KEY; Render provides free TLS.
Scaling & queue mode
Scale the Render service vertically (larger instance type) or run a second service as an `n8n worker` in queue mode connected to a shared Redis (Render Key Value) and Postgres instance.
Backup & upgrade
Render Postgres includes automated daily backups on paid plans; upgrade n8n by bumping the image tag in the service settings and triggering a manual deploy.
Security checklist
- Always run behind HTTPS (Caddy/Traefik/Nginx + Let's Encrypt) — never expose port 5678 directly.
- Set a strong, permanent N8N_ENCRYPTION_KEY and back it up (losing it breaks stored credentials).
- Use Postgres, not the default SQLite, for anything beyond local testing.
- Enable N8N_BASIC_AUTH or an SSO/proxy layer if the instance is reachable from the internet.
- Restrict inbound firewall rules to 80/443 (and SSH from your IP only).
- Keep the n8n image pinned and update on a schedule instead of always using :latest in production.
Cost breakdown
- Starter Web Service$7/mo
- Managed Postgresfrom $6/mo
Troubleshooting & FAQ
+Can I use SQLite instead of Postgres?
n8n defaults to SQLite, which works for testing but isn't recommended for production: no concurrent writers, harder backups, and risk of corruption under load. Use Postgres for anything real.
+My webhooks return 404 / don't trigger — why?
WEBHOOK_URL must match the public HTTPS URL exactly (including trailing slash), and the workflow must be activated (not just saved) for production webhook URLs to work.
+How do I move from Render to another host later?
Export workflows/credentials with the n8n CLI (`n8n export:workflow --all` / `export:credentials --all`) or the REST API, restore the Postgres dump on the new host, then import.
+Do I lose data if the container restarts?
No, as long as n8n_data and the Postgres volume are mounted as named Docker volumes (not ephemeral container storage), your data persists across restarts and image updates.