I asked Claude to help me build free hosting for this very site, and then to help me write about it. The result is a neat little loop: the assistant helps me spin up a server, then helps me tell the story of spinning up the server. Uroboros, but with SSH keys.

The goal was simple: get a permanent, zero-cost public server where zinchuk.online can live while I build the real site. Oracle Cloud’s Always Free tier offers a real VM with a public IP, and it is surprisingly capable. The part I wanted to capture here wasn’t just the steps, but the tiny frictions: the things that almost derail the process when you are tired and moving fast.

The arc (short version)

Here is the shape of the setup, in the order it actually happened:

  • Created a free Ubuntu 24.04 VM in eu.
  • Fixed SSH key permissions locally and connected as the default ubuntu user.
  • Updated the system, created a personal user, and copied SSH keys by hand.
  • Locked down SSH, enabled a firewall, and added fail2ban + unattended upgrades.
  • Discovered Oracle’s separate network firewall (Security Lists) and opened ports 80/443.
  • Enabled and configured Nginx to serve a placeholder page.

That looks clean and linear. In reality, the only reason it felt smooth is because Claude kept reminding me about the order of operations and the caveats. The “minimal image” part mattered more than I expected.

The friction points (aka: the reasons this exists)

Minimal means minimal. I chose Ubuntu 24.04 Minimal because I wanted a clean base. It really is clean — no nano, no rsync. That changed how I copied SSH keys for the new user: I had to do it manually with cp and the right permissions. It’s not hard, but it’s easy to mess up if you assume your usual tools are there.

There are two firewalls. Even after I had ufw enabled with ports 80 and 443 open, the website did not load. The culprit was Oracle’s Security List — the VCN-level firewall you configure in the console. The default rule set only allows port 22. You must add ingress for 80 and 443, and the “Source Port Range” should be All, not 80/443. That is the kind of UI trap that burns an hour if you’re unlucky.

Don’t lock yourself out. Creating the new user and hardening SSH needs a small ritual: open a second terminal, test the new user, only then close the default ubuntu session. It sounds obvious, but it’s the kind of detail that matters when you are excited to “just finish the setup.”

What worked

  • The Always Free tier behaved like a real server, not a toy. The IP was public and stable, and the VM is plenty for a static site and a few small services.
  • Nginx was already installed, so all I needed was a site config, a symlink, and a reload. Within minutes, http://YOUR_IP was serving a placeholder page.
  • The setup is repeatable. With a short checklist and a few reminders, the whole process is calm and predictable.

What didn’t (or almost didn’t)

  • The missing tools on the minimal image were a surprise. I had to slow down and avoid muscle memory.
  • The OCI Security List was the biggest “invisible wall.” Nothing in the OS would have told me about it.
  • The temptation to skip verification steps was real. It is easy to close the default session before proving the new user works.

Why this is a test post

This is deliberately a “test” article because I’m still building the real content for zinchuk.online. The important thing was getting a reliable, low-cost host first — and a working blog pipeline in Astro so I can keep shipping posts as I build the site. If this post renders, the pipeline works.

What’s next

  • Build the actual Astro site and deploy it to the VM.
  • Point DNS from GoDaddy to the Oracle public IP.
  • Add HTTPS using Certbot.

If you want a clean, free server to host a personal site, Oracle’s free tier is a solid path. Just remember: there is always one more firewall than you think.