Skip to content

Solution Architecture Overview

Requirement AreaStatusValidation Notes
NFRs (SLA, RTO, RPO)✅ Defined99.0% SLA, 24h RTO, 12h RPO — relaxed for dev/demo
Compliance requirements✅ DefinedGDPR applicable; PCI/SOC/HIPAA not in scope
Budget (approximate)✅ DefinedEUR 100-500/month soft limit, ~$155/mo estimated
Scale requirements✅ Defined1 TPS, 100-1K daily users, up to 1K concurrent
Security controls✅ DefinedManaged identity, Key Vault, TLS 1.2+, VNet + PE
Data residency✅ DefinedEU-only, swedencentral, no cross-region replication

A lightweight ordering portal for a Malta catering outlet selling pastizzi, Cisk, and Kinnie. The architecture uses Azure App Service S1 (Linux containers) with VNet integration to host a containerized React SPA with a lightweight API, Azure Table Storage for order persistence, Azure Container Registry (Premium) for image management, and Azure Key Vault (Standard) for secrets. Private endpoints secure Key Vault, Storage, and ACR traffic over a dedicated VNet. A staging slot enables blue-green deployments. All resources deploy to swedencentral for GDPR compliance.

Estimated monthly cost: ~$155/month (within EUR 100-500 budget).

flowchart TB
    Customer["👤 Customer<br/>(browser)"] -->|HTTPS| APP["📦 App Service S1<br/>React SPA + API<br/>Linux Container"]
    Staff["👨‍🍳 Staff<br/>(browser)"] -->|HTTPS| APP
    APP -->|VNet + PE| KV["🔑 Key Vault<br/>Standard"]
    APP -->|VNet + PE| ST["💾 Storage Account<br/>Standard LRS"]
    ST --> TBL[("📋 Table Storage<br/>Orders & Menu")]
    ACR["📦 Container Registry<br/>Premium"] -->|PE Image Pull| APP
    APP -->|Auto| LA["📊 Log Analytics<br/>Free tier"]
    APP -->|Telemetry| AI["📈 Application Insights<br/>Free tier"]

    subgraph VNet["🔒 VNet 10.0.0.0/24"]
        APP
        subgraph PE-Subnet["Private Endpoints"]
            KV
            ST
            ACR
        end
    end

    subgraph Data
        TBL
    end

    subgraph Observability
        LA
        AI
    end
DecisionChoiceRationale
Compute platformApp Service S1 (Linux containers)Always-on, VNet integration, staging slot, resolves ACA capacity blocker
PersistenceAzure Table Storage (LRS)Simple key-value, < $10/mo, 20K TPS capacity
Image registryACR Premium500 GiB, ~$50/mo, private endpoint support
Secrets managementKey Vault StandardManaged Identity integration, per-op pricing
AuthenticationApp Service Built-in AuthZero-cost social IdP integration (Google, MS)
MonitoringLog Analytics + Application Insights (free tier)Auto-configured with App Service; App Insights for app telemetry
Backup strategyExplicitly accept data loss for demo (ARC-001)RPO relaxed to best-effort; prod: add daily export job
GDPR erasurePII/order separation in Table Storage (ARC-003)customer_* entities deletable; orders anonymized
Staff accessEntra ID with role claims (ARC-005)Separate trust boundary from customer social auth
Network postureVNet + private endpoints (ARC-004 resolved)PE for Key Vault, Storage, ACR; public ingress only
RegionswedencentralEU GDPR-compliant, project default
IaC toolBicepAzure-native, AVM modules available for all services
ParameterValue
Regionswedencentral
Environmentdev
BudgetEUR 100-500/month (est: ~$155)
Resource Count10
#ResourceSKUKey Config
1Virtual NetworkStandard10.0.0.0/24, 2 subnets (ASP delegation + PE)
2App Service PlanS1Linux, always-on
3Web AppS1 Linux containerHTTP ingress, managed identity, staging slot
4Container RegistryPremiumAdmin disabled, managed identity pull, PE
5Storage AccountStandard LRS GPv2Table service enabled, HTTPS-only, TLS 1.2, PE
6Key VaultStandardRBAC auth, purge protection enabled, PE
7Private DNS Zones (×3)Standardprivatelink.vaultcore, blob, azurecr
8Private Endpoints (×3)StandardKV, Storage, ACR
9Log Analytics WorkspacePer-GB30-day retention (free tier)
10Application InsightsFree tierConnected to Log Analytics workspace
RequirementImplementation
VNet IntegrationApp Service delegated subnet in 10.0.0.0/24
Private EndpointsPE for Key Vault, Storage, ACR on dedicated subnet
Private DNS Zones3 zones for privatelink name resolution
Managed IdentitySystem-assigned MI on Web App → KV + Storage + ACR
Key Vault RBACKey Vault Secrets User role for Web App MI
Storage RBACStorage Table Data Contributor role for Web App MI
ACR PullAcrPull role for Web App MI
TLS 1.2 minimumminTlsVersion: 'TLS1_2' on Storage Account
HTTPS onlysupportsHttpsTrafficOnly: true on Storage
No public blob accessallowBlobPublicAccess: false on Storage
App Service authBuilt-in auth with social IdP (Google)
RequirementImplementation
Log aggregationLog Analytics Workspace linked to App Service
Web App logsSystem and app logs to Log Analytics
Application telemetryApplication Insights for request tracing, dependency monitoring (ARC-002)
Basic health monitoringApp Service built-in health probes