编辑
2022-10-16
Application
00
请注意,本文编写于 750 天前,最后修改于 417 天前,其中某些信息可能已经过时。

目录

一、Koel简介
二、配置安装
1. 使用预编译文件
2. 使用源码编译
3. 使用docker安装部署
三、调优测试
1. 调整php.ini文件相关参数
2. 配置文件.env
3. 监控媒体文件的变化
4. 有用的命令行工具
5. 修改用户头像
6. manifst.json 404问题
7. nginx 配置
四、遗留问题 || 需要改进
五、参考文档

其实一直都在探寻自建音乐库方案,目前实现形式有很多了,从最开始的mStream,到后来的通过cloudreve的webdav挂载到Fireball等APP,最近测试的Navidrome,以及本篇的主题Koel,感觉差不多可以给这个音乐库主题画上一个句号了。Navidrome做的已经相当好了,如果不考虑颜值,我更愿意用它,因为相比于Koel,前者配置更简单,更易用,但是显然Koel的颜值抵消了它配置复杂性带来的困扰,以至于,我还是把它搞定了。

一、Koel简介

如下是Koel的开发者描述这款应用的来源,很有意思,再一次证明了,生产力来源于需求。

二、配置安装

这一部分当然是主要参考网站主页,https://docs.koel.dev/,这里详尽的罗列了安装Koel的三种方法。安装之前需要一些必要条件和依赖,这里就不罗列了,可以参考网站主页,其实就是php,openssl,mysql or mariaDB,如果是源码安装的话还需要nodejs,git,composer等等的一些东西。我自己用的是第一种,因为对于我而言,这种方式升级方便,容易维护(菜是原罪.gif)。

1. 使用预编译文件

先到release页面下载最新的文件,将文件解压放到你想安装的目录,,然后执行如下命令,安装好之后第一件事是修改密码,详见第三部分调优测试中的第四点——有用的命令行工具,还有就是,koel目录的所有者需要设定成www-data

bash
php artisan koel:init --no-assets # Populate necessary configurations during the process php artisan serve

2. 使用源码编译

我曾尝试使用这种方法来编译安装,但是对php不是很熟悉,期间出了很多报错,所以就作罢,如下是官方的安装命令:

bash
cd <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

3. 使用docker安装部署

之前也有提到过,我比较喜欢源码安装,再不行就预编译好的,不太喜欢封装(自洽的解释是,对我不透明,我不喜欢 ——笑,说的好像我看得懂源码似的,但却是源码安装的可配置性更强),暂时不想研究docker怎么玩,仅仅是mark一下,最后放一张安装好可以服务的web页面吧~

Koel has an official Docker image: koel/docker

三、调优测试

1. 调整php.ini文件相关参数

如果之前有用过php相关的应用,应该是已经修改了的,可以在/ect/php目录下搜索该文件,基本上是/etc/php/8.0/cli/php.ini/etc/php/8.0/fpm/php.ini这两个文件,修改如下:

php
memory_limit = 1024M post_max_size = 4096M upload_max_filesize = 4096M max_execution_time = 3600; max_input_time = 3600;

2. 配置文件.env

修改Koel根目录下的.env文件,这个文件很重要,包含了所有的配置选项,当出现在web ui上修改了媒体文件存储路径的时候就可以在这个文件中修改,如下是比较重要的一些配置项,是一定要设置且一定要设置对的,尤其是数据库相关,SCOUT_DRIVER以及FFMPEG_PATH

php
DB_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

3. 监控媒体文件的变化

虽然官方提供了使用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

4. 有用的命令行工具

部署好所有服务之后,页面上的功能基本已经够用,但是正如上面第三点的需求,在系统下,还是需要命令的帮助,可以使用php artisan list来获取所有可用的命令,其中如下命令是经常用到的:

bash
list 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 + 如上命令

5. 修改用户头像

因为程序服务是国外的程序员开发的,头像他好像是使用了一个在线的网站服务,可以随机的分配一个头像,但是这个网站国内无法访问,只能自己动手,把相关的链接替换成一个可以访问的地址。文件是/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))

6. manifst.json 404问题

出于职业习惯,每当部署好一个服务之后,我都会习惯性的看下所有情况下访问网页的状态码,发现服务找不到这个文件。去根[public]目录下一番探索之后,返现了该文件的模板,修改好之后就OK了。

7. nginx 配置

安装包的根目录下提供了一个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。

  1. 移动端支持的不好,需要一个免费的APP
  2. 移动网页端播放体验很不好
  3. 歌词不能滚动跟随滚动
  4. 缺少在线削刮器
  5. 没有定时关闭功能
  6. 下一首歌曲预取(不完整的替代方案:设置mp3文件缓存) -- 发现有预取...
  7. Content-disposition响应头内容如果是中文,会乱码,开发者也没有意向修改...

五、参考文档

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Manford Fan

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!