はじめに
たくさんの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)