Usa il tuo storage + CDN
Collega il tuo object storage e la tua CDN con i piani API Velocity e Momentum: configurazione per provider, permessi minimi, verifica della connessione e cosa succede quando cambi modalità.
Disponibile con: i piani API Velocity e Momentum. Non disponibile con Ignite (non include una CDN), nella sandbox per sviluppatori (i file della sandbox sono temporanei) né con i piani WordPress (usano la CDN gestita di smallPict).
In breve: in modalità BYO, smallPict scrive i tuoi originali e le immagini ottimizzate nel tuo bucket, e la tua CDN li distribuisce. Storage e CDN sono sempre collegati insieme: non puoi portare l’uno senza l’altra.
Che cos’è BYO
Velocity e Momentum offrono due modalità di distribuzione. Ne scegli una in Dashboard → CDN e storage.
- Gestita (predefinita): smallPict conserva i tuoi originali nel proprio storage crittografato (spostati in un archivio a lungo termine dopo 90 giorni) e distribuisce le immagini ottimizzate da
cdn.smallpict.app. Nessuna configurazione necessaria. - Usa il tuo storage + CDN (BYO): colleghi un bucket compatibile con S3 nel tuo account e una CDN nel tuo account. Ogni nuovo job scrive l’originale e il file ottimizzato nel tuo bucket, e l’API restituisce URL sul dominio della tua CDN.
Il vincolo esiste perché smallPict deve poter gestire entrambe le metà della distribuzione: scrivere i file ed eliminare dalla cache le copie obsolete. Un bucket senza CDN lascerebbe le purghe della cache senza destinazione; una CDN senza bucket non avrebbe nulla da distribuire.
Gestita vs. BYO
| Gestita (predefinita) | Usa il tuo storage + CDN | |
|---|---|---|
| Originali | Storage crittografato di smallPict | originals/<job_id>/<file> nel tuo bucket |
| File ottimizzati | Distribuiti da cdn.smallpict.app | optimized/<job_id>.<ext> nel tuo bucket, distribuiti dal dominio della tua CDN |
| Quota di storage | Velocity 50 GB, Momentum 100 GB | Non conteggiata. Paghi il tuo provider di storage. |
| Banda CDN | Velocity 30 GB/mese, Momentum 200 GB/mese | Non conteggiata. Paghi il tuo provider CDN. |
| Trasformazioni | Conteggiate nel tuo piano | Conteggiate nel tuo piano |
| Copia conservata da smallPict | Sì, finché il tuo account è attivo | Nessuna. Solo il caricamento temporaneo per l’elaborazione, eliminato entro 24 ore. |
| Purga della cache | Automatica | Automatica, tramite l’API della tua CDN |
| Prestazioni, dominio e costi della CDN | smallPict | Tu. smallPict non è responsabile delle prestazioni, dei domini o delle fatture della tua CDN. |
Provider supportati
Storage (disponibili oggi): Amazon S3, Cloudflare R2, Google Cloud Storage (interoperabilità S3), Alibaba Cloud OSS, Tencent Cloud COS, DigitalOcean Spaces, SumoPod Storage, MinIO e qualsiasi altro servizio compatibile con S3 tramite un endpoint personalizzato (ad esempio Hetzner, Vultr o Wasabi).
CDN (disponibili oggi): Cloudflare e Amazon CloudFront.
Previsti: Azure Blob Storage e altre CDN. Puoi richiedere l’accesso anticipato nella pagina Provider cloud.
Prima di iniziare
- Hai un piano API Velocity o Momentum e hai effettuato l’accesso come amministratore dell’account.
- Hai un bucket e una CDN che distribuisce i file di quel bucket tramite HTTPS.
- L’endpoint dello storage è raggiungibile da Internet tramite HTTPS. Gli endpoint privati, interni e in HTTP semplice vengono rifiutati.
- Hai creato chiavi con permessi limitati per smallPict (vedi Permessi minimi più avanti). Non usare le chiavi root o di amministratore del tuo account.
Poi apri Dashboard → CDN e storage, scegli Usa il tuo storage + CDN, compila entrambe le parti e seleziona Salva storage + CDN. smallPict esegue la verifica della connessione (descritta più avanti) e passa alla modalità BYO solo se la verifica viene superata.
Guide alla configurazione
A. Amazon S3 + Amazon CloudFront
- Crea il bucket nella regione che preferisci, ad esempio
my-imagesinap-southeast-1. Lascia attivo Block Public Access. - Crea una distribuzione CloudFront con il bucket come origine. Usa Origin access control (OAC) in modo che CloudFront possa leggere il bucket mentre resta privato, e applica la bucket policy che CloudFront ti propone.
- Facoltativo: il tuo dominio. Aggiungi un nome di dominio alternativo (ad esempio
images.example.com) e un certificato alla distribuzione, e fai puntare un record DNS alla distribuzione. - Crea un utente IAM (o un ruolo) per lo storage con questa policy:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:DeleteObject" ], "Resource": "arn:aws:s3:::my-images/*" } ]}- Crea un utente IAM per CloudFront (può essere lo stesso utente) con questa policy.
cloudfront:GetDistributionè facoltativo; con questo permesso, smallPict può rilevare il dominio della distribuzione quando lasci vuoto il dominio CDN.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "cloudfront:CreateInvalidation", "cloudfront:GetDistribution" ], "Resource": "arn:aws:cloudfront::123456789012:distribution/E2QWRUHAPOMQZL" } ]}- Nella dashboard:
- Provider di storage Amazon S3, bucket
my-images, regioneap-southeast-1, endpoint vuoto (viene usato l’endpoint standard della regione), più l’access key ID e il secret dello storage. - CDN Amazon CloudFront, il Distribution ID (ad esempio
E2QWRUHAPOMQZL), l’access key ID e il secret di CloudFront e, facoltativamente, il dominio CDN (https://images.example.com). Lascia vuoto il dominio per usare il dominio*.cloudfront.netdella distribuzione.
- Provider di storage Amazon S3, bucket
B. Cloudflare R2 + Cloudflare
- Crea un bucket R2, ad esempio
my-images. - Collega un dominio personalizzato al bucket (R2 → il tuo bucket → Settings → Custom Domains), ad esempio
images.example.com, su una zona dello stesso account Cloudflare. Le richieste a quel dominio passano dalla cache di Cloudflare. Non usare l’URL di sviluppor2.devin produzione. - Crea un token API R2 (R2 → Manage API tokens) con Object Read & Write, limitato solo a questo bucket. Copia l’Access Key ID e la Secret Access Key mostrati.
- Crea un token API Cloudflare (My Profile → API Tokens) per la zona con Zone → Cache Purge → Purge. Zone → Zone → Read è facoltativo.
- Nella dashboard:
- Provider di storage Cloudflare R2, bucket
my-images, endpointhttps://<account_id>.r2.cloudflarestorage.com(indicato nei dettagli S3 API del bucket), regioneauto, più l’Access Key ID e la Secret Access Key di R2. - CDN Cloudflare, lo Zone ID (pagina Overview del dominio, sezione API), il token API e il dominio CDN
https://images.example.com.
- Provider di storage Cloudflare R2, bucket
C. Google Cloud Storage + Cloudflare
Google Cloud Storage si collega tramite la sua XML API compatibile con S3, con chiavi HMAC.
- Crea il bucket, ad esempio
my-images. - Crea un service account e assegnagli il ruolo Storage Object User (
roles/storage.objectUser) solo su questo bucket. - Crea una chiave HMAC per il service account: Cloud Storage → Settings → Interoperability → Create a key for a service account. Copia l’access ID e il secret.
- Rendi i file ottimizzati leggibili dalla tua CDN. Cloudflare recupera i file da Cloud Storage tramite HTTPS, quindi gli oggetti sotto
optimized/devono essere leggibili pubblicamente. Con l’uniform bucket-level access, concedere aallUsersil ruolo Storage Object Viewer rende leggibile l’intero bucket,originals/compreso. Se i tuoi originali devono restare privati, metti davanti un livello di autenticazione (ad esempio un Cloudflare Worker che firma le richieste al bucket). - Fai puntare un record DNS Cloudflare con proxy a Cloud Storage, ad esempio
images.example.com. Puoi dare al bucket il nome dell’hostname e usare un CNAME con proxy versoc.storage.googleapis.com, oppure usare una Cloudflare Origin Rule che invia le richieste astorage.googleapis.comcon il nome del bucket all’inizio del percorso. - Crea un token API Cloudflare per la zona con Zone → Cache Purge → Purge (Zone → Zone → Read facoltativo).
- Nella dashboard: provider di storage Google Cloud Storage, bucket, endpoint
https://storage.googleapis.com, regioneauto, l’access ID e il secret HMAC; CDN Cloudflare, Zone ID, token API e dominio CDNhttps://images.example.com.
D. MinIO o qualsiasi storage compatibile con S3 + Cloudflare
Questa sezione riguarda MinIO e i servizi compatibili con S3 come Hetzner, Wasabi, Vultr, SumoPod, Alibaba Cloud OSS, Tencent Cloud COS e DigitalOcean Spaces.
| Provider | Scelta nella dashboard | Endpoint | Note |
|---|---|---|---|
| MinIO | MinIO | Il tuo server, es. https://minio.example.com | Richieste path-style attive. Il server deve essere raggiungibile da Internet tramite HTTPS. |
| Hetzner Object Storage | Personalizzato compatibile S3 | https://<location>.your-objectstorage.com | |
| Wasabi | Personalizzato compatibile S3 | https://s3.<region>.wasabisys.com | |
| Vultr Object Storage | Personalizzato compatibile S3 | https://<region>.vultrobjects.com | |
| SumoPod Storage | SumoPod Storage | Dalla dashboard dello storage SumoPod | Path-style attivo per impostazione predefinita. |
| Alibaba Cloud OSS | Alibaba Cloud OSS | https://oss-<region>.aliyuncs.com | Solo virtual-hosted style. |
| Tencent Cloud COS | Tencent Cloud COS | https://cos.<region>.myqcloud.com | Il nome del bucket include il tuo APPID, es. my-images-1250000000. |
| DigitalOcean Spaces | DigitalOcean Spaces | https://<region>.digitaloceanspaces.com |
- Crea il bucket e una chiave limitata a quel bucket con put, get e delete sugli oggetti (vedi Permessi minimi più avanti).
- Rendi
optimized/leggibile dalla tua CDN, ad esempio con una bucket policy che consentas3:GetObjectanonimo solo suoptimized/*. Su MinIO:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "*" ] }, "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::my-images/optimized/*" ] } ]}- Metti Cloudflare davanti al bucket: un record DNS con proxy per
images.example.comche punti all’host pubblico del bucket. Se il provider richiede il proprio hostname nella richiesta, aggiungi una Cloudflare Origin Rule che riscriva l’header Host (e, per gli host path-style, aggiunga il nome del bucket al percorso). - Crea un token API Cloudflare per la zona con Zone → Cache Purge → Purge (Zone → Zone → Read facoltativo).
- Nella dashboard: scegli il provider dalla tabella, inserisci bucket, endpoint, regione (
autose il provider non ne ha una) e chiavi; attiva le richieste path-style dove la tabella lo indica; poi CDN Cloudflare, Zone ID, token API e dominio CDN.
Permessi minimi
Dai a smallPict chiavi che possano fare solo ciò che serve, su un solo bucket.
| Provider | Permessi |
|---|---|
| Amazon S3 | s3:PutObject, s3:GetObject, s3:DeleteObject su arn:aws:s3:::<bucket>/* |
| Amazon CloudFront | cloudfront:CreateInvalidation sulla distribuzione; cloudfront:GetDistribution facoltativo per rilevare il dominio |
| Cloudflare R2 | Token API R2 con Object Read & Write, limitato al bucket |
| Cloudflare (CDN) | Token API per la zona con Zone → Cache Purge → Purge; Zone → Zone → Read facoltativo |
| Google Cloud Storage | Chiave HMAC per un service account con roles/storage.objectUser sul bucket |
| Alibaba Cloud OSS | Utente RAM con oss:PutObject, oss:GetObject, oss:DeleteObject sul bucket |
| Tencent Cloud COS | Sottoutente CAM con cos:PutObject, cos:GetObject, cos:DeleteObject sul bucket (il nome del bucket include l’APPID) |
| DigitalOcean Spaces | Chiave di accesso Spaces limitata al bucket con lettura, scrittura ed eliminazione |
| MinIO / personalizzato compatibile S3 | Put, get e delete su <bucket>/*; l’endpoint deve essere HTTPS pubblico |
La verifica della connessione
Ogni volta che salvi (e quando selezioni Ripeti verifica), smallPict verifica l’intera connessione prima di usarla:
- Storage: scrive un piccolo file di prova in
.smallpict-probe/nel tuo bucket, lo rilegge e lo elimina. - Cloudflare: invia alla tua zona una purga di prova per un singolo URL.
- CloudFront: crea un’invalidazione di prova per un percorso
/.smallpict-probe/.... Viene conteggiata nei percorsi di invalidazione CloudFront del mese.
Se un passaggio non riesce, non viene cambiato nulla. La dashboard mostra il motivo accanto al campo interessato, ad esempio il nome del bucket o il token API. La verifica della connessione è limitata a 5 tentativi al minuto.
Accesso al bucket per la tua CDN
optimized/deve essere leggibile dalla tua CDN: con lettura pubblica su quel prefisso oppure con l’accesso origine della CDN a un bucket privato (origin access control di CloudFront o un dominio personalizzato R2).originals/può restare privato. La tua CDN non ne ha mai bisogno.- CORS serve solo se i browser recuperano le immagini cross-origin da JavaScript (ad esempio
fetch()o un canvas). I normali tag<img>non ne hanno bisogno. Se ti serve, consentiGETeHEADdall’origine del tuo sito.
Struttura degli oggetti e URL
| Cosa | Chiave nel tuo bucket | URL |
|---|---|---|
| Originale | originals/<job_id>/<file> | Non distribuito |
| File ottimizzato | optimized/<job_id>.<ext> | <cdn_domain>/optimized/<job_id>.<ext> |
Il dominio CDN può includere un prefisso di percorso, ad esempio https://example.com/images; in tal caso l’URL diventa https://example.com/images/optimized/<job_id>.<ext>.
Header di cache
I file ottimizzati vengono scritti con Cache-Control: public, max-age=31536000, immutable. Ogni job riceve una chiave univoca, quindi un nuovo risultato ha sempre un nuovo URL e la purga serve raramente. Evita che le regole di caching della tua CDN sovrascrivano questo header con una durata più breve.
Purga della cache
- Le richieste di purga effettuate tramite l’API (
POST /v1/purge) vanno alla tua CDN, raggruppate in batch. - Su Cloudflare, i file vengono purgati per URL. "Purge all" purga solo il tuo host di distribuzione e il prefisso di percorso, non l’intera zona.
- Su CloudFront, i file vengono purgati con invalidazioni. "Purge all" crea un’invalidazione
/*. I percorsi di invalidazione oltre la quota gratuita mensile di CloudFront vengono addebitati da AWS sul tuo account.
Cambiare modalità
Cambiare modalità non sposta i file esistenti. I file già distribuiti mantengono i loro URL attuali; solo i nuovi job usano la nuova modalità.
- Gestita → BYO: i nuovi job vanno nel tuo bucket e vengono distribuiti dalla tua CDN. I file già su
cdn.smallpict.apprestano lì. - BYO → gestita: i nuovi job tornano a usare storage e CDN gestiti. Le impostazioni e le chiavi BYO restano salvate ma non in uso, così puoi tornare indietro senza reinserirle, finché non selezioni Disconnetti.
- Disconnetti: elimina le chiavi e le impostazioni BYO salvate e ti riporta alla modalità gestita. I file nel tuo bucket non vengono toccati.
Quando qualcosa non funziona
- Se smallPict non riesce a scrivere nel tuo bucket, riprova e poi fa fallire il job con un motivo che puoi leggere nella risposta dell’API.
- La dashboard mostra l’ultimo errore e quando si è verificato, con un pulsante Ripeti verifica.
- Ricevi un’email per incidente, non una per ogni job non riuscito.
- smallPict non ripiega mai sullo storage gestito. I tuoi file non vengono mai salvati in un luogo che non hai scelto.
Sicurezza
- Le chiavi sono conservate in un archivio di segreti crittografato. Non vengono mai più mostrate, non vengono mai restituite dall’API e non vengono mai scritte nei log.
- Per ruotare una chiave, inserisci quella nuova e salva; la verifica della connessione viene eseguita con la nuova chiave. Lascia vuoto un campo chiave per mantenere la chiave salvata.
- Gli endpoint di storage e CDN devono usare HTTPS. Gli endpoint che si risolvono in indirizzi privati, di loopback, link-local o comunque interni vengono rifiutati.
- Usa chiavi separate e con permessi limitati per smallPict, e revocale nella console del provider se smetti di usare BYO.