Cloudflare Stream 配置完全指南:从环境变量、Wrangler 到签名密钥与 Webhook

发布时间:2026/9/12 17:50:56

Cloudflare Stream 配置完全指南:从环境变量、Wrangler 到签名密钥与 Webhook Cloudflare Stream 配置完全指南从环境变量、Wrangler 到签名密钥与 Webhook【免费下载链接】skillsSkills Catalog for Codex项目地址: https://gitcode.com/GitHub_Trending/skills4/skills本文是 Cloudflare Stream无服务器点播与直播视频平台的配置实战指南聚焦于在 Cloudflare Deploy 技能栈中从零搭建 Stream 项目的安装、环境变量、wrangler 配置、签名密钥、Webhook 以及上传/直播/水印参数配置。读完本文你将掌握如何为基于 Cloudflare Workers/Pages 的视频应用完成 SDK 安装、密钥体系设计与安全配置并能结合仓库中的 Stream 参考文档 快速落地一个生产可用的视频上传与播放服务。概述Stream 配置在整个项目中的位置Cloudflare Stream 提供视频上传、编码、存储与全球分发的一体化能力无需自建转码与 CDN 基础设施。在cloudflare-deploy技能体系中Stream 属于媒体与内容产品线参见 SKILL.md 决策树 中的 Media/Content 分支。官方建议的阅读顺序是先读 configuration.md 完成项目初始化再按需深入 api.md点播 API、api-live.md直播 API、patterns.md全栈流程与 gotchas.md排错。本文对应文档中的第一环——配置。所有配置项都以 Workers 运行时 wrangler 部署为默认前提因为 Stream 的官方 SDK 与签名密钥、Webhook 机制天然服务于边缘函数场景。安装三组核心依赖配置的第一步是安装官方 SDK 与辅助库# 官方 Cloudflare SDKNode.js、Workers、Pages npm install cloudflare # React 组件库内置 Stream Player 封装 npm install cloudflare/stream-react # TUS 断点续传大文件上传 npm install tus-js-client三者的职责边界cloudflare服务端 SDK用于创建直传 URL、管理视频、操作 live inputs。仓库中所有后端示例如 api.md 的 Direct Creator Upload均通过new Cloudflare({ apiToken: env.CF_API_TOKEN })初始化。cloudflare/stream-react前端 React 播放器组件。在 patterns.md 中它的最小用法是Stream controls src{videoId} responsive /配合签名 token 时传入${videoId}?token${token}。tus-js-client面向超过 500MB 的大文件。TUS 协议支持分块默认示例chunkSize: 50MB与断点重试retryDelays: [0, 3000, 5000, 10000, 20000]详见 patterns.md 的 TUS Resumable Upload。前提说明使用 SDK 需要 Node.js 环境或 Workers 运行时支持Workers 原生支持 Web 标准 APISDK 可直接在 Worker 内运行参见 workers 参考。环境变量必填与可选清单# Required CF_ACCOUNT_IDyour-account-id CF_API_TOKENyour-api-token # For signed URLs (high volume) STREAM_KEY_IDyour-key-id STREAM_JWKbase64-encoded-jwk # For webhooks WEBHOOK_SECRETyour-webhook-secret # Customer subdomain (from dashboard) STREAM_CUSTOMER_CODEyour-customer-code变量语义与使用场景变量必填性用途关联 API/功能CF_ACCOUNT_ID必需API 路径前缀accounts/{account_id}以及 SDK 调用中的account_id参数所有上传/直播/管理 APICF_API_TOKEN必需Bearer 鉴权令牌初始化 SDK 与所有curl调用全局STREAM_KEY_ID高流量时自签名 JWT 的kidHeader 声明对应签名密钥的id签名 URL见 patterns.md 的 Self-Sign JWTSTREAM_JWK高流量时base64 编码的 JWK 私钥用于 RS256 签名同上WEBHOOK_SECRET使用 Webhook 时校验Webhook-Signature的 HMAC-SHA256 密钥Webhook 通知见 patterns.md 的 Webhook HandlerSTREAM_CUSTOMER_CODE播放时拼接customer-CODE.cloudflarestream.com子域名用于 iframe 与 HLS/DASH 播放地址播放器见 api.md 的 Playback APIs从源码结构看签名密钥STREAM_KEY_ID/STREAM_JWK只在日签发 token 超过约 1,000 个时才有必要低流量可直接调用POST /stream/{video_id}/token换取签名 URL见 api.md 的 Signed URLs高流量则改为本地 RS256 自签名避免每次请求打 API。Wrangler 配置将变量接入 Worker{ name: stream-worker, main: src/index.ts, compatibility_date: 2025-01-01, // 新项目请使用当前日期 vars: { CF_ACCOUNT_ID: your-account-id } // 敏感值请用 secret 存储 // wrangler secret put CF_API_TOKEN // wrangler secret put STREAM_KEY_ID // wrangler secret put STREAM_JWK // wrangler secret put WEBHOOK_SECRET }要点说明vars放非敏感配置CF_ACCOUNT_ID这类非密钥值可直接写入varsWorker 中通过env.CF_ACCOUNT_ID读取。wrangler secret put放敏感值CF_API_TOKEN、签名密钥与 Webhook 密钥必须走 secrets。仓库的 wrangler 配置参考 强调vars与各类 bindings 属于不可继承字段每个环境需单独定义而name、main、compatibility_date等可被环境继承。若需多环境可在env下按环境覆盖vars并用wrangler deploy --env production部署。compatibility_date用当前日期文档明确建议新项目使用当前日期以启用最新兼容性行为。本地开发配置完成后用npx wrangler dev本地调试用npx wrangler deploy发布命令清单见 workers 参考。签名密钥为高流量自签名令牌而生当日均签发 token 达到数千级别时继续走POST /stream/{video_id}/tokenAPI 会产生不必要的开销与配额压力。此时应一次性创建签名密钥在服务端本地用 RS256 自签名 JWT。创建密钥只需执行一次curl -X POST \ https://api.cloudflare.com/client/v4/accounts/{account_id}/stream/keys \ -H Authorization: Bearer API_TOKEN # 保存响应中的 id 和 jwkbase64 编码存入 secretswrangler secret put STREAM_KEY_ID wrangler secret put STREAM_JWK配合使用从代码结构可以确认STREAM_KEY_ID会作为 JWT Header 的kid声明STREAM_JWK经 base64 解码后由crypto.subtle.importKey(jwk, ..., { name: RSASSA-PKCS1-v1_5, hash: SHA-256 }, false, [sign])导入用于签名完整实现见 patterns.md 的 Self-Sign JWT。该流程可与访问规则结合在 JWT payload 中嵌入accessRules实现地理/IP 限制。Webhooks从轮询到事件推送视频处理完成、状态变更等事件可通过 Webhook 推送到你的 Worker替代低效的轮询patterns.md 的最佳实践 明确建议 Use webhooks over polling。设置 Webhook URLcurl -X PUT \ https://api.cloudflare.com/client/v4/accounts/{account_id}/stream/webhook \ -H Authorization: Bearer API_TOKEN \ -H Content-Type: application/json \ -d {notificationUrl: https://your-worker.workers.dev/webhook} # 保存响应返回的 secret用于签名校验存储 secretwrangler secret put WEBHOOK_SECRET校验流程见 patterns.md 的 Webhook Handler请求头携带Webhook-Signature格式为timets,sig1hmac服务端用WEBHOOK_SECRET对${timestamp}.${body}计算 HMAC-SHA256 并比对sig1同时允许5 分钟的时间戳漂移。校验失败返回 401。需要留意的是按 gotchas.md 的说明Cloudflare 对 Webhook 有最多 5 次指数退避重试、单次超时 30 秒的限制。上传 / 直播 / 水印配置参数// 直传Direct upload配置 const uploadConfig { maxDurationSeconds: 3600, // 视频最大时长秒防止滥用 expiry: new Date(Date.now() 3600000).toISOString(), // 上传 URL 过期时间 requireSignedURLs: true, // 私有内容要求签名 token 才能播放 allowedOrigins: [https://yourdomain.com], // 防盗链白名单 meta: { creator: user-123 } // 自定义元数据 }; // 直播输入Live input配置 const liveConfig { recording: { mode: automatic, timeoutSeconds: 30 }, // 自动录制断流 30s 后停止 deleteRecordingAfterDays: 30 // 录制产物 30 天后自动删除 }; // 水印Watermark配置 const watermark { name: Logo, // 水印名称 opacity: 0.7, // 不透明度 0~1 padding: 20, // 边距像素 position: lowerRight, // 位置如 lowerRight scale: 0.15 // 相对视频尺寸的缩放比例 };参数说明与源码印证maxDurationSeconds直传/直播录制时的时长上限。超出会触发ERR_DURATION_EXCEED_CONSTRAINT错误见 gotchas.md生产环境建议显式设置以控制成本与滥用。recording.mode取值automatic录制全部直播或off不录制timeoutSeconds表示流结束后多少秒停止录制。requireSignedURLs与allowedOrigins同样适用于录制转点播VOD的播放见 api-live.md 的 Recording Settings。allowedOrigins限定可嵌入播放器的域名若遗漏会导致播放器无限加载CORS 问题见 gotchas.md。meta随视频携带的自定义键值对可用于记录创作者、业务标签配合 api.md 的视频管理 中的search检索使用。访问规则与播放器配置// 访问规则放行 US/CA拒绝 CN/RU或使用 IP 白名单 const geoRestrict [ { type: ip.geoip.country, action: allow, country: [US, CA] }, { type: any, action: block } ]; // iframe 播放器参数 const playerParams new URLSearchParams({ autoplay: true, muted: true, preload: auto, defaultTextTrack: en });访问规则Access Rules嵌入在签名 token 的 payload 中按规则顺序先匹配先生效。上例先放行美加地区其余any一律拒绝实现地理限制action同样支持block直接封禁特定国家如 CN/RU。规则类型与签名 token 的完整组装方式见 patterns.md 的自签名 JWT 示例——payload 中直接包含accessRules数组。播放器参数通过URLSearchParams拼接到 iframe 的src上iframe srchttps://customer-CODE.cloudflarestream.com/VIDEO_ID/iframe?autoplaytruemutedtruepreloadautodefaultTextTracken styleborder: none; height720 width1280 allowaccelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture; allowfullscreentrue /iframe其中CODE即STREAM_CUSTOMER_CODE。若需 HLS/DASH 原生流或缩略图地址直接拼接customer-CODE.cloudflarestream.com/VIDEO_ID/manifest/video.m3u8HLS或/manifest/video.mpdDASH见 api.md 的 Playback APIs。完整配置串联一个可落地的初始化顺序综合本文内容生产项目的推荐配置顺序如下npm install cloudflare cloudflare/stream-react tus-js-client在 dashboard 获取CF_ACCOUNT_ID与 API Token写入.dev.vars或 wranglervars/secrets按需curl创建签名密钥高流量并wrangler secret put STREAM_KEY_ID/STREAM_JWKcurl设置 Webhook URL 并保存WEBHOOK_SECRET在wrangler.jsonc中配置name、main、compatibility_date、vars编写 Worker初始化 SDK → 创建直传 URL → 前端上传 → 配置播放器与访问规则。配置完成后可继续阅读 api.md 实现点播上传与播放或 patterns.md 获取直传、TUS、Webhook 校验与自签名 JWT 的完整代码配合 wrangler 配置参考 理解环境与 bindings 的高级用法。【免费下载链接】skillsSkills Catalog for Codex项目地址: https://gitcode.com/GitHub_Trending/skills4/skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/12 17:50:56

