Kendi Depolamanız + CDN’iniz
API Velocity ve Momentum planlarında kendi nesne depolamanızı ve kendi CDN’inizi bağlayın: sağlayıcıya göre kurulum, minimum izinler, bağlantı kontrolü ve mod değiştirdiğinizde ne olduğu.
Kullanılabildiği planlar: API Velocity ve Momentum. Ignite’ta (CDN içermez), geliştirici sandbox’ında (sandbox dosyaları geçicidir) ve WordPress planlarında (yönetilen smallPict CDN’ini kullanırlar) kullanılamaz.
Kısaca: BYO modunda smallPict orijinallerinizi ve optimize edilmiş görsellerinizi sizin bucket’ınıza yazar ve bunları sizin CDN’iniz sunar. Depolama ve CDN her zaman birlikte bağlanır: biri olmadan diğerini getiremezsiniz.
BYO nedir
Velocity ve Momentum’da iki teslim modu vardır. Birini Panel → CDN ve depolama bölümünde seçersiniz.
- Yönetilen (varsayılan): smallPict orijinallerinizi kendi şifreli depolamasında tutar (90 gün sonra uzun süreli arşive taşınır) ve optimize edilmiş görselleri
cdn.smallpict.appüzerinden sunar. Kurulacak bir şey yoktur. - Kendi depolamanız + CDN’iniz (BYO): kendi hesabınızdaki S3 uyumlu bir bucket’ı ve kendi hesabınızdaki bir CDN’i bağlarsınız. Her yeni iş, orijinali ve optimize edilmiş dosyayı bucket’ınıza yazar ve API, CDN alan adınızdaki URL’leri döndürür.
Birlikte bağlama kuralı, smallPict’in teslimatın iki yarısını da yapabilmesi gerektiği için vardır: dosyaları yazmak ve eski kopyaları önbellekten temizlemek. CDN’siz bir bucket’ta önbellek temizleme isteklerinin gidecek yeri olmazdı; bucket’sız bir CDN’in ise sunacak bir şeyi olmazdı.
Yönetilen ve BYO karşılaştırması
| Yönetilen (varsayılan) | Kendi depolamanız + CDN’iniz | |
|---|---|---|
| Orijinaller | smallPict şifreli depolaması | Bucket’ınızda originals/<job_id>/<file> |
| Optimize edilmiş dosyalar | cdn.smallpict.app üzerinden sunulur | Bucket’ınızda optimized/<job_id>.<ext>, CDN alan adınızdan sunulur |
| Depolama kotası | Velocity 50 GB, Momentum 100 GB | Sayılmaz. Depolama sağlayıcınıza ödersiniz. |
| CDN bant genişliği | Velocity 30 GB/ay, Momentum 200 GB/ay | Sayılmaz. CDN sağlayıcınıza ödersiniz. |
| Dönüşümler | Planınızdan düşülür | Planınızdan düşülür |
| smallPict’te tutulan kopya | Evet, hesabınız aktif olduğu sürece | Yok. Yalnızca 24 saat içinde silinen geçici işleme yüklemesi. |
| Önbellek temizleme | Otomatik | Otomatik, CDN’inizin API’si üzerinden |
| CDN performansı, alan adı ve maliyetleri | smallPict | Siz. smallPict, CDN’inizin performansından, alan adlarından veya faturalarından sorumlu değildir. |
Desteklenen sağlayıcılar
Depolama (şu anda kullanılabilir): Amazon S3, Cloudflare R2, Google Cloud Storage (S3 birlikte çalışabilirliği), Alibaba Cloud OSS, Tencent Cloud COS, DigitalOcean Spaces, SumoPod Storage, MinIO ve özel bir endpoint üzerinden diğer tüm S3 uyumlu hizmetler (örneğin Hetzner, Vultr veya Wasabi).
CDN (şu anda kullanılabilir): Cloudflare ve Amazon CloudFront.
Planlanan: Azure Blob Storage ve diğer CDN’ler. Bulut sağlayıcıları sayfasından erken erişim isteyebilirsiniz.
Başlamadan önce
- API Velocity veya Momentum planındasınız ve hesap yöneticisi olarak oturum açtınız.
- Bir bucket’ınız ve bu bucket’taki dosyaları HTTPS üzerinden sunan bir CDN’iniz var.
- Depolama endpoint’ine internetten HTTPS ile erişilebiliyor. Özel, dahili ve düz HTTP endpoint’leri reddedilir.
- smallPict için dar kapsamlı anahtarlar oluşturdunuz (aşağıdaki Minimum izinler bölümüne bakın). Hesabınızın root veya yönetici anahtarlarını kullanmayın.
Ardından Panel → CDN ve depolama bölümünü açın, Kendi depolamanız + CDN’iniz seçeneğini seçin, iki bölümü de doldurun ve Depolama + CDN’i kaydet düğmesine tıklayın. smallPict bağlantı kontrolünü (aşağıda açıklanmıştır) çalıştırır ve sizi yalnızca kontrol başarılı olursa BYO’ya geçirir.
Kurulum kılavuzları
A. Amazon S3 + Amazon CloudFront
- Bucket’ı oluşturun; istediğiniz bölgede, örneğin
ap-southeast-1bölgesindemy-images. Block Public Access ayarını açık tutun. - Bir CloudFront dağıtımı oluşturun ve kaynağı (origin) olarak bucket’ı seçin. Bucket özel kalırken CloudFront’un onu okuyabilmesi için Origin access control (OAC) kullanın ve CloudFront’un önerdiği bucket politikasını uygulayın.
- İsteğe bağlı: kendi alan adınız. Dağıtıma alternatif bir alan adı (örneğin
images.example.com) ve bir sertifika ekleyin, ardından bir DNS kaydını dağıtıma yönlendirin. - Depolama için bir IAM kullanıcısı (veya rolü) oluşturun, şu politikayla:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:DeleteObject" ], "Resource": "arn:aws:s3:::my-images/*" } ]}- CloudFront için bir IAM kullanıcısı oluşturun (aynı kullanıcı olabilir), şu politikayla.
cloudfront:GetDistributionisteğe bağlıdır; bu izinle smallPict, CDN alan adını boş bıraktığınızda dağıtımın alan adını algılayabilir.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "cloudfront:CreateInvalidation", "cloudfront:GetDistribution" ], "Resource": "arn:aws:cloudfront::123456789012:distribution/E2QWRUHAPOMQZL" } ]}- Panelde:
- Depolama sağlayıcısı Amazon S3, bucket
my-images, bölgeap-southeast-1, endpoint boş (bölgenin standart endpoint’i kullanılır) ve depolama için access key ID ile secret. - CDN Amazon CloudFront, Distribution ID (örneğin
E2QWRUHAPOMQZL), CloudFront için access key ID ile secret ve isteğe bağlı olarak CDN alan adı (https://images.example.com). Dağıtımın kendi*.cloudfront.netalan adını kullanmak için alan adını boş bırakın.
- Depolama sağlayıcısı Amazon S3, bucket
B. Cloudflare R2 + Cloudflare
- Bir R2 bucket’ı oluşturun, örneğin
my-images. - Bucket’a özel bir alan adı bağlayın (R2 → bucket’ınız → Settings → Custom Domains), örneğin aynı Cloudflare hesabındaki bir zone’da
images.example.com. Bu alan adına gelen istekler Cloudflare önbelleğinden geçer. Üretimder2.devgeliştirme URL’sini kullanmayın. - Bir R2 API token’ı oluşturun (R2 → Manage API tokens); Object Read & Write izniyle ve yalnızca bu bucket ile sınırlı. Gösterilen Access Key ID ve Secret Access Key değerlerini kopyalayın.
- Bir Cloudflare API token’ı oluşturun (My Profile → API Tokens); zone için Zone → Cache Purge → Purge izniyle. Zone → Zone → Read isteğe bağlıdır.
- Panelde:
- Depolama sağlayıcısı Cloudflare R2, bucket
my-images, endpointhttps://<account_id>.r2.cloudflarestorage.com(bucket’ınızın S3 API ayrıntılarında gösterilir), bölgeautove R2 Access Key ID ile Secret Access Key. - CDN Cloudflare, Zone ID (alan adının Overview sayfası, API bölümü), API token’ı ve CDN alan adı
https://images.example.com.
- Depolama sağlayıcısı Cloudflare R2, bucket
C. Google Cloud Storage + Cloudflare
Google Cloud Storage, HMAC anahtarlarıyla S3 uyumlu XML API’si üzerinden bağlanır.
- Bucket’ı oluşturun, örneğin
my-images. - Bir hizmet hesabı oluşturun ve ona yalnızca bu bucket üzerinde Storage Object User (
roles/storage.objectUser) rolünü verin. - Hizmet hesabı için bir HMAC anahtarı oluşturun: Cloud Storage → Settings → Interoperability → Create a key for a service account. Access ID ve secret değerlerini kopyalayın.
- Optimize edilmiş dosyaları CDN’iniz için okunabilir yapın. Cloudflare dosyaları Cloud Storage’dan HTTPS ile alır, bu yüzden
optimized/altındaki nesnelerin herkese açık okunabilir olması gerekir. Tek tip bucket düzeyinde erişimde (uniform bucket-level access)allUsersgrubuna Storage Object Viewer rolünü vermek,originals/dahil tüm bucket’ı okunabilir yapar. Orijinallerinizin özel kalması gerekiyorsa önüne kimlik doğrulayan bir katman koyun (örneğin bucket’a giden istekleri imzalayan bir Cloudflare Worker). - Proxy’lenen bir Cloudflare DNS kaydını Cloud Storage’a yönlendirin, örneğin
images.example.com. Ya bucket’a ana makine adını veripc.storage.googleapis.comadresine proxy’lenen bir CNAME kullanın ya da istekleri yolun başında bucket adıylastorage.googleapis.comadresine gönderen bir Cloudflare Origin Rule kullanın. - Bir Cloudflare API token’ı oluşturun; zone için Zone → Cache Purge → Purge izniyle (Zone → Zone → Read isteğe bağlı).
- Panelde: depolama sağlayıcısı Google Cloud Storage, bucket, endpoint
https://storage.googleapis.com, bölgeauto, HMAC access ID ve secret; CDN Cloudflare, Zone ID, API token’ı ve CDN alan adıhttps://images.example.com.
D. MinIO veya herhangi bir S3 uyumlu depolama + Cloudflare
Bu bölüm MinIO’yu ve Hetzner, Wasabi, Vultr, SumoPod, Alibaba Cloud OSS, Tencent Cloud COS ve DigitalOcean Spaces gibi S3 uyumlu hizmetleri kapsar.
| Sağlayıcı | Panelde seçin | Endpoint | Notlar |
|---|---|---|---|
| MinIO | MinIO | Sunucunuz, ör. https://minio.example.com | Path-style istekler açık. Sunucuya internetten HTTPS ile erişilebilmelidir. |
| Hetzner Object Storage | Özel S3 uyumlu | https://<location>.your-objectstorage.com | |
| Wasabi | Özel S3 uyumlu | https://s3.<region>.wasabisys.com | |
| Vultr Object Storage | Özel S3 uyumlu | https://<region>.vultrobjects.com | |
| SumoPod Storage | SumoPod Storage | SumoPod depolama panelinizden | Path-style varsayılan olarak açık. |
| Alibaba Cloud OSS | Alibaba Cloud OSS | https://oss-<region>.aliyuncs.com | Yalnızca virtual-hosted stili. |
| Tencent Cloud COS | Tencent Cloud COS | https://cos.<region>.myqcloud.com | Bucket adı APPID’nizi içerir, ör. my-images-1250000000. |
| DigitalOcean Spaces | DigitalOcean Spaces | https://<region>.digitaloceanspaces.com |
- Bucket’ı oluşturun ve yalnızca o bucket ile sınırlı, nesnelerde yazma, okuma ve silme izni olan bir anahtar oluşturun (aşağıdaki Minimum izinler bölümüne bakın).
optimized/klasörünü CDN’iniz için okunabilir yapın, örneğin yalnızcaoptimized/*için anonims3:GetObjectizni veren bir bucket politikasıyla. MinIO’da:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "*" ] }, "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::my-images/optimized/*" ] } ]}- Bucket’ın önüne Cloudflare koyun:
images.example.comiçin bucket’ın herkese açık ana makinesine işaret eden, proxy’lenen bir DNS kaydı. Sağlayıcı istekte kendi ana makine adını istiyorsa Host başlığını yeniden yazan (ve path-style ana makineler için yola bucket adını ekleyen) bir Cloudflare Origin Rule ekleyin. - Bir Cloudflare API token’ı oluşturun; zone için Zone → Cache Purge → Purge izniyle (Zone → Zone → Read isteğe bağlı).
- Panelde: tablodan sağlayıcıyı seçin; bucket’ı, endpoint’i, bölgeyi (sağlayıcının bölgesi yoksa
auto) ve anahtarları girin; tabloda belirtildiyse path-style istekleri açın; ardından CDN Cloudflare, Zone ID, API token’ı ve CDN alan adı.
Minimum izinler
smallPict’e yalnızca ihtiyaç duyduğu işlemleri, tek bir bucket üzerinde yapabilen anahtarlar verin.
| Sağlayıcı | İzinler |
|---|---|
| Amazon S3 | arn:aws:s3:::<bucket>/* üzerinde s3:PutObject, s3:GetObject, s3:DeleteObject |
| Amazon CloudFront | Dağıtım üzerinde cloudfront:CreateInvalidation; alan adının algılanabilmesi için isteğe bağlı cloudfront:GetDistribution |
| Cloudflare R2 | Bucket ile sınırlı, Object Read & Write izinli R2 API token’ı |
| Cloudflare (CDN) | Zone için Zone → Cache Purge → Purge izinli API token’ı; isteğe bağlı Zone → Zone → Read |
| Google Cloud Storage | Bucket üzerinde roles/storage.objectUser rolüne sahip bir hizmet hesabı için HMAC anahtarı |
| Alibaba Cloud OSS | Bucket üzerinde oss:PutObject, oss:GetObject, oss:DeleteObject izinli RAM kullanıcısı |
| Tencent Cloud COS | Bucket üzerinde cos:PutObject, cos:GetObject, cos:DeleteObject izinli CAM alt kullanıcısı (bucket adı APPID’yi içerir) |
| DigitalOcean Spaces | Bucket ile sınırlı, okuma, yazma ve silme izinli Spaces erişim anahtarı |
| MinIO / özel S3 uyumlu | <bucket>/* üzerinde yazma, okuma ve silme; endpoint herkese açık HTTPS olmalıdır |
Bağlantı kontrolü
Her kaydettiğinizde (ve Kontrolü yeniden dene düğmesine tıkladığınızda) smallPict, bağlantıyı kullanmadan önce tamamını kontrol eder:
- Depolama: bucket’ınızda
.smallpict-probe/altına küçük bir test dosyası yazar, geri okur ve siler. - Cloudflare: zone’unuza tek URL’lik bir test temizleme isteği gönderir.
- CloudFront:
/.smallpict-probe/...yolu için bir test invalidation’ı oluşturur. Bu, ay içindeki CloudFront invalidation yolu sayınıza dahil edilir.
Herhangi bir adım başarısız olursa hiçbir şey değiştirilmez. Panel, nedeni ilgili alanın yanında gösterir; örneğin bucket adı veya API token’ı. Bağlantı kontrolü dakikada 5 denemeyle sınırlıdır.
CDN’iniz için bucket erişimi
optimized/CDN’iniz tarafından okunabilir olmalıdır: ya bu önek için herkese açık okuma ya da özel bir bucket için CDN kaynak erişimi (CloudFront origin access control veya R2 özel alan adı).originals/özel kalabilir. CDN’inizin buna hiç ihtiyacı yoktur.- CORS yalnızca tarayıcılar görselleri JavaScript’ten farklı bir kaynaktan alıyorsa gerekir (örneğin
fetch()veya bir canvas). Düz<img>etiketleri için gerekmez. Gerekiyorsa sitenizin kaynağındanGETveHEADisteklerine izin verin.
Nesne düzeni ve URL’ler
| Ne | Bucket’ınızdaki anahtar | URL |
|---|---|---|
| Orijinal | originals/<job_id>/<file> | Sunulmaz |
| Optimize edilmiş dosya | optimized/<job_id>.<ext> | <cdn_domain>/optimized/<job_id>.<ext> |
CDN alan adı bir yol öneki içerebilir, örneğin https://example.com/images; bu durumda URL https://example.com/images/optimized/<job_id>.<ext> olur.
Önbellek başlıkları
Optimize edilmiş dosyalar Cache-Control: public, max-age=31536000, immutable başlığıyla yazılır. Her iş benzersiz bir anahtar alır; bu yüzden yeni bir sonucun URL’si her zaman yenidir ve temizlemeye nadiren gerek duyulur. CDN’inizin önbellek kurallarının bu başlığı daha kısa bir süreyle geçersiz kılmasına izin vermeyin.
Önbellek temizleme
- API üzerinden yapılan temizleme istekleri (
POST /v1/purge) toplu olarak sizin CDN’inize gider. - Cloudflare’de dosyalar URL’ye göre temizlenir. “Tümünü temizle” yalnızca teslim ana makinenizi ve yol önekinizi temizler, zone’unuzun tamamını değil.
- CloudFront’ta dosyalar invalidation’larla temizlenir. “Tümünü temizle” bir
/*invalidation’ı oluşturur. CloudFront’un aylık ücretsiz kotasını aşan invalidation yolları AWS tarafından hesabınıza faturalandırılır.
Mod değiştirme
Mod değiştirmek mevcut dosyaları taşımaz. Daha önce teslim edilen dosyalar mevcut URL’lerini korur; yeni modu yalnızca yeni işler kullanır.
- Yönetilen → BYO: yeni işler bucket’ınıza gider ve CDN’iniz tarafından sunulur.
cdn.smallpict.appüzerindeki dosyalar orada kalır. - BYO → yönetilen: yeni işler yeniden yönetilen depolama ve CDN’i kullanır. BYO ayarlarınız ve anahtarlarınız, Bağlantıyı kes düğmesine tıklayana kadar kayıtlı ama kullanılmadan kalır; böylece yeniden girmeden geri geçebilirsiniz.
- Bağlantıyı kes: kayıtlı anahtarları ve BYO ayarlarını siler ve sizi yönetilen moda döndürür. Bucket’ınızdaki dosyalara dokunulmaz.
Bir şey ters gittiğinde
- smallPict bucket’ınıza yazamazsa yeniden dener, ardından API yanıtında okuyabileceğiniz bir nedenle işi başarısız olarak sonlandırır.
- Panel, son hatayı ve ne zaman oluştuğunu bir Kontrolü yeniden dene düğmesiyle birlikte gösterir.
- Başarısız her iş için değil, olay başına bir e-posta alırsınız.
- smallPict asla yönetilen depolamaya geri dönmez. Dosyalarınız asla sizin seçmediğiniz bir yerde saklanmaz.
Güvenlik
- Anahtarlar şifreli bir gizli bilgi deposunda tutulur. Bir daha asla gösterilmez, API tarafından döndürülmez ve günlüklere yazılmaz.
- Bir anahtarı yenilemek için yenisini girip kaydedin; bağlantı kontrolü yeni anahtarla çalışır. Kayıtlı anahtarı korumak için anahtar alanını boş bırakın.
- Depolama ve CDN endpoint’leri HTTPS kullanmalıdır. Özel, loopback, link-local veya diğer dahili adreslere çözümlenen endpoint’ler reddedilir.
- smallPict için ayrı, dar kapsamlı anahtarlar kullanın ve BYO’yu kullanmayı bırakırsanız bunları sağlayıcınızın konsolundan iptal edin.