ミュージックストリームサーバ Navidromeをインストール

# はじめに
Google Play Musicが終了してからだいぶ経ちましたが、個人で保有している音楽ライブラリ(MP3やFLAC形式)をスマホで再生する方法に困っていました。

* Google Play Musicでは自分が持っている音楽ライブラリ(MP3やFLAC形式)をアップロードしてスマホで再生することに利用していたが、移行先であるYoutube musicには専用のアップロードツールがない。
* 自分の音楽ライブラリは20000曲以上あり、手動でブラウザからアップロードしていられない。今後ライブラリが増えた場合に手動でアップロードもしていられない。
* Youtube musicのスマホアプリは自分の保有しているライブラリ以外のサブスクの音楽も表示され、使い勝手がイマイチ。

個人で使えるミュージックサーバがないか探してみたところNavidromeを見つけ、構築してみたのでそのメモです。

Navidrome
https://www.navidrome.org/

# Navidromeの構築
構築手順についてはほぼ公式サイトの通りですが、nginxでリバースプロキシを構成しhttps化しています。

## Navidromeのインストール
NavidromeはDockerイメージも配付されていますが、今回はビルド済みLinux向けバイナリを利用してCentOS 7上に構築します。

1.必要なパッケージをインストールします。Navidromeはffmpegを利用したトランスコードに対応しているため、こちらもインストールします。

```console
$ sudo yum install yum-utils wget
$ sudo yum install epel-release
$ sudo yum install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm
$ sudo yum install ffmpeg
```

2.Navidromeを動作させる"navidrome"ユーザを作成します。

```console
$ sudo useradd --no-create-home -s /bin/bash navidrome
```

3.インストール先ディレクトリを作成します。

```console
$ sudo install -d -o navidrome -g navidrome /opt/navidrome
$ sudo install -d -o navidrome -g navidrome /var/lib/navidrome
```

