Multi-stage build: node:22-alpine + pnpm builds, nginx:1.27-alpine
serves. VITE_* env vars are passed as build args because Vite inlines
them into the JS bundle at build time. nginx config does SPA fallback,
caches /assets/* immutably, and forces no-store on sw.js/index.html so
PWA updates propagate.