Skip to content

Resource Overview

The portfolio runs across two Azure resource groups: dna-shared-portfolio-westeurope-rg (DNS zone, domain, and App Configuration store) and dna-{env}-portfolio-{region}-rg (all app resources per environment).

Naming Convention

All resources follow the CAF pattern:

{org}-{environment}-{project}-{region}-{component}

Example: dna-dev-portfolio-westeurope-rg

Resource Abbreviations

Resource Type Abbreviation Example
Resource Group rg dna-dev-portfolio-westeurope-rg
Key Vault kv dna-dev-portfolio-we-kv (max 24 chars)
Container Registry acr dnadevportfoliowesteuropeacr (no hyphens)
Log Analytics log dna-dev-portfolio-westeurope-log
App Insights appi dna-dev-portfolio-westeurope-appi
Container App Environment cae dna-dev-portfolio-westeurope-cae
Container App ca dna-dev-portfolio-we-ca-fe
Static Web App swa dna-dev-portfolio-westeurope-swa

Name-Length Rules by Resource

Some resource types have strict length limits that require shortening:

Resource Type Max Length Special Rules Strategy
Key Vault 24 No consecutive hyphens Aggressive shortening + hash
Container Registry 50 No hyphens, lowercase only Remove hyphens, lowercase
Storage Account 24 No hyphens, lowercase only Short names, no location
Log Analytics 63 Standard Full CAF naming
App Insights 63 Standard Full CAF naming
Container Apps 32 Lowercase, hyphens OK May shorten location
Resource Group 90 Very flexible Full CAF naming

Environment and Location Shortening

Environment Abbreviation
dev dev
prod prd
staging stg
Location Abbreviation
westeurope we
eastus eu
northeurope ne
westus2 w2

See Bicep Structure for the Bicep implementation of these naming strategies.

Resource Map

Azure Subscription
├── Resource Group (dna-shared-portfolio-westeurope-rg)   [shared.bicep]
│   ├── Azure DNS Zone (sven-relijveld.com)
│   │   ├── TXT  asuid              → CA env verification ID (prod)
│   │   ├── TXT  asuid.www          → CA env verification ID (prod)
│   │   ├── TXT  asuid.dev          → CA env verification ID (dev)
│   │   ├── TXT  asuid.admin        → CA env verification ID (prod UIGen)
│   │   ├── TXT  asuid.admin.dev    → CA env verification ID (dev UIGen)
│   │   ├── TXT  asuid.cms          → CA env verification ID (prod)
│   │   ├── TXT  asuid.cms.dev      → CA env verification ID (dev)
│   │   ├── CNAME www               → frontend Container App FQDN (prod)
│   │   ├── CNAME dev               → frontend Container App FQDN (dev)
│   │   ├── CNAME docs              → prod SWA default hostname
│   │   ├── CNAME dev-docs          → dev SWA default hostname
│   │   ├── CNAME admin             → UIGen Container App FQDN (prod)
│   │   ├── CNAME admin.dev         → UIGen Container App FQDN (dev)
│   │   ├── CNAME cms               → CMS Container App FQDN (prod)
│   │   └── CNAME cms.dev           → CMS Container App FQDN (dev)
│   ├── App Service Domain (sven-relijveld.com)
│   └── Azure App Configuration (dna-portfolio-we-appcs)   [Free tier; labels: dev/prod]
│       └── Feature flag: cv-generation (dev=on, prod=off)
└── Resource Group (dna-{env}-portfolio-{region}-rg)      [main.bicep]
    ├── Container Registry (ACR)
    ├── Key Vault (secrets)
    ├── Static Web App (MkDocs documentation)
    │   └── Custom domain binding (docs.sven-relijveld.com / dev-docs.sven-relijveld.com)
    ├── Log Analytics Workspace
    ├── Application Insights
    ├── PostgreSQL Flexible Server                          [uksouth; AAD-only auth; Standard_B1ms Burstable]
    │   └── Database: portfolio
    └── Container Apps Environment
        ├── Managed Certificate (www.sven-relijveld.com)      [prod, SniEnabled]
        ├── Managed Certificate (dev.sven-relijveld.com)      [dev, SniEnabled]
        ├── Managed Certificate (admin.sven-relijveld.com)    [prod, SniEnabled]
        ├── Managed Certificate (admin.dev.sven-relijveld.com) [dev, SniEnabled]
        ├── Frontend Container App (Nginx + React)
        ├── Backend Container App (FastAPI)
        ├── UIGen Container App (Node.js auth shim + UIGen API explorer)
        ├── Storage Account (CMS uploads — Azure Files)
        ├── CMS Container App (Strapi v5)
        ├── ACA Job (cert-sync — weekly Monday 06:00 UTC)
        ├── Managed Certificate (cms.sven-relijveld.com)       [prod, SniEnabled]
        └── Managed Certificate (cms.dev.sven-relijveld.com)   [dev, SniEnabled]

