Terraform and Kamal for Digital Ocean Demo Repositories
I typically run my projects on Render. Simple, no fuss, mostly works great. I needed to run ffmpeg
for a project I was researching into. This led me down a rabbit hole of self-hosted servers and inevitably, to Hetzner and Kamal.
Or rather, Kamal 2. I heard the buzz recently and watched dhh’s video about Kamal 2. They explicitly had support for running multiple projects on a single server 1.
Now I used to manage my own servers, with Ansible and Capistrano. But that was many years ago. So I looked around to see what would be suitable now and save me time. After some digging, I found this repo by Dylan Castillo that uses Terraform to provision a Hetzner server. Great stuff, and exactly what I needed. I adapted it to match my needs and set up an existing project of mine to use Kamal for deployment to kick the tires.
Only one problem: I had 2 web servers — a frontend running Vue and a backend running Node.js/bun. The video (and Rails typically) only use 1 web server.
Then there’s Hetzner’s reliability — I read about multiple accounts of them apparently randomly blocking accounts. Who knows why. Might be legit, but I don’t want to waste time on such drama.
So I turned to Digital Ocean. I used them a few years ago. Just took a couple of emails and some ID verification to get my login working again (+1 for their timely support!). Digital Ocean is pricier, but at my modest needs, the cost bump is negligible.
A few more days and more trial-and-errors later, I finally had a working setup.
Here’s what I ended up with, and maybe it’ll save someone else a headache or two:
A. Digital Ocean Terraform Demo — this repo provisions a single server on Digital Ocean. You can modify a parameter to provision a beefy server for those “throw everything on one box” scenarios.
B. Kamal Frontend/Backend Demo — this repo is an example of a node.js/bun stack frontend, backend, database stack — all on one server. Deploys with Kamal 2.
-
Potentially adding more for redundancy, but I’ll try to keep them stateless to keep things simpler ↩