Post

Archlinux Debian - Compilation go Audio Navidrome

Archlinux Debian - Compilation go Audio Navidrome

Ces opérations sont exécutées dans un container Debian sur Archlinux

Development Environment

Prérequis

IMPORTANT : Si vous changez la version “go” installée, il faut supprimer le dossier /usr/local/go avant l’installation d’une nouvelle version “go” Répertoire

1
mkdir -p $HOME/media/devel/go_projects

Pour connaitre les versions go et node à utiliser dans la compilation navidrome, voir le lien https://www.navidrome.org/docs/installation/build-from-source/

Par exemple au 24/09/2022 : First, you will need to install Go 1.18 and Node 16
Installer go 1.18

1
2
3
4
sudo rm -r /usr/local/go
wget https://go.dev/dl/go1.18.6.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.18.6.linux-amd64.tar.gz
go version # go version go1.18.6 linux/amd64

Installer Node 16

1
2
nvm list # v16.14.2 est présent dans la liste
nvm use 16.14  # Now using node v16.14.2 (npm v8.5.0)

Projet navidrome (français)

Cloner le projet from https://github.com/navidrome/navidrome

1
2
3
cd ~
git clone https://github.com/navidrome/navidrome $HOME/media/devel/go_projects/navidrome-lxc
cd $HOME/media/devel/go_projects/navidrome-lxc  # Aller dans le dossier de développement

Le language Français

Le language par défaut est anglais, modification pour avoir le français

Copier le fichier language français

1
cp $HOME/media/devel/go_projects/navidrome-lxc/resources/i18n/fr.json $HOME/media/devel/go_projects/navidrome-lxc/ui/src/i18n/

Modifier les fichiers provider.js et useGetLanguageChoice.js dans le dossier $HOME/media/devel/go_projects/navidrome-lxc/ui/src/i18n/

1
2
3
4
sed -i "s/en\.json/fr\.json/g" $HOME/media/devel/go_projects/navidrome-lxc/ui/src/i18n/provider.js
sed -i "s/'en'/'fr'/g" $HOME/media/devel/go_projects/navidrome-lxc/ui/src/i18n/provider.js
sed -i "s/'en'/'fr'/g" $HOME/media/devel/go_projects/navidrome-lxc/ui/src/i18n/useGetLanguageChoices.js
sed -i "s/'English'/'Français'/g" $HOME/media/devel/go_projects/navidrome-lxc/ui/src/i18n/useGetLanguageChoices.js

Construire binaire production

Aller dans le dossier

1
cd $HOME/media/devel/go_projects/navidrome-lxc/

Installer les outils de développement

1
make setup-dev  

Construire le binaire de production

1
make buildall # Cette commande doit créer un exécutable `navidrome` dans le dossier du projet

Créez un fichier de configuration navidrome.toml dans le dossier du projet avec les options suivantes :

1
$HOME/media/devel/go_projects/navidrome-lxc/navidrome.toml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Définissez votre dossier musical, de préférence une bibliothèque musicale de développement spécifique avec peu de chansons,
# pour rendre le scan rapide
MusicFolder = "/home/lxcdeb/media/music"

# Rendre le débogage plus verbeux
LogLevel = "debug" 

# Cela créera toujours un utilisateur "admin" avec le mot de passe spécifié, donc vous n'avez pas à 
# créer un utilisateur à chaque fois que vous supprimez votre base de données de développement
DevAutoCreateAdminPassword = "navi49600"

# Déplacer le dossier data/DB vers un autre endroit
DataFolder = "./data"

# Si vous développez dans macOS avec le pare-feu activé, cela évite d'avoir à accepter les 
# connexions réseau à chaque fois que le serveur redémarre
Address = "localhost"

Lancement manuel

Lancement manuel du binaire

1
./navidrome
1
2
3
4
5
6
7
8
9
10
11
12
13
[...]
INFO[0000] Configuring Media Folder                      name="Music Library" path=/home/lxcdeb/media/music
INFO[0000] Creating Image cache                          maxSize="100 MB" path=cache/images
INFO[0000] Finished initializing cache                   cache=Image elapsedTime="154.311µs" maxSize=100MB
INFO[0000] Found ffmpeg                                  path=/usr/bin/ffmpeg
INFO[0000] Last.FM integration not available: missing ApiKey/Secret 
INFO[0000] Spotify integration is not enabled: artist images will not be available 
INFO[0000] Creating Transcoding cache                    maxSize="100 MB" path=cache/transcoding
INFO[0000] Finished initializing cache                   cache=Transcoding elapsedTime="80.321µs" maxSize=100MB
INFO[0000] Mounting routes                               path=/rest
INFO[0000] Mounting routes                               path=/app
INFO[0000] Login rate limit set                          requestLimit=5 windowLength=20s
INFO[0000] Navidrome server is accepting requests        address="0.0.0.0:4533"

