storj/docs/design/storage-node-windows-installer.md

86 lines
3.6 KiB
Markdown
Raw Normal View History

# Storage Node Installer for Windows
## Abstract
This design doc outlines how we setup Storage Node on Windows.
## Background
Currently we are using Docker to maintain Storage Nodes.
Unfortunately Docker is not supported for Windows Home, which is popular OS among Storage Node Operators.
Similarly, Docker ends up using more resources than running natively on Windows.
Therefore, it would be nice to be able to run Storage Node without Docker.
For an easy setup process we would need an installer that:
1. Sets up Storage Node to run in background,
2. sets up automatic updates and
3. ensures we log everything properly.
We need to take care that we:
* avoid triggering UAC unnecessarily,
* start storage node before logging in and
* restart on crashes.
## Design
The high-level idea is to create an installer using WIX and make Storage Node a Windows service.
### Installer
For creating an installer we can use WIX Toolkit.
There is [go-msi](https://github.com/mh-cbon/go-msi), which helps to get us setup the basic template.
We also need to ensure that we supply all the Operator information during installation.
To make the installer work we need to:
* Install [go-msi](https://github.com/mh-cbon/go-msi) on the build server.
* Create a wix.json file like [this one](https://github.com/mh-cbon/go-msi/blob/master/wix.json)
* Add a guid with `go-msi set-guid` to uniquely identify the process.
* Ensure that binaries are signed before or during building the installer.
* The wix.json should contain steps for:
* adding Dashboard shortcut to the desktop
* setting [service recovery properties](https://wixtoolset.org/documentation/manual/v3/xsd/util/serviceconfig.html)
* configuring Storage Node Operator information:
* Wallet Address
* Email
* Address/ Port
* Bandwidth
* Storge
* Identity directory
* Storge Directory
* install storagenode binary
* register storagenode as a service
* adding Storage Node binary to Windows UserPath (optional)
* open Dashboard at the end of the installer.
* Run `go-msi make --msi your_program.msi --version 0.0.2` to create the installer.
* Ensure that installer is signed by the build server.
### Service
We need to Storage Node to implement Windows service API, as shown in:
* Modify storage node/automatic updater startup code to implement [ServiceMain](https://docs.microsoft.com/en-us/windows/win32/api/winsvc/nc-winsvc-lpservice_main_functiona).
* See [golang/sys](https://github.com/golang/sys/blob/master/windows/svc/example/service.go)
* Create inbound firewall rule using the following Powershell command: `New-NetFirewallRule -DisplayName "Storj v3" -Direction Inbound Protocol TCP LocalPort 28967 -Action allow`
This means that Windows handles starting and restarting the binary in the background.
## Implementation
1) Modify the storage node startup to implement ServiceMain so that the binary is considered a Windows Service.
2) Create script for registering binary as a Windows Background Service. (sc.exc command)
3) Create wix.json file for building an MSI.
4) Update the build process to include the creation of the MSI.
5) Ensure the windows installer is working properly
* Install Storage Node using msi.
* Ensure binaries run on Windows startup, and it runs as a background process when not logged in.
* Ensure UAC(s) is not triggered after installation.
* Ensure that storage node restarts automatically after a crash
## Open Issues/ Comments (if applicable)
* Consider writing an uninstaller.
* How do we prevent UAC from triggering?
* Consider using wix without go-msi.