目标检测题目推荐

基于Yolov8的坚果检测计数与营养检索系统设计 基于BERT-LSTM的电商商品评论情感分析系统设计与实现 基于TextCNN的社交媒体舆情热点监测与分析系统设计与实现 基于BERT预训练模型的新闻文本智能分类系统设计与实现 基于CNN-LSTM混合模型的垃圾短信智能识别系统设计与实现 基于B…

2026/9/12 17:45:56

C++ 右值引用、移动语义与完美转发:原理剖析

一、先理解左值和右值在深入右值引用之前,必须先理解左值(lvalue)和右值(rvalue)的基本概念。看一个简单例子:int a 10;这里:a 是左值。因为它有名字、有稳定地址,可以反复使用。10…

2026/9/12 18:30:58

研发自给自足:用Canva免费版快速搞定App上架宣传图

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 18:30:58

自动化脚本技术:从基础到企业级应用实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 18:30:58

CMSIS-NN源码尽调:模块划分、构建开关与验证边界全解析

最近在评估一颗Cortex-M33芯片上跑手势识别模型,把TFLite Micro、Glow、CMSIS-NN这几个后端都过了一遍。老实说,网上讲CMSIS-NN怎么调用的文章不少,但真正把源码翻到底、把模块划分逻辑、构建时哪些开关在起作用、官方验证到底卡在哪个边界&a…

2026/9/12 18:30:58

ETC门架机房温湿度精准监控实战方案

1. 为什么ETC门架机房的温湿度问题总在深夜“准时发作”去年冬天,我接手某省高速路网运维支持时,连续三周被凌晨两点的告警电话叫醒。不是设备宕机,不是网络中断,而是同一段G45大广高速上的6个ETC门架机房,温湿度传感器…

2026/9/12 18:25:57

ARM Cortex-M边缘AI唤醒模型源码深度解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 2:05:33

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/12 3:55:12

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/12 10:09:03

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/12 0:04:17

MATLAB仿生优化框架:长鼻浣熊算法多策略融合实现

简介:本资源是一份面向智能优化算法研究者与MATLAB初学者的仿生智能算法实践代码包,聚焦于长鼻浣熊优化算法(COA)的多策略改进与性能验证。针对传统COA易陷局部最优、收敛精度不足等问题,作者融合Circle映射初始化提升…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 JavaWeb 的校园一卡通管理系统的设计与实现 基于 JavaWeb 的校园卡业务管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 Java 的图书馆借阅管理平台的搭建与实现 基于 Java 的图书馆综合管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 6:29:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/12 14:32:17

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/12 6:37:43

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码