L’approche BlablaLinux : Pour mes bases de données externes classiques, je fais confiance à Databasus. Mais quand il s’agit de services utilisant des bases de type SQLite (comme Vaultwarden), j’utilise ma solution maison. Pourquoi ? Parce que SQLite est un fichier plat qui nécessite une manipulation spécifique (notamment la gestion du mode WAL) pour garantir une restauration 100% fiable sans corruption. Voici comment je sécurise mes instances.
sqlite-backupPour centraliser vos sauvegardes, nous allons utiliser un conteneur LXC (Debian ou Ubuntu) nommé sqlite-backup.
Sur ce LXC sqlite-backup, installez les outils de base :
apt update && apt install sqlite3 rsync -y
ssh-keygen -t ed25519ssh-copy-id root@IP_DU_SERVEUR
⚠️ Attention : Le mot de passe demandé ici est celui de l’utilisateur root du serveur cible. Une fois validé, le script pourra se connecter tout seul la nuit.
backup_sqlite.sh)Ce script est capable de gérer plusieurs services à la chaîne.
nano /root/backup_sqlite.shTARGETS (lignes d’exemple fournies).#!/bin/bash
# =========================================================================
# CONFIGURATION DES CIBLES (À MODIFIER SELON VOS BESOINS)
# Ajoutez une ligne par service sous le format : "Nom|IP|Chemin_DB"
# =========================================================================
TARGETS=(
"vaultwarden|192.168.2.156|/root/vaultwarden/data/db.sqlite3"
"freshrss|192.168.2.160|/var/lib/docker/volumes/freshrss/_data/db.sqlite"
)
# =========================================================================
BACKUP_ROOT="/root/backups"
DATE=$(date +%Y-%m-%d_%Hh%M)
echo "--- Démarrage de la sauvegarde $(date) ---"
for target in "${TARGETS[@]}"; do
IFS="|" read -r NAME IP DB_PATH <<< "$target"
DEST_DIR="$BACKUP_ROOT/$NAME"
mkdir -p "$DEST_DIR"
echo "[+] Sauvegarde de $NAME ($IP)..."
ssh root@$IP "sqlite3 $DB_PATH '.backup /tmp/db_temp.bak'"
rsync -avz root@$IP:/tmp/db_temp.bak "$DEST_DIR/${NAME}_${DATE}.sqlite3"
ssh root@$IP "rm /tmp/db_temp.bak"
find "$DEST_DIR" -type f -mtime +30 -delete
done
echo "--- Sauvegardes terminées avec succès ---"
chmod +x /root/backup_sqlite.shLa restauration étant une action critique, utilisez un nom de script spécifique par service (ex: restore_vaultwarden.sh) pour éviter toute erreur de destination.
nano /root/restore_vaultwarden.sh#!/bin/bash
# =========================================================================
# CONFIGURATION CIBLE (À MODIFIER POUR CHAQUE NOUVEAU SERVICE)
# =========================================================================
REMOTE_IP="192.168.2.156"
REMOTE_DB_PATH="/root/vaultwarden/data/db.sqlite3"
CONTAINER_NAME="vaultwarden"
LOCAL_BACKUP_DIR="/root/backups/vaultwarden"
# =========================================================================
echo "--- RESTAURATION DU SERVICE : $CONTAINER_NAME ---"
ls -1 $LOCAL_BACKUP_DIR
echo ""
read -p "Copie-colle le nom du fichier à restaurer : " FILE
if [ ! -f "$LOCAL_BACKUP_DIR/$FILE" ]; then echo "Erreur : Fichier introuvable."; exit 1; fi
rsync -avz "$LOCAL_BACKUP_DIR/$FILE" root@$REMOTE_IP:/tmp/db_restore.sqlite3
ssh root@$REMOTE_IP << EOF
echo "[1/3] Arrêt du conteneur $CONTAINER_NAME..."
docker stop $CONTAINER_NAME
echo "[2/3] Sécurisation et nettoyage WAL/SHM..."
cp $REMOTE_DB_PATH ${REMOTE_DB_PATH}.old
rm -f ${REMOTE_DB_PATH}-wal ${REMOTE_DB_PATH}-shm
mv /tmp/db_restore.sqlite3 $REMOTE_DB_PATH
echo "[3/3] Relance du conteneur..."
docker start $CONTAINER_NAME
EOF
echo "--- Restauration terminée ! ---"
chmod +x /root/restore_vaultwarden.shAjoutez la tâche dans votre planificateur : crontab -e.
# Sauvegarde quotidienne SQLite à 03h00 du matin
00 3 * * * /root/backup_sqlite.sh > /root/backup_log.txt 2>&1
TARGETS du script /root/backup_sqlite.sh.cp restore_vaultwarden.sh restore_monservice.shPour aller plus loin dans la sécurisation et l’administration de vos services, n’hésitez pas à consulter ces guides :
Note : si vous cherchez d’autres tutoriels, n’hésitez pas à utiliser la barre de recherche du wiki pour découvrir de nombreuses autres pages intéressantes !
Auteur : ce guide est proposé par Amaury aka BlablaLinux. Retrouvez l’ensemble de mes services sur blablalinux.be/mes-services-publics/.