370d62270b
The post-deploy blank/slow load: new hashed chunks weren't in Cloudflare yet, so the first visitor pulled them cold from the residential origin — AND the service worker simultaneously precached ~30 of those cold assets (a request storm), pushing past the 7s boot timeout. * sync-static.sh now warms the CF edge cache (fetches every immutable asset through the public domain) so the first visitor gets HITs, not cold-origin. * Service worker no longer bulk-precaches on install (the browser already caches immutable assets for a year); it caches the shell + assets lazily as used. No more storm. * Boot-recovery timeout 7s → 10s so a merely-slow load doesn't flash the card. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
28 lines
1.6 KiB
Bash
Executable File
28 lines
1.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Sync the built static site to the live root in an order that avoids deploy-race
|
|
# blank screens. rsync isn't atomic, so a naïve `rsync --delete` can briefly serve
|
|
# a NEW index.html that points at chunks not synced yet (→ failed load), or delete
|
|
# old chunks an in-flight client still needs. Instead:
|
|
# 1. new hashed chunks first, and DON'T prune old ones (grace window)
|
|
# 2. other static assets (version.json, env.js, icons…), pruning removed files
|
|
# 3. the shell HTML — only once its chunks already exist
|
|
# 4. the service worker last — a returning client adopts it only after the rest
|
|
# Old immutable chunks are pruned after a grace window to bound disk growth.
|
|
set -euo pipefail
|
|
src="$1"; site="$2"
|
|
|
|
rsync -a "$src/_app/immutable/" "$site/_app/immutable/"
|
|
rsync -a --delete \
|
|
--exclude='_app/immutable/***' --exclude='index.html' --exclude='service-worker.js' \
|
|
"$src/" "$site/"
|
|
rsync -a "$src/index.html" "$site/index.html"
|
|
rsync -a "$src/service-worker.js" "$site/service-worker.js"
|
|
find "$site/_app/immutable" -type f -mtime +14 -delete 2>/dev/null || true
|
|
|
|
# Warm the Cloudflare edge cache: fetch every immutable asset through the public
|
|
# domain so the FIRST real visitor after a deploy gets cache HITs instead of slow
|
|
# cold fetches from the (residential) origin — the post-deploy blank/slow-load cause.
|
|
echo " warming edge cache…"
|
|
find "$site/_app/immutable" -type f \( -name '*.js' -o -name '*.css' \) -printf '/_app/immutable/%P\n' \
|
|
| xargs -P 8 -I{} curl -fsS -o /dev/null --max-time 20 "https://upbeatbytes.com{}" 2>/dev/null || true
|