Installer Portabase avec Docker
Portabase

Installer Portabase avec Docker

Table des matières

GitHub - Portabase/portabase: Portabase - Database backup & restore tool for PostgreSQL, MySQL, MsSQL, MariaDB, Firebird SQL, SQLite, MongoDB, Redis and Docker Volume
Portabase - Database backup & restore tool for PostgreSQL, MySQL, MsSQL, MariaDB, Firebird SQL, SQLite, MongoDB, Redis and Docker Volume - Portabase/portabase

Les bases de données, c'est comme les dents. Tant que tu n'as pas de problème, tu en oublies même leur présence. Mais quand ça fait mal, tout d'un coup, plus rien d'autre ne compte.

En revanche, il est vachement plus simple de sauvegarder ses bases de données que de faire un backup de ses dents.

Aujourd'hui nous allons parler de Portabase ! Un outil génial pour sauvegarder/restaurer vos bases de données et vos volumes docker. Une interface moderne bien pensée vous facilitera la mise en place de toutes vos sauvegardes et restaurations.

Cela faisait un moment que j'avais Portabase en tête, avant la pause du site, pour tout vous dire, il y a peu, j'ai eu un contact intéressant avec un développeur de Portabase et nous avons convenu que cette application devait conquérir le monde. Comme Minux et Cortex, mais au niveau sauvegarde de base de données.

Ce qui est aussi intéressant, c'est une application française ! Une bonne occasion, à nouveau, de mettre en avant le travail de devs francophones, en l’occurrence, ceux de Portabase, sous le format d'une interview, c'est pour bientôt.

⚠️
Sauvegarder ne dispense pas de vérifier régulièrement le bon fonctionnement des sauvegardes, en les restaurant.

⚡ Caractéristiques

Portabase c'est quoi ?

Portabase est un outil conçu pour simplifier la sauvegarde et la restauration de vos instances de base de données. Il s'intègre parfaitement aux agents Portabase pour une gestion sécurisée et efficace des opérations.

Portabase fonctionne avec deux composants déployés séparément :

Le Dashboard, centralise la configuration : agents, bases, plannings de sauvegarde, rétention, alertes et canaux de stockage.

L'Agent, est un binaire Rust installé sur le même réseau que vos bases de données. Il est responsable de :

  • Détecter et remonter la liste de vos bases automatiquement.
  • Exécuter les sauvegardes selon le planning défini.
  • Envoyer les fichiers vers vos destinations de stockage.
  • Remonter les logs et statuts au dashboard.

Quelques options :

  • Prise en charge d'un large éventail de bases de données : PostgreSQL, MySQL, MariaDB, MongoDB, SQLite, Redis, Valkey, Firebird, Microsoft SQL Server et même des volumes Docker.
  • Architecture sécurisée par agents : Des agents légers écrits en Rust sont déployés au plus près des bases de données. Ils fonctionnent en mode sortant (outbound poll), ce qui évite d'ouvrir des ports entrants sur le pare-feu.
  • Chiffrement avancé : Les dumps de sauvegarde sont chiffrés (AES-GCM) directement sur l'hôte par l'agent avant même de quitter l'infrastructure.
  • Planification et politiques de rétention : Automatisation des sauvegardes via des planifications basées sur Cron et ainsi que des déclenchements manuels à la demande.
  • Stockages multiples et redondance : Possibilité d'envoyer les sauvegardes vers divers emplacements, stockage local, serveurs compatibles S3 comme MinIO ou RustFS, Google Cloud Storage, Azure Blob Storage ou Google Drive et de combiner plusieurs destinations en même temps.
  • Restauration flexible : Restauration à la demande ciblée vers n'importe quel serveur compatible pour faciliter les tests de restauration ou les bascules d'environnement.
  • Notifications : Alertes en temps réel sur les succès ou les échecs de sauvegarde transmises via plusieurs canaux : mail, Slack, Discord, Telegram, Ntfy, Gotify, webhooks.
  • Gestion par équipes et projets : Organisation des ressources via des espaces de travail des projets et un contrôle d'accès basé sur des rôles (utilisateurs, administrateurs).

Base de données supportées :

