# Cloudflare R2: bucket, CORS এবং ডেলিভারি একটি R2 bucket তৈরি করুন, আপলোড এবং প্লেব্যাক CORS কনফিগার করুন, একটি কাস্টম ডোমেন বা r2.dev টেস্টিং URL সংযোগ করুন এবং DRM-X 6.0 এর মাধ্যমে একটি আপলোড যাচাই করুন৷ এনক্রিপ্ট করা ভিডিও ও DRM লাইসেন্স আলাদা পথে সরবরাহ করা হয় CDN এনক্রিপ্ট করা ভিডিও সরবরাহ করে। আপনার ব্যাকএন্ড দেখার অধিকার যাচাই করে, আর DRM লাইসেন্স পরিষেবা সামঞ্জস্যপূর্ণ ডিভাইসে ডিক্রিপশনের অনুমতি দেয়। - 01**স্টোরেজ / CDN** প্লেয়ারে এনক্রিপ্ট করা মিডিয়া সরবরাহ করে। - 02**আপনার ব্যাকএন্ড** দর্শকের দেখার অনুমতি যাচাই করে এবং DRM-X থেকে প্লেব্যাকের অনুমোদন চায়। - 03**DRM-X** প্লেব্যাকের অনুমোদন যাচাই করে এবং DRM লাইসেন্সের অনুরোধ প্রক্রিয়া করে। - 04**প্লেয়ার + ডিভাইস** ডিভাইসের DRM সিস্টেম ব্যবহার করে লাইসেন্স গ্রহণ করে এবং এনক্রিপ্ট করা মিডিয়া চালায়। আপনার ব্যাক-এন্ড চালু করতে; ব্যবহার করতে ব্যবহৃত হচ্ছে DRM-X স্বাক্ষর করার নীতি প্রয়োগ করে এনক্রিপ্ট করা হবে। DRM লাইসেন্স ভিন্ন ভিন্ন পথ অনুসরণ করে। **নতুন bucket থেকে সফল আপলোড পর্যন্ত** R2 bucket তৈরি করুন, browser CORS সেট করুন, public HTTPS delivery URL বেছে নিন, DRM-X connect করুন এবং test object আপলোড ও retrieve করুন। Original video ও private document এই delivery bucket-এর বাইরে রাখুন। শুধু encrypted media এবং প্রকাশের জন্য নির্ধারিত asset প্রকাশ করুন। পাবলিক ডেলিভারি অবজেক্ট বাইটকে URL দ্বারা পৌঁছানো যায়; DRM সঠিকভাবে প্যাকেজ করা মিডিয়ার ডিক্রিপশন নিয়ন্ত্রণ করে। CORS একটি ব্রাউজার সামঞ্জস্যের নিয়ম, অনুমোদন নয়। এই বাস্তব কনসোল স্ক্রিনশট অ্যাকাউন্ট হেডার এবং ব্যক্তিগত শনাক্তকারী বাদ. মেনু শব্দ পরিবর্তন হতে পারে. ## 1. আপনার R2 bucket তৈরি করুন[#](#create-bucket) - Cloudflare-এ সাইন ইন করুন এবং bucketর মালিক হবে এমন অ্যাকাউন্ট বেছে নিন। - খুলুন **Storage & databases → R2 Object Storage → Overview → Create bucket**। - একটি অনন্য bucket নাম লিখুন, যেমন `customer-drm-media-example`। একটি উপযুক্ত স্থান বা এখতিয়ার নির্বাচন করুন। এই ওয়াকথ্রুটির জন্য **Standard** স্টোরেজ ব্যবহার করুন, তারপর bucket তৈরি করুন। - Bucket-এর **Settings** খুলুন। Bucket name, Cloudflare account ID এবং **General → S3 API** endpoint লিখে রাখুন। Default jurisdiction-এর API endpoint হলো `https://.r2.cloudflarestorage.com`। Cloudflare jurisdiction-নির্দিষ্ট hostname দেখালে সেটিই ব্যবহার করুন। DRM-X-এ endpoint দেওয়ার সময় শেষে থাকা `/bucket-name` বাদ দিন; bucket name-এর জন্য আলাদা field আছে। এই API endpoint public playback URL নয়। ## 2. শুধু এই bucket-এর জন্য অনুমতি দেওয়া credentials তৈরি করুন[#](#create-credentials) - R2 Overview এ ফিরে যান এবং **Manage API tokens** খুলুন। একটি R2 অ্যাকাউন্ট টোকেন বা আপনার প্রতিষ্ঠানের প্রয়োজন হলে একটি ব্যবহারকারী টোকেন বেছে নিন। - **Create API token** নির্বাচন করুন, এটি একটি স্বীকৃত নাম দিন এবং **Object Read & Write** চয়ন করুন। - **Apply to specific buckets only** চয়ন করুন এবং এই bucket নির্বাচন করুন। আপনার নীতি অনুযায়ী মেয়াদ শেষ কনফিগার করুন. এই ওয়াকথ্রুয়ের জন্য, ঐচ্ছিক IP ফিল্টারিং সেট না করে রেখে দিন। আপনার নিরাপত্তা নীতির প্রয়োজন হলে, গ্রাহক ব্রাউজার নেটওয়ার্ক থেকে DRM-X সার্ভার অ্যাক্সেস এবং সরাসরি আপলোড উভয়ই যাচাই করুন। - Token তৈরি করে DRM-X-এর জন্য **Access Key ID** এবং **Secret Access Key** নিরাপদে সংরক্ষণ করুন। **S3 credential pair ব্যবহার করুন** Cloudflare-এর পৃথক Token value S3 Secret Access Key নয়। DRM-X-এর account-wide administrative token দরকার নেই। Cloudflare-এ CORS ও domain settings নিজে পরিচালনা করুন। ## 3. সর্বজনীনভাবে ফাইল সরবরাহের URL বেছে নিন[#](#public-delivery) ![R2 Settings: Custom Domains এর অধীনে যোগ করুন, অথবা Public Development URL এর অধীনে সক্ষম করুন।](https://docs.drm-x.com/assets/storage/r2-delivery.png)12**1 — Production:** Custom domain যোগ করুন। **2 — Testing:** Public Development URL চালু করুন। ### বিকল্প A: উৎপাদনের জন্য আপনার ডোমেন সংযোগ করুন - একই Cloudflare অ্যাকাউন্টে সম্পন্ন DNS সেটআপ সহ একটি ডোমেন রাখুন। একটি সাবডোমেন বেছে নিন যেমন `media.example.com`। - bucketতে, **Settings → Custom Domains → Add** খুলুন। সাবডোমেনে প্রবেশ করুন, DNS পরিবর্তন পর্যালোচনা করুন এবং এই R2 ওয়ার্কফ্লো ব্যবহার করে এটি সংযুক্ত করুন। - ডোমেন এবং HTTPS শংসাপত্র সক্রিয় হওয়ার জন্য অপেক্ষা করুন। আপনার ডেলিভারির মূল হল `https://media.example.com`। একটি CNAME একটি r2.dev ঠিকানা নির্দেশ করে তৈরি করবেন না। R2 এর Custom Domains ওয়ার্কফ্লো ব্যবহার করুন। একটি কাস্টম ডোমেন সংযুক্ত হলে বিকাশ URL অক্ষম থাকতে পারে৷ ### বিকল্প B: পরীক্ষার জন্য Cloudflare এর URL সক্ষম করুন - খুলুন **Settings → Public Development URL → Enable**. - পাবলিক-অ্যাক্সেস বিজ্ঞপ্তিটি পর্যালোচনা করুন, অনুরোধ করা হলে `allow` টাইপ করুন এবং নিশ্চিত করুন। - Cloudflare দ্বারা প্রদর্শিত প্রকৃত `https://pub-….r2.dev` ​​URL কপি করুন। আপনার অ্যাকাউন্ট ID বা bucketর নাম থেকে এটি তৈরি করবেন না। r2.dev এন্ডপয়েন্ট হার-সীমিত এবং উন্নয়নের উদ্দেশ্যে। উত্পাদন, ক্যাশিং এবং Cloudflare নিরাপত্তা বৈশিষ্ট্যগুলির জন্য একটি কাস্টম ডোমেন ব্যবহার করুন৷ ## 4. ব্রাউজার থেকে আপলোড ও প্লেব্যাকের জন্য CORS সেট করুন[#](#configure-cors) ![R2 CORS Policy সম্পাদনা, অনুমোদিত উত্স, পদ্ধতি এবং শিরোনাম সহ প্যানেল।](https://docs.drm-x.com/assets/storage/r2-cors.png)12**1:** নতুন bucket-এর জন্য Add CORS policy অথবা Edit নির্বাচন করুন। **2:** Save করা Origin, method ও header যাচাই করুন। Screenshot-এ শুধু Console-এর diagnostic rule আছে; player website-এর জন্য নিচের সম্পূর্ণ দুই-rule উদাহরণ ব্যবহার করুন। - খুলুন **Settings → CORS Policy → Add CORS policy** (বা **Edit**)। - নিচের JSON editor-এ paste করুন। `https://www.example.com`-এর জায়গায় যে website-এ player থাকবে তার Origin দিন। Origin-এ HTTPS ও hostname থাকে, কিন্তু /watch-এর মতো page path থাকে না। - Bucket-এ আগে policy থাকলে অন্য প্রয়োজনীয় rule রেখে দিন, তারপর **Save** নির্বাচন করুন। - পরিবর্তন ছড়িয়ে পড়ার জন্য কিছু সময় দিন, তারপর আবার আপলোড করুন। Custom domain-এর cache-এ পুরোনো CORS header থাকলে সংশ্লিষ্ট path-এর cached response purge করে আবার পরীক্ষা করুন। ``` [ { "AllowedOrigins": [ "https://6.drm-x.com" ], "AllowedMethods": [ "PUT" ], "AllowedHeaders": [ "Content-Type", "x-amz-meta-drmx-sha256" ], "ExposeHeaders": [ "ETag" ], "MaxAgeSeconds": 3600 }, { "AllowedOrigins": [ "https://6.drm-x.com", "https://multi-drm.drm-x.com", "https://www.example.com" ], "AllowedMethods": [ "GET", "HEAD" ], "AllowedHeaders": [ "Range" ], "ExposeHeaders": [ "ETag", "Content-Length", "Content-Range", "Accept-Ranges" ], "MaxAgeSeconds": 3600 } ] ``` প্রথম নিয়মটি DRM-X Console থেকে স্বাক্ষরিত PUT আপলোডের অনুমতি দেয়। দ্বিতীয়টি আপনার প্লেয়ার ওয়েবসাইট এবং DRM-X পরীক্ষার পৃষ্ঠাগুলি থেকে GET/HEAD অনুমতি দেয়৷ R2 কাস্টম ডোমেনগুলি bucketর CORS নীতি ব্যবহার করে৷ CORS বেনামী আপলোড অ্যাক্সেস মঞ্জুর করে না। ### আপনার CORS এবং ম্যাচিং URL ক্ষেত্র তৈরি করুন এই টুলটি আপনার ব্রাউজারে চলে। শুধুমাত্র সর্বজনীন উত্স লিখুন; এটি অ্যাক্সেস কীগুলির জন্য জিজ্ঞাসা করে না। প্লেয়ার ওয়েবসাইট উত্সউদাহরণ প্রতিস্থাপন. স্পেস বা কমা দিয়ে একাধিক HTTPS উৎপত্তি আলাদা করুন। আপনার প্লেয়ার এম্বেডিং ওয়েবসাইট ব্যবহার করুন, একটি পৃষ্ঠা পথ ছাড়া. DRM-X Console এবং Playback Lab স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত।Public delivery Originআপনার সংযুক্ত কাস্টম ডোমেন লিখুন, সক্রিয় r2.dev URL, বা CloudFront মূল। এখানে ফোল্ডারটি বাদ দিন।স্টোরেজ ফোল্ডার (ঐচ্ছিক)কনফিগারেশন তৈরি করুন কপি CORS JSON ``` ``` Protected-content base path``Public URL prefix``উদাহরণ অবজেক্ট কী``সম্পূর্ণ URL-এর উদাহরণ`` ## 5. DRM-X 6.0 এর মধ্যে R2 সংযোগ করুন[#](#connect-drmx) [Cloud Storage → Connect storage](https://6.drm-x.com/console/cloud-storage) খুলুন এবং **Cloudflare R2** চয়ন করুন। | যে কোনো ক্ষেত্র | কি প্রবেশ করতে হবে | | --- | --- | | Display name | সহজে চেনা যায় এমন একটি নাম, যেমন Production R2। | | Bucket name | URL বা ফোল্ডার ছাড়াই সঠিক bucketর নাম। | | Cloudflare account ID | এই bucketটির মালিক অ্যাকাউন্টের ID। | | S3 API endpoint | ডিফল্ট এখতিয়ারের জন্য ফাঁকা ছেড়ে দিন, অথবা bucket পথ ছাড়াই অ্যাকাউন্ট/এখতিয়ারের শেষ পয়েন্টে প্রবেশ করুন। | | Protected-content base path | `protected`, বা বাকেট-রুট আপলোডের জন্য ফাঁকা। | | Public URL prefix | `https://media.example.com/protected` বা আপনার সক্রিয় `https://pub-….r2.dev/protected` URL। | | Access key ID / Secret access key | ধাপ 2 থেকে S3 শংসাপত্রের জোড়া। | উদাহরণগুলি `protected` নামে একটি ফোল্ডার ব্যবহার করে। bucketর নাম স্বয়ংক্রিয়ভাবে একটি ফোল্ডার নয়। এখানে ব্যবহৃত ডাইরেক্ট ডোমেন-টু-বাকেট ম্যাপিংয়ের সাথে, একই স্টোরেজ ফোল্ডারটি পাবলিক URL প্রিফিক্সে ঠিক একবার অন্তর্ভুক্ত করুন। ``` Bucket: customer-drm-media-example Protected-content base path: protected Public URL prefix: https://media.example.com/protected File selected for upload: sample.encrypted.bin Object key in the bucket: protected/sample.encrypted.bin Preview URL: https://media.example.com/protected/sample.encrypted.bin ``` বাকেট রুট ব্যবহার করতে, বেস পাথটি ফাঁকা রাখুন এবং সর্বজনীন উপসর্গ হিসাবে শুধুমাত্র ডেলিভারির উত্স লিখুন। আপনি ইচ্ছাকৃতভাবে একটি ফোল্ডার হিসাবে এটি ব্যবহার না করা পর্যন্ত একটি bucket নাম যোগ করবেন না। এই ম্যাপিংয়ের জন্য CloudFront Origin path খালি রাখুন। প্রয়োজনে **Use as default CLI upload destination** বেছে নিন। **Save and verify** নির্বাচন করুন। Credentials সংরক্ষিত অবস্থায় encrypted থাকে এবং save করার পর ফেরত দেওয়া হয় না। Verification সফল হলেও প্রকৃত আপলোড পরীক্ষা করুন। ## 6. একটি ফাইল আপলোড করুন এবং যাচাই করুন যে এটি কাজ করে[#](#test-upload) - [Cloud Storage](https://6.drm-x.com/console/cloud-storage) খুলে এই destination নির্বাচন করুন, তারপর **Verify location** বেছে নিন। সফল হলে শুধু বোঝায় DRM-X server bucket-এর object list পেতে পারে। এটি write permission, browser CORS বা public delivery যাচাই করে না। - **Upload encrypted files** নির্বাচন করুন এবং বিদ্যমান DRM-X প্যাকেজ থেকে একটি ছোট এনক্রিপ্ট করা অংশ বেছে নিন। আপনার যদি কোনো প্যাকেজ না থাকে, তাহলে নিচের ডিসপোজেবল এনক্রিপ্ট করা ডায়াগনস্টিক ব্যবহার করুন। একটি আসল ভিডিও বা ব্যক্তিগত নথি আপলোড করবেন না। - সাফল্য বার্তা জন্য অপেক্ষা করুন. ফাইলের নাম এবং আকার Cloud Storage-এ প্রদর্শিত হয় কিনা তা পরীক্ষা করুন। আপনার প্রদানকারী কনসোলে `protected/` এর অধীনে একই বস্তু খুঁজুন। - **Preview URL** ক্লিক করুন, এবং একটি ব্যক্তিগত ব্রাউজার উইন্ডোতে একই বস্তু পরীক্ষা করুন। এটি একটি AWS বা Cloudflare লগইন ছাড়াই HTTP 200 ডাউনলোড বা ফেরত দিতে হবে৷ একটি প্রকৃত বস্তু পরীক্ষা করুন: একটি ডোমেনের রুট 403/404 রিটার্ন করতে পারে এমনকি যখন অবজেক্ট ডেলিভারি কাজ করে। - আপনার প্লেয়ার ওয়েবসাইট থেকে ক্রস-অরিজিন ডেলিভারি চেক করুন। এর ব্রাউজার নেটওয়ার্ক প্যানেলে প্লেয়ার পৃষ্ঠার মূলের সাথে `Access-Control-Allow-Origin` মিলে যাওয়া দেখানো উচিত। একটি সরাসরি ঠিকানা-বার ডাউনলোড CORS পরীক্ষা করে না। নীচের টার্মিনাল উদাহরণটি শিরোনামগুলিও পরীক্ষা করে। - কাজ শেষে শুধু পরীক্ষার জন্য তৈরি অস্থায়ী diagnostic object মুছুন। তারপর [Desktop Packager নির্দেশিকা](https://docs.drm-x.com/bn/packaging/desktop) অনুসরণ করে Package content-এ এই storage destination বেছে নিন এবং সম্পূর্ণ encrypted package আপলোড করুন। হাতে একটি file আপলোড করলে Published Content ID register হয় না। - তৈরি হওয়া Published file [Universal Playback Lab](https://multi-drm.drm-x.com/bn/player) এবং নিজের player website-এ পরীক্ষা করুন। Video, audio, seek এবং প্রয়োজনীয় device যাচাই করুন। Binary file download সফল হলেই DRM playback সফল হয়েছে বলা যায় না। কোন এনক্রিপ্ট করা নমুনা? Windows এ একটি নিষ্পত্তিযোগ্য পরীক্ষা ফাইল তৈরি করুন আপনার নিয়ন্ত্রণ করা একটি অস্থায়ী ফোল্ডারে এটি Windows PowerShell এ চালান। এটি শুধুমাত্র মেমরিতে রাখা একটি ওয়ান-ইউজ AES কী সহ একটি ছোট অ-ব্যক্তিগত বার্তা এনক্রিপ্ট করে। আউটপুট একটি স্টোরেজ ডায়াগনস্টিক, প্লেযোগ্য মিডিয়া নয়; এতে কোন DRM বিষয়বস্তু কী বা গ্রাহকের ডেটা নেই। ``` $samplePath = Join-Path (Get-Location) 'drmx-storage-check.encrypted.bin' if (Test-Path -LiteralPath $samplePath) { throw 'Choose a new folder; this test file already exists.' } $aes = [System.Security.Cryptography.Aes]::Create() try { $aes.GenerateKey() $aes.GenerateIV() $encryptor = $aes.CreateEncryptor() try { $bytes = [Text.Encoding]::UTF8.GetBytes('DRM-X disposable storage check') $encrypted = $encryptor.TransformFinalBlock($bytes, 0, $bytes.Length) [IO.File]::WriteAllBytes($samplePath, $encrypted) } finally { $encryptor.Dispose() } } finally { $aes.Dispose() } Get-Item -LiteralPath $samplePath | Select-Object Name, Length ``` `drmx-storage-check.encrypted.bin` আপলোড করুন, এর আকার এবং Preview URL যাচাই করুন, তারপর bucket থেকে সরিয়ে দিন। ``` curl.exe -I -H "Origin: https://www.example.com" "https://media.example.com/protected/sample.encrypted.bin" ``` উভয় URL বদলান। HTTP 200 এবং আপনার player website-এর সঙ্গে মেলা allowed Origin পাওয়া উচিত। Range delivery-তে `Range: bytes=0-15` সহ GET request-এর response HTTP 206 ও সঠিক Content-Range header হওয়া উচিত। Media MIME type ঠিক রাখুন: DASH manifest-এর জন্য application/dash+xml, HLS playlist-এর জন্য application/vnd.apple.mpegurl এবং media file-এর উপযুক্ত media type। ## 7. আপনার ফলাফলের সমস্যা সমাধান করুন[#](#troubleshooting) | ফলাফল | কর্ম | | --- | --- | | Verify location সফল হলেও browser upload ব্যর্থ হয় | ব্রাউজারের Console ও Network panel দেখুন। সঠিক Console Origin থেকে PUT এবং Content-Type header CORS-এ অনুমোদন করুন। Network connection যাচাই করে নতুন presigned URL দিয়ে আবার চেষ্টা করুন। | | আপলোড রিটার্ন 403 | বস্তু লেখার অনুমতি, bucket/ফোল্ডার স্কোপ, এন্ডপয়েন্ট, অঞ্চল, অনুরোধের মেয়াদ এবং ঘড়ি পরীক্ষা করুন। স্বাক্ষরিত আপলোড ইউআরএল শেয়ার করবেন না। | | আপলোড সফল হয়; পাবলিক URL রিটার্ন 403 | পাবলিক ডেলিভারি সক্ষম করা হয়েছে কিনা এবং ডোমেন/ডিস্ট্রিবিউশন স্থাপন করা শেষ হয়েছে কিনা তা পরীক্ষা করুন। | | পাবলিক URL রিটার্ন 404 | সম্পূর্ণ URL-এর সঙ্গে হুবহু object key মিলিয়ে দেখুন। কোনো folder বাদ পড়েছে বা দুবার এসেছে কি না এবং filename-এর বড় ও ছোট হাতের অক্ষর ঠিক আছে কি না দেখুন। | | URL সরাসরি খোলে; প্লেয়ার আনয়ন ব্যর্থ হয় | প্লেয়ার পৃষ্ঠার মূল GET/HEAD CORS এ যোগ করুন। CDN প্রতিক্রিয়া শিরোনাম চেক করুন এবং প্রভাবিত বাসি ক্যাশে করা প্রতিক্রিয়াগুলি বাতিল করুন৷ | | ডাউনলোড সফল; প্লেব্যাক ব্যর্থ হয় | প্যাকেজ প্রকাশনা, ম্যানিফেস্ট পাথ, MIME প্রকার এবং DRM লাইসেন্স অনুমোদন পরীক্ষা করুন। [প্লেব্যাক সমস্যা সমাধান](https://docs.drm-x.com/bn/troubleshooting/playback) দেখুন। | ## অফিসিয়াল রেফারেন্স[#](#references) - [একটি R2 bucket](https://developers.cloudflare.com/r2/buckets/create-buckets/) তৈরি করুন - [R2 শংসাপত্র এবং অনুমতি](https://developers.cloudflare.com/r2/api/tokens/) - [কাস্টম ডোমেন এবং r2.dev](https://developers.cloudflare.com/r2/buckets/public-buckets/) - [R2 CORS এবং ক্যাশে আচরণ](https://developers.cloudflare.com/r2/buckets/cors/) AWS ব্যবহার করছেন? [Amazon S3 এবং CloudFront সেটআপ](https://docs.drm-x.com/bn/storage/amazon-s3) অনুসরণ করুন।