@aifabrix/builder 2.61.2 → 2.62.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api/applications.api.js +22 -2
- package/lib/api/bootstrap-snapshot.api.js +115 -0
- package/lib/app/deploy.js +14 -5
- package/lib/app/run-env-compose.js +5 -6
- package/lib/app/run.js +6 -4
- package/lib/build/standard-docker-build.js +4 -0
- package/lib/channels/channel-artifact-generator.js +13 -3
- package/lib/cli/infra-guided-footers.js +10 -8
- package/lib/cli/infra-guided.js +30 -10
- package/lib/cli/setup-infra-up-platform-action.js +14 -1
- package/lib/cli/setup-platform.js +2 -0
- package/lib/commands/auth-config.js +2 -0
- package/lib/commands/login.js +4 -0
- package/lib/commands/repair-datasource-apply.js +3 -1
- package/lib/commands/repair-datasource-legacy.js +94 -0
- package/lib/commands/setup-image-refresh.js +26 -0
- package/lib/commands/setup-modes.js +7 -1
- package/lib/commands/setup-prompts-platform-mode.js +34 -0
- package/lib/commands/setup.js +3 -0
- package/lib/commands/up-builder-api.js +24 -8
- package/lib/commands/up-common.js +16 -1
- package/lib/commands/up-dataplane-bootstrap.js +70 -14
- package/lib/commands/up-dataplane-credentials.js +21 -0
- package/lib/commands/up-dataplane.js +37 -18
- package/lib/commands/up-integration-server.js +112 -0
- package/lib/commands/wizard-config-normalizer.js +5 -1
- package/lib/core/admin-secrets-env-overlay.js +8 -3
- package/lib/core/environment-access-policy.js +121 -0
- package/lib/core/environment-mode-policy.js +177 -0
- package/lib/core/local-env-overrides.js +149 -0
- package/lib/core/secrets-ensure.js +4 -2
- package/lib/core/secrets-env-content.js +12 -9
- package/lib/core/secrets-env-write.js +1 -1
- package/lib/datasource/capability/capability-manifest.js +1 -0
- package/lib/deployment/installation/index.js +14 -1
- package/lib/deployment/installation/infra-catalog.js +3 -0
- package/lib/deployment/installation/local-environment-stage.js +285 -0
- package/lib/deployment/installation/local-installation.js +76 -0
- package/lib/deployment/installation/stage-input.js +5 -1
- package/lib/generator/builders.js +3 -1
- package/lib/generator/split-variables.js +2 -2
- package/lib/parameters/database-adoption.js +125 -0
- package/lib/parameters/physical-database-naming.js +136 -0
- package/lib/parameters/physical-secret-name.js +194 -0
- package/lib/parameters/rsa-secret-values.js +165 -0
- package/lib/programmatic/run-channel-install-artifacts.js +28 -2
- package/lib/programmatic/run-channel-package.js +3 -1
- package/lib/programmatic/workspace-context.js +37 -2
- package/lib/schema/infra.parameter.yaml +61 -27
- package/lib/schema/infrastructure-schema.json +213 -120
- package/lib/utils/compose-generate-docker-compose.js +2 -2
- package/lib/utils/compose-generator.js +4 -7
- package/lib/utils/compose-miso-env.js +2 -2
- package/lib/utils/compose-traefik-ingress-base.js +3 -4
- package/lib/utils/declarative-url-ports.js +3 -0
- package/lib/utils/env-environment-file-paths.js +105 -0
- package/lib/utils/environment-scoped-resources.js +48 -14
- package/lib/utils/paths-system-builder-keys.js +7 -1
- package/lib/utils/paths.js +7 -2
- package/lib/utils/postgres-platform-bootstrap.js +35 -1
- package/lib/utils/redis-env-scope.js +21 -1
- package/lib/utils/registry-auth-sources.js +154 -0
- package/lib/utils/registry-credentials.js +131 -14
- package/lib/utils/secrets-generator.js +30 -21
- package/lib/utils/secrets-helpers.js +5 -7
- package/lib/utils/secrets-kv-scope.js +127 -28
- package/lib/utils/secrets-materialize-local.js +9 -0
- package/lib/utils/secrets-missing-error.js +35 -1
- package/lib/utils/token-manager.js +14 -8
- package/lib/utils/url-public-path-prefix.js +6 -10
- package/package.json +3 -2
- package/templates/applications/builder-api/application.yaml +1 -1
- package/templates/applications/dataplane/application.yaml +2 -2
- package/templates/applications/dataplane/env.template +1 -1
- package/templates/applications/integration-server/application.yaml +91 -0
- package/templates/applications/integration-server/env.template +215 -0
- package/templates/applications/mirrored-templates.json +52 -0
- package/templates/applications/miso-controller/application.yaml +43 -1
- package/templates/applications/miso-controller/env.template +45 -39
- package/templates/marketplace/createUiDefinition.json +52 -4
- package/templates/marketplace/main.json +85 -7
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
# [saasDirect] eSystems-hosted SaaS activation (four-step wizard)
|
|
12
12
|
# [customerOwned] Azure-in-tenant activation (existing TA wizard)
|
|
13
13
|
#
|
|
14
|
-
# ONBOARDING_MODE selects the onboarding step list.
|
|
14
|
+
# ONBOARDING_MODE selects the onboarding step list. saasDirect also enables the local wizard.
|
|
15
|
+
# It is orthogonal to DEPLOYMENT,
|
|
15
16
|
# which selects Azure SDK vs local execution. There is NO fifth DEPLOYMENT value:
|
|
16
17
|
# eSystems-hosted SaaS still runs DEPLOYMENT=azure. See the DEPLOYMENT TYPE and
|
|
17
18
|
# ONBOARDING MODE sections below.
|
|
@@ -40,14 +41,28 @@
|
|
|
40
41
|
# Optional custom controller key for onboarding (default: miso-controller)
|
|
41
42
|
ONBOARDING_CONTROLLER_KEY=miso-controller
|
|
42
43
|
|
|
43
|
-
# Infrastructure/service name used by controller/onboarding flows
|
|
44
|
-
INFRASTRUCTURE_NAME=${DEV_USERNAME}.${DEV_ROOT_DOMAIN}
|
|
45
|
-
|
|
46
44
|
# Azure region (required for first-time onboarding: controller record / provisioning metadata).
|
|
47
45
|
# Use the region you deploy to (e.g. westeurope, eastus, northeurope). Single env name: LOCATION.
|
|
48
46
|
# Resolved from the platform match; see `platforms` in application.yaml.
|
|
49
47
|
LOCATION={LOCATION}
|
|
50
48
|
|
|
49
|
+
# Which kind of installation this is, for licence binding. Declared, never inferred.
|
|
50
|
+
#
|
|
51
|
+
# `resolveCloudVendor` falls back to "AZURE_SUBSCRIPTION_ID is set, therefore Azure", and every
|
|
52
|
+
# developer box has that variable from the shared development service principal. A local stack was
|
|
53
|
+
# then bound as an Azure installation, which requires a directory tenant AND a resource group; a
|
|
54
|
+
# developer box has no resource group, so licence binding refused and the licence guard returned
|
|
55
|
+
# HTTP 403 for every guarded operation — `app rotate-secret` included, which is precisely the
|
|
56
|
+
# command needed to recover a credential the controller had re-minted.
|
|
57
|
+
#
|
|
58
|
+
# Resolved from the platform match: `docker` locally, `azure` for every real resource group.
|
|
59
|
+
CLOUD_VENDOR={CLOUD_VENDOR}
|
|
60
|
+
|
|
61
|
+
# The one installation name the licence binds to (plan 266.0). Not a label: Miso sends it to Mori
|
|
62
|
+
# as `resourceGroupName`, and docker requires exactly `local-dev{NN}` or registration refuses.
|
|
63
|
+
# `${DEV_USERNAME}` yields `local-dev03`. It is the only name a local install declares.
|
|
64
|
+
MISO_INSTALLATION_NAME=local-${DEV_USERNAME}
|
|
65
|
+
|
|
51
66
|
# Required for admin user creation during onboarding
|
|
52
67
|
# Password for the initial administrator user (username: admin)
|
|
53
68
|
ONBOARDING_ADMIN_PASSWORD=kv://miso-controller-admin-passwordKeyVault
|
|
@@ -151,7 +166,6 @@ KEYCLOAK_CLIENT_ID=kv://keycloak-client-idKeyVault
|
|
|
151
166
|
KEYCLOAK_CLIENT_SECRET=kv://keycloak-client-secretKeyVault
|
|
152
167
|
KEYCLOAK_ADMIN_USERNAME=admin
|
|
153
168
|
KEYCLOAK_ADMIN_PASSWORD=kv://keycloak-admin-passwordKeyVault
|
|
154
|
-
KEYCLOAK_PUBLIC_KEY=
|
|
155
169
|
KEYCLOAK_VERIFY_AUDIENCE=false
|
|
156
170
|
KEYCLOAK_TOKEN_TIMEOUT=5000
|
|
157
171
|
KEYCLOAK_DEFAULT_PASSWORD=kv://keycloak-default-passwordKeyVault
|
|
@@ -291,12 +305,12 @@ DEPLOYMENT=database
|
|
|
291
305
|
#
|
|
292
306
|
# customerOwned = Azure-in-tenant wizard
|
|
293
307
|
# consent → identity → size → access-model → endpoint → validation
|
|
294
|
-
# saasDirect =
|
|
295
|
-
# consent →
|
|
308
|
+
# saasDirect = hosted or local Docker guided activation
|
|
309
|
+
# consent → endpoint (local browser URL or optional domain) → identity → review
|
|
296
310
|
# Omits size, access-model, customer deploy and platform-apps.
|
|
297
311
|
#
|
|
298
312
|
# Unset defaults to customerOwned. An unknown value fails closed with HTTP 400.
|
|
299
|
-
ONBOARDING_MODE=
|
|
313
|
+
ONBOARDING_MODE=saasDirect
|
|
300
314
|
|
|
301
315
|
# Dev/test: show TA Entra "Completing setup" countdown (120s cap). Default false.
|
|
302
316
|
# Exposed to UI via GET /api/v1/tenant/status → showTaCountdown (restart controller after change).
|
|
@@ -311,9 +325,10 @@ SHOW_TA_COUNT_DOWN=false
|
|
|
311
325
|
ENCRYPTION_KEY=kv://miso-controller-secrets-encryptionKeyVault
|
|
312
326
|
|
|
313
327
|
# Comma-separated application keys allowed for POST .../applications/bootstrap (install-time only).
|
|
314
|
-
# Environment placement is a separate controller rule: workloads (dataplane,
|
|
315
|
-
# dev/tst/pro but never `miso`; miso-controller
|
|
316
|
-
|
|
328
|
+
# Environment placement is a separate controller rule: workloads (dataplane, customer apps) install
|
|
329
|
+
# into dev/tst/pro but never `miso`; miso-controller, keycloak, builder-api, and integration-server
|
|
330
|
+
# only into `miso`; mori-controller anywhere.
|
|
331
|
+
BOOTSTRAP_APPKEYS=dataplane,builder-api,integration-server,mori-controller
|
|
317
332
|
|
|
318
333
|
# Key Vault Integration (for security parameter encryption)
|
|
319
334
|
# Set to true to enable Azure Key Vault for storing security parameters
|
|
@@ -384,6 +399,25 @@ ENTRA_GRAPH_DELEGATED_REDIRECT_URI=url://mori-controller-public/entra-graph-dele
|
|
|
384
399
|
# MORI_API_KEY is per-installation and is minted by POST /marketplace/bootstrap; it is written
|
|
385
400
|
# here by the controller after registration, not provisioned ahead of it.
|
|
386
401
|
MORI_BASE_URL={MORI_BASE_URL}
|
|
402
|
+
|
|
403
|
+
# Mori's policy signing ANCHOR, public half. Verifies the signed enforcement bundle.
|
|
404
|
+
#
|
|
405
|
+
# Mori holds the private half and signs with it; this is the key the bundle is checked against, so
|
|
406
|
+
# an installation that could write it could trust a bundle it signed itself. It is supplied, never
|
|
407
|
+
# generated: on Azure the deployment template writes `mori-policy-public-keyKeyVault` into the
|
|
408
|
+
# installation vault. Locally it is per developer, because each box's Mori holds its own pair.
|
|
409
|
+
#
|
|
410
|
+
# `pnpm license:sign:local` reads it from here so the command needs no arguments. Export the public
|
|
411
|
+
# half from the local Mori once:
|
|
412
|
+
#
|
|
413
|
+
# docker exec aifabrix-dev${NN}-mori-controller node -e "const {createPublicKey}=require('crypto');\
|
|
414
|
+
# process.stdout.write(createPublicKey(process.env.MORI_POLICY_PRIVATE_KEY.replace(/\\n/g,'\n'))\
|
|
415
|
+
# .export({type:'spki',format:'pem'}).toString())"
|
|
416
|
+
#
|
|
417
|
+
# Empty is valid: an installation with no anchor cannot verify a bundle and says so, rather than
|
|
418
|
+
# accepting one signed by any key.
|
|
419
|
+
MORI_POLICY_PUBLIC_KEY=
|
|
420
|
+
MORI_POLICY_KEY_ID={POLICY_KEY_ID}
|
|
387
421
|
MORI_API_KEY=kv://mori-controller-api-keyKeyVault
|
|
388
422
|
# Ask Mori for a container-registry credential when the installation was given none.
|
|
389
423
|
# Off by default: the call has a 30s timeout inside credential resolution, so enabling it on an
|
|
@@ -417,37 +451,9 @@ APPLICATIONINSIGHTS_CONNECTION_STRING=kv://appinsights-connectionStringKeyVault
|
|
|
417
451
|
# OpenTelemetry service name (optional, defaults to miso-controller)
|
|
418
452
|
OTEL_SERVICE_NAME=miso-controller
|
|
419
453
|
|
|
420
|
-
# OpenTelemetry service version (optional, defaults to npm_package_version or 1.0.0)
|
|
421
|
-
OTEL_SERVICE_VERSION=
|
|
422
|
-
|
|
423
454
|
# =============================================================================
|
|
424
455
|
# STORAGE CONFIGURATION
|
|
425
456
|
# =============================================================================
|
|
426
457
|
|
|
427
458
|
# Mount Volume Configuration
|
|
428
459
|
MOUNT_VOLUME=/mnt/data/
|
|
429
|
-
|
|
430
|
-
# Image registry this installation deploys from.
|
|
431
|
-
#
|
|
432
|
-
# `pipeline-validation-flow.helper.ts` resolves the deploy registry as ACR_LOGIN_SERVER first, then
|
|
433
|
-
# the controller record's `configuration.imageRegistry`. Azure installations get the record from the
|
|
434
|
-
# installer, so this stays EMPTY there and behaviour is unchanged. A local installation matches no
|
|
435
|
-
# platform (`allowLocalPlatform` is false for the controller) and has no record, so without this key
|
|
436
|
-
# every `aifabrix deploy` fails with "Image registry is not configured on the controller
|
|
437
|
-
# installation".
|
|
438
|
-
#
|
|
439
|
-
# EMPTY on purpose. The controller record is read AFTER this and overwrites it, so an Azure
|
|
440
|
-
# installation ignores whatever stands here; only a local installation consumes it.
|
|
441
|
-
#
|
|
442
|
-
# This briefly shipped as `aifabrixce16.azurecr.io` — one test installation's registry, committed
|
|
443
|
-
# into the product, so every developer who did not override it would have pushed and pulled
|
|
444
|
-
# against ce-16 without being told. A `{ACR_LOGIN_SERVER}` token was tried instead and is worse
|
|
445
|
-
# still: nothing resolves it without a resource group, so it breaks `aifabrix build` outright
|
|
446
|
-
# ("no platform or environment configuration resolves it for environment dev").
|
|
447
|
-
#
|
|
448
|
-
# Empty is the honest third answer. An Azure installation is unaffected, and a local
|
|
449
|
-
# `aifabrix deploy` fails with "Image registry is not configured on the controller installation",
|
|
450
|
-
# which names the missing thing. Its proper home is the Builder run tooling, which already knows
|
|
451
|
-
# the answer (`aifabrix dev print-registry`) and should inject it per developer rather than have
|
|
452
|
-
# Miso ship one installation's registry to everybody.
|
|
453
|
-
ACR_LOGIN_SERVER=
|
|
@@ -5,19 +5,44 @@
|
|
|
5
5
|
"parameters": {
|
|
6
6
|
"config": {
|
|
7
7
|
"basics": {
|
|
8
|
-
"description": "Choose subscription, resource group, and region above. Under **Application resources Resource group name**, enter your install id (for example `aifabrixpoc02`). That managed resource group name is the naming prefix: resources become `{rg}-miso-asp`, `{rg}-miso-miso`, and so on. Set the Azure **Application name** to the same id when the portal asks. Enter the initial platform administrator password and choose the license below. Container images are pulled with the web apps' managed identities; no registry credential is needed."
|
|
8
|
+
"description": "Choose subscription, resource group, and region above. Under **Application resources Resource group name**, enter your install id (for example `aifabrixpoc02`), using at most 16 lowercase characters. That managed resource group name is the naming prefix: resources become `{rg}-miso-asp`, `{rg}-miso-miso`, and so on. Set the Azure **Application name** to the same id when the portal asks. Enter the initial platform administrator password and choose the license below. Container images are pulled with the web apps' managed identities; no registry credential is needed.",
|
|
9
|
+
"resourceGroup": {
|
|
10
|
+
"constraints": {
|
|
11
|
+
"validations": [
|
|
12
|
+
{
|
|
13
|
+
"regex": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$",
|
|
14
|
+
"message": "Use lowercase letters, digits and single hyphens, starting with a letter. The name becomes the prefix for every resource, and the Key Vault created as {name}-miso-kv must start with a letter and cannot contain consecutive or trailing hyphens."
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"regex": "^.{1,16}$",
|
|
18
|
+
"message": "Use at most 16 characters. The name becomes the prefix for every resource: the Key Vault is created as {name}-miso-kv, and Azure limits a Key Vault name to 24 characters."
|
|
19
|
+
}
|
|
20
|
+
]
|
|
21
|
+
}
|
|
22
|
+
}
|
|
9
23
|
}
|
|
10
24
|
},
|
|
11
25
|
"basics": [
|
|
26
|
+
{
|
|
27
|
+
"name": "adminEmail",
|
|
28
|
+
"type": "Microsoft.Common.TextBox",
|
|
29
|
+
"label": "Administrator email",
|
|
30
|
+
"toolTip": "Email for the initial platform administrator and installation welcome.",
|
|
31
|
+
"constraints": {
|
|
32
|
+
"required": true,
|
|
33
|
+
"regex": "^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$",
|
|
34
|
+
"validationMessage": "Enter a valid email address."
|
|
35
|
+
}
|
|
36
|
+
},
|
|
12
37
|
{
|
|
13
38
|
"name": "adminPassword",
|
|
14
39
|
"type": "Microsoft.Common.PasswordBox",
|
|
15
40
|
"label": "Administrator password",
|
|
16
|
-
"toolTip": "Password for the initial AI Fabrix platform administrator (user admin). PostgreSQL, Keycloak, and encryption secrets are generated automatically and stored in Key Vault
|
|
41
|
+
"toolTip": "Password for the initial AI Fabrix platform administrator (user admin). PostgreSQL, Keycloak, and encryption secrets are generated automatically and stored in Key Vault \u2014 do not reuse this password for infrastructure.",
|
|
17
42
|
"constraints": {
|
|
18
43
|
"required": true,
|
|
19
44
|
"regex": "^.{8,128}$",
|
|
20
|
-
"validationMessage": "Password must be 8
|
|
45
|
+
"validationMessage": "Password must be 8\u2013128 characters."
|
|
21
46
|
},
|
|
22
47
|
"options": {
|
|
23
48
|
"hideConfirmation": false
|
|
@@ -63,6 +88,27 @@
|
|
|
63
88
|
"regex": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
|
|
64
89
|
"validationMessage": "Enter the Marketplace subscription ID as a GUID (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)."
|
|
65
90
|
}
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"name": "installationResourceModel",
|
|
94
|
+
"type": "Microsoft.Common.DropDown",
|
|
95
|
+
"label": "Initial infrastructure",
|
|
96
|
+
"toolTip": "Choose Shared for Community or Standard. Choose Dedicated DEV for Enterprise. This provisions infrastructure before licence issuance; it does not grant licence entitlements.",
|
|
97
|
+
"defaultValue": "Shared (Community / Standard)",
|
|
98
|
+
"constraints": {
|
|
99
|
+
"required": "[equals(basics('licenseChoice'), 'SUBSCRIPTION_ID')]",
|
|
100
|
+
"allowedValues": [
|
|
101
|
+
{
|
|
102
|
+
"label": "Shared (Community / Standard)",
|
|
103
|
+
"value": "shared"
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"label": "Dedicated DEV (Enterprise)",
|
|
107
|
+
"value": "dedicated"
|
|
108
|
+
}
|
|
109
|
+
]
|
|
110
|
+
},
|
|
111
|
+
"visible": "[equals(basics('licenseChoice'), 'SUBSCRIPTION_ID')]"
|
|
66
112
|
}
|
|
67
113
|
],
|
|
68
114
|
"steps": [],
|
|
@@ -71,7 +117,9 @@
|
|
|
71
117
|
"deploymentEnvironment": "evaluation",
|
|
72
118
|
"adminPassword": "[basics('adminPassword')]",
|
|
73
119
|
"licenseEdition": "[if(equals(basics('licenseChoice'), 'SUBSCRIPTION_ID'), basics('licenseSubscriptionKey'), basics('licenseChoice'))]",
|
|
74
|
-
"acrResourceId": "__MARKETPLACE_ACR_RESOURCE_ID__"
|
|
120
|
+
"acrResourceId": "__MARKETPLACE_ACR_RESOURCE_ID__",
|
|
121
|
+
"installationResourceModel": "[if(equals(basics('licenseChoice'), 'SUBSCRIPTION_ID'), basics('installationResourceModel'), if(equals(basics('licenseChoice'), 'ENTERPRISE'), 'dedicated', 'shared'))]",
|
|
122
|
+
"adminEmail": "[basics('adminEmail')]"
|
|
75
123
|
}
|
|
76
124
|
}
|
|
77
125
|
}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"_generator": {
|
|
6
6
|
"name": "bicep",
|
|
7
7
|
"version": "0.47.16.16243",
|
|
8
|
-
"templateHash": "
|
|
8
|
+
"templateHash": "703508813427294425"
|
|
9
9
|
}
|
|
10
10
|
},
|
|
11
11
|
"parameters": {
|
|
@@ -165,6 +165,13 @@
|
|
|
165
165
|
"description": "Mori licence issuer public key in SPKI PEM form. Empty leaves the installation unpinned, and Miso then refuses a licence rather than trusting a key carried inside it."
|
|
166
166
|
}
|
|
167
167
|
},
|
|
168
|
+
"moriPolicyPublicKey": {
|
|
169
|
+
"type": "string",
|
|
170
|
+
"defaultValue": "",
|
|
171
|
+
"metadata": {
|
|
172
|
+
"description": "Mori policy signing anchor public key in SPKI PEM form. A different pair from the licence key. Empty leaves the policy bundle without an independent anchor, so it can only be checked against the key it carries."
|
|
173
|
+
}
|
|
174
|
+
},
|
|
168
175
|
"moriLicenseIssuer": {
|
|
169
176
|
"type": "string",
|
|
170
177
|
"defaultValue": "mori-controller",
|
|
@@ -214,6 +221,21 @@
|
|
|
214
221
|
"description": "License the installation requests from Mori during tenant activation: an edition name (COMMUNITY, STANDARD, ENTERPRISE) or an Azure Marketplace subscription ID (UUID). Plain string — Miso validates it. Emitted as LICENSE_EDITION."
|
|
215
222
|
}
|
|
216
223
|
},
|
|
224
|
+
"adminEmail": {
|
|
225
|
+
"type": "string",
|
|
226
|
+
"minLength": 3,
|
|
227
|
+
"metadata": {
|
|
228
|
+
"description": "Email of the initial platform administrator, used for the installation welcome."
|
|
229
|
+
}
|
|
230
|
+
},
|
|
231
|
+
"installationResourceModel": {
|
|
232
|
+
"type": "string",
|
|
233
|
+
"defaultValue": "shared",
|
|
234
|
+
"allowedValues": ["shared", "dedicated"],
|
|
235
|
+
"metadata": {
|
|
236
|
+
"description": "Initial installation topology, protected by Azure application configuration: shared for CE/SE; dedicated for EE DEV. Does not grant later licence entitlements."
|
|
237
|
+
}
|
|
238
|
+
},
|
|
217
239
|
"onboardingMode": {
|
|
218
240
|
"type": "string",
|
|
219
241
|
"defaultValue": "customerOwned",
|
|
@@ -2216,7 +2238,7 @@
|
|
|
2216
2238
|
"_generator": {
|
|
2217
2239
|
"name": "bicep",
|
|
2218
2240
|
"version": "0.47.16.16243",
|
|
2219
|
-
"templateHash": "
|
|
2241
|
+
"templateHash": "6426728474798954933"
|
|
2220
2242
|
}
|
|
2221
2243
|
},
|
|
2222
2244
|
"parameters": {
|
|
@@ -2409,7 +2431,7 @@
|
|
|
2409
2431
|
"appCommandLine": "start --optimized=false",
|
|
2410
2432
|
"healthCheckPath": "[variables('keycloakHealthCheckPath')]",
|
|
2411
2433
|
"alwaysOn": true,
|
|
2412
|
-
"appSettings": "[concat(createArray(createObject('name', 'WEBSITES_ENABLE_APP_SERVICE_STORAGE', 'value', 'false'), createObject('name', 'WEBSITES_PORT', 'value', '8080'), createObject('name', 'KEYCLOAK_ADMIN', 'value', parameters('keycloakAdminUser')), createObject('name', 'KEYCLOAK_ADMIN_PASSWORD', 'value', format('@Microsoft.KeyVault(SecretUri={0})', reference(resourceId('Microsoft.KeyVault/vaults/secrets', last(split(parameters('keyVaultId'), '/')), format('{0}-keycloak-admin-password', parameters('prefix'))), '2023-07-01').secretUriWithVersion)), createObject('name', 'KC_DB', 'value', 'postgres'), createObject('name', 'KC_DB_URL_HOST', 'value', parameters('postgresServerFqdn')), createObject('name', 'KC_DB_URL_DATABASE', 'value', parameters('postgresDatabaseName')), createObject('name', 'KC_DB_URL_PORT', 'value', '5432'), createObject('name', 'KC_DB_URL', 'value', format('jdbc:postgresql://{0}:5432/{1}', parameters('postgresServerFqdn'), parameters('postgresDatabaseName'))), createObject('name', 'KC_DB_USERNAME', 'value', parameters('postgresAdminLogin')), createObject('name', 'KC_DB_PASSWORD', 'value', format('@Microsoft.KeyVault(SecretUri={0})', reference(resourceId('Microsoft.KeyVault/vaults/secrets', last(split(parameters('keyVaultId'), '/')), format('{0}-postgres-admin-password', parameters('prefix'))), '2023-07-01').secretUriWithVersion)), createObject('name', '
|
|
2434
|
+
"appSettings": "[concat(createArray(createObject('name', 'WEBSITES_ENABLE_APP_SERVICE_STORAGE', 'value', 'false'), createObject('name', 'WEBSITES_PORT', 'value', '8080'), createObject('name', 'KEYCLOAK_ADMIN', 'value', parameters('keycloakAdminUser')), createObject('name', 'KEYCLOAK_ADMIN_PASSWORD', 'value', format('@Microsoft.KeyVault(SecretUri={0})', reference(resourceId('Microsoft.KeyVault/vaults/secrets', last(split(parameters('keyVaultId'), '/')), format('{0}-keycloak-admin-password', parameters('prefix'))), '2023-07-01').secretUriWithVersion)), createObject('name', 'KC_DB', 'value', 'postgres'), createObject('name', 'KC_DB_URL_HOST', 'value', parameters('postgresServerFqdn')), createObject('name', 'KC_DB_URL_DATABASE', 'value', parameters('postgresDatabaseName')), createObject('name', 'KC_DB_URL_PORT', 'value', '5432'), createObject('name', 'KC_DB_URL', 'value', format('jdbc:postgresql://{0}:5432/{1}', parameters('postgresServerFqdn'), parameters('postgresDatabaseName'))), createObject('name', 'KC_DB_USERNAME', 'value', parameters('postgresAdminLogin')), createObject('name', 'KC_DB_PASSWORD', 'value', format('@Microsoft.KeyVault(SecretUri={0})', reference(resourceId('Microsoft.KeyVault/vaults/secrets', last(split(parameters('keyVaultId'), '/')), format('{0}-postgres-admin-password', parameters('prefix'))), '2023-07-01').secretUriWithVersion)), createObject('name', 'KC_HOSTNAME_STRICT', 'value', 'false'), createObject('name', 'KC_HOSTNAME_BACKCHANNEL_DYNAMIC', 'value', 'false'), createObject('name', 'KC_HOSTNAME_STRICT_BACKEND', 'value', 'false'), createObject('name', 'KC_HOSTNAME_STRICT_HTTPS', 'value', 'false'), createObject('name', 'KC_HTTP_ENABLED', 'value', 'true'), createObject('name', 'KC_HTTP_RELATIVE_PATH', 'value', variables('keycloakHttpRelativePath')), createObject('name', 'KC_HTTP_MANAGEMENT_ENABLED', 'value', 'true'), createObject('name', 'KC_HTTP_MANAGEMENT_PORT', 'value', '9000'), createObject('name', 'KC_HTTP_MANAGEMENT_HEALTH_ENABLED', 'value', 'false'), createObject('name', 'KC_PROXY', 'value', 'edge'), createObject('name', 'KC_PROXY_HEADERS', 'value', 'xforwarded'), createObject('name', 'KC_PROXY_HEADERS_FORWARDED', 'value', 'true'), createObject('name', 'KC_HEALTH_ENABLED', 'value', 'true'), createObject('name', 'KC_CACHE', 'value', 'local'), createObject('name', 'KC_FEATURES', 'value', 'preview,cimd'), createObject('name', 'KC_SPI_EMAIL_SENDER__PROVIDER', 'value', 'mori'), createObject('name', 'KC_METRICS_ENABLED', 'value', 'true'), createObject('name', 'WEBSITE_VNET_ROUTE_ALL', 'value', if(parameters('enablePostgresPublicAccess'), '0', '1')), createObject('name', 'WEBSITE_DNS_SERVER', 'value', '168.63.129.16'), createObject('name', 'WEBSITES_CONTAINER_START_TIME_LIMIT', 'value', '1800'), createObject('name', 'KC_LOG', 'value', 'console'), createObject('name', 'KC_LOG_LEVEL', 'value', 'INFO')), variables('appInsightsAppSettings'), variables('acrRegistryUrlAppSettings'), variables('acrRegistryCredentialAppSettings'))]",
|
|
2413
2435
|
"vnetRouteAllEnabled": "[not(parameters('enablePostgresPublicAccess'))]"
|
|
2414
2436
|
},
|
|
2415
2437
|
"vnetRouteAllEnabled": "[not(parameters('enablePostgresPublicAccess'))]"
|
|
@@ -2524,6 +2546,9 @@
|
|
|
2524
2546
|
"moriLicensePublicKey": {
|
|
2525
2547
|
"value": "[parameters('moriLicensePublicKey')]"
|
|
2526
2548
|
},
|
|
2549
|
+
"moriPolicyPublicKey": {
|
|
2550
|
+
"value": "[parameters('moriPolicyPublicKey')]"
|
|
2551
|
+
},
|
|
2527
2552
|
"moriBaseUrl": {
|
|
2528
2553
|
"value": "[parameters('moriBaseUrl')]"
|
|
2529
2554
|
}
|
|
@@ -2535,7 +2560,7 @@
|
|
|
2535
2560
|
"_generator": {
|
|
2536
2561
|
"name": "bicep",
|
|
2537
2562
|
"version": "0.47.16.16243",
|
|
2538
|
-
"templateHash": "
|
|
2563
|
+
"templateHash": "4650500285752133401"
|
|
2539
2564
|
}
|
|
2540
2565
|
},
|
|
2541
2566
|
"parameters": {
|
|
@@ -2618,6 +2643,13 @@
|
|
|
2618
2643
|
"description": "Mori licence issuer public key (SPKI PEM). Empty leaves the installation unpinned."
|
|
2619
2644
|
}
|
|
2620
2645
|
},
|
|
2646
|
+
"moriPolicyPublicKey": {
|
|
2647
|
+
"type": "string",
|
|
2648
|
+
"defaultValue": "",
|
|
2649
|
+
"metadata": {
|
|
2650
|
+
"description": "Mori policy signing anchor public key (SPKI PEM). Empty leaves the policy bundle without an independent anchor."
|
|
2651
|
+
}
|
|
2652
|
+
},
|
|
2621
2653
|
"moriBaseUrl": {
|
|
2622
2654
|
"type": "string",
|
|
2623
2655
|
"defaultValue": "",
|
|
@@ -2735,6 +2767,15 @@
|
|
|
2735
2767
|
"value": "[parameters('moriLicensePublicKey')]"
|
|
2736
2768
|
}
|
|
2737
2769
|
},
|
|
2770
|
+
{
|
|
2771
|
+
"condition": "[not(empty(parameters('moriPolicyPublicKey')))]",
|
|
2772
|
+
"type": "Microsoft.KeyVault/vaults/secrets",
|
|
2773
|
+
"apiVersion": "2023-07-01",
|
|
2774
|
+
"name": "[format('{0}/{1}', parameters('keyVaultName'), 'mori-policy-public-keyKeyVault')]",
|
|
2775
|
+
"properties": {
|
|
2776
|
+
"value": "[parameters('moriPolicyPublicKey')]"
|
|
2777
|
+
}
|
|
2778
|
+
},
|
|
2738
2779
|
{
|
|
2739
2780
|
"condition": "[not(empty(parameters('moriBaseUrl')))]",
|
|
2740
2781
|
"type": "Microsoft.KeyVault/vaults/secrets",
|
|
@@ -2856,9 +2897,15 @@
|
|
|
2856
2897
|
"entraIdTenantId": {
|
|
2857
2898
|
"value": "[variables('effectiveEntraIdTenantId')]"
|
|
2858
2899
|
},
|
|
2900
|
+
"adminEmail": {
|
|
2901
|
+
"value": "[parameters('adminEmail')]"
|
|
2902
|
+
},
|
|
2859
2903
|
"licenseEdition": {
|
|
2860
2904
|
"value": "[parameters('licenseEdition')]"
|
|
2861
2905
|
},
|
|
2906
|
+
"installationResourceModel": {
|
|
2907
|
+
"value": "[parameters('installationResourceModel')]"
|
|
2908
|
+
},
|
|
2862
2909
|
"onboardingMode": {
|
|
2863
2910
|
"value": "[parameters('onboardingMode')]"
|
|
2864
2911
|
},
|
|
@@ -2879,7 +2926,7 @@
|
|
|
2879
2926
|
"_generator": {
|
|
2880
2927
|
"name": "bicep",
|
|
2881
2928
|
"version": "0.47.16.16243",
|
|
2882
|
-
"templateHash": "
|
|
2929
|
+
"templateHash": "9991546815810387946"
|
|
2883
2930
|
}
|
|
2884
2931
|
},
|
|
2885
2932
|
"parameters": {
|
|
@@ -3110,6 +3157,21 @@
|
|
|
3110
3157
|
"description": "Requested license: edition name (COMMUNITY, STANDARD, ENTERPRISE) or Azure Marketplace subscription ID (UUID). Validated by Miso. Emitted as LICENSE_EDITION."
|
|
3111
3158
|
}
|
|
3112
3159
|
},
|
|
3160
|
+
"adminEmail": {
|
|
3161
|
+
"type": "string",
|
|
3162
|
+
"defaultValue": "",
|
|
3163
|
+
"metadata": {
|
|
3164
|
+
"description": "Initial platform administrator email."
|
|
3165
|
+
}
|
|
3166
|
+
},
|
|
3167
|
+
"installationResourceModel": {
|
|
3168
|
+
"type": "string",
|
|
3169
|
+
"defaultValue": "shared",
|
|
3170
|
+
"allowedValues": ["shared", "dedicated"],
|
|
3171
|
+
"metadata": {
|
|
3172
|
+
"description": "Initial installation topology, protected by Azure application configuration: shared for CE/SE; dedicated for EE DEV. Does not grant later licence entitlements."
|
|
3173
|
+
}
|
|
3174
|
+
},
|
|
3113
3175
|
"onboardingMode": {
|
|
3114
3176
|
"type": "string",
|
|
3115
3177
|
"defaultValue": "customerOwned",
|
|
@@ -3206,7 +3268,7 @@
|
|
|
3206
3268
|
"acrUseManagedIdentityCreds": "[not(parameters('registryPasswordConfigured'))]",
|
|
3207
3269
|
"healthCheckPath": "/health",
|
|
3208
3270
|
"alwaysOn": true,
|
|
3209
|
-
"appSettings": "[concat(createArray(createObject('name', 'WEBSITES_ENABLE_APP_SERVICE_STORAGE', 'value', 'false'), createObject('name', 'WEBSITES_CONTAINER_START_TIME_LIMIT', 'value', '1800'), createObject('name', 'DATABASE_URL', 'value', variables('databaseUrlAppSettingValue')), createObject('name', 'JWT_SECRET', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName={1}-secrets-jwtKeyVault)', last(split(parameters('keyVaultId'), '/')), parameters('prefix'))), createObject('name', 'NODE_ENV', 'value', 'production'), createObject('name', 'LOCATION', 'value', parameters('location')), createObject('name', 'PORT', 'value', '3000'), createObject('name', 'ALLOWED_ORIGINS', 'value', format('http://localhost:*,http://127.0.0.1:*,https://{0}.azurewebsites.net', parameters('name'))), createObject('name', 'WEBSITE_VNET_ROUTE_ALL', 'value', if(parameters('enablePostgresPublicAccess'), '0', '1')), createObject('name', 'WEBSITE_DNS_SERVER', 'value', '168.63.129.16'), createObject('name', 'DATABASELOG_URL', 'value', variables('databaseLogUrlAppSettingValue')), createObject('name', 'KEY_VAULT_ENABLED', 'value', 'true'), createObject('name', 'SECURITY_STORAGE_MODE', 'value', 'keyvault'), createObject('name', 'KEY_VAULT_URL', 'value', format('https://{0}.vault.azure.net/', last(split(parameters('keyVaultId'), '/')))), createObject('name', 'ENCRYPTION_KEY', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName={1}-encryption-keyKeyVault)', last(split(parameters('keyVaultId'), '/')), parameters('prefix'))), createObject('name', 'AUTO_CREATE_TABLES', 'value', if(parameters('autoCreateTables'), 'true', 'false')), createObject('name', 'KEYCLOAK_REALM', 'value', parameters('keycloakRealm')), createObject('name', 'KEYCLOAK_CLIENT_ID', 'value', parameters('keycloakClientId')), createObject('name', 'KEYCLOAK_ADMIN_USERNAME', 'value', parameters('keycloakAdminUsername')), createObject('name', 'KEYCLOAK_ADMIN_PASSWORD', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName={1}-keycloak-admin-password)', last(split(parameters('keyVaultId'), '/')), parameters('prefix'))), createObject('name', 'ONBOARDING_ADMIN_PASSWORD', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName={1}-onboarding-admin-password)', last(split(parameters('keyVaultId'), '/')), parameters('prefix'))), createObject('name', 'KEYCLOAK_SERVER_URL', 'value', variables('keycloakPublicUrl')), createObject('name', 'KEYCLOAK_INTERNAL_SERVER_URL', 'value', variables('keycloakInternalUrl')), createObject('name', 'KEYCLOAK_TOKEN_TIMEOUT', 'value', '5000'), createObject('name', 'KEYCLOAK_VERIFY_AUDIENCE', 'value', if(parameters('keycloakVerifyAudience'), 'true', 'false')), createObject('name', 'DISABLE_RATE_LIMIT', 'value', variables('shouldDisableRateLimit')), createObject('name', 'SKIP_DB_REDEPLOY', 'value', 'true'), createObject('name', 'MISO_WEB_SERVER_URL', 'value', variables('misoPublicUrl')), createObject('name', 'MISO_CONTROLLER_URL', 'value', variables('misoInternalUrl')), createObject('name', 'MISO_RELATIVE_PATH', 'value', variables('misoVdirValue')), createObject('name', 'CONTROLLER_BASE_URL', 'value', if(not(empty(parameters('misoControllerUrl'))), parameters('misoControllerUrl'), format('https://{0}.azurewebsites.net', parameters('name')))), createObject('name', 'AZURE_SUBSCRIPTION_ID', 'value', subscription().subscriptionId), createObject('name', 'TENANT_ID', 'value', subscription().tenantId), createObject('name', 'DEPLOYMENT', 'value', 'azure'), createObject('name', 'AZURE_RESOURCE_GROUP_NAME', 'value', parameters('resourceGroupName')), createObject('name', 'INFRASTRUCTURE_NAME', 'value', parameters('prefix')), createObject('name', 'ENTRA_ID_TENANT_ID', 'value', parameters('entraIdTenantId')), createObject('name', 'MISO_CLIENTID', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName={1}-miso-clientIdKeyVault)', last(split(parameters('keyVaultId'), '/')), parameters('prefix'))), createObject('name', 'MISO_CLIENTSECRET', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName=miso-controller-client-secretKeyVault)', last(split(parameters('keyVaultId'), '/')))), createObject('name', 'MORI_BASE_URL', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName=mori-base-urlKeyVault)', last(split(parameters('keyVaultId'), '/')))), createObject('name', 'MORI_LICENSE_PUBLIC_KEY', 'value', if(empty(parameters('moriLicensePublicKey')), '', format('@Microsoft.KeyVault(VaultName={0};SecretName=mori-license-public-keyKeyVault)', last(split(parameters('keyVaultId'), '/'))))), createObject('name', 'MORI_LICENSE_ISSUER', 'value', parameters('moriLicenseIssuer')), createObject('name', 'ENTRA_GRAPH_DELEGATED_REDIRECT_URI', 'value', variables('moriEntraGraphDelegatedRedirectUri')), createObject('name', 'ENTRA_ID_CENTRAL_CALLBACK_URI', 'value', variables('moriEntraCentralCallbackUri')), createObject('name', 'DOCKER_ENABLE_CI', 'value', 'true'), createObject('name', 'DOCKER_REGISTRY_SERVER_URL', 'value', if(not(empty(parameters('acrLoginServer'))), format('https://{0}', parameters('acrLoginServer')), '')), createObject('name', 'ONBOARDING_CREATE_PIPELINE_CREDENTIALS', 'value', 'true'), createObject('name', 'BOOTSTRAP_APPKEYS', 'value', parameters('bootstrapAppKeys')), createObject('name', 'LICENSE_JWT', 'value', parameters('licenseJwt')), createObject('name', 'LICENSE_EDITION', 'value', parameters('licenseEdition')), createObject('name', 'ONBOARDING_MODE', 'value', parameters('onboardingMode')), createObject('name', 'INSTALLATION_CAPACITY_PROFILE', 'value', parameters('capacityProfile'))), variables('registryCredentialAppSettings'))]",
|
|
3271
|
+
"appSettings": "[concat(createArray(createObject('name', 'WEBSITES_ENABLE_APP_SERVICE_STORAGE', 'value', 'false'), createObject('name', 'WEBSITES_CONTAINER_START_TIME_LIMIT', 'value', '1800'), createObject('name', 'DATABASE_URL', 'value', variables('databaseUrlAppSettingValue')), createObject('name', 'JWT_SECRET', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName={1}-secrets-jwtKeyVault)', last(split(parameters('keyVaultId'), '/')), parameters('prefix'))), createObject('name', 'NODE_ENV', 'value', 'production'), createObject('name', 'LOCATION', 'value', parameters('location')), createObject('name', 'PORT', 'value', '3000'), createObject('name', 'ALLOWED_ORIGINS', 'value', format('http://localhost:*,http://127.0.0.1:*,https://{0}.azurewebsites.net', parameters('name'))), createObject('name', 'WEBSITE_VNET_ROUTE_ALL', 'value', if(parameters('enablePostgresPublicAccess'), '0', '1')), createObject('name', 'WEBSITE_DNS_SERVER', 'value', '168.63.129.16'), createObject('name', 'DATABASELOG_URL', 'value', variables('databaseLogUrlAppSettingValue')), createObject('name', 'KEY_VAULT_ENABLED', 'value', 'true'), createObject('name', 'SECURITY_STORAGE_MODE', 'value', 'keyvault'), createObject('name', 'KEY_VAULT_URL', 'value', format('https://{0}.vault.azure.net/', last(split(parameters('keyVaultId'), '/')))), createObject('name', 'ENCRYPTION_KEY', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName={1}-encryption-keyKeyVault)', last(split(parameters('keyVaultId'), '/')), parameters('prefix'))), createObject('name', 'AUTO_CREATE_TABLES', 'value', if(parameters('autoCreateTables'), 'true', 'false')), createObject('name', 'KEYCLOAK_REALM', 'value', parameters('keycloakRealm')), createObject('name', 'KEYCLOAK_CLIENT_ID', 'value', parameters('keycloakClientId')), createObject('name', 'KEYCLOAK_ADMIN_USERNAME', 'value', parameters('keycloakAdminUsername')), createObject('name', 'KEYCLOAK_ADMIN_PASSWORD', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName={1}-keycloak-admin-password)', last(split(parameters('keyVaultId'), '/')), parameters('prefix'))), createObject('name', 'ONBOARDING_ADMIN_PASSWORD', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName={1}-onboarding-admin-password)', last(split(parameters('keyVaultId'), '/')), parameters('prefix'))), createObject('name', 'ONBOARDING_ADMIN_EMAIL', 'value', parameters('adminEmail')), createObject('name', 'KEYCLOAK_SERVER_URL', 'value', variables('keycloakPublicUrl')), createObject('name', 'KEYCLOAK_INTERNAL_SERVER_URL', 'value', variables('keycloakInternalUrl')), createObject('name', 'KEYCLOAK_TOKEN_TIMEOUT', 'value', '5000'), createObject('name', 'KEYCLOAK_VERIFY_AUDIENCE', 'value', if(parameters('keycloakVerifyAudience'), 'true', 'false')), createObject('name', 'DISABLE_RATE_LIMIT', 'value', variables('shouldDisableRateLimit')), createObject('name', 'SKIP_DB_REDEPLOY', 'value', 'true'), createObject('name', 'MISO_WEB_SERVER_URL', 'value', variables('misoPublicUrl')), createObject('name', 'MISO_CONTROLLER_URL', 'value', variables('misoInternalUrl')), createObject('name', 'MISO_RELATIVE_PATH', 'value', variables('misoVdirValue')), createObject('name', 'CONTROLLER_BASE_URL', 'value', if(not(empty(parameters('misoControllerUrl'))), parameters('misoControllerUrl'), format('https://{0}.azurewebsites.net', parameters('name')))), createObject('name', 'AZURE_SUBSCRIPTION_ID', 'value', subscription().subscriptionId), createObject('name', 'TENANT_ID', 'value', subscription().tenantId), createObject('name', 'DEPLOYMENT', 'value', 'azure'), createObject('name', 'AZURE_RESOURCE_GROUP_NAME', 'value', parameters('resourceGroupName')), createObject('name', 'INFRASTRUCTURE_NAME', 'value', parameters('prefix')), createObject('name', 'ENTRA_ID_TENANT_ID', 'value', parameters('entraIdTenantId')), createObject('name', 'MISO_CLIENTID', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName={1}-miso-clientIdKeyVault)', last(split(parameters('keyVaultId'), '/')), parameters('prefix'))), createObject('name', 'MISO_CLIENTSECRET', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName=miso-controller-client-secretKeyVault)', last(split(parameters('keyVaultId'), '/')))), createObject('name', 'MORI_BASE_URL', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName=mori-base-urlKeyVault)', last(split(parameters('keyVaultId'), '/')))), createObject('name', 'MORI_LICENSE_PUBLIC_KEY', 'value', if(empty(parameters('moriLicensePublicKey')), '', format('@Microsoft.KeyVault(VaultName={0};SecretName=mori-license-public-keyKeyVault)', last(split(parameters('keyVaultId'), '/'))))), createObject('name', 'MORI_LICENSE_ISSUER', 'value', parameters('moriLicenseIssuer')), createObject('name', 'ENTRA_GRAPH_DELEGATED_REDIRECT_URI', 'value', variables('moriEntraGraphDelegatedRedirectUri')), createObject('name', 'ENTRA_ID_CENTRAL_CALLBACK_URI', 'value', variables('moriEntraCentralCallbackUri')), createObject('name', 'DOCKER_ENABLE_CI', 'value', 'true'), createObject('name', 'DOCKER_REGISTRY_SERVER_URL', 'value', if(not(empty(parameters('acrLoginServer'))), format('https://{0}', parameters('acrLoginServer')), '')), createObject('name', 'ONBOARDING_CREATE_PIPELINE_CREDENTIALS', 'value', 'true'), createObject('name', 'BOOTSTRAP_APPKEYS', 'value', parameters('bootstrapAppKeys')), createObject('name', 'LICENSE_JWT', 'value', parameters('licenseJwt')), createObject('name', 'INSTALLATION_RESOURCE_MODEL', 'value', parameters('installationResourceModel')), createObject('name', 'LICENSE_EDITION', 'value', parameters('licenseEdition')), createObject('name', 'ONBOARDING_MODE', 'value', parameters('onboardingMode')), createObject('name', 'INSTALLATION_CAPACITY_PROFILE', 'value', parameters('capacityProfile'))), variables('registryCredentialAppSettings'))]",
|
|
3210
3272
|
"vnetRouteAllEnabled": "[not(parameters('enablePostgresPublicAccess'))]"
|
|
3211
3273
|
},
|
|
3212
3274
|
"vnetRouteAllEnabled": "[not(parameters('enablePostgresPublicAccess'))]"
|
|
@@ -3613,7 +3675,7 @@
|
|
|
3613
3675
|
"_generator": {
|
|
3614
3676
|
"name": "bicep",
|
|
3615
3677
|
"version": "0.47.16.16243",
|
|
3616
|
-
"templateHash": "
|
|
3678
|
+
"templateHash": "4650500285752133401"
|
|
3617
3679
|
}
|
|
3618
3680
|
},
|
|
3619
3681
|
"parameters": {
|
|
@@ -3696,6 +3758,13 @@
|
|
|
3696
3758
|
"description": "Mori licence issuer public key (SPKI PEM). Empty leaves the installation unpinned."
|
|
3697
3759
|
}
|
|
3698
3760
|
},
|
|
3761
|
+
"moriPolicyPublicKey": {
|
|
3762
|
+
"type": "string",
|
|
3763
|
+
"defaultValue": "",
|
|
3764
|
+
"metadata": {
|
|
3765
|
+
"description": "Mori policy signing anchor public key (SPKI PEM). Empty leaves the policy bundle without an independent anchor."
|
|
3766
|
+
}
|
|
3767
|
+
},
|
|
3699
3768
|
"moriBaseUrl": {
|
|
3700
3769
|
"type": "string",
|
|
3701
3770
|
"defaultValue": "",
|
|
@@ -3813,6 +3882,15 @@
|
|
|
3813
3882
|
"value": "[parameters('moriLicensePublicKey')]"
|
|
3814
3883
|
}
|
|
3815
3884
|
},
|
|
3885
|
+
{
|
|
3886
|
+
"condition": "[not(empty(parameters('moriPolicyPublicKey')))]",
|
|
3887
|
+
"type": "Microsoft.KeyVault/vaults/secrets",
|
|
3888
|
+
"apiVersion": "2023-07-01",
|
|
3889
|
+
"name": "[format('{0}/{1}', parameters('keyVaultName'), 'mori-policy-public-keyKeyVault')]",
|
|
3890
|
+
"properties": {
|
|
3891
|
+
"value": "[parameters('moriPolicyPublicKey')]"
|
|
3892
|
+
}
|
|
3893
|
+
},
|
|
3816
3894
|
{
|
|
3817
3895
|
"condition": "[not(empty(parameters('moriBaseUrl')))]",
|
|
3818
3896
|
"type": "Microsoft.KeyVault/vaults/secrets",
|