EngineSupportSupported VersionsRestore
PostgreSQL✅ Stable12, 13, 14, 15, 16, 17 and 18Yes
MySQL✅ Stable5.7, 8 and 9Yes
MariaDB✅ Stable10 and 11Yes
MongoDB✅ Stable4, 5, 6, 7 and 8Yes
SQLite✅ Stable3.xYes
Redis✅ Stable2.8+No
Valkey✅ Stable7.2+No
Firebird✅ Stable3.0, 4.0, 5.0Yes
MSSQL Server✅ Stable2017, 2019, 2022, Azure SQLYes
Docker Volume✅ StableDocker Engine 20.10+Yes

Comparaison des fonctionnalités :

FonctionnalitéPortabaseBarmanpgBackRestWAL-GDatabasusDatabasementVeeam
Support multi-DBMS
Interface Web
Architecture basée sur agents
Équipes/organisations
Notifications intégrées
Intégration OIDC/OAuth2
Installation Docker
Support auto-hébergé
Chiffrement
Politiques de rétention
Open-Source

💾 Installation

Prérequis

Avant de commencer, assurez-vous d’avoir :

  • Distribution Linux (Ubuntu, Debian, etc ...).
  • Docker installé.
  • Accès terminal.
  • Connexion internet.

Étapes d'installation

  1. Créez et mettez de côté un secret :
openssl rand -hex 32
  1. On va créer le dossier et entrer dedans :
mkdir portabase-dashboard && cd portabase-dashboard
  1. Créez votre compose.yml dans le dossier où vous comptez installer Portabase :
nano compose.yml
  1. Et collez ça dedans :
name: portabase-dashboard

services:
    portabase:
        container_name: portabase-app
        image: portabase/portabase:latest
        restart: always
        env_file: .env
        environment:
            - TZ=Europe/Paris
        ports:
            - "8887:80"
        volumes:
            - portabase-data:/data
        depends_on:
            db:
                condition: service_healthy
        healthcheck:
            test: ["CMD-SHELL", "curl -f http://localhost/api/health"]
            interval: 30s
            timeout: 5s
            retries: 3
            start_period: 60s

    db:
        container_name: portabase-pg
        image: postgres:17-alpine
        restart: always
        volumes:
            - postgres-data:/var/lib/postgresql/data
        environment:
            - POSTGRES_DB=${POSTGRES_DB}
            - POSTGRES_USER=${POSTGRES_USER}
            - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
        healthcheck:
            test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
            interval: 10s
            timeout: 5s
            retries: 5

volumes:
    postgres-data:
    portabase-data:
  1. On va créer le fichier .env :
nano .env
  1. On colle ça dedans :
# --- Configuration de l'app ---
PROJECT_URL=http://localhost:8887

# ⚠️ GÉNÉREZ UN SECRET FORT (ex: openssl rand -hex 32)
# Ce secret sert à chiffrer les communications avec les agents.
PROJECT_SECRET=generated_secure_hex_token

# --- URL de la base de données ---
POSTGRES_USER=portabase
POSTGRES_PASSWORD=change_me_secure_db_password
POSTGRES_HOST=db
POSTGRES_PORT=5432
POSTGRES_DB=portabase

DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}?schema=public
  • PROJECT_URL=http://localhost:8887 => L'adresse doit absolument correspondre à celle qui sera utilisée sans quoi
  • PROJECT_SECRET=generated_secure_hex_token => Remplacez generated_secure_hex_token par le secret généré précédement.
  • POSTGRES_PASSWORD=change_me_secure_db_password => Remplacez change_me_secure_db_password par un mot de passe fort.
  1. Rendez-vous sur l'ip:port, suivant l'IP de votre serveur local et du port choisi, xxxx par défaut :
http://ip:8887/

ou votre domaine :

https://portabase.mondomaine.com

💾 Terminer l'installation

Lorsque vous lancez Portabase pour la première fois, vous arrivez ici, le wizard vous invite à créer votre compte utilisateur :

  • 1 => Cliquez sur Register with email.

Remplissez les informations demandées :

  • 1 => Indiquez un prénom ou un pseudo.
  • 2 => Indiquez un nom ou un pseudo.
  • 3 => Indiquez une adresse mail.
  • 4 => Choisissez un mot de passe fort.
  • 5 => Cliquez sur Create account pour temriner la création de votre compte administrateur.

