Thomas Kramer

IT-COW | Oktober 2021

Migration von TTRSS-Datenbanken auf neuere Postgres-Versionen

By Administrator at Oktober 16, 2021 16:01
Filed Under:

Auf meinem Server habe ich einen Tiny Tiny RSS-Docker am laufen, konkret den Docker von Henry Wang. Den kann ich durchaus weiterempfehlen, ein Wiki dazu gibt es hier. Ein Grund dafür, dass ich den ausgewählt hatte, war damals dass es den auch für die ARM-Architektur gibt. Mittlerweile setze ich ihn aber auf einem Intel NUC-Mini-PC ein.

 

Mit Mercury-Fulltext gibt es auch ein Plugin dafür um RSS-Beiträge automatisch zu vervollständigen, denn RSS-Beiträge sind üblicherweise gekürzt. Das funktioniert nicht bei allen Seiten gleichermaßen, ist aber trotzdem eine willkommene Erweiterung.

 

Meine TTRSS-Instanz läuft mit der Datenbank PostgreSQL in einem separaten Docker-Container. Dazu habe ich über einen Cronjob eine automatische Aktualisierung der Docker-Container aktiviert:

 

0 5 * * 0 docker run --rm --name="watchtower-once" --volume /var/run/docker.sock:/var/run/docker.sock -d containrrr/watchtower --run-once
10 5 * * 0 docker images -q --filter "dangling=true" | xargs -n1 -r docker rmi

 

Nicht mehr benötigte Docker-Images werden außerdem automatisch gelöscht. Das funktioniert soweit auch ganz gut, aber automatische Updates haben auch ihre Tücken. Denn wenn die Datenbank einen großen Versionssprung macht, können die alten Datafiles nicht mehr weiterverwendet werden, und TTRSS läuft nicht mehr.

 

Da das Problem jetzt schon das zweite Mal aufgetreten ist, schreibe ich die Lösung einmal auf. Ich hätte eine neue Postgres-Datenbank anlegen können, aber dann wären auch die alten Inhalte und Einstellungen verloren gegangen.

 

Mit

docker ps

kann man sich die laufenden Docker-Container anschauen. Dabei konnte ich sehen, dass der PostgreSQL-Container sich andauernd automatisch neu startete. Mit davon betroffen waren natürlich die anhängigen Container von TTRSS, welche die Postgres-Datenbank benutzen.

 

Mit

docker logs postgres

habe ich mir die zuletzt geloggten Fehlermeldungen des Docker-Containers von postgres angeschaut. Dabei ist mir folgende Fehlermeldung aufgefallen:

The data directory was initialized by PostgreSQL version 13 which is not compatible with this version 14.0

 

Dann habe ich mir die YAML-Datei angeschaut, mit der die TTRSS-Container mitsamt PostgreSQL aufgesetzt wurden. Dabei wurde ein Mapping-Verzeichnis der Data-Dateien von Postgres festgelegt, vom Host zum Docker-Container. Die Datafiles von PostgreSQL habe ich vom Host über WinSCP auf meinen PC rüberkopiert.

 

Auf meinem PC habe ich dann die gleiche Version 13 von PostgreSQL als Server installiert. Den PostgreSQL-Dienst habe ich dann heruntergefahren, und das DATA-Verzeichnis mit dem der TTRSS-Datenbank ausgetauscht. Das reicht aber nicht ohne weiteres aus, denn der PostgreSQL-Dienst fährt so noch nicht hoch.

 

Auf dem ausgetauschten DATA-Verzeichnis

C:\Program Files\PostgreSQL\13\data

habe ich NTFS-Berechtigungen hinzugefügt, denn der NETZWERKDIENST muss als Benutzer mit vollen Zugriffsrechten hinzugefügt und rekursiv vererbt werden.

 

Danach musste ich noch die Datei

C:\Program Files\PostgreSQL\13\data\postgresql.conf

bearbeiten und die Zeile

dynamic_shared_memory_type = posix

durch

dynamic_shared_memory_type = windows

austauschen.

 

Dann ließ sich der PostgreSQL-Dienst endlich fehlerfrei hochfahren, mit der alten Tiny Tiny RSS-Datenbank. Anschließend habe ich am PC einen Datenbank-Dump erstellt:

pg_dumpall --dbname=postgresql://$user:$password@127.0.0.1:5432/ttrss >temp.dmp

 

Auf dem NUC habe ich mit

docker stop postgres

den Postgres-Dienst komplett heruntergefahren und dann das DATA-Verzeichnis komplett gelöscht.

Anschließend habe ich mit

docker start postgres

die Postgres-Datenbank wieder gestartet, dabei wird automatisch ein neues DATA-Verzeichnis mit einer weitgehend leeren Datenbank angelegt.

 

Danach will man natürlich den alten Dump wieder importieren. Dazu muss man die PostgreSQL-Kommandozeilentools verwenden, die innerhalb des PostgreSQL-Containers verfügbar sind. Und für das Importprogramm muss der Dump natürlich an einem Ort abgelegt sein, von wo aus er darauf zugreifen kann.

 

Daher kopiert man den Dump mittels WinSCP in das DATA-Mappingverzeichnis des Hosts, dafür muss man einen Blick in die YAML-Datei werfen. Mit dem Befehl

docker exec –it postgres bash

macht man eine Bash-Kommandozeile in die interne Sicht des Containers auf. Dort habe ich dann über den Befehl

psql –U postgres –f temp.dmp postgres

den Dump wieder importiert.

 

Anschließend war die Tiny Tiny-RSS-Datenbank mit allen Inhalten und Einstellungen wieder da, aber diesmal mit dem Stand der PostgreSQL-Version 14. Ich musste die Tiny Tiny RSS-Datenbank also nicht wieder neu anlegen, aber ich musste zumindest das Default-Admin-Passwort (admin/password) wieder ändern.

 

Mit einer automatischen Aktualisierung hat man etwas mehr Sicherheit speziell wenn man Dienste übers Internet verfügbar macht, aber das geht nicht immer ohne Komplikationen. Wenn es nur um die Sicherheit geht, muss man die nicht extern erreichbaren Container auch nicht automatisch updaten.

   

Tag-Wolke

Monats-Liste