Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
autohebergement:sauvegardes_chez_les_copain_e_s [2020/12/31 11:09] eorn je complète mais pas fini |
autohebergement:sauvegardes_chez_les_copain_e_s [2021/08/16 14:13] (Version actuelle) |
||
---|---|---|---|
Ligne 37: | Ligne 37: | ||
Quelques étapes simples : | Quelques étapes simples : | ||
- | <code> | + | <code bash> |
# Créer le compte | # Créer le compte | ||
sudo useradd --create-home alice | sudo useradd --create-home alice | ||
Ligne 47: | Ligne 47: | ||
=== 2. Créer une clé SSH pour alice === | === 2. Créer une clé SSH pour alice === | ||
- | <code> | + | <code bash> |
# On se connecte en tant qu'alice | # On se connecte en tant qu'alice | ||
sudo su alice | sudo su alice | ||
Ligne 72: | Ligne 72: | ||
Ensuite, on lance Borg : | Ensuite, on lance Borg : | ||
- | <code> | + | <code bash> |
borg init --encryption repokey /backup/alice | borg init --encryption repokey /backup/alice | ||
</code> | </code> | ||
Ligne 85: | Ligne 85: | ||
On va mettre notre phrase de passe (''PHRASE-DE-PASSE'') dans le fichiers ''/srv/borg/passphrase''. On met dans le dossier la clé ''id_rsa''. Et puis le fichier de configuration ''config.yaml'' qui ressemble à ça : | On va mettre notre phrase de passe (''PHRASE-DE-PASSE'') dans le fichiers ''/srv/borg/passphrase''. On met dans le dossier la clé ''id_rsa''. Et puis le fichier de configuration ''config.yaml'' qui ressemble à ça : | ||
- | <code> | + | <code yaml> |
location: | location: | ||
# Quels dossiers sauvegarder | # Quels dossiers sauvegarder | ||
Ligne 133: | Ligne 133: | ||
# - repository | # - repository | ||
# - archives | # - archives | ||
+ | </code> | ||
- | # Options for customizing borgmatic's own output and logging. | + | Pour tester si ça fonctionne, on peut demander via Borgmatic comment est le dépôt Borg : |
- | #output: | + | <code bash> |
- | # color: true | + | borgmatic info -c /srv/borg/config.yaml |
+ | </code> | ||
+ | Et si ça marche, lancer une sauvegarde (ça peut être très long si c'est la première) : | ||
+ | <code bash> | ||
+ | borgmatic --progress -C -c /srv/borg/config.yaml | ||
+ | </code> | ||
+ | Et voilà comment mettre en place un système de sauvegardes partagé, entre copain·e·s ☺ | ||
+ | |||
+ | |||
+ | ==== Annexes ==== | ||
+ | === Sauvegardes des bases de données === | ||
+ | Borgmatic propose l'utilisation de //hooks//, c'est-à-dire qu'il peut exécuter une commande en fonction d'événements. | ||
+ | Ce que je fais pour sauvegarder mes bases de données, c'est qu'avant le processus de compression et d'envoi vers le serveur de sauvegardes, je lance un petit script codé de mes petites mains pour exporter la base de données dans un fichier sql compressé, placé dans le dossier du service à sauvegarder. Et paf, tout est sauvegardé comme ça. | ||
+ | |||
+ | Voilà le script en question, adapté à mes besoins (docker-compose etc), à réadapter peut-être, donc : | ||
+ | <file bash dump_database.sh> | ||
+ | #!/bin/bash | ||
+ | |||
+ | # Default values | ||
+ | TYPE="postgres" | ||
+ | SERVICE="" | ||
+ | CONTAINER="" | ||
+ | ENV_FILE=".env" | ||
+ | ALREADY_UP=true | ||
+ | |||
+ | while getopts "t:s:c:e:" opt | ||
+ | do | ||
+ | case "$opt" in | ||
+ | t) TYPE="$OPTARG";; | ||
+ | s) SERVICE="$OPTARG";; | ||
+ | c) CONTAINER="$OPTARG";; | ||
+ | e) ENV_FILE="$OPTARG";; | ||
+ | esac | ||
+ | done | ||
+ | | ||
+ | ### | ||
+ | # Preparation | ||
+ | FILENAME="${SERVICE}_$(date +"%Y%m%d-%H%M").sql" | ||
+ | mkdir -p /srv/apps/$SERVICE/dump | ||
+ | rm -rf /srv/apps/$SERVICE/dump/* | ||
+ | | ||
+ | # Load env file (user, db name) | ||
+ | source /srv/apps/$SERVICE/$ENV_FILE | ||
+ | cd /srv/apps/$SERVICE/ | ||
+ | |||
+ | # Check if the service was up or not, to stop it if necessarry in the end | ||
+ | if [ -z `docker-compose ps -q $CONTAINER` ] || [ -z `docker ps -q --no-trunc | grep $(docker-compose ps -q $CONTAINER)` ]; then | ||
+ | echo "Service not running, starting it…" | ||
+ | docker-compose -f /srv/apps/$SERVICE/docker-compose.yml up -d $CONTAINER | ||
+ | ALREADY_UP=false | ||
+ | else | ||
+ | echo "Service already running." | ||
+ | fi | ||
+ | | ||
+ | # Dump (within the container) | ||
+ | if [ $TYPE == "postgres" ] | ||
+ | then | ||
+ | docker-compose \ | ||
+ | -f /srv/apps/$SERVICE/docker-compose.yml\ | ||
+ | exec -T $CONTAINER\ | ||
+ | pg_dump -U $POSTGRES_USER -d $POSTGRES_DB -f /$FILENAME | ||
+ | elif [ $TYPE == "mysql" ] | ||
+ | then | ||
+ | docker-compose \ | ||
+ | -f /srv/apps/$SERVICE/docker-compose.yml\ | ||
+ | exec -T $CONTAINER\ | ||
+ | mysqldump -u $MYSQL_USER --databases $MYSQL_DATABASE -p${MYSQL_PASSWORD} -r /$FILENAME | ||
+ | fi | ||
+ | | ||
+ | | ||
+ | # Copy the dump file to host | ||
+ | echo "Copying the dump file to host…" | ||
+ | docker cp ${SERVICE}_${CONTAINER}_1:/$FILENAME /srv/apps/$SERVICE/dump | ||
+ | |||
+ | # Compressing | ||
+ | echo "Compressing $FILENAME…" | ||
+ | gzip /srv/apps/$SERVICE/dump/$FILENAME | ||
+ | #docker exec -ti ${SERVICE}_${CONTAINER}_1 cat /$FILENAME > /srv/apps/$SERVICE/dump/$FILENAME | ||
+ | |||
+ | #docker-compose -f /srv/apps/${SERVICE}/docker-compose.yml exec -T ${CONTAINER} cat /${FILENAME} > /srv/apps/$SERVICE/dump/$FILENAME | ||
+ | | ||
+ | # Remove the dump file in the container | ||
+ | docker-compose \ | ||
+ | -f /srv/apps/$SERVICE/docker-compose.yml\ | ||
+ | exec -T $CONTAINER rm /$FILENAME -v | ||
+ | |||
+ | |||
+ | if ! $ALREADY_UP ; then | ||
+ | echo "Stopping service" | ||
+ | docker-compose -f /srv/apps/$SERVICE/docker-compose.yml stop $CONTAINER | ||
+ | fi | ||
+ | </file> | ||
+ | |||
+ | **Exemple d'usage : ** ''/srv/borg/scripts/dump_database.sh -t postgres -s hedgedoc -c dbhedgedoc'' | ||
+ | |||
+ | Et pour l'utiliser dans le ''config.yaml'', il faut ajouter à la fin du fichier la section //hooks// suivante : | ||
+ | <code yaml> | ||
+ | hooks: | ||
+ | before_backup: | ||
+ | - echo "Starting a backup." | ||
+ | - /srv/config/borg/scripts/dump_database.sh -t postgres -s hedgedoc -c dbhedgedoc | ||
</code> | </code> | ||
+ | |||
+ | |||
+ | === Envoyer les sauvegardes sur plusieurs dépôts distants === | ||
+ | |||
+ | Pour simplifier l'utilisation de plusiers clés SSH, on peut ajouter la configuration suivante dans ''/root/.ssh/config'' : | ||
+ | <code bash> | ||
+ | Host raspibackup | ||
+ | HostName raspibackup.bob.fr | ||
+ | IdentityFile /srv/borg/id_rsa_raspibackup | ||
+ | User alice | ||
+ | </code> | ||
+ | |||
+ | On peut donc enlever la ligne ''ssh_command: ssh -i /srv/borg/id_rsa'' du fichier ''config.yaml''. | ||
+ | |||
+ | En ajoutant plusieurs ''Hosts'' on pourra se connecter à plusieurs serveurs distants. Il faudra juste configurer ''config.yaml'' en conséquence. Par exemple : | ||
+ | |||
+ | <code yaml> | ||
+ | location : | ||
+ | source_directories: | ||
+ | ... | ||
+ | repositories: | ||
+ | - alice@chez.bob.fr:/backup/alice | ||
+ | - alice@chez.carole.bzh:/backup/alice | ||
+ | |||
+ | </code> | ||
+ | |||
+ | FIXME | ||
+ | |||
+ |