Merge claude/2

This commit is contained in:
librelad 2026-05-23 15:41:55 +01:00
commit 520595bc67
24 changed files with 56 additions and 1 deletions

View File

@ -14,6 +14,7 @@
#
CFG_ADGUARD_APP_NAME=adguard
CFG_ADGUARD_BACKUP=true
CFG_ADGUARD_BACKUP_STRATEGY=auto
CFG_ADGUARD_COMPOSE_FILE=default
CFG_ADGUARD_HEALTHCHECK=true
CFG_ADGUARD_AUTHELIA=false

View File

@ -19,6 +19,7 @@ CFG_CROWDSEC_HOST_SERVICE=crowdsec
CFG_CROWDSEC_HOST_SERVICES=crowdsec.service,crowdsec-firewall-bouncer.service
CFG_CROWDSEC_HOST_LOG_FILES="crowdsec.service|/var/log/crowdsec.log,crowdsec-firewall-bouncer.service|/var/log/crowdsec-firewall-bouncer.log"
CFG_CROWDSEC_BACKUP=true
CFG_CROWDSEC_BACKUP_STRATEGY=auto
CFG_CROWDSEC_MONITORING=false
CFG_CROWDSEC_PROMETHEUS_LISTEN=0.0.0.0:6060
#

View File

@ -11,6 +11,7 @@
#
CFG_DASHY_APP_NAME=dashy
CFG_DASHY_BACKUP=true
CFG_DASHY_BACKUP_STRATEGY=auto
CFG_DASHY_COMPOSE_FILE=default
CFG_DASHY_HEALTHCHECK=true
CFG_DASHY_AUTHELIA=false

View File

@ -11,6 +11,7 @@
#
CFG_FOCALBOARD_APP_NAME=focalboard
CFG_FOCALBOARD_BACKUP=true
CFG_FOCALBOARD_BACKUP_STRATEGY=auto
CFG_FOCALBOARD_COMPOSE_FILE=default
CFG_FOCALBOARD_HEALTHCHECK=true
CFG_FOCALBOARD_AUTHELIA=false

View File

@ -13,6 +13,7 @@
#
CFG_GITEA_APP_NAME=gitea
CFG_GITEA_BACKUP=true
CFG_GITEA_BACKUP_STRATEGY=auto
CFG_GITEA_COMPOSE_FILE=default
CFG_GITEA_HEALTHCHECK=true
CFG_GITEA_AUTHELIA=false

View File

@ -12,6 +12,7 @@
#
CFG_GLUETUN_APP_NAME=gluetun
CFG_GLUETUN_BACKUP=true
CFG_GLUETUN_BACKUP_STRATEGY=auto
CFG_GLUETUN_COMPOSE_FILE=default
CFG_GLUETUN_HEALTHCHECK=true
CFG_GLUETUN_AUTHELIA=false

View File

@ -14,6 +14,7 @@
CFG_GRAFANA_APP_NAME=grafana
CFG_GRAFANA_REQUIRES="prometheus"
CFG_GRAFANA_BACKUP=true
CFG_GRAFANA_BACKUP_STRATEGY=auto
CFG_GRAFANA_COMPOSE_FILE=default
CFG_GRAFANA_HEALTHCHECK=true
CFG_GRAFANA_AUTHELIA=false

View File

@ -11,6 +11,7 @@
#
CFG_IPINFO_APP_NAME=ipinfo
CFG_IPINFO_BACKUP=false
CFG_IPINFO_BACKUP_STRATEGY=auto
CFG_IPINFO_COMPOSE_FILE=default
CFG_IPINFO_HEALTHCHECK=true
CFG_IPINFO_AUTHELIA=false

View File

@ -11,6 +11,7 @@
#
CFG_JELLYFIN_APP_NAME=jellyfin
CFG_JELLYFIN_BACKUP=true
CFG_JELLYFIN_BACKUP_STRATEGY=auto
CFG_JELLYFIN_COMPOSE_FILE=default
CFG_JELLYFIN_HEALTHCHECK=true
CFG_JELLYFIN_AUTHELIA=false

View File

