mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-08-09 01:06:22 +00:00
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
211 lines
6.6 KiB
JSON
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+)"
|
|
}
|
|
}
|
|
}
|
|
}
|