Completely static website with static content. No backend required.
Live at nautilusit.nl.
Open http://127.0.0.1:3000/index.html
User → Cloudflare (CDN + SSL + cache) → Worker (Host rewrite) → Azure Blob Storage ($web)
- Hosting: Azure Blob Storage static website (
stnautilusitprod, container$web) - CDN & SSL: Cloudflare (free tier) — caching, HTTPS, DDoS protection
- Host header rewrite: A Cloudflare Worker (
nautilusit-proxy) rewrites the Host header tostnautilusitprod.z6.web.core.windows.netso Azure Blob Storage routes the request to the correct storage account - DNS: Managed by Cloudflare (domain registered at Porkbun)
- CI/CD: GitHub Actions — see
.github/workflows/deploy.yaml
Pushes to main automatically deploy via GitHub Actions:
- Upload files to Azure Blob Storage
$webcontainer - Purge Cloudflare cache so changes are served immediately
| Secret | Purpose |
|---|---|
AZURE_CREDENTIALS |
Service principal for uploading to Azure Blob Storage |
CLOUDFLARE_ZONE_ID |
Cloudflare zone ID for nautilusit.nl |
CLOUDFLARE_API_TOKEN |
Scoped token with Zone:Cache Purge permission |
External scripts in index.html are pinned to a specific version with Subresource Integrity (SRI) hashes. If you bump a version you must regenerate the hash, otherwise the browser will refuse to execute the script.
curl -sL <cdn-url> | openssl dgst -sha384 -binary | openssl base64 -APrefix the output with sha384- in the integrity attribute. marked is pinned to v4 on purpose — v5 removed the highlight option used by assets/js/script.js.
- Projects — replace placeholder Bluelabel card with real screenshots once available.
- About:Services — replace SVG icons with ones that match each service.
- Migrate
deploy.yamlfromAZURE_CREDENTIALSsecret to OIDC federated credentials (see inline TODO comment in the workflow).