DEV Community

Cover image for Host up to 10 WordPress sites for free with Oracle Cloud and xCloud
Dhrupo Nil
Dhrupo Nil

Posted on

Host up to 10 WordPress sites for free with Oracle Cloud and xCloud

I wanted a place to run a handful of WordPress sites (test sites, demos, a personal page) without paying for hosting every month. The combination that worked: a free Oracle Cloud server, managed through xCloud's free plan, so I never had to install the web server, PHP or SSL by hand.

This is the full walkthrough, including the parts that tripped me up: Oracle's "Out of capacity" error, a card hold that looked like a charge, and a firewall rule that silently did nothing.

Run WordPress sites on a free Oracle Cloud server, managed through xCloud's free plan.

  • Oracle Cloud Always Free gives you the server (the land).
  • xCloud free Self-Managed plan installs and manages the web server, PHP, database and SSL (the builder).
  • Only cost: a domain name (about $10–13/year), and only if you want your own address.

How it fits together

The cover image above shows the whole setup: a visitor's browser finds your server through DNS, passes Oracle's two firewalls, and reaches the Ubuntu server that xCloud manages.

The build, in short:

  1. Create a free Oracle account and a network that allows web traffic (Parts 1–2).
  2. Create one Ubuntu 24.04 server on that network (Part 3).
  3. Log in, open the web ports inside the server, and add swap if it's the 1 GB one (Part 4).
  4. Give xCloud root access with its key; xCloud installs the web server, PHP and database (Part 5).
  5. Point a domain at the server (Part 6), then add sites from the xCloud dashboard (Part 7).

Running up to 10 sites

xCloud's free plan allows 1 server with up to 10 sites. All of them live on the same Oracle server and share its CPU and memory.

  • One domain is enough. Each site gets a free subdomain: example.dev, blog.example.dev, shop.example.dev, lab.example.dev, …
  • One DNS record covers all subdomains. A wildcard A record (* → server IP) points every subdomain at the server, so a new site needs no DNS change.
  • Each site is added the same way in xCloud (Part 7) and gets its own SSL certificate, database and WordPress install.
  • Testing without a domain: use xCloud's Demo Site option for a free temporary address, and switch to a real domain later.

How many sites the server can really carry:

Server Realistic number of sites
ARM 2 OCPU / 12 GB All 10, if they are ordinary WordPress sites with caching on
AMD Micro 1 GB (+2 GB swap) 3–5 quiet sites (tests, demos, personal pages). Not WooCommerce or real traffic

If you start on the 1 GB server and outgrow it, create the ARM server later and move the sites over with xCloud's site migration. The free xCloud plan covers only one server at a time.

Last checked: October 2026. Oracle and xCloud change their screens and limits, so a label may read slightly differently from this guide.


What you get

Item Free allowance
xCloud Free plan 1 server, up to 10 sites
Oracle ARM server (VM.Standard.A1.Flex) 2 OCPU / 12 GB RAM total (halved from 4/24 in June 2026)
Oracle AMD server (VM.Standard.E2.1.Micro) Up to 2 servers, 1 GB RAM each
Oracle disk 200 GB total, across all boot volumes
Oracle outbound traffic 10 TB per month

Which server?

  • ARM, 2 OCPU / 12 GB: comfortable for several WordPress sites. Often unavailable on free accounts (see Out of capacity).
  • AMD Micro, 1 GB: almost always available. Good for 1 small site or a handful of quiet test sites.

