Self-Hosting n8n on Oracle Cloud: The Full Setup
A complete walkthrough of running n8n on Oracle Free Tier — Docker Compose, DuckDNS domain, Redis deduplication, and why this beats every SaaS automation tool I've tried.
- n8n
- Docker
- Oracle Cloud
- Automation
I've used Zapier, Make, and Pipedream. They're all fine until you hit the limits — workflow count, execution history, monthly operation caps — and then they become expensive fast. n8n self-hosted on Oracle Cloud Free Tier is genuinely free, runs 24/7, and gives you full control over your data and workflows.
Here's the complete setup I run for my financial transaction pipeline, which has been running without incident for five months.
Why Oracle Cloud Free Tier
Oracle's Always Free tier is legitimately generous: 2 AMD compute instances with 1GB RAM each, or 4 ARM-based Ampere A1 cores with 24GB RAM total. The ARM option is overkill for n8n but I use a 2-core / 4GB ARM instance and it handles everything comfortably with headroom.
The catch: Oracle Cloud's UI is confusing and the network security rules are non-obvious. I'll cover those.
The Docker Compose setup
``
services:
n8n:
image: n8nio/n8n:latest
restart: always
ports:
- "5678:5678"
environment:
- N8N_HOST=your-domain.duckdns.org
- N8N_PORT=5678
- N8N_PROTOCOL=https
- WEBHOOK_URL=https://your-domain.duckdns.org/
- N8N_ENCRYPTION_KEY=YOUR_KEY
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=YOUR_PASSWORD
`
Use PostgreSQL, not SQLite. SQLite locks under concurrent writes and n8n will start throwing errors after a few hundred workflow executions. Postgres runs indefinitely without issues.
DuckDNS for a persistent domain
Oracle Cloud gives you a public IP, but it can change if you stop/start the instance. DuckDNS provides free dynamic DNS — you get a yourname.duckdns.org subdomain that you keep updated via a cron job.
`
/etc/cron.d/duckdns
/5 * root curl -s "https://www.duckdns.org/update?domains=yourname&token=YOUR_TOKEN&ip=" > /dev/null
``
Nginx + Let's Encrypt
n8n needs HTTPS for webhooks. I run Nginx as a reverse proxy with Certbot for SSL. The Oracle Cloud security list needs port 443 open — go to Networking → Virtual Cloud Networks → your VCN → Security Lists and add an ingress rule for TCP port 443 from 0.0.0.0/0.
Redis for deduplication
My financial transaction workflow fires when Gmail receives a bank email. Banks resend emails, and Gmail webhooks occasionally fire twice for the same message. Without deduplication, I get duplicate rows in Google Sheets.
The deduplication pattern in n8n uses a Function node that checks Redis before writing. A Redis node sets a key with a 48-hour TTL. If the key exists, the Function node returns an empty array, stopping the workflow branch.
Five months in
The setup has processed 847 transactions without a duplicate or missed entry. Total cost: $0. If you're paying for any automation SaaS for personal use, just move to self-hosted n8n. The initial setup takes an afternoon and you won't look back.