Archiv der Kategorie: PC-Kram

Meine Lieblingsbeschäftigung :)

PostgreSQL-Update im Docker-Stil

Docker. Eigentlich ja ganz praktisch, wenn man „mal schnell“ ein Softwarepaket trotz überschaubarer Wartbarkeit mit überschaubarem Aufwand ausrollen möchte, ab und an aber auch ein zuverlässiger Quell für Facepalm-Momente. So auch Heute: Nach dem Update einer mit docker-compose zusammengesetzten Anwendung ging nichts mehr. Der Maintainer hatte dort von postgres:10 auf postgres:11 aktualisiert. Kleines Update sollte man meinen, die PostgreSQL-Images für Docker sind jedoch technisch nicht in der Lage Daten älterer Installationen zu migrieren. Folglich zeigte sich im Log vor dem Absturz folgende Meldung:

postgres_1 | FATAL: database files are incompatible with server
postgres_1 | DETAIL: The data directory was initialized by PostgreSQL version 10, which is not compatible with this version 11.6.

Was auf „normalen“ Servern mit pg_upgrade schnell geregelt und bei einigen Distributionen gar automatisiert ist, wird mit Docker ein paar Nummern komplizierter. Der Offizielle Weg: Backup machen, neu aufsetzen, importieren. Eigentlich wollte ich durch Docker Arbeit sparen, nicht mir weitere aufhalsen.

Glück im Unglück: Tianon Gravi hat auf GitHub und Docker Hub ein passendes System bereitgestellt, mit welchem man die Daten schnell zwischen verschiedenen PostgreSQL-Versionen migrieren kann.

Im Folgenden gehe ich davon aus, dass ein Named Volume „postgres-data“ existiert und alle darauf zugreifenden Container gestoppt sind.

Achtung, Fallstrick: Nutzt man docker-compose, so ändern sich die Volume-Namen. Ein Named Volume „postgres-data“ der Applikation „foobar“ heißt in Wahrheit „foobar_postgres-data„. Im Zweifel nochmal mit „docker volume ls“ prüfen.

  1. Fangen wir mit dem üblichen an: Backups. Bei Bind-Mounts kopiert man einfach den Quellordner passend zurecht, bei Named Volumes kann man diese üblicherweise unter /var/lib/docker/volumes/ finden oder mit docker-clone-volume duplizieren. Ich hatte postgres-data hierzu auf postgres-data-src und postgres-data-bck dupliziert.
  2. Weiter geht es mit dem Umwandeln der Datenbank. Hierzu nimmt man das Image mit den passenden Versionsnummern für Quell- und Zielversion.
    docker run --rm -v postgres-data-src:/var/lib/postgresql/10/data -v postgres-data-dst:/var/lib/postgresql/11/data tianon/postgres-upgrade:10-to-11
    Hiermit wird ein neues, mit PostgreSQL 11 kompatibles, Volume erzeugt, welches alle bisherigen Daten enthalten sollte.
  3. Leider gibt es in der aktuellen Version einen bekannten Bug, welche die Zugriffe in pg_hba.conf abweichend von den Dateien der offiziellen Images konfiguriert. Dies führt mit vielen Images zu Zugriffsfehlern. Um die Datei per hand zu editieren startet man entweder einen passenden Container oder greift über das Dateisystem des Hosts auf diese zu. In meinem Fall nutzte ich letztere Methode über die Datei /var/lib/docker/volumes/postgres-data-dst/_data/pg_hba.conf. An das Ende dieser wird folgende Zeile angefügt:
    host all all all md5
  4. Am Ende ändert man entweder den Volume-Eintrag seiner docker-compose.yml oder kopiert das neue Image passend zurück. In meinem Fall klang letzteres sinnvoller. Einen Befehl zum Umbenennen von Volumes ist Docker bis Heute nicht bekannt, daher bleibt hier nur das ursprüngliche Volume mit docker volume rm postgres-data zu löschen und postgres-data-dst – wie zuvor – mit docker-clone-volume oder im Dateisystem zum korrekten Volume-Namen zu klonen.

