0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【RPi】Navidrome を動かす

0
Posted at

はじめに

たくさんのWAVファイルを管理したいなー、と思って調べたら、Navidromeに出会いました。
ラズパイで動かしてみました。
Gemini先生に教えてもらっただけなのですが。メモ。

行ったこと

ラズパイへの接続

ラズパイは優先で自宅のLANに接続された状態なので、IPアドレスを知りたかった。Windows ノートPCで下記を実行

# 1. ネットワーク範囲の自動取得
$ipPrefix = (Get-NetIPAddress -InterfaceAlias "Wi-Fi" -AddressFamily IPv4).IPAddress -replace '\\.\\d+$','.'
if (-not $ipPrefix) {
     Write-Host "Wi-FiのIPアドレスが取得できませんでした。" -ForegroundColor Red
} else {
    Write-Host "現在のネットワーク (${ipPrefix}x) をスキャン中..." -ForegroundColor Cyan
    Write-Host "※30秒〜1分ほどかかります。そのままお待ちください..." -ForegroundColor Yellow

# 2. 従来のPowerShellに対応した速度優先のPing送信
1..254 | ForEach-Object {
         $ip = "$ipPrefix$\_"
         \[System.Net.NetworkInformation.Ping]::new().SendAsync($ip, 100) | Out-Null
}
# 3. 少し待ってからARPテーブルからラズパイを抽出
Start-Sleep -Seconds 2
     Write-Host "`n\[発見したRaspberry PiのIPアドレス一覧]" -ForegroundColor Green
     arp -a | Select-String -Pattern "b8-27-eb", "dc-a6-32", "e8-16-56", "d8-3a-dd"
}

見つかった。

現在のネットワーク (192.168.3.x) をスキャン中...
※30秒〜1分ほどかかります。そのままお待ちください...

\[発見したRaspberry PiのIPアドレス一覧]

  192.168.3.16          dc-a6-32-93-61-b7     動的

SSH でラズパイに入ってDocker を用意

pi@tp3:~/audio_server $ sudo sh get-docker.sh
# Executing docker install script, commit: 42dcae692436f34526524ed46d3b32885c9355f5
+ sh -c apt-get -qq update >/dev/null
+ sh -c DEBIAN_FRONTEND=noninteractive apt-get -y -qq install ca-certificates curl >/dev/null
+ sh -c install -m 0755 -d /etc/apt/keyrings
+ sh -c curl -fsSL "https://download.docker.com/linux/raspbian/gpg" -o /etc/apt/keyrings/docker.asc
+ sh -c chmod a+r /etc/apt/keyrings/docker.asc
+ sh -c echo "deb [arch=armhf signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/raspbian bullseye stable" > /etc/apt/sources.list.d/docker.list
+ sh -c apt-get -qq update >/dev/null
+ apt_flags=-y -qq
+ [ -n  ]
+ sh -c DEBIAN_FRONTEND=noninteractive apt-get -y -qq install docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-ce-rootless-extras docker-buildx-plugin docker-model-plugin >/dev/null
Using systemd to manage Docker service
+ sh -c systemctl enable --now docker.service 2>/dev/null
INFO: Docker daemon enabled and started

+ sh -c docker version
Client: Docker Engine - Community
 Version:           28.5.2
 API version:       1.51
 Go version:        go1.25.3
 Git commit:        ecc6942
 Built:             Wed Nov  5 14:43:49 2025
 OS/Arch:           linux/arm
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          28.5.2
  API version:      1.51 (minimum version 1.24)
  Go version:       go1.25.3
  Git commit:       89c5e8f
  Built:            Wed Nov  5 14:43:49 2025
  OS/Arch:          linux/arm
  Experimental:     false
 containerd:
  Version:          v2.2.1
  GitCommit:        dea7da592f5d1d2b7755e3a161be07f43fad8f75
 runc:
  Version:          1.3.4
  GitCommit:        v1.3.4-0-gd6d73eb8
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

================================================================================

To run Docker as a non-privileged user, consider setting up the
Docker daemon in rootless mode for your user:

    dockerd-rootless-setuptool.sh install

