简体中文 | English
这份文档只保留当前项目实际可用的部署路径,并尽量压缩为最短步骤。
- 后端是 Node.js + Express。
- 前端由 Vite 构建,产物由后端静态托管。
- 任务队列和状态依赖 Redis。
- 实际渲染依赖 Python、ManimCE、LaTeX、
ffmpeg。 - 上游 AI 不再依赖
OPENAI_API_KEY这类单一全局变量,推荐使用MANIMCAT_ROUTE_*,或由前端按请求传customApiConfig。
- 只想本机跑起来:用“本地原生部署”。
- 想减少环境差异:用“Docker Compose”。
- 想部署到 Hugging Face Space:用“Hugging Face Spaces”。
- Node.js 18+
- Redis 7+,默认可通过
localhost:6379访问 - Python 3.11+
- Manim Community Edition 0.19.x
mypy- LaTeX
ffmpeg
git clone https://github.com/Wing900/ManimCat.git
cd ManimCat
cp .env.example .env至少配置一组服务端上游路由:
MANIMCAT_ROUTE_KEYS=demo-key
MANIMCAT_ROUTE_API_URLS=https://api.example.com/v1
MANIMCAT_ROUTE_API_KEYS=sk-example
MANIMCAT_ROUTE_MODELS=gpt-4o-mini常用可选项:
PORT=3000
LOG_LEVEL=info
PROD_SUMMARY_LOG_ONLY=falsenpm install
npm --prefix frontend install
python -m pip install mypy开发模式:
npm run dev生产式启动:
npm run build
npm start说明:
npm run build当前只构建前端。npm start直接用tsx src/server.ts启动后端,不依赖预编译 JS。
- 页面:
http://localhost:3000 - 健康检查:
http://localhost:3000/health
这是最推荐的部署方式,仓库已经内置 Redis、Manim 运行时和 Node 运行时。
如果你已经将镜像推到了 Docker Hub,也可以直接使用 wingflow/manimcat,不必每次都本地 build。
cp .env.production .env至少填写一组上游:
MANIMCAT_ROUTE_KEYS=demo-key
MANIMCAT_ROUTE_API_URLS=https://api.example.com/v1
MANIMCAT_ROUTE_API_KEYS=sk-example
MANIMCAT_ROUTE_MODELS=gpt-4o-mini如需改端口:
PORT=3000
REDIS_PORT=6379docker compose build
docker compose up -d如果改为直接使用已发布镜像,请把 docker-compose.yml 里的 build 段替换为:
image: wingflow/manimcatdocker compose ps- 页面:
http://localhost:3000 - 健康检查:
http://localhost:3000/health
说明:
- Compose 对外暴露
3000。 - 容器内 Redis 服务名固定为
redis。 - Studio 会话工作目录会持久化到
studio-workspace-datavolume,挂载到/app/.studio-workspace。 - 生成图片与上传的参考图会持久化到
image-storagevolume,挂载到/app/public/images。 - 生成的视频会持久化到
video-storagevolume,挂载到/app/public/videos。 - Manim 的媒体缓存与中间渲染文件会持久化到
manim-mediavolume,挂载到/app/media。 - 临时渲染目录会持久化到
manim-tmpvolume,挂载到/app/tmp。
如需检查 volume:
docker volume ls
docker volume inspect manimcat_studio-workspace-data- Space 类型必须选 Docker。
- 运行端口使用
7860。 - 环境变量必须配置在 Space Settings,不是只写进仓库
.env。
当前仓库里的 Dockerfile 已经是 Hugging Face Space 可用版本:
- 基于
manimcommunity/manim:stable - 容器内安装 Node.js、Redis、中文字体、
ffmpeg - 启动命令是
node start-with-redis-hf.cjs - 默认监听
PORT=7860
不需要再额外复制一个 Dockerfile.huggingface,仓库里也没有这个文件。
如果你已经发布了 Docker 镜像,也可以让其他部署环境直接参考 wingflow/manimcat 的内容;但 Hugging Face Space 仍然是基于仓库内 Dockerfile 构建,不是直接拉 Docker Hub 镜像运行。
至少配置:
PORT=7860
NODE_ENV=production
MANIMCAT_ROUTE_KEYS=demo-key
MANIMCAT_ROUTE_API_URLS=https://api.example.com/v1
MANIMCAT_ROUTE_API_KEYS=sk-example
MANIMCAT_ROUTE_MODELS=gpt-4o-mini建议再补上:
LOG_LEVEL=info
PROD_SUMMARY_LOG_ONLY=truegit add .
git commit -m "Deploy ManimCat"
git push部署完成后访问:
- 页面:
https://YOUR_SPACE.hf.space/ - 健康检查:
https://YOUR_SPACE.hf.space/health
推荐使用 MANIMCAT_ROUTE_* 做服务端路由。它同时承担两件事:
- Bearer key 白名单
- key 到上游
apiUrl/apiKey/model的映射
示例:
MANIMCAT_ROUTE_KEYS=user_a,user_b
MANIMCAT_ROUTE_API_URLS=https://api-a.example.com/v1,https://api-b.example.com/v1
MANIMCAT_ROUTE_API_KEYS=sk-a,sk-b
MANIMCAT_ROUTE_MODELS=gpt-4o-mini,gemini-2.5-flash规则:
- 四组变量都支持逗号或换行分隔。
MANIMCAT_ROUTE_KEYS是主索引。apiUrl或apiKey缺失的条目会被跳过。- 如果某一组变量只写了一个值,这个值会复用到全部条目。
model留空时,该 key 仍可认证,但当前没有可用模型。
请求优先级:
- 请求体里的
customApiConfig - 服务端
MANIMCAT_ROUTE_*
如果要给不同用户固定分配不同上游,用服务端路由;如果只是单个浏览器本地切换多个 provider,用前端设置页即可。
项目有两类可选持久化:
- 生成历史:
ENABLE_HISTORY_DB=true - Studio Agent 会话与工作流:
ENABLE_STUDIO_DB=true
公共连接配置:
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_KEY=your-supabase-key先执行迁移:
src/database/migrations/001_create_history.sql
如需渲染失败事件导出,再执行:
src/database/migrations/002_create_render_failure_events.sql
对应变量:
ENABLE_HISTORY_DB=true
ENABLE_RENDER_FAILURE_LOG=true
ADMIN_EXPORT_TOKEN=replace_with_long_random_token导出接口:
GET /api/admin/render-failures/export- 请求头:
x-admin-token
先执行迁移:
src/database/migrations/003_create_studio_agent.sql
再开启:
ENABLE_STUDIO_DB=true优先检查:
MANIMCAT_ROUTE_*是否完整配置- 请求头里是否带了合法 Bearer key
- 当前 key 对应的
model是否为空
优先检查:
- Redis 是否真的启动
REDIS_HOST/REDIS_PORT是否匹配- Docker 部署时后端是否连到了容器内
redis
优先检查:
- Space SDK 是否选了 Docker
- 是否把环境变量写到了 Space Settings
- 是否错误照搬了旧文档里的
Dockerfile.huggingface