Web-Archiv Teil 2: Wallabag via Docker auf Synology NAS

Wie schon in verschiedenen anderen Postings vorgestellt, bin ich ein Fan meines Synology-NAS und des darauf laufenden Dockers1. Docker ermöglicht es, auf einfache Art und Weise Software zu installieren und dabei so zu abstrahieren, dass das normale „Wirts“-System abgeschottet wird und die Docker-Container nur das lesen / schreiben / können sollen, was man Ihnen explizit erlaubt. Mittels Docker kann man so Software installieren und ausprobieren, ohne sich das eigene System „zu versauen“. Dennoch sollte man vorsichtig sein und nicht blind jedes Image ziehen und in einem Container zum Laufen bringen: Der Docker-Hub ist mittlerweile ein Tummelplatz für Malware und es wurden auch schon Methoden gefunden, aus dem Container auszubrechen. Ganz besonders, wenn auch dem eigenen NAS alle persönlichen Daten liegen.

Das Wallabag-Interface

Für Wallabag gibt es ein eigenes offizielles Docker-Image, das schnell herunter geladen und konfiguriert ist. Die Konfiguration des Containers ist trivial – lediglich ein Port muss angegeben werden und die Umgebungsvariable SYMFONY__ENV_DOMAIN_NAME mit dem eigenen gewünschen Domainnamen versehen werden. Hierzu in Teil 3 mehr, wenn wir den Reverse Proxy einrichten. Für den Moment kann man hier die IP-Adresse des NAS eintragen. Wie das grundlegend funktioniert, habe ich im Artikel „Hoste Selbst“ dargelegt und deshalb gehe ich hier nicht nochmals auf die Details ein.

Das Image kann einfach durch die Suche gefunden werden und wird mittels Doppelklick heruntergeladen. Einmal fertig, kann aus dem Image ein Container erzeugt werden. Nach Konfiguration des Containers ist Wallabag dann sogleich auch unter dem gewählten Port unter der IP-Adresse des NAS verfügbar. Nach Anlegen eines Benutzeraccounts kann man nun Links hinzufügen und das System erst einmal auf Herz und Nieren testen, indem man die NAS-IP mit dem gewählten Port aufruft.

Für Firefox gibt es eine offizielle Erweiterung, ansonsten gibt es ein (auch unter iOS/Safari) funktionierenden Bookmarklet, das man sich aus der Konfiguration heraus installieren kann. Die Firefox-Erweiterung muss nach dem Download via about:addons konfiguriert werden und funktioniert dann gut. In ihr lassen sich auch Seiten direkt als gelesen markieren. Ein Wort der Warnung: Jede Website, die fortan mit Firefox angesurft wird, wird an Wallabag gesendet, um zu überprüfen, ob diese dort schon gespeichert wurde. Das kann man in den Wallaban-Logs sehen:
[10/Mar/2019:22:12:41 +0000] "GET /api/entries/exists.json?url=https://example.com/ HTTP/1.1" 401 105 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:66.0) Gecko/20100101 Firefox/66.0"

Dies ist sicherlich weniger kritisch, weil Wallabag ja auf dem eigenen Server läuft, kann aber auch ganz schön viel Lärm erzeugen. Dieses Verhalten kann man unter Indicate if page already saved ausschalten. Sollte das Feature eingeschaltet bleiben, unbedingt auf HTTPS für Wallabag achten.

Die Leseansicht von Wallabag

Wallabag verfügt über Import-Parser für Daten der gängigsten Bookmark-Services (Pinboard, Instapaper, Pocket etc) und man kann somit sein Archiv umziehen, so wie ich es von Pinboard getan habe.
Leider(?) hatte ich dort über die Jahre über 10.000 Links angesammelt (vieles davon via Twitter), deshalb war die JSON-Datei entsprechend unhandlich. Ich habe diese Datei (manuell) in 20 Dateien aufgeteilt, die somit jeweils 500 Links enthalten haben. Dies hat den Import wesentlich handlicher gemacht, insbesondere dann, wenn sich der Import-Parser abgeschossen hat und ich wieder von neuem beginnen musste.
Hinweis: Bevor man alle seine Daten importiert, sollte man sich mit dem Backup- und Restore-Konzept vertraut machen. Hierzu in Teil 4 mehr.

Den eigentlichen Datenimport habe ich wie folgt gelöst:

Erst einmal die Daten vom eigenen NAS in den Container übertragen (oder gleich den Order in den Container einbinden):
docker cp /volume1/docker/wallabag/import/pinboard_export_manual_fix.json wallabag:/var/www/wallabag/data/

Hier müssen natürlich der lokale NAS-Pfad und der Dateiname angepasst werden. Falls euer Container nicht wallabag heißt, müsst ihr auch das ändern.
Anschließend verbindet man sich in den Container 2:

