在 CentOS 7 上部署「道理鱼音乐服务器」并解决封面统一难题实录
前言
最近在京东云的一台 CentOS 7 服务器上部署了「道理鱼音乐服务器」(daoliyu-music)。整个过程踩了不少坑:从 FFmpeg 缺库、数据库迁移,到批量修改歌曲封面。这篇文章记录了完整的排查与解决过程,希望能帮到遇到类似问题的朋友。
一、环境说明
- 系统:CentOS 7
- 云服务:京东云
- 数据库:MySQL 8.0 + 后来切换的 SQLite(最终使用 MySQL)
- 音乐目录:
/usr/local/music_player/music - 服务端口:42120
二、安装与基础配置
1. 安装 RPM 包
下载 RPM 包后,使用 yum localinstall 安装:
yum localinstall ./daoliyu-music-server-1.0.3-0001-1.x86_64.rpm
安装成功后,会自动创建 systemd 服务 daoliyu-music.service。
2. 配置防火墙
firewall-cmd --zone=public --add-port=42120/tcp --permanent
firewall-cmd --reload
同时别忘了在京东云控制台的安全组里放行 42120 端口。
3. 启动服务
systemctl start daoliyu-music
systemctl enable daoliyu-music
systemctl status daoliyu-music
三、遇到的第一个大坑:FFmpeg 缺库
启动后播放音乐时报错:“兼容播放没有加载到可播放的音频”。检查发现自带的 FFmpeg 无法运行:
/opt/daoliyu-music/thirdparty/ffmpeg/bin/ffmpeg -version
# 报错:error while loading shared libraries: libmvec.so.1
原因是 CentOS 7 的 GLIBC 版本太旧(2.17),而自带的 FFmpeg 需要更高版本。
解决方案:使用静态编译的 FFmpeg
cd /usr/local
wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz
tar -xvf ffmpeg-release-amd64-static.tar.xz
mv ffmpeg-*-static /usr/local/ffmpeg
然后直接覆盖软件自带的旧版本:
cp /usr/local/ffmpeg/ffmpeg /opt/daoliyu-music/thirdparty/ffmpeg/bin/ffmpeg
cp /usr/local/ffmpeg/ffprobe /opt/daoliyu-music/thirdparty/ffmpeg/bin/ffprobe
chmod +x /opt/daoliyu-music/thirdparty/ffmpeg/bin/ffmpeg
chmod +x /opt/daoliyu-music/thirdparty/ffmpeg/bin/ffprobe
重启服务后,音频播放恢复正常。
四、数据库迁移:从 SQLite 到 MySQL
原本软件默认使用 SQLite,但为了更方便地批量修改封面,决定切换到 MySQL。
1. 创建数据库和用户
CREATE DATABASE daoliyu DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'tk'@'%' IDENTIFIED BY '你的密码';
GRANT ALL PRIVILEGES ON *.* TO 'tk'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
2. 修改配置文件
vi /etc/daoliyu-music/server.env
修改为:
DLY_DB_DRIVER=mysql
DLY_DB_DSN=tk:你的密码@tcp(127.0.0.1:3306)/daoliyu?charset=utf8mb4&parseTime=True&loc=Local
3. 清理残留状态(关键)
这一步非常关键。直接切换数据库时,软件会因为旧的运行状态文件而卡在“系统已完成初始化”界面。需要清理:
systemctl stop daoliyu-music
rm -f /var/lib/daoliyu-music/daoliyu.db*
rm -f /var/lib/daoliyu-music/work.db*
rm -f /var/lib/daoliyu-music/runtime-db.active*
rm -f /var/lib/daoliyu-music/runtime-db.mysql.env
rm -rf /var/lib/daoliyu-music/bootstrap-security
然后重启服务,在浏览器中重新初始化。
五、批量修改歌曲封面(核心需求)
需求:原本有封面的歌曲保持原样,没有封面的歌曲统一设置为一张默认图片。
1. 分析数据库表结构
USE daoliyu;
DESCRIBE tracks;
DESCRIBE albums;
关键字段:
tracks.cover_art_url:封面的网络地址tracks.cover_art_path:封面的本地路径albums.cover_art_url:专辑封面地址
2. 只处理“没有封面”的歌曲
UPDATE tracks
SET cover_art_url = '/assets/default.png', cover_art_path = NULL
WHERE (cover_art_url IS NULL OR cover_art_url = '')
AND (cover_art_path IS NULL OR cover_art_path = '');
同样处理专辑表:
UPDATE albums
SET cover_art_url = '/assets/default.png', cover_art_path = NULL
WHERE (cover_art_url IS NULL OR cover_art_url = '')
AND (cover_art_path IS NULL OR cover_art_path = '');
3. 清缓存并重启
rm -rf /var/lib/daoliyu-music/cover-thumbnails/*
rm -rf /var/cache/daoliyu-music/*
systemctl restart daoliyu-music
最终效果:369 首原本无封面的歌统一显示默认图片,326 首原本有封面的歌保留原样。
六、尝试给音频文件内嵌封面(未成功)
为了在「箭头音乐」等第三方播放器里也能显示封面,尝试用 FFmpeg 批量嵌入图片:
/usr/local/ffmpeg/ffmpeg -i "歌曲.mp3" -i "default.png" \
-map 0:a -map 1:v -c:a copy -c:v mjpeg \
-id3v2_version 3 \
-metadata:s:v title="Album cover" \
-metadata:s:v comment="Cover (front)" \
"输出.mp3" -y
手动执行成功,但批量脚本全部失败。最终发现箭头音乐根本不读内嵌封面,因此放弃了这个方案。
七、经验总结
- CentOS 7 的 GLIBC 版本是硬伤:不要尝试升级系统 GLIBC,直接使用静态编译的 FFmpeg。
- 数据库切换时务必清理残留状态文件:
runtime-db.active、db-shm、db-wal这些文件会卡住初始化流程。 - 批量修改封面优先用 SQL:比逐个修改文件高效得多,且不影响原文件。
- 第三方播放器不读内嵌封面时,不必强求:保留网页端的完美显示即可。
- 安全提醒:数据库 3306 端口不要暴露在公网,建议用安全组限制来源 IP。
八、最终效果
- ✅ 音频播放正常(FFmpeg 静态版解决)
- ✅ 数据库运行在 MySQL 上
- ✅ 网页端封面完美统一
- ✅ 服务开机自启
希望这篇文章能帮到在 CentOS 7 上部署类似服务的朋友。如果你也遇到了 FFmpeg 缺库或数据库切换的问题,欢迎在评论区交流!
参考命令速查:
# 查看服务状态
systemctl status daoliyu-music
# 查看实时日志
journalctl -u daoliyu-music -f
# 体检工具
daoliyu-serverctl doctor
# 备份数据库
mysqldump -u tk -p daoliyu > /root/daoliyu_backup.sql
