Black Candy 介绍与选型指南

Black Candy 自托管音乐流媒体服务器介绍与选型:Ruby on Rails 极简单体栈架构、Solid Queue 内嵌任务、官方移动 App、功能边界,附与 Navidrome/Koel/Ampache 的量化选型对比(溯源 v3.2.1,查询日期 2026-10-28)。

Black Candy流媒体音乐自托管Rails2026/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.1v3.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 CableRails 8 默认三库架构:cache 与 Action Cable 后端均落库
数据库SQLite 默认,可切换 PostgreSQLREADME:「SQLite can simplify the process of installation, and it's an ideal choice for self-hosted small server」;云托管可经 DB_ADAPTER=postgresql 切换
音频处理ffmpegDockerfile 运行层显式安装 ffmpeg,承担格式识别与按需转码
图像处理libvipsDockerfile 运行层显式安装 vips,承担封面等图片处理
内存分配器jemallocDockerfile 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):

  1. 全量同步:管理端触发后,任务枚举媒体目录下全部音频文件,对每个文件计算带修改时间的 MD5 摘要,与曲库中已有摘要比对,只对新增/变化文件解析元数据入库;
  2. 增量自动同步:v2.1.0 起(#179)曲库文件变化自动触发同步,无需手动全量扫描;
  3. 摘要去重:同一文件即使被移动到媒体目录的其他位置,凭 MD5 摘要也不会产生重复曲目,被移出目录的曲目由清理步骤自动下架;
  4. 外部元数据: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 首次初始化三步

无论哪种部署形态,服务起来后的首次初始化都是同样的三步:

  1. 登录:用初始管理员账号 admin@admin.com / foobar 登录 Web 界面;
  2. 改密 + 设媒体路径:立即修改管理员密码;在管理设置页确认/修改媒体路径(或启动时用 MEDIA_PATH 环境变量指定);
  3. 触发同步:在设置页触发媒体同步,等待后台任务完成,曲库即出现在首页。

六、适用场景与限制

适合:

  • 个人/家庭私有音乐库(几千到几万首量级)的自托管收听,配合官方移动 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 CandyNavidromeKoelAmpache
GitHub Star(2026-10-28)4.4k24k17k3.8k
实现语言/框架Ruby(Rails 8.1)GoPHP(Laravel)+ Node.jsPHP
许可证MITGPL-3.0MITAGPL-3.0
产品定位极简个人音乐中心(Web + 官方移动 App)音乐专用流媒体,Subsonic 生态为王现代 Web 风格个人音乐站老牌全能型音乐库/流媒体
对外 API自有 /api/v1(官方 App 专用)Subsonic API 完整兼容 + OpenSubsonic自有 JSON APISubsonic 兼容 + Ampache API 双套
第三方客户端生态官方 iOS/Android AppSubsonic 生态数十款 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 功能纵深最大,管理与维护成本也最高。

八、本系列实战篇

九、参考链接