Testcontainers一键拉起Radarr、Sonarr、Jellyfin全家桶:Janitorr本地开发环境完全指南

发布时间:2026/10/12 8:59:10

Testcontainers一键拉起Radarr、Sonarr、Jellyfin全家桶:Janitorr本地开发环境完全指南 Testcontainers一键拉起Radarr、Sonarr、Jellyfin全家桶Janitorr本地开发环境完全指南【免费下载链接】janitorrCleans your Radarr, Sonarr, Jellyseerr and Jellyfin before you run out of space项目地址: https://gitcode.com/gh_mirrors/ja/janitorrJanitorr是一款自动清理Radarr、Sonarr、SeerrJellyseerr和 Jellyfin媒体库的工具帮你在磁盘写满之前删掉永远不会被观看的影片。对开发者来说它最大的调试难点是依赖服务太多Radarr、Sonarr、Jellyfin、Seerr 一个都不能少。Janitorr 用Testcontainers打造了一套本地开发环境——运行一个main函数即可自动拉起全家桶容器、完成全部初始化配置真正做到一键调试。为什么需要一键本地开发环境Janitorr 的工作流程横跨多个服务从 *arr 拉取抓取历史、查询 Jellyfin 的观看状态、清理 Seerr 中的请求、最后删除文件。手动搭建一套这样的环境你需要逐个部署 Radarr、Sonarr、Jellyfin、Seerr 四个容器手工填写 API Key、配置根目录、质量配置、下载器解决服务之间互相访问的端口与网络问题准备一批真实的电影/剧集素材供清理流程使用Janitorr 的本地开发环境把这些步骤全部自动化了所有服务由 Testcontainers 启动在隔离的 Docker 网络中API Key 从容器配置里自动读取初始化向导自动完成甚至连示例媒体库都会自动下载并摆好目录结构。一键启动Testcontainers 全家桶包含哪些服务入口是 LocalJanitorrStarter.kt 中的main函数它调用 LocalDevEnvironment.kt 的start()方法。启动后的完整服务清单如下容器宿主机端口默认账号 / 密码Radarr随机分配admin / adminSonarr随机分配admin / adminJellyfin随机分配admin / adminadminSeerr随机分配admin / adminadminjanitorr-stats随机分配无需登录所有容器共享一条名为janitorr-local-dev的 Docker 桥接网络见 LocalDevNetwork.kt因此它们可以互相通过服务名访问例如http://jellyfin:8096而暴露到宿主机的端口是随机空闲端口不会与你已有的本地服务冲突。最快启动方法3 步运行 LocalJanitorrStarter前提条件安装 Docker并用 IntelliJ或其他支持 Kotlin 的 IDE打开项目。第 1 步获取代码git clone https://gitcode.com/gh_mirrors/ja/janitorr第 2 步定位入口文件打开 LocalJanitorrStarter.kt路径src/test/kotlin/com/github/schaka/janitorr/LocalJanitorrStarter.kt。第 3 步运行 main 函数点击fun main旁边的绿色运行图标或右键选择Run LocalJanitorrStarterKt。首次运行需要几分钟IDE 的 Run 面板会滚动输出容器启动和每一步初始化的日志。一切就绪后日志会打印各服务的地址与凭据Started Radarr at http://localhost:54321 Login via: admin/admin | API-Key: ... Started Sonarr at http://localhost:54322 Login via: admin/admin | API-Key: ... Started Jellyfin at http://localhost:54323 Login via: admin/adminadmin | API-Key: ... Started Seerr at http://localhost:54324 Login via: admin/adminadmin | API-Key: ... Started Janitorr-Stats at http://localhost:54325此时 Janitorr 本体已连上全部服务并正常运行——你可以在浏览器里操作各服务界面也可以在 IntelliJ 中照常挂断点调试。幕后揭秘Testcontainers 启动序列做了什么start()的执行顺序精心设计值得了解详细说明见 docs/local-development.md创建共享目录在项目根目录local-runtime/下建立media/、downloads/、downloads/incomplete/后台准备媒体库从 Blender 开源片库下载一个示例视频自动搭建 10 部电影 5 部剧集的目录结构软链接方式视频文件会缓存复用并行启动容器Radarr、Sonarr、Jellyfin、Seerr 通过Startables.deepStart()同时拉起读取 API Key每个 *arr 的 Key 通过exec进容器读取config.xml获得带重试机制例如 RadarrContainer.kt 中最多重试 10 次配置 Radarr / Sonarr通过 HTTP API 设置根目录、质量配置、下载器和命名规则完成 Jellyfin 初始化向导创建管理员用户、生成janitorr-localAPI Key见 JellyfinSetup.kt单独启动 janitorr-stats它启动时校验 Jellyfin API Key必须等 Jellyfin 就绪后写入配置才能拉起配置 Seerr完成初始向导并关联 Radarr/Sonarr注入属性所有端口和 Key 通过System.setProperty注入Spring Boot 会像读取application.yml一样消费它们持久化机制为什么第二次启动更快local-runtime/目录保存了重建代价高的状态且已被加入.gitignore不会被提交路径作用local-runtime/media/cache/缓存的示例视频跨运行复用local-runtime/jellyfin/api-key.txtJellyfin API Key仍有效时直接跳过向导local-runtime/radarr/、local-runtime/sonarr/等各容器配置目录每次运行挂载进容器例如 JellyfinSetup 会先校验缓存的 API Key 是否仍有效调用GET /Users/Me有效则完全跳过向导与建 Key 步骤避免在 Jellyfin 里堆积过期 Key。常见问题排查Q首次运行卡住很久正常现象——需要下载镜像、等待 Jellyfin 完成首次扫描。每个容器都配置了 HTTP 健康检查如 Radarr 的/ping、Jellyfin 的/health超时上限一般为 3~5 分钟。Q日志提示 Seerr setup did not completeSeerr 初始化失败时Seerr 集成会被自动禁用其余服务不受影响可重试运行。Q想单独测试某一个容器每个容器类都接受可选的network参数默认null可以脱离全家桶在聚焦的集成测试中单独使用。小提示本地开发基础设施位于src/test/kotlin下作者有意以较低标准维护它——它不随产品发布、迭代频繁只为方便调试而存在使用时遇到毛边属于预期现象。总结Janitorr 的 Testcontainers 本地开发环境把搭环境这件最耗时的事压缩成了一次点击 一个main函数拉起 5 个真实服务容器 API Key、初始化向导、媒体库全部自动处理 随机端口 独立网络零冲突 状态持久化二次启动显著提速打开 LocalJanitorrStarter.kt点下运行键你就可以心无旁骛地调试 Janitorr 本身的清理逻辑了。【免费下载链接】janitorrCleans your Radarr, Sonarr, Jellyseerr and Jellyfin before you run out of space项目地址: https://gitcode.com/gh_mirrors/ja/janitorr创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/7 16:47:14