Warum man das nicht automatisiert erschließt sich mir nicht so ganz. Vermutlich beschränkt sich der Benutzerkreis hauptsächlich auf Entwickler, die ohnehin immer von 0 starten, und Enterprise-Häuser, die gemäß Fire-and-forget Systeme ohne Update bis zur Explosion betreiben.

BitBastelei #371: Messuhr-Innenleben

BitBastelei #371: Messuhr-Innenleben

(2 GB) 00:12:15

2020-02-09 11:00 🛈

Eine Messuhr erlaubt es Abstände und deren Differenzen zu ermitteln. Praktisch, wenn man z.B. das Druckbett eines 3D-Druckers prüfen möchte. Mein Modell hatte leider eine unpassende Halterung. Wenn ich ohnehin zerlegen muss, dann werfen wir doch gleich noch einen Blick auf das Innenleben und die Funktion eines solchen Messinstrumentes.

BitBastelei #370 – WTV020: Wählerisches Soundmodul

BitBastelei #370 - WTV020: Wählerisches Soundmodul

(414 MB) 00:18:24

2020-02-02 11:00 🛈

Aktuell bin ich auf der Suche nach einem neuen Soundmodul für Arduino & Co. Mein in der Vergangenheit verwendetes JQ8400 ist zwar praktisch, aber durch den kleinen Speicher nur für kleinere Projekte zu gebrauchen. Das WTV020 verspricht hier Abhilfe: Dank Micro-SD-Slot können deutlich mehr Daten gespeichert werden. Leider aber mit einigen Eigenheiten, die für mich das Modul eher weniger nutzbar erscheinen lassen.

BitBastelei #369 – Lötübung „Sanduhr“

BitBastelei #369 - Lötübung "Sanduhr"

(2 GB) 00:24:36

2020-01-26 11:00 🛈

Kalt, dunkel, meh. Wenn die Motivation für eigene Basteleien fehlt, schauen wir halt auf eine einfache Lötübung. Dieses Kit einer „digitalen Sanduhr“ gibt es an vielen Stellen zu kaufen und soll Einsteigern genügend Lötstellen zum Üben geben. Leider in meinem Fall ohne beiliegende Anleitung, aber bauen wir einfach mal auf und versuchen die Funktionsweise zu verstehen.

Weiterführende Links

BitBastelei #368 – ESP LCD-Adapter

BitBastelei #368 - ESP LCD-Adapter

(391 MB) 00:11:11

2020-01-19 11:00 🛈

Vor einiger Zeit hatte ich gezeigt wie man ein HD44780-Display mit Arduino an einen ESP8266 anbinden kann. Diese Konstruktion nutze ich noch immer um einen schnellen Überblick zu bekommen. Leider war die Verkabelung etwas wacklig, sodass ich immer wieder nachstecken und neu starten musste. Da noch etwas Platz in einem Paket war soll es nun dank KiCAD eine separate Platine richten. Kleine Arbeit, großer Stabilitätsgewinn.

BitBastelei #367 – Reingeschaut: Feuerwehr-Bedienfeld (FBF)

BitBastelei #367 - Reingeschaut: Feuerwehr-Bedienfeld (FBF)

(2 GB) 00:22:55

2020-01-12 11:00 🛈

Das Feuerwehr-Bedienfeld ist Teil von Brandmeldeanlagen (BMA), welche in vielen großen Gebäuden Feuer erkennen und automatisch die Feuerwehr alarmieren. Dieser Kasten hat an allen Anlagen das gleiche Aussehen, ist nur der Feuerwehr zugänglich und erlaubt es den Einsatzkräften den aktuellen Alarmstatus sowie einige Aktionen wie das Abschalten der Werkssirenen zu steuern. Ein solches ist mir hier zugeflogen, also schauen wir mal rein und prüfen, ob man das Ganze anderweitig weiternutzen kann.

BitBastelei #366 – Live-Debugging von Mikrocontrollern mit PlatformIO

