Contents
使用Plex搭建在线音乐库
我的无损音乐主要存放于家中的 NAS,但是考虑到上行带宽问题,以及不稳定的网络,我决定使用 Plex 与 Rclone 搭建一个在线的曲库。
准备工作
- Plex Server
- Rclone
- GDrive 账号
- Cloudflare 域名(可选)
安装 Plex Server
通常来说你可以通过 https://www.plex.tv/media-server-downloads/ 下载你所需要的软件包,并安装。如果你需要自动更新,那么建议使用该项目更新 https://github.com/mrworf/plexupdate:
bash -c "$(wget -qO - https://raw.githubusercontent.com/mrworf/plexupdate/master/extras/installer.sh)"
只要根据脚本引导进行简单设置即可使用。
安装并配置 Rclone
Rclone 可以简单的通过脚本安装:
curl https://rclone.org/install.sh | sudo bash
安装完成后即配置相应的 GDrive
rclone config
具体的配置方法可以参考https://rclone.org/drive/
配置 Rclone 挂载
我们设置完 Rclone 账号后即可使用 fuse 的方式挂载。
首先选择一个合适的用户/用户组,获取它的 GID、UID
id [username]
/etc/systemd/system/rclone-lib.service
[Unit] Description=Google Drive (rclone) AssertPathIsDirectory=/home/plex Wants=network-online.target After=network-online.target [Service] Type=simple ExecStart=/usr/bin/rclone mount GD:PlexMusicLib /home/plex/Lib \ --config=/root/.config/rclone/rclone.conf \ --allow-other \ --buffer-size 512M \ --dir-cache-time 12h \ --drive-chunk-size 64M \ --umask 002 \ --vfs-read-chunk-size 512M \ --vfs-read-chunk-size-limit off \ --user-agent user \ --gid $GID \ --uid $UID ExecStop=/bin/fusermount -u /home/plex/Lib Restart=always RestartSec=10 [Install] WantedBy=default.target
其中,挂载参数可以根据自己的系统进行设置 https://rclone.org/commands/rclone_mount/
配置 Plex 库
此时你就可以添加一个 Plex 音乐库
这里建议创建多个音乐库分开类型,逐个扫描。Plex 在扫描文件的时候,Rclone 需要拉取所有的文件,因此这样的配置将会比普通硬盘扫描耗费更长的时间。
配置 CDN
Plex 可以配合免费的 Clondflare CDN 使用,这种方法不仅可以保护原站 IP 还可以优化服务器到客户端之间的路由。对于音乐库这样,对延迟不太敏感的应用场景,这将是一个不错的用法。
首先在 Cloudflare 新建一个 A 记录,指向服务器 IP 地址,选择 Proxied (已代理)。如果你想要为服务器签发一个 Let’s Encrypt 证书则需要如下的 Nginx 配置
server { listen 80; listen [::]:80; server_name plex.mysite.net; location /.well-known { alias /var/www/html/.well-known; allow all; default_type "text/plain"; autoindex on; } location / { return 301 https://$host$request_uri; } } server { listen 443; server_name plex.mysite.net; rewrite https://$host$request_uri? permanent; error_log /var/log/nginx/plex_error.log error; access_log /var/log/nginx/plex_access.log combined; #ssl on; # These are the paths to your generated Let's Encrypt SSL certificates. ssl_certificate /etc/nginx/ssl/plex.mysite.net-fullchain.pem; ssl_certificate_key /etc/nginx/ssl/plex.mysite.net-privkey.pem; # To generate your dhparam.pem file, run "openssl dhparam -out /etc/nginx/dhparam.pem 2048" (without the quotes) in your terminal. # ssl_dhparam /etc/nginx/ssl/dhparam.pem; #Resovler set to CloudFlare. Timeout and nameservers may need to be adjusted for your location resolver 1.1.1.1 1.0.0.1 valid=300s; resolver_timeout 10s; #Plex has A LOT of javascript, xml and html. This helps a lot, but if it causes playback issues with devices turn it off. (Haven't encountered any yet) gzip on; gzip_vary on; gzip_min_length 1000; gzip_proxied any; gzip_types text/plain text/css text/xml application/xml text/javascript application/x-javascript image/svg+xml; gzip_disable "MSIE [1-6]\."; location / { # IP address of Plex Media Server proxy_pass http://127.0.0.1:32400; proxy_buffering off; proxy_redirect off; proxy_http_version 1.1; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $http_connection; proxy_cookie_path /web/ /; access_log off; } }
否则,直接使用自签证书并写成如下形式
server { listen 80; listen [::]:80; server_name plex.mysite.net; location / { return 301 https://$host$request_uri; } } server { listen 443; server_name plex.mysite.net; rewrite https://$host$request_uri? permanent; error_log /var/log/nginx/plex_error.log error; access_log /var/log/nginx/plex_access.log combined; #ssl on; # These are the paths to your generated Let's Encrypt SSL certificates. ssl_certificate /etc/nginx/ssl/plex.mysite.net-fullchain.pem; ssl_certificate_key /etc/nginx/ssl/plex.mysite.net-privkey.pem; # To generate your dhparam.pem file, run "openssl dhparam -out /etc/nginx/dhparam.pem 2048" (without the quotes) in your terminal. # ssl_dhparam /etc/nginx/ssl/dhparam.pem; #Resovler set to CloudFlare. Timeout and nameservers may need to be adjusted for your location resolver 1.1.1.1 1.0.0.1 valid=300s; resolver_timeout 10s; #Plex has A LOT of javascript, xml and html. This helps a lot, but if it causes playback issues with devices turn it off. (Haven't encountered any yet) gzip on; gzip_vary on; gzip_min_length 1000; gzip_proxied any; gzip_types text/plain text/css text/xml application/xml text/javascript application/x-javascript image/svg+xml; gzip_disable "MSIE [1-6]\."; location / { # IP address of Plex Media Server proxy_pass http://127.0.0.1:32400; proxy_buffering off; proxy_redirect off; proxy_http_version 1.1; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $http_connection; proxy_cookie_path /web/ /; access_log off; } }
如果在 Cloudflare 的 SSL/TLS 选项卡中选择“完全(严格)”,则必须要配置正确的 Let’s Encrypt 证书,并且 Cloudflare 的 SNI 证书不支持二级域名。
由于 Cloudflare 对这些经过代理的网站默认启用缓存,容易造成 Plex 库文件更新有问题,因此建议通过页面规则,对该域名的内容启用 bypass 的缓存策略。
最后将 CDN 域名填入 Plex 配置:
在 Plex 的服务器设置中,找到网络选项卡。在 Custom server access URLs
中填入加速域名:
https://plex.mysite.net:443
那么这个配置将通过 app.plex.tv 推送到你全部的客户端实现 CDN 加速。
参考资料
https://github.com/mrworf/plexupdate
https://rclone.org/commands/rclone_mount/
https://quickbox.io/knowledge-base/setting-up-cloudflare-and-plex-cdn/