演示站:www.vozeb.com
VOZEB 是一款面向 AI 图片创作、素材管理和视觉方案迭代的开源工作台。它把无限画布、AI 生成、参考图编辑、提示词库、素材沉淀、用户权限、管理员配置和本地 Agent 能力放到同一个工作流里,适合个人创作者、本地部署场景和小团队内部使用。
VOZEB 当前版本为 v1.0.0,这是基于原创开源画布项目继续开发的二开版本。感谢原创作者 basketikun 对无限画布、AI 创作工作流、Canvas Agent 和 Codex 插件能力的开源贡献。
版本更新记录请查看 GitHub Releases。
Caution
项目仍处于快速开发阶段,不保证历史数据兼容。当前更适合个人或本地部署,不建议直接公网多人共用。
- 无限画布:多画布项目、节点拖拽缩放、连线、小地图、撤销重做、导入导出。
- AI 图片创作:支持文生图、图生图、参考图编辑、图片反推提示词、图片切图、局部蒙版修改和图片放大;图片工作台支持按生成记录保留结果、同记录追加生成、失败重试、任务轮询续取、结果勾选删除、丢失图片清理、记录标题重命名、图片三层兜底访问、异步
task_id生图接口兼容和每用户并发生成上限。 - 音频与视频:支持音频节点、视频生成、声音/水印配置,以及图片、视频、音频参考输入;视频工作台支持按用户并发上限同时生成多条记录、保留轮询状态、失败重试复用当前记录、兼容
/video/generations异步视频协议,并支持视频结果三层兜底访问。 - 画布助手:围绕选中节点和上游节点对话、生图,并把结果插回当前画布。
- 提示词库:支持公共提示词库、我的提示词、标签、分类、封面和提示词素材沉淀;管理员公共提示词会采集原作者接入的远程提示词源,并只保留可访问的远程图片 URL。后台公共提示词管理支持分页搜索、多选和批量删除,手机端会使用卡片布局避免表格溢出。
- 素材管理:支持图片、文本、视频等素材保存、复用、导入导出和由管理员后台统一接入的 WebDAV 同步。
- 用户系统:支持账号密码注册登录、邮箱注册开关、SMTP 邮箱服务配置、管理员后台、用户角色、账号状态、积分余额和签到奖励。
- 积分与公告:支持签到、积分流水、前端 CDK 兑换入口、后台随机生成 CDK、复制导出、兑换明细和密钥删除;网站公告支持公告列表、首页弹窗提醒和登录后弹窗提醒。
- 管理后台:支持用户、网站、系统接口、提示词库、CDK、网站公告、数据备份导入、生成日志和生成资源管理;生成日志可查看所有用户的图片/视频记录、提示词、入口来源、模型、状态、耗时、结果预览、API 远程地址和服务器兜底地址,并支持搜索、日期筛选、全选与删除;生成资源可统计本地预览占用、丢失引用和未引用文件,并安全清理不再被日志使用的资源。
- 通用接口:管理员可配置 OpenAI 兼容接口、系统模型渠道、默认模型、每用户图片/视频并发上限、图片/视频服务器兜底开关、图片/视频下载保存开关;用户端不再显示接口配置,也不会暴露真实上游 Base URL 或 API Key。
- 本地 Agent:通过本机 Canvas Agent 连接 Codex / Claude Code,让 Agent 通过 MCP 操作当前画布。
- Codex App 插件:提供 Codex app 插件,安装后可自动注册 MCP 并尝试拉起本地 Agent。
- 版本更新:管理员右上角版本入口可查看更新记录,并从
csyqlz/vozeb检查最新版本;普通用户端隐藏 GitHub 和版本入口。
0.5G 到 2G 内存服务器建议使用发布镜像,不在服务器现场构建源码:
git clone https://github.com/csyqlz/vozeb.git
cd vozeb
docker compose pull
docker compose up -d默认 docker-compose.yml 使用 ghcr.io/csyqlz/vozeb:latest,只会拉取预构建镜像并启动容器,不会执行 next build。端口绑定默认使用 VOZEB_BIND_HOST=0.0.0.0,同时兼容 http://服务器IP:3000 直连和域名反向代理。账号、后台设置、签到记录和公共提示词会保存在 vozeb-data 数据卷里。
启动后可先打开 http://服务器IP:3000 检查服务,也可以配置域名反向代理后打开 https://你的域名。第一次注册的账号会自动成为管理员。这个首个管理员账号用于初始化站点,管理员登录后可进入 管理员后台,配置网站标题、Logo、SEO、注册策略、邮箱服务、模型渠道、默认模型、用户积分和公共提示词库。
默认端口会绑定到 0.0.0.0:3000,所以 IP 直连和域名反代都能工作。直连访问时登录 Cookie 会按 HTTP 模式写入;如果通过 HTTPS 反向代理访问,反代需要保留 X-Forwarded-Proto: https,VOZEB 会自动写入安全 Cookie。极少数代理环境判断异常时,可用 VOZEB_COOKIE_SECURE=true 或 VOZEB_COOKIE_SECURE=false 强制 Cookie 模式。
如果 IP 直连无法访问,请先确认云服务器安全组、防火墙和面板防火墙已经放行 TCP 3000 端口,并确认容器正在运行:
docker compose ps
curl -I http://127.0.0.1:3000如果 IP 可以访问但域名无法访问,请确认域名 A/AAAA 记录已经解析到服务器,并用 Nginx、Caddy 或宝塔反向代理到 http://127.0.0.1:3000。反代必须保留 Host、X-Forwarded-Host、X-Forwarded-Proto,否则登录 Cookie 和参考图公网临时地址可能判断错误。使用域名部署时建议复制 .env.example 为 .env 并填写:
NEXT_PUBLIC_SITE_URL=https://你的域名
VOZEB_COOKIE_SECURE=true如果你只想允许域名反代访问,不想暴露 服务器IP:3000,在 .env 里追加:
VOZEB_BIND_HOST=127.0.0.1当前 docker-compose.yml 会把这些 .env 变量传入容器。Nginx 示例:
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}进入 管理员后台 -> 系统设置 -> 模型渠道,填写你的 OpenAI 兼容接口或 Gemini 接口 Base URL、API Key、模型名称,并启用默认渠道。默认渠道由服务端代理请求,用户前端不会看到管理员保存的 API Key。
如果部署后生图、视频或画布生成全部提示 fetch failed,通常是服务器无法访问模型接口,或容器/反向代理无法从服务端回调自己的公网域名。请按下面顺序检查:
# 1. 容器内确认 VOZEB 可以回调自己的站内代理
docker compose exec app sh -lc 'echo $VOZEB_INTERNAL_ORIGIN'
# 2. 默认值建议保持为容器内部地址
VOZEB_INTERNAL_ORIGIN=http://127.0.0.1:3000
# 3. 如果模型接口需要代理,给容器补充代理变量
HTTPS_PROXY=http://127.0.0.1:7890
HTTP_PROXY=http://127.0.0.1:7890
ALL_PROXY=http://127.0.0.1:7890docker-compose.yml 和低内存 compose 已默认写入 VOZEB_INTERNAL_ORIGIN=http://127.0.0.1:3000。如果你的服务不是 3000 端口,请改成实际内部端口。Base URL 请填写模型服务商提供的地址,例如 https://api.example.com/v1;不要填写 VOZEB 自己的访问地址。
OpenAI 兼容上游的图片接口如果先返回 task_id,VOZEB 会继续查询 /images/generations/:task_id,直到成功、失败或超时。视频接口会优先使用原有 /videos 协议;当上游提示路由不存在或不支持时,会自动回退到 /video/generations、/videos/generations 异步任务协议。图片和视频结果如果返回相对地址,会通过当前系统渠道的内部媒体代理访问,避免前端误访问本站路径;如果上游返回公开 HTTP/HTTPS CDN 地址,系统媒体代理也会作为兜底转发,但不同源公开媒体不会携带管理员保存的系统 API Key。通过系统媒体代理缓存本地 base64 时,生成日志仍会保留原始 API 远程结果地址,方便后台核对接口返回来源。视频代理会保留 Range、Content-Range、Accept-Ranges 等头,保证服务器部署后浏览器分段播放稳定。
画布里的图片反推提示词会先把本地缓存图、远程图或系统代理图转成 data:image/...;base64,... 再提交给文本模型。上游支持 /responses 时会优先使用 Responses 输入图协议;不支持时会自动回退到 /chat/completions,刷新页面后仍可通过文本任务轮询继续拿结果,避免服务器部署后反推按钮一直转圈。
进入 管理员后台 -> 系统设置 -> 账号策略 打开“邮箱注册”。再进入同页的“邮箱服务”填写 SMTP:
QQ 邮箱:smtp.qq.com / 465 / SSL 开启
网易邮箱:填写网易提供的 SMTP、端口和授权码
企业邮箱:填写服务商提供的 SMTP、端口、SSL 和授权码
保存前可以点击“测试邮箱”。测试成功后,普通用户注册必须获取 6 位邮箱验证码;未验证邮箱不能直接创建账号。忘记密码和修改绑定邮箱也会复用这套 SMTP。
普通用户和管理员都可以从右上角账号菜单进入 个人资料,修改昵称、绑定邮箱和登录密码。管理员可在后台 用户管理 中修改用户昵称、邮箱、角色、状态、积分余额,必要时重置用户密码或删除用户。系统会阻止删除当前管理员和最后一个管理员,避免后台被锁死。
如果管理员还能登录后台,建议直接在 管理员后台 -> 用户管理 里重置密码。如果所有管理员都忘记密码,可以在服务器终端使用离线脚本修改 .data/auth.json 中指定管理员的密码哈希。脚本必须明确指定 --username、--email 或 --id,不会自动选择账号;写入前会先备份当前账号数据库到 .data/restore-backups,密码重置备份只保留最近 3 份,避免长期占用空间;脚本不会删除用户、提示词、生成日志或素材。
本地源码部署时,在 web 目录执行:
cd web
pnpm run reset:admin-password -- --username admin --password "NewPass123!"Docker Compose 部署时,在项目根目录执行:
docker compose exec app node /app/web/scripts/reset-admin-password.mjs --username admin --password "NewPass123!"
docker compose restart app如果忘记管理员用户名,可以先列出管理员账号:
cd web
pnpm run reset:admin-password -- --list-admins
docker compose exec app node /app/web/scripts/reset-admin-password.mjs --list-admins如果使用了自定义数据目录,手动指定数据目录即可:
cd web
pnpm run reset:admin-password -- --data-dir "/path/to/.data" --username admin --password "NewPass123!"命令完成后,用新密码重新登录。旧登录会话会被清理,已经登录的该管理员需要重新登录。
进入 管理员后台 -> 网站设置 -> 首页收尾与社交媒体,可以配置首页底部内容:
版权所有:显示在首页 Footer 左侧
使用条款链接:默认 /terms,也可以填写外部 URL
隐私政策链接:默认 /privacy,也可以填写外部 URL
邮箱联系:默认开启,支持 mailto: 邮箱链接
Telegram:默认开启,可填写频道或联系人链接
X:默认开启,可填写 X 主页链接
Instagram:默认开启,可填写 Instagram 主页链接
每个社交媒体都有单独的显示开关。关闭后首页 Footer 不会显示该入口。
低配服务器更新只需要拉取新镜像并重启:
docker compose pull
docker compose up -d不要执行 docker compose down -v,否则会删除 vozeb-data 数据卷。容器默认使用 VOZEB_DATA_DIR=/app/web/.data,本地 standalone 预览也会自动把数据库放回 web/.data,不会写进 .next/standalone 构建产物。升级前也可以在管理员后台概览点击“备份用户数据库”,下载 .data/auth.json、.data/prompts.json 和 .data/generation-logs.json 留底;需要迁移回新服务器时可用“导入数据库”恢复备份,导入前会自动把当前数据快照保存到 .data/restore-backups,导入快照只保留最近 3 份。生成日志预览资源保存在 .data/generation-assets,随数据卷保留;后台概览可清理未被日志引用的本地预览文件,减少长期占用。
图片工作台、视频工作台和画布里的图片/视频生成都会按同一套结果访问规则处理:
用户端展示顺序:浏览器本地缓存 -> API 远程结果地址 -> 服务器副本
后台日志展示顺序:API 远程结果地址 -> 服务器副本
用户端优先使用浏览器本地缓存,因为它打开最快,也不占用服务器带宽。若用户清理浏览器缓存、换设备或本地缓存丢失,会回退到上游 API 返回的远程结果地址;如果远程地址失效,并且管理员开启了对应类型的“服务器兜底”,才会继续使用 VOZEB 服务器保存的副本。即使远程地址先经过系统渠道媒体代理转发,生成日志也会尽量还原并显示原始 API 远程地址。
管理员后台 系统设置 里图片和视频分别有两个开关:
- 服务器兜底:控制普通用户是否可以把
.data/generation-assets中的服务器副本作为最后兜底访问。关闭后不会立刻删除已有副本,但用户端不再暴露该副本地址。 - 下载保存到服务器:控制新生成结果是否尝试保存服务器副本。关闭后优先只保留本地缓存和远程结果地址,能明显减少服务器磁盘占用。
服务器副本只保存在数据目录 .data/generation-assets,不会写入 .next 构建产物;Docker 部署时会跟随 vozeb-data 数据卷保留。普通用户只能访问自己生成日志引用的服务器副本,管理员可以在后台生成日志和资源统计中查看、删除日志或清理未引用文件。为保护 0.5G 低配服务器,远程结果保存副本时带有大小和超时限制:图片最大 20MB、视频最大 300MB,下载超过 15 秒或文件过大都会自动跳过,不影响本地缓存和远程地址继续展示。
WebDAV 同步与服务器兜底不会互相覆盖。WebDAV 连接信息由管理员后台统一保存和测试,用户端不展示真实 WebDAV 地址、账号或密码;同步对象仍以画布、我的素材、生成记录和本地媒体文件为主,不包含 AI API Key,也不直接同步 .data/generation-assets 服务器副本。如果同时开启 WebDAV 和“下载保存到服务器”,同一结果可能在 WebDAV 与服务器数据卷各保留一份,换来跨设备恢复和服务器兜底两层保障。
VOZEB 的核心工作流围绕无限画布展开。你可以在画布里放置图片、文本、音频、视频和配置节点,通过连线组织上下游关系,用节点工具条进行复制、下载、保存素材、编辑、切图、放大、蒙版局部修改等操作。画布支持多项目管理、导入导出、撤销重做、小地图和快捷键。
项目支持 OpenAI 兼容接口,所有 AI 请求统一经过服务端系统代理,前端只拿到 /api/ai/system/{channelId} 形式的站内地址,不会展示或持久化真实上游 Base URL 与 API Key。支持文本问答、文生图、图生图、参考图编辑、音频生成和视频生成。生图/视频工作台的手机端记录面板会使用底部抽屉滚动展示,生成中的状态不会挤乱记录统计。
公共提示词由管理员后台维护,会出现在用户端提示词库。后台公共提示词管理支持新增、远程封面 URL、分页搜索、多选和批量删除,切换到提示词库时只加载当前页,适合维护大型提示词库。用户也可以维护自己的提示词,把稳定的提示词、参考风格和生成结果沉淀为素材。WebDAV 由管理员后台统一接入,用户端不显示真实连接信息,适合长期积累和同步创作资产。
VOZEB 增加了账号系统和后台管理能力。站点首次注册的账号会自动成为管理员,用于完成初始化配置。管理员可以控制注册是否开放、是否要求邮箱注册,调整用户角色、账号状态、积分余额、签到奖励、系统接口渠道和默认模型。后台采用侧边栏切换布局,概览、系统设置、用户管理、生成日志和公共提示词库分区更清楚,并继续适配手机端管理场景。
管理员还可以在后台“网站设置”中维护前台网站标题、Logo URL、SEO 标题、SEO 描述和关键词,并配置首页“沉淀每一次好结果”展示区。展示区可以随机读取公共提示词库,也可以由后台自定义标题、分类、封面、标签和提示词;随机模式会在首页接近该区域时再加载,避免拖慢首屏。保存后首页、顶部导航、浏览器标题、Open Graph、favicon 和首页展示区会同步读取新的站点信息。
进入 管理员后台 -> 系统设置 -> 账号策略,打开“邮箱注册”后,普通注册页会要求填写邮箱并获取 6 位验证码;验证码通过后才允许创建账号并登录,邮箱也会校验不能重复。
进入 管理员后台 -> 系统设置 -> 邮箱服务 可以配置发信服务。QQ 邮箱默认配置为:
邮箱类型:QQ 邮箱
SMTP 服务器:smtp.qq.com
端口:465
SSL:开启
邮箱账号:你的 QQ 邮箱
授权码 / 密码:QQ 邮箱 SMTP 授权码
发件邮箱:可留空,默认使用邮箱账号
发件名称:VOZEB
网易邮箱、企业邮箱或其他邮箱服务,把 SMTP 服务器、端口、SSL、邮箱账号和授权码改成服务商提供的参数即可。配置完成后可以点击“测试邮箱”,默认发送到发件邮箱,也可以单独填写测试收件邮箱。忘记密码、注册验证码和修改邮箱验证码都会复用这里的 SMTP 配置。
本地 Canvas Agent 可以连接 Codex / Claude Code,让 Agent 通过 MCP 读取和操作当前画布。仓库同时提供 Codex App 插件,安装后会注册 vozeb-canvas MCP,并尝试拉起本地 Agent。部分内部存储 key 仍保留旧名称,以避免破坏已有用户数据和插件兼容性。
- 前端:Next.js、React、TypeScript、Tailwind CSS、Ant Design、Zustand、TanStack Query。
- 存储:浏览器本地存储为主,支持导入导出;WebDAV 由管理员后台统一接入和代理。
- Agent:Canvas Agent、MCP、Codex / Claude Code 本地集成。
- 部署:Vercel 或 Docker。
git clone git@github.com:csyqlz/vozeb.git
cd vozeb/web
pnpm install
pnpm run dev运行后默认端口为 3000,可访问 http://localhost:3000。
首次打开后先注册管理员账号,再进入 管理员后台 -> 系统设置 -> 模型渠道 配置 OpenAI 兼容接口、默认模型、并发上限、积分规则和 WebDAV。用户端右上角不再提供接口配置按钮。
低配服务器(包括 0.5G 内存的小机器)建议只使用发布镜像,服务器不执行 next build,通常只需要拉镜像和启动容器,才能接近 2 分钟内完成部署:
services:
app:
image: ghcr.io/csyqlz/vozeb:latest
container_name: vozeb
ports:
- "${VOZEB_BIND_HOST:-0.0.0.0}:3000:3000"
volumes:
- vozeb-data:/app/web/.data
environment:
NEXT_PUBLIC_SITE_URL: ${NEXT_PUBLIC_SITE_URL:-}
NEXT_PUBLIC_DOC_URL: ${NEXT_PUBLIC_DOC_URL:-}
VOZEB_COOKIE_SECURE: ${VOZEB_COOKIE_SECURE:-}
VOZEB_DATA_DIR: /app/web/.data
VOZEB_INTERNAL_ORIGIN: http://127.0.0.1:3000
restart: unless-stopped
volumes:
vozeb-data:默认 VOZEB_BIND_HOST=0.0.0.0,IP 直连和域名反代都可用。如果只想允许域名反代访问,在 .env 设置 VOZEB_BIND_HOST=127.0.0.1。
本地构建源码的 Compose 写法如下,端口同样使用 VOZEB_BIND_HOST 自动适配:
services:
app:
image: vozeb:local
pull_policy: build
build:
context: .
dockerfile: Dockerfile
container_name: vozeb
ports:
- "${VOZEB_BIND_HOST:-0.0.0.0}:3000:3000"
volumes:
- vozeb-data:/app/web/.data
environment:
NEXT_TELEMETRY_DISABLED: "1"
NEXT_PUBLIC_SITE_URL: ${NEXT_PUBLIC_SITE_URL:-}
NEXT_PUBLIC_DOC_URL: ${NEXT_PUBLIC_DOC_URL:-}
VOZEB_COOKIE_SECURE: ${VOZEB_COOKIE_SECURE:-}
VOZEB_DATA_DIR: /app/web/.data
VOZEB_INTERNAL_ORIGIN: http://127.0.0.1:3000
restart: unless-stopped
volumes:
vozeb-data:账号、后台设置、签到记录和公共提示词会写入容器内 /app/web/.data。使用上面的 Compose 配置升级镜像时,vozeb-data 卷会继续保留这些数据;只有手动执行 docker volume rm 或 docker compose down -v 才会删除。若你之前用的是没有 volume 的旧容器,请先进入旧容器备份 /app/web/.data 再替换镜像。本地 standalone 预览会使用 web/.data,不会把数据库放进会被重建清理的 .next/standalone。
更新到最新镜像:
docker compose pull
docker compose up -d0.5G 服务器不要现场构建源码。Next.js 生产构建需要安装依赖、编译页面、收集页面数据并输出 standalone,内存太小时很容易被系统杀掉。当前 docker-compose.yml 默认使用发布镜像,不会在服务器执行 next build。需要自定义源码时,建议在本机或 GitHub Actions 构建并推送镜像,再让服务器执行 docker compose pull && docker compose up -d。
如果服务器内存只有 0.5G,可以使用低内存 Compose 文件。它同样只拉取 ghcr.io/csyqlz/vozeb:latest 发布镜像,并给运行中的容器加上 512MB 内存限制、NODE_OPTIONS=--max-old-space-size=384 和 UV_THREADPOOL_SIZE=2:
docker compose -f docker-compose.lowmem.yml pull
docker compose -f docker-compose.lowmem.yml up -d低内存机器如仍然运行不稳,再考虑增加 swap;但不要在 0.5G 服务器上执行 docker compose up -d --build。
如果你的机器至少有 2G 内存,并且必须基于当前源码本地构建,再使用下面的命令:
docker compose -f docker-compose.local.yml up -d --build如果使用 New API、One API 或其他 OpenAI 兼容转发服务,请由管理员在后台 系统设置 -> 模型渠道 中填写服务商提供的 Base URL、API Key 和模型名。前端不会通过 URL 参数或右上角弹窗接收用户自定义接口,避免真实上游域名和密钥暴露给普通用户。
Base URL: https://your-api.example.com/v1
API Key: 仅保存在服务端后台配置
模型名: 按上游实际返回或手动填写
保存后,用户端只会看到系统代理模型,实际调用统一走站内 /api/ai/system/{channelId}。
- 快速开始
- 功能介绍
- Render 部署
- Docker 部署
- 第三方 GitHub 提示词仓库
- 画布节点操作手册
- 画布快捷键
- 本地开发
- 画布数据结构
- 本地 Canvas Agent
- Codex app 插件
- 开源协议
- 贡献者协议
- 漏洞提交
- 待办事项
- 待测试
VOZEB 基于原创开源画布项目继续开发。感谢原创作者 basketikun 对无限画布、AI 创作工作流、Canvas Agent 和 Codex 插件能力的开源贡献。
感谢 QQ 大佬 Kitty的猫 对 VOZEB 的持续赞助支持,帮助项目继续维护、测试和迭代。
也感谢 LinuxDO 社区、相关提示词开源仓库、Codex / Claude Code 生态和所有工具链项目提供的灵感与基础设施。
群号:1049777515
本项目继续遵循 GNU Affero General Public License v3.0,见 LICENSE。二次开发、分发或部署时请遵守 AGPL-3.0 协议,并保留原作者与本项目的开源信息。