# Azure CDN Setup for Credential Seals **Last Updated**: 2025-01-27 **Status**: Complete and Operational ## Overview Complete guide for setting up Azure CDN infrastructure for Order of St John credential seal images. This setup provides high-performance, globally distributed hosting for credential images used in Entra VerifiedID credentials. ## Quick Start **One-Command Setup:** ```bash ./scripts/deploy/setup-azure-cdn-complete.sh ``` This automates: 1. ✅ Azure quota checking 2. ✅ Infrastructure creation (Storage Account, Container, CDN Profile, Endpoint) 3. ✅ File upload (all seal PNG files) 4. ✅ Manifest URL updates ## Prerequisites 1. **Azure CLI installed** ```bash # Install Azure CLI curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash ``` 2. **Logged in to Azure** ```bash az login az account set --subscription ``` 3. **Required Permissions** - Contributor or Owner role on subscription - Storage Account Contributor - CDN Contributor ## Architecture ``` Azure Subscription ├── Resource Group: theorder-rg-dev ├── Storage Account: theordercdn12439 (or similar) │ └── Container: images (public blob access) ├── CDN Profile: theorder-cdn-dev-profile │ └── CDN Endpoint: theorder-cdn-dev-endpoint │ └── Origin: Storage Account blob endpoint ``` ## Manual Setup Steps ### Step 1: Check Azure Quotas ```bash ./infra/scripts/azure-check-cdn-quotas.sh ``` This checks: - Storage accounts quota - CDN profiles quota - CDN endpoints quota - Resource group limits ### Step 2: Create Infrastructure ```bash ./infra/scripts/azure-cdn-setup.sh ``` This creates: - Storage account with public blob access - Storage container named "images" - CDN profile (Standard_Microsoft SKU) - CDN endpoint pointing to storage account ### Step 3: Upload Seal Images ```bash ./scripts/deploy/upload-seals-to-azure.sh ``` Uploads all PNG seal files to the storage container. ### Step 4: Update Manifest URLs ```bash ./scripts/deploy/update-manifest-seal-urls.sh ``` Updates all manifest templates with CDN URLs. ## Configuration ### Storage Account Settings - **Account Tier**: Standard - **Replication**: LRS (dev/stage), GRS (production) - **Public Access**: Enabled (for CDN) - **TLS Version**: TLS 1.2 minimum ### CDN Settings - **SKU**: Standard_Microsoft - **HTTPS**: Enabled - **Compression**: Enabled - **Caching**: Optimized for static content ### CORS Configuration ```bash az storage cors add \ --services b \ --methods GET HEAD \ --origins "*" \ --allowed-headers "*" \ --exposed-headers "*" \ --max-age 3600 ``` ## URLs ### Direct Blob Storage URL ``` https://.blob.core.windows.net/images/.png ``` ### CDN URL (Recommended) ``` https://.azureedge.net/images/.png ``` ### Current Configuration - **Storage Account**: `theordercdn12439` - **CDN Endpoint**: `theordercdn12439.azureedge.net` - **Base URL**: `https://theordercdn12439.blob.core.windows.net/images/` ## Seal Files ### Available Seals 1. `digital-bank-seal.png` - Digital Bank of International Settlements 2. `iccc-seal.png` - International Criminal Court of Commerce 3. `iccc-provost-marshals-seal.png` - ICCC Provost Marshals 4. `diplomatic-security-seal.png` - Diplomatic Security Service 5. `legal-office-seal.png` - Legal Office of the Master ### File Sizes - 200x200px: For credential logos (default) - 400x400px: High-resolution displays - 800x800px: Print/embossing ## Troubleshooting ### CDN Not Propagating - CDN propagation can take 10-60 minutes - Use direct blob URL as fallback - Check CDN endpoint status: `az cdn endpoint show` ### Access Denied - Verify container access type is "blob" (public) - Check storage account public access is enabled - Verify CORS configuration ### Quota Exceeded - Review quota report: `azure-cdn-quota-report.txt` - Request quota increase via Azure portal - Consider using existing storage account ## Maintenance ### Update Seal Images 1. Convert new SVG to PNG: `./scripts/tools/convert-svg-to-png.sh` 2. Upload to Azure: `./scripts/deploy/upload-seals-to-azure.sh` 3. Update manifests: `./scripts/deploy/update-manifest-seal-urls.sh` ### Monitor Usage ```bash az storage account show-usage \ --name \ --resource-group ``` ### Cost Optimization - Use LRS for dev/stage (lower cost) - Enable CDN compression - Set appropriate cache headers - Monitor and optimize file sizes ## Security - ✅ HTTPS only (CDN enforces) - ✅ CORS configured - ✅ Public read-only access - ✅ No write access from public - ✅ Storage account firewall (optional) ## Related Documentation - [Entra VerifiedID Setup](./entra-verifiedid.md) - [Deployment Overview](../overview.md) - [Seal Design Guide](../../design/ORDER_SEALS_DESIGN_GUIDE.md) --- **Note**: This guide consolidates information from multiple Azure CDN setup files. Historical setup documents have been archived in `docs/archive/deployment/azure-cdn/`.