其实一直都在探寻自建音乐库方案,目前实现形式有很多了,从最开始的mStream,到后来的通过cloudreve的webdav挂载到Fireball等APP,最近测试的Navidrome,以及本篇的主题Koel,感觉差不多可以给这个音乐库主题画上一个句号了。Navidrome做的已经相当好了,如果不考虑颜值,我更愿意用它,因为相比于Koel,前者配置更简单,更易用,但是显然Koel的颜值抵消了它配置复杂性带来的困扰,以至于,我还是把它搞定了。
如下是Koel的开发者描述这款应用的来源,很有意思,再一次证明了,生产力来源于需求。
这一部分当然是主要参考网站主页,https://docs.koel.dev/,这里详尽的罗列了安装Koel的三种方法。安装之前需要一些必要条件和依赖,这里就不罗列了,可以参考网站主页,其实就是php,openssl,mysql or mariaDB,如果是源码安装的话还需要nodejs,git,composer等等的一些东西。我自己用的是第一种,因为对于我而言,这种方式升级方便,容易维护(菜是原罪.gif)。
先到release页面下载最新的文件,将文件解压放到你想安装的目录,,然后执行如下命令,安装好之后第一件事是修改密码,详见第三部分调优测试中的第四点——有用的命令行工具,还有就是,koel目录的所有者需要设定成www-data
:
bashphp artisan koel:init --no-assets # Populate necessary configurations during the process
php artisan serve
我曾尝试使用这种方法来编译安装,但是对php不是很熟悉,期间出了很多报错,所以就作罢,如下是官方的安装命令:
bashcd <KOEL_ROOT_DIR>
git clone https://github.com/koel/koel.git .
git checkout latest # Check out the latest version at https://github.com/koel/koel/releases
composer install
php artisan koel:init # Populate necessary configurations during the process
php artisan serve
之前也有提到过,我比较喜欢源码安装,再不行就预编译好的,不太喜欢封装(自洽的解释是,对我不透明,我不喜欢 ——笑,说的好像我看得懂源码似的,但却是源码安装的可配置性更强),暂时不想研究docker怎么玩,仅仅是mark一下,最后放一张安装好可以服务的web页面吧~
Koel has an official Docker image: koel/docker
如果之前有用过php相关的应用,应该是已经修改了的,可以在/ect/php
目录下搜索该文件,基本上是/etc/php/8.0/cli/php.ini
和/etc/php/8.0/fpm/php.ini
这两个文件,修改如下:
phpmemory_limit = 1024M
post_max_size = 4096M
upload_max_filesize = 4096M
max_execution_time = 3600;
max_input_time = 3600;
.env
修改Koel根目录下的.env
文件,这个文件很重要,包含了所有的配置选项,当出现在web ui上修改了媒体文件存储路径的时候就可以在这个文件中修改,如下是比较重要的一些配置项,是一定要设置且一定要设置对的,尤其是数据库相关,SCOUT_DRIVER
以及FFMPEG_PATH
。
phpDB_CONNECTION=
DB_HOST=
DB_PORT=
DB_DATABASE=
DB_USERNAME=
DB_PASSWORD=
MEDIA_PATH=/opt/media/music
APP_MAX_SCAN_TIME=600
MEMORY_LIMIT=
STREAMING_METHOD=php
SCOUT_DRIVER=database
FFMPEG_PATH=/usr/bin/ffmpeg
虽然官方提供了使用inotify
工具监控媒体文件夹内容变动的方法,个人感觉不是那么好用,所以自己写了一个监控脚本,搭配cron
服务,完美实现当有媒体文件发生变更(仅包括数量的增减以及文件名的变化,当然也可以做md5值校验等更精细化的对比,但是没必要)时,1分钟内完成媒体文件扫描。
bash[[ ! -e /tmp/files_now ]] && touch /tmp/files_now
[[ ! -e /tmp/files_pre_60s ]] && touch /tmp/files_pre_60s
success_flg=1
ols -aR | grep -E "*.(mp3|flac|opus|aac|ogg|m4a)" | sort
ls -aR /opt/media/music/ | grep -E "*.(mp3|flac|opus|aac|ogg|m4a)" | sort > /tmp/files_now
diff /tmp/files_now /tmp/files_pre_60s >> now_pre.diff
if [[ $? -ne 0 ]]; then
chown -R www-data:www-data /opt/meida/music
for i in `seq 20`; do
php /opt/source-code/koel/artisan koel:sync > /dev/null
if [[ $? -eq 0 ]]; then
php /opt/source-code/koel/artisan koel:sync >> /tmp/now_pre.diff
success_flg=0
break
fi
sleep 2
done
[[ success_flg -eq 1 ]] && echo 'Failed scanning the media dir, need processing that by hand.' >> /tmp/now_pre.diff
echo -e "Happening @ $(date)\n" >> /tmp/now_pre.diff
fi
cp /tmp/files_now /tmp/files_pre_60s
## crontab内容
* * * * * /usr/bin/bash /path/to/scripts/koel_update.sh
部署好所有服务之后,页面上的功能基本已经够用,但是正如上面第三点的需求,在系统下,还是需要命令的帮助,可以使用php artisan list
来获取所有可用的命令,其中如下命令是经常用到的:
bashlist List commands
serve Serve the application on the PHP development server
koel:admin:change-password Change a user's password
koel:init Install or upgrade Koel
koel:prune Remove empty artists and albums
koel:sync Sync songs found in configured directory against the database.
# 使用方法:
php artisan + 如上命令
因为程序服务是国外的程序员开发的,头像他好像是使用了一个在线的网站服务,可以随机的分配一个头像,但是这个网站国内无法访问,只能自己动手,把相关的链接替换成一个可以访问的地址。文件是/app/Models/User.php
:
text替换 fn () => sprintf('https://www.gravatar.com/avatar/%s?s=192&d=robohash', md5($this->email)) 为 fn () => sprintf('https://rustle.cc/assets/img/logo.jpg', md5($this->email))
出于职业习惯,每当部署好一个服务之后,我都会习惯性的看下所有情况下访问网页的状态码,发现服务找不到这个文件。去根[public]目录下一番探索之后,返现了该文件的模板,修改好之后就OK了。
安装包的根目录下提供了一个nginx的示例配置文件,修改一下就能用,如果需要支持flac文件格式的音频,还需要额外配置一下响应头部。
nginx# 仅是配置支持flac文件的部分,其余部分参考源码 location /media/ { internal; # alias $upstream_http_x_media_root; alias /opt/media/music; if ($request_filename ~ "^.*\/(.+\.(flac))$"){ set $fname $1; add_header Content-Disposition 'inline; filename="$fname"'; add_header Content-Type 'audio/mpeg'; } access_log logs/koel.access.log main; #error_log /var/log/nginx/koel.error.log; }
关于待改进以及目前的bug,最好的地方是去看GitHub上的Issue,基本上能遇到的,都能在那里找到,不想当吸血鬼,但是还是期望开发者能修目前存在的各种bug。
本文作者:Manford Fan
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!