这份文档面向从 GitHub clone 本项目后,准备在本地或自有机器上部署、调试、使用 Paper2Any 的开发者与使用者。
目标不是讲“理论上怎么部署”,而是把当前仓库里真实存在的启动链路、配置文件职责、环境边界、功能依赖和常见坑一次讲清楚。
Paper2Any 不是“clone 后执行一个命令就能完整运行全部工作流”的单体项目。当前仓库至少涉及下面几层运行时:
| 层 | 运行时 | 主要目录 | 作用 |
|---|---|---|---|
| 前端 | Node.js / npm | frontend-workflow/ |
Web UI,开发态默认用 Vite |
| 后端 | Python | fastapi_app/ |
FastAPI API 层,挂接全部 workflow |
| 模型服务 | Python | script/ + dataflow_agent/toolkits/model_servers/ |
SAM3、OCR 等本地模型服务 |
| 第三方服务 | 外部 API | .env 中配置 |
LLM、DashScope、MinerU、Supabase 等 |
直接说最重要的几个事实:
- 前端和后端不是一个环境。
- 模型服务通常也是 Python,但可以和后端共用,也可以按功能拆成单独 Python。
- 配置文件不是只有一个
.env,而是分成三类:fastapi_app/.envfrontend-workflow/.envdeploy/profiles/*.env
docker-compose up能拉起前后端容器,但不等于所有 workflow 都能完整可用。- 如果你只想先把系统跑起来,先做“远端 API + 本地前后端”的最小方案,不要一开始就追求本地全链路。
项目推荐的一键启动脚本是:
- Muxi 机器:
bash deploy/start_muxi.sh - NVIDIA 机器:
bash deploy/start_nv.sh
这两个脚本的执行顺序一致:
script/prepare_local_models.shscript/start_model_servers.shdeploy/start.shdeploy/start_frontend.sh
也就是说,完整链路不是“只起前后端”,而是先准备本地模型目录,再起模型服务,再起后端,再起前端。
后端启动入口是 fastapi_app/main.py。
关键点:
fastapi_app/.env会在应用启动时被自动加载,不需要额外export- 后端统一监听在
deploy/app_config.sh里的APP_PORT,默认8000 - 所有 workflow 路由挂在
/api/v1/* - 生成结果目录通过
/outputs暴露静态文件
健康检查地址:
http://127.0.0.1:8000/health
前端开发态默认使用 Vite:
- 启动命令来自
frontend-workflow/package.json的npm run dev - 默认端口是
3000 - 在本地 dev 模式下,
vite.config.ts会把/api和/outputs代理到http://localhost:8000
这意味着:
- 本地
npm run dev时,VITE_API_BASE_URL通常留空即可 - 如果你以后改成静态构建或跨域部署,就必须显式配置
VITE_API_BASE_URL
不一定。
项目当前设计是:
- 后端主进程优先使用
APP_PYTHON - 模型服务优先使用
PAPER2ANY_PYTHON - 若未单独指定,模型服务可以回退到
APP_PYTHON - 个别 workflow 子能力还能进一步拆环境,例如:
PAPER2VIDEO_CURSOR_LOCAL_PYTHONPAPER2VIDEO_LOCAL_TTS_PYTHONPAPER2VIDEO_TALKING_LOCAL_PYTHON
所以推荐理解方式是:
- 前端:单独 Node 环境
- 后端:主 Python 环境
- 模型服务:可共用主 Python,也可拆分
- 某些视频子模块:可以再额外单独建 Python 环境
不要在没有目标的情况下配一堆环境变量。建议先在下面三种路线里选一种。
适合:
- 先验证前后端能通
- 先体验核心页面
- 你准备依赖远端 LLM / OCR / MinerU / Supabase
特点:
- 起前端 + 后端即可
- 本地模型服务不是必选
- 最快上手
适合:
- 有 Linux + GPU 机器
- 需要把依赖尽量落到自己机器上
- 想跑 SAM3、本地 OCR、本地视频子 worker
特点:
- 需要准备模型目录
- 需要配置
deploy/profiles/*.env - 依赖更多,排障成本也更高
适合:
- 想快速容器化 API 和前端页面
- 已经有外部模型服务
- 不打算把 SAM3/OCR 一起塞进
docker-compose
特点:
docker-compose.yml当前只覆盖前后端容器- 不是完整工作流基础设施
当前仓库里的部署脚本以 Bash 为主,最稳的环境是 Linux。
推荐:
- Ubuntu 22.04+
- Debian 12+
- 带 NVIDIA GPU 的 Linux 主机
Windows/macOS 不是当前 deploy/*.sh 的首选目标环境。如果你用的是这些系统,建议先只跑前后端开发态,或自己改写启动脚本。
| 组件 | 推荐 |
|---|---|
| Python | 3.11 |
| Node.js | 20 |
| npm | 与 Node 20 配套版本 |
| Shell | bash |
从当前 Dockerfile 看,项目在 Linux 上常用到这些系统依赖:
sudo apt-get update
sudo apt-get install -y \
build-essential \
curl \
git \
inkscape \
libreoffice \
poppler-utils \
wget \
libgl1 \
libglib2.0-0 \
libgomp1 \
libsm6 \
libxext6 \
libxrender1 \
libsndfile1额外说明:
wkhtmltopdf在Dockerfile里也被安装,和部分导出链路相关LibreOffice常用于 Office/PDF 相关转换Inkscape常用于图形导出
git clone https://github.com/OpenDCAI/Paper2Any.git
cd Paper2Any建议使用 conda 或者独立虚拟环境。推荐 Python 3.11。
conda create -n paper2any python=3.11 -y
conda activate paper2any
pip install --upgrade pip
pip install -r requirements-paper.txt
# NVIDIA GPU 机器再额外安装
pip install -r requirements-cu12.txt如果你需要本地包开发模式:
pip install -e .说明:
requirements-paper.txt已经包含requirements-base.txtrequirements-cu12.txt只用于 NVIDIA Linux + CUDA 12requirements-system-ubuntu.txt列的是系统包,不是 Python 包- 当前部署脚本会检查后端环境里是否至少有这些运行时依赖:
cv2、cairosvg、fastapi、moviepy、supabase、torch、uvicorn
cd frontend-workflow
npm ci
cd ..如果你打算启用视频相关的本地 worker,可能还需要额外准备单独 Python 环境,然后把解释器路径写进 fastapi_app/.env:
PAPER2VIDEO_CURSOR_LOCAL_PYTHONPAPER2VIDEO_LOCAL_TTS_PYTHONPAPER2VIDEO_TALKING_LOCAL_PYTHON
这不是起系统必需条件,只是某些高级功能的隔离运行方式。
当前项目最容易让新用户混乱的点,就是“到底该改哪个 .env”。
请按下面这个分工理解。
| 文件 | 作用 | 典型内容 |
|---|---|---|
fastapi_app/.env |
后端业务配置 | 后端 API key、LLM 网关、Supabase、视频/Drawio/MinerU 业务配置 |
frontend-workflow/.env |
前端默认展示配置 | VITE_* 变量、前端 API key、默认模型和地址 |
deploy/profiles/*.env |
机器部署参数 | Python 路径、端口、GPU、SAM3、本地模型布局 |
logs/model_servers.env |
运行时自动生成 | SAM3 地址、SAM3 路径等,通常不要手改 |
最常见的复制动作是:
cp fastapi_app/.env.example fastapi_app/.env
cp frontend-workflow/.env.example frontend-workflow/.env
cp deploy/profiles/nv.env.example deploy/profiles/nv.env如果你是 Muxi 机器:
cp deploy/profiles/muxi.env.example deploy/profiles/muxi.envfrontend-workflow/.env里的VITE_API_KEY必须和fastapi_app/.env里的BACKEND_API_KEY完全一致。- 不要把第三方业务密钥重复写到
deploy/profiles/*.env。 - 不要手工维护
logs/model_servers.env,它是模型服务脚本自动生成给后端用的。
先把下面这几个概念配对清楚。
这是“前端调用本项目后端”的内部鉴权 key,不是 OpenAI、DashScope、Supabase 的 key。
BACKEND_API_KEY=your-backend-api-key前端必须配置同样的值:
VITE_API_KEY=your-backend-api-key这是项目当前非常关键的运行模式开关。
APP_BILLING_MODE=paid可选值:
paid- 用户在前端页面手动填写业务 API URL / API Key
- 平台默认不扣点
free- 业务模型由后端
.env托管 - 前端很多页面会隐藏手填 API 区域
- 配额/点数由后端 runtime config 控制
- 业务模型由后端
这是通用回退 LLM 网关。
DF_API_URL=https://your-llm-gateway/v1
DF_API_KEY=your-llm-api-key在 free 模式下:
- 如果某个 workflow 没有单独配置
PAPER2*_MANAGED_API_* - 就会回退到这组
DF_*
推荐做法是:你打算开放哪些 workflow,就显式配置哪些 *_MANAGED_API_URL / *_MANAGED_API_KEY。
例如:
PAPER2PPT_MANAGED_API_URL=https://your-llm-gateway/v1
PAPER2PPT_MANAGED_API_KEY=your-paper2ppt-key
PDF2PPT_MANAGED_API_URL=https://your-llm-gateway/v1
PDF2PPT_MANAGED_API_KEY=your-pdf2ppt-key这样做的好处是:
- 配置意图清晰
- 不会所有 workflow 都隐式共用
DF_* - 后续切不同模型网关更容易
Paper2Drawio、Image2Drawio 相关链路通常需要 OCR / VLM 配置:
PAPER2DRAWIO_OCR_API_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
PAPER2DRAWIO_OCR_API_KEY=your_dashscope_keyPDF 解析相关能力常会依赖 MinerU:
MINERU_API_BASE_URL=https://mineru.net/api/v4
MINERU_API_KEY=your_mineru_api_keyPaper2Video 相关配置项很多,文档里不建议一开始全开。通常你只需要先明确自己走哪条链路:
- 云 CosyVoice / LivePortrait
- 本地 cursor worker
- 本地 TTS
- 本地 talking-head
最常见的是先只配云端:
COSYVOICE_KEY=your_cosyvoice_key
LIVEPORTRAIT_KEY=your_liveportrait_key如果你需要下面这些功能,就必须补全 Supabase:
- 登录 / 注册
- 账户页
- 点数 / 邀请码
- 历史文件
- 云端账号级配额
后端至少需要:
SUPABASE_URL=https://your-project-id.supabase.co
SUPABASE_ANON_KEY=your_supabase_anon_key
SUPABASE_SERVICE_ROLE_KEY=your_supabase_service_role_key如果你不配 Supabase:
- 系统依然可以跳过认证门禁做本地测试
- 但账户、登录、历史、邀请码、账号点数这些能力会不完整或不可用
必须和后端一致:
VITE_API_KEY=your-backend-api-key在不同部署模式下含义不同:
- Vite dev 模式:通常留空
- 静态部署 / Nginx / CDN:必须写成完整后端地址
示例:
VITE_API_BASE_URL=http://127.0.0.1:8000这些变量只影响前端默认展示,不一定是最终生效值:
VITE_DEFAULT_LLM_API_URLVITE_LLM_API_URLSVITE_DEFAULT_LLM_MODEL- 各工作流的
VITE_*MODEL*
尤其在 APP_BILLING_MODE=free 时:
- 真正生效的业务 API URL / API Key 在后端
- 前端的这些值更多只是默认展示和 UI 初始值
如果你启用登录:
VITE_SUPABASE_URL=https://your-project.supabase.co
VITE_SUPABASE_ANON_KEY=your-anon-key这是最容易被误填的一类文件。
这里应该放的是:
- Python 路径
- 端口
- GPU 布局
- SAM3 配置
- 本地模型路径
不应该放的是:
DF_API_URLDF_API_KEYSUPABASE_*- 各类业务 API key
APP_HOST=0.0.0.0
APP_PORT=8000
APP_WORKERS=1
APP_PYTHON=/path/to/python
FRONTEND_HOST=0.0.0.0
FRONTEND_PORT=3000
FRONTEND_NPM=/path/to/npm
PAPER2ANY_PYTHON=/path/to/python
SAM3_ENABLED=1
SAM3_GPU_MODE=auto
SAM3_START_PORT=8021APP_PYTHON:后端uvicorn主进程使用PAPER2ANY_PYTHON:模型服务使用
如果你不拆环境,两个都可以指向同一个 Python。
这个脚本的职责是“整理本地模型目录”。
它会做的事:
- 把 legacy 目录里的
sam3.pt/bpe/sam3源码拷到当前仓库标准目录 - 下载
RMBG-2.0
它不会自动帮你下载完整 SAM3 资产。
至少要满足下面这些文件存在:
models/sam3/sam3.pt
models/sam3/bpe_simple_vocab_16e6.txt.gz
models/sam3-official/sam3/
或者你提供一个 legacy 资产根目录给:
PAPER2ANY_ASSET_ROOT=/your/asset/root然后由 prepare_local_models.sh 复制到仓库标准目录。
这个脚本会按 profile 配置启动:
- SAM3 服务
- OCR 服务(如果开启)
并把运行时结果写到:
logs/model_servers.env
这个文件随后会被 deploy/start.sh 自动读取。
如果你满足以下任一条件,可以先不启本地模型服务:
- 你只验证前后端链路
- 你暂时不使用依赖 SAM3 的工作流
- 你已经有外部可达的
SAM3_SERVER_URLS - 你计划把 OCR / MinerU 完全交给远端 API
cp deploy/profiles/nv.env.example deploy/profiles/nv.env
# 编辑 deploy/profiles/nv.env
# 编辑 fastapi_app/.env
# 编辑 frontend-workflow/.env
bash deploy/start_nv.shcp deploy/profiles/muxi.env.example deploy/profiles/muxi.env
bash deploy/start_muxi.sh如果你不想直接跑 one-click,可以分开启动。
set -a
source deploy/profiles/nv.env
set +a
bash deploy/start.sh
bash deploy/start_frontend.sh适合:
- 先看界面
- 只用远端模型服务
- 不需要本地 SAM3
set -a
source deploy/profiles/nv.env
set +a
bash script/prepare_local_models.sh
bash script/start_model_servers.sh
bash deploy/start.sh
bash deploy/start_frontend.sh仓库还提供了单机开发脚本:
bash script/start_local_sam3_dev.sh它会起:
- 单个 SAM3 服务
- 后端
- 前端
更适合本地开发调试,而不是正式部署。
如果你只调前后端代码,不想走部署脚本,也可以直接起:
后端:
uvicorn fastapi_app.main:app --host 0.0.0.0 --port 8000前端:
cd frontend-workflow
npm run dev -- --host 0.0.0.0 --port 3000注意:
- 裸命令模式下,模型服务不会自动启动
- 你自己需要保证
.env和依赖已准备好
curl http://127.0.0.1:8000/health预期返回:
{"status":"ok"}curl -H "X-API-Key: your-backend-api-key" \
http://127.0.0.1:8000/api/v1/account/runtime-config打开:
http://127.0.0.1:3000
如果启用了本地 SAM3,可以检查:
logs/model_servers.env
里面是否写出了 SAM3_SERVER_URLS。
默认访问:
http://127.0.0.1:3000
- 前端很多页面不再要求用户手填业务 API
- workflow 请求会走后端托管模型凭据
- 页面右上角显示配额/点数
- 用户在前端填写业务 API URL / API Key
- 平台默认不扣点
- 后端更像 workflow orchestrator
可以做本地体验,但要有预期:
- 匿名访问通常还能工作
- 后端 runtime-config / guest quota 还能工作
- 登录、账户、邀请码、历史文件、账号积分会不完整
后端日志:
bash deploy/logs.sh app也可以直接看:
logs/app.log
logs/frontend.log
logs/sam3*.log
bash deploy/stop_stack.shbash deploy/stop.sh
bash deploy/stop_frontend.sh
bash script/stop_model_servers.sh项目提供了:
Dockerfile:后端镜像frontend-workflow/Dockerfile:前端静态构建镜像docker-compose.yml:前后端组合
但要注意当前边界:
docker-compose.yml主要是前后端容器编排。- 它不会自动起完整本地 SAM3/OCR 集群。
- 如果你走前端静态构建,
VITE_API_BASE_URL需要在构建时确定。
简单来说:
docker-compose up适合“把 UI + API 包起来”- 不等于“本地全能力工作流平台一键完备”
优先检查:
fastapi_app/.env里的BACKEND_API_KEYfrontend-workflow/.env里的VITE_API_KEY
这两个值必须完全一致。
看你是哪种模式:
- Vite dev 模式:
VITE_API_BASE_URL一般留空,依赖本地代理 - 静态部署模式:必须显式写完整后端地址
优先检查:
APP_PYTHON是否可执行- 当前 Python 是否安装了后端依赖
logs/app.log是否有缺包或导入错误
这是预期内常见问题。
原因通常不是前后端本身,而是:
- SAM3 没起
- OCR 没配
- MinerU 没配
- 视频相关第三方服务没配
先检查:
SUPABASE_URLSUPABASE_ANON_KEYSUPABASE_SERVICE_ROLE_KEYVITE_SUPABASE_URLVITE_SUPABASE_ANON_KEY
如果没配 Supabase,不要把“匿名模式可用”误解成“账号系统也可用”。
先检查这三个路径是否真的存在:
models/sam3/sam3.pt
models/sam3/bpe_simple_vocab_16e6.txt.gz
models/sam3-official/sam3/
prepare_local_models.sh 不会替你下载完整 SAM3。
如果你是新用户,建议按这个顺序读:
- 本页:开源部署与配置总指南
- 快速开始
- 安装与环境准备
- 配置文件参考
- 对应 workflow 的功能指南
如果你只想定位某个工作流的输入输出和页面行为,再去看对应功能文档: