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:
- Create a free Oracle account and a network that allows web traffic (Parts 1–2).
- Create one Ubuntu 24.04 server on that network (Part 3).
- Log in, open the web ports inside the server, and add swap if it's the 1 GB one (Part 4).
- Give xCloud root access with its key; xCloud installs the web server, PHP and database (Part 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
Part 1 — Create the Oracle Cloud account
- Sign up at https://www.oracle.com/cloud/free/.
- Choose your Home Region carefully. It can never be changed, and free servers only run there. Pick a region close to your visitors.
- 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.
- ☰ menu → Networking → Virtual Cloud Networks.
- On the left, under Compartment, choose your root compartment (your account name).
- Click Start VCN Wizard (it may be under Actions).
- Choose Create VCN with Internet Connectivity → Start VCN Wizard.
- 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 |
- 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:
- In the VCN, open Security Lists → Default Security List for xcloud-vcn.
- 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 |
- Save. You should now see three TCP rules from
0.0.0.0/0: 22, 80, 443.
Part 3 — Create the server (instance)
- ☰ → Compute → Instances → Create instance.
-
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
- ARM: Ampere →
- Image → Change image → Ubuntu → Canonical Ubuntu 24.04 (not "Minimal")
-
Name: e.g.
- Security: leave as is.
-
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.
- Existing VCN:
-
Storage
- Tick Specify a custom boot volume size
- Enter
100GB (keep the total of all your boot volumes at 200 GB or less to stay free)
- 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:
- Another availability domain (if your region has more than one).
- A smaller size: 1 OCPU / 6 GB.
- Retry at a different time of day.
- Use the AMD Micro shape instead (1 GB, nearly always available).
- 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
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
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
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
Example output:
4 ACCEPT ... state NEW tcp dpt:22
5 REJECT ... reject-with icmp-host-prohibited
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
The list should now show 22, 80, 443 before REJECT.
Part 5 — Connect the server to xCloud
- In xCloud: Servers → Add Server → Connect Your Existing Server (Any Provider).
- 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 |
- xCloud shows a command that adds its key to the server. Copy it and run it on the server (in your
ubuntuSSH session). It should printSSH 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.
- Tick I have created a new server on my provider → Create.
- 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).
-
.devand.appdomains 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)