NAS-Server mit MiniDLNA

Letzte Aktualisierung: 04.06.2019

Voraussetzung: »Basisinstallation«

Installation des Servers

Die Installation und Konfiguration des NAS-Servers ist im »ArchLinux-Wiki« beschrieben.

Optional: Externer Zugriff auf den NAS-Server

Der bequeme Zugriff auf den NAS-Server ist in der Regel nur aus dem lokalen Netzwerk möglich, da das UPnP-Protokoll mit Broadcasts arbeitet, die die Grenze des Routers ins Internet nicht überschreiten können. Einfach nur eine Portfreigabe für MiniDLNA (unsicher) oder eine verschlüsselte VPN-Verbindung (sicherer) im Router einzurichten, reicht also nicht, um via Internet durch die auf dem NAS gespeicherte Dateistruktur browsen zu können. Wir brauchen also zusätzlich noch etwas anderes.

MiniDLNA speichert den Inhalt und die Struktur des Servers in einer SQLite-Datenbank, deren Pfad /var/cache/minidlna/files.db lautet. Sofern wir einen von außen erreichbaren Webserver (am besten via VPN) mit PHP und aktiviertem PHP-SQLite-Modul haben (siehe hierzu den »Artikel zum LAMP-Server«), können wir diese Datenbank auslesen und daraus die annähernde Dateistruktur des NAS in HTML als Link ausgeben lassen. Hierüber klappt das Streaming selbst dann tadellos. Die auszulesenden Datenbank-Informationen erhält man, indem man sich die Datenbank einmal mit einem speziellen Programm wie z.B. mit dem »DB Browser for SQLite« ansieht:

NAS-Dateisystemstruktur
Abb. 1: Repräsentation der NAS-Dateisystemstruktur in der SQLite-Datenbank

Die Datenbank kopieren wir zuerst ins Wurzelverzeichnis des Webservers und passen Besitzer und Gruppenzugehörigkeit an:

cp /var/cache/minidlna/files.db /srv/http/files.db
chown http:http /srv/http/files.db

Nehmen wir ferner an, dass unser Router von außen über die Adresse test.dyndns.net erreichbar ist. Dann könnte eine PHP-Lösung nas.php beispielsweise so aussehen:

<?php
  $db = new SQLite3('/srv/http/files.db');
  // find any values whose PARENT_IDs start with 64 = root directory:
  $results = $db->query('SELECT PARENT_ID,CLASS,DETAIL_ID,NAME FROM OBJECTS WHERE PARENT_ID LIKE "64%"');
  while ($row = $results->fetchArray()) {
    if ($row[1] == 'container.storageFolder') {
      // directory name as headline if object is a folder:
      echo "<h2>".$row[3]."</h2>\n";
    }
    else {
      // media object
      echo "<a href=\"http://test.dyndns.net:8200/MediaItems/".$row[2].".mpg\">".$row[3]."</a><br />\n";
    }
  }
?>

Wenn wir irgendwann Dateien vom NAS entfernen oder hinzufügen, sollte die Datenbank aktualisiert und neu auf den Webserver kopiert werden, sonst stimmen die Zuordnungen nicht mehr:

systemctl stop minidlna && minidlnad -R && systemctl start minidlna

Nun unbedingt erstmal warten, bis die Datenbank fertig geschrieben wurde! Der Fortschritt kann bekanntlich im Webbrowser überprüft werden. Danach dann:

rm /srv/http/files.db
cp /var/cache/minidlna/files.db /srv/http/files.db
chown http:http /srv/http/files.db

Besuchen wir nun die entsprechende Webseite aus dem Internet heraus (z.B. http://test.spdns.de/nas.php), werden uns die Links zu den Dateien angezeigt. Jetzt noch die Adresse eines Links kopieren und z.B. in VLC einfügen und schon kann das Streaming vom heimischen NAS losgehen (vorausgesetzt, die Uploadgeschwindigkeit des Internetanschlusses ist hoch genug).