Visit https://docs.docker.com/go/rootless/ to learn about rootless mode.


To run the Docker daemon as a fully privileged service, but granting non-root
users access, refer to https://docs.docker.com/go/daemon-access/

WARNING: Access to the remote API on a privileged Docker daemon is equivalent
         to root access on the host. Refer to the 'Docker daemon attack surface'
         documentation for details: https://docs.docker.com/go/attack-surface/

================================================================================

pi@tp3:~/audio_server $ sudo usermod -aG docker $USER
pi@tp3:~/audio_server $ newgrp docker
pi@tp3:~/audio_server $ docker -v
Docker version 28.5.2, build ecc6942

Navidrome を起動

下記の compose.yaml ファイルを作る。

compose.yaml
services:
  navidrome:
    image: deluan/navidrome:latest
    user: 1000:1000 # must own the data folder and be able to read music folder(s). See Permissions below
    ports:
      - "4533:4533"
    restart: unless-stopped
    environment:
      ND_LOGLEVEL: info
      TZ: Asia/Tokyo
    volumes:
      - "/home/pi/audio_server/data:/data"
      - "/home/pi/Music/:/music:ro"

起動する。

pi@tp3:~/audio_server $ docker compose up -d
[+] up 8/8
 ✔ Image deluan/navidrome:latest      Pulled                                          17.8s
 ✔ Network audio_server_default       Created                                          0.2s
 ✔ Container audio_server-navidrome-1 Created                                          7.9s
