用大白话从零开始解释 — 服务器、GitHub、Cloudflare、Pages、Workers、ffmpeg 都是啥, 它们怎么拼成了一个能在全球被访问的网站。
你看《老友记》看了很多遍,某天突然想起来 Joey 那句经典的 "How you doin?", 想找到所有他说这句话的截图。怎么办?
传统办法是把视频从头到尾看一遍。一集 22 分钟,10 季 236 集,你要看 86 个小时。
在搜索框打 "How you doin",网页瞬间显示出所有出现这句台词的截图, 任意点开能看到当集前后所有上下文,还能跳转去 B 站直接看视频。
这个想法不是新的。2016 年有人给《辛普森一家》做过类似网站,叫 Frinkiac。Project Joey 就是老友记版本。
点开任意一张卡片看详细解释。
就是你打开 projectjoey.com 看到的那个搜索框、按钮、图片墙。
专业说法叫"前端",意思是"用户能看到的部分"。
当你在搜索框输入 "coffee",肯定不能让你的浏览器去把 9 万条字幕全翻一遍。 你需要一个程序在某个服务器上,接到你的请求 → 去数据库找匹配的字幕 → 返回结果。
专业说法叫"后端"或"API"。
9 万多条字幕的元数据:每条字幕属于哪一季哪一集、出现在第几秒、英文是什么、中文是什么、对应的截图叫什么文件名。
这些数据存在一个叫"数据库"的东西里,大概 30MB。
9 万张高清截图,每张大概 70KB,加起来约 6GB。这些图片不能塞数据库里(数据库不擅长存大文件), 需要专门的"对象存储"来存,然后通过 URL 访问。
每张图的 URL 长这样:
https://joeyimge.baidou.work/S01E01_137170.webp
意思是:第 1 季第 1 集第 137,170 毫秒的截图。
上面说的"网站"、"后端"、"数据库"、"图片仓库"都不能跑在你自己电脑上 —— 你电脑一关机,网站就挂了,朋友访问不到。它们需要跑在一种叫"服务器"的东西上。
简单说:一台 24 小时不关机、放在某个机房里、专门用来响应请求的电脑。
你刷抖音的时候,字节跳动的服务器在某处响应你;你打开淘宝,阿里的服务器在响应你。
买一台真实服务器很贵(几万块起),还要管电费、网络、散热。 所以现在基本没人自己买,都是租用云服务公司的服务器。Cloudflare 就是这种公司之一。
一个专门用来存代码的云端仓库。
你写的所有代码文件传到 GitHub,会自动:
Project Joey 的代码就在 GitHub 上,
地址 github.com/yuanchaokun/project-joey (private 仓库,需要被邀请才能看)。
一家美国公司,在全球 300 多个城市都有数据中心。
它原本是做"网站加速"的(让你的网站全球访问更快),但是后来扩展成了"全家桶": 从网站托管、到代码运行、到数据库、到文件存储,啥都能干。
对个人开发者最爽的是:大部分服务都有慷慨的免费额度。Project Joey 整套跑下来月成本 $0。
Cloudflare 的"全家桶"里我们用到了 4 个服务: Pages、Workers、D1、R2。下面分别解释。
专门用来托管"静态网站"的服务。
"静态网站"的意思是:网页本身就是几个 HTML/CSS/JS 文件,不需要在服务器上跑什么程序。 用户访问时,Cloudflare 直接把文件发给浏览器就行。
你把网站文件丢到 Pages,它会:
xxx.pages.dev)用来跑后端代码的服务。
当用户搜索 "coffee",浏览器会发一个请求到一个 URL(比如 joeybackendapi.baidou.work/api/search?q=coffee)。
Workers 就是那个接到请求然后跑代码的东西。
它的特别之处:
Cloudflare 的云端数据库。
所有 9 万条字幕的数据存在这里。Workers 接到搜索请求时,就向 D1 发一条 SQL 查询:
SELECT * FROM subtitles WHERE text_en LIKE '%coffee%'
D1 几毫秒返回结果,Workers 把结果包装好发给浏览器。
D1 也是免费的(5GB 存储 + 每天 500 万次查询), Project Joey 数据库才 30MB,完全在免费范围内。
Cloudflare 的云端文件仓库(专业说法叫"对象存储")。
所有 9 万张截图存在这里。每张图都有一个 URL,浏览器直接通过 URL 加载。
R2 的杀手级特点:"出口流量"完全免费。
什么意思?如果你用其他类似服务(比如亚马逊 S3),用户每下载 1GB 图片你就要付一笔钱。 R2 不收这个钱。所以即使有 100 万人来看 Project Joey,你不用为图片流量付一分钱。
一个免费的视频处理工具,几乎能对视频做任何事:
Project Joey 用 ffmpeg 在每条字幕的开始时间截一帧,就有了 9 万张截图。 一行命令就能做:
ffmpeg -ss 137.170 -i S01E01.mp4 -frames:v 1 S01E01_137170.webp
这行命令的意思:打开 S01E01.mp4,跳到第 137.17 秒,截一张图,存成 S01E01_137170.webp。
知道了所有零件之后,看看一次搜索是怎么走完整个流程的。
整个过程通常在 200-500 毫秒内完成。用户感觉就是"输入,瞬间出结果"。
用户在北京访问就由香港节点服务,在纽约访问就由弗吉尼亚节点服务。 这就是为什么响应这么快。
上面说的都是"网站怎么响应用户请求"。但你可能在想:那些数据是从哪冒出来的?
答案是:一个一次性的"数据流水线",在网站上线之前在我自己电脑上跑完的。
整个流水线如果你有完整视频,跑完大概要一个下午到一晚上。
这套流水线的所有脚本都在仓库的 scripts/data-prep/ 文件夹里,
朋友拿到仓库后可以重新跑一遍。
是的。Cloudflare 的免费额度对个人项目来说大得离谱。
真的要付费,需要日活破万。我和朋友自己玩,永远摸不到这个上限。
唯一花钱的地方:域名年费,projectjoey.com 大概 100 块/年。
你也可以用免费域名(xxx.pages.dev)完全 $0 部署。
下面这个搜索框直接调用线上 API。输入任意词或短语,看实际返回的截图。
POST joeybackendapi.baidou.work/api/search
仓库里详细写了三种部署方式,根据你的情况选:
三种方式的详细步骤都在仓库的 SETUP.md。你只需要会:
不需要会写代码 —— 全程跟着教程跑就行。