I have a system that we use at work here that seems to work well with services. Our deployed system has about 20-30 services at any given time. At work, we use a product called TopShelf, which you can find here http://topshelf-project.com/
Basically, TopShelf handles many things related to the service. Install, uninstall, etc. All from the line cmd service. One of the very useful features is the ability to run as a console for debugging. You create one service, and with another cmd line launch, you can run it as a console to see the result of the service. We have added one special feature to this software that allows us to pre-configure profiles. Basically, our profiles configure a few things, such as logging, resource allocation, etc., so that we can control all this without re-issuing any code. All we do is run a command, for example
D: \ Services \ ServiceName.exe Core.Profiles.Debug or
D: \ Services \ ServiceName.exe Core.Profiles.Production
to get different logging configurations.
Our build script creates install.cmd and uninstall.cmd scripts for each of our services that we do is copy the files to the server and run the script. If we want to see the debug output, we stop the service and double click on exe, and we get the console to read all the output.
Another thing that the top panel uses, which we donβt use because it is not needed, is the concept of shelving (there is documentation on this website for this). This allows you to update the service without having to restart it, but you still need to manually copy the files if you do not create an automated system for this.
However, my suggestion, if you need 100% service availability, is a redundant system. Regardless of how you configure your service for updates, you cannot avoid a hardware failure, which will lead to downtime without an automatic failover system. If this system were in place, my recommended upgrade strategy would be to disable 1 node, update, test, enable, turn off another node, update, test and enable the second node again. You can do this, of course, with a simple script. It may be a more complex system than you need, but if you cannot use the service offline for a simple restart that takes 5 seconds, you really need some kind of system to solve the hardware problems, because I can guarantee that it will happen eventually.