Cliquez sur Skip for now :

Vient le choix du thème :

  • 1 => Choisissez le thème souhaité.
  • 2 => Cliquez sur Continue.

Configurer l’organisation :

  • 1 => Nommez votre organisation.
  • 2 => Cliquez sur Continue.

Cliquez sur Skip :

Cliquez sur Skip :

Cliquez sur Skip :

C'est fini, cliquez sur Go to dashboard :

Voici votre tableau de bord :


🕵️ Créer un agent

Commencez par créer ce réseau :

docker network create portabase_network

Maintenant on va créer un agent par l'interface de Portabase pour récupérer la clé :

  • 1 => Cliquez sur Agents dans le menu latéral.
  • 2 => Cliquez sur Create new Agent.

Remplissez les informations demandées :

  • 1 => Nommez votre agent.
  • 2 => Ajoutez une description éventuelle.
  • 3 => Cliquez sur Create.

L'agent est bien créé :

  • 1 => Cliquez dans la zone de l'agent pour l'ouvrir.

Repérez la partie Registration & Setup :

  • 1 => Repérez la ligne dans MANUAL SETUP.
  • 2 => Cliquez sur le bouton Copier et mettez-là de côté.
⚠️
La fonction Copier n'est possible que si vous avez du HTTPS. Dans le cas contraire, surlignez la ligne et copier-là avec clic doit ou CTRL + C.
Vous ne devriez pas l'utiliser sans HTTPS, sauf pour des tests.

Maintenant on va installer l'agent proprement dit, avec Docker.

On va commencer par créer le dossier, entrer dedans et créer les fichiers compose.yml, .env et databases.json :

mkdir portabase-agent && cd portabase-agent
touch compose.yml .env databases.json

On va initialiser le fichier .json avec un objet vide :

echo '{"databases": []}' > databases.json

On va créer le compose.yml :

nano compose.yml

Collez ça dedans :

name: portabase-agent

services:
    app:
        container_name: portabase-agent
        image: portabase/agent:latest
        restart: always
        volumes:
            # Montage du fichier de configuration des DBs
            # - ./databases.toml:/config/config.toml
            - ./databases.json:/config/config.json
           # - /var/run/docker.sock:/var/run/docker.sock
           # - /votre/chemin:/scratch
        extra_hosts:
            # Permet à l'agent de contacter le 'localhost' de la machine hôte
            - "localhost:host-gateway"
        environment:
            LOG: info
            # DATABASES_CONFIG_FILE: "config.toml"
            TZ: "UTC"
            POLLING: 5
            APP_ENV: production
            EDGE_KEY: "${EDGE_KEY}"
        networks:
            - portabase

networks:
    portabase:
        name: portabase_network
        external: true
  • # - /var/run/docker.sock:/var/run/docker.sock => Décommentez (supprimez le #) la ligne si vous souhaitez sauvegarder des volumes Docker avec Portabase.
  • # - /votre/chemin:/scratch => Décommentez la ligne si vous souhaitez effectuer des sauvegardes de vos volumes Docker car la documentation prévient de ceci :
💡
Pendant une sauvegarde docker-volume, l'agent construit l'archive de sauvegarde dans un répertoire temporaire à l'intérieur du conteneur de l'agent, en utilisant l'emplacement temporaire du système, /tmp par défaut.
Si /tmp se trouve sur un système de fichiers racine à l'étroit, la sauvegarde d'un gros volume échoue avec : No space left on device.

Il faut donc veiller à monter un stockage suffisant en remplaçant /votre/chemin par celui du stockage que vous voulez monter. Toujours d'après la documentation :

💡
L'archive temporaire occupe environ la taille du volume sauvegardé. Un volume de 20 Go nécessite environ 20 Go libres à l'emplacement temporaire, et pas seulement à la destination.

On va éditer le fichier .env

nano .env

Collez cette ligne dedans :

EDGE_KEY=coller_votre_clé_ici
  • EDGE_KEY=collez_votre_clé_ici => Remplacez collez_votre_clé_ici par votre clé à vous, copiée à l'étape précédente.

Pour terminer, on va déployer le container de l'agent :

docker compose up -d

🔔 Notifications

Nous allons prendre comme exemple Gotify.

Créez votre clé API sur Gotify.

