原来主要用网易云音乐听歌,但现在越用越觉得不爽,不充vip很多歌不让听;消息推送乱七八糟;安卓端的开屏广告,关闭按钮玩捉迷藏;应用越来越大,功能却找不到了。


于是打算在vps上自建音乐服务器,这样和推送和广告就绝缘了,功能也专一,纯粹用来听歌。经过一番查询对比,看上去koel的界面比较好看,决定用koel。从官方页面(https://docs.koel.dev/)上看,似乎支持mac,pc,mobile,tablet等(实际上只支持浏览器,这有点虚假宣传暗示的意思)。


官方的安装教程是php裸奔(php serve),这在开发服还算合理,用在生产服是不合适的;而且需要安装一堆依赖,包括yarn,nodejs,数据库之类,其中的一些包在国内比较难搞,需要切镜像等。

docker安装只有社区维护,在docker hub上下载较多的有https://hub.docker.com/r/hyzual/koelhttps://hub.docker.com/r/0xcaff/koel等。容器里面都包含了web服务器(apache),但这对我是不合适的,因为我已经用了多个php-fpm容器(wordpress,nextcloud),和nginx容器,我不太想服务器上跑超过一个web服务器的容器。

只能自己动手,做一个koel php-fpm的容器,主要参考hyzual/koel改写。其中做的修改主要有:

  1. 页面路径从/var/www/html改到/var/www/koel,这样是为了nginx容器挂载时和别的php-fpm页面不冲突
  2. 文件流传输从x-sendfile改成x-accel-redirect,因为使用nginx做web服务器。x-sendfile是apache的功能,x-accel-redirect是nginx的功能。

具体的Dockerfile见 https://github.com/cyh-ustc/docker-koel-fpm


使用koel-fpm容器部署

构建容器或直接拉取容器

docker pull cyhustc/koel:fpm
docker build -t koel:fpm .

启动数据库容器

koel支持sqlite,mysql等数据库,但我尝试了sqlite不太行,这里用mysql,mysql也用docker。可以在启动时指定用户和数据库名,也可以进入mysql容器后用命令创建数据库和用户密码等。

docker run -d --name database \
    -e MYSQL_ROOT_PASSWORD=<root_password> \
    -e MYSQL_DATABASE=koel \
    -e MYSQL_USER=koel \
    -e MYSQL_PASSWORD=<koel_password> \
    mysql

初始化koel

先启动容器

docker run -d  --name koel \
    -v `pwd`/koel/html:/var/www/koel \
    -v `pwd`/koel/music:/music \
    --link mysql:mysql \
    cyhustc/koel:fpm

进入容器后初始化,这一步非常重要,要不然没法用。这里要加上–no-assets,要不会拉取一堆没用(开发用)的包。

docker exec -it koel bash
$ php artisan koel:init --no-assets

配置nginx容器

这里用http,也可以增加https

server {
  listen          *:80;
  server_name     koel.xxx.yyy.zzz;
  root            /var/www/koel/public;
  index           index.php;

  gzip            on;
  gzip_types      text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript application/json;
  gzip_comp_level  9;
  client_max_body_size 512M;
  location /media/ {
    internal;

    alias       $upstream_http_x_media_root;

    access_log /var/log/nginx/koel.access.log;
    error_log  /var/log/nginx/koel.error.log;
  }

  location / {
    try_files   $uri $uri/ /index.php?$args;
  }

  location ~ \.php$ {
    try_files $uri $uri/ /index.php?$args;

    fastcgi_param     PATH_INFO $fastcgi_path_info;
    fastcgi_param     PATH_TRANSLATED $document_root$fastcgi_path_info;
    fastcgi_param     SCRIPT_FILENAME $document_root$fastcgi_script_name;

    fastcgi_pass              koel:9000;
    fastcgi_index             index.php;
    fastcgi_split_path_info   ^(.+\.php)(/.+)$;
    fastcgi_intercept_errors  on;
    include                   fastcgi_params;
  }
}

启动nginx容器

docker run --name nginx \
       --restart=always \
       -p 443:443 \
       -p 80:80 \
       --link koel \
       -v `pwd`/koel/music:/music \
       -v `pwd`/koel/html:/var/www/koel \
       -v `pwd`/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
       -v `pwd`/nginx/conf/sites-enabled:/etc/nginx/sites-enabled \
       -v `pwd`/nginx/www:/var/www \
       -d nginx

打开浏览器,可以登录使用。


在移动端上使用

在Android手机上可以配合Chrome浏览器使用,感觉非常不错。

用chrome打开网页后点菜单,添加到桌面图标。然后从桌面图标打开就没有浏览器地址栏等,就像普通app一样感觉。并且在通知栏也可以显示当前播放可以暂停切歌等。耳机的线控也可以使用。