Skip to content

Manual Install Deploy Binaries

Sam Betts edited this page Aug 12, 2026 · 2 revisions

Manual installation - stage 2 of 3. Prev: 1. Azure resources | Overview | Next: 3. Web tracking & config

Publish the Website and WebJobs through Kudu

App Service accepts a single ZIP deployment through its SCM/Kudu endpoint over HTTPS. Build one package containing the website at the root and both continuous WebJobs under app_data/jobs/continuous.

Sign in to Azure CLI, select the target subscription, and run the following PowerShell from the directory containing Website.zip, AppInsightsImporter.zip, and Office365ActivityImporter.zip:

$staging = Join-Path $PWD "AppServiceDeployment"
$webJobs = Join-Path $staging "app_data\jobs\continuous"
$extractRoot = Join-Path $PWD "AppServiceDeploymentSource"

Remove-Item $staging -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item $extractRoot -Recurse -Force -ErrorAction SilentlyContinue
New-Item $webJobs -ItemType Directory -Force | Out-Null
New-Item $extractRoot -ItemType Directory -Force | Out-Null

function Get-ComponentRoot([string]$zipPath, [string]$name) {
    $destination = Join-Path $extractRoot $name
    Expand-Archive $zipPath -DestinationPath $destination -Force
    $root = Get-Item $destination
    while ($root.GetFiles().Count -eq 0 -and $root.GetDirectories().Count -eq 1) {
        $root = $root.GetDirectories()[0]
    }
    return $root
}

$websiteRoot = Get-ComponentRoot .\Website.zip "Website"
Copy-Item "$($websiteRoot.FullName)\*" $staging -Recurse -Force

foreach ($webJobName in @("Office365ActivityImporter", "AppInsightsImporter")) {
    $webJobRoot = Get-ComponentRoot ".\$webJobName.zip" $webJobName
    $destination = Join-Path $webJobs $webJobName
    New-Item $destination -ItemType Directory -Force | Out-Null
    Copy-Item "$($webJobRoot.FullName)\*" $destination -Recurse -Force
}

$deploymentZip = Join-Path $PWD "AppServiceDeployment.zip"
Remove-Item $deploymentZip -Force -ErrorAction SilentlyContinue
Compress-Archive -Path "$staging\*" -DestinationPath $deploymentZip

az webapp deploy `
  --resource-group "<resource-group>" `
  --name "<app-name>" `
  --src-path $deploymentZip `
  --type zip

Before deployment, inspect the staging directory. Its important paths must be:

AppServiceDeployment\
  <website files>
  app_data\
    jobs\
      continuous\
        Office365ActivityImporter\
          <web-job files>
        AppInsightsImporter\
          <web-job files>

Some release ZIP tools add an extra parent directory. If that happens, move the contents up so the structure matches the example before creating AppServiceDeployment.zip.

The deployment uses HTTPS/443 and does not require FTP credentials or passive FTP ports. Verify both continuous WebJobs appear in the App Service WebJobs blade.

Verify the website worked by visiting the app-service URL, after configuring the app service below. See Verify for how to verify the app-service.

Configure App Service Connection Strings & App Settings

Finally, with everything prepared, we need to configure the app service with the same configuration used with the web-jobs before.

  1. Configure settings for web-jobs.
    1. Open "configuration" section of app-service.

      1. Under "general settings" Make sure "always on" is enabled.

        A screenshot of a computer Description automatically generated

    2. Configure "environment variables" from the Configuration inventory.

A screenshot of a computer Description automatically generated

Ignore any value not inside the red brackets (‘WEBSITE_NODE_DEFAULT_VERSION’ for example)

The app-service configuration is common for both web-jobs.

Note: if you are using the installer with VNet integration enabled, the installer also adds the WEBSITE_VNET_ROUTE_ALL=1 and WEBSITE_DNS_SERVER=168.63.129.16 app settings. If you are configuring the app service manually behind a VNet with private endpoints, set these values yourself so the app service routes outbound traffic through the integration subnet and resolves the private DNS zones correctly.


Next: Stage 3 - Web tracking and final configuration.

Clone this wiki locally