88 lines
3.2 KiB
Bash
Executable File
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
|