We have our own servers (mostly consumer pc parts) and run lxd to slice them up into vms/containers. Deploy to those using kamal and expose the web server port through cloudflare tunnels. With simple scripts to periodically compress and upload the storage volumes and database dumps to Google drive, most of our less critical apps cost about $0 to keep running. For the higher criticality apps, we also deploy them to Linux vms using kamal, but use a commercial service (linode).