Installing Cloud Application Gateway
This section provides detailed information on the prerequisites, installation, registration, and optional configuration of the CAG.
System requirements
The following general and deployment-method-specific requirements need to be fulfilled to properly operate the CAG.
The Provisioning Worker Service and Import Worker Service each consume between 30 to 50 MB of memory when in the idle state. Each individual Provisioning Worker utilizes around 10 MB of memory when in idle state, with the demanded capacity increasing with running imports or performed provisioning tasks. It is especially impacted by large amounts of data imports with CustomRowFilter
configured that might also contain nested URLs.
General conditions
Before you initiate the deployment process, make sure that the following conditions are met:
- Operating System - Windows Server 2022 is required, with all editions supported
- .Net Framework - Version 4.8 is required for the legacy libraries and integrations
- ASP.NET Runtime - Version 8.0x is required
Deployment-specific conditions
The following conditions must be met based on the chosen deployment variant.
- Physical server installation
- Virtual machine installation
- Fulfill the general conditions.
- Copy the application files and follow the deployment script or initiate the installer.
- Configure the Windows Firewall and, if it applies, the Internet Information Services (IIS).
- Provision a virtual machine with a minimum capacity of:
- 2 vCPUs
- 16 GB of RAM
- 20 GB of memory drive
- Ensure that the available bandwidth is between 10 and 12 Mbps.
- Use a supported virtualization hypervisor, for example, the VMware ESXi or Hyper-V.
- Copy the application files and follow the deployment script or initiate the installer.
- Configure the Windows Firewall and, if it applies, the Internet Information Services (IIS).
Following measurements are basis for the deployment conditions.
CPU and memory utilization
Activity | CPU usage (%) | Memory (MB) |
---|---|---|
Idle | 0.1 | 40 |
Light Load (20 rec/min) | 2–3 | 45–50 |
Nominal Load (80 rec/min) | ~7 | ~60 |
High Load (160 rec/min)* | ~12–14 | ~70 |
Per instance bandwidth summary
Load level | Records/min | Total KB/s |
---|---|---|
Idle | 0 | 0.217 |
Light | 20 | 3.58 |
Medium | 80 | 13.78 |
High | 160 | 27.45 |
Heavy | 320 | 54.58 |
Total bandwidth for 20 instances
Load level | Total KB/s | Total Mbps |
---|---|---|
Idle | 0.217 × 20 = 4.34 KB/s | ~0.034 Mbps |
Light | 3.58 × 20 = 71.6 KB/s | ~0.56 Mbps |
Medium | 13.78 × 20 = 275.6 KB/s | ~2.15 Mbps |
High | 27.45 × 20 = 549.0 KB/s | ~4.29 Mbps |
Heavy | 54.58 × 20 = 1,091.6 KB/s | ~8.54 Mbps |
System resources estimates for 20 instances
Mode | Total CPU usage (all cores) | Total RAM usage |
---|---|---|
Idle | ~2% (20 × 0.1%) | ~800 MB (20 × 40 MB) |
Active | ~140% (20 × 7%) | ~1.3 GB (20 × 60 MB) |
Peak | ~240–280% | ~1.5 GB |
Minimum required permissions for service accounts
By default, the provided PowerShell script registers the Windows Service to run under the Local System context. You can optionally configure the service to run under a dedicated service account instead.
-
Log On as a Service
The service account must be granted “Log on as a service” user right to run Windows services.
-
NTFS File System Permissions
-
Assign the following file permissions to the service account on relevant directories:
- Read, Write, Modify, Delete
-
Apply to:
-
Service installation directories
-
Worker process directories
-
Connectivity package directories
-
Backup directory
-
noteEnsures operational access for read/write, configuration changes, and file management.
-
-
Service Control Rights
The service must be able to start and stop itself. Ensure necessary Start/Stop service permissions are granted.
-
Private Key Access
-
Provide the service account with access to key material required for private key usage.
-
Refer to the Registration process documentation for exact file or store locations.
-
-
Trusted Certificate Authority
-
The host system must trust the internal CA that signs service binaries and scripts.
-
Import the CA’s public certificate into trusted root certification authorities store.
-
Credentials for each source or target system are managed during system onboarding in Omada Identity Cloud.
For details on required permissions, go to the Connectors section.
Installing Cloud Application Gateway
Installation and enabling the CAG solution consists of the following main steps:
Downloading Cloud Application Gateway components
For guidance on how to enable or migrate to the CAG solution, contact the Omada Support.
The solution is available for download from the Cloud Management Portal for Horizons-enabled instances.
-
Go to the environment overview and from the extended view, download the
.zip
format file for the CAG. -
Unpack the .zip format file and run the installer following the instructions.
After downloading the package from the Cloud Management Portal, extract all files to the desired location.
CAG is organized into three subfolders:
- Connectivity - contains the required libraries for all the Connectivity Packages provided by Omada
- Import - contains the required files for the Import Worker Service
- Provisioning - contains the required files for the Provisioning Worker Service
Do not change the folder structure.
Refer to the prerequisites sections in the Connectors documentation for any drivers that might be required to be installed on the server where you have deployed the CAG.
Registration
Before the initial startup, the CAG requires registration to the Omada Identity Cloud.
For guidelines on the registration process, go to the Security documentation.
Registering Worker Services
The Cloud Application Gateway consists of two main components: the Import Worker Service and the Provisioning Worker Service. Both services can be operated in two ways:
- As a command-line application (useful for troubleshooting)
- As an installed Windows service (recommended deployment)
Each service has to be initiated individually.
- Import Worker Service
- Provisioning Worker Service
- Console mode - the service is started from the
Import\Worker Service\Omada.Identity.Import.WorkerService.exe
file. - Windows service - to add it as a Windows service execute the
Import\WorkerSetup.ps1
script with administrative rights.
- Console mode - the service is started from the
Provisioning\Worker Service\Omada.Identity.Provisioning.WorkerService.exe
file. - Windows service - to add it as a Windows service execute the
Provisioning\WorkerSetup.ps1
script with administrative rights.
Make sure that service account used to set-up Import and Provisioning worker services, as Windows services, is the same used for registering the private key.
Additional configuration
Here you can find configuration guidelines for some of the CAG features.
Over-the-air upgrade
When an upgrade is available, the update process is conducted automatically on any local CAG instance.
You can configure the time interval for services to check for available updates in the following places:
-
For the Provisioning worker:
appsettings.Customer.json
Example value
{
"AutoUpdate" : {
"IntervalSeconds" : "15"
}
} -
For the Import worker:
apsettings.json
Example value
{
"ServiceConfiguration" : {
"AutoUpdateInterval" : "15"
}
}
For both examples the auto-update check is configured to happen every 15 seconds.
Setting the value to 0 results in disabling the auto-update feature. It can result in the Cloud Application Gateway not working properly if the last updated version is no longer supported.
It includes the creation of a backup of the currently installed version of the Worker Service. You can define where the backup is stored by configuring the History.Path
in the appsettings.json
file.
"History": {
"Path": "../OmadaProvisioningWorkerHistory"
}
Proxy support
You can configure proxy connection in the appsettings.json
, for importing, to connect with the target system. It is not used when communicating with the Horizons Cloud Services.
{
"Proxy" : {
"Address": "http://proxy.example.com:8080", // Proxy server address
"Username": "user", // Username for proxy authentication
"Password": "password", // Password for proxy authentication
"BypassOnLocal": false, // Determines if proxy should be skipped on local request
"BypassHosts": [] // Hosts to bypass, can be an array of strings or regex patterns
}
}
Heartbeat mechanism
Heartbeat is applied to both the Import Worker and Provisioning Worker.
- Import Worker
- Provisioning Worker
Default interval is set to 5 minutes and can be configured in the appsettings.json
file.
parameter | value |
---|---|
File | appsettings.json |
Section | serviceconfiguration |
Key | HeartbeatIntervalMinutes |
"serviceconfiguration": {
"HeartbeatIntervalMinutes": 5
}
Default interval is set to 5 minutes and can be configured in the appsettings.json
file.
parameter | value |
---|---|
File | appsettings.json |
Section | HeartbeatSettings |
Key | IntervalMinutes |
"HeartbeatSettings": {
"IntervalMinutes": 5
}
To apply changes to the appsettings.json
file, restart the service.
You can adjust both intervals to accommodate performance or monitorin needs.
Heartbeat widget in the Operations dashboard
To enable the Heartbeat widget in the Operations Dashboard, go to Setup -> Dashboards and edit the configuration by adding the below section to the xml.
{
name: 'SystemHeartbeats',
refreshRate: 3600,
title: S_OperationsDashboard_Text_SystemHeartbeatsWidget_Name,
infoText: S_OperationsDashboard_Text_SystemHeartbeatsWidget_Info,
hideTitle: false,
height: 440,
params: { },
isHiddenEvaluator: function() { return !appPageVars.useCAG; }
}
Logging
Logs for worker process, import and provisioning Worker Services are stored in log targets. You can set them in the XML-based LogConfiguration
of the appsetting.Customer.json
file, where you specify the targets.
You can find more information on how to set the LogConfiguration
in the Event logging section.
Message: Import Worker Service is available
Metadata:
- ipAddress
- machineName
- serviceName
- timestamp
- uptime
- version
Instance groups
Instance groups allow you to organize your systems based on shared characteristics such as infrastructure, for example Azure-hosted systems. All newly onboarded systems are automatically assigned to the Default instance group. Creating additional instance groups enables more efficient resource allocation and improves overall CAG performance.
- To access instance groups, go to Setup>Connectivity configuration>Cloud Application Gateway Instance Groups.

