I went through Heroku, then DigitalOcean, then GCP, AWS, Hetzner Cloud, and finally landed on a dedicated Hetzner server at €45/month
My use case is app websites (https://lunar.fyi, https://lowtechguys.com), public databases (https://db.lunar.fyi), personal APIs (for uploading files, optimizing images/videos, MQTT etc.) and websites for my relatives (https://robert.panaitiu.com)
I've had this configuration for 2 years now: https://www.hetzner.com/dedicated-rootserver/ax41-nvme
AMD Ryzen 5 3600 Hexa-Core "Matisse" (Zen2)
64 GB DDR4 RAM
2 x 512 GB NVMe SSD (Software-RAID 1)
1 Gbit/s bandwidth
On the software side I'm heavily relying on self-hosted Portainer [0] (for managing Docker stacks) and Caddy [1] (for routing web services, static file servers, static websites, barebones
single Python file APIs etc.)
I usually start a side project by simply running it in a tmux on the machine. If it becomes larger, I promote it to a docker-compose file inside Portainer.
When I find myself needing to update/re-deploy often enough, I create a repo for the compose.yaml file and create a Portainer stack with that repo. That way, a `git push` can re-deploy automatically with rollback on failure.
Sometimes I might need to run tasks like building a binary or a more advanced Docker image on `git push`, so I also self host Drone CI [2] for that.
Portainer also supports Kubernetes, but I just don't feel comfortable with its complexity. I feel more at home with running `docker ps/exec/logs` to troubleshoot possible problems, or test out some ideas quickly.
[0] https://www.portainer.io/
[1] https://caddyserver.com/
[2] https://www.drone.io/