**I Cannot SSH Into My Server Anymore (And That’s Fine)**
As I kick off 2026, I had clear objectives in mind: decommissioning moana, my trusty $100+/month VPS, and setting up tinkerbell, its far less costly successor. While moana has been a great tool for self-hosting services and experimenting with new ideas, the cost was no longer justifiable given how little I used it.
My goal was to create a more efficient and automated system that would allow me to deploy and manage my projects without manual intervention. To achieve this, I turned to Fedora CoreOS, Ignition, Podman Quadlets, and Terraform – a stack that checks all the boxes for my requirements.
**The Journey Begins**
I started by researching each component of the stack, learning how they fit together, and understanding their roles in automating my deployment process. I discovered that Ignition is designed to provision a VM exactly once at first boot, eliminating the need for manual configuration or post-deployment updates. This concept was revolutionary for me, as it shifted my thinking about virtual machines from mutable entities to immutable values.
I then explored systemd unit files and podman CLI commands for container orchestration. However, I soon realized that this approach was too cumbersome and sought a more elegant solution. That's when I stumbled upon Podman Quadlets and auto-updates – the perfect combination of automation and ease of use.
**Automating Deployment with Terraform**
To create the tinkerbell VM, I used Terraform to configure the Vultr provider and deploy the VM with the Ignition configuration file. This was a significant milestone in my journey, as it allowed me to automate the deployment process for the first time.
However, I soon encountered challenges with defining Quadlet configurations and setting up networks between containers. After several iterations and "painful loops," I finally found a solution that worked – using systemd generators to create actual .container files from my declarations in Quadlet.
**The Final Piece: Podman Auto-Updates**
It wasn't until I discovered Podman auto-updates that the puzzle came together. This feature allows me to label containers with `io.containers.autoupdate` and enable automatic updates of images, eliminating the need for manual intervention or SSH access.
With this setup in place, publishing an image becomes the only deployment step required. My website is now updated within the hour whenever I update the tag pointing to a newer version of my image.
**The Future: Observability and Beyond**
While tinkerbell has been running without issues so far, I recognize that relying on black box behavior isn't sustainable in the long term. I plan to build an observability stack to gain visibility into what's happening inside tinkerbell, ensuring I'm prepared for failures when they inevitably occur.
As I reflect on this journey, I realize that converging toward industry-standard practices has been a gradual process. While it may not be revolutionary, automating deployment and updates with Podman auto-updates feels like a major milestone in my exploration of Infrastructure as Code.
I'd love to hear from you: have you had similar experiences or insights on automation and observability? Share your thoughts and let's continue the conversation!
---
### Source code and setup
For those interested, I've published tinkerbell's full setup on GitHub. Feel free to explore and use it as a starting point for your own projects.
[GitHub Repository](link)
### Related resources
* [Podman Quadlets documentation](link) * [Ignition configuration reference](link) * [Terraform provider for Vultr](link)