Backup
🦺

Backup

🗜 Monter un S3 avec S3fuse

Le tutoriel se base sur mon expérience chez Scaleway France.

Compilation

apt update && apt upgrade -y
apt -y install automake autotools-dev fuse g++ git libcurl4-gnutls-dev libfuse-dev libssl-dev libxml2-dev make pkg-config
cd /tmp
git clone https://github.com/s3fs-fuse/s3fs-fuse.git
cd s3fs-fuse

Mettre à jour la valeur MAX_MULTIPART_CNT dans le fichier fdcache.cpp

sed -i 's/MAX_MULTIPART_CNT = 10 /MAX_MULTIPART_CNT = 1 /' src/fdcache.cpp

Compilation avec g++

./autogen.sh
./configure
make
make install

Copie de l’application

cp src/s3fs /usr/local/bin/s3fs

Configuration du montage

On ouvre une session sur l’utilisateur qui nous intéresse

echo MONMOTDEPASSE > $HOME/.passwd-s3fs
chmod 600 $HOME/.passwd-s3fs

On crée le répertoire qui servira au montage

cd /mnt
mkdir spnet-bucker
chmod 770 spnet-bucket

On monte le répertoire avec s3fuse

s3fs spnet-bucket /mnt/spnet-bucket -o allow_other -o passwd_file=/root/.passwd-s3fs -o use_path_request_style -o endpoint=fr-par -o parallel_count=15 -o multipart_size=128 -o nocopyapi -o url=https://s3.fr-par.scw.cloud

Montage automatique au démarrage

On ouvre /etc/fstab

sudo nano /etc/fstab

On ajoute la ligne suivante

s3fs#spnet-bucket /mnt/spnet-bucket fuse _netdev,allow_other,use_path_request_style,url=https://s3.fr-par.scw.cloud/ 0 0

📦 BackupManager

🔑 Remarques sur GPG

⚠️

GnuPG (ou GPG, de l’anglais GNU Privacy Guard) est l’implémentation GNU du standard OpenPGP défini dans la RFC 48806, distribuée selon les termes de la licence publique générale GNU. Ce logiciel permet la transmission de messages électroniques signés et chiffrés, garantissant ainsi leurs authenticité, intégrité et confidentialité.

sudo apt update
sudo apt install gnupg

Créer une paire de clés

gpg --gen-key

Lister les clés

gpg --list-keys
gpg --list-secret-keys

Exporter les clés

gpg --output public_key.pgp --armor --export webmaster@sciences-physiques.net
gpg --output private.pgp --armor --export-secret-key webmaster@sciences-physiques.net

Chiffrer/Déchiffrer fichiers

gpg --encrypt --recipient 'admin@example.com' --output confidential.txt.enc public.txt
gpg --decrypt --output public.txt confidential.txt.enc

BackupManager

Installation

sudo apt-get update
sudo apt-get install backup-manager -y

Configuration

sudo nano /etc/backup-manager.conf

🐘 Utiliser pgbackrest pour sauvegarder la base de données

Préliminaires

sudo apt-get install postgresql-client libxml2

Compilation de pgbackrest

cd /tmp
mkdir -p /build
wget -q -O - https://github.com/pgbackrest/pgbackrest/archive/release/2.36.tar.gz |  tar zx -C /build

sudo apt-get install make gcc libpq-dev libssl-dev libxml2-dev pkg-config liblz4-dev libzstd-dev libbz2-dev libz-dev libyaml-dev
cd /build/pgbackrest-release-2.36/src && ./configure && make
cp pgbackrest /usr/bin
sudo chmod 755 /usr/bin/pgbackrest

Permissions

sudo mkdir -p -m 770 /var/log/pgbackrest
sudo chown postgres:postgres /var/log/pgbackrest
sudo mkdir -p /etc/pgbackrest
sudo mkdir -p /etc/pgbackrest/conf.d
sudo touch /etc/pgbackrest/pgbackrest.conf
sudo chmod 640 /etc/pgbackrest/pgbackrest.conf
sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.conf

Test installation

sudo -u postgres pgbackrest
cat /etc/postgresql/12/main/postgresql.conf

Configuration

sudo nano /etc/pgbackrest/pgbackrest.conf
[main]
pg1-path=/var/lib/postgresql/12/main

[global]
repo1-cipher-pass=VOTRE_PASS_ICI
repo1-cipher-type=aes-256-cbc
repo1-path=/var/lib/pgbackrest
repo1-retention-full=15
start-fast=y

