Aufgabe
Mehrere PostgreSQL-Datenbanken sollten ohne SSH-Zugang zum Server und ohne manuelles pg_dump gesichert werden. Eine volle Kopie einer großen Datenbank ist teuer, deshalb brauchte es dazwischen kleine Backups nur mit den Änderungen.
Lösung
Eine Webanwendung mit Django gebaut. Jedes Backup speichert einen Fingerabdruck aller Zeilen, das nächste vergleicht den aktuellen Stand damit und schreibt nur den Unterschied: neue, geänderte und gelöschte Zeilen. Der Unterschied landet in einer SQL-Datei, die mit einfachem psql auf das wiederhergestellte volle Backup angewendet wird. Vor dem Start prüft die Anwendung die Verbindung und erklärt Fehler verständlich.
Umgesetzte Aufgaben
- Volle Backups mit pg_dump und darauf inkrementelle und differenzielle gebaut
- Jede Änderung erfasst, auch gelöschte Zeilen, ohne updated_at-Spalten
- Wiederherstellung vollständig mit Tests gegen echtes PostgreSQL geprüft
- Backups in einen Hintergrund-Worker verlegt, die Seite wartet nie auf einen Dump
- Speicher wählbar gemacht: Serverplatte oder S3
- Datenbankpasswörter nicht gespeichert: verschlüsselt in der Warteschlange, nach dem Backup gelöscht
- Zugriff getrennt: jeder Nutzer sieht nur seine Backups
Ergebnis
Ein Backup ist im Browser mit zwei Klicks erledigt, zwischen vollen Backups werden nur Änderungen gespeichert. Der Code ist offen auf GitHub, der Dienst startet mit einem einzigen docker compose up.
Technologien
PythonDjangoPostgreSQLS3Docker