pi@tp3:~/audio_server $ docker compose logs
navidrome-1  |  _   _             _     _
navidrome-1  | | \ | |           (_)   | |
navidrome-1  | |  \| | __ ___   ___  __| |_ __ ___  _ __ ___   ___
navidrome-1  | | . ` |/ _` \ \ / / |/ _` | '__/ _ \| '_ ` _ \ / _ \
navidrome-1  | | |\  | (_| |\ V /| | (_| | | | (_) | | | | | |  __/
navidrome-1  | \_| \_/\__,_| \_/ |_|\__,_|_|  \___/|_| |_| |_|\___|
navidrome-1  |                           Version: 0.63.2 (be10f89c)
navidrome-1  |
navidrome-1  | time="2026-08-31T16:12:23Z" level=info msg="No configuration file found. Loaded configuration only from environment variables"
navidrome-1  | time="2026-08-31T16:12:23Z" level=info msg="Creating DB Schema"
navidrome-1  | time="2026-08-31T16:12:27Z" level=info msg="Starting signaler"
navidrome-1  | time="2026-08-31T16:12:27Z" level=info msg="Starting Insight Collector"
navidrome-1  | time="2026-08-31T16:12:27Z" level=info msg="Scheduling DB optimizer" schedule="@every 24h"
navidrome-1  | time="2026-08-31T16:12:27Z" level=info msg="Periodic backup is DISABLED"
navidrome-1  | time="2026-08-31T16:12:27Z" level=info msg="Periodic scan is DISABLED"
navidrome-1  | time="2026-08-31T16:12:27Z" level=info msg="Starting scheduler"
navidrome-1  | time="2026-08-31T16:12:27Z" level=info msg="Creating Transcoding cache" maxSize="100 MB" path=/data/cache/transcoding
navidrome-1  | time="2026-08-31T16:12:27Z" level=info msg="Starting plugin manager"
navidrome-1  | time="2026-08-31T16:12:27Z" level=info msg="Finished initializing cache" cache=Transcoding elapsedTime=2.2ms maxSize=100MB
navidrome-1  | time="2026-08-31T16:12:27Z" level=info msg="Running initial setup"
navidrome-1  | time="2026-08-31T16:12:27Z" level=info msg="Starting plugin manager" folder=/data/plugins
navidrome-1  | time="2026-08-31T16:12:27Z" level=info msg="Setting Session Timeout" value=48h
navidrome-1  | time="2026-08-31T16:12:27Z" level=info msg="Creating new JWT secret, used for encrypting UI sessions"
navidrome-1  | time="2026-08-31T16:12:27Z" level=info msg="Creating Image cache" maxSize="100 MB" path=/data/cache/images
navidrome-1  | time="2026-08-31T16:12:27Z" level=info msg="Login rate limit set" requestLimit=5 windowLength=2
navidrome-1  | time="2026-08-31T16:12:27Z" level=info msg="Finished initializing cache" cache=Image elapsedTime=15.1ms maxSize=100MB
navidrome-1  | time="2026-08-31T16:12:27Z" level=info msg="Found ffmpeg" path=/usr/bin/ffmpeg
navidrome-1  | time="2026-08-31T16:12:27Z" level=info msg="Mounting Native API routes" path=/api
navidrome-1  | time="2026-08-31T16:12:27Z" level=info msg="Mounting Subsonic API routes" path=/rest
navidrome-1  | time="2026-08-31T16:12:27Z" level=info msg="Mounting Public Endpoints routes" path=/share
navidrome-1  | time="2026-08-31T16:12:27Z" level=info msg="Mounting LastFM Auth routes" path=/api/lastfm
navidrome-1  | time="2026-08-31T16:12:27Z" level=info msg="Mounting ListenBrainz Auth routes" path=/api/listenbrainz
navidrome-1  | time="2026-08-31T16:12:27Z" level=info msg="Mounting Background images routes" path=/backgrounds
navidrome-1  | time="2026-08-31T16:12:27Z" level=info msg="Mounting WebUI routes" path=/app
navidrome-1  | time="2026-08-31T16:12:27Z" level=info msg="Creating backgrounds cache" maxSize="100 MB" path=/data/cache/backgrounds
navidrome-1  | time="2026-08-31T16:12:27Z" level=info msg="Finished initializing cache" cache=backgrounds elapsedTime=1.8ms maxSize=100MB
navidrome-1  | time="2026-08-31T16:12:27Z" level=info msg="Started watcher for library" libraryID=1 name="Music Library" path=/music
navidrome-1  | time="2026-08-31T16:12:27Z" level=info msg="Watcher started for library" absoluteLibPath=/music libraryID=1 name="Music Library" path=/music
navidrome-1  | time="2026-08-31T16:12:27Z" level=info msg="----> Navidrome server is ready!" address="0.0.0.0:4533" startupTime=3.99s tlsEnabled=false
navidrome-1  | time="2026-08-31T16:12:29Z" level=warning msg="Full scan required after migration"
navidrome-1  | time="2026-08-31T16:12:29Z" level=info msg="No configuration file found. Loaded configuration only from environment variables"
navidrome-1  | time="2026-08-31T16:12:29Z" level=info msg="Scanner: Starting scan" fullScan=true numLibraries=1
navidrome-1  | time="2026-08-31T16:12:29Z" level=warning msg="Playlists will not be imported, as there are no admin users yet. They will be imported automatically once an admin user is created."
navidrome-1  | time="2026-08-31T16:12:29Z" level=info msg="Scanner: Finished scanning all libraries" duration=45.1ms
navidrome-1  | time="2026-08-31T16:12:29Z" level=info msg="Scan completed"

設定

Dockerに渡す環境変数や設定ファイルを使うことができるようです。
詳しくは下記に書いてあります。

environment:
      TZ: Asia/Tokyo
      ND_LOGLEVEL: info
      ND_SCANSCHEDULE: "@every 1h"          # 1時間ごとにフォルダを自動スキャン
      ND_ALBUMPLAYLISTSORT: "tracknumber"   # プレイリストやアルバム内の曲順をトラック番号順に
      ND_DEFAULTLANGUAGE: "ja"              # Web UI のデフォルト言語を日本語に固定
      ND_ENABLETRANSCODINGCONFIG: "true"   # Web UI からトランスコード(ビットレート制限)設定を可能にする
      ND_ENABLESHARING: "true"             # 外部共有用の公開リンク作成機能を有効化
      ND_UIFULLWIDTH: "true"               # Web UI を画面横幅いっぱいに表示

WebAPIも使えるようですが、swagger を表示しようとしたらうまくできませんでした。AIの答えも正しくなく、少し最新の情報を調べる必要がありそうでした。

まとめ

とりあえず、ラズパイでNovidrome が動きました。
(2026.08.31)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?