One small ARM cloud VM, one OS, and every other project built on top of it.
Everything here runs on a single Ubuntu Server VM — 26.04 LTS, ARM, on Oracle Cloud — plus a bare-metal box on the same OS.
Why this base
Ubuntu Server is boring in the good way. A long support window, current packages, and nothing standing between me and the services I want to run. Using the same OS in the cloud and on metal means one set of notes, one set of habits, one set of commands.
ARM is the part worth flagging. The cloud VM is Ampere, so everything I write has to build and run there, which quietly rules out a fair amount of convenient x86-only tooling. Python and Node are fine. The constraint just means checking instead of assuming.
Services are user units
Nothing needs root to stay up. Each project is a systemd user service with linger enabled, so it starts at boot and keeps running without a login session:
systemctl --user status site
journalctl --user -u site -f
systemctl --user restart site
Each unit is small: an ExecStart, a working directory, a restart policy, and the few environment variables it needs. Logs go to journald, so there is one place to look, one place to grep, and no rotation to think about.
Restart policies, not babysitters
Restart=on-failure with a short delay covers the crash case. The rule I hold to: if I have to ssh in to keep something alive, it is not finished. It should come back on its own, and say so when it can't.
What is actually on the machine
- this site, served by a plain HTTP server
- a blog engine that is really just files
- one Discord bot
- a browser-based code editor, behind its own login
- a scheduled-job runner that stays quiet unless something needs me
Plain files under the home directory. No containers, no orchestration, no database beyond what the OS ships with. The list is short on purpose: it is also the list of things I have to maintain.