Deployed URLs

Production

Service URL
Frontend https://www.sven-relijveld.com
Frontend (direct) https://dna-prd-portfolio-we-ca-fe.politepebble-2dcbf46f.westeurope.azurecontainerapps.io
Backend https://dna-prd-portfolio-we-ca-be.politepebble-2dcbf46f.westeurope.azurecontainerapps.io
UIGen (Admin) https://admin.sven-relijveld.com
CMS (Strapi admin) https://cms.sven-relijveld.com
Docs (SWA) https://docs.sven-relijveld.com
Docs (GitHub Pages) https://svenrelijveld1995.github.io/portfolio/

Dev

Service URL
Frontend https://dev.sven-relijveld.com
UIGen (Admin) https://admin.dev.sven-relijveld.com
CMS (Strapi admin) https://cms.dev.sven-relijveld.com
Docs (SWA) https://dev-docs.sven-relijveld.com

Cost Estimate

Development environment: ~$12–20/month

Resource Cost
Container Apps ~$5–10/month
Container Registry (Basic) ~$5/month
Log Analytics ~$2–5/month
Key Vault ~$0.03/month

Production environment: ~$15–25/month (similar, with potential scaling).

Deploying Infrastructure

Infrastructure deployment is handled via GitHub Actions CI/CD. To trigger manually:

bash
# Development environment
gh workflow run deploy-infrastructure.yml --ref main --field environment=dev --field deploy_containers=false

# Production environment
gh workflow run deploy-infrastructure.yml --ref main --field environment=prod --field deploy_containers=false

Or push to main (triggers prod) / open a PR (triggers dev automatically).

For the shared DNS zone and custom domain, see Custom Domains.

Cleanup

bash
az group delete --name dna-dev-portfolio-westeurope-rg --yes --no-wait

Troubleshooting

Deployment fails

bash
az deployment sub show --name <deployment-name>
az deployment sub show --name <deployment-name> --query properties.error

Container Apps not starting

bash
az containerapp logs show --name dna-dev-portfolio-we-ca-fe --resource-group dna-dev-portfolio-westeurope-rg
az containerapp revision list --name dna-dev-portfolio-we-ca-fe --resource-group dna-dev-portfolio-westeurope-rg

Next Steps

Page history

Field Value
Last updated 2026-07-03

Changelog

Date PRs Summary
2026-03-10 #66 Extracted from infrastructure.md; naming convention, resource map, deployed URLs, cost estimate
2026-04-21 #181, #207, #243, #247 Add PostgreSQL Flexible Server, UIGen Container App, admin custom domains, and Azure App Configuration store to resource map; update deployed URLs tables with UIGen and admin domain entries
2026-05-30 #469 Updated PostgreSQL Flexible Server location from northeurope to uksouth (Standard_B1ms Burstable tier, ~€5-7/mo) in resource map.
2026-06-02 #497, #507, #508, #509, #510, #512, #516 Add Strapi CMS Container App, CMS storage account, CMS DNS records, and CMS custom domain entries (cms.dev.sven-relijveld.com active, cms.sven-relijveld.com planned) to resource map and deployed URLs tables.
2026-07-03 #606 Add cert-sync ACA scheduled job to resource map