Note: This guide covers deploying the Jarvis application to an Azure VM.
For infrastructure deployment (creating the Azure resources), see:
- Azure Deployment Guide - Automated Bicep deployment (recommended)
- Azure Deployment Strategy - Infrastructure architecture
Before deploying the application, ensure:
- ✅ Azure infrastructure deployed (VM, OpenAI, Speech, etc.)
- Use Bicep templates:
.\scripts\infra\Deploy-Infrastructure.ps1
- Use Bicep templates:
- ✅ Entra ID app registration created
- Use script:
.\scripts\infra\Create-EntraApp.ps1
- Use script:
- ✅ VM configured (.NET Runtime, SSL cert, firewall)
- Use script:
.\scripts\infra\Configure-VM.ps1(run on VM)
- Use script:
- ✅ Environment variables set in Azure Key Vault
- Bot App ID and Password stored
# Build Release
dotnet build JarvisMeetingAssistant.sln -c Release
# Publish (repo-local folder)
dotnet publish .\src\MeetingBot\MeetingBot.csproj -c Release -o .\publish\JarvisApp
# Zip published output (creates JarvisApp.zip at repo root)
Compress-Archive -Path .\publish\JarvisApp\* -DestinationPath .\JarvisApp.zip -Force
-
Copy JarvisApp.zip to VM (RDP drag & drop to Desktop)
-
Extract on VM
Remove-Item -Recurse -Force C:\JarvisApp\* 2>$null
Expand-Archive -Path C:\Users\azureuser\Desktop\JarvisApp.zip -DestinationPath C:\JarvisApp -Force
- Set environment variables (elevated PowerShell)
Thumbprint binding only (import cert into LocalMachine\My first):
setx CERTIFICATE_THUMBPRINT 0DAB25EA7C57208F9D05E9825801E150D33A530B /M
setx APP_PORT 8080 /M
- Start application (non-container, non-service)
cd C:\JarvisApp
dotnet .\MeetingBot.dll
- Validate listeners (second PowerShell)
netstat -ano | findstr :8080
netstat -ano | findstr :443
- Health checks
# HTTP local
Invoke-WebRequest -Uri http://localhost:8080/healthz | Select-Object StatusCode
# HTTPS must use FQDN (cert CN/SAN = jarvis.aicollaborator.net). `https://localhost` would fail trust.
Invoke-WebRequest -Uri https://jarvis.aicollaborator.net/healthz | Select-Object StatusCode
- External TLS check (optional from another machine)
# PowerShell: use Invoke-WebRequest alias-safe form (HEAD request)
Invoke-WebRequest -Uri https://jarvis.aicollaborator.net/healthz -Method Head | Select-Object StatusCode, Headers
# (Optional) If you want native curl instead of PowerShell alias, call curl.exe explicitly:
curl.exe -I https://jarvis.aicollaborator.net/healthz
- Bot callback probe (TLS reachability)
Invoke-WebRequest -Uri https://jarvis.aicollaborator.net/api/calling/callback -Method POST -Body '{}' -ContentType 'application/json'
- (Optional) Update Bot Service endpoint if changed
./scripts/Update-BotEndpoint.ps1 -Endpoint "https://jarvis.aicollaborator.net/api/messages"
- Audio / wake word tests (after successful TLS & callback logs)
Notes:
- Do not use
https://localhostfor certificate validation; hostname must match FQDN. - Re-run steps 1–3 only when code changes; otherwise skip to 4 for redeploy.
- Keep this file updated if steps change.