一个零依赖的网页音乐播放器,单容器部署,不需要数据库、不需要 npm install。
A zero-dependency web music player with automatic LRC lyrics and album cover matching. Single container + two volumes. No database, no reverse-engineering needed.
主要能力
音乐播放器-latest-<arch>.apk 这种文件名),所以拉下来打开 /app 就能直接下载,换客户端版本也不用改地址;版本号与校验值跟着客户端编译自动更新。也可以在「管理后台 → App 下载」里改成自己的地址(改过就以你的配置为准),或把 apk 放进挂载的 downloads/ 目录/api/img 代理下发(服务端带正确 Referer 取图并缓存 6 小时,带 SSRF 防护);酷我 / 酷狗搜索逐条补封面、咪咕相对路径补域名、QQ 搜索软限流自动重试——热榜 / 官方歌单 / 五平台搜索的专辑封面不再一片空白歌手 - 歌名.mp3 自动识别歌名与歌手,支持批量上传| 架构 | 适用 |
|---|---|
linux/amd64 | x86_64 服务器、群晖 / 威联通 / unRAID 等绝大多数 NAS |
linux/arm64 | Apple Silicon、ARM NAS、树莓派 |
拉取时会自动选择匹配的架构,不用手动指定。
# 1. 建两个目录存数据(路径随意,这里用当前目录下的 music-player)
mkdir -p music-player/data music-player/uploads
# 2. 启动
docker run -d \
--name music-player \
--restart unless-stopped \
-p 5177:5177 \
-e HOST=0.0.0.0 \
-e TZ=Asia/Shanghai \
-e MAX_UPLOAD_MB=512 \
-e SEED_DEMO=0 \
-v "$(pwd)/music-player/data:/data" \
-v "$(pwd)/music-player/uploads:/uploads" \
hnxgf/music-player:latest
然后:
http://你的服务器IP:5177/http://你的服务器IP:5177/admin.html# compose.yaml
services:
music-player:
image: hnxgf/music-player:latest
container_name: music-player
restart: unless-stopped
ports:
- "5177:5177"
environment:
HOST: 0.0.0.0
TZ: Asia/Shanghai
MAX_UPLOAD_MB: "512"
SEED_DEMO: "0"
# 前面有反向代理时打开,登录限流才会按真实客户端 IP 计数
# TRUST_PROXY: "1"
volumes:
- ./data:/data
- ./uploads:/uploads
# NAS 上报 EACCES 时打开这行,改成你实际的 uid:gid(用 id 用户名 查)
# user: "1026:100"
docker compose up -d
docker compose logs -f # 看到「🎵 音乐播放器 v1.0.0 已启动」即成功
群晖 DSM(Container Manager)
hnxgf/music-player → 下载 latest5177 → 容器 5177<共享文件夹>/docker/music-player/data → 挂载路径 /data<共享文件夹>/docker/music-player/uploads → 挂载路径 /uploadsTZ=Asia/Shanghai、MAX_UPLOAD_MB=512、SEED_DEMO=0http://群晖IP:5177/威联通 QNAP(Container Station)
hnxgf/music-player:latest5177,绑定装载两个目录到 /data 与 /uploads,环境变量同上unRAID:Docker → Add Container,Repository 填 hnxgf/music-player:latest,加两个 Path(/data、/uploads)和一个 Port(5177)。
| 变量 | 默认值 | 说明 |
|---|---|---|
HOST | 0.0.0.0(镜像内置) | 监听地址,容器里必须是 0.0.0.0 |
PORT | 5177 | 监听端口 |
TZ | 系统时区 | 建议 Asia/Shanghai,影响后台日期显示 |
DATA_DIR | /data(镜像内置) | 数据目录,存 db.json |
UPLOAD_DIR | /uploads(镜像内置) | 上传目录(音频、歌词、封面) |
MAX_UPLOAD_MB | 512 | 单文件上传上限(MB) |
SEED_DEMO | 开启 | 设 0 关闭首次启动注入的示例歌单 |
TRUST_PROXY | 关闭 | 前面有 Nginx / 反代时设 1 |
LOGIN_MAX_FAIL | 8 | 同一来源 10 分钟内允许的登录失败次数 |
健康检查接口 GET /api/health,返回 {"ok":true,"version":"1.0.0",...},可直接用于监控探活(镜像已内置 HEALTHCHECK)。
只需要备份两个目录,复制走就是完整备份:
| 容器内路径 | 内容 |
|---|---|
/data | db.json:歌单、歌曲、账号、会话 |
/uploads | 音频、歌词(lrc_*.lrc)、专辑封面(covers/) |
升级
docker pull hnxgf/music-player:latest
docker compose up -d # 或 docker stop music-player && docker rm music-player && 重新 run
升级不会动 /data 和 /uploads,歌单和音频都还在。生产环境建议把 :latest 固定成具体版本号(如 :1.0.0),避免哪天升级出意外。
想用域名 + HTTPS 访问,在前面挂一层 Nginx:
server {
listen 443 ssl;
server_name music.example.com;
# 上传大文件必须放开,否则会 413
client_max_body_size 512m;
location / {
proxy_pass http://127.0.0.1:5177;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 音频拖动进度条依赖 Range,必须透传
proxy_set_header Range $http_range;
proxy_set_header If-Range $http_if_range;
proxy_buffering off;
}
}
配完记得给容器加 TRUST_PROXY=1。
建议用 HTTPS:浏览器对 Media Session(车载歌词)、剪贴板一键复制、屏幕常亮这些能力要求安全上下文。
Q:启动后访问不了?
看日志 docker compose logs -f;确认端口映射了;确认 HOST=0.0.0.0。
Q:报 EACCES: permission denied?
容器里的进程是 uid 1000。二选一:
# 把目录交给容器用户
sudo chown -R 1000:1000 /path/to/data /path/to/uploads
# 或者让容器用你的身份跑(推荐,文件属主更好管理)
# 在 docker run 里加 --user 1026:100 (群晖 admin 常见)
# --user 1000:1000(威联通常见)
Q:上传大文件报 413?
反代的 client_max_body_size 没放开,同时确认 MAX_UPLOAD_MB 够大。
Q:歌词 / 封面匹配不到? 歌曲的歌名、歌手要和主流音乐库一致。冷门曲目可能各源都没有。容器需要能访问外网(网易云 / LRCLIB / 酷我 / iTunes / MusicBrainz);纯内网环境不影响已有数据,只是匹配功能不可用。后台可以点「匹配歌词」「找封面」查看候选手动挑。
Q:APE / WMA 放不出来? 浏览器内核本身不支持(WebM/MP3/FLAC/WAV/AAC/OGG 才能直放)。上传时界面会明确提示,转成 MP3 或 FLAC 即可。
Q:忘记后台密码?
删掉 /data/db.json 后重启会重建数据库,但歌单也会一起丢。更好的做法是改密码前先备份 db.json。
Q:磁盘占用越来越大? 后台「歌词库」按钮 → 看「未使用文件」→ 一键清理(只删没有任何歌曲引用的音频;歌词属于共享库,不会被删)。 后台「封面库」弹窗 → 一键清除未使用的封面(只删没有歌曲引用的封面);「歌手头像」面板可清理歌手已不在歌单里的头像。
admin123TRUST_PROXY=1/data内置的安全措施:安全响应头(CSP / nosniff / frame-options)、上传后缀白名单、路径穿越防护、防 SSRF、登录失败限流、上传中断垃圾清理、数据原子落盘(先写临时文件再改名)。
Content type
Image
Digest
sha256:3661956e8…
Size
106.7 MB
Last updated
4 days ago
docker pull hnxgf/music-player