\ Cela fait 6 mois depuis la première version de Postgresus. Pendant cette période, le projet a reçu 247 commits, de nouvelles fonctionnalités, ainsi que ~2,8k étoiles sur GitHub et ~42k téléchargements depuis Docker Hub. La communauté du projet a également grandi, il y a maintenant 13 contributeurs et 90 personnes dans le groupe Telegram.
Dans cet article, je vais couvrir :
\
Pour ceux qui entendent parler du projet pour la première fois : Postgresus est un outil de sauvegarde PostgreSQL open source avec interface utilisateur. Il exécute des sauvegardes programmées de plusieurs bases de données, les enregistre localement ou sur des stockages externes, et vous notifie lorsque les sauvegardes sont terminées ou échouent.
Le projet se déploie avec une seule commande dans Docker. Il peut être installé via un script shell, une commande Docker, docker-compose.yml et maintenant via Helm pour Kubernetes. Plus d'informations sur les méthodes d'installation.
Outre la fonctionnalité principale "faire des sauvegardes", le projet peut :
Site web - https://postgresus.com/
GitHub - https://github.com/RostislavDugin/postgresus (une étoile serait appréciée ⭐️)
L'interface du projet ressemble à ceci :
Vidéo d'aperçu : https://www.youtube.com/watch?v=1qsAnijJfJE
Pour ceux qui souhaitent participer au développement, il existe une page séparée dans la documentation. Si quelqu'un veut aider le projet mais ne veut pas coder — parlez simplement du projet à vos collègues et amis ! C'est aussi une grande aide et une contribution au projet.
Je sais comment développer, mais promouvoir même un projet open source est assez difficile. Le projet gagne en reconnaissance grâce à ceux qui font des critiques vidéo et parlent du projet sur les réseaux sociaux. Merci !
Beaucoup de choses ont changé au cours de ces six mois. Le projet a été amélioré dans quatre directions :
Passons en revue chacune d'entre elles.
Outre les sauvegardes, Postgresus surveille désormais l'état de la base de données : il affiche le temps de fonctionnement et vous alerte si une base de données était indisponible.
La vérification de l'état peut être désactivée et configurée.
Si la base de données est indisponible — le système enverra une notification à ce sujet.
Initialement, Postgresus ne pouvait stocker les sauvegardes que localement et dans S3. Google Drive, CloudFlare R2, Azure Blob Storage et NAS ont été ajoutés. Les plans incluent l'ajout de FTP et éventuellement SFTP et NFS.
Pour les notifications, le projet avait initialement Telegram et e-mail (SMTP). Maintenant, Slack, Discord, MS Teams et les webhooks sont également pris en charge. De plus, les webhooks sont désormais configurés de manière flexible pour se connecter à différentes plateformes :
Auparavant, le système n'avait qu'un seul utilisateur (administrateur), et les bases de données étaient globales pour l'ensemble du système. Maintenant, Postgresus prend en charge la création d'espaces de travail pour séparer les bases de données et l'ajout d'utilisateurs aux espaces de travail. Avec séparation des rôles :
Par conséquent, vous pouvez maintenant séparer les bases de données :
Les équipes DBA et les grandes entreprises d'externalisation ont commencé à utiliser Postgresus, ce qui en fait une fonctionnalité importante. Cela rend le projet utile non seulement pour les développeurs individuels, DevOps ou DBA, mais pour des équipes et des entreprises entières.
Les journaux d'audit sont également apparus :
Si quelqu'un décide de supprimer toutes les bases de données ou pour une raison quelconque télécharge toutes les sauvegardes de toutes les bases de données — cela sera visible 🙃
Dans la première version, honnêtement, je n'avais pas le temps pour la sécurité. Je stockais tous les fichiers de sauvegarde localement, personne n'y avait accès, et mes projets n'étaient pas exactement top secrets.
Mais quand Postgresus est devenu open source, j'ai rapidement appris que les équipes sauvegardent souvent des sauvegardes dans des buckets S3 partagés et ne veulent pas que d'autres les lisent. Les mots de passe des bases de données ne devraient pas non plus être stockés dans la propre base de données de Postgresus, car de nombreuses personnes ont accès à ses serveurs. ~~Et il y a une certaine méfiance les uns envers les autres.~~ Ne pas exposer simplement les secrets via l'API n'est plus suffisant.
Ainsi, le chiffrement et la sécurité de l'ensemble du projet sont devenus la priorité principale pour Postgresus. La protection fonctionne maintenant à trois niveaux, et il y a une page de documentation dédiée pour cela.
Tous les mots de passe de base de données, les tokens Slack et les identifiants S3 sont stockés chiffrés dans la base de données de Postgresus. Ils ne sont déchiffrés que lorsque c'est nécessaire. La clé secrète est stockée dans un fichier séparé de la base de données, donc même si quelqu'un piratait la base de données de Postgresus (qui n'est de toute façon pas exposée en externe) — ils ne pourraient toujours rien lire. Le chiffrement utilise AES-256-GCM.
Les fichiers de sauvegarde sont maintenant également chiffrés (en option, mais le chiffrement est activé par défaut). Si vous avez perdu un fichier ou l'avez enregistré dans un S3 public — ce n'est plus si effrayant.
Le chiffrement utilise à la fois du sel et un vecteur d'initialisation unique. Cela empêche les attaquants de trouver des modèles pour deviner la clé de chiffrement, même s'ils volent tous vos fichiers de sauvegarde.
Le chiffrement est effectué en mode streaming, AES-256-GCM est également utilisé ici.
Malgré les deux premiers points, il n'existe pas de méthode de protection à 100%. Il y a toujours une infime chance que :
Donc Postgresus devrait aider les utilisateurs à minimiser les dommages. La probabilité d'un tel piratage peut être proche de zéro, mais c'est une maigre consolation si vous êtes celui à qui cela arrive.
Maintenant, lorsque vous ajoutez un utilisateur de base de données avec des autorisations d'écriture à Postgresus, le système propose de créer automatiquement un utilisateur en lecture seule et d'exécuter des sauvegardes à travers lui. Les gens sont beaucoup plus susceptibles de créer un rôle en lecture seule lorsqu'il suffit d'un clic au lieu de le configurer manuellement dans la base de données.
Voici comment Postgresus propose :
Propose très persistamment :
Avec cette approche, même si votre serveur Postgresus est piraté, tout est déchiffré et les attaquants obtiennent l'accès à votre base de données — ils ne pourront au moins pas corrompre la base de données. Savoir que tout n'est pas perdu est une assez bonne consolation.
La première version de Postgresus offrait tous les algorithmes de compression que PostgreSQL prend en charge : gzip, lz4 et zstd, avec des niveaux de compression de 1 à 9. Honnêtement, je ne comprenais pas vraiment pourquoi quelqu'un aurait besoin de toutes ces options. J'ai simplement choisi gzip avec le niveau 5 comme ce qui semblait être un juste milieu raisonnable.
Mais une fois que le projet est devenu open source, j'ai dû réellement faire des recherches à ce sujet. J'ai donc exécuté 21 sauvegardes dans toutes les combinaisons possibles et trouvé le meilleur compromis entre vitesse et taille.
Donc maintenant par défaut pour toutes les sauvegardes, zstd avec un niveau de compression 5 est défini, si la version de PostgreSQL est 16 et supérieure. Si inférieure — toujours gzip (au fait, merci encore aux contributeurs pour le support de PG 12). Voici zstd 5 comparé à gzip 5 (c'est en bas) :
En moyenne, les sauvegardes sont compressées ~8 fois par rapport à la taille réelle de la base de données.
Celui-ci est rapide — nous avons ajouté le support natif k8s avec l'installation Helm. Les équipes exécutant k8s dans le cloud peuvent maintenant déployer Postgresus plus facilement. Trois contributeurs ont aidé avec cette fonctionnalité.
Je ne suis pas vraiment fan des thèmes sombres. Mais il y avait beaucoup de demandes, alors j'en ai ajouté un (~~merci Claude pour l'aide et l'œil de designer~~). Étonnamment, il s'est avéré meilleur que le thème clair et est devenu le thème par défaut. J'ai même redessiné le site web du clair au sombre — il était si beau.
Avant :
Après :
D'abord, un peu de contexte :
Je croyais que Postgresus devrait éventuellement prendre en charge les sauvegardes incrémentielles. Après tout, c'est ce que font les outils sérieux ! Même ChatGPT dit que les outils sérieux peuvent récupérer avec précision jusqu'à la seconde et la transaction.
J'ai donc commencé à y travailler. Mais ensuite la réalité a frappé :
Pour la récupération — il n'y a pas d'option pour ne pas se connecter au disque avec la base de données. Pour récupérer à partir d'une sauvegarde incrémentielle, l'outil de sauvegarde restaure simplement le dossier pgdata (plus précisément, une partie de celui-ci).
Si la base de données est vraiment grande, par exemple, plusieurs To et plus — un réglage fin dans les configurations est nécessaire. Ici, l'interface utilisateur est plus un obstacle qu'une aide.
Par conséquent, si Postgresus fait une sauvegarde d'une base de données gérée — il suffit de le faire environ une fois par semaine. Juste au cas où d'urgence imprévue ou si le cloud ne permet pas de stocker les sauvegardes assez longtemps. Sinon, fiez-vous aux propres sauvegardes incrémentielles du cloud.
Mais si vous êtes une banque ou un développeur de base de données gérée, vous avez vraiment besoin de la meilleure configuration de sauvegarde pour vos dizaines et centaines de téraoctets de données. Ici, Postgresus ne surpassera jamais les sauvegardes physiques de WAL-G ou pgBackRest en termes de commodité de console et d'efficacité pour les bases de données avec un volume en To et plus. Mais, à mon avis, ce sont déjà des outils spécialisés pour de telles tâches, fabriqués par des génies et des mainteneurs de PostgreSQL lui-même.
À mon avis, les sauvegardes incrémentielles sont vraiment nécessaires dans deux cas :
Compte tenu de tout cela, j'ai pris la décision délibérée d'abandonner le développement de sauvegardes incrémentielles. Au lieu de cela, je me concentre sur la réalisation de sauvegardes logiques aussi pratiques, fiables et pratiques pour une utilisation quotidienne par les développeurs, DevOps, DBA et entreprises.
Les points ci-dessus sont loin d'être tout. 80% du travail n'est généralement pas visible. De mémoire, voici une courte liste :
pg_dump envoie en attendant que S3 rattrape (le téléchargement depuis la base de données est généralement plus rapide que le téléchargement vers le cloud). L'utilisation de la RAM est maintenant limitée à 32 Mo par sauvegarde parallèle.Et bien plus encore.
Bien sûr, tout ne fonctionne pas et certaines choses doivent être abandonnées. Je construis Postgresus pendant mon temps libre, qui existe à peine. Je ne peux donc pas me disperser ou compliquer l'UX avec des fonctionnalités inutiles. Trop de fonctionnalités est également mauvais.
Je voulais faire de Postgresus un outil de surveillance PostgreSQL également. Y compris les ressources système du serveur exécutant PostgreSQL :
J'ai même créé la base pour collecter des métriques (n'importe lesquelles) et un modèle pour les graphiques :
Il s'avère que PostgreSQL n'expose que l'utilisation de la RAM et les métriques IO prêtes à l'emploi.
La surveillance d'autres ressources nécessite des extensions. Mais toutes les bases de données ne peuvent pas installer les extensions dont j'ai besoin, je ne pouvais donc collecter que des métriques partielles. Puis j'ai découvert que les bases de données cloud ne permettent souvent pas d'installer des extensions du tout.
Puis j'ai réalisé que les métriques devraient être stockées dans VictoriaMetrics ou au moins TimescaleDB, pas dans le propre PostgreSQL de Postgresus, ce qui compliquerait la construction de l'image.
Au final, cette fonctionnalité non essentielle ajouterait :
J'ai donc abandonné la surveillance des ressources et me suis concentré sur faire de Postgresus le meilleur outil de sauvegarde possible.
Je voulais également ajouter une console SQL. Puisque Postgresus est déjà connecté à la base de données, pourquoi ne pas exécuter des requêtes directement à partir de celle-ci ? Ce serait pratique — pas besoin d'ouvrir PgAdmin, DataGrip ou DBeaver à chaque fois.
Je n'ai jamais trouvé le temps d'y travailler, seulement planifié. Un contributeur a commencé sur la fonctionnalité et a fait une PR. Mais comme prévu avec des fonctionnalités complexes, de nombreuses exigences et cas limites sont apparus :
C'est essentiellement un projet complet en soi, pas seulement un onglet.
Nous avons décidé d'abandonner la fonctionnalité et d'économiser l'effort. Cela s'est avéré être le bon choix, puisque nous avons ajouté des rôles en lecture seule qui ne permettent pas INSERT, UPDATE et DELETE de toute façon.
C'est le voyage que Postgresus a fait en six mois. Il est passé d'un projet de niche à un outil de niveau entreprise qui aide à la fois les développeurs individuels et des équipes DBA entières (j'ai été surpris d'apprendre cela seulement ~2 mois après la première version, d'ailleurs). Je suis sincèrement heureux que des milliers de projets et d'utilisateurs comptent sur Postgresus.
Le projet ne s'arrête pas là. Mon objectif maintenant est de faire de Postgresus l'outil de sauvegarde PostgreSQL le plus pratique au monde. Il y a un grand arriéré de fonctionnalités et d'améliorations qui arrivent progressivement.
Mes principales priorités restent :
Si vous aimez le projet ou le trouvez utile — j'apprécierais une étoile sur GitHub ou le partager avec des amis ❤️
\


Copier le lienX (Twitter)LinkedInFacebookEmail
Le moment du feu vert pour l'ennuyeux Bitcoin approche