AutoMate Technisch Help

Hosting — SaaS Applicatie

De AutoMate SaaS-applicatie draait op Azure App Service en wordt volledig beheerd via Bicep Infrastructure as Code. Dit omvat de API, het Management Portal en alle ondersteunende Azure-services. Er zijn twee ingress-paden: klanten gebruiken de publieke HTTPS-endpoint van de App Service, medewerkers benaderen de applicatie via Cloudflare One Zero Trust met WAF, Access policies en twee tunnels per omgeving. Beide App Services hebben publicNetworkAccess: Disabled en zijn alleen bereikbaar via Private Endpoint. Data-resources (Azure SQL, Key Vault, Managed Redis) zijn eveneens alleen via Private Endpoint bereikbaar.

Voor SKU/scaling per asset zie Asset Catalogus. Voor de bredere infrastructuur-context zie Infrastructuur.

Componenten

publieke HTTPS

publieke HTTPS

via Private Endpoint

via Private Endpoint

private endpoint

private endpoint

private endpoint

Klant

AutoMate.API
App Service

Management Portal
App Service

Medewerker

Cloudflare One

Container App\ncloudflared — 2 replicas

Azure SQL
Signatures · UserTypes
Jobs · Emails

Key Vault

Managed Redis
Enterprise

AuditLogs
Storage Account

SendGrid

Hangfire
in-process

Application Insights

Seq @ TransIP
via Serilog

Log Analytics

Component

Azure Resource

Doel

AutoMate.API

App Service (Linux, .NET 10)

Centrale API met FastEndpoints en Hangfire (in-process background jobs)

Management Portal

App Service (Linux, .NET 10)

Blazor Server beheersinterface

App Service Plan

Serverfarm (Linux, P1v3 Premium V3)

Gedeeld plan voor API + Portal — zowel dev als prod draaien op Premium V3

Cloudflare Zero Trust

WAF + Cloudflare Access + twee tunnels per omgeving

WAF + OWASP managed ruleset op alle automate365.cloud subdomains; per-user Access policies; GitHub Actions runners via WARP

Cloudflare Tunnel B — Portal sidecar

cloudflared sitecontainer op de Portal Management webapp (production-slot + Staging-slot)

Routeert app.*, dev.*, api.*, api.dev.* — publieke gebruikersdomeinen. De Portal heeft vier host-bindings; api.* verkeer loopt via een self-loop terug via de Portal PE naar de Portal zelf

Cloudflare Tunnel A — Container App

Azure Container App (*-Automate-Conn-CFTunnel-CA-Weu), 2 replicas, snet-cftunnel-out, cloudflare/cloudflared:latest

Routeert beheerverkeer: SCM/Kudu, Redis-beheer, SQL-beheer

Azure SQL Server

SQL Server + Elastic Pool + Databases

Signatures, UserTypes, Jobs, Emails (vier databases in BasicPool 50 eDTU)

Azure Managed Redis

Redis Enterprise (kind v2)

Distributed cache, achter Private Endpoint, Entra-only auth

Azure Key Vault

Key Vault (standard)

Secrets, certificaten, Cloudflared tunnel-tokens, SendGrid keys, Seq API key

AuditLogs Storage Account

Storage Account (Standard_LRS, StorageV2, Hot, TLS 1.2)

Audit log opslag voor het AuditLog-plugin

SendGrid

SaaS (extern)

Transactionele e-mail + webhook-verificatie

Application Insights

App Insights (workspace-based)

APM, telemetry, OpenTelemetry — schrijft naar Log Analytics

Log Analytics Workspace

Log Analytics (PerGB2018)

Centrale opslag voor App Insights data; retentie 31 dagen (prod) / 30 dagen (dev), daily quota 1 GB

Seq @ TransIP

Seq (TransIP-gehost, extern)

Productie-pad voor Serilog structured logging

Netwerk — VNet, subnets, Private Endpoints

Twee ingress-paden voor de App Services:

  • Klantverkeer loopt via de publieke HTTPS-endpoint van de App Service op de custom domains (app.automate365.cloud, api.automate365.cloud).

  • Beheerverkeer (medewerkers) loopt via Cloudflare One Zero Trust (WAF + Access) naar twee tunnels per omgeving: de Portal sidecar (Tunnel B) voor publieke gebruikersdomeinen, en de dedicated Container App (Tunnel A) voor beheerverkeer. Beide tunnels routen via de VNet naar de Private Endpoints.

Beide App Services hebben publicNetworkAccess: Disabled. Data-resources (SQL, KV, Redis) zijn achter Private Endpoint vanuit de VNet. Alle 11 subnets hebben NSG's — zie Cloudflare Tunnel Architectuur voor de volledige NSG-regels.

VNet & subnets

VNet <env>-Automate-Vnet-Weu met address space 10.36.0.0/16. Per applicatie aparte in- en out-subnets:

Subnet

CIDR

Doel