- There you can see a list of existing instance groups.

- You can add new group
- You can edit exisiting group
- To assign a system to an instance group, configure the Cloud Application Gateway instance setting in the General setting of a system.

-
To assign a Provisioning Worker Service to an instance group, configure the InstanceId value in the CloudApplicationGatewayConfiguration section in the file appsettings.Customer.json.
-
To assign an Import Worker Service to an instance group, configure the InstanceId value in the CloudApplicationGatewayConfiguration section in the file appsettings.json.

InstanceGroupId setting
You can access the InstanceGroupId
setting in the appsettings.json
configuration file. By configuring the setting to a specific group ID you can assign the Worker service, either Import or Provisioning, to a specific Instance Group. If you do not configure the InstanceGroupId
setting, it has the Default value.
"CloudApplicationGatewayConfiguration": {
...
"InstanceGroupId": "Default"
}
Only systems assigned to the instance group configured in the InstanceGroupId
setting undergo the staging step and are processed in the import process.
Configuring security
Registration process
In the appsettings.json
file you can choose the storage method of the private key. The following options are available:
-
As a environmental variable
"CloudApplicationGatewayConfiguration" : { ... , "PrivateKeyLocation" : "EnvironmentVariable" }
The private key is stored in
HKEY_CURRENT_USER\Environment\OMADA_CAG_PRIVATEKEY
location, with the value encrypted.ImportantThe command setting the key storage value to
EnvironmentalVariable
has to be performed from the same account that is selected to run the service.
-
Stored using vault service
"CloudApplicationGatewayConfiguration" : { ... , "PrivateKeyLocation" : "VaultService" }
In PowerShell use the
.\Omada.Identity.Import.WorkerService.exe --Operation=register
. If you prefer to use keys from a certificate, change the command to.\Omada.Identity.Import.WorkerService.exe --Operation=register --FileName="C:\Certs\MyAppCert.pfx"
.ImportantYou can use the command for either Import or Provisioning Worker, but not for both.
It is required that the "CloudApplicationGatewayConfiguration":"PrivateKeyLocation"
for import and provisioning worker is set to the same value.
Vault service integration
Vault service integration allows you to securely store and retrieve the private key as a secret in a vault service. CAG workers support the following vault services, each offering multiple authentication methods:
- Azure Key Vault
- Hashicorp
- Managed Identity - applies if the worker is deployed on Azure platform.
- Requires only key vault url address.
- Does not require credentials.
- Is suited for Azure-hosted environments.
- Client credentials - utilizes app registration with
clientId
andclientSecret
.- Requires tenant id, client id, and a client secret.
- Requires client secret to be stored in configuration file.
- TLS certificates - a mTLS authentication with the certificate attached to the request to access vault.
- Requires tenant id, client id, and either certificate path and password (the certificate is taken from the PFX file) or certificate thumbprint with storage location.
- AppRole - method with the required role id and secret id provided in the environment variables.
- Requires vault URL, role id, and a secret id.
- Vault agent - based on a token retrieved from the location specified by the vault agent.
- Requires vault URL and token file path, where vault agent saves the token.
- TLS certificate - mTLS authentication with the certificate attached to the request to access vault.
- Requires vault URL, certificate path, and certificate password (the certificate is taken from the PFX file) or certificate thumbprint with storage location.
- JWT or OIDC - based on a token from the identity provider.
- Requires vault URL and a toke.
For more information, go to the Vault Service section.
To replace the existing private key, include the --Force=true
component in the command, for example .\Omada.Identity.Import.WorkerService.exe --Operation=register --Force=true
. Beforehand, unregister the public key with the assistance of the Omada support and make sure that you have a confirmation that it was successful. Otherwise, the attempt to replace private key results in an error.
The --Force=true
option only works if the public key is unregistered and you have expired private key stored.
After the change the worker is not initiated automatically. To do so, run it without any parameters.
Key Export and Import for EnvironmentVariable Storage Type
When using the EnvironmentVariable
storage type, and migrating Cloud Application Gateway (CAG) workers to a different machine, you need to manually export and import the private key.
This step is not required when using the VaultService storage type, as vaults are accessible across multiple machines.
- Exporting the key on the source machine
- Importing the key on the target machine
Use the following command to export the key:
.\Omada.Identity.Import.WorkerService.exe --Operation=export --FileName="Cag_Key"
this generates a file named Cag_Key.omadaKey
.
Transfer the .omadakey file to the target machine, then run:
.\Omada.Identity.Import.WorkerService.exe --Operation=import --FileName="Cag_Key.omadakey"
The --FileName
parameter can be either:
-
A relative path to the current working directory, or
-
An absolute path to the .omadakey file.