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:
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:
Or push to main (triggers prod) / open a PR (triggers dev automatically).
For the shared DNS zone and custom domain, see Custom Domains.
Cleanup¶
Troubleshooting¶
Deployment fails¶
Container Apps not starting¶
Next Steps¶
- Bicep Structure — module breakdown, parameter files, outputs
- Security — managed identities, Key Vault, ACR, email credentials flow
- Pipeline Overview — how CI/CD deploys to these resources
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 |