In the last weeks I have tried to find a solution to the following scenario assuming that someone else had similar requirements and documented his solution but all my searches were unsuccessful. So now I'll just ask away and hope that someone with enough experience in this field can give me directions so that I don't take the wrong turn too many times.
The simplified scenario:
Let's say I have written a piece of software with a web interface and REST API for my customers which absolutely has to run in the local network at the customer's premises and will be provided to them as a "black box" hardware appliance. Apart from that I will essentially provide it "as a service" to them, meaning that maintenance and updates are my responsibility. I come to them with a small headless pre-installed and pre-configured PC, connect it to their network, perform only networking configuration and I'm done. The appliance is ready to communicate with any other software components running in the customer's network.
To be a bit more precise my software product runs under Linux (and also Windows), it should also be possible to build it as a Docker container (if that makes any sense for the proposed solution, although my know-how with Docker is still limited). I expect to set up CentOS 7 on the appliances.
Now I have two challenges:
- Keeping CentOS packages up-to-date
- Keeping my software package up-to-date
To prevent all customers from experiencing the same bug at the same time I want to be in full control which customers update which packages at which point in time on the appliance (essentially a staged rollout). In regards to my own software package this could very well be in form of different update channels (beta, stable, etc.). Ideally I am also able to fetch and push configuration and other files from/to the appliance. It would be great if I could use existing solutions for everything instead of rolling my own mechanisms.
Also, the solution should scale to hundreds or even thousands of customers.
What I have thought of until now:
For managing the CentOS systems. However, I have no idea whether any one is good at managing machines that are not running inside a single company network.
RPM packaging my software component or My software as a Docker container
I don't know which one of these would be better regarding updates. Docker may be overkill, it's just a single software application on a single machine for each customer, I only thought that it would ease application updates. Maybe an RPM package would be preferable, that way I could handle update channels as different RPM repositories and control the updates themselves with Spacewalk/Puppet.
An OpenELEC/LibreELEC JeOS approach
I don't know what this is called exactly or whether there are pre-built solutions for this but I have first encountered it with OpenELEC. Essentialy the whole OS and application are packaged in a single non-modifiable and updatable (kernel) image which is installed on the target machine and there's a separate partition for user and local configuration data.
I know this is a pretty big question, but any pointers would be very appreciated.