अपना स्टोरेज + CDN इस्तेमाल करें
API Velocity और Momentum प्लान पर अपना ऑब्जेक्ट स्टोरेज और अपना CDN जोड़ें: हर प्रोवाइडर के लिए सेटअप, न्यूनतम अनुमतियाँ, कनेक्शन जाँच, और मोड बदलने पर क्या होता है।
उपलब्ध है: API Velocity और Momentum प्लान पर। Ignite (इसमें CDN नहीं है), डेवलपर सैंडबॉक्स (सैंडबॉक्स फ़ाइलें अस्थायी होती हैं) या WordPress प्लान (ये मैनेज्ड smallPict CDN इस्तेमाल करते हैं) पर उपलब्ध नहीं है।
संक्षेप में: BYO मोड में smallPict आपकी मूल फ़ाइलें और ऑप्टिमाइज़ की गई इमेज आपके बकेट में लिखता है, और आपका CDN उन्हें डिलीवर करता है। स्टोरेज और CDN हमेशा साथ जुड़ते हैं: आप एक को दूसरे के बिना नहीं ला सकते।
BYO क्या है
Velocity और Momentum में दो डिलीवरी मोड हैं। आप इनमें से एक डैशबोर्ड → CDN और स्टोरेज में चुनते हैं।
- मैनेज्ड (डिफ़ॉल्ट): smallPict आपकी मूल फ़ाइलें अपने एन्क्रिप्टेड स्टोरेज में रखता है (90 दिनों के बाद लंबी अवधि के आर्काइव में ले जाई जाती हैं) और ऑप्टिमाइज़ की गई इमेज
cdn.smallpict.appसे डिलीवर करता है। कुछ भी सेट अप नहीं करना होता। - अपना स्टोरेज + CDN इस्तेमाल करें (BYO): आप अपने अकाउंट में एक S3-संगत बकेट और अपने अकाउंट में एक CDN जोड़ते हैं। हर नया जॉब मूल फ़ाइल और ऑप्टिमाइज़ की गई फ़ाइल आपके बकेट में लिखता है, और API आपके CDN डोमेन वाले URL लौटाता है।
यह साथ जुड़ने का नियम इसलिए है क्योंकि smallPict को डिलीवरी के दोनों हिस्से संभालने होते हैं: फ़ाइलें लिखना और कैश से पुरानी कॉपियाँ हटाना। CDN के बिना बकेट में कैश पर्ज के लिए कोई जगह नहीं होगी; बकेट के बिना CDN के पास डिलीवर करने को कुछ नहीं होगा।
मैनेज्ड बनाम BYO
| मैनेज्ड (डिफ़ॉल्ट) | अपना स्टोरेज + CDN इस्तेमाल करें | |
|---|---|---|
| मूल फ़ाइलें | smallPict का एन्क्रिप्टेड स्टोरेज | आपके बकेट में originals/<job_id>/<file> |
| ऑप्टिमाइज़ की गई फ़ाइलें | cdn.smallpict.app से डिलीवर | आपके बकेट में optimized/<job_id>.<ext>, आपके CDN डोमेन से डिलीवर |
| स्टोरेज कोटा | Velocity 50 GB, Momentum 100 GB | गिना नहीं जाता। भुगतान आप अपने स्टोरेज प्रोवाइडर को करते हैं। |
| CDN बैंडविड्थ | Velocity 30 GB/महीना, Momentum 200 GB/महीना | गिना नहीं जाता। भुगतान आप अपने CDN प्रोवाइडर को करते हैं। |
| ट्रांसफ़ॉर्मेशन | आपके प्लान में गिने जाते हैं | आपके प्लान में गिने जाते हैं |
| smallPict द्वारा रखी गई कॉपी | हाँ, जब तक आपका अकाउंट सक्रिय है | कोई नहीं। केवल प्रोसेसिंग के लिए अस्थायी अपलोड, जो 24 घंटे के भीतर हटा दिया जाता है। |
| कैश पर्ज | स्वचालित | स्वचालित, आपके CDN के API के ज़रिए |
| CDN परफ़ॉर्मेंस, डोमेन और लागत | smallPict | आप। smallPict आपके CDN की परफ़ॉर्मेंस, डोमेन या बिलों के लिए ज़िम्मेदार नहीं है। |
समर्थित प्रोवाइडर
स्टोरेज (अभी उपलब्ध): Amazon S3, Cloudflare R2, Google Cloud Storage (S3 इंटरऑपरेबिलिटी), Alibaba Cloud OSS, Tencent Cloud COS, DigitalOcean Spaces, SumoPod Storage, MinIO, और कस्टम एंडपॉइंट के ज़रिए कोई भी अन्य S3-संगत सेवा (जैसे Hetzner, Vultr या Wasabi)।
CDN (अभी उपलब्ध): Cloudflare और Amazon CloudFront।
नियोजित: Azure Blob Storage और अन्य CDN। आप क्लाउड प्रोवाइडर पेज पर अर्ली एक्सेस का अनुरोध कर सकते हैं।
शुरू करने से पहले
- आप API Velocity या Momentum पर हैं और अकाउंट एडमिन के रूप में साइन इन हैं।
- आपके पास एक बकेट है, और एक CDN है जो उस बकेट की फ़ाइलें HTTPS पर डिलीवर करता है।
- स्टोरेज एंडपॉइंट इंटरनेट से HTTPS पर पहुँच योग्य है। प्राइवेट, आंतरिक और सादे HTTP वाले एंडपॉइंट अस्वीकार कर दिए जाते हैं।
- आपने smallPict के लिए सीमित अनुमतियों वाली कुंजियाँ बनाई हैं (नीचे न्यूनतम अनुमतियाँ देखें)। अपने अकाउंट की रूट या एडमिन कुंजियाँ इस्तेमाल न करें।
फिर डैशबोर्ड → CDN और स्टोरेज खोलें, अपना स्टोरेज + CDN इस्तेमाल करें चुनें, दोनों हिस्से भरें और स्टोरेज + CDN सेव करें चुनें। smallPict कनेक्शन जाँच चलाता है (नीचे बताई गई है) और जाँच पास होने पर ही आपको BYO पर स्विच करता है।
सेटअप गाइड
A. Amazon S3 + Amazon CloudFront
- अपनी पसंद के रीजन में बकेट बनाएँ, जैसे
ap-southeast-1मेंmy-images। Block Public Access चालू रखें। - बकेट को ओरिजिन बनाकर एक CloudFront डिस्ट्रिब्यूशन बनाएँ। Origin access control (OAC) इस्तेमाल करें ताकि बकेट प्राइवेट रहते हुए भी CloudFront उसे पढ़ सके, और CloudFront द्वारा सुझाई गई बकेट पॉलिसी लागू करें।
- वैकल्पिक: आपका अपना डोमेन। डिस्ट्रिब्यूशन में एक वैकल्पिक डोमेन नाम (जैसे
images.example.com) और एक सर्टिफ़िकेट जोड़ें, और एक DNS रिकॉर्ड को डिस्ट्रिब्यूशन की ओर पॉइंट करें। - इस पॉलिसी के साथ स्टोरेज के लिए एक IAM यूज़र (या रोल) बनाएँ:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:DeleteObject" ], "Resource": "arn:aws:s3:::my-images/*" } ]}- इस पॉलिसी के साथ CloudFront के लिए एक IAM यूज़र बनाएँ (यह वही यूज़र हो सकता है)।
cloudfront:GetDistributionवैकल्पिक है; इसके होने पर, CDN डोमेन खाली छोड़ने पर smallPict डिस्ट्रिब्यूशन का डोमेन पता लगा सकता है।
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "cloudfront:CreateInvalidation", "cloudfront:GetDistribution" ], "Resource": "arn:aws:cloudfront::123456789012:distribution/E2QWRUHAPOMQZL" } ]}- डैशबोर्ड में:
- स्टोरेज प्रोवाइडर Amazon S3, बकेट
my-images, रीजनap-southeast-1, एंडपॉइंट खाली (रीजन का स्टैंडर्ड एंडपॉइंट इस्तेमाल होता है), और स्टोरेज की एक्सेस की ID और सीक्रेट। - CDN Amazon CloudFront, Distribution ID (जैसे
E2QWRUHAPOMQZL), CloudFront की एक्सेस की ID और सीक्रेट, और वैकल्पिक रूप से CDN डोमेन (https://images.example.com)। डिस्ट्रिब्यूशन का अपना*.cloudfront.netडोमेन इस्तेमाल करने के लिए डोमेन खाली छोड़ें।
- स्टोरेज प्रोवाइडर Amazon S3, बकेट
B. Cloudflare R2 + Cloudflare
- एक R2 बकेट बनाएँ, जैसे
my-images। - उसी Cloudflare अकाउंट के किसी ज़ोन पर बकेट से एक कस्टम डोमेन जोड़ें (R2 → आपका बकेट → Settings → Custom Domains), जैसे
images.example.com। उस डोमेन पर आने वाले अनुरोध Cloudflare कैश से होकर जाते हैं। प्रोडक्शन के लिएr2.devडेवलपमेंट URL इस्तेमाल न करें। - केवल इस बकेट तक सीमित Object Read & Write के साथ एक R2 API टोकन बनाएँ (R2 → Manage API tokens)। दिखाई गई Access Key ID और Secret Access Key कॉपी करें।
- ज़ोन के लिए Zone → Cache Purge → Purge के साथ एक Cloudflare API टोकन बनाएँ (My Profile → API Tokens)। Zone → Zone → Read वैकल्पिक है।
- डैशबोर्ड में:
- स्टोरेज प्रोवाइडर Cloudflare R2, बकेट
my-images, एंडपॉइंटhttps://<account_id>.r2.cloudflarestorage.com(आपके बकेट की S3 API जानकारी में दिखता है), रीजनauto, और R2 Access Key ID और Secret Access Key। - CDN Cloudflare, Zone ID (डोमेन का Overview पेज, API सेक्शन), API टोकन, और CDN डोमेन
https://images.example.com।
- स्टोरेज प्रोवाइडर Cloudflare R2, बकेट
C. Google Cloud Storage + Cloudflare
Google Cloud Storage को HMAC कुंजियों के साथ इसके S3-संगत XML API के ज़रिए जोड़ा जाता है।
- बकेट बनाएँ, जैसे
my-images। - एक सर्विस अकाउंट बनाएँ और उसे केवल इस बकेट पर Storage Object User (
roles/storage.objectUser) रोल दें। - सर्विस अकाउंट के लिए एक HMAC की बनाएँ: Cloud Storage → Settings → Interoperability → Create a key for a service account। एक्सेस ID और सीक्रेट कॉपी करें।
- ऑप्टिमाइज़ की गई फ़ाइलों को अपने CDN के लिए पढ़ने योग्य बनाएँ। Cloudflare, Cloud Storage से HTTPS पर फ़ाइलें लाता है, इसलिए
optimized/के अंतर्गत ऑब्जेक्ट सार्वजनिक रूप से पढ़ने योग्य होने चाहिए। uniform bucket-level access के साथ,allUsersको Storage Object Viewer रोल देने से पूरा बकेट पढ़ने योग्य हो जाता है,originals/सहित। अगर आपकी मूल फ़ाइलें प्राइवेट रहनी चाहिए, तो आगे एक ऑथेंटिकेशन लेयर लगाएँ (जैसे एक Cloudflare Worker जो बकेट को भेजे जाने वाले अनुरोधों पर साइन करता है)। - एक प्रॉक्सी किया गया Cloudflare DNS रिकॉर्ड Cloud Storage की ओर पॉइंट करें, जैसे
images.example.com। या तो बकेट का नाम होस्टनेम के अनुसार रखें औरc.storage.googleapis.comके लिए प्रॉक्सी किया गया CNAME इस्तेमाल करें, या एक Cloudflare Origin Rule इस्तेमाल करें जो पाथ की शुरुआत में बकेट नाम के साथ अनुरोधstorage.googleapis.comपर भेजे। - ज़ोन के लिए Zone → Cache Purge → Purge के साथ एक Cloudflare API टोकन बनाएँ (Zone → Zone → Read वैकल्पिक)।
- डैशबोर्ड में: स्टोरेज प्रोवाइडर Google Cloud Storage, बकेट, एंडपॉइंट
https://storage.googleapis.com, रीजनauto, HMAC एक्सेस ID और सीक्रेट; CDN Cloudflare, Zone ID, API टोकन और CDN डोमेनhttps://images.example.com।
D. MinIO या कोई भी S3-संगत स्टोरेज + Cloudflare
इसमें MinIO और S3-संगत सेवाएँ शामिल हैं, जैसे Hetzner, Wasabi, Vultr, SumoPod, Alibaba Cloud OSS, Tencent Cloud COS और DigitalOcean Spaces।
| प्रोवाइडर | डैशबोर्ड में चुनें | एंडपॉइंट | नोट्स |
|---|---|---|---|
| MinIO | MinIO | आपका सर्वर, जैसे https://minio.example.com | पाथ-स्टाइल अनुरोध चालू। सर्वर इंटरनेट से HTTPS पर पहुँच योग्य होना चाहिए। |
| Hetzner Object Storage | कस्टम S3-संगत | https://<location>.your-objectstorage.com | |
| Wasabi | कस्टम S3-संगत | https://s3.<region>.wasabisys.com | |
| Vultr Object Storage | कस्टम S3-संगत | https://<region>.vultrobjects.com | |
| SumoPod Storage | SumoPod Storage | आपके SumoPod स्टोरेज डैशबोर्ड से | पाथ-स्टाइल डिफ़ॉल्ट रूप से चालू। |
| Alibaba Cloud OSS | Alibaba Cloud OSS | https://oss-<region>.aliyuncs.com | केवल वर्चुअल-होस्टेड स्टाइल। |
| Tencent Cloud COS | Tencent Cloud COS | https://cos.<region>.myqcloud.com | बकेट नाम में आपका APPID शामिल होता है, जैसे my-images-1250000000। |
| DigitalOcean Spaces | DigitalOcean Spaces | https://<region>.digitaloceanspaces.com |
- बकेट बनाएँ और उस बकेट तक सीमित एक की बनाएँ जिसमें ऑब्जेक्ट पर put, get और delete की अनुमति हो (नीचे न्यूनतम अनुमतियाँ देखें)।
optimized/को अपने CDN के लिए पढ़ने योग्य बनाएँ, जैसे एक बकेट पॉलिसी से जो केवलoptimized/*पर अनामs3:GetObjectकी अनुमति देती है। MinIO पर:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "*" ] }, "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::my-images/optimized/*" ] } ]}- बकेट के आगे Cloudflare लगाएँ:
images.example.comके लिए एक प्रॉक्सी किया गया DNS रिकॉर्ड जो बकेट के पब्लिक होस्ट की ओर पॉइंट करे। अगर प्रोवाइडर को अनुरोध में अपना होस्टनेम चाहिए, तो एक Cloudflare Origin Rule जोड़ें जो Host हेडर को फिर से लिखे (और, पाथ-स्टाइल होस्ट के लिए, पाथ में बकेट नाम जोड़े)। - ज़ोन के लिए Zone → Cache Purge → Purge के साथ एक Cloudflare API टोकन बनाएँ (Zone → Zone → Read वैकल्पिक)।
- डैशबोर्ड में: तालिका से प्रोवाइडर चुनें, बकेट, एंडपॉइंट, रीजन (अगर प्रोवाइडर का कोई रीजन नहीं है तो
auto) और कुंजियाँ दर्ज करें; जहाँ तालिका कहे वहाँ पाथ-स्टाइल अनुरोध चालू करें; फिर CDN Cloudflare, Zone ID, API टोकन और CDN डोमेन।
न्यूनतम अनुमतियाँ
smallPict को ऐसी कुंजियाँ दें जो एक ही बकेट पर केवल ज़रूरी काम कर सकें।
| प्रोवाइडर | अनुमतियाँ |
|---|---|
| Amazon S3 | arn:aws:s3:::<bucket>/* पर s3:PutObject, s3:GetObject, s3:DeleteObject |
| Amazon CloudFront | डिस्ट्रिब्यूशन पर cloudfront:CreateInvalidation; डोमेन का पता लगाने के लिए वैकल्पिक cloudfront:GetDistribution |
| Cloudflare R2 | Object Read & Write वाला R2 API टोकन, बकेट तक सीमित |
| Cloudflare (CDN) | ज़ोन के लिए Zone → Cache Purge → Purge वाला API टोकन; वैकल्पिक Zone → Zone → Read |
| Google Cloud Storage | बकेट पर roles/storage.objectUser वाले सर्विस अकाउंट की HMAC की |
| Alibaba Cloud OSS | बकेट पर oss:PutObject, oss:GetObject, oss:DeleteObject वाला RAM यूज़र |
| Tencent Cloud COS | बकेट पर cos:PutObject, cos:GetObject, cos:DeleteObject वाला CAM सब-यूज़र (बकेट नाम में APPID शामिल होता है) |
| DigitalOcean Spaces | पढ़ने, लिखने और हटाने की अनुमति वाली, बकेट तक सीमित Spaces एक्सेस की |
| MinIO / कस्टम S3-संगत | <bucket>/* पर put, get और delete; एंडपॉइंट पब्लिक HTTPS होना चाहिए |
कनेक्शन जाँच
हर बार सेव करने पर (और फिर से जाँचें चुनने पर), smallPict इस्तेमाल करने से पहले पूरा कनेक्शन जाँचता है:
- स्टोरेज: आपके बकेट में
.smallpict-probe/के अंतर्गत एक छोटी टेस्ट फ़ाइल लिखता है, उसे वापस पढ़ता है और हटा देता है। - Cloudflare: आपके ज़ोन को एक सिंगल-URL टेस्ट पर्ज भेजता है।
- CloudFront:
/.smallpict-probe/...पाथ के लिए एक टेस्ट इनवैलिडेशन बनाता है। यह उस महीने के आपके CloudFront इनवैलिडेशन पाथ में गिना जाता है।
अगर कोई भी चरण विफल होता है, तो कुछ भी स्विच नहीं होता। डैशबोर्ड संबंधित फ़ील्ड के पास कारण दिखाता है, जैसे बकेट नाम या API टोकन। कनेक्शन जाँच प्रति मिनट 5 प्रयासों तक सीमित है।
आपके CDN के लिए बकेट एक्सेस
optimized/आपके CDN के लिए पढ़ने योग्य होना चाहिए: या तो उस प्रीफ़िक्स पर public-read, या प्राइवेट बकेट पर CDN ओरिजिन एक्सेस (CloudFront origin access control, या R2 कस्टम डोमेन)।originals/प्राइवेट रह सकता है। आपके CDN को इसकी कभी ज़रूरत नहीं होती।- CORS की ज़रूरत तभी है जब ब्राउज़र JavaScript से क्रॉस-ओरिजिन इमेज लाते हैं (जैसे
fetch()या canvas)। सामान्य<img>टैग को इसकी ज़रूरत नहीं होती। अगर ज़रूरत हो, तो अपनी साइट के ओरिजिन सेGETऔरHEADकी अनुमति दें।
ऑब्जेक्ट लेआउट और URL
| क्या | आपके बकेट में की | URL |
|---|---|---|
| मूल फ़ाइल | originals/<job_id>/<file> | डिलीवर नहीं की जाती |
| ऑप्टिमाइज़ की गई फ़ाइल | optimized/<job_id>.<ext> | <cdn_domain>/optimized/<job_id>.<ext> |
CDN डोमेन में पाथ प्रीफ़िक्स हो सकता है, जैसे https://example.com/images; तब URL https://example.com/images/optimized/<job_id>.<ext> होता है।
कैश हेडर
ऑप्टिमाइज़ की गई फ़ाइलें Cache-Control: public, max-age=31536000, immutable के साथ लिखी जाती हैं। हर जॉब को एक अनोखी की मिलती है, इसलिए नए नतीजे का URL हमेशा नया होता है और पर्ज की ज़रूरत कम ही पड़ती है। ध्यान रखें कि आपके CDN के कैशिंग नियम इस हेडर को कम समय से ओवरराइड न करें।
कैश पर्ज
- API के ज़रिए किए गए पर्ज अनुरोध (
POST /v1/purge) बैच में आपके CDN को भेजे जाते हैं। - Cloudflare पर फ़ाइलें URL के आधार पर पर्ज होती हैं। "Purge all" केवल आपके डिलीवरी होस्ट और पाथ प्रीफ़िक्स को पर्ज करता है, पूरे ज़ोन को नहीं।
- CloudFront पर फ़ाइलें इनवैलिडेशन से पर्ज होती हैं। "Purge all" एक
/*इनवैलिडेशन बनाता है। CloudFront की मासिक मुफ़्त सीमा से ज़्यादा इनवैलिडेशन पाथ का बिल AWS आपके अकाउंट में भेजता है।
मोड बदलना
मोड बदलने से मौजूदा फ़ाइलें नहीं हटतीं। पहले से डिलीवर की गई फ़ाइलों के URL वही रहते हैं; केवल नए जॉब नए मोड का इस्तेमाल करते हैं।
- मैनेज्ड → BYO: नए जॉब आपके बकेट में जाते हैं और आपके CDN से डिलीवर होते हैं। जो फ़ाइलें पहले से
cdn.smallpict.appपर हैं, वे वहीं रहती हैं। - BYO → मैनेज्ड: नए जॉब फिर से मैनेज्ड स्टोरेज और CDN इस्तेमाल करते हैं। आपकी BYO सेटिंग्स और कुंजियाँ सेव रहती हैं लेकिन इस्तेमाल नहीं होतीं, इसलिए आप उन्हें दोबारा दर्ज किए बिना वापस स्विच कर सकते हैं, जब तक आप डिस्कनेक्ट करें नहीं चुनते।
- डिस्कनेक्ट करें: सेव की गई कुंजियाँ और BYO सेटिंग्स हटा देता है और आपको मैनेज्ड पर वापस ले जाता है। आपके बकेट की फ़ाइलों को छुआ नहीं जाता।
जब कुछ विफल हो
- अगर smallPict आपके बकेट में नहीं लिख पाता, तो वह फिर से कोशिश करता है, फिर एक कारण के साथ जॉब को विफल कर देता है जिसे आप API रिस्पॉन्स में पढ़ सकते हैं।
- डैशबोर्ड आख़िरी त्रुटि और उसका समय दिखाता है, साथ में फिर से जाँचें बटन।
- आपको हर घटना पर एक ईमेल मिलता है, हर विफल जॉब पर नहीं।
- smallPict कभी भी मैनेज्ड स्टोरेज पर फ़ॉलबैक नहीं करता। आपकी फ़ाइलें कभी ऐसी जगह स्टोर नहीं होतीं जिसे आपने नहीं चुना।
सुरक्षा
- कुंजियाँ एक एन्क्रिप्टेड सीक्रेट स्टोर में रखी जाती हैं। वे दोबारा कभी नहीं दिखाई जातीं, API द्वारा कभी नहीं लौटाई जातीं और कभी लॉग में नहीं लिखी जातीं।
- किसी की को रोटेट करने के लिए, नई की दर्ज करें और सेव करें; कनेक्शन जाँच नई की के साथ चलती है। सेव की गई की रखने के लिए की वाला फ़ील्ड खाली छोड़ें।
- स्टोरेज और CDN एंडपॉइंट को HTTPS इस्तेमाल करना होगा। जो एंडपॉइंट प्राइवेट, लूपबैक, लिंक-लोकल या अन्य आंतरिक पतों पर रिज़ॉल्व होते हैं, उन्हें अस्वीकार कर दिया जाता है।
- smallPict के लिए अलग, सीमित अनुमतियों वाली कुंजियाँ इस्तेमाल करें, और BYO का इस्तेमाल बंद करने पर उन्हें अपने प्रोवाइडर के कंसोल में रद्द कर दें।