How to Set Up a Powerful, Free Forever Server on Oracle Cloud (Caddy Edition)

Earlier in 2025, I signed up for Oracle’s “Free Forever” cloud offer. It was, and still is, one of the most generous free tiers available, especially for developers and hobbyists. I wrote a post to document my setup, and today I’m updating it with a more modern, simpler stack and more tips for anyone starting out.

The goal remains the same: to combine all the “Always Free” resources into a single, powerful virtual private server (VPS) that you can use for your projects without ever paying a dime. This guide is my personal reference for setting it up again, and I hope it helps you too.

What You Actually Get: The “Always Free” Powerhouse

First, let’s be clear about how generous this offer is. When you consolidate the main resources for a single server, this is what you get, for free, forever:

Component / Purpose“Always Free” AllocationHow It Benefits Your Server
Server CPU & RAM4 ARM OCPUs & 24 GB RAMThis is the core of your machine. It’s powerful enough to run multiple apps, a game server, or a complex web service.
Primary Storage200 GB Block StorageYour server’s “hard drive.” Plenty of space for the OS, software, and your project files.
Web ServerCaddy (Self-Installed)A modern, simple web server with automatic HTTPS from Let’s Encrypt. No more manual SSL setup!
Database2 Autonomous DatabasesYou get two dedicated, fully-managed Oracle databases. Offloading your database work to these frees up your server’s CPU and RAM.
Networking1 Load Balancer & 10 TB/month Data TransferA stable public entry point for your services and a massive amount of free bandwidth.

Let’s build it.

Step 1: Sign Up and Create the Instance

  • Sign Up for the Offer: Go to the Oracle Cloud Free Tier page and sign up. You will need a credit card for verification, but you won’t be charged as long as you only use “Always Free” eligible resources.
  • Select Your Home Region: Choose your region carefully. All your “Always Free” resources must be in this single region.
  • Create a VM Instance: From the OCI console dashboard, click “Create a VM instance”
  • Configure the Instance:
    • Name: Give your server a name, like vps-main.
    • Placement: Leave as is.
    • Image and Shape: This is the most important part.
    • Click “Edit“.Click “Change Image” and select Ubuntu (the latest LTS version is a great choice).Click “Change Shape“. Select “Ampere” under “Shape series” and choose the VM.Standard.A1.Flex shape.Drag the OCPU slider to 4 and the Memory slider to 24. This uses up your entire free ARM allocation for maximum power.Click “Select shape“.
  • Create! Click “Create” at the bottom. It will take a minute or two to provision. Once it’s “Running” (green), note down its Public IP Address.

Step 2: Connect to Your Server via SSH

You’ll use an SSH client to connect. If you’re on Windows, you can use PowerShell or WSL. On macOS or Linux, use your terminal.

  • Move the private key you downloaded (ssh-key-….key) to a secure location, like ~/.ssh/.
  • Set the correct permissions for the key. This is a mandatory security step.
# Replace the path with the actual path to your key
chmod 400 /path/to/your/private-key.key
  • Connect to the server using the ubuntu user and your server’s public IP.Generated bash
# Replace the IP and key path
ssh -i /path/to/your/private-key.key [email protected]

Type yes when prompted to trust the host. You are now logged into your new server!

Step 3: Essential Server Security (The Two Firewalls)

Before installing anything, we need to open up ports for web traffic. In OCI, there are two firewalls you need to configure:

  1. The Cloud Firewall (OCI Security List): This is at the network level.
  2. The Server Firewall (UFW): This runs on your Ubuntu server itself.

3.1 Configure the OCI Security List

  • In your OCI Console, navigate to your instance’s details page.
  • Click on the link to your Virtual Cloud Network (VCN).
  • On the left, click “Security Lists” and then click the default security list.
  • Click “Add Ingress Rules”.
  • Add a rule to allow all HTTP/HTTPS traffic. This is crucial for Caddy to work.
    • Source CIDR: 0.0.0.0/0 (This means “from any IP address”)
    • IP Protocol: TCP
    • Destination Port Range: 80,443
    • Description: Allow web traffic
  • Click “Add Ingress Rules” to save.

3.2 Configure the Server Firewall (UFW)

Now, on the server itself (in your SSH session), we’ll configure ufw (Uncomplicated Firewall).

# Update your server's package list
sudo apt update && sudo apt upgrade -y

# Allow SSH connections (so you don't lock yourself out!)
sudo ufw allow ssh

# Allow HTTP and HTTPS traffic
sudo ufw allow http
sudo ufw allow https

# Enable the firewall
sudo ufw enable

Press y to proceed. Your server is now secured, but allows web traffic through both firewalls.

Step 4: Install Caddy Web Server (with Automatic HTTPS)

This is where we replace NGINX and Certbot with a much simpler solution. Caddy is a modern web server that automatically provisions and renews free SSL certificates from Let’s Encrypt.

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

Configure Caddy: Caddy is configured with a simple file called Caddyfile. Let’s create a basic configuration that serves a test message.

  • Open the Caddyfile with a text editor:
sudo nano /etc/caddy/Caddyfile
  • Delete all the default content and replace it with this:
your-domain.com {
    respond "Hello from my new Oracle server!"
}
  • Important: Replace your-domain.com with the actual domain name you will point to this server.
  • Save the file and exit (Ctrl+X, then Y, then Enter).
  • Reload Caddy: To apply the new configuration, run:
sudo systemctl reload caddy

Step 5: Configure Your DNS

Now, point your domain name to the server’s IP address.

  1. Go to your domain registrar (Namecheap, GoDaddy, Cloudflare, etc.).
  2. Find the DNS management section for your domain.
  3. Create an “A” record:
    • Host/Name: @ (for the root domain your-domain.com) or www (for www.your-domain.com).
    • Value/Points to: Your server’s Public IP Address.
    • TTL (Time to Live): Set to the lowest possible value or leave it as default.
  4. Save the record. DNS changes can take anywhere from a few minutes to a few hours to propagate.

Step 6: Final Verification

Once your DNS has updated, open a web browser and navigate to https://your-domain.com.

You should see your message: “Hello from my new Oracle server!” and, more importantly, a padlock icon in the address bar. Caddy has automatically handled the entire HTTPS process for you!

What’s Next? Ideas for Your New Server

You now have a powerful, secure, and free ARM server. Because this is an ARM-based machine (like a Raspberry Pi on steroids), you’ll want to use software that is compatible. Here are some great ideas:

  • Host a Website or Web App: Caddy can easily run a static site (file_server) or act as a reverse proxy for applications written in Node.js, Python, Go, or PHP. All of these have excellent ARM support.
  • Run Docker: Install Docker (sudo apt install docker.io) and manage multiple applications in containers. Just remember to use Docker images built for the linux/arm64 architecture. Many official images on Docker Hub are multi-arch and will work seamlessly.
  • Host a Minecraft Server: The standard Java version of the Minecraft server runs perfectly on ARM. Just install a Java runtime (sudo apt install default-jre) and you’re good to go.
  • Media Server: Set up Plex or Jellyfin. Both have official, native builds for ARM64 that work great.
  • Connect to the Autonomous Database: Install your application stack on the server and use the free Oracle database as your backend for amazing performance, freeing up your server’s resources.

Crucial Final Tip: Oracle may reclaim “idle” Always Free instances. An instance is idle if it has very low CPU, memory, or network usage for 7 days. The easiest way to prevent this is to run a small, persistent process or a cron job that performs a simple task regularly. Running a web server that gets occasional traffic is usually sufficient.

Enjoy your free forever server

Share