Merge claude/2
This commit is contained in:
commit
520595bc67
@ -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
|
||||
|
||||
@ -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
|
||||
#
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
*/
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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\"")
|
||||
|
||||
@ -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)"},
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user