# Cloudflare R2: bucket, CORS e entrega Crie um bucket R2, configure CORS para uploads e reprodução, conecte um domínio personalizado ou uma URL de teste r2.dev e verifique um upload pelo DRM-X 6.0. O vídeo criptografado e as licenças DRM seguem caminhos diferentes A CDN entrega o vídeo criptografado. Seu backend verifica o acesso, e o serviço de licenças DRM autoriza a descriptografia em um dispositivo compatível. - 01**Armazenamento / CDN** Entrega a mídia criptografada ao player. - 02**Seu backend** Verifica se o espectador pode assistir e solicita a autorização de reprodução ao DRM-X. - 03**DRM-X** Valida a autorização de reprodução e processa a solicitação de licença DRM. - 04**Player + dispositivo** Usa o sistema DRM do dispositivo para obter uma licença e reproduzir a mídia criptografada. Sua infraestrutura decide o acesso; DRM-X aplica a política assinada. Mídia criptografada e licenças DRM seguem caminhos de entrega separados. **De um novo bucket para um upload funcional** Crie um bucket R2, configure o navegador CORS, escolha uma entrega pública HTTPS URL, conecte DRM-X e carregue e recupere um objeto de teste. Mantenha vídeos originais e documentos privados fora deste bucket de entrega. Publique apenas mídia criptografada e arquivos destinados à publicação. A entrega pública torna os bytes do objeto acessíveis por URL; DRM controla a descriptografia de mídia empacotada corretamente. CORS é uma regra de compatibilidade do navegador, não de autorização. Essas capturas de tela reais do console excluem cabeçalhos de contas e identificadores pessoais. O texto do menu pode mudar. ## 1. Crie seu bucket R2[#](#create-bucket) - Faça login em Cloudflare e escolha a conta que será proprietária do bucket. - Abra **Storage & databases → R2 Object Storage → Overview → Create bucket**. - Insira um nome de bucket exclusivo, como `customer-drm-media-example`. Selecione um local ou jurisdição apropriada. Use o armazenamento **Standard** para este passo a passo e crie o bucket. - Abra **Settings** do bucket. Anote o nome do bucket, Cloudflare account ID e o endpoint em **General → S3 API**. Para jurisdição padrão, o ponto final API é `https://.r2.cloudflarestorage.com`. Se Cloudflare mostrar um nome de host específico da jurisdição, use esse nome de host exato. Remova um `/bucket-name` à direita ao inserir o ponto final em DRM-X; o nome do bucket tem seu próprio campo. Este endpoint API não é uma reprodução pública URL. ## 2. Crie credenciais limitadas a este bucket[#](#create-credentials) - Retorne para R2 Overview e abra **Manage API tokens**. Escolha um token de conta R2 ou um token de usuário, se exigido pela sua organização. - Selecione **Create API token**, dê um nome reconhecível e escolha **Object Read & Write**. - Escolha **Apply to specific buckets only** e selecione este bucket. Configure a expiração de acordo com sua política. Para este passo a passo, deixe a filtragem opcional IP indefinida. Se sua política de segurança exigir isso, valide o acesso ao servidor DRM-X e os uploads diretos das redes de navegadores do cliente. - Crie o token e registre com segurança **Access Key ID** e **Secret Access Key** para DRM-X. **Use o par de credenciais S3** O Cloudflare Token value não é o S3 Secret Access Key. DRM-X não precisa de um token administrativo para toda a conta. Gerencie você mesmo CORS e domínios em Cloudflare. ## 3. Escolha uma URL de distribuição pública[#](#public-delivery) ![R2 Settings: Adicionar em Custom Domains ou Ativar em Public Development URL.](https://docs.drm-x.com/assets/storage/r2-delivery.png)12**1 — Produção:** Adicione um domínio personalizado. **2 — Teste:** Habilitar o desenvolvimento público URL. ### Opção A: conectar seu domínio para produção - Ter um domínio com configuração DNS concluída na mesma conta Cloudflare. Escolha um subdomínio como `media.example.com`. - No bucket, abra **Settings → Custom Domains → Add**. Insira o subdomínio, revise a alteração DNS e conecte-o usando este fluxo de trabalho R2. - Aguarde até que o domínio e o certificado HTTPS se tornem ativos. Sua origem de entrega é `https://media.example.com`. Não crie um CNAME apontando para um endereço r2.dev. Use o fluxo de trabalho R2 do Custom Domains. O desenvolvimento URL pode permanecer desativado quando um domínio personalizado estiver conectado. ### Opção B: habilitar Cloudflare's URL para teste - Abra **Settings → Public Development URL → Enable**. - Revise o aviso de acesso público, digite `allow` quando solicitado e confirme. - Copie o `https://pub-….r2.dev` URL real exibido por Cloudflare. Não o construa a partir da sua conta ID ou do nome do bucket. O endpoint r2.dev tem taxa limitada e é destinado ao desenvolvimento. Use um domínio personalizado para produção, cache e recursos de segurança Cloudflare. ## 4. Configure CORS para uploads e reprodução no navegador[#](#configure-cors) ![R2 CORS Policy painel com Edit, origens permitidas, métodos e cabeçalhos.](https://docs.drm-x.com/assets/storage/r2-cors.png)12**1:** escolha Add CORS policy para um novo bucket ou Editar. **2:** confirme a origem, métodos e cabeçalhos salvos. Esta captura de tela mostra uma regra de diagnóstico somente Console; use o exemplo completo de duas regras abaixo para os sites dos seus players. - Abra **Settings → CORS Policy → Add CORS policy** ou **Edit**. - Cole o JSON abaixo no editor. Substitua `https://www.example.com` pela origem do site que incorpora seu player. Uma origem inclui HTTPS e o nome do host, mas nenhum caminho de página como /watch. - Preserve as outras regras necessárias se o bucket já tiver uma política e selecione **Save**. - Aguarde a propagação da mudança e repita o upload. Se o domínio personalizado mantiver cabeçalhos CORS antigos em cache, limpe as respostas em cache dos caminhos afetados e teste novamente. ``` [ { "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 } ] ``` A primeira regra permite uploads assinados de PUT de DRM-X Console. O segundo permite GET/HEAD do site do seu player e DRM-X páginas de teste. R2 domínios personalizados usam a política CORS do bucket. CORS não concede acesso de upload anônimo. ### Gere seus campos CORS e URL correspondentes Esta ferramenta é executada no seu navegador. Insira apenas origens públicas; não solicita chaves de acesso. Origens do site do playerSubstitua o exemplo. Separe múltiplas origens HTTPS com espaços ou vírgulas. Use o site incorporando seu player, sem caminho de página. DRM-X Console e Playback Lab são incluídos automaticamente.Origem da entrega públicaInsira seu domínio personalizado conectado, habilitado r2.dev URL ou CloudFront origem. Omita a pasta aqui.Pasta de armazenamento (opcional)Gerar configuração Copiar CORS JSON ``` ``` Protected-content base path``Public URL prefix``Exemplo de chave de objeto``Exemplo de URL completa`` ## 5. Conecte R2 em DRM-X 6.0[#](#connect-drmx) Abra [Cloud Storage → Connect storage](https://6.drm-x.com/console/cloud-storage) e escolha **Cloudflare R2**. | Campo | O que inserir | | --- | --- | | Display name | Um nome fácil de identificar, como Production R2. | | Bucket name | O nome exato do bucket, sem URL ou pasta. | | Cloudflare account ID | O ID da conta que possui este bucket. | | S3 API endpoint | Deixe em branco para jurisdição padrão ou insira o endpoint da conta/jurisdição sem o caminho do bucket. | | Protected-content base path | `protected` ou em branco para uploads raiz do bucket. | | Public URL prefix | `https://media.example.com/protected` ou seu `https://pub-….r2.dev/protected` URL habilitado. | | Access key ID / Secret access key | O par de credenciais S3 da etapa 2. | Os exemplos usam uma pasta chamada `protected`. O nome do bucket não é automaticamente uma pasta. Com o mapeamento direto de domínio para bucket usado aqui, inclua a mesma pasta de armazenamento exatamente uma vez no prefixo público 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 ``` Para usar a raiz do bucket, deixe o caminho base em branco e insira apenas a origem da entrega como prefixo público. Não anexe um nome de bucket, a menos que você o use deliberadamente como uma pasta. Deixe CloudFront Origin path vazio para este mapeamento. Escolha **Use como padrão CLI destino de upload** se desejar. Selecione **Save and verify**. As credenciais são criptografadas em repouso e não são retornadas após serem salvas. Continue para o teste de upload real mesmo que a verificação seja bem-sucedida. ## 6. Faça upload de um arquivo e verifique se funciona[#](#test-upload) - Abra [Cloud Storage](https://6.drm-x.com/console/cloud-storage), selecione este destino e escolha **Verify location**. Sucesso significa que o servidor DRM-X pode listar o bucket. Não estabelece permissão de gravação, navegador CORS ou entrega pública. - Selecione **Upload encrypted files** e escolha um pequeno segmento criptografado de um pacote DRM-X existente. Se você não possui um pacote, use o diagnóstico criptografado descartável abaixo. Não carregue um vídeo original ou documento pessoal. - Aguarde a mensagem de sucesso. Verifique se o nome e o tamanho do arquivo aparecem em Cloud Storage. Encontre o mesmo objeto em `protected/` no console do seu provedor. - Clique em **Preview URL** e teste o mesmo objeto em uma janela privada do navegador. Deve baixar ou retornar HTTP 200 sem um login AWS ou Cloudflare. Teste um objeto real: a raiz de um domínio pode retornar 403/404 mesmo quando a entrega do objeto funciona. - Verifique a entrega de origem cruzada no site do seu player. O painel Rede do navegador deve mostrar `Access-Control-Allow-Origin` correspondente à origem da página do player. Um download direto da barra de endereço não testa CORS. O exemplo de terminal abaixo também verifica os cabeçalhos. - Remova apenas o objeto de diagnóstico descartável quando terminar. Em seguida, siga o [Desktop Packager guide](https://docs.drm-x.com/pt/packaging/desktop), selecione este destino de armazenamento em Package content e carregue o pacote criptografado completo. O upload manual de um arquivo não registra um Published Content ID. - Teste o arquivo Published resultante em [Universal Playback Lab](https://multi-drm.drm-x.com/pt/player) e no site do seu próprio player. Verifique vídeo, áudio, avanço na linha do tempo e os dispositivos necessários. Um download binário bem-sucedido não é prova de reprodução de DRM. Nenhuma amostra criptografada? Crie um arquivo de teste descartável em Windows Execute isto em Windows PowerShell em uma pasta temporária que você controla. Ele criptografa uma mensagem curta não pessoal com uma chave AES de uso único, mantida apenas na memória. A saída é um diagnóstico de armazenamento, não uma mídia reproduzível; não contém nenhuma chave de conteúdo DRM ou dados do cliente. ``` $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 ``` Carregue `drmx-storage-check.encrypted.bin`, verifique seu tamanho e Preview URL e remova-o do bucket. ``` curl.exe -I -H "Origin: https://www.example.com" "https://media.example.com/protected/sample.encrypted.bin" ``` Substitua ambos os URLs. Espere HTTP 200 e uma origem permitida correspondente ao site do seu player. Para entrega de intervalo, uma solicitação GET com `Range: bytes=0-15` deve retornar HTTP 206 e um cabeçalho Content-Range válido. Preservar tipos de mídia MIME: DASH manifestos usam application/dash+xml, HLS playlists usam application/vnd.apple.mpegurl e arquivos de mídia devem usar seu tipo de mídia apropriado. ## 7. Resolva problemas[#](#troubleshooting) | Resultado | Ação | | --- | --- | | Verify location passa, mas o upload pelo navegador falha | Inspecione o navegador Console e os painéis de rede. Permitir PUT CORS da origem exata Console e Content-Type. Verifique também a conectividade e tente novamente para obter um novo URL pré-assinado. | | O upload retorna 403 | Verifique a permissão de gravação do objeto, escopo do bucket/pasta, endpoint, região, expiração da solicitação e relógio. Não compartilhe URLs de upload assinados. | | Upload bem-sucedido; público URL retorna 403 | Verifique se a entrega pública está habilitada e se o domínio/distribuição concluiu a implantação. | | Público URL retorna 404 | Compare o URL completo com a chave exata do objeto. Verifique as pastas ausentes ou duplicadas e as maiúsculas e minúsculas do nome do arquivo. | | URL abre diretamente; busca do player falha | Adicione a origem da página do player a GET/HEAD CORS. Verifique os cabeçalhos de resposta CDN e invalide as respostas obsoletas afetadas em cache. | | Download bem-sucedido; a reprodução falha | Verifique a publicação do pacote, caminhos de manifesto, tipos MIME e autorização de licença DRM. Consulte [solução de problemas de reprodução](https://docs.drm-x.com/pt/troubleshooting/playback). | ## Referências oficiais[#](#references) - [Crie um bucket R2](https://developers.cloudflare.com/r2/buckets/create-buckets/) - [R2 credenciais e permissões](https://developers.cloudflare.com/r2/api/tokens/) - [Domínios personalizados e r2.dev](https://developers.cloudflare.com/r2/buckets/public-buckets/) - [R2 CORS e comportamento do cache](https://developers.cloudflare.com/r2/buckets/cors/) Usando AWS? Siga [Amazon S3 e CloudFront configuração](https://docs.drm-x.com/pt/storage/amazon-s3).