All writing
June 22, 2026·6 min read

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.