snet-sql-in

10.36.1.0/24

Private Endpoint Azure SQL

snet-webapi-in

10.36.2.0/24

Private Endpoint Web API (productie + staging slot)

snet-webapi-out

10.36.3.0/24

VNet-integratie Web API (delegated Microsoft.Web/serverFarms)

snet-portal-in

10.36.4.0/24

Private Endpoint Portal

snet-portal-out

10.36.5.0/24

VNet-integratie Portal (delegated Microsoft.Web/serverFarms)

snet-autosign-in

10.36.6.0/24

Autosign service (inbound PE)

snet-autosign-out

10.36.7.0/24

Autosign service (outbound, delegated)

snet-redis-in

10.36.8.0/24

Private Endpoint Managed Redis

snet-keyvault-in

10.36.9.0/24

Private Endpoint Key Vault

snet-storage-in

10.36.10.0/24

Private Endpoint AuditLogs Storage Account

snet-cftunnel-out

10.36.11.0/24

Outbound VNet-integratie Cloudflare Tunnel Container App (delegated Microsoft.App/environments)

Private DNS Zones

In de VNet zijn de volgende Private DNS Zones gekoppeld zodat resolutie van privatelink hostnames intern blijft:

  • privatelink.azurewebsites.net — App Services

  • privatelink.database.windows.net — Azure SQL

  • privatelink.redis.azure.net — Managed Redis

  • privatelink.vaultcore.azure.net — Key Vault

  • privatelink.table.core.windows.net — AuditLogs Storage Account (Table/Blob)

Private Endpoints

Endpoint

Subnet

Resource

groupId

Azure SQL

snet-sql-in

SQL Server

sqlServer

Key Vault

snet-keyvault-in

Key Vault

vault

Managed Redis

snet-redis-in

Redis Enterprise

redisEnterprise

Web API (productie slot)

snet-webapi-in

App Service

sites

Web API (staging slot)

snet-webapi-in

App Service slot

sites-Staging

Gedefinieerd in Infrastructure/Src/main.bicep via de module Modules/Networking/PrivateEndpoint.bicep.

Netwerk-diagram

Het diagram toont welk subnet bij welke resource hoort, samen met de twee ingress-paden. Gestippelde lijnen zijn Private Endpoints.

App Service runtime

VNet — 10.36.0.0/16

Data

Portal

Web API

Cloudflare Tunnel

publieke HTTPS

via PE

snet-cftunnel-out

VNet-integratie

VNet-integratie

PE

PE

PE

PE

PE

PE

Autosign

snet-autosign-in\n10.36.6.0/24

snet-autosign-out\n10.36.7.0/24\ndelegated

Klant

Web API + Portal\nproduction + Staging slots

Medewerker

Cloudflare Zero Trust\nWAF + Access

Container App\ncloudflared — 2 replicas\nsnet-cftunnel-out

snet-cftunnel-out\n10.36.11.0/24\ndelegated

snet-webapi-in\n10.36.2.0/24

snet-webapi-out\n10.36.3.0/24\ndelegated

snet-portal-in\n10.36.4.0/24

snet-portal-out\n10.36.5.0/24\ndelegated

snet-sql-in\n10.36.1.0/24

snet-redis-in\n10.36.8.0/24

snet-keyvault-in\n10.36.9.0/24

snet-storage-in\n10.36.10.0/24

Azure SQL

Managed Redis

Key Vault

AuditLogs Storage

Ingress — twee paden

Klantverkeer (publiek): komt binnen op de publieke HTTPS-endpoint van de App Service. DNS A-records voor de custom domains wijzen naar het inboundIpAddress van de Web App; de certificate-binding loopt via Microsoft.Web/certificates + SNI-enable (sni-enable.bicep).

Beheerverkeer (Cloudflare One Zero Trust): medewerkers benaderen interne paden via Cloudflare Zero Trust (WAF + Access). Twee tunnels per omgeving: Tunnel B (Portal sidecar) voor publieke gebruikersdomeinen, Tunnel A (Container App *-Automate-Conn-CFTunnel-CA-Weu, 2 replicas, snet-cftunnel-out) voor beheerverkeer. De Portal-webapp heeft vier host-bindings (app.*, dev.*, api.*, api.dev.*); api.* verkeer verwerkt de Portal via een self-loop. Zie Cloudflare Tunnel Architectuur.

Buitenkant — publieke endpoints

  • App Service custom domains voor klantverkeer:

    • Productie: app.automate365.cloud (Portal), api.automate365.cloud (Web API)

    • Development: dev.automate365.cloud, api.dev.automate365.cloud

  • Key Vault is alleen via Private Endpoint en een korte IP-allowlist voor office/runner bereikbaar — geen publieke ingest.

  • Azure SQL en Managed Redis zijn niet publiek bereikbaar (alleen via Private Endpoint, plus voor SQL een office-IP firewall-rule).

Logging & Telemetrie

