Developer Dagboek #1 - PostgreSQL database backups maken
Auteur: Danny Holstein
Enige tijd geleden heb ik in een ander blogbericht over EasyPanel geschreven. De Bee-organisatie maakt onder andere gebruik van de kant-en-klare PostgreSQL database templates.
Een openstaand vraagstuk was nog wel: Hoe zijn back-ups te maken van de PostgreSQL-databases die actief zijn in een Docker container? Hiervoor heeft EasyPanel ook een kant-en-klaar template, namelijk: Postgres Backup.
Het Postgres Backup template was makkelijk om in te stellen. Het was al iets ingewikkelder om een S3-proxy in te stellen zodat een database back-up in de Azure Blob Storage wordt opgeslagen. Er deed zich echter een probleem voor waardoor het template van EasyPanel niet werkte.
De foutmelding en het probleem
Nadat alles was ingesteld, verscheen er in het console de foutmelding: ‘aborting because of server version mismatch’. Het bleek dat de versie van pg_dump in het Postgres Backup template versie 14 is, maar de PostgreSQL database is versie 16.
pg_dump is een kleine applicatie op de achtergrond die database back-ups maakt speciaal voor PostgreSQL databases. Zoals de fout hierboven aangeeft, kan een oudere versie van pg_dump niet worden gebruikt in combinatie met een nieuwere versie van een PostgreSQL database.
Impliciet gaat het Postgres-team ervan uit dat databases worden geüpgraded naar de nieuwste versie. Op een bepaald punt worden eerdere versies deprecated.
Het onderzoeken van een oplossing
In grote lijnen komt de oplossing erop neer dat er een docker container wordt uitgevoerd met daarin de juiste versie van pg_dump en een .NET applicatie die de stappen van een database back-ups uitvoert.
De vraag was: hoe is pg_dump in een docker container te krijgen? Na heel wat uitproberen, bleek dit te bereiken door eerst de benodigde deb-bestanden (dat zijn archiefbestanden voor Debian/Linux) te downloaden. In dit geval waren dat de pakketten postgresql-client-16 en zijn benodigde dependency: postgresql-16.
De 2 deb-bestanden moesten vervolgens uitgepakt worden. Dat te bereiken is met het commando: RUN dpkg -x ./bestandsnaam in de Dockerfile. Dit commando pakte de bestanden uit in de directory: /lib/postgresql/16/ - en was een verificatie dat de bestanden zich in ieder geval nu in de Docker container bevonden. Na het uitpakken waren de 2 deb-bestanden niet meer nodig en zijn deze uit de Docker container te verwijderen met het commando: RUN rm -rf ./bestandsnaam
De .NET applicatie
De .NET applicatie maakt gebruik van bekende technieken: Swagger om op een makkelijke manier toegang te krijgen tot de endpoints, Keycloak wordt gebruikt om de endpoints alleen toegankelijk te maken voor administrators, er is een service om de database back-ups op Azure Blob Storage te plaatsen en er wordt gebruik gemaakt van Quartz.NET om op bepaalde tijdstippen (met Jobs) back-ups te maken.
Een handige library in deze gebruikerszaak bleek CliWrap te zijn. Met deze library wordt op de achtergrond het benodigde commando voor pg_dump in een (niet zichtbare) terminal uitgevoerd. De voordelen van libraries zijn onder andere dat er geen extra code geschreven hoeft te worden. Libraries zijn vaak al uitgetest en worden actief onderhouden. CliWrap bleek bijzonder bruikbaar te zijn om fouten in de terminal vast te stellen.
Na de nodige trail-and-error is het gelukt om met een lokale PostgreSQL-database - die uitgevoerd werd in een Docker container – verbinding te maken en daarvan een back-up te maken. In de Online-versie wordt een database back-up op Azure Blob Storage geplaatst.
De live applicatie
Voor de live applicatie is er een extra Helper-service toegevoegd die de workdirectory toont, het pad naar pg_dump controleert, handmatig back-ups kan maken en de tijdzone van de docker container weergeeft. De tijdzone is van belang voor de Quartz.NET jobs om op het gewenste tijdstip een back-up te maken. Dit is relatief eenvoudig te bereiken door in de Dockerfile de regel toe te voegen:
ENV TZ=Europe/Amsterdam
Om zaken uit te testen, maakte ik eerst handmatig back-ups via de applicatie. De verrassing was dat er geen extra poorten opgezet hoefden te worden van de PostgreSQL-databases, want met EasyPanel maken de verschillende Docker containers gebruik van het interne Docker netwerk. Via het Docker netwerk kunnen de verschillende services met elkaar communiceren. Bovendien is er in het Docker-netwerk niets van buitenaf dat data van binnenuit kan verkrijgen en is dit dus veilig.
Tot slot
Om deze applicatie compleet te maken, is er functionaliteit toegevoegd om oude database back-ups op te ruimen. Na verloop van tijd kunnen dit niet alleen veel bestanden worden, maar kan dit ook veel schijfruimte innemen. Via een Quartz.NET job worden back-ups die ouder zijn dan 60 dagen automatisch verwijderd.
Het was een leuke en interessante uitdaging om deze PostgreSQL database back-up applicatie te maken. Het voordeel is dat er nu iedere zaterdagochtend vroeg een automatische back-up wordt gemaakt van de PostgreSQL-databases. Wanneer er iets fout mocht gaan met een database, dan is er nu een eenvoudige manier om dit te herstellen door middel van een back-up.