Files
ProxMenux/json/runtime_verified_overrides.json
T
MacRimi 06f41f5792 feat(lxc-updates): revamp Updates + Options card + curated hints
Updates tab
- Unified OS + Application update card with per-section Apply buttons
  and a combined "Apply OS + <app>" footer button
- Helper-scripts install detection: uses helper_slug from managed_installs
  cache (hostname fuzzy-match against helpers_cache) so the button
  surfaces even when /usr/bin/update was removed
- Runs the community-scripts helper INSIDE the CT via pct exec so
  build.func picks the silent update path (PHS_SILENT=1) instead of the
  install menu — works with and without /usr/bin/update
- HELPER_SLUG env passthrough from backend to apply_updates.sh: falls
  back to constructing the ct/<slug>.sh URL when the CT no longer
  carries the marker file
- Post-apply state refresh via managed_installs.check_for_updates(force)
  in the /applied hook so the badge updates without a manual reload

Options card
- Rewrote as view / edit mode split with a single Edit button
- Unified apply defaults (snapshot + storage + restart) shared by
  manual and scheduled runs
- Scheduled updates (M5): cron picker + preset dropdown + What-to-update
  target + Delete schedule button, wired to a background scheduler thread
  that fires apply_updates.sh headless with the schedule's env vars
- External host cron detection with variant + scope reporting
  (tteck-legacy / community-scripts / custom, OS-only), shown as an
  informational chip only in edit mode

App tab editor
- Multi-app registration with per-app upstream tracking method
  (github / http_json / docker_hub)
- Card-contrast pattern in edit mode (bg-card + bg-background inputs)
- Auto-heal for missing installed_version via alt_detectors +
  file_fallbacks

Curated tracking hints (M6)
- Add http_json upstream for Plex (plex.tv API)
- Add binary+github hints for Emby (MediaBrowser/Emby.Releases) and
  PhotoPrism (photoprism/photoprism)
- Extend CI merge whitelist with upstream_type / upstream_url /
  upstream_json_path / docker_image

Tab reorder
- LXC modal tabs: Status | App | Updates | Mounts | Backups | Firewall

apply_updates.sh
- New helper execution path: parse ct/<slug>.sh URL, run inside CT
  with PHS_SILENT=1, respecting HELPER_SLUG fallback when
  /usr/bin/update is missing
2026-08-09 00:49:44 +02:00

211 lines
6.6 KiB
JSON

