Databasement源码架构解析:Laravel + Livewire + 队列如何构建异步备份流水线
Databasement源码架构解析Laravel Livewire 队列如何构建异步备份流水线【免费下载链接】databasementSelf-hosted database backup manager with a web UI. Schedule, backup, and restore MySQL, PostgreSQL, MariaDB, Microsoft SQL Server, MongoDB, SQLite Redis to S3, SFTP, Samba or local storage. SSH Tunnel support.项目地址: https://gitcode.com/gh_mirrors/da/databasementDatabasement 是一款自托管的数据库备份管理器Self-hosted database backup manager提供 Web 管理界面支持对 MySQL、PostgreSQL、MariaDB、MSSQL、MongoDB、SQLite、Redis 等数据库进行定时备份、压缩、校验与恢复并可传输到 S3、SFTP、Samba 或本地存储。它的后端基于 Laravel Livewire通过队列实现异步备份流水线是研究“Web UI 队列任务 多目标存储”架构的绝佳开源样本。一、技术栈总览层次技术选型在架构中的角色框架Laravel 13PHP 8.5路由、模型、队列、调度、通知等基础设施前端交互Livewire 4纯服务端渲染的响应式管理界面无需单独写前端 API认证与权限Fortify Bouncer登录/双因素/邀请组织级 RBAC 权限任务执行Laravel Queuebackups队列把耗时的 dump/压缩/上传挪出 HTTP 请求生命周期调度Artisan Schedule动态注册 cron从数据库读取备份计划按需触发存储抽象FlysystemS3/Azure/SFTP/FTP/SMB/本地统一的多卷上传接口进程管理FrankenPHP SupervisorWeb 服务、队列 worker、调度器三进程常驻依赖声明见 composer.jsonlivewire/livewire ^4.0、laravel/fortify、silber/bouncer、以及league/flysystem-*一系列存储适配器。二、目录分层一个清晰的应用骨架app/目录按职责切分新人可以从这里快速建立心智模型app/Livewire/ —— 管理界面组件服务器、卷、快照、仪表盘等纯服务端渲染app/Http/Controllers/Api/V1/ —— REST API 控制器供脚本与 MCP 调用app/Jobs/ —— 队列任务如ProcessBackupJob、ProcessRestoreJobapp/Console/Commands/ —— Artisan 命令如RunScheduledBackupsapp/Services/Backup/ ——核心备份引擎按Databases/7 种数据库适配器、Filesystems/6 种存储适配器、Compressors/压缩器分厂app/Models/ —— 领域模型DatabaseServer、Backup、Snapshot、SnapshotFile、Volume等app/Enums/ —— 状态与类型枚举如BackupJobStatus、SnapshotFileStatusapp/Notifications/ —— 备份成功/失败通知支持 Slack、Telegram、Discord 等渠道三、备份流水线从一次点击到文件落地整条流水线可以概括为一句话UI 只负责“下单”快照Snapshot是工单队列 worker 是执行车间存储卷是收货仓库。1. 触发入口手动与定时殊途同归用户点击“备份”或到达 cron 时点最终都汇合到同一套动作手动触发走 TriggerBackupAction调用工厂创建快照再逐个分发定时触发走 RunScheduledBackups按计划 ID 找到所有Backup配置创建快照后分发两者共享同一个核心BackupJobFactory 为每个“数据库 × 目标卷”组合创建一条Snapshot记录和若干SnapshotFile记录。这一步只做数据库写入不做任何耗时操作因此 HTTP 请求瞬间返回。2. 分发决策队列还是远程 AgentDispatchBackupAction 是流水线的分叉口服务器没有绑定 Agent →ProcessBackupJob::dispatch($snapshot-id)推入backups队列服务器绑定了Agent目标机器无法直连→ 写入AgentJob表由部署在目标机器上的 agent 轮询领取执行这个设计让 Databasement 既能备份同网段数据库也能经 SSH/反向通道管理内网机器。3. 队列任务ProcessBackupJob 的健壮性细节ProcessBackupJob 是备份主任务几个值得借鉴的点专用队列 独立参数$this-onQueue(backups)重试次数、超时、退避均从应用配置读取AppConfig不写死防重入中间件使用WithoutOverlapping保证同一快照不会被并发 dump 两次断点续传式重试重试时先过滤掉已Completed的SnapshotFile已上传成功的副本不会重复上传失败闭环failed()回调在重试耗尽后触发失败通知NotificationService存储配额超限还会单独告警4. 备份引擎dump → 压缩 → 上传 → 校验任务只负责“编排”真正干活的是 BackupTask它是一个不感知模型持久化的纯引擎四步流水线DumpDatabaseProvider 按类型MysqlDatabase、PostgresqlDatabase、MongodbDatabase…实例化适配器若配置了 SSH 隧道则先由 SshTunnelService 建立端口转发压缩CompressorFactory 产出 Gzip / Zstd / 加密压缩器上传同一份归档按相同文件名推送到每个目标卷经 FilesystemProvider 抽象底层是 Flysystem 的 S3/SFTP/SMB/本地等实现校验计算 SHA-256 校验和写回快照并可选执行备份后脚本PostScriptRunner任何一卷上传失败都会抛出VolumeTransferException但已成功的副本会先落库再标记失败——部分成功也是可观测的。恢复流程对称地由 ProcessRestoreJob RestoreTask 完成同样走队列异步执行。四、调度系统从数据库动态注册 cron传统做法是在代码里硬编码 cronDatabasement 在 routes/console.php 中启动时读取BackupSchedule表为每条计划动态注册一条 cron用户改计划无需改代码、无需改部署。同文件还注册了三条系统级任务任务频率默认职责snapshots:cleanup每日 4:00按 GFS 保留策略清理过期快照snapshots:verify-files每日 5:00校验远端卷上的备份文件确实存在jobs:recover-stuck每 5 分钟回收卡死/租约过期的任务配合 RecoverStuckJobsCommand 与 VerifySnapshotFilesCommand系统对“任务假死”“文件丢失”这类长尾问题都有兜底自愈机制。五、队列运行Supervisor 三进程模型生产部署由 docker/php/supervisord.conf 统一管理三个常驻进程frankenphpWeb 请求含 Livewire 组件queue-workphp artisan queue:work --queuebackups,default --tries3 --timeout3600专职消费备份队列schedule-runphp artisan schedule:work每秒检查 cron 是否命中Web 与 worker 分离是这套架构的关键页面永远不会因为一次 30 分钟的数据库 dump 而超时UI 与流水线各自伸缩。六、给自研备份工具的 5 条借鉴清单请求与执行彻底解耦HTTP 只创建“工单记录”重活全部进队列用数据表驱动调度cron 表达式存库启动时动态注册快照 文件两级记录Snapshot管元数据SnapshotFile管每卷副本状态天然支持多目标与部分成功策略模式收敛差异数据库、存储、压缩各自接口化DatabaseInterface、FilesystemInterface、CompressorInterface新增类型只需加一个实现类失败可观测、可自愈任务日志随 job 落库、通知多渠道推送、定时巡检卡死任务如果你想深入某个模块建议从 docs/docs/user-guide/backups.md 理解产品语义再对照 app/Services/Backup/ 阅读引擎实现开发环境搭建可参考 docs/docs/self-hosting/docker.md。【免费下载链接】databasementSelf-hosted database backup manager with a web UI. Schedule, backup, and restore MySQL, PostgreSQL, MariaDB, Microsoft SQL Server, MongoDB, SQLite Redis to S3, SFTP, Samba or local storage. SSH Tunnel support.项目地址: https://gitcode.com/gh_mirrors/da/databasement创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

