Context: Researching free/cheap VM and app deployment options
Oracle Cloud Free Tier Setup
Signed up for Oracle Cloud Always Free tier in US-Ashburn region. Attempted to provision a VM.Standard.A1.Flex instance (4 OCPU / 24GB RAM ARM) but hit “Out of capacity” across all 3 availability domains.
Key Decisions Made
- Home region: US-Ashburn (permanent, cannot be changed)
- Shape: VM.Standard.A1.Flex (ARM Ampere)
- Target config: 4 OCPUs, 24GB RAM
- Enabled IMDSv2 (more secure, prevents SSRF attacks on metadata endpoint)
- On-demand capacity type (not preemptible/dedicated)
- Created new VCN and public subnet with defaults
- Using existing SSH key (not Oracle-generated)
Gotchas Learned
- Home region is permanent - choose carefully based on ARM capacity
- Idle reclamation - Oracle stops instances if CPU <20% (95th percentile) over 7 days, or memory <10% for ARM
- Account inactivity - 30 days no login = suspension, another 30 = permanent deletion
- Port 25 blocked - need support request for outbound email
- Storage deleted at trial end - if over 20GB object storage limit
- Limited to 2 VCNs
- No downgrade from PAYG once upgraded
Upgrading to PAYG (Next Step)
The consensus fix for capacity issues. Benefits:
- Idle instances no longer reclaimed
- “Out of Capacity” errors become rare (often instant provisioning)
- Still $0 for Always Free resources
- Set up budget alerts as a safety net
Auto-Retry Tools (If Staying Free Tier)
- hitrov/oci-arm-host-capacity - PHP, ~1.2k stars, archived Aug 2024
- futchas/oracle-cloud-free-arm-instance - Bash, 32 stars, active
- Wait times: days to weeks on free tier, instant with PAYG
Other Free/Cheap Options Explored
- Free VMs: Oracle (best), GCP e2-micro, AWS t2.micro (12mo), Azure B1s (12mo)
- Cheap VMs: Hetzner (2/mo), Vultr/DO/Linode
- Free PaaS: Fly.io, Railway, Render, Cloudflare Workers, Vercel, Netlify
- Free GPU: Google Colab, Kaggle (30hr/wk T4), Lightning.ai (22hr/mo)
- Cheap GPU: Vast.ai, RunPod ($0.15-0.40/hr)
Status
Resolved 2026-06-23 — running obsidian-mcp micro as the always-on host for the remote Obsidian MCP. The path there was bumpy:
- First launched a VM.Standard.E2.1.Micro in AD-2 (the micro had capacity even though the 4-OCPU A1 never did). But it turned out the micro reports only ~498 MB RAM (half the advertised 1 GB), and
dnfgot OOM-killed installing Node — too small. - Tried to pivot to an Ampere A1 (1 OCPU / 6 GB) for headroom. A1 was “Out of capacity” in all three Ashburn ADs (AD-1/2/3) — the same wall as April, still unresolved on Free Tier. Terminated that attempt.
- Fell back to the micro, mitigated: 2 GB swap +
vm.swappiness=100, disabled the OCI agents (oracle-cloud-agent*) to reclaim RAM, and installed Node 22 from the static tarball instead ofdnf(dnf’s metadata spike is what OOM’d; the steady-state MCP workload fits fine).
Current box: obsidian-mcp, VM.Standard.E2.1.Micro, Oracle Linux 9.7, AD-2, OCID ...chmz4h4q, public IP 141.148.64.97 (ephemeral), SSH user opc with the ed25519 key, VCN vcn-20260623-0006 + public regional subnet. Toolchain installed: git 2.52.0, Node 22.12.0 / npm 10.9.0, cloudflared 2026.6.1, uv 0.11.23.
Still on Free Tier. Two open items: (a) A1 needs PAYG to ever get capacity (your note’s documented fix; stays $0 for Always Free) if you want the 6 GB box later; (b) idle reclamation still applies (CPU <20% over 7 days) — PAYG also fixes that. Earlier “couldn’t get a GPU machine” memory was a misremember: the block was ARM CPU capacity, and no VM had actually launched until now.
Remaining (MCP wiring, not yet done): two-way git vault sync, run mcpvault + mcp-proxy + cloudflared as systemd units, and a Cloudflare service token (headless host can’t do the Google OAuth browser flow).