I really like to build self contained binary in Go.
All the code compile to a single binary file without any external dependencies. I put all my static files (html, css, js, imgs) inside this binary file using "bindata". If I really need a database, I'll use sqlite as a default (this could be configured to something else).
For updates, if you do not compress the binary file (upx), you can make a binary patch with "bsdiff"/"bspatch" (http://www.daemonology.net/bsdiff/).
There is a Go library to do it dynamically https://github.com/kr/binarydist. So your app could be 50Mb, but updating it would be as simple as downloading a 400Kb patch and applying it (software can do it).
For schema migration, I like https://github.com/rubenv/sql-migrate which can be used as a library.
Therefore, the migration can be part of the binary patch in an update.
So in the end, you only distribute a native executable file for whatever platform your customer is using.
The short answer is that no, there is no simple way to get users to self-host your software. Perhaps developers prefer it that way? It certainly helps keep the SaaS model going.
Remember that what a developer deems 'simple' matches no known definition of the word amongst ordinary users.
Take a look at how Koken handles their install routine. I found it very clean. You place a file in the root of your server, then load this in a browser. It checks permissions and technical requirements, then proceeds with the full download and installation if everything checks-out.
Updates are handled similarly -- the software alerts the admin to an available update within the admin console, and you can choose when to download and apply the patch.
I am assuming anyone who is going to self-host will be able to use Docker. Perhaps will need to look up some documentation. But maybe I am missing something, why would it not be good way to distribute SaaS app?
Your suggestion makes sense, and docker images + docker compose config maybe simplest way to provide self-hosted option for web app that is already exist as cloud service. We used this approach to enable self-hosted option for our BI tool (SeekTable), and it works perfect for us.
I really like to build self contained binary in Go.
All the code compile to a single binary file without any external dependencies. I put all my static files (html, css, js, imgs) inside this binary file using "bindata". If I really need a database, I'll use sqlite as a default (this could be configured to something else).
For updates, if you do not compress the binary file (upx), you can make a binary patch with "bsdiff"/"bspatch" (http://www.daemonology.net/bsdiff/). There is a Go library to do it dynamically https://github.com/kr/binarydist. So your app could be 50Mb, but updating it would be as simple as downloading a 400Kb patch and applying it (software can do it).
For schema migration, I like https://github.com/rubenv/sql-migrate which can be used as a library. Therefore, the migration can be part of the binary patch in an update.
So in the end, you only distribute a native executable file for whatever platform your customer is using.