It feels like a set of canned Docker Compose configs would do the same. If Docker would add a layer of abstraction on top of Compose, and a marketplace of shareable configurations, I bet that'd provide the same functionality as Dokku.
Spinning up a VPS on DigitalOcean or Hetzner is not a problem of course, and running the containers is trivial, but when it comes to "productionizing" this (auto-deployment from branches, infrastructure as code, Github Actions, secure secrets, centralized logging, load balancing, and the other niceties that you get with a PaaS), there are a LOT of options.
From my research, it looks like "Host your own Heroku" options include: Dokku, Porter.run, Kamal, Coolify, Dokploy, CapRover, Cloud66, and some wrappers of K8s or K3s.
I admire what Kamal/DHH is trying to do in this space, but I keep coming across people saying, "It was close, but boy I had a hard time getting it working," and they also decided to write their own web proxy recently which really read like the most Not-invented-here thing ever. Still, I admire their pursuit of simplicity!
Rightly or wrongly, K8s (even K3s) always reads as complicated to me, even if I am not hosting it. It feels like a combination of "I hope you like yaml" and "And now you have two problems" sorts of tools...
I like the effort that Coolify, Dokploy, and CapRover put into the GUI wrappers, but as those get thicker, my fear of something going wrong also increases. (I did have a good experience installing Coolify on a couple of Hetzner servers, but I haven't used it in earnest).
I lean towards Dokku for its deliberate attempt to replicate Heroku abstractions, and its age, but I'd love to hear others' experience with Dokku or similar tools, especially in a "real world" setting.