Files
homarr/ops/use-var-lib-homarr.sh
T

88 lines
3.2 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# Fait pointer une instance Homarr installée sur /var/lib/homarr au lieu de
# /appdata.
#
# `/appdata` vient de l'image Docker, où c'est un point de montage. Sur une
# machine, il ne suit aucune convention : l'état d'un service se range sous
# /var/lib. Ce script agit sur l'INSTANCE INSTALLÉE — son `run.sh`, son
# `redis.conf` — et jamais sur le dépôt : ni le code source ni le Dockerfile ne
# sont touchés, pour que le fork reste rebasable sur l'amont.
#
# Idempotent : le relancer ne fait rien de plus.
#
# Usage : ops/use-var-lib-homarr.sh <répertoire de l'instance>
# ex. : sudo ops/use-var-lib-homarr.sh /opt/homarr
# sudo ops/use-var-lib-homarr.sh /opt/homarr-dev
#
set -euo pipefail
DIR="${1:?usage: ops/use-var-lib-homarr.sh <dossier-instance>}"
STATE="${HOMARR_STATE_DIR:-/var/lib/homarr}"
stamp="$(date +%F-%H%M%S)"
[ -d "$DIR" ] || { echo "$DIR n'existe pas." >&2; exit 1; }
[ -f "$DIR/run.sh" ] || { echo "$DIR/run.sh introuvable — est-ce bien une instance assemblée ?" >&2; exit 1; }
changed=0
for file in run.sh redis.conf; do
target="$DIR/$file"
[ -f "$target" ] || continue
grep -q '/appdata' "$target" || continue
cp -a "$target" "$target.bak-$stamp"
sed -i "s#/appdata#$STATE#g" "$target"
echo "== $file"
diff -u "$target.bak-$stamp" "$target" | sed -n '4,$p' || true
changed=1
done
# Le chemin des certificats n'est pas lu par run.sh mais par l'application, qui
# retombe sur /appdata/trusted-certificates quand la variable est absente.
# Réécrire les `mkdir` ne suffit donc pas : sans cette ligne, Homarr créerait à
# nouveau /appdata au premier chargement de certificat.
if ! grep -q 'LOCAL_CERTIFICATE_PATH' "$DIR/run.sh"; then
[ -f "$DIR/run.sh.bak-$stamp" ] || cp -a "$DIR/run.sh" "$DIR/run.sh.bak-$stamp"
awk -v value="$STATE/trusted-certificates" '
NR == 1 {
print
print ""
print "# Chemin des certificats de confiance. Sans cette ligne, l'\''application"
print "# retombe sur le dossier de l'\''image et le recrée au premier certificat lu."
print "export LOCAL_CERTIFICATE_PATH=\"${LOCAL_CERTIFICATE_PATH:-" value "}\""
next
}
{ print }
' "$DIR/run.sh" > "$DIR/run.sh.new"
cat "$DIR/run.sh.new" > "$DIR/run.sh" # préserve les droits et le propriétaire
rm -f "$DIR/run.sh.new"
echo "== run.sh : LOCAL_CERTIFICATE_PATH ajouté ($STATE/trusted-certificates)"
changed=1
fi
if [ "$changed" -eq 0 ]; then
echo "Rien à faire : $DIR ne référence déjà plus /appdata."
exit 0
fi
mkdir -p "$STATE/trusted-certificates"
cat <<EOF
Instance $DIR réglée sur $STATE. Sauvegardes : *.bak-$stamp
Il reste les DONNÉES, que ce script ne déplace pas — c'est à faire une fois,
service arrêté, et c'est irréversible sans sauvegarde :
sudo systemctl stop homarr
sudo mv /appdata/trusted-certificates/*.pem $STATE/trusted-certificates/ 2>/dev/null || true
sudo find /appdata -type f # doit ne RIEN afficher avant la suite
sudo rm -rf /appdata
sudo systemctl start homarr
Le contrôle qui compte ensuite : l'intégration UniFi OS doit toujours répondre.
C'est elle qui valide son certificat avec le CA déplacé — si elle fonctionne,
le déplacement a réussi.
EOF