Rendez-vous sur Portabase :

  • 1 => Cliquez sur Notifications.
  • 2 => Cliquez sur Channels.
  • 3 => Cliquez sur Gotify.

Remplissez les champs suivants :

  • 1 => Nommez le canal de diffusion.
  • 2 => Indiquez l'URL de votre instance Gotify.
  • 3 => Indiquez le token créé dans Gotify.
  • 4 => Testez la configuration.
  • 5 => Si le test est concluant, terminez en cliquant sur Add Channel.

On est bien :


💽 Ajouter une base de données.

Pour ajouter une base de données :

  • 1 => Cliquez sur Agents.
  • 2 => Cliquez dans la zone de votre agent pour l'ouvrir.

Cliquez sur :

Remplissez les informations demandées :

  • 1 => Nommez votre base de données.
  • 2 => Choisissez le type de base de données.
  • 3 => Indiquez l'host. Cela peut-être le nom du container ou son IP, tout dépend de la configuration. Si vous choisissez le nom du container, il faudra connecter votre application au réseau de portabase-agent avec cette commande (à adapter suivant le réseau de votre application, celui de portabase-agent est portabase-agent, par défaut) :
docker network connect docmost_default portabase-agent
  • 4 => Indiquez le port.
  • 5 => Indiquez le nom d'utilisateur de la base de données.
  • 6 => Indiquez le mot de passe de la base de données.
  • 8 => Cliquez sur Create.

La base de données est bien présente, patientez un peu avant que le témoin passe au vert :

Une chose très importante à faire après avoir ajouté vos base de données, c'est de laisser l'accès à votre organisation à l'agent correspondant, contenant vos bases de données :

  • 1 => Éditez votre organisation.

Ensuite, laissez l'accès à l'agent qui contient les bases de données, à votre organisation :

  • 1 => Cliquez sur Organization.
  • 2 => Sélectionnez les agents, dans mon cas belginux, le seul configuré.
  • 3 => Cliquez sur Save.

C'est important pour la suite, le backup & la restauration.


⏬ ⏫ Sauvegarde & restauration

💡
Une chose à savoir lorsque vous sauvez et restaurez, il ne faut pas couper les containers de votre application, le container de la base de données doit absolument être actif.
Si vous souhaitez couper les autres containers pour éviter qu'ils n'écrivent dans la base de données, vous pouvez, mais surtout pas le container de la base de données.

On y est presque! On va bientôt pouvoir commencer à s'amuser avec les sauvegardes et les restaurations. Mais avant ça, on va configurer le tout.

📝 Créer un projet

Afin de pouvoir gérer vos sauvegardes et restaurations, il va falloir créer un projet.

  • 1 => Cliquez sur Projects.
  • 2 => Cliquez sur Create new Project.

Replissez les champs suivants :

  • 1 => Nommez votre projet.
  • 2 => Sélectionnez les bases de données.
  • 3 => Cliquez sur Create.

Cliquez dans la zone :

Je vois bien les deux bases de données que j'ai ajouté :

Je vais cliquer sur Joplin :

Et voici toutes les options dont vous aurez besoin :

  • 1 => Politique de conservation des sauvegardes. Ne pourra être configuré que lorsque le point 2, méthode de sauvegarde, sera configuré.

Dans cet exemple, il conservera les 5 dernières sauvegardes :

    • 2 => Méthode de sauvegarde. Choisissez ici si c'est une sauvegarde manuelle ou automatique, dans cet exemple, le backup sera fait à 3 heures du matin, chaque jour :
  • 3 => Politiques de notification. Choisissez la méthode de notification :
  • 4 => Politiques de stockage. En local, en ligne, ...
  • 5 => Importer une sauvegarde : .dump, .tar.gz ou encore .tgz :
  • 6 => État de santé de la base de données.

⏫ Lancer une sauvegarde

On va lancer une sauvegarde manuelle, cliquez sur Backup :

Confirmez en cliquant sur Yes, create backup :

Patientez le temps de la sauvegarde :

La sauvegarde est terminée :

⏬ Lancer une restauration

Cliquez sur Actions, ensuite sur Restore :

Choisissez l'espace de stockage contenant la sauvegarde, ici en local, cliquez sur Confirm :

