道理鱼音乐管理平台
自建 NAS 音乐管理与播放系统,提供媒体扫描、元数据补全、在线播放、收藏与队列管理、自动转码等能力,可通过 Docker 或本地环境快速部署。
功能亮点
- 媒体扫描:支持多目录配置,自动解析 ID3 元数据、封面、歌词并写入数据库。
- 智能播放:Web 前端提供队列、收藏、下一首/上一首、音量与进度控制,支持令牌式音频流与 HLS。
- 账号系统:区分管理员与普通用户,支持注册开关、资料修改、密码变更与头像上传。
- 收藏体系:曲目、专辑收藏与歌单管理一应俱全,可直接加入播放器队列。
- 实时通知:内置 WebSocket 网关,后续可扩展扫描与播放的实时反馈。
- 转码缓存:集成 FFmpeg 实时转码,支持自动生成指定码率的缓存文件并在后台统计与清理。
- 插件与元数据:插件清单自动识别目录内 manifest,元数据提供方支持启用、优先级配置与第三方源扩展。
目录结构
.
├── backend/ # Node.js + Express + Prisma API 服务
│ ├── src/ # 路由、服务、扫描、转码等核心代码
│ ├── prisma/ # 数据模型与迁移
│ └── Dockerfile # 后端镜像构建配置
├── frontend/ # React + Vite 前端应用(生产镜像内置 Nginx)
│ ├── src/ # 页面、组件、状态与 API 封装
│ └── nginx.conf # 生产部署反代配置(容器已包含)
├── media/ # 默认本地媒体目录(可自定义)
├── plugins/ # 插件清单目录
├── playlists/ # 歌单导入目录
├── docker-compose.yml # 一键编排示例
└── README.md
使用 Docker Compose 部署(推荐)
Docker Compose 已包含前后端两个服务与持久化卷,开箱即用。
1) 准备目录(第一次使用会自动创建)
- 媒体:./media
- 歌单导入:./playlists
- 插件:./plugins
2) 如需修改对外端口(避免与本地开发端口冲突),可使用覆盖文件:
- 编辑或复制 docker-compose.override.yml,例如:
services:
backend:
ports:
- "4000:4000"
frontend:
ports:
- "5173:80"
3) 构建并启动(后台运行)
docker compose build
docker compose up -d
4) 访问
- 前端:http://localhost:5173(或你在 override 中配置的端口)
- 后端:http://localhost:4000
5) 常用运维命令
# 查看运行状态与日志
docker compose ps
docker compose logs -f backend
docker compose logs -f frontend
# 重启/停止
docker compose restart
docker compose stop
# 下线并删除容器(保留数据卷)
docker compose down
# 下线并删除容器 + 数据卷(谨慎)
docker compose down -v
6) 升级与变更
git pull
# 任选其一
docker compose pull && docker compose up -d # 若有远程镜像
docker compose build --no-cache && docker compose up -d
7) 自定义环境变量与挂载
docker-compose.yml 中预置了常用项(可按需调整):
backend.environment
- DATABASE_URL: "file:/app/data/dev.db"(SQLite 路径,生产环境请使用容器卷持久化)
- APP_PORT: 4000
- ADMIN_DISPLAY_NAME: "Administrator"
- ADMIN_EMAIL: "admin@example.com"
- ADMIN_PASSWORD: "ChangeMe123"
- LIBRARY_ROOT: "/data/media"(容器内扫描目录)
- PLAYLISTS_IMPORT_ROOT: "/data/playlists"
- REGISTRATION_OPEN: "true"
backend.volumes
- backend_data:/app/data (数据库文件与迁移状态)
- backend_storage:/app/storage (转码缓存、封面等)
- ./media:/data/media
- ./playlists:/data/playlists
- ./plugins:/app/plugins
提示:Windows/macOS 请确保 Docker Desktop 已开启对应目录的文件共享权限。
使用 Docker(单机容器)部署
如果不使用 Compose,也可手动运行两个容器。注意:前端容器内的 Nginx 默认把 API 反代到名为 backend 的主机,因此建议把后端容器命名为 backend,并让两个容器加入同一自定义网络。
1) 构建镜像
docker build -t daoliyu-backend ./backend
docker build -t daoliyu-frontend ./frontend
2) 创建网络
docker network create daoliyu_net
3) 运行后端(命名为 backend 以便前端反代)
docker run -d --name backend --network daoliyu_net \
-p 4000:4000 \
-e DATABASE_URL="file:/app/data/dev.db" \
-e APP_PORT=4000 \
-e ADMIN_DISPLAY_NAME="Administrator" \
-e ADMIN_EMAIL="admin@example.com" \
-e ADMIN_PASSWORD="ChangeMe123" \
-e LIBRARY_ROOT="/data/media" \
-e PLAYLISTS_IMPORT_ROOT="/data/playlists" \
-e REGISTRATION_OPEN="true" \
-v daoliyu_db:/app/data \
-v daoliyu_storage:/app/storage \
-v "%cd%/media":/data/media \
-v "%cd%/playlists":/data/playlists \
-v "%cd%/plugins":/app/plugins \
daoliyu-backend
4) 运行前端
docker run -d --name daoliyu-frontend --network daoliyu_net \
-p 5173:80 \
daoliyu-frontend
完成后访问 http://localhost:5173。
欢迎友情赞助支持