{
"schema_version": 1,
"observed_at": "2026-08-06",
"notes": "Runtime-verified detectors for the LXC app catalog. Every entry is a detector proven to work on a real container. Contribution rules \u2014 accept ONLY: `detector` (required, with installed_via + method-specific fields + repo/tag_regex), optional `alt_detectors` (cross-method fallbacks), optional `file_fallbacks` (same-method secondary paths). REJECT anything that identifies a host: no IP addresses, no VMIDs, no hostnames, no `evidence` blocks with those fields. Report reproduction context in the PR description instead \u2014 the committed JSON must stay generic.",
"apps": {
"qbittorrent": {
"detector": {
"installed_via": "binary",
"binary_path": "/opt/qbittorrent/qbittorrent-nox",
"repo": "userdocs/qbittorrent-nox-static",
"github_source": "releases",
"tag_regex": "(?i)(?:release-)?(\\d+\\.\\d+\\.\\d+)"
}
},
"tandoor": {
"detector": {
"installed_via": "file",
"file_path": "/opt/tandoor/cookbook/version_info.py",
"file_regex": "TANDOOR_VERSION\\s*=\\s*[\"']v?(\\d+\\.\\d+\\.\\d+)",
"repo": "TandoorRecipes/recipes",
"github_source": "releases",
"tag_regex": "v?(\\d+\\.\\d+\\.\\d+)"
},
"file_fallbacks": [
{
"path": "/root/.tandoor",
"regex": "v?(\\d+\\.\\d+\\.\\d+)"
}
]
},
"openwebui": {
"operational": false,
"remove_from_v1": true,
"detector": {
"installed_via": "python_dist",
"python_path": "/root/.local/share/uv/tools/open-webui/bin/python",
"distribution": "open-webui",
"repo": "open-webui/open-webui",
"github_source": "releases",
"tag_regex": "v?(\\d+\\.\\d+\\.\\d+)"
}
},
"proxmox-backup-server": {
"detector": {
"installed_via": "dpkg",
"package": "proxmox-backup-server",
"tag_regex": "(\\d+\\.\\d+\\.\\d+)"
}
},
"adguard": {
"detector": {
"installed_via": "binary",
"binary_path": "/opt/AdGuardHome/AdGuardHome",
"repo": "AdguardTeam/AdGuardHome",
"github_source": "releases",
"tag_regex": "v?(\\d+\\.\\d+\\.\\d+)"
}
},
"nginxproxymanager": {
"detector": {
"installed_via": "file",
"file_path": "/opt/nginxproxymanager/backend/package.json",
"file_regex": "\"version\"\\s*:\\s*\"(\\d+\\.\\d+\\.\\d+)\"",
"repo": "NginxProxyManager/nginx-proxy-manager",
"github_source": "releases",
"tag_regex": "v?(\\d+\\.\\d+\\.\\d+)"
},
"file_fallbacks": [
{
"path": "/app/package.json",
"regex": "\"version\"\\s*:\\s*\"(\\d+\\.\\d+\\.\\d+)\""
},
{
"path": "/root/.nginxproxymanager",
"regex": "v?(\\d+\\.\\d+\\.\\d+)"
}
]
},
"pairdrop": {
"detector": {
"installed_via": "file",
"file_path": "/opt/pairdrop/package.json",
"file_regex": "\"version\"\\s*:\\s*\"(\\d+\\.\\d+\\.\\d+)\"",
"repo": "schlagmichdoch/PairDrop",
"github_source": "releases",
"tag_regex": "v?(\\d+\\.\\d+\\.\\d+)"
},
"file_fallbacks": [
{
"path": "/root/.pairdrop",
"regex": "v?(\\d+\\.\\d+\\.\\d+)"
}
]
},
"vaultwarden": {
"detector": {
"installed_via": "binary",
"binary_path": "/opt/vaultwarden/bin/vaultwarden",
"repo": "dani-garcia/vaultwarden",
"github_source": "releases",
"tag_regex": "v?(\\d+\\.\\d+\\.\\d+)"
},
"alt_detectors": [
{
"installed_via": "file",
"file_path": "/root/.vaultwarden",
"file_regex": "v?(\\d+\\.\\d+\\.\\d+)"
}
]
},
"docmost": {
"detector": {
"installed_via": "file",
"file_path": "/opt/docmost/package.json",
"file_regex": "\"version\"\\s*:\\s*\"(\\d+\\.\\d+\\.\\d+)\"",
"repo": "docmost/docmost",
"github_source": "releases",
"tag_regex": "v?(\\d+\\.\\d+\\.\\d+)"
},
"file_fallbacks": [
{
"path": "/root/.docmost",
"regex": "v?(\\d+\\.\\d+\\.\\d+)"
}
]
},
"agentdvr": {
"detector": {
"installed_via": "file",
"file_path": "/root/.agentdvr",
"file_regex": "Agent_[^/]+_([0-9]+(?:_[0-9]+){3})\\.zip",
"repo": "ispysoftware/agent-install-scripts",
"github_source": "releases",
"tag_regex": "v?(\\d+(?:\\.\\d+){3})"
}
},
"odoo": {
"detector": {
"installed_via": "dpkg",
"package": "odoo",
"tag_regex": "(\\d+\\.\\d+(?:\\.\\d+)?)"
},
"alt_detectors": [
{
"installed_via": "binary",
"binary_path": "/usr/bin/odoo"
}
]
},
"paperless-ngx": {
"operational": false,
"detector": {
"installed_via": "docker_label",
"container_name": "paperless-webserver-1",
"label": "org.opencontainers.image.version",
"repo": "paperless-ngx/paperless-ngx",
"github_source": "releases",
"tag_regex": "v?(\\d+\\.\\d+\\.\\d+)"
},
"alt_detectors": [
{
"installed_via": "file",
"file_path": "/opt/paperless/src/paperless/version.py",
"file_regex": "__version__[^\\n=]*=\\s*\\((\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\)"
}
]
},
"plex": {
"operational": true,
"detector": {
"installed_via": "dpkg",
"package": "plexmediaserver",
"installed_regex": "(\\d+\\.\\d+\\.\\d+\\.\\d+)",
"upstream_type": "http_json",
"upstream_url": "https://plex.tv/api/downloads/5.json?channel=8",
"upstream_json_path": "computer.Linux.version",
"tag_regex": "(\\d+\\.\\d+\\.\\d+\\.\\d+)"
}
},
"prometheus": {
"operational": false,
"detector": {
"installed_via": "docker_exec",
"container_name": "prometheus",
"binary_path": "/bin/prometheus",
"binary_args": [
"--version"
],
"repo": "prometheus/prometheus",
"github_source": "releases",
"tag_regex": "v?(\\d+\\.\\d+\\.\\d+)"
}
},
"grafana": {
"operational": false,
"detector": {
"installed_via": "docker_exec",
"container_name": "grafana",
"binary_path": "grafana",
"binary_args": [
"server",
"-v"
],
"repo": "grafana/grafana",
"github_source": "releases",
"tag_regex": "v?(\\d+\\.\\d+\\.\\d+)"
}
}
}
}