BitBastelei #366 - Live-Debugging von Mikrocontrollern mit PlatformIO

(117 MB) 00:13:19

2020-01-05 11:00 🛈

Wenn es bei µC-Projekten darum geht Fehler zu suchen endet es meist mit dutzenden unübersichtlichen Serial.println-Zeilen im Code. Aktuelle Prozessorgenerationen erlauben es jedoch live die Ausführung zu überwachen, die CPU anzuhalten und den Inhalt von Variabeln und Registern zu beobachten. Mit PIO ist diese Funktion nun auch für Einsteigen recht einfach Nutzbar.

BitNotice #152 – BluePill/STM32 Flash entsperren

BitNotice #152 - BluePill/STM32 Flash entsperren

(23 MB) 00:02:39

2020-01-05 10:30 🛈

Die BluePill-Boards mit ihrem STM32 sind ein günstiger einstieg in die Welt der ARM-Prozessoren. Unter anderem der native USB-Anschluss ist eine praktische Ergänzung für viele Projekte, die auf WLAN verzichten können. Leider werden diese Boards ab und an mit einem gesperrten Flash geliefert, sodass Programmierversuche fehlschlagen. Mit wenigen Handgriffen kann man den Prozessor jedoch zurücksetzen und den Flash so wieder freigeben.

Fehlermeldung

 xPack OpenOCD, 64-bit Open On-Chip Debugger 0.10.0+dev (2019-07-17-11:25)
 Licensed under GNU GPL v2
 For bug reports, read
         http://openocd.org/doc/doxygen/bugs.html
 debug_level: 1
 
 hla_swd
 none separate
 
 target halted due to debug-request, current mode: Thread  
 xPSR: 0x01000000 pc: 0x1ffff020 msp: 0x200001fc
 ** Programming Started **
 Warn : STM32 flash size failed, probe inaccurate - assuming 128k flash
 Error: stm32x device protected
 Error: failed erasing sectors 0 to 12
 embedded:startup.tcl:449: Error: ** Programming Failed **
 in procedure 'program'  
 in procedure 'program_error' called at file "embedded:startup.tcl", line 508
 at file "embedded:startup.tcl", line 449
 *** [upload] Error 1 

Befehl zum entsperren

openocd -f /usr/share/openocd/scripts/interface/stlink-v2.cfg -f /usr/share/openocd/scripts/target/stm32f1x.cfg -c init -c "reset halt" -c "stm32f0x unlock 0" -c "reset run" -c shutdown

BitBastelei #365 – Otter Screen Adapter: iPad-Ersatzdisplays als Monitor

BitBastelei #365 - Otter Screen Adapter: iPad-Ersatzdisplays als Monitor

(2 GB) 00:30:36

2019-12-29 11:00 🛈

Displayplatz ist meist beschränkt, insbesondere bei Mobilgeräten kann das schnell eng werden. Für etwa 100€ gibt es kleinere Zusatzdisplays, welche man neben Laptop & Co stellen kann. Einen solchen, portablen Monitor kann man aber auch selbst bauen: Mit einem iPad-Ersatzdisplay (9.7″, 2048×1536) und einer kleinen Adapterplatine hat man schnell ein Displayport-fähiges High-DPI-Display für unterwegs. Die nötige Platine hat Jan-Henrik designed und ist unter https://github.com/Jan–Henrik/OtterScreenAdapter zu finden.

BitBastelei #363 – SMD-Löten mit Stencil

BitBastelei #363 - SMD-Löten mit Stencil

(2 GB) 00:19:42

2019-12-15 11:00 🛈

SMD-Bauteile sind heute oft Standard, möchte man jedoch mehrere Boards löten ist die übliche Methode mit Lötkolben und Lötzinn eher ineffizient. Mit einem Stencil, eine dünne Metallplatte mit Ausschnitten, lässt sich Lötpaste schnell und genau dosiert an die richtigen Stellen bringen und so der Zusammenbau beschleunigen.

Hinweis: Die Platinen und Stencils hatte ich diesmal selbst bestellt und bezahlt.