NAS部署SqMusic,免费下无损,打造私人音乐库

项目地址
https://github.com/59799517/simple_sq_music_plus

项目特色

  • 🎯 聚合多平台音源,搜歌、试听、下载
  • 🎵 支持无损格式(FLAC、APE)和高码率MP3(320kbps),按需选码率
  • 🏷️ 自动整理成「歌手/专辑/曲目」目录结构,写入ID3标签、封面、歌词
  • 🎬 下载完直接被绿联自带的「音乐」、Emby、Jellyfin,道理鱼等识别
  • 🔌 支持填入平台Cookie同步自己的会员歌单
  • 📁 目录模板支持自定义,老司机还能用SpEL表达式玩花活

快速开始

项目需要三个容器:

sqmusic_main主服务
sqmusic_webWEB服务
mysql数据库

部署步骤:

  • 先在文件管理里建一个目录,比如/volume1/docker/sqmusic
  • 打开Docker应用 → 项目→ 创建
  • 项目名填 sqmusic(自己起),路径选刚才建的 sqmusic 文件夹
  • Compose配置,把下面代码粘进去

注意:
1.映射的音乐目录改成你自己的,这个是存储下载的音乐的路径
_ volumes:_
_ # 将宿主机的/music目录挂载到容器内的音乐目录_
_ - /volume1/音乐:/music_
2.MySQL 5.7 启动比较慢,第一次如果报”连不上数据库”,多启动几次

docker-compose如下:

version: '3.8'
services:
  # 主应用服务:sqmusic_main
  sqmusic_main:
    # 使用的镜像,来自阿里云仓库
    image: registry.cn-hangzhou.aliyuncs.com/sqdockler/simple_sq_music_plus:v3.0.28
    container_name: sqmusic_main  # 容器名称
    environment:
      - DB_IP=mysql  # 数据库IP地址,指向mysql服务
      - DB_PORT=3306  # 数据库端口
      - DB_NAME=sqmusicv3  # 数据库名称
      - DB_USERNAME=root  # 数据库用户名
      - DB_PASSWORD=sqmusicv3password  # 数据库密码
    volumes:
      # 将宿主机的/music目录挂载到容器内的音乐目录
      - /volume1/音乐:/music
    depends_on:
      # 确保mysql服务在启动此容器之前已准备好并处于健康状态
      mysql:
        condition: service_healthy
    networks:
      - sq-app-network  # 使用指定的网络
    expose:
      - "8099"  # 仅暴露端口8099给其它容器,不映射到宿主机
    restart: always  # 容器崩溃后自动重启
  # Web前端服务:sqmusic_web
  sqmusic_web:
    # 使用的镜像,来自阿里云仓库
    image: registry.cn-hangzhou.aliyuncs.com/sqdockler/simple_sq_music_plus_web:v3.0.15
    container_name: sqmusic_web  # 容器名称
    ports:
      # 将容器的80端口映射到宿主机的8096端口
      - "8096:80"
    networks:
      - sq-app-network  # 使用指定的网络
    depends_on:
      # 确保sqmusic_main服务在启动此容器之前已启动
      - sqmusic_main
    restart: always  # 容器崩溃后自动重启
  # 数据库服务:mysql
  mysql:
    # 使用的MySQL镜像版本5.7
    image: docker.1ms.run/mysql:5.7
    container_name: sqmusic_mysql  # 容器名称
    environment:
      # 设置数据库的root密码
      MYSQL_ROOT_PASSWORD: sqmusicv3password
      # 设置数据库名称
      MYSQL_DATABASE: sqmusicv3
    volumes:
      # 将宿主机的/mysql_data目录挂载到容器内的/var/lib/mysql目录,存储数据库数据
      - ./mysql_data:/var/lib/mysql
      # 可以取消下面注释来使用Docker卷来持久化数据
      # - sqmusic-db:/var/lib/mysql
    networks:
      - sq-app-network  # 使用指定的网络
    healthcheck:
      # 检查MySQL服务是否健康,尝试ping数据库
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s  # 每10秒检查一次
      timeout: 5s  # 每次检查最多等5秒
      retries: 5  # 重试5次
    restart: always  # 容器崩溃后自动重启
# 网络配置
networks:
  sq-app-network:
    driver: bridge  # 使用bridge驱动,适合容器之间的通信

部署完成以后,浏览器访问_ _http://NAS_IP:8096

  • 默认账号:admin
  • 默认密码:admin

点击右上角【设置】,可以填写相关信息,一些音乐平台的cookie需要在这个页面填写。

点开某音乐平台,按F12进入开发者模式,选择【Network】,刷新该音乐平台的页面,随便点某个项目,在右边找到【Cookie】,复制请求头里的 Cookie。

接着返回设置,点击对应的音乐平台,找到【XX音乐用户的信息】,点击修改,然后将上方的cookie粘贴进去。

设置完成后,就可以搜索音乐进行下载,点「同步歌单」也能把你收藏的几百首歌全拉下来

自定义目录模板(高级)

下载歌曲默认目录是「歌手/专辑/歌曲」,在「设置」→「下载模板」里可以改。模板支持变量:

变量含义
${musicName}歌曲名
${artists}全部歌手
${artist}主要歌手(仅第一个)
${album}专辑名
${albumYear}专辑年份

比如改成 ${albumYear}/${artist}/${album}/${musicName} 就是「年份/歌手/专辑/歌曲」四级结构,方便按年代听歌。
再狠一点,项目还支持SpEL表达式(Spring表达式语言),能在模板里写 if/else/三元/方法调用

常见问题

为什么我设置完了,显示下载成功,文件夹里没有音乐文件

在 Docker Compose 的 volumes 配置项中,冒号 : 是一个标准的语法分隔符,用来区分“宿主机路径”和“容器内路径”。
它的标准格式是:
- 宿主机路径:容器内路径
具体到你的例子
代码行:- /volume1/音乐:/music
冒号左边 (/volume1/音乐):这是宿主机(也就是你的 NAS 或服务器)上的实际文件夹路径。这里存放着你真实的音乐文件。
冒号右边 (/music):这是容器内部(sqmusic_main 这个软件运行环境里)的路径。
冒号的作用:它告诉 Docker,“请把左边的文件夹‘映射’或‘挂载’到右边的位置”。
通俗解释:
这就好比给容器开了一扇“窗户”。虽然容器是一个独立的隔离环境,但通过这个冒号定义的映射,容器里的程序(Simple SQ Music Plus)就能直接读取到你 NAS 硬盘里 /volume1/音乐 文件夹下的所有歌曲,而不用把文件复制进容器里。
总结
所以,在你之前的提问中,: / 并不是一个整体符号,而是冒号(作为映射分隔符)紧挨着斜杠(作为容器内路径的开头)。
正确写法:/volume1/音乐:/music (中间没有空格,或者空格不影响解析,关键是那个冒号)。
意思:把 NAS 里的 /volume1/音乐 目录,挂载到容器里的 /music 目录。