# Cloudflare R2: حاوية، CORS والتوصيل أنشئ حاوية R2 وأعد CORS للرفع والتشغيل، ثم اربط نطاقًا مخصصًا أو URL اختبار من r2.dev وتحقق من الرفع عبر DRM-X 6.0. يُرسَل الفيديو المشفّر وتراخيص DRM عبر مسارين منفصلين توزّع CDN الفيديو المشفّر. يتحقق خادم التطبيق من صلاحية الوصول، وتسمح خدمة تراخيص DRM بفك التشفير على جهاز متوافق. - 01**التخزين / CDN** يوزّع الوسائط المشفّرة إلى المشغّل. - 02**خادم التطبيق لديك** يتحقق من حق المشاهد في الوصول ويطلب تصريح التشغيل من DRM-X. - 03**DRM-X** تتحقق من تصريح التشغيل وتعالج طلب ترخيص DRM. - 04**المشغّل + الجهاز** يستخدم نظام DRM في الجهاز للحصول على ترخيص وتشغيل الوسائط المشفّرة. يتحقق backend لديك من حق الوصول، ويطبّق DRM-X السياسة الموقّعة. تُنقل الوسائط المشفرة وتراخيص DRM عبر مسارين منفصلين. **من مجموعة جديدة إلى تحميل فعال** قم بإنشاء مجموعة R2، وتكوين المتصفح CORS، واختيار تسليم HTTPS عام URL، والاتصال DRM-X، وتحميل واسترداد كائن اختبار. احتفظ بمقاطع الفيديو الأصلية والمستندات الخاصة خارج مجموعة التسليم هذه. نشر الوسائط المشفرة والأصول العامة المقصودة فقط. التسليم العام يجعل بايتات الكائنات قابلة للوصول بحلول URL؛ DRM يتحكم في فك تشفير الوسائط المعبأة بشكل صحيح. CORS هي قاعدة توافق المتصفح، وليس الترخيص. تستبعد لقطات الشاشة الحقيقية لوحدة التحكم هذه رؤوس الحسابات والمعرفات الشخصية. قد تتغير صياغة القائمة. ## 1. قم بإنشاء حاوية R2 الخاص بك[#](#create-bucket) - قم بالدخول إلى Cloudflare واختر الحساب الذي سيمتلك الحاوية. - افتح **Storage & databases → R2 Object Storage → Overview → Create bucket**. - أدخل اسمًا فريدًا للمستودع، مثل `customer-drm-media-example`. اختر الموقع أو الولاية القضائية المناسبة. استخدم مساحة تخزين **Standard** لهذه الإرشادات، ثم قم بإنشاء الحاوية. - افتح **Settings** للحاوية. سجّل اسم الحاوية وCloudflare account ID وendpoint في **General → S3 API**. بالنسبة للولاية القضائية الافتراضية، نقطة النهاية API هي `https://.r2.cloudflarestorage.com`. إذا كان Cloudflare يعرض اسم مضيف خاصًا بسلطة قضائية معينة، فاستخدم اسم المضيف الدقيق هذا. إزالة زائدة `/bucket-name` عند دخول نقطة النهاية في DRM-X؛ اسم الحاوية له حقل خاص به. نقطة النهاية API هذه ليست تشغيلًا عامًا URL. ## 2. إنشاء بيانات اعتماد بصلاحيات تقتصر على هذه الحاوية[#](#create-credentials) - ارجع إلى R2 Overview وافتح **Manage API tokens**. اختر رمز حساب R2، أو رمز مستخدم إذا طلبت مؤسستك ذلك. - اختر **Create API token**، وامنحه اسمًا مميزًا، ثم اختر **Object Read & Write**. - اختر **Apply to specific buckets only** وحدد هذه الحاوية. قم بتكوين انتهاء الصلاحية وفقًا لسياستك. بالنسبة لهذه الإرشادات التفصيلية، اترك التصفية الاختيارية IP بدون ضبط. إذا كانت سياسة الأمان الخاصة بك تتطلب ذلك، فتحقق من صحة الوصول إلى الخادم DRM-X والتحميلات المباشرة من شبكات متصفح العملاء. - قم بإنشاء الرمز المميز وقم بتسجيل **Access Key ID** و **Secret Access Key** بشكل آمن لـ DRM-X. **استخدم S3 زوج بيانات الاعتماد** المنفصل Cloudflare Token value ليس S3 Secret Access Key. DRM-X لا يحتاج إلى رمز إداري على مستوى الحساب. إدارة CORS والمجالات بنفسك في Cloudflare. ## 3. اختيار URL للتوزيع العام[#](#public-delivery) ![R2 Settings: أضف تحت Custom Domains، أو تمكين تحت Public Development URL.](https://docs.drm-x.com/assets/storage/r2-delivery.png)12**1 — الإنتاج:** إضافة نطاق مخصص. **2 — الاختبار:** تمكين التطوير العام URL. ### الخيار أ: قم بتوصيل المجال الخاص بك للإنتاج - لديك مجال تم الانتهاء من إعداده DNS في نفس حساب Cloudflare. اختر نطاقًا فرعيًا مثل `media.example.com`. - داخل الحاوية، افتح **Settings → Custom Domains → Add**. أدخل النطاق الفرعي وراجع تغيير DNS، ثم اربطه عبر خطوات R2 هذه. - انتظر حتى يصبح المجال وشهادة HTTPS نشطة. أصل التسليم الخاص بك هو `https://media.example.com`. لا تقم بإنشاء CNAME يشير إلى عنوان r2.dev. استخدم سير عمل R2 Custom Domains. يمكن أن يظل التطوير URL معطلاً عند اتصال مجال مخصص. ### الخيار ب: تمكين Cloudflare URL للاختبار - افتح **Settings → Public Development URL → Enable**. - قم بمراجعة إشعار الوصول العام واكتب `allow` عند الطلب ثم قم بالتأكيد. - انسخ `https://pub-….r2.dev` URL الفعلي المعروض بواسطة Cloudflare. لا تقم بإنشائه من حسابك ID أو اسم الحاوية. نقطة النهاية r2.dev محدودة المعدل ومخصصة للتطوير. استخدم مجالًا مخصصًا للإنتاج والتخزين المؤقت وميزات الأمان Cloudflare. ## 4. إعداد CORS للرفع والتشغيل من المتصفح[#](#configure-cors) ![R2 CORS Policy لوحة مع التعديل والأصول والطرق والعناوين المسموح بها.](https://docs.drm-x.com/assets/storage/r2-cors.png)12**1:** اختر Add CORS policy لمجموعة جديدة، أو تحرير. **2:** تأكيد الأصل والطرق والعناوين المحفوظة. تعرض لقطة الشاشة هذه قاعدة تشخيصية Console فقط؛ استخدم المثال الكامل المكون من قاعدتين أدناه لمواقع المشغل الخاصة بك. - افتح **Settings → CORS Policy → Add CORS policy** أو **Edit**. - الصق JSON أدناه في المحرر. استبدل `https://www.example.com` بأصل موقع الويب الذي يتضمن المشغل الخاص بك. يتضمن الأصل HTTPS واسم المضيف، ولكن لا يوجد مسار صفحة مثل /watch. - احتفظ بالقواعد الأخرى المطلوبة إذا كانت للحاوية سياسة حالية، ثم اختر **Save**. - انتظر انتشار التغيير ثم أعد محاولة الرفع. إذا احتفظ النطاق المخصص بترويسات CORS قديمة في cache، فامسح الاستجابات المخزنة مؤقتًا للمسارات المتأثرة ثم اختبر مجددًا. ``` [ { "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 } ] ``` القاعدة الأولى تسمح بالتحميلات الموقعة PUT من DRM-X Console. والثاني يسمح GET/HEAD من موقع المشغّل الخاص بك وDRM-X صفحات الاختبار. R2 تستخدم النطاقات المخصصة سياسة CORS الخاصة بالحاوية. CORS لا يمنح إمكانية الوصول للتحميل المجهول. ### قم بإنشاء حقول CORS ومطابقة URL تعمل هذه الأداة في متصفحك. أدخل الأصول العامة فقط؛ لا يطلب مفاتيح الوصول. أصول موقع المشغّلاستبدل المثال. افصل بين الأصول HTTPS المتعددة بمسافات أو فواصل. استخدم موقع الويب الذي يتضمن المشغل الخاص بك، بدون مسار الصفحة. يتم تضمين DRM-X Console وPlayback Lab تلقائيًا.أصل التسليم العموميأدخل المجال المخصص المتصل الخاص بك، ممكّن r2.dev URL، أو CloudFront الأصل. حذف المجلد هنا.مجلد التخزين (اختياري)إنشاء التكوين نسخ CORS JSON ``` ``` Protected-content base path``Public URL prefix``مثال لمفتاح الكائن``مثال على URL كامل`` ## 5. ربط R2 مع DRM-X 6.0[#](#connect-drmx) افتح [Cloud Storage → Connect storage](https://6.drm-x.com/console/cloud-storage) واختر **Cloudflare R2**. | الميدان | ما يدخل | | --- | --- | | Display name | اسم يسهل تمييزه، مثل Production R2. | | Bucket name | اسم الحاوية بالضبط بدون URL أو مجلد. | | Cloudflare account ID | ID الحساب الذي يملك هذا الحاوية. | | S3 API endpoint | اتركه فارغًا للولاية القضائية الافتراضية، أو أدخل نقطة نهاية الحساب/الولاية بدون مسار الحاوية. | | 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 | زوج بيانات الاعتماد S3 من الخطوة 2. | تستخدم الأمثلة مجلدًا يسمى `protected`. اسم الحاوية ليس مجلدًا تلقائيًا. باستخدام التعيين المباشر للمجال إلى الحاوية المستخدم هنا، قم بتضمين مجلد التخزين نفسه مرة واحدة بالضبط في البادئة 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 ``` لاستخدام جذر الحاوية، اترك المسار الأساسي فارغًا وأدخل فقط أصل التسليم كبادئة عامة. لا تقم بإلحاق اسم الحاوية إلا إذا كنت تستخدمه عمدًا كمجلد. اترك CloudFront Origin path فارغًا لهذا التعيين. اختر **استخدم كإعداد افتراضي CLI وجهة التحميل** إذا رغبت في ذلك. اختر **Save and verify**. يتم تشفير بيانات الاعتماد أثناء الراحة ولا يتم إرجاعها بعد الحفظ. تابع اختبار التحميل الحقيقي حتى لو نجح التحقق. ## 6. قم بتحميل ملف وتأكد من أنه يعمل[#](#test-upload) - افتح [Cloud Storage](https://6.drm-x.com/console/cloud-storage) وحدد هذه الوجهة ثم اختر **Verify location**. النجاح يثبت فقط أن خادم DRM-X يستطيع سرد محتويات الحاوية؛ ولا يثبت صلاحية الكتابة أو CORS في المتصفح أو التوزيع العام. - اختر **Upload encrypted files** واختر شريحة واحدة صغيرة مشفرة من باقة DRM-X الموجودة. إذا لم يكن لديك حزمة، استخدم التشخيص المشفر الذي يمكن التخلص منه أدناه. لا تقم بتحميل مقطع فيديو أصلي أو مستند شخصي. - انتظر رسالة النجاح. تأكد من ظهور اسم الملف وحجمه في Cloud Storage. ابحث عن نفس الكائن ضمن `protected/` في وحدة تحكم المزود الخاص بك. - انقر على **Preview URL**، واختبر نفس الكائن في نافذة متصفح خاصة. يجب تنزيل أو إرجاع HTTP 200 بدون تسجيل الدخول AWS أو Cloudflare. اختبار كائن فعلي: يمكن لجذر المجال إرجاع 403/404 حتى عندما يعمل تسليم الكائن. - تحقق من التسليم عبر الأصل من موقع المشغل الخاص بك. يجب أن تظهر لوحة شبكة المتصفح الخاصة بها `Access-Control-Allow-Origin` مطابقة لأصل صفحة المشغل. لا يختبر التنزيل المباشر لشريط العناوين CORS. المثال الطرفي أدناه يتحقق أيضًا من الرؤوس. - قم بإزالة الكائن التشخيصي القابل للتصرف فقط عند الانتهاء. ثم اتبع [دليل حزم سطح المكتب](https://docs.drm-x.com/ar/packaging/desktop)، وحدد وجهة التخزين هذه في Package content، وقم بتحميل الحزمة المشفرة الكاملة. لا يؤدي تحميل الملف يدويًا إلى تسجيل Published Content ID. - اختبر الملف Published الناتج في [Universal Playback Lab](https://multi-drm.drm-x.com/ar/player) وموقع المشغّل الخاص بك. التحقق من الفيديو والصوت والتنقل داخل المقطع والأجهزة المطلوبة. التنزيل الثنائي الناجح ليس دليلاً على تشغيل DRM. لا توجد عينة مشفرة؟ قم بإنشاء ملف اختبار يمكن التخلص منه على 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 ثم أخرجه من الحاوية. ``` curl.exe -I -H "Origin: https://www.example.com" "https://media.example.com/protected/sample.encrypted.bin" ``` استبدل كلا عنواني URL. توقع HTTP 200 وأصل مسموح به يطابق موقع المشغّل الخاص بك. لتسليم النطاق، يجب أن يعود طلب GET مع `Range: bytes=0-15` HTTP 206 ورأس Content-Range صالح. الحفاظ على أنواع MIME الوسائط: DASH تستخدم البيانات application/dash+xml، HLS تستخدم قوائم التشغيل application/vnd.apple.mpegurl، ويجب أن تستخدم ملفات الوسائط نوع الوسائط المناسب لها. ## 7. استكشاف أخطاء النتيجة وإصلاحها[#](#troubleshooting) | النتيجة | العمل | | --- | --- | | ينجح Verify location لكن الرفع من المتصفح يفشل | افحص لوحتي Console وNetwork في المتصفح. اسمح بطلبات PUT عبر CORS من Origin الخاص بـ Console بدقة، واسمح بترويسة Content-Type. تحقق من الاتصال وأعد المحاولة للحصول على presigned URL جديد. | | الرفع يرجع 403 | تحقق من إذن كتابة الكائن ونطاق الحاوية/المجلد ونقطة النهاية والمنطقة وانتهاء الطلب والساعة. لا تشارك عناوين URL للتحميل الموقعة. | | نجح التحميل؛ عام URL يعود 403 | تحقق من تمكين التسليم العام وانتهاء نشر المجال/التوزيع. | | عام URL يعود 404 | قارن URL الكامل بمفتاح الكائن الدقيق. تحقق من المجلدات الناقصة أو المكررة ومن حالة الأحرف في اسم الملف. | | URL يفتح مباشرة؛ فشل جلب المشغّل | أضف أصل صفحة المشغّل إلى GET/HEAD CORS. تحقق من رؤوس الاستجابة CDN وأبطل الاستجابات المتأثرة المخزنة مؤقتًا. | | تم التحميل بنجاح؛ فشل التشغيل | التحقق من نشر الحزمة ومسارات البيان وأنواع MIME وتفويض الترخيص DRM. راجع [استكشاف أخطاء التشغيل وإصلاحها](https://docs.drm-x.com/ar/troubleshooting/playback). | ## المراجع الرسمية[#](#references) - [إنشاء R2 حاوية](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/ar/storage/amazon-s3).