Aller au contenu

[Résolu]Script de backup d'une base de données dans un conteneur


Diplo95

Messages recommandés

Bonjour,

j'ai installé le gestionnaire de notes Joplin avec une image docker. Voici le docker-compose :

version: '3'

services:
    db:
        image: postgres:latest # Download latest postgres image
        container_name: postgres # Here you can give the container a name of your liking 
        restart: unless-stopped # Restart if not stopped manually
        volumes:
            - /volume1/docker/joplin/joplin-data:/var/lib/postgresql/data # Make database files persistent. Otherwise your data is lost when the container is destroyed.
        environment:
            - APP_PORT=22300 # Specify port joplin-server is reachable at
            - POSTGRES_PASSWORD=joplin # Specify database password
            - POSTGRES_USER=joplin # Specify database user
            - POSTGRES_DB=joplin # Specify database name
    app:
        image: joplin/server:latest # Download latest joplin-server image
        depends_on:
            - db
        ports:
            - "22300:22300" # Expose internal port to LAN
        restart: unless-stopped
        environment:
            - APP_BASE_URL=https://joplin.##########.fr # If you do not want to expose joplin-server to the internet use your LAN-IP and port
            - DB_CLIENT=pg
            - POSTGRES_PASSWORD=****** # Must be the same as above
            - POSTGRES_DATABASE=****** # Must be the same as above
            - POSTGRES_USER=********* # Must be the same as above
            - POSTGRES_PORT=5432 # Postgres internal port
            - POSTGRES_HOST=db

Tout fonctionne à merveille. Mais avant de rapatrier mes notes d'autres applications, je voulais mettre en place un backup automatique de la base de donnée de mon serveur Joplin. Sur le Discourse de Joplin, on m'a conseillé d'utiliser la commande pg_dumpall. J'ai alors trouvé un script sur internet qui correspondait à mon besoin ici :

pg_dumpall -U postgres > “/volume1/docker/joplin/joplin-data/psql-backup/$(date +’%Y%m%d’) psql.backup.sql”
find /volume1/docker/joplin/joplin-data/psql-backup* -mtime +70 -exec rm {} \;

J'ai créé une tache avec ce script, avec les droits root. Malheureusement les tests n'ont pas été concluants. Je reçois systématiquement un message d'erreur :

