Build Your Own PaaS with Coolify on Oracle Cloud (Always Free)
🏴☠️ Prologue — Before Setting Sail
“We didn’t build this ship to win a naval war. We built it to learn how to navigate.” — Guybrush Threepwood (probably)
If you’ve ever tried to deploy an application to the cloud, you’ve probably gone through at least one of these services:
- Render
- Railway
- Fly.io
- DigitalOcean
- Hetzner
- AWS
- Azure
They all work great… until the first bill arrives.
Oracle Cloud has a rather interesting quirk: their Always Free program offers resources that, if used wisely, are enough to set up a surprisingly powerful personal lab.
In this tutorial we’ll use the Ampere A1 ARM instance, which for development and self-hosting typically offers excellent performance-to-power consumption ratio. Many modern projects (Docker, PostgreSQL, Redis, Nginx, Traefik, Python, Node.js, Go, Java, etc.) run perfectly on ARM and make excellent use of these resources.
For cases where Docker images still only exist for x86, we’ll add a small AMD machine as a secondary worker. That way we get the best of both worlds.
The idea isn’t just to install Coolify.
The idea is to understand how Oracle organizes its infrastructure:
- Compartments.
- Virtual Networks.
- Firewall rules.
- Instances.
- Storage.
- SSH keys.
- Security.
- ARM and x86 architectures.
Once you understand those pieces, deploying any other service becomes much easier.
☠️ Security Notice (very important)
This article is designed as a learning lab.
The goal is to have a deployment up and running in minutes to learn the platform and understand how all the components interact.
For that reason, we’ll temporarily expose some services to the Internet, such as:
- Port 22 (SSH).
- Port 8000 (Coolify initial admin panel).
This does not represent a recommended production configuration.
From a cybersecurity perspective, any unnecessarily exposed service increases your attack surface. In other words…
We’re leaving the ship’s door open while we learn where the cannons are.
In a real-world environment, it would be advisable, among other measures, to:
- Limit SSH access to known IP addresses.
- Disable password access and use SSH keys only.
- Close port 8000 after Coolify’s initial setup is complete.
- Publish only HTTP/HTTPS behind Traefik.
- Apply the principle of least privilege, exposing only strictly necessary services.
- Keep the operating system updated.
- Implement monitoring, backups, and audit logs.
- Consider using security lists, Network Security Groups (NSG), VPN, or a bastion host for administrative access.
Throughout the blog we’ll be hardening this installation step by step.
This is not the ship’s final destination.
It’s just the first port where we’ll learn to navigate.
🍌 Guybrush Philosophy
In this series we don’t look for perfect infrastructure from day one.
We look to understand what each piece does.
First we make the ship float.
Then we learn to navigate.
And only at the end… we worry about the pirates.
🏴☠️ Mission: Build Your Own PaaS with Coolify on Oracle Cloud (Always Free)
“While others pay 20 bucks a month for a VPS… we plunder Oracle’s cloud using Always Free. Welcome to Monkey Island.”
After battling Oracle Cloud several times, I found a configuration that turned out really solid for running Coolify without spending a single doubloon.
The idea is to maximize the Always Free Tier, using the powerful Ampere ARM machine as the main server and, if any project needs x86 architecture, add a small AMD VM as a worker.
By the end of this tutorial you’ll have your own PaaS, with automatic HTTPS, deployments from Git, and enough space to host several personal projects.
⚓ Resource Distribution
Region
📍 Chile Central (Santiago) — sa-santiago-1
Main Server
| Resource | Value | Architecture |
|---|---|---|
| ARM Ampere A1 | — | — |
| CPU | 2 OCPU | ARM |
| RAM | 12 GB | ARM |
| Disk | 100 GB | ARM |
This is where Coolify will live.
Optional Worker
| Resource | Value | Architecture |
|---|---|---|
| AMD x86 | — | — |
| CPU | 1/8 OCPU | x86 |
| RAM | 1 GB | x86 |
| Disk | 50 GB | x86 |
Ideal for containers that still don’t have ARM images.
Remaining Space
There are still approximately 50 GB free out of the 200 GB Oracle gives away.
Not bad for free.
🏝️ Step 1 — Create the Compartment
Log into Oracle Cloud and verify that the Home Region is:
Chile (Santiago)
Then go to:
Identity & Security
└── Compartments
Create a new one.
Name:
prod-coolify-compartment
Parent:
Root Tenancy
This compartment will let us keep the entire lab organized.
🌐 Step 2 — Create the Network
Go to:
Networking
└── Virtual Cloud Networks
Select your compartment.
Choose:
Start VCN Wizard
Then:
VCN with Internet Connectivity
Name:
coolify-vcn
When the wizard finishes, go to:
Security Lists
and open the Default Security List.
Open the Ports
Add these Ingress rules.
| Port | Use |
|---|---|
| 22 | SSH |
| 80 | HTTP + Let’s Encrypt |
| 443 | HTTPS |
| 8000 | Coolify initial admin panel |
Important
Oracle has a small detail that catches many people.
In the rules:
DO NOT fill in “Source Port Range”.
It must remain completely empty.
The port goes only in:
Destination Port Range
💻 Step 3 — Create the ARM VM
Go to:
Compute
└── Instances
└── Create Instance
Name:
coolify-master-arm
Compartment:
prod-coolify-compartment
Choose Ubuntu
Go to:
Change Image
Select:
Canonical Ubuntu
And explicitly choose an LTS version.
Recommended:
- Ubuntu 24.04 LTS
- Ubuntu 22.04 LTS
Architecture:
aarch64
Choose the Right Machine
Go to:
Change Shape
Select:
VM.Standard.A1.Flex
Oracle hides a little secret here.
You have to expand the advanced configuration panel (the almost invisible arrow).
There you manually configure:
2 OCPU
12 GB RAM
Make sure it still shows:
Always Free Eligible
Add Multiple SSH Keys
Choose:
Paste Public Keys
Paste them one below the other.
Example:
MacBook
Ubuntu Desktop
Notebook
As long as they’re public keys (*.pub) Oracle will accept them all.
Expand the Disk
In the Boot Volume section expand the advanced options.
Check:
Specify custom boot volume size
and enter:
100 GB
If we don’t do this Oracle creates a much smaller disk and resizing it later is much more annoying.
Finally:
Create
🔥 Step 4 — The Hidden Ubuntu Firewall
This was the bug that cost me the most time.
Even though we open the ports in Oracle…
…Ubuntu can still block them.
Connect via SSH.
ssh ubuntu@PUBLIC_IP
Execute:
sudo iptables -I INPUT 6 -m state --state NEW -p tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT 6 -m state --state NEW -p tcp --dport 443 -j ACCEPT
sudo iptables -I INPUT 6 -m state --state NEW -p tcp --dport 8000 -j ACCEPT
Then save the rules.
sudo netfilter-persistent save
Captain’s Note: on some modern Ubuntu images you may need to install
iptables-persistentfirst (sudo apt install -y iptables-persistent netfilter-persistent) if the save command doesn’t exist.
⚙️ Step 5 — Install Coolify
Connected via SSH, simply run:
curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash
Grab a coffee.
The installer does practically everything.
When it finishes, open:
http://PUBLIC_IP:8000
Create your admin user…
…and done.
Now you have your own Heroku, Render or Railway.
And free.
🖥️ Step 6 — Add an AMD Worker (Optional)
If you need to run Docker images that only exist for x86, create another VM.
Configuration:
VM.Standard.E2.1.Micro
Ubuntu 24.04
50 GB
Open the same ports using the procedure above.
Then from Coolify:
Servers
+ Add Server
Enter the public IP.
Coolify generates an SSH key.
Copy that key into:
~/.ssh/authorized_keys
on the AMD server.
Finally press:
Validate & Install
In a few minutes Coolify automatically installs Docker and leaves the node ready to receive deployments.
🏴☠️ Conclusion
With this architecture we get:
- ✅ An ARM server with 2 OCPU and 12 GB RAM.
- ✅ An x86 worker for ARM-incompatible projects.
- ✅ Automatic HTTPS via Traefik and Let’s Encrypt.
- ✅ Deployments from GitHub.
- ✅ Docker managed from a web interface.
- ✅ All within Oracle Cloud’s Always Free plan.
Not bad for an infrastructure that costs exactly 0 doubloons per month.
In the next episode we’ll see how to connect your own domain, configure DNS, and have Coolify publishing applications as if we had a small hidden datacenter on Monkey Island.