本地把 classic 跑起来:Bun、Docker 与四条命令

2026-08-09

先把状态说在前面,否则后面每一条命令都会跑错地方。

本文描述的是 OpenCut 旧版(classic)的行为。该代码库已归档、不再维护,opencut.app 线上目前仍运行该版本;重写版正在开发中,功能与操作可能变化。核对日 2026-08-09。

一、你要 clone 的是哪个仓库

OpenCut 现在有两个仓库,名字很像,状态完全相反。

主仓(重写版)classic(旧版)
仓库OpenCut-app/OpenCutOpenCut-app/opencut-classic
star(2026-08-09 快照)81917213
最后推送2026-08-052026-05-17
归档状态

star 差了两个数量级,很容易让人直接奔着主仓去。但主仓 README 的 Status 段第一句就写着 OpenCut is being rewritten from the ground up(OpenCut 正在被从头重写),紧接着说旧版本仍在 opencut-app/opencut-classic那才是今天该用的那个,并且 opencut.app 线上跑的仍然是 classic;重写版会先住在 new.opencut.app,直到它准备好接管。

所以本篇讲的所有命令都属于 classic 这个已归档的仓库。主仓 README 里「即将到来」的那六条——Editor API、一等公民的第三方插件、桌面/移动/浏览器共用一套 Rust 核心代码库、面向 AI agent 的 MCP server、无头模式(自动化与批量渲染)、编辑器内置的脚本标签页——是官方声明的计划,我们在主仓里没有见到可用实现,别拿它们当成 classic 现在能做的事,也别反过来把 classic 的行为说成重写版的能力。

归档的含义也说清楚:仓库不再接受提交与 issue,代码仍是 MIT 许可,仍可 fork 自行维护,线上服务按 README 原文仍在运行该版本。至于「所以还能不能用」「官方哪天迁移」这类问题,README 只说「直到它准备好」,没有给时间表,我们也没有任何额外信息可以补。

二、前置与四条命令

classic README 列的前置只有两项:Bun,以及 Docker 与 Docker Compose。README 明确注明 Docker 是可选但推荐的,用来跑本地数据库与 Redis;如果你只打算改前端,这一步可以跳过。

环境变量文件的复制在两个平台上写法不同,README 各给了一条:

# Unix / Linux / macOS
cp apps/web/.env.example apps/web/.env.local
# Windows PowerShell
Copy-Item apps/web/.env.example apps/web/.env.local

然后是主流程的四条命令(前两条来自 README 的编号步骤,第一条是 fork 并 clone 仓库):

# 1. fork 并 clone 仓库
# 2. 复制环境变量文件(见上,按平台二选一)

# 3. 起数据库与 Redis
docker compose up -d db redis serverless-redis-http

# 4. 装依赖并起开发服务
bun install
bun dev:web

应用起来之后在 **http://localhost:3000**。

几个选项为什么长这样,值得说一句。docker compose up -d 后面显式跟了三个服务名 dbredisserverless-redis-http,而不是裸跑 docker compose up,意思是只拉起这三个依赖,不把 compose 文件里其余东西一并带起来;-d 让它们进后台,好把终端腾出来给 bun dev:web。第三个服务名 serverless-redis-http 看起来多余,但 classic 的 web 依赖里有 @upstash/redis@upstash/ratelimit 这类走 HTTP 协议访问 Redis 的库,本地要有一层 HTTP 端才对得上——这是从依赖清单推出来的用途方向,具体接线以仓库里的 compose 文件为准。

README 特意说明:.env.example 里的默认值与 Docker Compose 的配置是对应的,所以照上面复制完就能直接用,不需要先手工填一遍连接串。这条对新手很关键,很多人卡在这里是因为习惯性地去改 .env.local,改完反而和容器对不上了。

三、产出物长什么样

只说有依据的部分,别指望我描述界面——我们没有编译或运行过任何版本的 OpenCut。

  • 第 2 步会在 apps/web/ 下多出一个 .env.local 文件,内容是 .env.example 的副本。
  • 第 3 步会有三个后台容器在跑:dbredisserverless-redis-http
  • 第 4 步 bun installapps/web/package.json 装依赖,这份清单有 60 个 dependencies,里面包括框架层的 next / react / react-dom、状态层的 zustand、一堆 @radix-ui/react-*,以及三个体量更大的:mediabunnyopencut-wasm@huggingface/transformers。这一步要装的东西不少,具体耗时以你自己机器与网络的实际情况为准。
  • bun dev:web 起的是 web 开发服务,落点是 http://localhost:3000

具体输出的日志行、进度条文案、终端提示,我一句都不写——那些只能以你自己终端里的实际输出为准。