Sortie standard/erreur :
sh: “/volume1/docker/joplin/joplin-data/psql-backup/$(date +’%Y%m%d’): No such file or directory
find: `/volume1/docker/joplin/joplin-data/psql-backup*': Permission denied

Alors je me doute que ça vient du fait que j'essaie de sauvegarder des données qui sont dans un conteneur et donc inaccessibles pour root. Est- ce qu'il existe une solution à mon problème ?

Merci

Lien vers le commentaire
Partager sur d’autres sites

C'est dans le conteneur qu'il faut exécuter pg_dumpall, pas sur le NAS.
Soit tu mets en place un cron dans le conteneur, mais ça ne persistera pas à une recréation de conteneur.
Soit tu te sers de docker exec :

docker exec joplin pg_dumpall -U postgres > “/var/lib/postgresql/data/psql-backup/$(date +’%Y%m%d’) psql.backup.sql”
find /var/lib/postgresql/data/psql-backup* -mtime +70 -exec rm {} \;

Quand tu es dans le conteneur, tu dois faire appel au chemin dans le conteneur et pas sur le NAS.

Lien vers le commentaire
Partager sur d’autres sites

Merci @.Shad. pour l'aide.

Cependant, j'ai toujours la même erreur :

Tâche : Joplin DB backup
Heure de début : Thu, 06 May 2021 23:00:35 GMT
Heure d’arrêt : Thu, 06 May 2021 23:00:35 GMT
État actuel : 1 (Interrompu)
Sortie standard/erreur :
sh: /var/lib/postgresql/data/psql-backup/20210506 psql.backup.sql: No such file or directory

Je voudrais lever un doute : mon docker-file créé deux conteneurs. Un conteneur postgres et un conteneur auquel je n'ai d'ailleurs pas donné de nom et qui porte le nom script_app_1

Quelle commande faut-il passer ?

docker exec postgres ...

ou

docker exec script_app_1 ...

(J'ai essayé les deux et j'ai le même message d'erreur de toutes façons)

Lien vers le commentaire
Partager sur d’autres sites

Il y a 7 heures, Diplo95 a dit :

docker-file

Attention ce n'est pas un Dockerfile mais un fichier compose. Le Dockerfile c'est le fichier qui permet de construire l'image, là tu te sers d'une image publique déjà construite.

Il y a 7 heures, Diplo95 a dit :

Je voudrais lever un doute : mon docker-file créé deux conteneurs. Un conteneur postgres et un conteneur auquel je n'ai d'ailleurs pas donné de nom et qui porte le nom script_app_1

Dans app, passe un paramètre container_name comme tu l'as fait pour la DB postgres, et c'est ce nom là que tu dois utiliser effectivement à la place de joplin après exec.

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

@.Shad. merci pour l'aide. Effectivement je me suis trompé de termes. J'utilise docker-compose. Désolé pour mes réponses tardives mais j'ai été pris par le boulot ce week-end. Je continue cependant à chercher pour faire une sauvegarde de ma base de données.

Voici mon nouveau docker-compose :

version: '3'

services:
    db:
        image: postgres:latest # Download latest postgres image
        container_name: postgres-db # Here you can give the container a name of your liking 
        restart: unless-stopped # Restart if not stopped manually
        volumes:
            - /volume1/docker/joplin/joplin-data:/var/lib/postgresql/data # Make database files persistent. Otherwise your data is lost when the container is destroyed.
        environment:
            - APP_PORT=22300 # Specify port joplin-server is reachable at
            - POSTGRES_PASSWORD=joplin # Specify database password
            - POSTGRES_USER=joplin # Specify database user
            - POSTGRES_DB=joplin # Specify database name
    app:
        image: joplin/server:latest # Download latest joplin-server image
        container_name: joplin-server
        depends_on:
            - db
        ports:
            - "22300:22300" # Expose internal port to LAN
        restart: unless-stopped
        environment:
            - APP_BASE_URL=https://joplin.ndd.fr # If you do not want to expose joplin-server to the internet use your LAN-IP and port
            - DB_CLIENT=pg
            - POSTGRES_PASSWORD=joplin # Must be the same as above
            - POSTGRES_DATABASE=joplin # Must be the same as above
            - POSTGRES_USER=joplin # Must be the same as above
            - POSTGRES_PORT=5432 # Postgres internal port
            - POSTGRES_HOST=db

J'ai modifié 2/3 trucs, en particulier :

  • le nom du conteneur de la base de données : 'postgres-db'. En effet, je me demande s'il n'y avait pas des conflits avec des commandes en le nommant postgres.
  • j'ai donné un nom au conteneur du serveur joplin : 'joplin-server'.

J'ai continué mes recherches et je suis arrivé à un point qui me paraît être le point bloquant, mais je n'arrive pas à le débugger.

Je me place dans le dossier /var/docker/joplin/joplin-data/psql-backup . Si je lance la commande

docker exec postgres-db pg_dumpall -U joplin  > "$(date +%Y%m%d) psql.backup.sql"

Alors, j'ai bien la création de mon fichier backup de ma base de données. Par contre, si je lance la commande :

docker exec postgres-db pg_dumpall -U joplin > /var/lib/postgresql/data/psql-backup/"$(date +%Y%m%d) psql.backup.sql"

et bien je reçois le message d'erreur suivant :

-ash: /var/lib/postgresql/data/psql-backup/2021-05-10 psql.backup.sql: No such file or directory

Je pense donc que j'ai un problème de droits quelque part, mais je ne trouve pas où ! Une idée ?

Merci

Lien vers le commentaire
Partager sur d’autres sites

Ton problème c'est l'espace, on ne peut pas mettre des quotes comme tu les mets, utilise le caractère d'échappement \ :

docker exec postgres-db pg_dumpall -U joplin > /var/lib/postgresql/data/psql-backup/$(date +%Y%m%d)\ psql.backup.sql

Le mieux reste d'éviter les espaces tout court, à remplacer de préférence par _

Lien vers le commentaire
Partager sur d’autres sites

@.Shad.

Je viens de faire le test et avec espace ou sans, ça fonctionne. Par contre, dès que je mets le chemin de l'emplacement de la sauvegarde, j'ai un message d'erreur.

579401640_Capturedcran2021-05-10153232.thumb.png.c3550d7aee45b01719c3537a3f2d7da3.png

Dans l'exemple ci-dessus, je lance la commande (dont le nom de fichier contient un espace) et le backup se fait. Je fais la même chose en rajoutant le chemin, j'ai un message d'erreur. S'il m'en restait, je m'arracherais les cheveux !

Lien vers le commentaire
Partager sur d’autres sites

Ok j'ai compris je pense, ton > s'applique à l'ensemble de la commande docker exec ... tu peux essayer ça :

docker exec postgres-db sh -c 'pg_dumpall -U joplin > /var/lib/postgresql/data/psql-backup/$(date +%Y%m%d)\ psql.backup.sql'

 

Lien vers le commentaire
Partager sur d’autres sites

Invité
Ce sujet ne peut plus recevoir de nouvelles réponses.
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.