Architectuur¶
Deze pagina beschrijft het globale ontwerp van het portaal. Het is een referentieontwerp: jouw uitrol kan afwijken in namen, netwerkindeling en de set ingeschakelde functies.
Ontwerpprincipes¶
| Principe | Betekenis |
|---|---|
| Eén codebase, één image per omgeving | Elke klantomgeving draait dezelfde code. De build maakt de image één keer en elke omgeving ontvangt die (Uitrol en omgevingen). |
| Functies via configuratie | Een configuratiebestand en feature flags bepalen welke plugins laden (Configuratie). |
| Data blijft in de omgeving | Het portaal leest uit je Azure-omgeving en slaat zijn data op in een database in jouw subscription. |
| Standaard privé | Database, key vault en container registry hebben in het referentieontwerp geen publieke toegang, en de webapp heeft private endpoints. Publieke toegang tot de webapp is een instelling. |
Systeemcontext¶
flowchart LR
user[Portal user]
subgraph env["Portal environment (customer subscription)"]
portal[Portal<br/>web app and backend]
end
entra[Microsoft Entra ID]
azure[Azure: Resource Graph,<br/>Cost Management, Defender,<br/>Policy, Log Analytics]
repos[Azure DevOps and GitHub<br/>repositories]
models[Model endpoint<br/>Azure AI Foundry]
mcp[MCP clients<br/>editors and agents]
user -->|HTTPS| portal
mcp -->|HTTPS| portal
portal -->|sign-in, users, groups| entra
portal -->|read| azure
portal -->|read catalog files, pull requests| repos
portal -->|chat completions| models
Componenten¶
flowchart TB
subgraph web["App Service (Linux container)"]
fe[Frontend<br/>React, Backstage]
be[Backend<br/>Node.js, Backstage]
fe --> be
end
subgraph plugins["Backend plugins"]
cat[Catalog and modules]
ins[Insights:<br/>cost, network, security, compliance]
ag[AI agents]
mr[Module registry]
act[MCP actions]
perm[Permission policy]
end
be --- plugins
pg[(PostgreSQL<br/>Flexible Server)]
sql[(Azure SQL<br/>cost data)]
be --> pg
ins --> sql
ag --> pg
| Component | Doel |
|---|---|
| Frontend | Single-page webapplicatie gebouwd op Backstage. Pagina's: workloads, domeinen, organisatie, docs, create, AI-agents, module registry, MCP inspector. |
| Backend | Eén Node.js-proces dat alle backendplugins, de MCP-server en de AI-agent loop host. |
| Catalog en modules | Entiteitenmodel, Azure Resource Graph-provider, Azure DevOps-provider, samenvoegen van fragmenten. Zie Catalog en entiteitenmodel. |
| Insights | Kosten, netwerk, security en compliance. Zie Insights. |
| AI-agents | In-process agent loop die een modelendpoint en de eigen tools van het portaal aanroept. Zie AI-agents. |
| PostgreSQL | Catalog, plugindata en agentgesprekken. Alleen Entra-authenticatie. |
| Azure SQL | Door Data Factory voorbereide kostendata. Alleen aanwezig als cost insights zijn ingeschakeld. |
Azure-resources per omgeving¶
De Terraform-modules maken de volgende resources aan voor één omgeving. Optionele onderdelen hangen af van de functies die je inschakelt.
| Resource | Opmerkingen |
|---|---|
| Linux-webapp met een staging slot | Container image uit de registry, system- en user-assigned identities, alleen HTTPS, minimaal TLS 1.2, health check op het liveness-endpoint, VNet-integratie |
| App Service plan | De referentieomgeving gebruikt een premium v3 P0v3-plan. Dimensioneer op je belasting. |
| PostgreSQL Flexible Server | Versie 16, standaard burstable B2s, 32 GB opslag, back-up van 7 dagen, geen geo-redundantie, geen publieke toegang, alleen Entra-authenticatie, extensies azure_storage, pg_cron en pg_stat_statements |
| Key Vault | RBAC-autorisatie, purge protection, soft delete van 7 dagen, geen publieke toegang |
| Container registry | Premium SKU, geen publieke toegang |
| Application Insights en Log Analytics | Telemetrie en logs |
| Private endpoints | Voor de productie- en staging slot, en voor de ondersteunende services |
| Cost insights (optioneel) | Data Factory, storage, optionele Data Lake Gen2-accounts, Azure SQL (standaard S0), managed identities en foutalert. Zie Cost insights-setup. |
| AI Foundry (optioneel) | AIServices-account, project, modeldeployments en private endpoint. Zie AI-setup. |
| Alerting (optioneel) | Een PagerDuty-service geïntegreerd via een Azure Monitor action group |
Bestaande landing zone
Het portaal wordt uitgerold in een bestaande spoke. Een data-only Terraform-module leest de bestaande resource group, het virtual network, de subnets, de Key Vault en de Log Analytics workspace van de spoke, in plaats van ze aan te maken. Zie Spoke canvas.
Data- en netwerkgrenzen¶
Twee beslissingen bepalen de grenzen (Beslissingen):
- De omgeving is privé. De webapp, registry, key vault en database zijn bereikbaar via private endpoints. De deployment runners van de leverancier bereiken ze via private endpoints die de klant goedkeurt, en de klant kan die verbinding intrekken.
- Data wordt verwerkt in de klantomgeving. Kosten-, security-, netwerk- en compliancedata worden gelezen en opgeslagen in de subscription van de klant, zodat de leverancier voor deze data niet als verwerker optreedt.
flowchart LR
subgraph prov["Provider platform network"]
run[Deployment runners]
end
subgraph cust["Customer subscription"]
subgraph vnet["Spoke VNet"]
pe1[Private endpoints:<br/>storage, key vault,<br/>registry, SQL, web app,<br/>staging slot]
app[Web app<br/>VNet integration]
pg[(PostgreSQL<br/>delegated subnet)]
end
end
run -->|manual connection,<br/>customer approves| pe1
app --> pg
app --> pe1
Publieke toegang tot de webapp heeft drie waarden in de Terraform-module: geen publieke toegang, volledige publieke toegang (de standaard), of een beperkte waarde bedoeld voor de Azure AI agent service. Gebruik een WAF of een toegangsbeperking voor de webapp voor gebruikersverkeer (WAF en eigen domein).
Uitgaand HTTPS vanaf de webapp is nodig naar de service tags AzureResourceManager, AzureActiveDirectory en AzureMonitor, en naar graph.microsoft.com. Zie Vereisten.
Subnets in het referentieontwerp¶
| Subnet | Doel |
|---|---|
| default | Private endpoints |
| app service | Gedelegeerd aan de webapp (VNet-integratie) |
| PostgreSQL | Gedelegeerd aan PostgreSQL Flexible Server |
| container app | Alleen gebruikt wanneer AI-agents draaien met bring-your-own-resources |
Dataflow van kosten¶
flowchart LR
cm[Cost Management<br/>FOCUS export] -->|Parquet, Snappy| st[(Storage account /<br/>Data Lake)]
st --> adf[Data Factory<br/>daily pipeline]
adf --> sql[(Azure SQL<br/>views)]
sql --> be[Portal backend]
Het portaal maakt de kostenexports zelf aan. Zie Cost insights-setup.