顺带解释一下为什么依赖会这么重。classic 的仓库结构是:apps/web/ 是 Next.js 应用,apps/desktop/ 是用 GPUI 构建的原生桌面应用(README 标注 in progress),rust/ 是平台无关的核心,包含 GPU 合成器、特效、蒙版与 WASM 绑定,README 原文说他们正在把业务逻辑从 TypeScript 迁移过来。rust/crates/ 下共六个 crate:bridgecompositoreffectsgpumaskstime,另有 rust/wasm/,发布为 npm 包 opencut-wasm——这就是你在依赖列表里看到的那一项。README 给的三条「Why」中第一条是 Privacy(视频留在你自己设备上),这属于项目方的自述立场;从依赖构成看,mediabunnyopencut-wasm 确实指向媒体与渲染的重活放在浏览器本地做,@huggingface/transformers 指向浏览器里跑模型。但这些都是从包名推断的用途方向,不代表任何具体功能表现。

四、怎么验收,哪一步最容易出错

按顺序检查四处,出问题基本都在这四处:

  1. 仓库对不对。 打开 README 第一行,classic 的开头是 # OpenCut (Legacy),下面写着 It’s archived and no longer maintained。看到这句说明你 clone 对了。如果你看到的是 Status 段落里那句「正在被从头重写」,那你在主仓,本文这套命令不适用。
  2. .env.local 在不在。 检查 apps/web/.env.local 是否存在。Windows 用户尤其注意别用 cp——PowerShell 里对应的是 Copy-Item
  3. 三个容器在不在。docker compose psdbredisserverless-redis-http 是否都在运行。如果你跳过了 Docker(README 允许只做前端时跳过),那么后续凡是碰数据库与限流的路径都不该指望它工作,遇到相关报错先想想是不是这一步省了。
  4. 端口通不通。 浏览器打开 http://localhost:3000——这是 README 给的落点。3000 也是 Next.js 项目的常见端口,起不来时先确认本机是不是已经有别的服务占着它。

最容易踩空的其实是第 1 步和第 2 步:一个是仓库拿错,一个是平台命令拿错。这两处都不是命令本身报错,而是前提条件没成立——错误会攒到后面某一步才暴露出来,所以值得在开跑之前先把这两处确认掉,比事后回溯省事。

五、桌面端与 WASM:两条 opt-in 分支

README 把这两块都标成可选,只做 web 的话完全不用碰。

桌面端:要动 apps/desktop 就去看 apps/desktop/README.md,那边是两步走——先装 Rust 工具链,再装桌面原生依赖。注意 README 自己给 apps/desktop/ 标的是 in progress。

本地 WASM 开发:只有当你在改 rust/wasm、并且希望 web 端用你自己的本地构建时才需要。一次性前置:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh   # Rust 工具链
cargo install wasm-pack                                          # 构建 WASM 包
cargo install cargo-watch                                        # 供 bun dev:wasm 监听文件变化

然后是四步链接流程:

bun run build:wasm                      # 1. 从仓库根构建一次
cd rust/wasm/pkg && bun link            # 2. 注册生成的包
cd apps/web && bun link opencut-wasm    # 3. 把 apps/web 链到本地包
bun dev:wasm                            # 4. 改动时重新构建

第 2、3 步是一对,bun link 先在生成的包目录里注册,再在 apps/web 里链过去,少一步则 web 用的还是 npm 上那个 opencut-wasm,你改的 Rust 代码不会生效。cargo-watch 装它的唯一理由就是让 bun dev:wasm 能监听文件变化。

六、什么情况不适用

  • 你想跟进重写版。 主仓的启动方式、端口与目录结构都和 classic 是两套,别把这里的命令套过去。主仓 README 还写了 We’re not set up to take outside contributions yet while the architecture is being designed(架构还在设计中,尚未准备好接受外部贡献),想参与的人先别急着提 PR,走 issue 或它给的 Discord 更合适。
  • 你要的是一个长期稳定、有人维护的上游。 classic 已归档,不再接受提交与 issue。fork 自行维护是 MIT 许可下的一条路,但那意味着后续问题由你自己扛。
  • 你要评估「能不能上生产」。 这篇只覆盖本地起服务的路径,不涉及部署、鉴权、数据备份,也不涉及任何性能与稳定性判断——这些我们没有依据。
  • 你想照着这篇写一篇「操作教程」。 界面长什么样、点哪里、导出多快,本文一律没有,因为我们没有运行过。

延伸阅读


本文依据 OpenCut 官方仓库(github.com/OpenCut-app/OpenCut 与已归档的 github.com/OpenCut-app/opencut-classic)的 README、docs/ 架构文档、package.jsonCargo.tomlchangelog/ 整理,核对日 2026-08-09。本文内容为仓库源码与文档口径,我们没有编译或运行过任何版本的 OpenCut。

本文描述的是 OpenCut 旧版(classic)的行为。该代码库已归档、不再维护,opencut.app 线上目前仍运行该版本;重写版正在开发中,功能与操作可能变化。

许可条款请以官方 LICENSE 原文为准,本文不构成法律意见。

想系统学会用 AI?报名体系课或加入会员,照着学、照着用。