MENU

道理鱼音乐部署

October 2, 2025 • Docker

2025-10-02T02:44:41.png

简介

分享一下开发的音乐程序,强不强大不知道,功能有些多,如果感觉不错,记得支持下,目前版本稳定,偶尔细节有个bug理解下,后面会修复,值得现体验下,当然有好的建议,我也会悉心接受,感谢的支持!

道理鱼音乐管理平台

自建 NAS 音乐管理与播放系统,提供媒体扫描、元数据补全、**、收藏与队列管理、自动转码等能力,可通过 Docker 或本地环境快速部署。

项目概述

这是一个全栈音乐管理系统,包含后端API服务器和React前端应用。

项目结构

  • backend/ - Node.js/Express API服务器(TypeScript)
  • frontend/ - React前端应用(TypeScript + Vite)
  • media/ - 媒体文件存储
  • playlists/ - 播放列表数据

功能亮点

  • 媒体扫描:支持多目录配置,自动解析 ID3 元数据、封面、歌词并写入数据库。
  • 智能播放:Web 前端提供队列、收藏、下一首/上一首、音量与进度控制,支持令牌式音频流与 HLS。
  • 账号系统:区分管理员与普通用户,支持注册开关、资料修改、密码变更与头像上传。
  • 收藏体系:曲目、专辑收藏与歌单管理一应俱全,可直接加入播放器队列。
  • 实时通知:内置 WebSocket 网关,后续可扩展扫描与播放的实时反馈。
  • 转码缓存:集成 FFmpeg 实时转码,支持自动生成指定码率的缓存文件并在后台统计与清理。
  • 插件与元数据:插件清单自动识别目录内 manifest,元数据提供方支持启用、优先级配置与第三方源扩展。

版本更新

  • 增加对redis的支持
  • 优化网格模式下的排版问题(太小的分辨率1080P以下懒得适配了)
  • 增加对当前播放列表内歌曲一键添加歌单
  • 增加一键匹配歌手简介
  • 至于扩展方面增加了几个匹配机制,感觉可以根据后台自行调试选择。
  • 优化界面逻辑
  • 修复右侧播放列表因歌曲名称过长导致UI变形
  • 增加播放列表显示效果
  • 增加快捷收藏按键
  • 增加歌曲、艺人、专辑的简单编辑

演示内容

目前已完成

  • 目录入库
  • 歌单按照目录名入库
  • 标签读取和在线匹配机制(建议先使用 音乐标签 给音乐做匹配,大佬的工具,免费好用)
  • 多用户机制
  • 公开歌单其他用户可见
  • 用户收藏机制
  • 声音指纹技术(待验证)
  • 一键匹配歌手信息

后续工作安排

  • 个人喜好推荐算法
  • 尝试加入有声书和MV的板块
  • PC端和安卓客户,只能最后做适配,毕竟独立开发个人能力有限。

以下是0.1.3版本的docker compose,增加最新版标签latest,后期更新会有提示。

由于之前一直是预览(已全部清除),这个版本开始基本是稳定下来了,可以长期使用。

首页

Snipaste_2025-09-24_08-17-56.png

专辑列表

Snipaste_2025-09-24_08-19-26.png

系统设置

Snipaste_2025-09-24_08-20-31.png

默认歌单路径(子文件夹为单位,文件夹名为歌单名)

Snipaste_2025-09-24_08-21-03.png

还有很多就不一一截图了,体验版本,个人时间精力有限,有些细节还没那么完美,至少够用了,后期的话,可能会对接或者开发pc端和安卓端。

docker-compose

开发初心是让自己用着舒服,看着顺眼的,功能基本满足。

以下是docker-compose.yml的内容,只注意中文注释的地方,其他都不用修改

services:
  backend:
    image: msmkls/daoliyu-backend:latest
    container_name: daoliyu-backend
    restart: unless-stopped
    environment:
      DATABASE_PROVIDER: "sqlite"
      DATABASE_URL: "file:/app/data/dev.db"
      APP_PORT: 4000
      ADMIN_DISPLAY_NAME: "${ADMIN_DISPLAY_NAME}"
      ADMIN_EMAIL: "${ADMIN_EMAIL}"
      ADMIN_PASSWORD: "${ADMIN_PASSWORD}"
      LIBRARY_ROOT: "/data/media"
      PLAYLISTS_IMPORT_ROOT: "/data/playlists"
      REGISTRATION_OPEN: "true"
      PLUGINS_DIR: "/plugins"
      ACOUSTID_API_KEY: "${ACOUSTID_API_KEY}"
      LASTFM_API_KEY: "${LASTFM_API_KEY}"
      LASTFM_API_SECRET: "${LASTFM_API_SECRET}"
      SPOTIFY_TOKEN: "${SPOTIFY_TOKEN}"
      SPOTIFY_CLIENT_ID: "${SPOTIFY_CLIENT_ID}"
      SPOTIFY_CLIENT_SECRET: "${SPOTIFY_CLIENT_SECRET}"
      REDIS_URL: "redis://redis:6379/0"
      LOG_LEVEL: "debug"
      DEBUG: "true"
    volumes:
      # 下面冒号左侧是本地数据库文件夹,右侧是容器内路径,不要改动容器内路径
      - ./backend-data:/app/data
      # 下面冒号左侧是本地数据文件夹,右侧是容器内路径,不要改动容器内路径
      - ./backend-storage:/app/storage
      # 下面冒号左侧是本地音乐文件夹,右侧是容器内路径,不要改动容器内路径
      - ./media:/data/media
      # 下面冒号左侧是本地播放列表文件夹,右侧是容器内路径,不要改动容器内路径
      - ./playlists:/data/playlists
      # 下面冒号左侧是本地插件文件夹,右侧是容器内路径,不要改动容器内路径(目前未启用不用动)
      - ./plugins:/plugins
    healthcheck:
      test: ["CMD", "wget", "-qO-", "http://localhost:4000/health"]
      interval: 30s
      timeout: 5s
      retries: 5
  frontend:
    image: msmkls/daoliyu-frontend:latest
    container_name: daoliyu-frontend
    restart: unless-stopped
    depends_on:
      - backend
    ports:
    #  5173是本地访问端口,可以自行修改,8080是容器内端口,不要改动
      - "5173:8080"
  redis:
    image: redis:7-alpine
    container_name: daoliyu-redis
    restart: unless-stopped
    command: ["redis-server", "--appendonly", "yes"]
    volumes:
      - redis_data:/data
volumes:
  redis_data:

.env

为了安全整洁在docker-compose.yml 同目录下创建文件存储账号等敏感信息的 .env 文件

# 管理员用户显示名称
ADMIN_DISPLAY_NAME="Administrator"

# 管理员用户邮箱
ADMIN_EMAIL="admin@example.com"

# 管理员用户密码 (请务必修改为强密码)
ADMIN_PASSWORD="ChangeMe123"

# AcoustID API 密钥,用于音乐识别
ACOUSTID_API_KEY=""

# Last.fm API 密钥,用于获取音乐元数据
LASTFM_API_KEY=""

# Last.fm API 密钥的秘密
LASTFM_API_SECRET=""

# Spotify Token,用于 Spotify 集成 (如果使用)
SPOTIFY_TOKEN=""

# Spotify 客户端 ID
SPOTIFY_CLIENT_ID=""

# Spotify 客户端秘密
SPOTIFY_CLIENT_SECRET=""

感谢

最后感谢大家的支持,以及三位打赏的网友,感谢!

由于支持多用户登录和便于部署,供nas实用为主,严禁未经本人书面允许,从事商业行为。