193 lines
8.6 KiB
Markdown
193 lines
8.6 KiB
Markdown
---
|
||
layout : post
|
||
title : "Koel:一种叫不停的鸟儿"
|
||
subtitle : "Just cannot stop"
|
||
date : 2022-10-16 12:30:23
|
||
author : "Manford Fan"
|
||
catalog : false
|
||
header-img : "img/post-bg-universe.jpg"
|
||
tags :
|
||
- Music
|
||
- Server
|
||
- Koel
|
||
---
|
||
|
||
其实一直都在探寻自建音乐库方案,目前实现形式有很多了,从最开始的[mStream](https://blog.rustle.cc/2022/05/15/mstream/),到后来的通过[cloudreve](https://blog.rustle.cc/2022/06/12/cloudreve/)的webdav挂载到Fireball等APP,最近测试的[Navidrome](https://blog.rustle.cc/2022/10/02/navidrome/),以及本篇的主题[Koel](https://blog.rustle.cc/2022/10/16/koel/),感觉差不多可以给这个音乐库主题画上一个句号了。[Navidrome](https://www.navidrome.org/)做的已经相当好了,如果不考虑颜值,我更愿意用它,因为相比于[Koel](https://koel.dev/),前者配置更简单,更易用,但是显然Koel的颜值抵消了它配置复杂性带来的困扰,以至于,我还是把它搞定了。
|
||
|
||
## 一、Koel简介
|
||
|
||
如下是Koel的开发者描述这款应用的来源,很有意思,再一次证明了,生产力来源于需求。
|
||
|
||

|
||
|
||
## 二、配置安装
|
||
|
||
这一部分当然是主要参考网站主页,https://docs.koel.dev/,这里详尽的罗列了安装Koel的三种方法。安装之前需要一些必要条件和依赖,这里就不罗列了,可以参考网站主页,其实就是php,openssl,mysql or mariaDB,如果是源码安装的话还需要nodejs,git,composer等等的一些东西。我自己用的是第一种,因为对于我而言,这种方式升级方便,容易维护(菜是原罪.gif)。
|
||
|
||
#### 1. 使用预编译文件
|
||
|
||
先到[release](https://github.com/koel/koel/releases)页面下载最新的文件,将文件解压放到你想安装的目录,,然后执行如下命令,安装好之后第一件事是修改密码,详见第三部分调优测试中的第四点——有用的命令行工具,还有就是,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](https://github.com/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`工具](https://docs.koel.dev/watch.html)监控媒体文件夹内容变动的方法,个人感觉不是那么好用,所以自己写了一个监控脚本,搭配`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](https://github.com/koel/koel/issues),基本上能遇到的,都能在那里找到,不想当吸血鬼,但是还是期望开发者能修目前存在的各种bug。
|
||
|
||
1. 移动端支持的不好,需要一个免费的APP
|
||
2. 移动网页端播放体验很不好
|
||
3. 歌词不能滚动跟随滚动
|
||
4. 缺少在线削刮器
|
||
5. 没有定时关闭功能
|
||
6. 下一首歌曲预取(不完整的替代方案:设置mp3文件缓存) -- 发现有预取...
|
||
7. Content-disposition响应头内容如果是中文,会乱码,开发者也没有意向修改...
|
||
|
||
## 五、参考文档
|
||
|
||
- [Koel官方主页](https://koel.dev/)
|
||
- [Keol Github](https://github.com/koel/koel)
|
||
|
||
|