Hey Folks! So you want a real server. One that runs 24/7, hosts your side projects, survives reboots, and costs you exactly zero rupees a month. Not a trial that dies in 30 days. Not a $5 droplet you keep forgetting to cancel. Actually free, forever.
Oracle Cloud's Always Free tier is the best deal in cloud that almost nobody talks about properly. We are talking about an Ampere ARM machine with 2 OCPUs, 12 GB RAM, around 200 GB of disk, and 10 TB of egress every month. Free for life. That is enough to run Docker, a few containers, a database, a reverse proxy, and still have room to breathe.
But here is the honest part that most tutorials skip: getting signed up from India is where people quietly give up. And nine times out of ten, the reason is your card. So let's deal with that first, then walk through the whole thing step by step.
The Catch: The Card Wall
Oracle asks for a card at signup. It does not charge you (it only places a small temporary hold of around ₹100 to verify you are a real human), but it is very picky about which cards it accepts.
Here is what fails, and I say this from the Ahmedabad trenches:
- RuPay cards. Credit or debit, does not matter. They get declined.
- Prepaid and virtual cards. Rejected on principle.
- Most Indian debit cards. They technically "should" work but fail constantly.
- Forex and travel cards. Prepaid, so no.
Oracle's own India page spells it out: they accept credit cards and debit cards that function like credit cards, but not PIN debit cards, and not virtual, single-use, or prepaid cards.
Why does RuPay fail?
This tripped me up for a while, so let me save you the confusion. Oracle bills in US dollars. That means the little verification hold is a foreign transaction. RuPay is primarily a domestic network, and its international acceptance is thin. Oracle's payment processor simply does not route it. So no amount of "enable international transactions" in your banking app will fix a RuPay card, because the problem is the network, not a toggle.
The fix ✅
In rough order of how reliably it works:
- Use any Visa or Mastercard credit card. This is the real answer. If you already hold a RuPay credit card, a bank already trusts you with credit, so applying for a basic Visa or Mastercard card is usually quick. Even a tiny limit works. Oracle only needs about ₹100 of headroom. Bonus tip: some Indian banks will issue the same card on the Visa or Mastercard network if you just ask.
- Borrow a family member's Visa or Mastercard credit card for signup. Oracle does not strictly require the cardholder name to match your account name for verification, and the hold reverses in a few days with no real charge. Since the card is only used to prove you are human (not to bill you, unless you later upgrade), this is low risk.
- Try a Visa or Mastercard debit card, but keep expectations low. Indian debit cards are PIN and OTP based, which is exactly the category Oracle excludes. Try it only if you have no credit card route at all.
Heads up: even a perfectly valid Visa card sometimes throws "Error Processing Transaction." That is usually Oracle's fraud system, not your card. If it happens, do not retry ten times in a row (that makes the flag worse). Use Oracle's signup-issue support form and wait it out.
Alright, card sorted. Let's actually build this thing.
Step 0: Prep Before You Touch the Signup Page
Doing these first prevents most instant rejections:
- No VPN or proxy during signup. This is the single most common cause of an instant "no." Oracle's fraud system flags datacenter IPs hard. Sign up on your normal home connection.
- Use a real, established email. Gmail is perfect. Temp-mail domains are auto-rejected.
- Enable international transactions on your Visa or Mastercard first, inside your bank app.
- Expect a possible rejection anyway. Oracle turns down a chunk of signups with no explanation. If that happens, do not spam-create new accounts. Use their support form and be patient.
Step 1: Sign Up
- Go to
https://www.oracle.com/cloud/free/and click Start for free. - Enter country (India), your name, and email. Verify the email.
- Set a password and a Cloud Account Name (this is your tenancy name and it shows up in your console URL, so pick something you can live with).
Choose your Home Region carefully, it is PERMANENT ⚠️
You cannot change this later. Ever. Always Free compute only lives in your home region, so if you pick wrong, your only fix is deleting the account and starting over.
Here is the tradeoff for those of us in Gujarat:
| Region | Latency | A1 capacity |
|---|---|---|
| Mumbai (ap-mumbai-1) | ~20 to 30 ms, best | Notoriously scarce |
| Hyderabad (ap-hyderabad-1) | ~35 to 45 ms | A bit better than Mumbai |
| Singapore (ap-singapore-1) | ~60 to 80 ms | Historically better |
| Frankfurt / Amsterdam | ~130 to 150 ms | Good, and multi-AD |
For side projects, latency barely matters. You are SSHing in and serving light traffic. Capacity matters way more. Every Indian region is single availability domain, while Frankfurt and Amsterdam give you three domains to retry against. If you plan to stay purely free, a multi-AD region is a genuine advantage. If you upgrade to Pay As You Go (next step, and I recommend it), capacity stops being a real problem and you can happily take Mumbai or Hyderabad.
Then finish up: enter your address, verify your phone by SMS OTP, add the card, accept the agreement, and wait for provisioning. Usually a few minutes, sometimes up to an hour. You will get an email.
Step 2: Upgrade to Pay As You Go (Yes, Really)
I know. Your whole goal is "free," and here I am telling you to upgrade. Stay with me.
Pay As You Go accounts get priority on the scarce A1 capacity, are exempt from idle reclamation, and Oracle still charges nothing for Always Free resources. You only ever pay if you go above the free limits, which you control.
- Console, hamburger menu, Billing & Cost Management, then Upgrade and Manage Payment.
- Click Upgrade to Pay As You Go and confirm.
Then set a budget alert immediately
This is your safety net, non negotiable.
- Billing & Cost Management, Budgets, Create Budget.
- Target your root compartment.
- Monthly budget: $1.
- Alert rule: trigger at 100% of actual spend, send to your email.
Now if you ever accidentally spin up something billable, you hear about it in hours, not at month's end.
Want to stay purely Always Free? Skip this step, but then you must keep your VM genuinely busy (Oracle reclaims instances that sit below 20% CPU, network, and memory over 7 days), and you will be playing the capacity lottery in Step 6.
Step 3: Generate an SSH Key
On your local machine:
ssh-keygen -t ed25519 -C "oci" -f ~/.ssh/oci_key
Press enter twice (or set a passphrase). This gives you:
-
~/.ssh/oci_key, the private key. Never share it, never upload it. -
~/.ssh/oci_key.pub, the public key. This is what you paste into Oracle.
On Windows, run the exact same command in PowerShell. OpenSSH ships with Windows 10 and 11.
Step 4: Create the Network (VCN)
Use the wizard. Do not hand build this.
- Menu, Networking, Virtual Cloud Networks.
- Click Start VCN Wizard, choose Create VCN with Internet Connectivity, then Start.
- Name it
main-vcn. - Leave the CIDRs at defaults (VCN
10.0.0.0/16, public subnet10.0.0.0/24). - Next, then Create.
This builds the VCN, a public subnet, an internet gateway, route tables, and security lists in one shot. Lovely.
Step 5: Create the Instance
- Menu, Compute, Instances, Create Instance.
- Name: whatever you like.
- Image: click Change image, pick Canonical Ubuntu 24.04, and confirm it shows the Always Free Eligible label.
-
Shape: click Change shape, go to the Ampere tab, pick VM.Standard.A1.Flex.
- OCPUs: 2
- Memory: 12 GB
- These are the current Always Free limits. Oracle halved them from the old 4 OCPU / 24 GB back in June 2026, so ignore older tutorials quoting the bigger numbers.
-
Networking: select your
main-vcnand the public subnet. Make sure Assign a public IPv4 address is checked. -
SSH keys: choose Paste public keys and paste the contents of
~/.ssh/oci_key.pub. - Boot volume: tick Specify a custom boot volume size and set 200 GB if this is your only VM. Leave the performance setting at Balanced (10), because "Higher Performance" is billable.
- Click Create.
One VM or two? You can split into two 1-OCPU / 6 GB boxes. Don't. For side projects, a single 2/12 box running Docker is far more useful than two cramped ones.
Step 6: If You Get "Out of Host Capacity"
This means there is no free A1 hardware in your region right now. It is not your fault, and there is no setting that fixes it. Here is what actually helps, in order of effort:
- Just retry. Sometimes it works ten minutes later. Oracle's own advice is to wait and try again, and it can take a few days for capacity to appear.
- Try other availability domains if your region has them (Indian regions do not, single AD only).
- Make sure you did Step 2. PAYG priority is the difference between "works on the third try" and "scripting retries for a week." This is the fix that genuinely works.
- Script it using OCI Cloud Shell (built into the console, already authenticated):
# Grab these values from the console first
COMPARTMENT_ID="ocid1.tenancy.oc1..xxxxx"
SUBNET_ID="ocid1.subnet.oc1..xxxxx"
IMAGE_ID="ocid1.image.oc1..xxxxx"
AD="xxxx:AP-MUMBAI-1-AD-1"
while true; do
oci compute instance launch \
--availability-domain "$AD" \
--compartment-id "$COMPARTMENT_ID" \
--shape "VM.Standard.A1.Flex" \
--shape-config '{"ocpus":2,"memoryInGBs":12}' \
--image-id "$IMAGE_ID" \
--subnet-id "$SUBNET_ID" \
--assign-public-ip true \
--ssh-authorized-keys-file ~/.ssh/oci_key.pub \
--display-name "free-vps" && break
echo "$(date): no capacity, retrying in 5m"
sleep 300
done
Run it every 5 minutes, not faster. Hammering the API can get you rate limited or flagged.
-
Meanwhile, grab an AMD micro.
VM.Standard.E2.1.Micro(1/8 OCPU, 1 GB RAM) is almost always available. It is weak, but it gets you a working box today while you wait for A1.
Step 7: Connect
Copy the public IP from the instance page:
ssh -i ~/.ssh/oci_key ubuntu@<your-public-ip>
- Ubuntu images use the
ubuntuuser. - Oracle Linux images use the
opcuser.
If permissions complain: chmod 600 ~/.ssh/oci_key.
Step 8: The Firewall Gotcha (This Gets Almost Everyone)
Here is the one that eats an entire evening if you do not know about it. Oracle has two firewall layers, and you must open both. You will install a web server, see it running locally, and then get connection timeouts from outside. This is why.
Layer 1: OCI Security List (cloud side)
-
Networking, Virtual Cloud Networks,
main-vcn, Security Lists, Default Security List. - Add Ingress Rules:
| Source CIDR | Protocol | Dest. Port |
|---|---|---|
0.0.0.0/0 |
TCP | 80 |
0.0.0.0/0 |
TCP | 443 |
Layer 2: iptables on the VM (host side)
Oracle's Ubuntu images ship with iptables rules that drop everything except SSH, and they survive reboots.
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 netfilter-persistent save
On Oracle Linux instead:
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
You will see people online say to just run
iptables -Fto flush everything. Please don't. That strips all protection off a box with a public IP.
Step 9: Reserve Your Public IP
By default your IP is ephemeral, meaning it changes if the instance ever stops. Convert it to reserved (free, and yours forever):
- Instance page, Resources, Attached VNICs, click the VNIC.
- IPv4 Addresses, click the three dots next to the public IP, then Edit.
- Change type to Reserved Public IP, create a new reserved IP, give it a name, and Update.
Step 10: Basic Hardening
sudo apt update && sudo apt upgrade -y
sudo apt install -y fail2ban
sudo systemctl enable --now fail2ban
Password auth is already disabled on Oracle images, but verify with:
grep PasswordAuthentication /etc/ssh/sshd_config
Then turn on unattended security updates:
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
Step 11: Deploy Your Projects
Remember: this is ARM64 (aarch64), not x86. Most modern images are multi-arch and just work, but every now and then you will hit something x86-only and need to build it yourself.
Install Docker:
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
newgrp docker
For HTTPS, Caddy is the easiest path. Automatic certificates, no certbot cron jobs to babysit:
# docker-compose.yml
services:
caddy:
image: caddy:latest
restart: unless-stopped
ports: ["80:80", "443:443"]
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
volumes:
caddy_data:
# Caddyfile
yourdomain.com {
reverse_proxy myapp:3000
}
Point your domain's A record at your reserved IP, and Caddy handles TLS automatically.
Step 12: Assume You Will Lose It
A dose of realism to close on. Oracle sometimes terminates free accounts with little warning and no support recourse (Always Free users get community forums only, not real support). Even PAYG accounts occasionally get caught.
So treat the box as disposable:
- Keep everything in
docker-compose.ymlfiles committed to a git repo. - Back up databases and volumes off the box, with a nightly
rsyncorresticsomewhere else. - Then rebuilding anywhere becomes a 20 minute job, not a lost weekend.
Quick Reference
| Thing | Value |
|---|---|
| Free A1 limit | 2 OCPUs, 12 GB RAM |
| Free AMD micro | 2x VM.Standard.E2.1.Micro (1 GB each) |
| Block storage | 200 GB total, 5 backups |
| Egress | 10 TB per month |
| SSH user |
ubuntu (Ubuntu) / opc (Oracle Linux) |
| Port 25 | Blocked, no self-hosted mail without an exemption request |
| Home region | Permanent, chosen at signup |
| Cards that work | Visa / Mastercard credit (not RuPay, not prepaid, not virtual) |
Final Thoughts
And that is it. A genuinely capable server, running your projects, for zero rupees a month. The two things that stop most Indian developers are the card wall and the capacity lottery, and now you know how to walk straight through both: use a Visa or Mastercard credit card, upgrade to Pay As You Go for priority, and keep your setup disposable so losing the box never hurts.
The best part? Once it is up, it just sits there quietly hosting your ideas while you sleep. That is a pretty good deal for free.
If this saved you an evening of pain, come say hi. And yes, you can still send me pictures of street cats.
Meanwhile we can connect over:
Happy self-hosting, and keep on building!

Top comments (0)