B站爬虫从入门到工程化:接口解析、鉴权风控与并发设计

B站爬虫从入门到工程化:接口解析、鉴权风控与并发设计

前两天有个朋友来找我,开口就是“帮我写个B站爬虫呗,很简单的,就是把视频信息抓下来。”我问他要抓什么,他说“就是视频标题、播放量、还有评论”。再问打算抓多少,他说“没想过,反正越多越好”。没过几天&…

2026/10/4 6:14:18 阅读更多 →
从Git仓库到研发效能:华为云CodeHub代码托管实战指南

从Git仓库到研发效能:华为云CodeHub代码托管实战指南

1. 为什么代码托管会从“网盘”变成研发效能的核心枢纽很多团队对代码托管的理解停留在“给代码找个地方放着”,直到某天合并冲突此起彼伏、发布版本找不到对应commit、新人入职半天拉不下来工程、线上出问题不知道是谁改的,才意识到代码托管根本不是存代…

2026/10/4 6:14:18 阅读更多 →
从架构到代码:PREEvision与MATLAB联合开发AUTOSAR软件组件

从架构到代码:PREEvision与MATLAB联合开发AUTOSAR软件组件

PREEvision与MATLAB联合开发AUTOSAR软件组件:一条从架构到代码的实战路径做汽车电子软件开发的同行,对PREEvision和MATLAB这两款工具应该都不陌生。PREEvision负责E/E架构设计,把整车级的控制器、传感器、总线网络、软件架构理得清清楚楚&…