@ -11,6 +11,7 @@
#
CFG_JITSIMEET_APP_NAME=jitsimeet
CFG_JITSIMEET_BACKUP=true
CFG_JITSIMEET_BACKUP_STRATEGY=auto
CFG_JITSIMEET_COMPOSE_FILE=default
CFG_JITSIMEET_HEALTHCHECK=true
CFG_JITSIMEET_AUTHELIA=false

View File

@ -1295,6 +1295,12 @@ class AppsManager {
if (!selectOptions && typeof ConfigOptions !== 'undefined' && ConfigOptions.isDropdownKey?.(cfgKey)) {
selectOptions = ConfigOptions.getSelectOptions(cfgKey);
}
// Backup strategy: "live" is only valid for apps we can snapshot
// consistently. Hide it elsewhere so we never offer a choice that
// would just fall back to stopping the app.
if (selectOptions && cfgKey.endsWith('_BACKUP_STRATEGY') && !this.isCurrentAppLiveCapable()) {
selectOptions = selectOptions.filter(o => String(o.value) !== 'live');
}
// Fall back to default if stored value isn't in the option list.
let effectiveValue = value;
if (selectOptions && selectOptions.length > 0) {
@ -2696,6 +2702,21 @@ class AppsManager {
}
return {};
}
// True when the current app can be backed up live (set by the apps.json
// generator from its compose backup labels). Drives whether the per-app
// "live" backup-strategy option is offered.
isCurrentAppLiveCapable() {
if (window.apps && this.currentApp) {
const target = String(this.currentApp).toLowerCase();
const app = window.apps.find(a => {
const slug = (a.command || '').split(' ').pop();
return slug.toLowerCase() === target;
});
return app?.backup_live_capable === true;
}
return false;
}
/**
* Collect configuration from form and format as pipe-separated string
*/

View File

@ -13,6 +13,7 @@
#
CFG_LIBREPORTAL_APP_NAME=libreportal
CFG_LIBREPORTAL_BACKUP=true
CFG_LIBREPORTAL_BACKUP_STRATEGY=auto
CFG_LIBREPORTAL_COMPOSE_FILE=default
CFG_LIBREPORTAL_HEALTHCHECK=true
CFG_LIBREPORTAL_AUTHELIA=false

View File

@ -13,6 +13,7 @@
CFG_MONEYAPP_APP_NAME=moneyapp
CFG_MONEYAPP_REQUIRES=""
CFG_MONEYAPP_BACKUP=true
CFG_MONEYAPP_BACKUP_STRATEGY=auto
CFG_MONEYAPP_COMPOSE_FILE=default
CFG_MONEYAPP_HEALTHCHECK=true
CFG_MONEYAPP_AUTHELIA=false

View File

@ -12,6 +12,7 @@
#
CFG_OLLAMA_APP_NAME=ollama
CFG_OLLAMA_BACKUP=true
CFG_OLLAMA_BACKUP_STRATEGY=auto
CFG_OLLAMA_COMPOSE_FILE=default
CFG_OLLAMA_HEALTHCHECK=true
CFG_OLLAMA_AUTHELIA=false

View File

@ -11,6 +11,7 @@
#
CFG_ONLYOFFICE_APP_NAME=onlyoffice
CFG_ONLYOFFICE_BACKUP=true
CFG_ONLYOFFICE_BACKUP_STRATEGY=auto
CFG_ONLYOFFICE_COMPOSE_FILE=default
CFG_ONLYOFFICE_HEALTHCHECK=true
CFG_ONLYOFFICE_AUTHELIA=false

View File

@ -12,6 +12,7 @@
#
CFG_PIHOLE_APP_NAME=pihole
CFG_PIHOLE_BACKUP=true
CFG_PIHOLE_BACKUP_STRATEGY=auto
CFG_PIHOLE_COMPOSE_FILE=default
CFG_PIHOLE_HEALTHCHECK=true
CFG_PIHOLE_AUTHELIA=false

View File

@ -11,6 +11,7 @@
#
CFG_PROMETHEUS_APP_NAME=prometheus
CFG_PROMETHEUS_BACKUP=true
CFG_PROMETHEUS_BACKUP_STRATEGY=auto
CFG_PROMETHEUS_COMPOSE_FILE=default
CFG_PROMETHEUS_HEALTHCHECK=true
CFG_PROMETHEUS_AUTHELIA=false

View File

@ -11,6 +11,7 @@
#
CFG_SEARXNG_APP_NAME=searxng
CFG_SEARXNG_BACKUP=false
CFG_SEARXNG_BACKUP_STRATEGY=auto
CFG_SEARXNG_COMPOSE_FILE=default
CFG_SEARXNG_HEALTHCHECK=true
CFG_SEARXNG_AUTHELIA=false

View File

@ -11,6 +11,7 @@
#
CFG_SPEEDTEST_APP_NAME=speedtest
CFG_SPEEDTEST_BACKUP=false
CFG_SPEEDTEST_BACKUP_STRATEGY=auto
CFG_SPEEDTEST_COMPOSE_FILE=default
CFG_SPEEDTEST_HEALTHCHECK=false
CFG_SPEEDTEST_AUTHELIA=false

View File

@ -12,6 +12,7 @@
#
CFG_TRAEFIK_APP_NAME=traefik
CFG_TRAEFIK_BACKUP=true
CFG_TRAEFIK_BACKUP_STRATEGY=auto
CFG_TRAEFIK_COMPOSE_FILE=default
CFG_TRAEFIK_HEALTHCHECK=true
CFG_TRAEFIK_AUTHELIA=false

View File

@ -12,6 +12,7 @@
#
CFG_UNBOUND_APP_NAME=unbound
CFG_UNBOUND_BACKUP=true
CFG_UNBOUND_BACKUP_STRATEGY=auto
CFG_UNBOUND_COMPOSE_FILE=default
CFG_UNBOUND_HEALTHCHECK=true
CFG_UNBOUND_AUTHELIA=false

View File

@ -13,6 +13,7 @@
CFG_WIREGUARD_APP_NAME=wireguard
CFG_WIREGUARD_SUBNET=
CFG_WIREGUARD_BACKUP=true
CFG_WIREGUARD_BACKUP_STRATEGY=auto
CFG_WIREGUARD_COMPOSE_FILE=default
CFG_WIREGUARD_HEALTHCHECK=true
CFG_WIREGUARD_AUTHELIA=false

View File

@ -181,6 +181,18 @@ EOF
services_json="${services_json%,}"
fi
# Live-backup capability: the app can be snapshotted live without
# downtime only if it declares a dumpable database, or is explicitly
# marked live-safe. The app config UI uses this to hide the "live"
# strategy option where it would be unsafe.
local backup_live_capable="false"
if [[ -f "$compose_file" ]]; then
if grep -qE '^[[:space:]]*libreportal\.backup\.db[[:space:]]*:' "$compose_file" 2>/dev/null \
|| grep -qE '^[[:space:]]*libreportal\.backup\.live[[:space:]]*:[[:space:]]*["'\'']?true' "$compose_file" 2>/dev/null; then
backup_live_capable="true"
fi
fi
if [[ "$first_app" == false ]]; then
echo " }," >> "$temp_file"
fi
@ -197,6 +209,7 @@ EOF
fields+=(" \"category\": \"$mapped_category\"")
[[ -n "$mapped_categories_json" ]] && fields+=(" \"categories\": $mapped_categories_json")
fields+=(" \"installed\": $is_installed")
fields+=(" \"backup_live_capable\": $backup_live_capable")
[[ -n "$url" ]] && fields+=(" \"url\": \"$url\"")
[[ -n "$description" ]] && fields+=(" \"description\": \"$description\"")
[[ -n "$icon_file" ]] && fields+=(" \"icon\": \"icons/apps/$icon_file\"")

View File

@ -163,7 +163,7 @@ PORTEOF
"category": "advanced",
"label": "Backup Strategy",
"type": "select",
"tooltip": "How this app is quiesced before its backup snapshot. Automatic picks the safest zero-downtime method available (a live, consistent database dump for this app), and falls back to stopping the app if a live dump ever fails. Only shown for apps that can be backed up live.",
"tooltip": "How this app is quiesced before its backup snapshot. Automatic picks the safest zero-downtime method available and falls back to stopping the app if a live dump ever fails. The Live option appears only for apps that can be backed up consistently without stopping (a database we can dump, or a static app marked live-safe).",
"advanced": true,
"options": [
{"value": "auto", "label": "Automatic (recommended)"},