Skip to content

Upgrading Halo

This runbook covers upgrading the Halo application version on the Application Server of a self-hosted GRC-ITSM deployment. GRC-ITSM runs on a Halo core, so this is how you move your instance to a newer Halo release. The upgrade replaces the files in the WebApp folder and runs a database upgrader; it does not touch the host OS.

Overview

Pick a version, back up, verify SQL compatibility, stop the Halo IIS site, preserve any custom web.config headers, drag the new files into the WebApp folder, run any version-gated installers, run upgrader.exe, restart IIS, and verify the new version in the About window. This procedure reuses the shutdown choreography from Upgrading the Host OS.

Applies to

The Halo Application Server (IIS-hosted WebApp + DB Integrator). See the topology overview. The WebApp folder referenced throughout is «CONFIRM: WebApp path -- e.g. C:\Halo\Production or C:\Halo\WebApp».


1. Version selection

Halo offers up to three version channels on the Halo Self Service Portal (https://support.haloservicedesk.com/). Choose based on your stability/feature trade-off (per On-Prem Upgrade, s2).

Channel Characteristics Recommended for
Stable Longest in use, most stable features, none of the brand-new features Production -- use this for your live instance
Release Candidate Between Stable and Beta in maturity Pre-production validation
Beta Newest features, potentially less stable Test environments only

Use Stable for production

Because your GRC-ITSM instance serves as a system of record (and often holds compliance evidence), upgrade production to the Stable channel. Validate Beta/RC only in a non-production environment.


2. Prerequisites

Take a backup

Take a current database backup (and ideally a VM snapshot of the Application Server) before proceeding. If the upgrade fails, this is your rollback point. «CONFIRM: backup / snapshot location + owner»

Verify SQL compatibility level

Halo requires JSON support (OPENJSON, Transact-SQL), so SQL Server 2016+ with compatibility level >= 130 is mandatory. When upgrading to Halo v2.220 or later, raise the level to >= 140 (per s1 and s2).

Check the current level:

SELECT name, compatibility_level
FROM sys.databases
WHERE name = 'YourDatabaseName';

Raise it if it is below the required level:

ALTER DATABASE YourDatabaseName
SET COMPATIBILITY_LEVEL = 130;
ALTER DATABASE YourDatabaseName
SET COMPATIBILITY_LEVEL = 140;

Ensure the new (NHServerless) services are enabled if crossing the deprecation threshold

If you are upgrading to a version that requires the new event services (NHServerless, which replaced NHServer), they must be set up and enabled first. These are application toggles under Configuration > Advanced Settings > Backend Services -- not services.msc entries. If you skip this and the target version no longer supports NHServer, upgrader.exe will fail (see Troubleshooting).

Version-gated installer steps

Depending on the version you are upgrading from (and to), one or more additional installers are required before running upgrader.exe (per s2). Present these to whoever runs the upgrade:

Condition Required step
Upgrading from a version before 2.88 Download vc_redist.x64.exe (https://aka.ms/vs/17/release/vc_redist.x64.exe), add it to the InstallFiles folder, and run it
Upgrading from a version before 2.50 Run UpgraderOld.exe (in addition to the pre-2.88 step above)
Upgrading from before 2.130 to after 2.130 Install the .NET hosting bundle dotnet-hosting-6.0.21-win.exe, or Halo will not work

Identify the current version first

These steps are gated on the version you are coming from. Confirm the current Halo version (via the About window) before the upgrade so you know which of the above apply.


3. Pre-flight checklist

  • Target version and channel chosen (Stable for production)
  • Current Halo version recorded (to determine version-gated steps)
  • Database backup taken; VM snapshot taken
  • SQL compatibility level verified (>= 130, or >= 140 for v2.220+)
  • New (NHServerless) Backend Services enabled if the target version requires them
  • nhdweb zip downloaded from the Self Service Portal onto the Application Server
  • WebApp folder path confirmed: «CONFIRM: WebApp path»
  • IIS site / app pool names confirmed: «CONFIRM: IIS site + app pool names»
  • Integrator scheduled task name(s) confirmed (in case of file-lock during drag-drop): «CONFIRM: integrator Scheduled Task name(s)»
  • Custom web.config headers (HSTS, Referrer, permissions policies) located and copied for the root, api, auth, and portal folders
  • Change request approved and inside the maintenance window: «CONFIRM: maintenance window + change-approval owner»

4. Procedure

Step 1 -- Download and extract on the Application Server

Download the chosen version's nhdweb zip from the Self Service Portal (https://support.haloservicedesk.com/haloversions) onto the Application Server, then extract it there. The files must be extracted before you can drag and drop them.

Step 2 -- Stop the Halo IIS site

Stop the Halo IIS site (and app pool). This is the same shutdown step documented in Upgrading the Host OS, step 2 -- there is no Halo Windows service.

Import-Module WebAdministration
Stop-Website    -Name 'CONFIRM-HaloSiteName'
Stop-WebAppPool -Name 'CONFIRM-HaloAppPool'

Avoid an integrator file-lock during drag-drop

The drag-drop in step 4 can hit a permissions error on the Integrator file if a scheduled integrator task is running and has locked it. To prevent this, end (and optionally disable) the integrator scheduled task(s) before copying -- the same step as Upgrading the Host OS, step 3. If you hit the lock anyway, end the running task in Task Scheduler and retry.

Step 3 -- Preserve custom web.config headers

web.config overwrite

Dragging the upgrade files into the WebApp folder overwrites the web.config files in the root, api, auth, and portal folders. Any custom headers there -- HSTS, Referrer-Policy, and permissions policies -- will be lost (per s2).

Before the drag-drop, do one of the following:

  • Copy the customised headers from the existing web.config files (root, api, auth, portal) so you can re-apply them afterwards, or
  • Remove the web.config files from the extracted upgrade files so the drag-drop leaves your existing ones in place.

Step 4 -- Drag the upgrade files into the WebApp folder

In the extracted folder, select all files (Ctrl+A), then drag and drop them directly into the WebApp folder.

Drop into the WebApp folder itself -- not a subfolder

DO NOT drag and drop the files into another (sub)folder. They must land directly in the WebApp folder («CONFIRM: WebApp path -- e.g. C:\Halo\Production or C:\Halo\WebApp»). Dropping them into a nested folder breaks the upgrade (per s2). This is also the step that overwrites web.config -- confirm you completed step 3 first.

Step 5 -- Run version-gated installers

Run any installers identified in Prerequisites > Version-gated installer steps, in this order, before running upgrader.exe:

  1. If from a version before 2.88: run vc_redist.x64.exe (placed in InstallFiles).
  2. If from a version before 2.50: run UpgraderOld.exe.
  3. If from before 2.130 to after 2.130: install dotnet-hosting-6.0.21-win.exe.

Step 6 -- Run upgrader.exe

Run upgrader.exe from within the Halo (WebApp) files and follow the steps in the console. When it finishes, the application should close. If you are unsure whether it completed, re-run upgrader.exe -- it should report that you are up to date.

Step 7 -- Restart the IIS site

Restart the Halo site on IIS, then re-enable the integrator task(s) if you disabled them in step 2:

Import-Module WebAdministration
Start-WebAppPool -Name 'CONFIRM-HaloAppPool'
Start-Website    -Name 'CONFIRM-HaloSiteName'

# Re-enable the integrator scheduled task(s) if they were disabled before the drag-drop.
# «CONFIRM»: adjust the -like pattern if the exe name differs in this deployment.
$integratorTasks = Get-ScheduledTask | Where-Object {
    $_.Actions.Execute -like '*Integrator*'
}

foreach ($task in $integratorTasks) {
    Enable-ScheduledTask -TaskName $task.TaskName -TaskPath $task.TaskPath
}

$integratorTasks | Select-Object TaskName, TaskPath, State

Don't leave the integrator disabled

If you disabled the integrator task(s) to avoid the file-lock in step 2, re-enabling them here is mandatory -- a left-disabled integrator silently stops all scheduled imports and mail processing after the upgrade. See Upgrading the Host OS, step 6 for the same re-enable step in the reboot context.


5. Verification

  1. Check the version in the About window. Navigate to the Halo instance and open the About window (the bottom option of the ? menu, top right). Confirm it shows the new version.
  2. Clear the cache. If the version has not changed or you see irregularities, press Ctrl+F5. Ctrl+F5 also clears the server-side cache, so prefer it (per On-Prem Upgrade -- Troubleshooting, s3). The upgrade guide (s2) also mentions Shift+F5 and logging out and back in, but Ctrl+F5 is preferred because it clears the server-side cache.
  3. Confirm the agent portal loads on login. If it does not, check the API info: append /api/instanceinfo to the base URL.
  4. Confirm the integrator runs without errors and is on the same version as the DB and WebApp (the integrator is bundled with the upgrader files; if it was relocated it is not auto-updated -- per s5).

Verification checklist

  • About window shows the new version
  • Ctrl+F5 performed (server-side cache cleared)
  • Agent portal loads on login
  • /api/instanceinfo returns instance details
  • Integrator runs and matches the DB/WebApp version

6. Troubleshooting

Derived from On-Prem Upgrade -- Troubleshooting (s3) and DB Integrator -- Troubleshooting (s4).

Version not changing / irregularities in the new version

Clear the cache with Ctrl+F5 (clears the server-side cache, unlike a normal browser refresh). You can also force a cache clear via the URL parameter:

«CONFIRM: base URL»/api/instanceinfo?clear_cache=true

If the version still does not change, continue with the items below.

Web App does not work -- missing .json MIME type

The WebApp may be missing a .json MIME type at the IIS server level. In IIS Manager, navigate to Server level > MIME Types. If .json is missing, click Add... and add it.

IronSoftware login loop (e.g. upgrade 2.126 -> 2.132)

A login loop after upgrade indicates a permissions gap. Manually create the folder below and grant the IIS web-app user permission to modify it:

C:\Windows\System32\config\systemprofile\AppData\Local\IronSoftware

Grant IIS_IUSRS Full control on that folder (the IIS_IUSRS user may already be listed). You can also set this on the api folder within the Halo folder via right-click > Properties > Security.

Permission error on the Integrator file during drag-drop

Task Scheduler is running a scheduled integrator task and has locked the file to prevent it being ended mid-run. Either wait for the task to finish, or end the running task in Task Scheduler, then retry the drag-drop. (Disabling the integrator task before the drag-drop -- step 2 -- avoids this.)

Upgrader error: 'Incorrect Syntax near INDEX...'

The SQL Server version is pre-2016 and no longer supported by Halo. All on-prem deployments must be SQL Server 2016 or above. To recover: revert to the previous Halo version (see Rollback), upgrade SQL Server to 2016+, then re-attempt the Halo upgrade.

Upgrader error: 'Upgrading to the net version requires the X service to be active'

The target version no longer supports NHServer and requires the new (NHServerless) services. The named service refers to a Backend Services toggle under Configuration > Advanced Settings > Backend Services -- not services.msc:

Error names Enable this toggle
"...requires the Event service to be active" Event Service
"...requires the Incoming service to be active" Incoming Service
"...requires the Outgoing service to be active" Outgoing Service
"...requires the Scheduling service to be active" Scheduling Service

The easiest path is to upgrade to Security patch 2.174.111 first, then move to the new services and set them up before continuing the upgrade.


7. Rollback

If the upgrade fails and cannot be resolved within the window:

  1. Restore the database backup taken in the prerequisites.
  2. Revert the Halo version by restoring the previous WebApp files (or revert the VM snapshot of the Application Server). Re-apply your preserved custom web.config headers if you restored individual files.
  3. Restart the IIS site and re-enable the integrator task(s).
  4. Run the Verification section against the restored version to confirm it is healthy.

SQL-version-driven rollback

If the rollback is because of the "Incorrect Syntax near INDEX" error, revert to the previous Halo version and upgrade SQL Server to 2016+ before attempting the Halo upgrade again -- the upgrade cannot succeed on pre-2016 SQL.


8. Escalation

Escalate to role/queue owners rather than improvising fixes inside the outage:

Situation Escalate to
upgrader.exe fails and the cause is unclear «CONFIRM: Halo application owner / platform queue»
"Incorrect Syntax near INDEX" (unsupported SQL version) «CONFIRM: database administration queue»
NHServerless / Backend Services migration required mid-upgrade «CONFIRM: Halo application owner»
Integrator version mismatch or "Decryption check failed" after upgrade «CONFIRM: Halo application owner»
Upgrade must be rolled back «CONFIRM: change-approval owner»
upgrader.exe defect, or a bug in the new version Halo support — support.haloservicedesk.com

Halo vendor support

The same portal you download versions from -- support.haloservicedesk.com -- is where you raise tickets for the Halo application itself: a failing upgrader.exe, a regression in the new version, or behaviour the troubleshooting steps above don't resolve. Escalate there in parallel with your internal owners.