案例 Backup Center:Laravel + Go Agent 做多机网站备份,存储按 YYYYMMDD 归档

2026-10-18 20:02:23

一台 Center 管多台机器:Backup Center 自托管备份编排

Backup Center 是一套自托管的多服务器备份编排系统:在一台机器上跑 Center,在每台被备份的机器上装 Agent,备份文件统一由 Center 调度上传到远端存储。

  • 项目地址:https://github.com/gongpz/backup-center
  • 在线演示:https://gongpz.github.io/backup-center/dashboard (纯前端 + 模拟数据,不能实际操作系统)

它是怎么工作的

系统分成三块。Center 是控制面,Laravel 12 后端(PHP 8.2+)加 Vue 3 + Element Plus 前端,用 Docker Compose 拉起;Agent 是 Go 1.23+ 写的轻量代理,装在每台被备份的机器上,负责扫描目录并上传;存储端支持 S3 兼容(COS、OSS、R2、MinIO)、SFTP、FTP/FTPS、WebDAV,可以同时挂多个。

备份在存储上按 /YYYYMMDD/ 分目录存放,一个网站一天一个目录,回溯时直接按日期找。某个存储被标记为「强制」后,所有网站都会自动向它推送一份,用来做兜底副本。触发方式有两种:自动检测默认每 2 分钟跑一次,或者定时到每天指定时刻执行。

Agent 注册成 systemd 服务,定期向 Center 心跳上报,扫描、上传、升级这些动作都由 Center 下发。Agent 的远程升级也在网页上完成——点一下,Agent 自己从镜像源拉新二进制替换。Center 本身也能定时打包自备份并上传到远端存储。页脚的版权、ICP 备案、统计代码、联系方式、自定义 HTML 都可以在后台配置。

方式一:一键部署

在一台干净的 KVM / XEN VPS 上,以 root 执行:

curl -fsSL https://raw.githubusercontent.com/gongpz/backup-center/main/install-scripts/bc-install.sh | sudo bash

脚本会交互式询问访问地址、证书方式、端口,然后依次完成:虚拟化兼容检查 → 安装 Docker → 拉取部署包 → 签发证书 → 启动容器 → 配置证书续期钩子 → 冒烟测试。

自动化场景可以跳过交互,直接用环境变量传参:

curl -fsSL https://raw.githubusercontent.com/gongpz/backup-center/main/install-scripts/bc-install.sh | \
BC_ACCESS=bak.example.com BC_EMAIL=you@example.com sudo -E bash

常用环境变量:

变量作用
BC_ACCESS访问地址,域名或 IP
BC_EMAILLet's Encrypt 通知邮箱
BC_HTTP_ONLY=1强制 HTTP-only
BC_HTTP_PORT / BC_HTTPS_PORT自定义端口,LXC 等绑不了 80/443 时用
BC_DEPLOY_URL覆盖部署包下载源
BC_FORCE=1覆盖已有安装

虚拟化兼容性上,OpenVZ 6/7 不支持 Docker,脚本会直接拒绝安装;LXC 如果无法绑定特权端口,脚本会自动切到 8080/8443。

方式二:手动部署

git clone https://github.com/gongpz/backup-center.git
cd backup-center/backup-center

# 后端
cd backend && composer install
cp .env.example .env && php artisan key:generate
php artisan migrate
cd ..

# 前端
cd frontend && npm install && npm run build
cd ..

之后用 deploy/docker-compose.yml 起服务。

部署完成后访问你的地址。系统检测到还没有任何用户时,会引导创建第一个管理员账号(密码至少 8 位),创建后该入口自动关闭。

接入 Agent

在 Center 的「服务器」页面添加一台服务器,复制生成的安装命令,到目标机器上执行:

curl -fsSL https:///agent/install.sh | BC_URL="https://" BC_TOKEN="" sh

BC_URL 指向 Center 地址,BC_TOKEN 是页面生成的令牌。装好后 Agent 以 systemd 服务运行。

项目结构

backup-center/
├── backend/  Laravel 12 后端(PHP 8.2+)
├── frontend/ Vue 3 + Element Plus 前端
├── agent/    Go 备份代理(Go 1.23+)
└── deploy/   docker-compose + nginx 模板
install-scripts/ 一键部署 / 卸载脚本
docs/ 产品与部署文档

开发环境要求 Node.js ≥ 20、PHP ≥ 8.2 + Composer 2、Go ≥ 1.22、Docker 与 Docker Compose。前端开发跑 cd backup-center/frontend && npm run dev,后端跑 cd backup-center/backend && php artisan serve,Agent 本地编译:

cd backup-center/agent && GOOS=linux GOARCH=amd64 go build -o backup-agent ./

构建与发布

一键部署脚本从 GitHub Release 拉 bc-deploy.tar.gz,包内解压到 /opt/bc,包含 backend/(Laravel 源码)、deploy/(docker-compose + nginx 模板)、deploy/frontend-dist/(前端构建产物)、deploy/agent-dist/(Agent 二进制,linux amd64 / arm64)。

推荐用 GitHub Actions,打 tag 即自动构建并挂到 Release:

git tag v1.0.0 && git push origin v1.0.0

本地构建(需 Node + Go):

bash scripts/build-release.sh          # 产出 ./bc-deploy.tar.gz
SKIP_AGENT=1 bash scripts/build-release.sh   # 不重编 Agent,复用已有 deploy/agent-dist

卸载

curl -fsSL https://raw.githubusercontent.com/gongpz/backup-center/main/install-scripts/bc-uninstall.sh | sudo bash

交互式逐项确认,默认保留数据库、SSL 证书等资产,也不会动 Docker 本身。

许可

GNU Affero General Public License v3.0(AGPL-3.0)。可以自由使用、修改和分发。这里要单独提醒一条:如果把你修改后的版本作为网络服务对外提供,必须同样公开完整源代码——AGPL 的触发条件是「通过网络提供服务」,不只是分发二进制,二次开发后对外运营要按这条评估。

README 没写、需要自己验证的点

  • 文件与数据库是否同一时间点一致:README 描述的是扫描目录并上传,没有说明会不会在备份前对数据库做 dump、是否与文件快照对齐。电商、论坛这类有写入的站点,需要自己确认备份期间的一致性策略。
  • 异地加密:存储端支持多种协议,但文档没有说明传输之外是否做客户端加密、凭证如何保管。放到第三方对象存储前建议自行验证。
  • 增量去重:按 /YYYYMMDD/ 一天一份的目录约定看,每份大概率是独立归档,是否做块级去重、重复文件是否只传一次,README 未提及,需要实测存储占用增长曲线。
复制全文 生成海报 自托管 备份 Laravel Go Docker 运维

推荐文章

程序员茄子在线接单