Paquet YunoHost de MaBibli 1.0.0

Installe l'archive self-contained publiée en release du dépôt du code,
amd64 ou arm64 selon la machine.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Mathieu Limonier
2026-08-22 22:36:27 +02:00
co-authored by Claude Opus 5
commit 1373532345
16 changed files with 2058 additions and 0 deletions
+87
View File
@@ -0,0 +1,87 @@
#!/bin/bash
#=================================================
# VARIABLES ET HELPERS PROPRES À MABIBLI
#=================================================
# Nom du binaire produit par `dotnet publish MaBibli.Api`.
mabibli_binaire="MaBibli.Api"
# Base SQLite. Doit rester cohérent avec `ConnectionStrings__MaBibli` dans
# conf/systemd.service.
mabibli_base="mabibli.db"
# Copie cohérente déposée dans le répertoire de données au moment de la sauvegarde,
# puis reprise par le script de restauration.
mabibli_instantane="mabibli-instantane.db"
#=================================================
# SAUVEGARDE À CHAUD DE LA BASE SQLITE
#=================================================
#
# Pourquoi ce n'est pas un simple `cp` :
#
# La base tourne en mode **WAL** (vérifié sur le publish réel : `PRAGMA journal_mode`
# renvoie `wal`, et le répertoire contient bien `mabibli.db-wal` / `mabibli.db-shm`).
# En WAL, les écritures récentes vivent dans le fichier `-wal` et **pas** dans le
# `.db`. Sur la base fraîchement migrée mesurée en local, le `.db` faisait 4 Ko pour
# un `-wal` de 205 Ko : copier le seul `.db` aurait sauvegardé une base à peu près
# vide. Copier les trois fichiers pendant que le service écrit ne vaut guère mieux,
# puisque rien ne garantit qu'ils soient capturés au même instant.
#
# `.backup` utilise l'API de sauvegarde en ligne de SQLite : elle produit un fichier
# unique, cohérent, sans arrêter le service ni bloquer les lectures. C'est la seule
# méthode correcte pour une sauvegarde à chaud, et elle évite d'imposer une coupure
# de service à chaque sauvegarde nocturne.
#
# usage : mabibli_instantane_base "$data_dir"
mabibli_instantane_base() {
local repertoire="$1"
local source="$repertoire/$mabibli_base"
local cible="$repertoire/$mabibli_instantane"
# Un instantané laissé par une sauvegarde précédente n'a plus de valeur.
# (Il ne peut pas être effacé en fin de sauvegarde : `ynh_backup` ne fait que
# *déclarer* les chemins, la copie réelle a lieu plus tard, par le cœur de
# YunoHost.)
rm -f "$cible"
if [ ! -f "$source" ]; then
ynh_print_warn "Aucune base à $source : rien à figer. Première sauvegarde avant tout démarrage ?"
return 0
fi
# `.backup` échoue proprement si la base est corrompue : mieux vaut interrompre
# la sauvegarde que d'archiver un fichier illisible en croyant être protégé.
sqlite3 "$source" ".backup '$cible'"
chown "$app:$app" "$cible"
chmod 600 "$cible"
}
#=================================================
# REPRISE DE L'INSTANTANÉ APRÈS RESTAURATION
#=================================================
#
# usage : mabibli_reprendre_instantane "$data_dir"
mabibli_reprendre_instantane() {
local repertoire="$1"
local instantane="$repertoire/$mabibli_instantane"
if [ ! -f "$instantane" ]; then
ynh_print_warn "Pas d'instantané dans l'archive : la base est reprise telle quelle."
return 0
fi
# ⚠️ Les fichiers `-wal` et `-shm` de l'archive décrivent l'état d'une *autre*
# copie de la base. Les laisser à côté de l'instantané ferait rejouer à SQLite
# un journal qui ne lui correspond pas. Ils doivent disparaître.
rm -f "$repertoire/$mabibli_base" \
"$repertoire/$mabibli_base-wal" \
"$repertoire/$mabibli_base-shm"
mv "$instantane" "$repertoire/$mabibli_base"
chown "$app:$app" "$repertoire/$mabibli_base"
chmod 600 "$repertoire/$mabibli_base"
}