[global:archive-push]
compress-level=3

Path des logs

sudo -u postgres bash -c ' \
       export PGBACKREST_LOG_PATH=/var/log/pgbackrest && \
       pgbackrest --log-level-console=error help backup log-path'

Créer les repositories

rm -rf /var/lib/pgbackrest
rm -rf /mnt/spnet-bucket/pgbackrest

sudo mkdir -p /var/lib/pgbackrest
sudo chmod 750 /var/lib/pgbackrest
sudo chown postgres:postgres /var/lib/pgbackrest
sudo mkdir -p /mnt/spnet-bucket/pgbackrest
sudo chmod 775 /mnt/spnet-bucket/pgbackrest

Configuration des archives

sudo nano /etc/postgresql/14/main/postgresql.conf
archive_command = 'pgbackrest --stanza=main archive-push %p'
archive_mode = on
listen_addresses = 'localhost'
log_line_prefix = ''
max_wal_senders = 3
wal_level = replica

Redémarrage

sudo pg_ctlcluster 14 main restart

Créer un stranza

sudo -u postgres pgbackrest --stanza=main --log-level-console=info stanza-create

Vérification

sudo -u postgres pgbackrest --stanza=main --log-level-console=info check

Créer une sauvegarde

sudo -u postgres pgbackrest --stanza=main --type=full --log-level-console=error backup

Taille d’une sauvegarde

du -h /var/lib/pgbackrest -d 1

Information sur une sauvegarde

sudo -u postgres pgbackrest info

Restaurer une sauvegarde

sudo pg_ctlcluster 14 main stop
sudo -u postgres find /var/lib/postgresql/14/main -mindepth 1 -delete
sudo -u postgres pgbackrest --stanza=main --set=20211218-143625F restore
sudo pg_ctlcluster 14 main start

📜 Script perso pour la sauvegarde et la restauration

Envoyer vers S3Fuse

cd /tmp/
sudo -u postgres pgbackrest --stanza=main --type=full --log-level-console=error backup
now=$(date +"%Y_%m_%d-%H_%M")
year=$(date +"%Y")
month=$(date +"%m")
cd /var/lib/pgbackrest 
tar -cf /tmp/pgback-${now}.tar *
cd /tmp/
xz -9 -c /tmp/pgback-${now}.tar > /tmp/pgback-${now}.tar.xz
sudo -H -u postgres bash -c "pg_dumpall -c > /tmp/${now}.psql"
xz -9 -c /tmp/${now}.psql > /tmp/${now}.psql.xz
gpg --output /tmp/${now}.psql.gpg --encrypt --recipient xxxxx@sciences-physiques.net /tmp/${now}.psql
gpg --output /tmp/pgback-${now}.tar.xz.gpg --encrypt --recipient xxxxx@sciences-physiques.net /tmp/pgback-${now}.tar.xz
rm -rf /var/archives/*
backup-manager
cd /var/archives 
tar -cf /tmp/backup-manager-${now}.tar *
cd /tmp/
xz -9 -c /tmp/backup-manager-${now}.tar > /tmp/backup-manager-${now}.tar.xz
gpg --output /tmp/backup-manager-${now}.tar.xz.gpg --encrypt --recipient xxxxx@sciences-physiques.net /tmp/backup-manager-${now}.tar.xz
rm /tmp/pgback-${now}.tar
rm /tmp/${now}.psql
rm /tmp/${now}.psql.xz
rm /tmp/pgback-${now}.tar.xz
rm /tmp/backup-manager-${now}.tar
rm /tmp/backup-manager-${now}.tar.xz
sudo mkdir -p /mnt/spnet-bucket/${year}/${month}/
mv /tmp/*${now}.tar.xz.gpg /mnt/spnet-bucket/${year}/${month}/

Restauration

rm -rf /var/lib/pgbackrest
sudo mkdir -p /var/lib/pgbackrest
sudo chmod 750 /var/lib/pgbackrest
sudo chown postgres:postgres /var/lib/pgbackrest
tar -Pxf *.tar.xz -C /var/lib/pgbackrest

Quelques commandes utiles

Restaurer une base de données

pg_dumpall -c > remi_ok.sql
psql -U postgres -f remi_ok.sql

Déchiffrer un fichier

gpg --output /tmp/decrypt.tar.xz --decrypt /tmp/bm.tar.xz.gpg

Extraire un fichier .xz

tar -xf decrypt.tar.xz -C /tmp/extract

Copier des fichiers de manière récursive

cp -R <source_folder>/* <destination_folder>