Black Candy 介绍与选型指南
Black Candy 自托管音乐流媒体服务器介绍与选型:Ruby on Rails 极简单体栈架构、Solid Queue 内嵌任务、官方移动 App、功能边界,附与 Navidrome/Koel/Ampache 的量化选型对比(溯源 v3.2.1,查询日期 2026-10-28)。
Black Candy 介绍与选型指南
目标:面向准备自建私人音乐流媒体服务的读者,讲清 Black Candy 是什么、技术栈形态、功能边界,并用同赛道主流产品的量化数据辅助选型决策。本文为认知溯源篇,全部事实均来自官方渠道联网取证(来源与查询日期随文标注),不包含本地实测内容;部署、配置与运维实测见本专栏后续实战篇目。
一、环境信息
本文是纯联网溯源的认知篇,以下列出取证对象与溯源环境,供读者核对信息时效:
- 溯源组件:Black Candy,主仓库
github.com/blackcandy-org/blackcandy,官方演示站demo.blackcandy.org - 溯源日期:2026-10-28
- 当前最新稳定版:v3.2.1(来源:GitHub Releases 页面与 Releases Atom 流
github.com/blackcandy-org/blackcandy/releases.atom双源核实,v3.2.1 条目更新时间 2026-08-26T07:43:35Z;其前一版 v3.2.0 为大版本特性发布) - 社区热度:主仓库星标约 4.4k(来源:shields.io 徽章数据
img.shields.io/github/stars/blackcandy-org/blackcandy.json,实查返回{"message":"4.4k"},查询日期 2026-10-28) - 许可证:MIT(来源:shields.io 许可证徽章
img.shields.io/github/license/blackcandy-org/blackcandy.json,实查返回{"message":"MIT"}) - 官方配置事实来源:仓库根
README.md(安装、环境变量、数据持久化章节)、仓库根Dockerfile(运行时形态)、docs/upgrade.md(升级指南索引)
💡 说明:Black Candy 的仓库同时提供 GHCR 与 Docker Hub 两个发布渠道(
ghcr.io/blackcandy-org/blackcandy与blackcandy/blackcandy),README 的安装与升级说明均以官方映像为唯一部署载体,这一点决定了它的部署形态极简——后续实战篇(《Black Candy Docker Compose 部署实战》)将按官方编排逐字段实测。
二、软件概述
Black Candy 是一款用 Ruby on Rails 编写的自托管音乐流媒体服务器,官方一句话定位是 "your personal music center"——把自己服务器上的音乐文件目录变成一个可多用户访问、可检索、可在线播放的私人音乐中心。
- 仓库:
blackcandy-org/blackcandy(https://github.com/blackcandy-org/blackcandy) - 许可证:MIT 开源,个人与商业均可自部署
- 当前最新稳定版:v3.2.1(2026-08-26 发布)
- 社区热度:GitHub Star 约 4.4k(shields.io 徽章取证,2026-10-28)
- 演示站:https://demo.blackcandy.org(官方说明演示账号
admin@admin.com/foobar,无管理员权限,曲目来自 Free Music Archive) - 移动客户端:官方 iOS / Android 应用(App Store、Google Play、F-Droid 三渠道上架,另有 GitHub Release 提供 Android APK)
它的产品性格可以概括为极简:不追全家桶式的媒体功能面,专注「音乐文件目录 → Web/移动端播放」这一条主线;部署面收敛为一个官方映像 + 一个数据目录 + 少量环境变量,管理面收敛为一个设置页。v3.0.0 起配套的官方移动应用正式发布,v3.2.0 起移动端迁移到 Hotwire Native 桥接(来源:v3.2.0 Release Notes),形成「Web + 移动 App 双端同构」的客户端形态。
三、核心架构
以下架构事实来自官方仓库 Dockerfile、README.md 与 Release Notes 的溯源(查询日期 2026-10-28):
| 层 | 组件 | 事实与来源 |
|---|---|---|
| 语言运行时 | Ruby 4.0.2(+YJIT) | Dockerfile 基础层 ruby:4.0.2-alpine;v3.2.0 曾升级 Ruby 至 3.4,随后在 #471 升至 4.0.2 |
| Web 框架 | Rails 8.1 | v3.2.0 内 #443/#455 两次升级至 Rails 8.0/8.1;bin/rails server 为容器主命令 |
| 前端体系 | Hotwire(Turbo + Stimulus) | v2.0.0 由 Turbolinks 迁移 Turbo;v3.2.0 迁移 Hotwire Native bridge 供移动端复用 |
| HTTP 服务 | Puma 集群模式 + Thruster 前置代理 | Dockerfile CMD ["./bin/thrust", "./bin/rails", "server"];v3.2.0 修复 Thruster sendfile(#465) |
| 后台任务 | Solid Queue(数据库驱动,随应用进程内嵌运行) | 镜像内实测捆绑 solid_queue 1.1.5;媒体扫描/封面抓取等均走该队列 |
| 缓存与推送 | Solid Cache / Solid Cable | Rails 8 默认三库架构:cache 与 Action Cable 后端均落库 |
| 数据库 | SQLite 默认,可切换 PostgreSQL | README:「SQLite can simplify the process of installation, and it's an ideal choice for self-hosted small server」;云托管可经 DB_ADAPTER=postgresql 切换 |
| 音频处理 | ffmpeg | Dockerfile 运行层显式安装 ffmpeg,承担格式识别与按需转码 |
| 图像处理 | libvips | Dockerfile 运行层显式安装 vips,承担封面等图片处理 |
| 内存分配器 | jemalloc | Dockerfile LD_PRELOAD=/usr/lib/libjemalloc.so.2;v3.2.0 #439 说明启用目的是降低内存占用与延迟 |
| 运行身份 | 专用低权用户(uid/gid 1000) | Dockerfile 创建 app 用户并以其运行,入口脚本内置 gosu 降权 |
💡 技术拓展:自托管音乐服务端的「后台任务」方案常见三种形态——独立任务进程(如 Sidekiq,需额外运行一个消费者进程)、数据库驱动内嵌队列(如 Rails 8 默认的 Solid Queue,复用主应用进程分叉出调度/执行子进程,不引入额外常驻服务)、语言内线程池(如 Go 服务用 goroutine 直接处理)。Black Candy 采用 Solid Queue 内嵌形态,这是它「单进程极简部署」定位的关键一环:不需要用户额外维护一个任务中间件,代价是超大规模扫描吞吐不如独立任务中间件——对个人音乐库量级(万首级)足够。本文所述产品即采用该形态。
媒体库的同步机制是理解其架构的钥匙(来源:仓库 app/jobs/media_sync_all_job.rb、app/models/media.rb 源码与 Release Notes):
- 全量同步:管理端触发后,任务枚举媒体目录下全部音频文件,对每个文件计算带修改时间的 MD5 摘要,与曲库中已有摘要比对,只对新增/变化文件解析元数据入库;
- 增量自动同步:v2.1.0 起(#179)曲库文件变化自动触发同步,无需手动全量扫描;
- 摘要去重:同一文件即使被移动到媒体目录的其他位置,凭 MD5 摘要也不会产生重复曲目,被移出目录的曲目由清理步骤自动下架;
- 外部元数据:v3.x 支持在设置页填入 Discogs API Token,为缺少封面的艺人/专辑异步补抓官方图片(
AttachCoverImageFromDiscogsJob)。
四、功能特性
以下特性清单以官方 README、Release Notes(v1.2.0 → v3.2.1)为据,查询日期 2026-10-28:
曲库与元数据
- 目录式曲库:指向一个媒体目录,自动枚举音频文件并解析 ID3 等标签建立艺人/专辑/曲目三级库;
- 自动同步:文件增删改后自动增量入库(v2.1.0),也可在设置页手动触发全量同步;
- 摘要去重与自动清理:移动/删除文件不会产生幽灵曲目;
- 专辑封面:支持手动设置(v1.2.0)与 Discogs API 自动补抓两种途径;
- 合辑支持:多艺人合辑专辑(v1.2.0 "various artists album")。
播放与音频
- 原格式直出与按需转码双通道:Web 端对浏览器不支持的格式自动转码,转码码率可在设置页调整,并可选「允许转码无损格式」(v2.0.0);
- 系统级媒体控制:Web 端接入 Media Session API(v2.0.0),锁屏/系统播放器可显示曲目与控制播放;
- 播放器音量控制增强(v3.2.0)。
播放列表与交互
- 可排序播放列表(v1.3.0)、收藏、搜索页(v2.0.0 重构);
- 界面主题明暗双色(个人设置页可选)。
多用户与移动端
- 多用户体系:管理员可创建/编辑用户,普通用户曲库共享而播放列表/收藏独立;
- 演示模式(
DEMO_MODE):开启后所有用户(含管理员)无法使用管理特权、无法改个人资料,适合公开演示(来源:README 环境变量表); - 官方移动应用:iOS(App Store)/ Android(Google Play、F-Droid、GitHub Release APK),v3.0.0 随服务端正式发布,v3.2.0 起要求移动端 v2.0+ 并引入最低应用版本校验(服务端可拒绝过旧客户端);
- 移动端 API:
/api/v1前缀的令牌认证 API(v2.1.0 起提供用户认证 API),官方移动应用即基于该 API 通信。
运维面
- 官方映像单载体部署:数据持久化点唯一(
/rails/storage,v3.2.0 起路径,v3.1 及之前为/app/storage); - 日志走 STDOUT,交由平台日志体系接管(README Logging 章节);
- 多 CPU 架构发布:v1.2.0 支持多平台构建,v3.2.0 增加
linux/arm/v7(#452),覆盖常见 NAS/树莓派场景。
五、快速开始(最小可用示例)
本章按「零安装体验 → 官方推荐自托管路径 → 首次初始化」给出最小可用路径,全部为官方文档记载的标准步骤(本地逐条实测回显见本专栏部署篇)。
5.1 零安装:官方演示站
官方维护了公开演示环境,打开即用:
- 演示站地址:https://demo.blackcandy.org
- 演示账号:
admin@admin.com/foobar(官方说明:该账号无管理员权限,看不到全部功能;曲目来自 Free Music Archive,授权清单见仓库docs/demo_music_licenses.md)
这是不上服务器的体验路径,适合先确认界面风格与操作逻辑是否符合预期。
5.2 自托管:官方映像单命令运行
官方 README 的安装章节给出的一行式路径(原文):docker run -p 80:80 ghcr.io/blackcandy-org/blackcandy:latest(或 Docker Hub 渠道 blackcandy/blackcandy:latest)。启动后浏览器访问服务器 80 端口即为 Web 界面。
官方 README 同时给出的关键定制点:
- 媒体目录:把宿主音乐目录挂进服务并在环境变量
MEDIA_PATH中指向它; - 数据持久化:所有需要持久化的数据都在
/rails/storage一个目录内,挂出即可; - 会话密钥:设置
SECRET_KEY_BASE(可用openssl rand -hex 64生成)避免每次重启使全部登录会话失效; - 非 root 运行:挂载目录权限不匹配时,用与宿主目录属主一致的 UID/GID 运行服务。
完整的编排字段、目录规划与逐条验证回显属于本地实测范畴,见本专栏部署实战篇;环境变量的逐项语义见本专栏配置参数详解篇。
5.3 首次初始化三步
无论哪种部署形态,服务起来后的首次初始化都是同样的三步:
- 登录:用初始管理员账号
admin@admin.com/foobar登录 Web 界面; - 改密 + 设媒体路径:立即修改管理员密码;在管理设置页确认/修改媒体路径(或启动时用
MEDIA_PATH环境变量指定); - 触发同步:在设置页触发媒体同步,等待后台任务完成,曲库即出现在首页。
六、适用场景与限制
适合:
- 个人/家庭私有音乐库(几千到几万首量级)的自托管收听,配合官方移动 App 使用;
- 追求极简部署面的用户:单数据目录、单设置页、SQLite 默认零外部依赖,备份恢复即备份一个目录;
- Rails 技术栈团队/爱好者:想以熟悉的生态自维护一个音乐服务,代码量与依赖面都可控;
- 树莓派/ARM 小盒子等低功耗设备(官方发布含 arm/v7 等多架构)。
不适合:
- 想要「音乐 + 电影 + 电视 + 照片」全家桶的用户(选 Jellyfin 类全媒体服务器);
- 重度依赖 Subsonic API 生态第三方客户端的用户——Black Candy 使用自有 API 与官方 App,不兼容 Subsonic 协议(这点与 Navidrome/Ampache 是本质差异);
- 需要联邦化、社交化(跨实例互关、播客订阅治理)的平台(选 Funkwhale 类);
- 大规模并发/超大树库场景:单机内嵌队列 + SQLite 默认形态面向个人量级设计,虽可切 PostgreSQL,但产品定位并非多实例高并发服务。
七、同类选型对比
同赛道(自托管音乐流媒体服务端)主流开源产品的关键指标横向对比。星数为 shields.io 徽章取证(2026-10-28),其余为各项目官方文档/仓库公开信息:
| 维度 | Black Candy | Navidrome | Koel | Ampache |
|---|---|---|---|---|
| GitHub Star(2026-10-28) | 4.4k | 24k | 17k | 3.8k |
| 实现语言/框架 | Ruby(Rails 8.1) | Go | PHP(Laravel)+ Node.js | PHP |
| 许可证 | MIT | GPL-3.0 | MIT | AGPL-3.0 |
| 产品定位 | 极简个人音乐中心(Web + 官方移动 App) | 音乐专用流媒体,Subsonic 生态为王 | 现代 Web 风格个人音乐站 | 老牌全能型音乐库/流媒体 |
| 对外 API | 自有 /api/v1(官方 App 专用) | Subsonic API 完整兼容 + OpenSubsonic | 自有 JSON API | Subsonic 兼容 + Ampache API 双套 |
| 第三方客户端生态 | 官方 iOS/Android App | Subsonic 生态数十款 App | 以 Web 为主,少量第三方 | Subsonic 生态 + 自有客户端 |
| 默认数据库 | SQLite(可切 PostgreSQL,双库/四库分离) | 内嵌 SQLite(WAL) | MySQL/PostgreSQL/SQLite 均可 | MySQL/MariaDB/PostgreSQL |
| 后台任务 | Solid Queue 内嵌(无额外常驻服务) | 无独立任务系统(单二进制内完成) | 队列依赖(Horizon/Redis 或 database) | 独立任务/计划任务配置 |
| 部署面 | 官方映像 + 1 数据目录 + 少量环境变量 | 单容器/单二进制 + 2 挂载点 | 容器或 PHP 主机部署,依赖面较大 | 容器或 LAMP 栈,功能面广配置项多 |
| 社区热度区间 | 中(万级以下) | 高(2 万+) | 高(1 万+) | 中 |
场景结论:
- 想要官方原生移动 App + 极简 Ruby 单体栈 → Black Candy 是该定位下的少数选择:客户端不用挑、部署面最小、MIT 许可最宽松;代价是放弃 Subsonic 生态的第三方客户端选择权;
- 只要音乐、追求最低资源占用 + 海量现成客户端 → 首选 Navidrome:Go 单二进制、Subsonic 生态直接复用、社区最活跃;
- 喜欢 Laravel/前端现代风格、以 Web 播放为主 → Koel 更合口味,但需要自备 MySQL/PG 等外部依赖,部署面明显更大;
- 从老牌方案迁移、需要最全的功能面(Web 上传、多库管理、双 API) → Ampache 功能纵深最大,管理与维护成本也最高。
八、本系列实战篇
- 部署落地:《Black Candy Docker Compose 部署实战》——镜像选型、编排逐字段、登录/同步/播放全链路实测;
- 配置体系:《Black Candy 配置参数详解》——环境变量与设置页三层配置面、SQLite/PostgreSQL 双模板;
- 运维命令:《Black Candy 常用命令与运维实战》——rails CLI、媒体同步、API 实测与备份恢复闭环。
九、参考链接
- 官方仓库与 README(安装/配置/环境变量表):https://github.com/blackcandy-org/blackcandy
- 版本发布页(v3.2.1,2026-08-26):https://github.com/blackcandy-org/blackcandy/releases
- 升级指南(v3.1 → v3.2 断代变更:工作目录
/app→/rails):https://github.com/blackcandy-org/blackcandy/blob/master/docs/upgrade.md - 官方演示站:https://demo.blackcandy.org
- 移动应用仓库(Android APK 发布):https://github.com/blackcandy-org/android
- 星数/许可证取证:
img.shields.io/github/stars/blackcandy-org/blackcandy.json、img.shields.io/github/license/blackcandy-org/blackcandy.json(查询日期 2026-10-28)