尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

mybili架构深度解析:Laravel + Octane + Horizon + Redis + SQLite构建NAS下载服务的完整方案

mybili架构深度解析:Laravel + Octane + Horizon + Redis + SQLite构建NAS下载服务的完整方案 mybili架构深度解析Laravel Octane Horizon Redis SQLite构建NAS下载服务的完整方案【免费下载链接】mybili哔哩哔哩收藏夹备份程序 ~ アレ 视频不见了哟项目地址: https://gitcode.com/gh_mirrors/my/mybilimybili是一款面向 NAS 的哔哩哔哩收藏夹备份下载服务它用Laravel Octane Horizon Redis SQLite这套组合把定时同步收藏夹 → 队列化下载视频/弹幕 → Web 页面管理做成了一套可长期无人值守运转的轻量级系统。本文带你完整拆解它的分层架构、任务调度和部署方式帮助你在 NAS 上稳定运行自己的 B 站视频下载服务。一、mybili 是什么NAS 上的 B 站收藏夹备份工具对很多 UP 主粉丝和收藏党来说视频不见了哟是最大的噩梦。mybili 做的事情很简单把你 B 站收藏夹里的视频按最高画质自动下载并缓存到 NAS 本地。它的核心能力包括⏰定时同步每 10 分钟拉取收藏夹列表和视频信息缓存标题、封面、简介队列化下载通过 Redis 队列自动下载视频文件、分 P、音频和弹幕Web 管理界面浏览器即可浏览收藏夹、查看下载进度、在线播放预览订阅发现支持订阅合集与 UP 主自动发现新视频媒体库适配生成人类可读的目录结构直接接入 Emby 等媒体库二、整体架构5 个组件如何分工协作mybili 的架构可以概括为一句话Laravel 写业务Octane 扛请求Horizon 管任务Redis 做缓冲SQLite 存数据。组件职责在 mybili 中的角色Laravel 11Web 框架控制器、模型、服务层全部业务逻辑Octane FrankenPHP高性能常驻运行时让 PHP 常驻内存Web 响应更快Horizon队列监控与调度管理所有异步 Job 的并发、失败重试Redis缓存与队列存临时缓存、限流时间槽、任务队列SQLite持久化数据库存储收藏夹、视频、弹幕、设置等数据依赖关系可以在 composer.json 中确认框架laravel/framework ^11.9另加laravel/octane和laravel/horizon两个官方扩展。三、Web 层Laravel 业务代码的组织方式打开app/目录整个业务按标准 Laravel 分层组织app/Http/Controllers/8 个控制器对应 8 类页面如 CookieController.php 负责上传登录凭证DownloadQueueController.php 负责下载队列管理app/Models/核心模型包括Video、VideoPart分 P、Danmaku弹幕、FavoriteList收藏夹、DownloadQueue下载队列app/Services/真正干活的地方。VideoService.php、DownloadVideoService.php、DownloadQueueService.php 等封装了视频抓取、下载、排队逻辑app/Jobs/15 个异步任务如 DownloadVideoJob.php、DownloadDanmakuJob.php、UpdateFavListJob.php这种Controller 薄、Service 厚的结构让定时任务、HTTP 请求、队列 Job 三类入口都能复用同一套业务代码。四、异步层Redis 队列 Horizon 任务编排这是整个架构的心脏。mybili 把所有耗时操作都扔进队列入队DownloadQueueService.php 用unique_key做去重同一视频不会重复入队并支持priority优先级调度Horizon 按配置的并发数从 Redis 取出 Job 执行失败自动重试限流ScheduledRateLimiterService.php 基于 Redis 的 ZSet 做预安排时间槽限流——不是失败了再重试而是在任务触发时就算好下一次合法执行时间配合风控挂起机制把对 B 站接口的请求频率控制得很温和监控Horizon 自带 Web 仪表盘每分钟通过horizon:snapshot收集队列指标这种设计的最大好处是Web 进程和下载进程完全解耦。下载一个 2 小时的视频不会影响你浏览网页反过来 Web 崩溃重启也不会中断正在进行的下载。五、数据层为什么是 SQLite对 NAS 单用户场景mybili 做了一个很务实的选择持久化数据全部放 SQLiteRedis 只存临时缓存和队列。数据库文件就一个容器内挂载在/data/database.sqlite备份 拷一个文件database/migrations/目录下 40 个迁移文件清晰记录了表结构演进videos、video_parts、danmaku、download_queue等早期版本曾把数据存在 Redis 里项目专门写了 UpgradeRedisToSqlite.php 迁移命令还配了 CheckCanUpgradedFromRedisMiddleware.php 拦截未完成升级的请求——可见作者对数据可靠性的态度六、定时任务无人值守的关键所有自动行为都由routes/console.php中的调度器驱动配合withoutOverlapping()防止任务重叠每 10 分钟同步收藏夹列表、增量更新视频只拉第一页、更新订阅每天 04:00全量刷新收藏夹视频、修复无效视频每 1 分钟从download_queue表取出任务派发 Jobapp:process-download-queue每小时检查无分 P 的异常视频注意一个细节下载调度不直接调 B 站接口而是先写 SQLite 的download_queue表再由每分钟一次的调度命令取出来派发给 Horizon 队列。这让下载进度天然可查、可暂停、可重试——你在 Web 页面看到的下载中/待处理/失败状态都来自这张表。七、部署单容器跑 3 个进程mybili 的 Docker 镜像Dockerfile内置了 4 个工具并通过 supervisord.conf 管理 3 个常驻进程[program:web] commandfrankenphp run # Octane Web 服务 [program:schedule] commandphp artisan schedule:work # 定时调度器 [program:queue] commandphp artisan horizon # 队列 worker三个进程都设置了autorestarttrue任何一个崩溃都会自动拉起。构建阶段则通过多架构amd64 / arm64下载静态编译的ffmpeg、yt-dlp、frankenphp所以无论 x86 还是 ARM NAS如群晖、飞牛、绿联都能直接跑。部署只需两条命令mkdir /mnt/user/mybili/data -p docker-compose up -d # 镜像 ellermister/mybili映射 ./data 存视频、/data 存数据库八、总结这套架构值得借鉴的 3 个思路常驻进程 队列解耦Octane 让 Web 轻快Horizon 让重活异步NAS 这种低功耗设备上也能长期稳定运转轻量存储不妥协SQLite 单文件数据库 Redis 临时缓存的组合省去了维护 MySQL 的负担备份迁移极其简单温和限速策略预安排时间槽的限流器ScheduledRateLimiterService.php从源头避免触发接口风控是长期无人值守的关键如果你在 NAS 上想给 B 站收藏做一个自动保险箱mybili 这套 Laravel Octane Horizon Redis SQLite 方案就是目前相当完整的答案。【免费下载链接】mybili哔哩哔哩收藏夹备份程序 ~ アレ 视频不见了哟项目地址: https://gitcode.com/gh_mirrors/my/mybili创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表