FileBrowser Quantum: migrate the config and database to v2 (#17815)

v2.0.0 reads the config strictly and stops at the v1 keys the addon
wrote (server.port, conditionals, indexingIntervalMinutes). It also only
imports the old BoltDB when server.database.migrateFrom names it and no
database.db is left in the working directory. The update now rewrites
the config, renames the database and points migrateFrom at it, keeping
a copy of the v1 config. New installs write the v2 layout.
This commit is contained in:
CanbiZ (MickLesk)
2026-10-09 21:24:00 +02:00
committed by GitHub
parent 14cd4cb667
commit 969cc5e9b8
+40 -20
View File
@@ -96,6 +96,27 @@ if [[ -f "$LEGACY_DB" || -f "$LEGACY_BIN" && ! -f "$CONFIG_PATH" ]]; then
fi fi
fi fi
# v2 rejects v1 config keys and imports the BoltDB on its first start
migrate_v1_config() {
local dir="/usr/local/community-scripts" db=0
[[ -s "$dir/database.db" && ! -s "$dir/filebrowser.sqlite" ]] && db=1
((db)) || grep -qE 'conditionals:|indexingIntervalMinutes:' "$CONFIG_PATH" || return 0
cp "$CONFIG_PATH" "${CONFIG_PATH}.v1.bak"
((db)) && mv "$dir/database.db" "$dir/database.db.old"
awk -v db="$db" '
{ match($0, /^ */); ind = RLENGTH }
/^[^ #]/ { top = $1 }
cond && ind > ci { print substr($0, 3); next }
{ cond = 0 }
/^[[:space:]]*conditionals:[[:space:]]*$/ { cond = 1; ci = ind; next }
/^[[:space:]]*indexingIntervalMinutes:/ { next }
top == "server:" && /^ port:/ { port = $2; next }
{ print }
/^server:/ && db { print " database:"; print " migrateFrom: \"database.db.old\"" }
END { if (port != "") { print "http:"; print " port: " port } }
' "${CONFIG_PATH}.v1.bak" >"$CONFIG_PATH"
}
# Existing installation # Existing installation
if [[ -f "$INSTALL_PATH" ]]; then if [[ -f "$INSTALL_PATH" ]]; then
msg_warn "${APP} is already installed." msg_warn "${APP} is already installed."
@@ -126,6 +147,7 @@ if [[ -f "$INSTALL_PATH" ]]; then
mv -f /usr/local/bin/filebrowser-quantum "$INSTALL_PATH" mv -f /usr/local/bin/filebrowser-quantum "$INSTALL_PATH"
if [[ -f "$CONFIG_PATH" ]]; then if [[ -f "$CONFIG_PATH" ]]; then
sed -i '/^\s*disableIndexing:/d' "$CONFIG_PATH" sed -i '/^\s*disableIndexing:/d' "$CONFIG_PATH"
migrate_v1_config
fi fi
if [[ "$OS" == "Debian" ]]; then if [[ "$OS" == "Debian" ]]; then
systemctl restart filebrowser.service systemctl restart filebrowser.service
@@ -173,22 +195,21 @@ read -r noauth_prompt
# === YAML CONFIG GENERATION === # === YAML CONFIG GENERATION ===
if [[ "${noauth_prompt,,}" =~ ^(y|yes)$ ]]; then if [[ "${noauth_prompt,,}" =~ ^(y|yes)$ ]]; then
cat <<EOF >"$CONFIG_PATH" cat <<EOF >"$CONFIG_PATH"
server: http:
port: $PORT port: $PORT
server:
sources: sources:
- path: "$SRC_DIR" - path: "$SRC_DIR"
name: "RootFS" name: "RootFS"
config: config:
denyByDefault: false denyByDefault: false
indexingIntervalMinutes: 240 rules:
conditionals: - neverWatchPath: "/proc"
rules: - neverWatchPath: "/sys"
- neverWatchPath: "/proc" - neverWatchPath: "/dev"
- neverWatchPath: "/sys" - neverWatchPath: "/run"
- neverWatchPath: "/dev" - neverWatchPath: "/tmp"
- neverWatchPath: "/run" - neverWatchPath: "/lost+found"
- neverWatchPath: "/tmp"
- neverWatchPath: "/lost+found"
auth: auth:
methods: methods:
noauth: true noauth: true
@@ -196,22 +217,21 @@ EOF
msg_ok "Configured with no authentication" msg_ok "Configured with no authentication"
else else
cat <<EOF >"$CONFIG_PATH" cat <<EOF >"$CONFIG_PATH"
server: http:
port: $PORT port: $PORT
server:
sources: sources:
- path: "$SRC_DIR" - path: "$SRC_DIR"
name: "RootFS" name: "RootFS"
config: config:
denyByDefault: false denyByDefault: false
indexingIntervalMinutes: 240 rules:
conditionals: - neverWatchPath: "/proc"
rules: - neverWatchPath: "/sys"
- neverWatchPath: "/proc" - neverWatchPath: "/dev"
- neverWatchPath: "/sys" - neverWatchPath: "/run"
- neverWatchPath: "/dev" - neverWatchPath: "/tmp"
- neverWatchPath: "/run" - neverWatchPath: "/lost+found"
- neverWatchPath: "/tmp"
- neverWatchPath: "/lost+found"
auth: auth:
adminUsername: admin adminUsername: admin
adminPassword: community-scripts.org adminPassword: community-scripts.org