sudo docker exec -i -t wallabag /bin/sh

Im Container angekommen, ist es keine schlechte Idee, das PHP-RAM-Limit hoch zu schrauben. Hier sollte man einen sinnvollen Wert wählen – mein NAS hat bspw. 8 GB RAM und 2GB davon darf PHP im Wallabag-Container nun im schlimmsten Fall verbrauchen.
Man startet vi und editiert die entsprechende DateiL

vi /etc/php7/php.ini

Nun muss man nach memory_limit suchen und die Zeile entsprechend verändern:

2048mb memory_limit.

Den Import der Lesezeichen kann man über die GUI erledigen, man sieht hierbei aber keinerlei Fortschritt und fliegt blind — ich empfehle daher den Import über die Kommandozeile, wo auch gleich geloggt wird, was los ist. Bei langem Import sieht man nur ein Webserver-Timeout und muss warten, bis der Import abgeschlossen ist.

Das Wallabag-Team hat in den Docs eine Übersicht von Kommandozeilen-Befehlen angefertigt.
All diese Befehle funktionieren nur korrekt, wenn man sich im Verzeichnis /var/www/wallabag/ befindet.

Also los, wir begeben uns an den Import:
cd /var/www/wallabag/

Und dann:

php bin/console wallabag:import --importer=pinboard --markAsRead=true martin /var/www/wallabag/data/pinboard_export_manual_fix.json -e=prod

Hier wird nun eine JSON-Datei im Pinboard-Format importiert. Hierbei muss mittels --importer= der korrekte Dienst / Importer gewählt werden, weil der Import sonst nicht funktioniert. --markAsRead=true bestimmt, ob die Einträge schon als gelesen markiert werden sollen und martin ist der Username des Accounts.

Während des Imports hagelt es dann Meldungen über Fehler, die aber meist nur auf Grund falschen Parsings von Zeitstempeln entstehen. Bleibt der Parser jedoch mit einem „Segmentation Fault“ stehen, muss man ihn neu starten und hat anschließend ein paar Duplikate in der Datenbank.

Der Output kann beispielsweise so aussehen:

/var/www/wallabag # php bin/console wallabag:import --importer=pinboard --markAsRead=true martin /var/www/wallabag/data/pinboard_export_manual_fix.json -e=prod
Start : 02-02-2019 7:29:45 ---
PHP Warning: DOMXPath::evaluate(): Invalid expression in /var/www/wallabag/vendor/j0k3r/graby/src/Extractor/ContentExtractor.php on line 1021
07:29:55 WARNING [app] Error while defining date ["e" => Exception { …},"url" => "http://example.com","date" => """ 11:16\n AM\n -\n 16\n Dec\n 2016 """] []

Nachdem alle alten Lesezeichen importiert wurden, sollte man Duplikate löschen, die durch teilweise Re-Importe vorkommen können:

php bin/console wallabag:clean-duplicates martin -e=prod
Der martin ist auch hier wieder der Username, den ihr ersetzen müsst.

Nun ist das eigene Archiv einsatzbereit und man kann testen, ob auch neue Links über das Bookmarklet oder das [+]-Zeichen hinzugefügt werden können.
Ich habe nach dem Import in den Einstellungen unter „Misc“ den lokalen Download von Grafiken eingeschaltet: Somit werden alle in Artikeln enthaltenen Grafiken lokal heruntergeladen und stehen dann auch noch zur Verfügung, wenn die Original-Grafiken schon gelöscht wurden.

Ebenfalls empfiehlt es sich, in den Einstellungen die nach dem eigenen Geschmack passenden Exportoptionen einzuschalten. Besonders praktisch ist der „Public Share“, welcher einen Text über einen öffentlichen Link zur Verfügung stellt. Allerdings sollte man hier aufpassen, keine Rechte Dritter zu verletzen. Es ist bspw. nicht in Ordnung, so einen Artikel, den man aus einer Paywall herausgehoben hat, öffentlich zu machen.

Die folgenden Themen werden in der Wallabag-Artikelserie behandelt:
Einleitung —  Auf Vorrat gespeichert: Das eigene Web-Archiv auf dem NAS
Teil 1: Was kann Wallabag?
Teil 2: Wallabag via Docker auf Synology NAS
Teil 3: Wallabag-Tuning
Teil 4: Wallabag und Paywalls
Teil 5: Wallabag-Backup und Versionsupdates
Teil 6: RSS-Import zu Wallabag
Teil 7: Wallabag und eReader
Teil 8: Archivebox und Wallabag

  1. Das klappt leider nur vernünftig bei besseren NAS-Modellen, die eine Intel-CPU nutzen.
  2. Vorher muss man sich per SSH auf das NAS eingeloggt haben und root sein.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.