2027最新Java毕业设计选题推荐【通过率超高】

文章目录前言选题介绍选题选择的重要性选题选择标准1. 实用性考量2. 新颖性评估3. 可行性分析推荐选题方向1. 物联网与嵌入式2. 软件开发与应用选题建议选题推荐我的优势源码获取前言 ❤️博主简介:全网累计客户1000,培训机构讲师、全栈开发工程师、知乎…

2026/10/12 8:55:17

基于微信小程序的医院医疗设备管理系统设计与实现全解析

1. 项目拆解与选题价值这段时间后台一直有同学来问关于管理类小程序毕设的事情,尤其是医疗方向的。今天挑一个出现频率很高的题目来聊聊:基于微信小程序的医院医疗设备管理系统。这个题目听起来很官方,但拆开来看其实是标准的“前端小程序 后…

2026/10/12 8:55:17

PolarDB只读节点故障排查实战:从复制链路中断到根因修复

开年第一个工作日,我还在工位上对着日历感慨假期过得太快,手机上的告警群就炸了。线上业务反馈,PolarDB MySQL版的只读节点连不上了,应用侧所有读流量全部超时报错。我那一瞬间脑子是蒙的:配置没动过、版本没升过、前几…

2026/10/12 8:55:17

Diff算法深度解析:从文本到虚拟DOM的底层原理

git diff 是我每天用得最多的命令之一。不管是代码审查、找回归、还是看别人提交里到底改了什么,本质上都在做同一件事:把两串内容并排摆在一起,告诉你“哪里变了”。但你真的想过这个“哪里变了”背后是怎么算出来的吗?前几年面 …

2026/10/12 8:55:17

冒险岛079服务端源码架设指南:从建库到进游戏

简介:《冒险岛079服务端一线海源码更新版》是一份适配079版本的服务端源码包,面向希望搭建、调试或深度定制游戏服务器的开发者和爱好者。更新版针对性能、稳定性、安全、兼容性与模块化做了优化,并补充错误处理与数据库访问机制,…

2026/10/12 8:55:17

Django酒店客房管理系统设计与实现:从数据库建模到业务流程

1. 项目背景与核心需求拆解酒店宾馆客房管理系统这类项目,其实是我见过最多的管理类系统选题之一。无论是课程设计、毕业设计,还是中小型酒店为了摆脱Excel手工排房做的第一套信息化系统,八成都是这个方向。用了Django之后你会发现&#xff0…

2026/10/12 8:50:16

C++输入陷阱:cin与getline混用导致只能输入一次的原因与解决

1. 一个让无数C新手抓狂的输入陷阱如果你写过C,大概率遇到过这种诡异场景:程序里先让用户输入一个数字,紧接着让用户输入一行字符串,结果第二个输入操作像被施了定身术一样,直接跳过去了,程序拿着一个空字符…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/12 0:04:22

绝缘子缺陷检测数据集清洗与工业级训练实战指南

简介:本资源是面向电力AI研发人员、工业视觉工程师及智能巡检系统开发者的绝缘子缺陷检测专用YOLO格式数据集,解决无人机航拍场景下绝缘子破损、污闪、积雪等9类典型缺陷的精准识别与定位难题。数据集共2139张真实巡检图像(含训练/验证/测试集…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