cloudflare worker che fa da proxy per gli asset media di insidegubbio.com (audio, video, foto) da un bucket privato backblaze b2, firmando le richieste con aws signature v4.
browser
|
| GET https://araldo.insidegubbio.com/video/example.mp4
| Range: bytes=0-1048575
v
cloudflare worker
|
| firma la richiesta (incluso l'header range)
v
cloudflare edge cache
| (se il chunk e' gia' in cache, b2 non viene contattato)
v
backblaze b2 (bucket privato, api s3-compatibile)
|
| risponde 200 o 206 partial content
v
browser
il bucket e' privato, nessun url b2 e' esposto. tutto passa dal worker, che firma ogni richiesta e lascia che cloudflare edge metta in cache i chunk.
questo worker ora gestisce solo media:
| prima | ora | |
|---|---|---|
| cache documenti | 1 ora | rimossa |
| cache media | 1 anno | 1 anno + immutable |
| range requests | inoltrate ma non firmate | firmate correttamente |
x-amz-content-sha256 |
assente | presente |
accept-ranges: bytes |
assente | sempre presente |
| cors | assente | * su get/head |
| metodi accettati | tutti | solo get e head |
lo streaming video e audio funziona tramite range requests: il browser chiede un chunk alla volta (Range: bytes=X-Y) per permettere il seek senza scaricare tutto il file.
il worker firma l'header range quando presente. senza questa firma b2 risponde con 403 e il seek non funziona.
tutti i file hanno cache-control: public, max-age=31536000, immutable (1 anno).
per aggiornare un file prima della scadenza, rinominalo o aggiungi una versione nel percorso:
# vecchio
/foto/piazza.jpg
# nuovo (invalida la cache automaticamente)
/foto/piazza-v2.jpg
- crea il bucket (privato)
- app keys > add a new application key
- limita l'accesso al bucket
assets.insidegubbio - type of access: read only
- limita l'accesso al bucket
- copia
keyIDeapplicationKeysubito, b2 mostra il secret una volta sola
-
crea un nuovo worker e incolla il codice da
worker.js -
settings > variables > environment variables:
variabile valore B2_ACCESS_KEY_IDil keyIDdi b2B2_SECRET_ACCESS_KEYl' applicationKeydi b2 (aggiungi come secret) -
deploy
workers > media > triggers > custom domains
aggiungi assets.insidegubbio.com. cloudflare gestisce routing e tls automaticamente.
non usare un cname diretto verso b2: il certificato b2 non copre sottodomini con il nome del bucket e causa errori tls 526. il dominio custom va agganciato al worker, non a b2.
| variabile | descrizione |
|---|---|
B2_ACCESS_KEY_ID |
id della application key di b2 |
B2_SECRET_ACCESS_KEY |
secret della application key (salvare come secret, non plain text) |
B2_ENDPOINT, BUCKET_NAME e REGION sono hardcoded in worker.js perche' non variano.