4.Navidromeのビルド済みバイナリを取得してインストールします。ビルド済みバイナリは[NavidromeのGitHub](https://github.com/navidrome/navidrome/)から取得できます。
今回は2021/8/11時点の最新版である0.44.1を利用します。

```console
$ wget https://github.com/navidrome/navidrome/releases/download/v0.44.1/navidrome_0.44.1_Linux_x86_64.tar.gz
$ sudo tar -xvzf navidrome_0.44.1_Linux_x86_64.tar.gz -C /opt/navidrome/
$ sudo chown -R navidrome:navidrome /opt/navidrome
```

5.Navidromeのコンフィグファイルを編集します。音楽ライブラリは/mnt/share/にマウントされている前提です。

```console
$ sudo vi /var/lib/navidrome/navidrome.toml

MusicFolder = "/mnt/share/"
EnableTranscodingConfig = false
AutoImportPlaylists = false
BaseUrl = "/navidrome"
```

6.Navidromeの常駐化のため、systemdのユニットファイルを作成し、サービス開始します。

```console
$ sudo vi /etc/systemd/system/navidrome.service

[Unit]
Description=Navidrome Music Server and Streamer compatible with Subsonic/Airsonic
After=remote-fs.target network.target
AssertPathExists=/var/lib/navidrome

[Install]
WantedBy=multi-user.target

[Service]
User=navidrome
Group=navidrome
Type=simple
ExecStart=/opt/navidrome/navidrome --configfile "/var/lib/navidrome/navidrome.toml"
WorkingDirectory=/var/lib/navidrome
TimeoutStopSec=20
KillMode=process
Restart=on-failure

DevicePolicy=closed
NoNewPrivileges=yes
PrivateTmp=yes
PrivateUsers=yes
ProtectControlGroups=yes
ProtectKernelModules=yes
ProtectKernelTunables=yes
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
RestrictNamespaces=yes
RestrictRealtime=yes
SystemCallFilter=~@clock @debug @module @mount @obsolete @reboot @setuid @swap
ReadWritePaths=/var/lib/navidrome

ProtectSystem=full
```

```console
$ sudo systemctl daemon-reload
$ sudo systemctl start navidrome
$ sudo systemctl enable navidrome
```

7.ファイアーウォールの一時停止とアクセス確認
ファイアーウォールを一時停止して、Navidromeへのアクセスを確認します。

```console
$ sudo systemctl stop firewalld
```

http://\<NavidromeサーバのIPアドレス>:4533へアクセスして初期ユーザ作成画面が表示されることを確認します。

![create-first-user.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985800/7cc32d3c-63dd-a6cb-e8a5-4ef480ca38e9.png)

ファイアーウォールを再度開始しておきます。

```console
$ sudo systemctl start firewalld
```

## nginxの構築
Navidromeへのアクセスをhttps化するためnginxを構築します。

1.SELinuxの無効化

```console
$ sudo vi /etc/selinux/config

#SELINUX=enforcing
SELINUX=disabled

```

```console
$ sudo setenforce 0
```
2.nginxのインストール

```console
$ sudo vi /etc/yum.repos.d/nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
```

```console
$ sudo  yum install nginx
```

3.ファイアーウォールの設定変更
httpsでアクセスさせるため、TCPポート443をfirewalldで開放します。証明書取得のためTCPポート80も開放します。

```console
$ sudo firewall-cmd --add-service=https --permanent
$ sudo firewall-cmd --add-service=http --permanent
$ sudo firewall-cmd --reload
```


4.Let's Encryptでサーバ証明書の取得と自動更新設定
こちらを参照しました。[さくらのVPS certbot-auto更新](https://manual.sakura.ad.jp/vps/startupscript/certbot-caution.html)

```console
# yum install snapd
# systemctl enable --now snapd.socket
# systemctl start snapd.service
# ln -s /var/lib/snapd/snap /snap
# snap install core && snap refresh core
# snap install certbot --classic
# ln -s /snap/bin/certbot /usr/bin/certbot

# certbot --nginx -d <ドメイン>

# snap start --enable certbot.renew
```

4.リバースプロキシ設定
Navidromeへのリバースプロキシ設定を追加します

```console
$ sudo vi /etc/nginx/conf.d/default.conf

server {
～～～省略～～～
    # Proxy to the navidrome server
    location /navidrome/ {
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Host  $http_host;
        proxy_set_header Host              $http_host;
        proxy_max_temp_file_size           0;
        proxy_pass http://localhost:4533/navidrome/;
        proxy_redirect                     http:// https://;
    }
～～～省略～～～
}
```

5.nginxの起動

```console
$ sudo systemctl start nginx
$ sudo systemctl enable nginx
```

## アクセス確認

https://\<NavidromeサーバのIPアドレス>/navidrome/へアクセスすることで、httpsでNavidromeのGUIが表示されます。
あとはGUIに従って初期ユーザを作成し、ログインします。

音楽ファイルがフォルダに存在していれば、自動でスキャンされ以下のように表示されるはずです。

![スクリーンショット 2021-08-11 130606.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985800/80d26c41-3cfb-6da2-52c5-49133eea1825.png)

アルバムのサムネイルをクリックし、再生ボタンをクリックすれば再生されます。

日本語にも対応しており、右上の"Personal"からLanguageを日本語に変更することで日本語表記にすることが可能です。


# プレイヤー
Chromeなどのブラウザからも再生できますが、NavidromeはSubsonic-APIに対応しているため、スマホからの再生は対応しているアプリを利用したほうが便利です。
自分はAndroidでは[Sub Muxic for SubSonic Server](https://play.google.com/store/apps/details?id=com.gloxandro.submuxic)、iOSでは[play:Sub Music Streamer](https://apps.apple.com/jp/app/play-sub-music-streamer/id955329386)を利用しています。

Sub Muxic for SubSonic Server
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985800/a7c87bca-fc23-f256-696a-9bb6b7321266.png" width=50%>
play:Sub Music Streamer
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985800/8168a841-d891-dcd7-9e97-2dd5777a03ce.jpeg" width=50%>