Airsonic pour de la musique en streaming


Cet outil est une très bonne substitution à Spotify ou à Google Play Music car il a une interface web pour accéder aux documents multimédia. Il est compatible avec de nombreuses applications fonctionnant sous Android ou Apple. Ainsi, il est par exemple possible avec l'application Subsonic installé sur mon Replicant ( une version Android sans logiciels Google ) de me connecter à Airsonic pour écouter de la musique en streaming en plus d'avoir l'avantage de conserver les données téléchargé tant qu'il ne dépasse pas son quota d'espace disque.

Le bémol : C'est uniquement en lecture seule. Il n'y a donc pas moyen de déplacer ou de supprimer un élément.

Sources :

Installation

D'abord, nous avons besoin d'installer Java avec quelques librairies :

apt install openjdk-8-jre-headless libjfreechart-java libjackson2-core-java  libjackson2-databind-java libspring-web-java libspring-beans-java

Un fois fait, on veut que l'application soit uniquement utilisé par le compte utilisateur www-data et à l'emplacement suivant :

mkdir /var/www/airsonic
chown www-data: /var/www/airsonic
cd /var/www/airsonic

On télécharge l'application Java :

sudo -u www-data wget https://github.com/airsonic/airsonic/releases/download/v10.1.2/airsonic.war

L'unité systemd

Pour que le service soit lancé proprement au démarrage de la machine, on créé une unité dont voici :

nano /etc/systemd/system/airsonic.service
After=remote-fs.target network.target
AssertPathExists=/var/www/airsonic
 
[Service]
Type=simple
Environment="JAVA_JAR=/var/www/airsonic/airsonic.war"
Environment="JAVA_OPTS=-Xmx384m"
Environment="AIRSONIC_HOME=/var/www/airsonic"
Environment="PORT=4040"
Environment="CONTEXT_PATH=/"
Environment="JAVA_ARGS="
EnvironmentFile=-/etc/default/airsonic
ExecStart=/usr/bin/java \
          $JAVA_OPTS \
          -Dairsonic.home=${AIRSONIC_HOME} \
          -Dserver.context-path=${CONTEXT_PATH} \
          -Dserver.port=${PORT} \
          -jar ${JAVA_JAR} $JAVA_ARGS
User=www-data
Group=www-data
 
[Install]
WantedBy=multi-user.target

Rapidement, on voit qu'elle contient des variables d'environnements qui seront aussi présent dans le fichier /etc/default/airsonic. On voit aussi que l'unité sera lancé aprs les services réseaux et lancé par l'utilisateur www-data.

Voici le fichier utilisé pour la déclaration des variables :

nano /etc/default/airsonic
JAVA_JAR=/var/www/airsonic/airsonic.war
JAVA_OPTS=-Xmx384m
AIRSONIC_HOME=/var/www/airsonic
PORT=4040
CONTEXT_PATH=/
JAVA_ARGS=--debug
JAVA_ARGS=--server.address=127.0.0.1

Celui-ci précise l'emplacement de l'application à lancer, la taille mémoire qu'il peut allouer, son espace de travail, l'IP et le port d'écoute qui sera utilisé une fois l'application lancé. Par ailleurs, le mode débug activé qui aide à la résolution de potentiels problèmes si une configuration est incorrecte.

On recharge la configuration de chaque daemon du système :

systemctl daemon-reload

On peut enfin lancer le programme :

systemctl start airsonic

Le port 4040 sera maintenant accessible en local sur la machine ( http://127.0.0.1:4040 ) . S'il y a des erreurs, elles seront lisible dans ce fichier de log suivant : /var/www/airsonic/airsonic.log

Ajouter un vhost dans Nginx

Pour que l'application soit accessible depuis un nom de domaine ( tel que airsonic.mon-domaine.com ) et via le port 80, on peut utiliser le service Nginx. Je vous laisse gérer le coté DNS où il s'agit seulement de faire pointer le sous-domaine vers l'IP publique du serveur.

Techniquement on va rediriger (proxifier) les requêtes HTTP(S) vers l'application.

On a besoin de ce paquet :

apt install nginx

Et de créér ce vhost :

nano /etc/nginx/sites-enabled/airsonic.mon-domaine.com

Avec ces directives :

server {
        listen 0.0.0.0:80;
        listen 0.0.0.0:443 ssl;
        server_name airsonic.mon-domaine.com;

#       access_log /var/log/nginx/airsonic.mon-domaine.com.nginx.access;
#       error_log /var/log/nginx/airsonic.mon-domaine.com.nginx.error;

        location / {
              proxy_pass http://127.0.0.1:4040;
              proxy_set_header Host $host;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header X-Forwarded-Proto $scheme;
              proxy_set_header X-Forwarded-Host  $http_host;
              proxy_set_header X-Real-IP $remote_addr;
              proxy_max_temp_file_size           0;
        }
}

On vérifie qu'il n'y a pas d'erreurs de syntaxes et on relance le service!

nginx -t
systemctl reload nginx

Cela est maintenant accessible à https://airsonic.mon-domaine.com

Externaliser la BDD dans Postgres

Pour que cela fonctionne, il faut déjà que Airsonic soit lancé une fois pour qu'il puisse créer ses fichiers d'environnements.

Pour gagner en temps de chargement, on peut utiliser Postgres qui est similaire à Mysql mais avec une meilleure gestion de la mémoire :

apt install postgresql-9.6 postgresql-client-9.6 libpostgresql-jdbc-java

On définit les accès au service :

nano /etc/postgresql/9.6/main/pg_hba.conf

On s'assure de retrouver ces lignes :

local   all             postgres                                peer
local   airsonic        airsonic                                password
local   all             all                                     peer
host    all             all             127.0.0.1/32            md5

On le relance pour qu'il puisse prendre en compte ces changements :

systemctl restart postgresql

On définit un utilisateur, sa base et son accès :

sudo -u postgres createuser -P airsonic
sudo -u postgres createdb -O airsonic airsonic
sudo -u postgres psql -U airsonic -W
GRANT ALL PRIVILEGES ON DATABASE airsonic TO airsonic;

Il reste plus qu'a configurer l'application :

nano /var/www/airsonic/airsonic.properties

On ajoute ceci :

DatabaseConfigType=embed
DatabaseConfigEmbedDriver=org.postgresql.Driver
DatabaseConfigEmbedUrl=jdbc:postgresql://127.0.0.1:5432/airsonic?stringtype=unspecified
DatabaseConfigEmbedUsername=airsonic
DatabaseConfigEmbedPassword=airsonic
DatabaseUsertableQuote="
DatabaseMysqlMaxlength=512

On a plus qu'a relancer le service et vérifier qu'il ne crache rien de provoquant dans le fichier de log :

systemctl restart airsonic
less /var/www/airsonic/airsonic.log
Notons que l'application considérera cela comme une nouvelle installation avec la création d'un nouvel utilisateur.