Before you start

  • A credit or debit card (Oracle uses it for identity checks; Always Free resources are not billed).
  • An xCloud account: https://xcloud.host
  • A terminal with ssh (macOS/Linux built in; Windows: PowerShell or WSL).
  • Optional: an SSH key. Check with ls ~/.ssh/*.pub. If none exists, create one:
ssh-keygen -t ed25519
Enter fullscreen mode Exit fullscreen mode

Part 1 — Create the Oracle Cloud account

  1. Sign up at https://www.oracle.com/cloud/free/.
  2. Choose your Home Region carefully. It can never be changed, and free servers only run there. Pick a region close to your visitors.
  3. Finish card verification and wait for the account to be ready.

Part 2 — Create the network (VCN)

Create the network before the server. The inline network option in the server form has a bug that can lock the public IP off.

  1. ☰ menu → Networking → Virtual Cloud Networks.
  2. On the left, under Compartment, choose your root compartment (your account name).
  3. Click Start VCN Wizard (it may be under Actions).
  4. Choose Create VCN with Internet Connectivity → Start VCN Wizard.
  5. Fill in:
Field Value
VCN name xcloud-vcn
VCN IPv4 CIDR block 10.0.0.0/16
Public subnet CIDR 10.0.0.0/24
Private subnet CIDR 10.0.1.0/24
  1. Next → Create. Wait until every line has a green tick, then View VCN.

Open web ports (80 and 443)

Port 22 (SSH) is already open. Add the web ports:

  1. In the VCN, open Security Lists → Default Security List for xcloud-vcn.
  2. Add Ingress Rules:
Field Value
Source Type CIDR
Source CIDR 0.0.0.0/0
IP Protocol TCP
Source Port Range (empty)
Destination Port Range 80,443
Description web
  1. Save. You should now see three TCP rules from 0.0.0.0/0: 22, 80, 443.

Part 3 — Create the server (instance)

  1. ☰ → Compute → Instances → Create instance.
  2. Basic information
    • Name: e.g. xcloud-server
    • Placement: default availability domain
    • Shape → Change shape (do this before the image):
      • ARM: Ampere → VM.Standard.A1.Flex, 2 OCPU, 12 GB
      • or AMD: Specialty and previous generation → VM.Standard.E2.1.Micro
    • Image → Change image → Ubuntu → Canonical Ubuntu 24.04 (not "Minimal")
  3. Security: leave as is.
  4. Networking
    • Existing VCN: xcloud-vcn
    • Existing subnet: the public subnet
    • Automatically assign public IPv4 address: on
    • SSH keys: Paste public key (contents of your ~/.ssh/id_ed25519.pub), or Generate a key pair for me and click Download private key right away. You cannot download it later.
  5. Storage
    • Tick Specify a custom boot volume size
    • Enter 100 GB (keep the total of all your boot volumes at 200 GB or less to stay free)
  6. Create. Wait for Running, then copy the Public IP address.

Out of capacity

Out of capacity for shape VM.Standard.A1.Flex in availability domain AD-1 means free ARM machines in your region are all taken. Your settings are fine. Try, in order:

  1. Another availability domain (if your region has more than one).
  2. A smaller size: 1 OCPU / 6 GB.
  3. Retry at a different time of day.
  4. Use the AMD Micro shape instead (1 GB, nearly always available).
  5. Upgrade to Pay As You Go (☰ → Billing & Cost Management → Upgrade and Manage Payment). Paid accounts get capacity much more easily and are not reclaimed when idle. You still pay $0 if you stay within the free allowance.

About the Pay As You Go card hold

Upgrading places a temporary hold of about US$100 on your card (shown in your local currency, e.g. ~S$138). It is a verification hold, not a charge:

  • Check Billing & Cost Management → Invoices: there should be none.
  • Check Cost Analysis: usage should be 0.
  • Your bank releases the hold on its own, usually within days, sometimes up to ~30 days.
  • If it shows as posted (not pending), or an invoice appears, contact Oracle support and your bank.

Set a $1 budget alert (do this on Pay As You Go)

☰ → Billing & Cost Management → Budgets → Create Budget → amount 1, alert at 1% of actual spend, your email. You'll hear about any real charge immediately.


Part 4 — Prepare the server

Log in (replace the IP and key path with yours). The user is ubuntu, not root.

ssh -i ~/.ssh/id_ed25519 ubuntu@YOUR_SERVER_IP
Enter fullscreen mode Exit fullscreen mode

If you used an Oracle-generated key:

chmod 600 ~/Downloads/ssh-key-XXXX.key
ssh -i ~/Downloads/ssh-key-XXXX.key ubuntu@YOUR_SERVER_IP
Enter fullscreen mode Exit fullscreen mode

4.1 Add swap (1 GB AMD server only)

Gives the small server spare memory so it doesn't crash under load.

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
free -h
Enter fullscreen mode Exit fullscreen mode

free -h should show Swap: 2.0Gi.

4.2 Open ports 80 and 443 inside the server

Oracle's Ubuntu image has its own firewall that blocks web traffic, separate from the Security List in Part 2. Both must allow it.

First find the line number of the REJECT rule:

sudo iptables -L INPUT -n --line-numbers
Enter fullscreen mode Exit fullscreen mode

Example output:

4    ACCEPT  ...  state NEW tcp dpt:22
5    REJECT  ...  reject-with icmp-host-prohibited
Enter fullscreen mode Exit fullscreen mode

Insert the web rules at the REJECT line's number (here 5), so they sit above it. Rules placed below REJECT do nothing.

sudo iptables -I INPUT 5 -m state --state NEW -p tcp --dport 443 -j ACCEPT
sudo iptables -I INPUT 5 -m state --state NEW -p tcp --dport 80 -j ACCEPT
sudo netfilter-persistent save
sudo iptables -L INPUT -n --line-numbers
Enter fullscreen mode Exit fullscreen mode

The list should now show 22, 80, 443 before REJECT.


Part 5 — Connect the server to xCloud

  1. In xCloud: Servers → Add Server → Connect Your Existing Server (Any Provider).
  2. Fill in the form:
Field Value
Server Name Any label, e.g. oracle-free
App Type WordPress (optional)
Web Server OpenLiteSpeed (built-in cache, good for small servers). NGINX also works on AMD. On ARM, use OpenLiteSpeed
IP Address Your server's public IP
SSH Port 22
SSH Username root
Database Server Do not leave on None. Pick MariaDB or MySQL (on ARM, MySQL 8.4 is not supported)
Plan Free
SSH Authentication Public Key
  1. xCloud shows a command that adds its key to the server. Copy it and run it on the server (in your ubuntu SSH session). It should print SSH key added successfully.

Oracle blocks direct root login with your key, but root login with an added key works. This command is what lets xCloud in as root.

  1. Tick I have created a new server on my provider → Create.
  2. Wait for provisioning to finish. On a 1 GB server this can take a while.

Part 6 — Get a domain (optional)

You can skip this and use xCloud's free Demo Site address for testing.

For real sites, one domain is enough for many sites, because subdomains are free:
example.dev, blog.example.dev, shop.example.dev, …

When buying:

  • Judge by the renewal price, not the first-year price.
  • Make sure WHOIS privacy is free.
  • Untick add-ons (email, "protection", site builders).
  • .dev and .app domains require HTTPS in every browser. That is fine with xCloud's free SSL, but a site won't load at all until its certificate is issued.

Point the domain to the server

At your registrar's (or Cloudflare's) DNS settings, add A records pointing to your server IP:

Name Type Value
@ A YOUR_SERVER_IP (the main domain)
* A YOUR_SERVER_IP (every subdomain at once)

On Cloudflare, set these to DNS only (grey cloud) until xCloud has issued the SSL certificate. DNS changes can take a few minutes to an hour.


Part 7 — Add a site

Open the server in xCloud → Add Site.

Field What to do
Select Options Default
Site Title Your site's name
Go Live / Demo Site Go Live with your domain, or Demo Site for a free test address
Domain Name e.g. blog.example.dev (Go Live only)
DNS Setup Click Verify My DNS. Keep Use free SSL certificate issued & managed by xCloud
Multisite Off
xSpeed Cache On
Mail Delivery Off for now
Site Backup Off for now
Blueprints Gutenberg Websites, or turn off for clean WordPress. The Elementor blueprint adds weight a small server doesn't need
More Advanced Settings Set the WordPress admin username, password and email; keep the default PHP version

Click Next and wait. Repeat for each additional site with a different title and domain.

Small server tips: keep plugins few, keep caching on, don't run imports or backups on several sites at once. A 1 GB server suits quiet sites only; WooCommerce or real traffic needs the ARM server.


Troubleshooting

Problem Likely cause and fix
ssh asks for a password or says Permission denied Wrong key file or user. Use ubuntu@, and the private key matching the public key you gave Oracle
Please login as the user "ubuntu" rather than "root" You tried root@ directly. Log in as ubuntu
xCloud can't connect The xCloud key command wasn't run, or was run on a different server. Rerun it in your SSH session
Site doesn't load on port 80/443 One of the two firewalls still blocks it: check the Security List (Part 2) and the iptables order (Part 4.2)
Verify My DNS fails DNS not spread yet (wait and retry), wrong IP in the A record, or Cloudflare proxy (orange cloud) is on
Oracle reclaims an idle free server Free accounts can lose a VM whose CPU, network and memory all stay under 20% for 7 days (a warning email comes first). Pay As You Go accounts are not reclaimed

Wrapping up

You now have a server you don't pay for, a dashboard that handles the web server, PHP, database and SSL, and room for up to 10 WordPress sites under one domain.

If you hit a step that looks different on your screen, or found a better way around Oracle's capacity problem, tell me in the comments.

Top comments (0)