Twee parallelle paden voor logging:

Pad

Bron

Bestemming

Doel

Serilog → Seq

Web API en Portal (Serilog provider)

Seq-instantie gehost op TransIP

Productie-pad voor structured application logging — query via Seq UI

Application Insights → Log Analytics

App Service runtime, OpenTelemetry

Azure Log Analytics Workspace

APM, performance, distributed tracing, Azure-native telemetrie

AuditLogs Storage Account

AuditLog-plugin

Storage Account (Blob)

Domein-specifieke audit-trail per tenant

Configuratie in Bicep:

  • Serilog__SeqUrl en Serilog__SeqApiKey (Key Vault reference naar secret SeqApiKey) worden door WebApiAppSettings.bicep en PortalAppSettings.bicep als app-setting geïnjecteerd.

  • APPINSIGHTS_INSTRUMENTATIONKEY en APPLICATIONINSIGHTS_CONNECTION_STRING worden gezet door dezelfde bicep-modules.

  • AuditLogs storage account connection string komt uit MainComponents.bicep output AuditLogsStorageAccountConnectionString.

Zie de Logging-pagina onder Crosscutting Concerns voor de Serilog-configuratie zelf.

Deployment

Infrastructure as Code (Bicep)

Alle Azure-resources worden gedefinieerd in /Infrastructure/Src/:

Bestand

Wat het deployt

main.bicep

Master orchestrator — SubnetHardening, VNet, Private Endpoints (SQL/KV/Redis/Web API prod+staging), MainComponents, Managed Redis, Web API, Portal, SQL users, CFTunnel

Modules/MainComponents/CFTunnel.bicep

Container App Environment + Container App voor de Cloudflare Tunnel (Tunnel A)

Modules/MainComponents/

Key Vault, SQL, App Service Plan, App Insights, Log Analytics, AuditLogs Storage, Managed Identity (ServiceBus/ en CommunicationService.bicep staan in repo maar worden niet meer aangeroepen)

Modules/Portal/

Web Apps, App Settings, DNS, SNI/certificate. Portal-module bevat parameter deployCloudflaredSidecar (environmentLetter == 'D' — Portal sidecar actief in dev); API-module heeft dit niet

Modules/Networking/SubnetHardening.bicep

11 NSG-modules voor alle subnets

Modules/Networking/

VNet, Private Endpoints, Private DNS Zones

Modules/Auth/

Key Vault access policies, Storage authenticatie

CI/CD Pipeline

Deployment verloopt via GitHub Actions:

  1. InfrastructureDeployment-Infrastructure-Azure.yml past Bicep templates toe

  2. Web AppsDeployment-WebApps-selfhosted-runner.yml deployt API en Portal

  3. Deployment slots — Productie- én staging-slot voor zero-downtime deployments

Omgevingen

Omgeving

Prefix

Doel

Development

D

Ontwikkeling en testen

Test

T

Acceptatietests

Production

P

Live omgeving

Naamgeving van resources is gebaseerd op het resource group prefix (D/T/P). De environment-letter wordt in main.bicep afgeleid uit resourceGroup().name.

Secrets management

Alle secrets worden exclusief beheerd via Azure Key Vault. De API en Portal gebruiken Key Vault referenties in hun configuratie — er worden geen secrets opgeslagen in appsettings of environment variables. Key Vault zelf is alleen via Private Endpoint en een IP-allowlist bereikbaar.

// Program.cs builder.Configuration.ConfigureAzureKeyVault();

Database-architectuur

De SaaS-applicatie gebruikt één gedeelde SQL Server met een Elastic Pool (BasicPool, capaciteit 50 eDTU). Huidige databases:

Database

Inhoud

Signatures

E-mailhandtekeningen

UserTypes

UserType definities en formulieren (Personas/OrgModel)

Jobs

Hangfire job storage

Emails

E-mail logging

De eerder gedocumenteerde databases Tenants, Users, Branding, Licenses en Devices zijn afgevoerd. Tenant- en branding-state is verplaatst naar Azure Table Storage of weggevallen door de Workflows 2.0-migratie.

SQL-toegang loopt via Azure AD only authentication (admin-groep SG - Azure SQL Administrators (Production)) en de App Service managed identities worden per database als SQL user toegevoegd (AddUsersLoop.bicep) — de Portal alleen op Signatures, de Web API op Signatures, UserTypes, Jobs en Emails.

Verschil met andere componenten

Component

Hosting

Database

Deployment

SaaS App (API + Portal)

Azure App Service; beheerverkeer via Cloudflare One → Container App → Private Endpoints

Azure SQL (4 DBs in Elastic Pool)

Bicep + GitHub Actions

Status Page

Railway (Docker)

MySQL

Docker + Railway

Documentatie

Azure Static Web Apps + K8s

Writerside + GitHub Actions

Zie Status Page hosting en Documentatie hosting voor de andere componenten.

Last modified: 11 June 2026