Skip to content

Latest commit

 

History

15 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 

Repository files navigation

araldo

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.

architettura

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.

come funziona?

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

range requests 🎬

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.

cache

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

setup

1. backblaze b2

  1. crea il bucket (privato)
  2. app keys > add a new application key
    • limita l'accesso al bucket assets.insidegubbio
    • type of access: read only
  3. copia keyID e applicationKey subito, b2 mostra il secret una volta sola

2. cloudflare worker

  1. crea un nuovo worker e incolla il codice da worker.js

  2. settings > variables > environment variables:

    variabile valore
    B2_ACCESS_KEY_ID il keyID di b2
    B2_SECRET_ACCESS_KEY l'applicationKey di b2 (aggiungi come secret)
  3. deploy

3. dominio personalizzato

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.

variabili d'ambiente

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.

About

vassallo - insidegubbio's worker to actually serve files

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages