|
| 1 | +//----------------------------------------------- |
| 2 | +// main.bicep – subscription‑scope entry point |
| 3 | +//----------------------------------------------- |
| 4 | +targetScope = 'subscription' |
| 5 | + |
| 6 | +/*─────────────────────────── |
| 7 | + 1. Core deployment inputs |
| 8 | +───────────────────────────*/ |
| 9 | +@minLength(1) |
| 10 | +@maxLength(64) |
| 11 | +param rgName string |
| 12 | + |
| 13 | +@allowed([ |
| 14 | + 'eastus', 'eastus2', 'westus', 'westus2', 'westcentralus' |
| 15 | + 'northeurope', 'francecentral', 'switzerlandnorth', 'switzerlandwest' |
| 16 | + 'uksouth', 'australiaeast', 'eastasia', 'southeastasia' |
| 17 | + 'centralindia', 'jioindiawest', 'japanwest', 'koreacentral' |
| 18 | +]) |
| 19 | +param location string |
| 20 | + |
| 21 | +@allowed([ 'dev', 'test', 'prod' ]) |
| 22 | +param environment string = 'dev' |
| 23 | + |
| 24 | +param keyVaultName string = 'tutor-kv' |
| 25 | +param subscriptionId string = subscription().subscriptionId |
| 26 | + |
| 27 | +/* ACR settings */ |
| 28 | +@minLength(5) |
| 29 | +@maxLength(50) |
| 30 | +param acrName string = 'tutoracr' |
| 31 | +var acrLoginServer = '${acrName}.azurecr.io' |
| 32 | + |
| 33 | +/*--------- OpenAI ---------*/ |
| 34 | +param openAiAccountName string = 'tutor-openai' |
| 35 | +param openAiCustomDomain string = 'openai-ctr' |
| 36 | +param deployOpenAiAccount bool = true |
| 37 | +param openAiRestore bool = false |
| 38 | +param openAiModelDeployment string = 'tutor-4o' |
| 39 | + |
| 40 | +@allowed([ 'gpt-4o', 'gpt-4o-mini' ]) |
| 41 | +param openAiModelName string = 'gpt-4o' |
| 42 | +param openAiModelVersion string = '2024-11-20' |
| 43 | +param openAiCapacity int = 80 |
| 44 | + |
| 45 | +param speechAccountName string = 'tutor-speech' |
| 46 | +param speechCustomDomain string = 'speech-ctr' |
| 47 | +param deploySpeechAccount bool = true |
| 48 | +param speechRestore bool = false |
| 49 | + |
| 50 | + |
| 51 | +/*──────────── Resources ────────────*/ |
| 52 | +resource tutorRG 'Microsoft.Resources/resourceGroups@2021-04-01' = { |
| 53 | + name: rgName |
| 54 | + location: location |
| 55 | +} |
| 56 | + |
| 57 | +resource keyVault 'Microsoft.KeyVault/vaults@2021-06-01-preview' existing = { |
| 58 | + scope: tutorRG |
| 59 | + name: keyVaultName |
| 60 | +} |
| 61 | + |
| 62 | +/*──────── VNet (returns containerAppsSubnetId) ────────*/ |
| 63 | +module vnetModule './modules/vnet.bicep' = { |
| 64 | + name: 'deployVnet' |
| 65 | + scope: tutorRG |
| 66 | + params: { |
| 67 | + location: location |
| 68 | + envType: environment |
| 69 | + keyVaultReference: keyVault.name |
| 70 | + } |
| 71 | +} |
| 72 | + |
| 73 | +/*──────── Log Analytics ────────*/ |
| 74 | +module logAnalyticsModule './modules/loga.bicep' = { |
| 75 | + name: 'deployLogAnalytics' |
| 76 | + scope: tutorRG |
| 77 | + params: { |
| 78 | + workspaceName: 'tutor-loganalytics' |
| 79 | + location: location |
| 80 | + retentionInDays: 30 |
| 81 | + environment: environment |
| 82 | + keyVaultReference: keyVault.name |
| 83 | + subscriptionId: subscriptionId |
| 84 | + } |
| 85 | +} |
| 86 | + |
| 87 | +/*──────── ACR ────────*/ |
| 88 | +module acrModule './modules/acr.bicep' = { |
| 89 | + name: 'deployContainerRegistry' |
| 90 | + scope: tutorRG |
| 91 | + params: { |
| 92 | + location: location |
| 93 | + environment: environment |
| 94 | + keyVaultReference: keyVault.name |
| 95 | + subscriptionId: subscriptionId |
| 96 | + acrName: acrName |
| 97 | + sku: 'Standard' |
| 98 | + } |
| 99 | +} |
| 100 | + |
| 101 | +/*──────── Cosmos DB (unchanged) ────────*/ |
| 102 | +module cosmosDbModule './modules/cosmos.bicep' = { |
| 103 | + name: 'deployCosmosDb' |
| 104 | + scope: tutorRG |
| 105 | + params: { |
| 106 | + cosmosDbName: 'tutor-cosmosdb' |
| 107 | + location: location |
| 108 | + resourceGroupLocation: tutorRG.location |
| 109 | + environment: environment |
| 110 | + keyVaultReference: keyVault.name |
| 111 | + subscriptionId: subscriptionId |
| 112 | + } |
| 113 | +} |
| 114 | + |
| 115 | +/*──────── Container Apps env + first app ────────*/ |
| 116 | +module containerAppsEnvModule './modules/aca.bicep' = { |
| 117 | + name: 'deployContainerAppsEnv' |
| 118 | + scope: tutorRG |
| 119 | + params: { |
| 120 | + location: location |
| 121 | + infrastructureSubnetId: vnetModule.outputs.containerAppsSubnetId |
| 122 | + logAnalyticsWorkspaceName: logAnalyticsModule.outputs.workspaceName |
| 123 | + envType: environment |
| 124 | + containerAppName: 'tutor-api' |
| 125 | + containerAppImage: '${acrLoginServer}/api:latest' |
| 126 | + acrLoginServer: acrLoginServer |
| 127 | + } |
| 128 | +} |
| 129 | + |
| 130 | +/*──────── Azure OpenAI ────────*/ |
| 131 | +module openAiModule './modules/aoai.bicep' = { |
| 132 | + name: 'deployAzureOpenAI' |
| 133 | + scope: tutorRG |
| 134 | + params: { |
| 135 | + aiServiceAccountName: openAiAccountName |
| 136 | + deployAccount: deployOpenAiAccount |
| 137 | + restore: openAiRestore |
| 138 | + location: location |
| 139 | + customSubDomainName: openAiCustomDomain |
| 140 | + subnetId: vnetModule.outputs.containerAppsSubnetId |
| 141 | + modelDeploymentName: openAiModelDeployment |
| 142 | + modelName: openAiModelName |
| 143 | + modelVersion: openAiModelVersion |
| 144 | + capacity: openAiCapacity |
| 145 | + tags: { project: 'TheTutor', environment: environment } |
| 146 | + } |
| 147 | +} |
| 148 | + |
| 149 | +/*──────── Speech Services ────────*/ |
| 150 | +module speechModule './modules/speech.bicep' = { |
| 151 | + name: 'deploySpeech' |
| 152 | + scope: tutorRG |
| 153 | + params: { |
| 154 | + speechAccountName: speechAccountName |
| 155 | + deployAccount: deploySpeechAccount |
| 156 | + restore: speechRestore |
| 157 | + location: location |
| 158 | + customSubDomainName: speechCustomDomain |
| 159 | + subnetId: vnetModule.outputs.openAiSubnetId |
| 160 | + tags: { project: 'TheTutor', environment: environment } |
| 161 | + } |
| 162 | +} |
| 163 | + |
| 164 | +// ================================================================= |
| 165 | +// Module: Azure Static Web App (enforces HTTPS and CORS policies) |
| 166 | +// ================================================================= |
| 167 | +module staticWebApp './modules/staticwapp.bicep' = { |
| 168 | + name: 'deployStaticWebApp' |
| 169 | + scope: tutorRG |
| 170 | + params: { |
| 171 | + location: location |
| 172 | + repositoryUrl: 'https://github.com/Azure-Samples/tutor.git' |
| 173 | + environment: environment |
| 174 | + keyVaultReference: keyVault.name |
| 175 | + } |
| 176 | +} |
0 commit comments