Allez dans Restoration, et vous pouvez voir Success :

Je relance le container de l'application en lui-même, du côté de Joplin, tout fonctionne :

📦 Connaître le nom d'un volume

Lorsque vous voulez sauvegarder un volume, il faudra connaître son nom :

Lancez cette commande en remplaçant NOM_DU_CONTAINER par celui de votre container ou encore son ID :

docker inspect NOM_DU_CONTAINER --format '{{range .Mounts}}{{println .Type .Name .Source "->" .Destination}}{{end}}'

👤 Créer un utilisateur

Si vous souhaitez ajouter une personne (de confiance) dans votre organisation :

  • 1 => Cliquez sur Users, dans la partie Access management du menu latéral gauche.
  • 2 => Cliquez sur Create a user.

Remplissez les champs suivants :

L'utilisateur recevra un mail avec son mot de passe (qu'il faudra qu'il change dans un monde idéal) :

Ajoutez votre utilisateur dans l'organisation souhaitée :

  • 1 => Cliquez sur Organizations, situé dans la partie Access management.
  • 2 => Cliquez sur Add member.

Il suffit de rechercher par l'adresse mail, votre utilisateur et de cliquer sur Confirm :

Bravo, votre utilisateur est bien ajouté dans votre organisation :


📫 Configurer le serveur mail

Dans le cas où vous avez votre propre service mail, vous avez les informations nécessaires à entrer ci-dessous.

Mais vous pouvez également utiliser les serveurs mail de Google, Outlook, Infomaniak,.. Jetez un œil ici pour avoir les paramètres nécessaires :

Configurer le SMTP pour envoyer un mail avec une application Docker
Tutoriel pour configurer le SMTP afin d’envoyer un mail à partir de vos applications self-hosted.

Rendez-vous dans la partie Settings du menu latéral gauche, partie System Email et complétez les champs nécessaires :

  • 1 => Indiquez le mail de l'expéditeur.
  • 2 => Indiquez le serveur SMTP.
  • 3 => Indiquez le port du serveur SMTP.
  • 4 => Indiquez le mot de passe du compte mail.
  • 5 => Indiquez le mail de l'utilisateur.
  • 6 => Cliquez sur Save.
  • 7 => Testez si le serveur mail est bien configuré en vous envoyant un mail de test.

Youpie, ça fonctionne !


🧊 Stockage S3

En suivant la règle de sauvegardes 3 -2-1, l'idéal est d'externaliser au minimum à un endroit, vos sauvegardes. Nous allons voir ici dans le contexte d'une sauvegarde sur un S3. Dans mon cas j'utilise SeaweedFS, mais peu importe votre serveur de stockage S3, ce sont bien souvent les mêmes réglages.

Ajoutons notre stockage S3 :

  • 1 => Cliquez sur Channels, dans la partie Storages.
  • 2 => Cliquez sur Add Storage channel.

Choisissez S3 :

Entrez les informations du serveur :

  • 1 => Nommez le stockage.
  • 2 => Indiquez l'URL de l'API de votre S3.
  • 3 => Indiquez la région, en cas de doute us-east-1 fonctionne souvent très bien si vous hébergez votre solution de stockage S3.
  • 4 => Indiquez l'Access key.
  • 5 => Indiquez la Secret key.
  • 6 => Indiquez le nom du bucket dans lequel seront stockées vos sauvegardes.
  • 7 => Testez stockage.
  • 8 => Si c'est concluant, cliquez sur Save Channel pour temriner.

N'oubliez pas de configurer la seconde partie, Organizations :

  • 1 => Cliquez sur Organizations.
  • 2 => Sélectionnez les bases que vous souhaitez sauver sur le S3.
  • 3 => Fermez la fenêtre.
  • 4 => Cliquez sur Save pour terminer.

Le stockage S3 est prêt à être utilisé :

Parfait, tout fonctionne au poil :

Il ne vous restera qu'à éditer le projet dans lequel vous voulez ajouter cette solution de sauvegarde :

Ajoutez votre stockage S3 :


zarev

->.<-
🐧 Passionné de self-hosting, je partage ce que je connais et me nourris des connaissances des bonnes âmes qui partagent avec moi. Soutenons l'utilisation des apps open source et leurs développeurs.

Vous pourriez aussi aimer