# Cloudflare R2: bucket, CORS dan pengiriman Buat bucket R2, atur CORS untuk unggahan dan pemutaran, hubungkan domain khusus atau URL pengujian r2.dev, lalu verifikasi unggahan melalui DRM-X 6.0. Video terenkripsi dan lisensi DRM dikirim melalui jalur yang berbeda CDN mengirimkan video terenkripsi. Backend Anda memeriksa akses, dan layanan lisensi DRM mengizinkan dekripsi pada perangkat yang kompatibel. - 01**Penyimpanan / CDN** Mengirimkan media terenkripsi ke pemutar. - 02**Backend Anda** Memeriksa hak menonton pengguna dan meminta otorisasi pemutaran dari DRM-X. - 03**DRM-X** Memvalidasi otorisasi pemutaran dan memproses permintaan lisensi DRM. - 04**Pemutar + perangkat** Menggunakan sistem DRM perangkat untuk memperoleh lisensi dan memutar media terenkripsi. Backend Anda memutuskan akses; DRM-X memaksa kebijakan yang ditandatangani. Media tersandi dan DRM lisensi mengikuti jalur pengiriman terpisah. **Dari bucket baru ke unggahan yang berfungsi** Buat bucket R2, konfigurasikan browser CORS, pilih pengiriman HTTPS publik URL, sambungkan DRM-X, dan unggah serta ambil objek uji. Simpan video asli dan dokumen pribadi di luar wadah pengiriman ini. Publikasikan hanya media terenkripsi dan aset publik yang dimaksud. Pengiriman publik membuat byte objek dapat dijangkau dengan URL; DRM mengontrol dekripsi media yang dikemas dengan benar. CORS adalah aturan kompatibilitas browser, bukan otorisasi. Tangkapan layar konsol asli ini tidak termasuk header akun dan pengenal pribadi. Kata-kata menu dapat berubah. ## 1. Buat bucket R2 Anda[#](#create-bucket) - Masuk ke Cloudflare dan pilih akun yang akan memiliki bucket. - Buka **Storage & databases → R2 Object Storage → Overview → Create bucket**. - Masukkan nama bucket unik, seperti `customer-drm-media-example`. Pilih lokasi atau yurisdiksi yang sesuai. Gunakan penyimpanan **Standard** untuk panduan ini, lalu buat bucket. - Buka **Settings** pada bucket. Catat nama bucket, Cloudflare account ID, dan endpoint **General → S3 API**. Untuk yurisdiksi default, endpoint API adalah `https://.r2.cloudflarestorage.com`. Jika Cloudflare menampilkan hostname khusus yurisdiksi, gunakan hostname itu persis. Hapus `/bucket-name` di bagian akhir saat memasukkan endpoint ke DRM-X; nama bucket memiliki kolom tersendiri. Endpoint API ini bukan URL pemutaran publik. ## 2. Buat kredensial yang dibatasi untuk bucket ini[#](#create-credentials) - Kembali ke R2 Overview dan buka **Manage API tokens**. Pilih token akun R2, atau token pengguna jika diwajibkan oleh organisasi Anda. - Pilih **Create API token**, beri nama yang dapat dikenali, dan pilih **Object Read & Write**. - Pilih **Apply to specific buckets only** dan pilih bucket ini. Konfigurasikan masa berlakunya sesuai dengan kebijakan Anda. Untuk panduan ini, biarkan pemfilteran opsional IP tidak disetel. Jika kebijakan keamanan Anda mengharuskannya, validasi akses server DRM-X dan unggahan langsung dari jaringan browser pelanggan. - Buat token dan catat **Access Key ID** dan **Secret Access Key** untuk DRM-X dengan aman. **Gunakan pasangan kredensial S3** Cloudflare Token value yang terpisah bukan S3 Secret Access Key. DRM-X tidak membutuhkan token administratif untuk seluruh akun. Kelola CORS dan domain sendiri di Cloudflare. ## 3. Pilih URL distribusi publik[#](#public-delivery) ![R2 Settings: Tambahkan di bawah Custom Domains, atau Aktifkan di bawah Public Development URL.](https://docs.drm-x.com/assets/storage/r2-delivery.png)12**1 — Produksi:** Tambahkan domain khusus. **2 — Pengujian: ** Memungkinkan pengembangan publik URL. ### Opsi A: sambungkan domain Anda untuk produksi - Miliki domain dengan pengaturan DNS yang diselesaikan di akun Cloudflare yang sama. Pilih subdomain seperti `media.example.com`. - Di dalam bucket, buka **Settings → Custom Domains → Add**. Masukkan subdomain, tinjau perubahan DNS, lalu hubungkan melalui alur R2 ini. - Tunggu hingga domain dan sertifikat HTTPS menjadi aktif. Asal pengiriman Anda adalah `https://media.example.com`. Jangan membuat CNAME menunjuk ke alamat r2.dev. Gunakan alur kerja R2 Custom Domains. Pengembangan URL dapat tetap dinonaktifkan ketika domain khusus terhubung. ### Opsi B: aktifkan Cloudflare URL untuk pengujian - Buka **Settings → Public Development URL → Enable**. - Tinjau pemberitahuan akses publik, ketik `allow` saat diminta, dan konfirmasi. - Salin `https://pub-….r2.dev` URL aktual yang ditampilkan oleh Cloudflare. Jangan membuatnya dari akun Anda ID atau nama bucket. Titik akhir r2.dev dibatasi kecepatannya dan dimaksudkan untuk pengembangan. Gunakan domain khusus untuk produksi, cache, dan Cloudflare fitur keamanan. ## 4. Konfigurasikan CORS untuk unggahan dan pemutaran di browser[#](#configure-cors) ![R2 CORS Policy panel dengan Edit, asal, metode, dan header yang diizinkan.](https://docs.drm-x.com/assets/storage/r2-cors.png)12**1:** pilih Add CORS policy untuk bucket baru, atau Edit. **2:** konfirmasi asal, metode, dan header yang disimpan. Tangkapan layar ini menunjukkan aturan diagnostik khusus Console; gunakan contoh dua aturan lengkap di bawah ini untuk situs web pemutar Anda. - Buka **Settings → CORS Policy → Add CORS policy** (atau **Edit**). - Rekatkan JSON di bawah ini ke dalam editor. Ganti `https://www.example.com` dengan situs asal yang menyematkan pemutar Anda. Asal mencakup HTTPS dan nama host, tetapi tidak ada jalur halaman seperti /watch. - Pertahankan aturan lain yang diperlukan jika bucket sudah memiliki kebijakan, lalu pilih **Save**. - Tunggu hingga perubahan diterapkan, lalu coba unggah lagi. Jika domain khusus masih menyimpan header CORS lama dalam cache, hapus respons cache untuk jalur yang terdampak dan uji kembali. ``` [ { "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 } ] ``` Aturan pertama mengizinkan PUT unggahan yang ditandatangani dari DRM-X Console. Yang kedua mengizinkan GET/HEAD dari situs web pemutar Anda dan DRM-X halaman pengujian. R2 domain khusus menggunakan kebijakan CORS bucket. CORS tidak memberikan akses unggahan anonim. ### Hasilkan bidang CORS dan bidang URL yang cocok Alat ini berjalan di browser Anda. Masukkan asal publik saja; itu tidak meminta kunci akses. Origin situs web pemutarGantikan contohnya. Pisahkan beberapa asal HTTPS dengan spasi atau koma. Gunakan situs web yang menyematkan pemutar Anda, tanpa jalur halaman. DRM-X Console dan Playback Lab disertakan secara otomatis.Asal pengiriman publikMasukkan domain khusus Anda yang terhubung, aktifkan r2.dev URL, atau CloudFront asal. Hilangkan folder di sini.Folder penyimpanan (opsional)Hasilkan konfigurasi Salin CORS JSON ``` ``` Protected-content base path``Public URL prefix``Contoh kunci objek``Contoh URL lengkap`` ## 5. Hubungkan R2 di DRM-X 6.0[#](#connect-drmx) Buka [Cloud Storage → Connect storage](https://6.drm-x.com/console/cloud-storage) dan pilih **Cloudflare R2**. | Ruas | Apa yang harus dimasukkan | | --- | --- | | Display name | Label yang ramah, seperti Produksi R2. | | Bucket name | Nama bucket persisnya, tanpa URL atau folder. | | Cloudflare account ID | ID akun yang memiliki bucket ini. | | S3 API endpoint | Biarkan kosong untuk yurisdiksi default, atau masukkan titik akhir akun/yurisdiksi tanpa jalur bucket. | | Protected-content base path | `protected`, atau kosong untuk unggahan bucket-root. | | Public URL prefix | `https://media.example.com/protected` atau Anda mengaktifkan `https://pub-….r2.dev/protected` URL. | | Access key ID / Secret access key | Pasangan kredensial S3 dari langkah 2. | Contohnya menggunakan folder bernama `protected`. Nama bucket tidak otomatis menjadi folder. Dengan pemetaan domain-ke-bucket langsung yang digunakan di sini, sertakan folder penyimpanan yang sama tepat satu kali di awalan publik 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 ``` Untuk menggunakan akar bucket, biarkan jalur dasar kosong dan masukkan hanya asal pengiriman sebagai awalan publik. Jangan menambahkan nama bucket kecuali Anda sengaja menggunakannya sebagai folder. Biarkan CloudFront Origin path kosong untuk pemetaan ini. Pilih **Gunakan sebagai default CLI tujuan unggah** jika diinginkan. Pilih **Save and verify**. Kredensial dienkripsi saat disimpan dan tidak dikembalikan setelah disimpan. Lanjutkan ke tes unggahan sebenarnya meskipun verifikasi berhasil. ## 6. Unggah file dan verifikasi bahwa file tersebut berfungsi[#](#test-upload) - Buka [Cloud Storage](https://6.drm-x.com/console/cloud-storage), pilih tujuan ini, lalu pilih **Verify location**. Keberhasilan hanya membuktikan bahwa server DRM-X dapat menampilkan isi bucket. Izin menulis, CORS browser, dan distribusi publik harus diuji secara terpisah. - Pilih **Upload encrypted files** dan pilih satu segmen kecil terenkripsi dari paket DRM-X yang ada. Jika Anda tidak memiliki paketnya, gunakan diagnostik terenkripsi sekali pakai di bawah ini. Jangan mengunggah video asli atau dokumen pribadi. - Tunggu pesan sukses. Periksa apakah nama file dan ukurannya muncul di Cloud Storage. Temukan objek yang sama di bawah `protected/` di konsol penyedia Anda. - Klik **Preview URL**, dan uji objek yang sama di jendela browser pribadi. Seharusnya mengunduh atau mengembalikan HTTP 200 tanpa login AWS atau Cloudflare. Uji objek sebenarnya: root domain dapat mengembalikan 403/404 bahkan ketika pengiriman objek berfungsi. - Periksa pengiriman lintas asal dari situs web pemutar Anda. Panel Jaringan browsernya akan menampilkan `Access-Control-Allow-Origin` yang cocok dengan asal laman pemutar. Pengunduhan bilah alamat langsung tidak menguji CORS. Contoh terminal di bawah ini juga memeriksa header. - Hapus hanya objek diagnostik sekali pakai Anda setelah selesai. Kemudian ikuti [Panduan Pengemas Desktop](https://docs.drm-x.com/id/packaging/desktop), pilih tujuan penyimpanan ini di Package content, dan unggah paket terenkripsi lengkap. Mengunggah file secara manual tidak mendaftarkan Published Content ID. - Uji file Published yang dihasilkan di [Universal Playback Lab](https://multi-drm.drm-x.com/id/player) dan situs web pemutar Anda sendiri. Verifikasi video, audio, seek, dan perangkat yang Anda perlukan. Pengunduhan biner yang berhasil bukanlah bukti pemutaran DRM. Tidak ada sampel terenkripsi? Buat file pengujian sekali pakai di Windows Jalankan ini di Windows PowerShell di folder sementara yang Anda kendalikan. Ini mengenkripsi pesan singkat non-pribadi dengan kunci AES sekali pakai yang hanya disimpan di memori. Outputnya adalah diagnostik penyimpanan, bukan media yang dapat diputar; tidak berisi DRM kunci konten atau data pelanggan. ``` $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 ``` Unggah `drmx-storage-check.encrypted.bin`, verifikasi ukurannya dan Preview URL, lalu keluarkan dari bucket. ``` curl.exe -I -H "Origin: https://www.example.com" "https://media.example.com/protected/sample.encrypted.bin" ``` Ganti kedua URL. Harapkan HTTP 200 dan asal yang diizinkan cocok dengan situs web pemutar Anda. Untuk pengiriman jangkauan, permintaan GET dengan `Range: bytes=0-15` akan menghasilkan HTTP 206 dan header Content-Range yang valid. Pertahankan jenis media MIME: DASH manifes menggunakan application/dash+xml, HLS playlist menggunakan application/vnd.apple.mpegurl, dan file media harus menggunakan jenis media yang sesuai. ## 7. Pecahkan masalah hasil Anda[#](#troubleshooting) | Hasil | Aksi | | --- | --- | | Verify location berhasil, tetapi unggahan browser gagal | Periksa panel Console dan Network di browser. Izinkan PUT melalui CORS dari Origin Console yang tepat serta header Content-Type. Periksa koneksi dan coba lagi untuk mendapatkan presigned URL baru. | | Unggahan mengembalikan 403 | Periksa izin penulisan objek, cakupan bucket/folder, titik akhir, wilayah, masa berlaku permintaan, dan jam. Jangan bagikan URL unggahan yang ditandatangani. | | Pengunggahan berhasil; publik URL mengembalikan 403 | Periksa apakah pengiriman publik diaktifkan dan domain/distribusi telah selesai diterapkan. | | Publik URL mengembalikan 404 | Bandingkan URL lengkap dengan object key yang tepat. Periksa folder yang hilang atau berulang serta huruf besar/kecil pada nama file. | | URL terbuka secara langsung; pengambilan pemutar gagal | Tambahkan halaman asal pemutar ke GET/HEAD CORS. Periksa CDN header respons dan batalkan respons cache basi yang terpengaruh. | | Pengunduhan berhasil; pemutaran gagal | Periksa publikasi paket, jalur manifes, jenis MIME dan otorisasi lisensi DRM. Lihat [pemecahan masalah pemutaran](https://docs.drm-x.com/id/troubleshooting/playback). | ## Referensi resmi[#](#references) - [Buat R2 bucket](https://developers.cloudflare.com/r2/buckets/create-buckets/) - [R2 kredensial dan izin](https://developers.cloudflare.com/r2/api/tokens/) - [Domain khusus dan r2.dev](https://developers.cloudflare.com/r2/buckets/public-buckets/) - [R2 CORS dan perilaku cache](https://developers.cloudflare.com/r2/buckets/cors/) Menggunakan AWS? Ikuti [Amazon S3 dan CloudFront pengaturan](https://docs.drm-x.com/id/storage/amazon-s3).