一个面向个人/小团队场景的轻量部署系统。
把拉代码、构建、复制产物、查看日志、回滚版本这些重复操作沉淀成可配置的项目、模板、主机与流水线。
AI 时代把个人开发和小团队协作的节奏明显拉快了。现在一个人用 AI 在一两天里就能快速迭代出一个可用项目,比如 Deploy Bot 自己,以及 Data Space 这类站点或服务。
但真正把项目上线时,很多团队面对的仍然是两种不太理想的选择:
- 继续手工执行拉代码、构建、复制产物、启动服务、回滚版本这些重复动作
- 或者接入 Jenkins 这类更偏平台化、商业化、配置复杂度也更高的系统
对于个人开发者和小团队来说,这两种方式都不够轻。很多时候,我们需要的不是一个“大而全”的交付平台,而是一个能快速接住 Java 服务、前端站点、简单全栈项目的轻量部署工具:界面清晰、配置直接、几分钟能配好、一条流水线就能完成部署。
Deploy Bot 想解决的就是这类问题:让“有点子就快速做出来,并且快速上线”这件事更顺一些。项目更偏向“轻量、快速、够用、可继续演进的部署平台骨架”,而不是只做一个脚本执行器,也不是要走成重型交付平台。
后续它也适合继续往 AI 方向演进,但方式仍然会保持轻量。例如:
- 对外提供 MCP 服务,让 AI 能直接读取平台里的项目、模板、主机、环境和流水线信息
- 或让平台自身接入 AI,自动拉取 Git 仓库、扫描项目结构、识别技术栈并推荐合适的模板
- 在现有模板不满足时,自动抽取变量、生成新模板并创建对应流水线
- 最终把部署体验收敛到更接近“只输入 Git 地址,就能快速完成上线准备”
当前已经覆盖这些核心能力:
- 项目管理:维护仓库地址、认证方式与基础描述
- 主机管理:统一管理本机与 SSH 远程主机
- 运行环境管理:按主机维护 Java、Node、Maven 等环境
- 预置环境安装:支持一键下载安装常用 Java / Node / Maven,并在界面中跟踪后台安装任务
- 预置环境版本:内置常见 Java / Node / Maven 版本,覆盖 Java 8 / 11 / 17 与 Node 22 / 24 等常见组合
- 模板管理:支持构建脚本、发布脚本、变量提取与模板类型
- 流水线管理:绑定项目、模板、目标主机、默认变量与自定义标签
- 部署执行:支持本机构建、远程发布、停止任务、查看实时日志
- 部署快照:部署记录会固化关键变量、环境与运行配置,方便回看历史失败原因
- 服务管理:对可监控进程进行启停、心跳刷新和活跃时间展示
- 通知能力:支持 Webhook 配置、通知模板、通知配置绑定与通知记录查询
- 版本重发:保留历史构建产物,支持按部署记录重新发布某个历史版本
- 用户体系:提供真实登录态、管理员 / 普通用户角色和默认管理员账号
- 用户资料:支持头像上传、显示名称展示、修改密码与管理员重置密码
- 管理端 / 用户端分离:管理端负责配置,用户端负责部署和排查,但部署记录全员可见
- Java 17
- Spring Boot 3
- Spring Data JPA
- H2 Database
- React
- TypeScript
- Vite
- Tailwind CSS
- Ant Design
backend/ Spring Boot 后端服务
frontend/ React + TypeScript 前端应用
runtime/ 本地运行时数据库、脚本、日志、备份目录
scripts/ 一次性维护脚本或迁移脚本
Project:一个可部署项目,包含 Git 地址与认证方式Host:部署目标主机,本机和 SSH 远程主机统一抽象成主机RuntimeEnvironment:归属于主机的 Java / Node / Maven 等环境Template:部署模板,定义构建脚本、发布脚本和变量Pipeline:可直接触发的部署流水线Deployment:一次具体的部署执行记录Service:由部署产生并可被系统管理的服务进程User:登录系统的真实账号,负责区分管理员与普通用户
当前推荐使用“两阶段执行”模型:
- 在本机完成代码拉取与构建
- 将构建产物同步到目标主机
- 在目标主机执行发布脚本
这样目标主机通常只需要:
- 能接收文件
- 能执行发布命令
- 能运行最终产物
而 git / node / maven 等构建依赖可以集中维护在部署平台所在机器。
当模板开启进程监测时,系统会在发布后接管服务进程:
- 自动检测服务 PID
- 进入启动观察窗口,判断服务是否真正稳定启动
- 将进程登记到服务管理中,供后续查看状态、停止、重启
控制台项目管理主机管理模板管理流水线管理用户管理部署记录服务管理通知系统设置
控制台流水线大厅部署记录通知记录部署详情
cd backend
mvn spring-boot:run默认端口:8080
H2 控制台:
http://<backend-host>:<backend-port>/h2-console
JDBC URL:
jdbc:h2:file:./runtime/deploy-bot-db
cd frontend
npm install
npm run dev默认端口:5173
- 管理端:
http://<frontend-host>:<frontend-port>/admin - 用户端:
http://<frontend-host>:<frontend-port>/user - 登录页:
http://<frontend-host>:<frontend-port>/login
空库首次启动后,会自动创建默认管理员账号:
- 用户名:
admin - 密码:
Admin@123456
用户管理中的“新建用户”和“重置密码”会使用系统默认密码。默认配置为:
deploybot:
user:
default-password: 12345项目启动后会自动初始化一组常用模板:
- Spring Boot Jar 部署
- React 静态站点部署
- Vue 静态站点部署
- Spring Boot 前后端一体部署
项目、主机、运行环境、流水线等业务数据仍然保持空库启动。
默认模板来自后端资源文件 default-templates.json,不依赖 runtime/ 目录中的任何运行时数据。
其中默认的 Spring Boot / React / Vue 模板已经按“保留产物、可重复发布”的思路整理。
curl -X POST http://<backend-host>:<backend-port>/api/projects \
-H 'Content-Type: application/json' \
-d '{
"name": "<project-name>",
"description": "<project-description>",
"gitUrl": "<git-url>"
}'curl -X POST http://<backend-host>:<backend-port>/api/templates \
-H 'Content-Type: application/json' \
-d '{
"name": "<template-name>",
"description": "<template-description>",
"templateType": "vue",
"variablesSchema": "[]",
"buildScriptContent": "#!/usr/bin/env bash\nset -e\nset -x\n<build-script>",
"deployScriptContent": "#!/usr/bin/env bash\nset -e\nset -x\n<deploy-script>"
}'curl -X POST http://<backend-host>:<backend-port>/api/pipelines \
-H 'Content-Type: application/json' \
-d '{
"name": "<pipeline-name>",
"description": "<pipeline-description>",
"projectId": <project-id>,
"templateId": <template-id>,
"targetHostId": <host-id>,
"defaultBranch": "<branch>",
"variablesJson": "{}",
"tagsJson": "[\"test\",\"frontend\"]"
}'curl -X POST http://<backend-host>:<backend-port>/api/projects/test-connection \
-H 'Content-Type: application/json' \
-d '{
"name": "<project-name>",
"description": "<project-description>",
"gitUrl": "<git-url>",
"gitAuthType": "SSH"
}'模板脚本支持 {{variableName}} 占位符。
系统会自动注入一部分内置变量,例如:
deploymentIdbranchgitUrlprojectNamepipelineNamebuildWorkspaceRootdeployWorkspaceRootartifactDir
你也可以继续通过模板变量定义和流水线默认变量补充业务字段,比如:
targetDirdistDirbuildCommandstartCommand
对于 Spring Boot 场景,流水线还支持这些运行时配置:
applicationName:生成唯一的 jar / log 名称,避免所有项目都落成app.jarspringProfile:自动追加--spring.profiles.active=...runtimeConfigYaml:发布时写入额外 YAML,并通过--spring.config.additional-location=...注入
通知模板支持这些常用内置变量:
pipelineName:流水线名称projectName:项目名称branch:部署分支eventLabel:通知事件名称,例如“开始通知”“结束通知”statusLabel:部署状态名称,例如“成功”“失败”“已停止”triggeredByDisplayName:触发人显示名称stoppedByDisplayName:停止人显示名称hostName:目标主机名称startedAt:开始时间finishedAt:结束时间duration:耗时errorMessage:错误信息deploymentId:部署编号detailUrl:部署详情链接
- 所有
/api/**接口现在都需要真实登录态 - 管理员可以访问管理端全部页面与配置接口
- 普通用户可以进入用户端、触发部署、查看全量部署记录与执行日志
- 停止部署、重新发布历史版本等高风险动作仍然保留权限边界
另外,用户端控制台和流水线大厅中的“最近部署”摘要会按当前登录用户统计,不会混入其他人的最近操作。
后端会自动拦截未登录请求,并返回统一的 code / subCode / message / subMessage 错误结构。
- 项目支持
NONE / BASIC / SSH三种 Git 认证方式 - 内置了“测试连通性”能力,可以直接校验仓库是否可访问
- 连通性测试会返回更明确的 Git / SSH 诊断结果,便于快速定位是分支、密钥还是网络问题
- 针对老版本 Git(例如 CentOS 7 自带的
git 1.8.x),系统已兼容GIT_SSHwrapper 方案,不依赖GIT_SSH_COMMAND - 系统设置中的 Git SSH 密钥会持久化保存,不会在保存其他配置时被误清空
- 主机 SSH 与 Git SSH 密钥分离管理,便于分别授权远程主机和代码仓库
- 系统设置中集中维护
Webhook 配置和通知模板 - 通知页负责维护
通知配置与通知记录 - 当前已支持飞书自定义机器人通知
- 通知配置会绑定:
通知渠道类型通知类型Webhook 配置通知模板
- 流水线只绑定通知配置,不重复填写 Webhook 地址和密钥
- 通知记录会保存每次发送的成功/失败状态,以及失败原因或响应信息
- 默认开始/结束通知模板已内置部署详情链接变量,可直接跳转回系统查看部署详情
- 优先让模板保持“职责单一”,不要把完全不同的部署模型揉进同一套脚本
- 对危险目录做额外保护,尤其是带
--delete的同步命令 - 生产场景建议补齐认证、权限、并发控制和执行隔离
- 推荐使用 SSH 密钥而不是在仓库或主机配置里长期保存明文密码
公开仓库前请确认这些内容不会进入版本库:
runtime/这里应只保存本地运行时数据库、日志、渲染脚本和备份,不应该承载需要随源码发布的初始化数据.idea/- 本地数据库文件
- 真实部署日志
- 带内网地址的运行脚本
- WebSocket / SSE 实时日志推送
- 远程主机环境自动安装与探测增强
- 更细粒度的模板测试与变量校验
- 部署队列、并发限制与审批流
- 更完整的审计日志与操作追踪
MIT