2026/10/4 6:13:17 阅读更多 →

最新新闻

插件加载失败如何排查?从插件机制、生命周期到通用方法

插件加载失败如何排查?从插件机制、生命周期到通用方法

这几年我不管是在 IDE 里折腾扩展功能、给播放器挂个音源,还是在服务器上追测试 harness 的启动日志,最后都会回到同一个词:plugins。你可能也遇到过一长串英文报错,比如failed to load plugins web boot: 2 entries did not acti…

2026/10/4 10:32:12 阅读更多 →
TFLite Micro 资源变量(Resource Variables)指南:VAR_HANDLE / ASSIGN_VARIABLE / READ_VARIABLE 算子与跨子图状态管理的完整实践

TFLite Micro 资源变量(Resource Variables)指南:VAR_HANDLE / ASSIGN_VARIABLE / READ_VARIABLE 算子与跨子图状态管理的完整实践

人工智能深度学习推理引擎本地部署嵌入式物联网 【免费下载链接】tflite-micro Infrastructure to enable deployment of ML models to low-power resource-constrained embedded targets (including microcontrollers and digital signal processors). 项目地址: h…

2026/10/4 10:32:12 阅读更多 →
MR25H40CDF+MK64FX512VDC12工业级实时数据缓存架构

MR25H40CDF+MK64FX512VDC12工业级实时数据缓存架构

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 MK64FX512VDC12 做数据存储?我在产线调试边缘数据采集模块时,反复被一个问题卡住:PLC周期性上报的传感器采样值(温度、振动、电流谐波),必须…

2026/10/4 10:32:12 阅读更多 →
AI硬件设计辅助系统:PrintWindow抓屏实现与Electron实践

AI硬件设计辅助系统:PrintWindow抓屏实现与Electron实践

1. 从“看不见”到“看得见”:AI 硬件设计辅助系统的关键一步做过硬件设计的朋友都知道,画原理图、摆器件、连网络、查封装,这些活儿琐碎且耗时。尤其是当你面对一块已经画好的板子,想快速理清某个模块的走线逻辑,或者…

2026/10/4 10:32:12 阅读更多 →
用MRAM替代Flash/EEPROM:TM4C1294 SPI驱动实践

用MRAM替代Flash/EEPROM:TM4C1294 SPI驱动实践

前阵子帮客户排查一台伺服驱动器,故障现象非常典型:设备上电后偶尔恢复出厂参数,跑了一年的运行次数莫名其妙清零。查来查去,最后问题落在EEPROM上——一天频繁写几百次运行数据,寿命先到顶了。我手边正好有Everspin的…

2026/10/4 10:32:12 阅读更多 →
AI编程插件本质:可验证服务节点与SDK契约体系

AI编程插件本质:可验证服务节点与SDK契约体系

1. “plugins”不是功能模块,而是现代AI编程工具的神经突触你点开Cursor、Codex或Zcode这类AI编程工具的设置页,看到“Plugins”那一栏时,第一反应可能是——这不就是VS Code里装个Prettier、ESLint那种插件?点几下安装完事。但实…

2026/10/4 10:31:11 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:36 阅读更多 →