Le lien http://localhost:4533
Au premier lancement saisir un mot de passe admin

Lancement via systemd

Lancement auto du binaire via systemd

Créer le service navidrome /etc/systemd/system/navidrome.service

1
sudo nano /etc/systemd/system/navidrome.service
1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=Navidrome Music Server and Streamer compatible with Subsonic/Airsonic
After= network.target

[Service]
Type=simple
User=lxcdeb
WorkingDirectory=/home/lxcdeb/media/devel/go_projects/navidrome-lxc
ExecStart=/home/lxcdeb/media/devel/go_projects/navidrome-lxc/navidrome --configfile "/home/lxcdeb/media/devel/go_projects/navidrome-cfg/navidrome.toml"
Restart=on-failure

[Install]
WantedBy=multi-user.target

Activer, démarrer et vérifier le service navidrome

1
2
3
sudo systemctl daemon-reload
sudo systemctl start navidrome.service
sudo systemctl status navidrome.service

Modifier la page d’accueil, fichier /var/www//index/

1
2
3
<p><a href="http://lxcdeb:4533">music</a>
<em> Navidrome</em>
</p>

Accès depuis PC1 si /etc/hosts contient 192.168.0.200 lxcdeb
http://lxcdeb:4533

Pour lancer Navidrome en mode développement

1
make dev
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[...]
16:47:46 JS.1   |  Starting the development server...
16:47:48 GO.1   |  [00] DEBU[0002] Scanning folder                               folder=/home/lxcdeb/media/music lastModifiedSince="2021-03-08 16:46:41.61 +0100 CET"
16:47:48 GO.1   |  [00] DEBU[0002] Directory tree loaded from DB                 elapsed=23.2ms total=281
16:47:48 GO.1   |  [00] DEBU[0002] Finished reading directories from filesystem  elapsed=22.3ms
16:47:48 GO.1   |  [00] DEBU[0002] Finished deleted folders check                elapsed="102.263µs" total=0
16:47:48 GO.1   |  [00] DEBU[0002] No changes found in Music Folder              elapsed=45.6ms folder=/home/lxcdeb/media/music
16:47:55 JS.1   |  Compiled successfully!
16:47:55 JS.1   |  You can now view navidrome-ui in the browser.
16:47:55 JS.1   |    Local:            http://localhost:4533
16:47:55 JS.1   |    On Your Network:  http://192.168.0.200:4533
16:47:55 JS.1   |  Note that the development build is not optimized.
16:47:55 JS.1   |  To create a production build, use npm run build.

Cela démarrera à la fois le backend et le frontend en mode “watch”, donc tout changement sera automatiquement rechargé.

