Watcher currently offers a profile-based installer in shell/install-watcher.ps1:
- Binary services only
- Static sites only
- Both binaries + static sites
- Full stack
That worked when the product surface was mostly:
- NSSM-managed binary services
- IIS-hosted static sites
- optional ARR reverse proxy
But the product is starting to grow in a more modular direction:
- IIS should become more deeply managed by Watcher
- IIS provisioning should eventually be automated, not documented as a manual step
- future IIS targets may include not only static files, but also PHP applications
The current installer shape is starting to become limiting because it bundles several Windows capabilities into coarse profiles rather than letting operators choose the exact modules they need.
Improving the installer first gives us a cleaner foundation for upcoming IIS work.
Right now, the installer logic is tightly coupled to Profile:
Profiledrives whether NSSM is installedProfiledrives whether IIS features are enabledProfiledrives whether URL Rewrite is installedProfiledrives whether ARR is installed and enabled
That becomes awkward once we add more IIS variants, for example:
- IIS for static sites
- IIS for PHP sites
- IIS + URL Rewrite only
- IIS + FastCGI/PHP without ARR
- ARR proxy without static hosting
A module-based installer will let us support those combinations cleanly without inventing more and more preset profiles.
- Replace the profile-based installer model with a capability/module-based model.
- Make installer choices clearer by grouping modules by service type and use case.
- Prepare the product for richer IIS support, including PHP hosting.
- Keep the installer friendly for simple setups by still offering recommended bundles or presets.
- Make future Watcher runtime features line up with installed Windows components.
- Full IIS site/app/app-pool automation in this first installer phase.
- Full PHP runtime management in the first pass.
- Linux package/module management.
- Replacing existing deployment logic for NSSM services in the same phase.
shell/install-watcher.ps1 currently uses a single Profile selection and derives:
$installNSSM$installIIS$installARR
IIS installation currently includes:
- IIS Windows features
- URL Rewrite
ARR installation currently includes:
- ARR package
- ARR proxy enablement
Watcher already distinguishes service types at runtime:
nssmstatic
For static services, deploy currently:
- extracts files
- swaps
current - optionally recycles an IIS app pool
But it does not create or manage the IIS site itself yet.
We want IIS support to grow beyond the current "static site with manual IIS registration" model and eventually support PHP-oriented deployments too.
The installer should become capability-driven.
Instead of asking users to choose only one coarse installation profile, it should show grouped checkboxes for Windows modules and helpers, for example:
- Watcher service
- Dashboard/API port configuration
- Watcher install directory
- Logs/database directories
- NSSM
- IIS Web Server
- IIS Management Scripts/Console
- URL Rewrite
- IIS Web Server
- IIS Management Scripts/Console
- CGI / FastCGI
- URL Rewrite
- optional PHP runtime/bootstrap support
- ARR
- ARR proxy enablement
- Chocolatey bootstrap
- validation/preflight checks
The UI can still offer presets such as:
- Binary services
- IIS static hosting
- IIS PHP hosting
- Full stack
But those presets should simply pre-check modules instead of controlling the entire installation flow.
Introduce an explicit installer capability model instead of overloading Profile.
Example conceptual flags:
InstallChocolateyInstallNSSMInstallIISCoreInstallIISMgmtToolsInstallURLRewriteInstallARREnableARRProxyInstallFastCGIPreparePHPHosting
These do not all need to ship at once, but the structure should support them cleanly.
This matches your idea and I think it is the right direction.
The installer should present modules grouped by what they are used for:
- NSSM
- optional related validation
- IIS web server features
- IIS management scripting tools
- URL Rewrite
- IIS web server features
- IIS management scripting tools
- CGI/FastCGI
- URL Rewrite
- optional PHP runtime setup
- ARR
- ARR proxy enablement
This is much more scalable than today’s profile dropdown because it matches the way operators think about workloads.
Replace profile-derived booleans with explicit capability flags.
Tasks:
- Introduce a config object with named module booleans.
- Keep temporary backward compatibility by mapping old profiles into module selections internally.
- Split installation logic into reusable capability installers:
Install-ChocolateyIfNeededInstall-NSSMIfNeededInstall-IISCoreIfNeededInstall-URLRewriteIfNeededInstall-ARRIfNeededEnable-ARRProxyIfNeeded- future
Install-FastCGIIfNeeded
- Keep preflight and summary output aligned with selected modules.
Deliverable:
- installer logic is modular even if UI still partially resembles the current one
Redesign the installer wizard UI.
Tasks:
- Replace
Installation Profiledropdown with grouped checkboxes. - Add short help text under each group describing what it enables.
- Add optional preset buttons that populate the checkboxes.
- Show dependencies automatically:
- selecting ARR implies IIS core
- selecting PHP hosting implies IIS core + FastCGI
- selecting URL Rewrite may imply IIS core
- Keep the wizard understandable for simple installs.
Deliverable:
- installer UI reflects real Windows capability choices
Prepare the installer for richer IIS hosting.
Tasks:
- Separate IIS base features from IIS add-ons.
- Define the minimal feature set for:
- static hosting
- PHP hosting
- reverse proxy only
- Add validation checks to confirm required Windows modules are active.
- Update install summary to show exactly what got enabled.
Deliverable:
- installer can support multiple IIS workload types without new profile explosion
Once installer groundwork is in place, improve Watcher runtime support.
Tasks:
- Expand service/runtime metadata for IIS-backed workloads.
- Add IIS provisioning support for static site deployments.
- Add status checks for:
- app pool existence
- site existence
- binding/path drift
- Keep provisioning idempotent and safe.
Deliverable:
- Watcher begins managing IIS resources, not only deployed files
After installer and basic IIS management are stable, add PHP-specific support.
Tasks:
- Decide runtime model:
- system PHP already installed
- Watcher-assisted PHP bootstrap
- bundled PHP runtime
- Define service type semantics for PHP workloads.
- Decide whether PHP sites are modeled as:
- new service type, or
- IIS sub-mode under current static/IIS family
- Define needed artifacts/config support:
web.config- FastCGI mapping
- environment/config file management
- writable directories
- Add safety/validation around app pool and PHP runtime compatibility.
Deliverable:
- clear implementation path for IIS PHP deployments
Preset buttons are useful, but they should only pre-select modules. Users should still be able to adjust checkboxes afterward.
We should avoid vague labels where possible. If a checkbox installs or enables a Windows component, the UI should say so.
If a user selects ARR, the installer should make it obvious that IIS core is also required.
As Watcher grows IIS/PHP support, the installer and runtime should stay aligned so operators are not surprised.
A user deploying only Go binaries should still be able to install Watcher quickly without learning IIS terminology.
- Do we keep the old profile dropdown temporarily during transition, or replace it immediately with checkboxes?
- Should PHP support mean:
- install IIS prerequisites only, or
- also install PHP runtime automatically?
- Should URL Rewrite be considered part of all IIS workloads, or only static/proxy/PHP presets that need it?
- Do we want ARR as a standalone capability even when no static/PHP site is being hosted by Watcher?
- Should the installer write selected capabilities into
.envor another machine-local metadata file for diagnostics?
- Installer no longer relies solely on the current profile enum to decide what Windows components to install.
- Users can see Windows modules grouped by service type usage.
- Installer can represent at least these combinations cleanly:
- NSSM only
- IIS static only
- IIS static + ARR
- IIS PHP prerequisites
- Installer summary clearly shows what was selected and what was actually installed/enabled.
- The resulting structure makes upcoming IIS site automation easier to add.
Start with Phase 1 and Phase 2 together in a minimal form:
- keep existing install behavior intact underneath
- refactor the script to use explicit capability flags
- replace the profile dropdown with grouped checkboxes plus preset buttons
That gives us a much better foundation before we add IIS site creation and later PHP deployment support.