Si vous rencontrez des erreurs lors de l’une de ces étapes, [rejoignez notre “chat”] (https://www.navidrome.org/community/) pour obtenir de l’aide.

Steps to install on Ubuntu Linux (and other Debian based distros)

Les étapes suivantes ont été testées sur Ubuntu 18.04 et devraient fonctionner sur toutes les versions 16.04 et supérieures ainsi que sur les autres distros basées sur Debian. Tout au long de ces instructions, les commandes auront des espaces réservés pour l’utilisateur (<user>) et le groupe (<group>) sous lesquels vous souhaitez exécuter Navidrome et le chemin du dossier de musique (<library_path>). Si vous utilisez une médiathèque existante, assurez-vous que l’utilisateur a les droits sur la médiathèque.

Préalables

Conditions préalables à la mise à jour et à l’installation
Assurez-vous que votre système est à jour et installez ffmpeg.

1
2
sudo apt update && sudo apt upgrade
sudo apt install ffmpeg

Par défaut, la commande useradd ne crée pas de répertoires de base, mais pour un démon, je vous recommande d’utiliser l’option système et de remplacer le shell par un shell inexistant afin que personne ne puisse se connecter à ce compte (sous ssh par exemple):

1
sudo useradd -r -s /bin/false navidrome

Créer une structure de répertoire
Créez un répertoire pour stocker l’exécutable Navidrome et un répertoire de travail avec les permissions appropriées.

1
2
sudo install -d -o navidrome -g navidrome /opt/navidrome
sudo install -d -o navidrome -g navidrome /var/lib/navidrome

Exécutable navidrome

Alternative A - Navidrome depuis le site
Téléchargez la dernière version depuis la page des versions, extrayez le contenu dans le répertoire exécutable et définissez les autorisations pour les fichiers. (Remplacez l’URL ci-dessous par celle de la page des versions) :

1
2
3
wget https://github.com/navidrome/navidrome/releases/download/v0.45.1/navidrome_0.45.1_Linux_arm64.tar.gz -O Navidrome.tar.gz
sudo tar -xvzf Navidrome.tar.gz -C /opt/navidrome/
sudo chown -R navidrome:navidrome /opt/navidrome

Alternative B - Navidrome par compilation
Copier l’exécutable navidrome dans le dossier /opt/navidrome

1
2
sudo cp $HOME/media/devel/go_projects/navidrome-lxc/navidrome /opt/navidrome/
sudo chown -R navidrome:navidrome /opt/navidrome

Configuration navidrome.toml

Dans le répertoire de travail, /var/lib/navidrome créer un nouveau fichier nommé navidrome.toml avec les paramètres suivants.

1
MusicFolder = "/home/userhms/sshfs/musique"

Pour d’autres options de configuration, voir la page des options de configuration.

Systemd navidrome.service

Créez un nouveau fichier sous /etc/systemd/system/ nommé navidrome.service avec les données suivantes.

1
/etc/systemd/system/navidrome.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
[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

# See https://www.freedesktop.org/software/systemd/man/systemd.exec/
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

# You can uncomment the following line if you're not using the jukebox This
# will prevent navidrome from accessing any real (physical) devices
#PrivateDevices=yes

# You can change the following line to `strict` instead of `full` if you don't
# want navidrome to be able to write anything on your filesystem outside of
# /var/lib/navidrome.
ProtectSystem=full

# You can uncomment the following line if you don't have any media in /home/*.
# This will prevent navidrome from ever reading/writing anything there.
#ProtectHome=true

# You can customize some Navidrome config options by setting environment variables here. Ex:
#Environment=ND_BASEURL="/navidrome"

Démarrez le service Navidrome
Rechargez le démon de service, démarrez le service nouvellement créé, et vérifiez qu’il a démarré correctement.

1
2
3
sudo systemctl daemon-reload
sudo systemctl start navidrome.service
sudo systemctl status navidrome.service

SSH Port Forwarding

Si le service a démarré correctement, vérifiez que vous pouvez accéder à http://localhost:4533.
Ouvrir un terminal sur le client linux qui dispose des clés ssh et lancer la commande

1
ssh -L 9500:localhost:4533 userhms@45.145.166.51 -p 55051 -i /home/yann/.ssh/hms-sto-250

Ouvrir un navigateur sur le client et saisir localhost:9500 pour afficher le serveur audio

Démarrez Navidrome au démarrage

1
sudo systemctl enable navidrome.service

Proxy web nginx

Proxy nginx zic.xoyaz.xyz
Le domaine “zic.xoyaz.xyz” est activé avec les certificats let’s encrypt

Le fichier de configuration nginx /etc/nginx/conf.d/zic.xoyaz.xyz.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
server {
    listen 80;
    listen [::]:80;
    server_name zic.xoyaz.xyz;
    return 301 https://$host$request_uri;
}
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name zic.xoyaz.xyz;
    ssl_certificate /etc/ssl/private/xoyaz.xyz-fullchain.pem;
    ssl_certificate_key /etc/ssl/private/xoyaz.xyz-key.pem;

    root /var/www/;
    index index/ index.php;

    # TLS 1.3 only
    ssl_protocols TLSv1.3;
    ssl_prefer_server_ciphers off;
 
    # HSTS (ngx_http_headers_module is required) (63072000 seconds)
    add_header Strict-Transport-Security "max-age=63072000" always;
 
    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;
 
    # verify chain of trust of OCSP response using Root CA and Intermediate certs
    ssl_trusted_certificate /etc/ssl/private/xoyaz.xyz-fullchain.pem;

    # replace with the IP address of your resolver
    resolver 1.1.1.1;

    location / { 
        proxy_pass              http://127.0.0.1:4533;
    } 

}
Cet article est sous licence CC BY 4.0 par l'auteur.