Update version 1.2.3

This commit is contained in:
MacRimi
2026-07-14 19:22:33 +02:00
parent 1872a309ec
commit 8060f59d69
10 changed files with 230 additions and 17 deletions

View File

@@ -413,7 +413,7 @@ const formatRunAt = (iso: string | null) => {
// belong to matches "the key is a PBS thing" without dragging in
// the fuller management surface.
// ──────────────────────────────────────────────────────────────
function PbsKeyfileActions() {
function PbsKeyfileActions({ pbsRepository }: { pbsRepository?: string }) {
const { data: info, mutate: mutateInfo } = useSWR<{
installed: boolean
fingerprint?: string
@@ -428,6 +428,22 @@ function PbsKeyfileActions() {
const [busy, setBusy] = useState(false)
const [err, setErr] = useState<string | null>(null)
// Auto-discover a PVE-managed keyfile at /etc/pve/priv/storage/<NAME>.enc
// that matches this specific PBS repository. When present, the Upload
// modal surfaces a one-click "Use PVE-managed key" shortcut at the
// top so the operator doesn't have to hunt down the file path — the
// exact convenience the shell TUI already provides during its import
// wizard. Only fetched while the modal is open + a repository is known.
const { data: pveDiscover } = useSWR<{
entries: Array<{ name: string; server: string; datastore: string; path: string; matches_repository: boolean }>
}>(
uploadOpen && pbsRepository
? `/api/host-backups/pbs-encryption/discover-pve-keyfiles?repository=${encodeURIComponent(pbsRepository)}`
: null,
fetcher,
)
const pveMatch = pveDiscover?.entries?.find((e) => e.matches_repository) || null
const closeUpload = () => {
setUploadOpen(false)
setImportFile(null)
@@ -572,6 +588,34 @@ function PbsKeyfileActions() {
</DialogDescription>
</DialogHeader>
<div className="space-y-3">
{pveMatch && (
<div className="rounded-md border border-emerald-500/40 bg-emerald-500/10 p-3 space-y-2 text-xs">
<div className="flex items-start gap-2">
<Lock className="h-4 w-4 text-emerald-400 mt-0.5 shrink-0" />
<div className="flex-1 space-y-1">
<div className="font-semibold text-emerald-300">PVE-managed keyfile detected for this PBS</div>
<div className="text-muted-foreground">
Proxmox already stores an encryption key for storage <code className="font-mono text-[10.5px]">{pveMatch.name}</code> at{" "}
<code className="font-mono text-[10.5px] break-all">{pveMatch.path}</code>. Import it in one click.
</div>
</div>
</div>
<div className="flex justify-end">
<Button
size="sm"
onClick={() => {
setImportPath(pveMatch.path)
setImportFile(null)
}}
disabled={busy}
className="!bg-emerald-600 hover:!bg-emerald-700 !text-white h-7 text-[11px]"
>
Use this key
</Button>
</div>
</div>
)}
{pveMatch && <div className="text-[10px] text-center text-muted-foreground"> or upload your own </div>}
<div>
<Label htmlFor="pbsKfUploadFile" className="text-xs">Upload from your machine</Label>
<Input
@@ -592,7 +636,7 @@ function PbsKeyfileActions() {
value={importPath}
onChange={(e) => setImportPath(e.target.value)}
disabled={busy || !!importFile}
placeholder="/usr/local/share/proxmenux/pbs-key.conf"
placeholder="e.g. /etc/pve/priv/storage/<NAME>.enc or /root/my-pbs-key"
className="h-9 mt-1 font-mono text-xs"
/>
</div>
@@ -1578,6 +1622,21 @@ function InspectModal({
fetcher,
)
const needsKeyfile = !!(remoteArc?.encrypted && keyfileInfo && !keyfileInfo.installed)
// Same PVE-managed keyfile auto-discovery the setup wizards use: when
// the encrypted snapshot lives on a PBS whose PVE storage.cfg entry
// has an `encryption-key` file at /etc/pve/priv/storage/<NAME>.enc,
// surface a one-click "Use this key" shortcut in the amber panel so
// the operator doesn't have to type the full path. Only fetched when
// the amber gate is actually rendered (encrypted + no keyfile).
const { data: pveDiscoverInspect } = useSWR<{
entries: Array<{ name: string; server: string; datastore: string; path: string; matches_repository: boolean }>
}>(
needsKeyfile && remoteArc?.repo_repository
? `/api/host-backups/pbs-encryption/discover-pve-keyfiles?repository=${encodeURIComponent(remoteArc.repo_repository)}`
: null,
fetcher,
)
const pveMatchInspect = pveDiscoverInspect?.entries?.find((e) => e.matches_repository) || null
const [importFile, setImportFile] = useState<File | null>(null)
const [importPath, setImportPath] = useState<string>("")
const [importing, setImporting] = useState(false)
@@ -2041,8 +2100,37 @@ function InspectModal({
</div>
</div>
</div>
{pveMatchInspect && (
<div className="rounded-md border border-emerald-500/40 bg-emerald-500/10 p-2.5 space-y-1.5 text-[11px]">
<div className="flex items-start gap-2">
<Lock className="h-3.5 w-3.5 text-emerald-400 mt-0.5 shrink-0" />
<div className="flex-1 space-y-1">
<div className="font-semibold text-emerald-300">PVE-managed keyfile detected for this PBS</div>
<div className="text-muted-foreground">
Proxmox stores an encryption key for storage <code className="font-mono text-[10.5px]">{pveMatchInspect.name}</code> at{" "}
<code className="font-mono text-[10.5px] break-all">{pveMatchInspect.path}</code>. Import it in one click.
</div>
</div>
</div>
<div className="flex justify-end">
<Button
size="sm"
onClick={() => {
setImportPath(pveMatchInspect.path)
setImportFile(null)
}}
disabled={importing}
className="!bg-emerald-600 hover:!bg-emerald-700 !text-white h-6 text-[10.5px] px-2"
>
Use this key
</Button>
</div>
</div>
)}
<div className="space-y-1.5 pt-1 border-t border-amber-500/30">
<Label htmlFor="keyfileImport" className="text-[11px] font-medium">Upload from your machine</Label>
<Label htmlFor="keyfileImport" className="text-[11px] font-medium">
{pveMatchInspect ? "Or upload from your machine" : "Upload from your machine"}
</Label>
<Input
id="keyfileImport"
type="file"
@@ -2061,7 +2149,7 @@ function InspectModal({
value={importPath}
onChange={(e) => setImportPath(e.target.value)}
disabled={importing || !!importFile}
placeholder="/usr/local/share/proxmenux/pbs-key.conf"
placeholder="e.g. /etc/pve/priv/storage/<NAME>.enc or /root/my-pbs-key"
className="h-8 text-[11px] font-mono"
/>
</div>
@@ -3834,7 +3922,7 @@ function CreateJobDialog({
value={pbsImportPath}
onChange={(e) => setPbsImportPath(e.target.value)}
disabled={pbsImportBusy || !!pbsImportFile}
placeholder="/usr/local/share/proxmenux/pbs-key.conf"
placeholder="e.g. /etc/pve/priv/storage/<NAME>.enc or /root/my-pbs-key"
className="h-8 text-[11px] font-mono"
/>
<p className="text-[10px] text-muted-foreground">
@@ -4808,7 +4896,7 @@ function ManualBackupDialog({
value={pbsImportPath}
onChange={(e) => setPbsImportPath(e.target.value)}
disabled={pbsImportBusy || !!pbsImportFile}
placeholder="/usr/local/share/proxmenux/pbs-key.conf"
placeholder="e.g. /etc/pve/priv/storage/<NAME>.enc or /root/my-pbs-key"
className="h-8 text-[11px] font-mono"
/>
<p className="text-[10px] text-muted-foreground">
@@ -5843,7 +5931,7 @@ function DestinationRow({
is host-wide but conceptually belongs to PBS usage, so the
Download / Upload / Delete controls sit next to the
destination(s) they support. */}
{item.kind === "pbs" && <PbsKeyfileActions />}
{item.kind === "pbs" && <PbsKeyfileActions pbsRepository={item.repository} />}
</div>
)
}

View File

@@ -1,17 +1,18 @@
{
"_description": "Verified AI models for ProxMenux notifications. Only models listed here will be shown to users. Models are tested to work with the chat/completions API format.",
"_updated": "2026-07-13",
"_updated": "2026-07-14",
"_verifier": "Refreshed with tools/ai-models-verifier (private). Re-run before each ProxMenux release to keep the list current. The verifier and ProxMenux share the same reasoning/thinking-model handlers so their verdicts stay aligned with runtime behaviour.",
"groq": {
"models": [
"llama-3.3-70b-versatile",
"llama-3.1-8b-instant",
"meta-llama/llama-4-scout-17b-16e-instruct",
"openai/gpt-oss-120b",
"openai/gpt-oss-20b"
],
"recommended": "llama-3.3-70b-versatile",
"_note": "Verified 2026-07-13 against Groq's public production catalog. Legacy llama-3.1-70b-versatile / llama3-70b-8192 / llama3-8b-8192 / mixtral-8x7b-32768 / gemma2-9b-it removed (retired upstream). openai/gpt-oss-120b (500 T/s) and openai/gpt-oss-20b (1000 T/s) added — both listed as current production."
"_note": "Verified functionally 2026-07-14 with the Groq API (15 models discovered, 9 passed). Legacy llama-3.1-70b-versatile / llama3-70b-8192 / llama3-8b-8192 / mixtral-8x7b-32768 / gemma2-9b-it removed (retired upstream). llama-4-scout added (current-gen Llama 4, 0.47s). openai/gpt-oss-120b / gpt-oss-20b confirmed. Passing but excluded: allam-2-7b (Arabic-focused), qwen/qwen3-32b (Chinese-first, unreliable Spanish output), openai/gpt-oss-safeguard-20b (safety-classifier variant), groq/compound-mini (agentic system, wrong fit for notification translation)."
},
"gemini": {
@@ -69,7 +70,7 @@
"mistralai/mistral-small-3.2-24b-instruct"
],
"recommended": "meta-llama/llama-3.3-70b-instruct",
"_note": "Verified 2026-07-13 against OpenRouter's public /api/v1/models catalog (343 models advertised). anthropic/claude-3.5-haiku / anthropic/claude-3.5-sonnet / google/gemini-flash-1.5 / mistralai/mistral-7b-instruct / mistralai/mixtral-8x7b-instruct removed (GONE from catalog). Modern replacements added: llama-4-scout (Meta's current gen), claude-haiku-4.5 / claude-sonnet-4.6 (Anthropic current gen via OpenRouter proxy), gemini-2.5-flash / flash-lite (Google current gen), mistral-small-3.2-24b (Mistral current small)."
"_note": "Verified functionally 2026-07-14 with the OpenRouter API — all 10 curated candidates pass the Spanish-translation notification test. Fastest: llama-4-scout (0.51s), gemini-2.5-flash-lite (1.14s), gemini-2.5-flash (1.94s), llama-3.3-70b-instruct (2.29s), claude-haiku-4.5 (2.71s). Legacy anthropic/claude-3.5-* / google/gemini-flash-1.5 / mistralai/mistral-7b-instruct / mixtral-8x7b-instruct removed (GONE from catalog). Modern replacements added: llama-4-scout (Meta's current gen — dramatically fastest), claude-haiku-4.5 / claude-sonnet-4.6, gemini-2.5-flash / flash-lite, mistral-small-3.2-24b. recommended kept as llama-3.3-70b for capability/latency balance; llama-4-scout is a faster alternative worth considering as recommended after a broader release."
},
"ollama": {

View File

@@ -1,4 +1,119 @@
## 2026-07-14
### New version ProxMenux v1.2.3
![ProxMenux Backups](https://raw.githubusercontent.com/MacRimi/ProxMenux/main/images/ProxMenux_backup.png)
Stable consolidation of the **v1.2.2.x beta cycle** (v1.2.2.1 → v1.2.2.2 → v1.2.2.3). The headline is a new **Backups** section inside the Monitor with a first-class create / schedule / restore flow against Local, PBS and Borg, a live post-restore progress card, a reworked PBS encryption dialog, and a direction-aware restore that handles cross-kernel jumps safely. Around it: a new Network Flow topology view, redesigned cards across Overview / VM & LXC / Storage / Network, richer plain-templated notifications that identify the affected object without needing AI, a refreshed Health Monitor Thresholds panel, and a full re-verification of the AI-model catalogue for the five supported providers.
---
## 🗄️ Backups integrated in the Monitor
- **Create / schedule / restore** host backups against **Local**, **Proxmox Backup Server** and **Borg** destinations from the dashboard.
- **Two scheduling modes**: dedicated systemd timer, or *attached* to an existing PVE vzdump job with retention live-inherited from the parent on every run.
- **PBS encryption with paired recovery blob**: encrypted backups store a passphrase-wrapped copy of the keyfile as a `-keyrecovery` group next to each snapshot, so a fresh install can always get the key back with the operator's passphrase.
- **Direction-aware restore**: reapplies IOMMU / VFIO / GRUB tunings on cross-kernel jumps, protects critical packages from cascade-remove, auto-remaps NICs after a motherboard swap.
- **Live post-restore progress card**: after the reboot, the Backups tab shows a real-time card with step-by-step milestones, per-component status (NVIDIA, Intel GPU tools, Coral, AMD tools), boot sanity warnings, a rollback delta widget listing anything on the host that was not in the backup, and a log tail with an Issues-only filter. Past restores are archived and browsable.
- **PBS keyfile management inline in the Monitor**: each PBS destination row exposes Download / Upload / Delete for the keyfile plus a Yes/No + passphrase + contextual Apply toggle for the escrow. When the installed keyfile does not match the backup's manifest, View contents / Download / Restore now show a structured amber panel with the required fingerprint so the operator knows which keyfile to import.
---
## 🌐 Network Flow diagram
- New live topology view on the **Network** tab: NICs → host → bridges → LXCs / VMs.
- Animated rx / tx pulses on every internal link — immediate answer to *"which guest is pulling / pushing right now"* without cross-referencing multiple panels.
- Tree layout designed to read cleanly on mobile devices.
---
## 🎨 Redesigned cards across Overview / VM & LXC / Storage / Network
- Layouts reworked for faster reading and denser, more practical information.
- Key numbers surface at a glance, grouped by relevance.
- Responsive grid behaves cleanly from a phone up to an ultrawide.
- **Physical Disks** and **Physical Interfaces** cards on Storage and Network get the largest visual change — clearer per-item presentation.
---
## 🔔 Richer notifications out of the box
For users who do **not** use an AI enhancement agent, the plain-templated body now carries more useful content:
- Titles and reasons name the affected object (`Storage 'Tuxis' unavailable` instead of `1 Proxmox storage(s) unavailable`, `Network connectivity lost — vmbr0`, `3 health checks degraded — Storage (Tuxis), Network (vmbr0), CPU`).
- Long lists surface the top offenders with an `…and N more` tail so nothing is silently dropped.
- Recovery notifications preserve the same identity used in the alert.
- Users with AI enrichment keep getting their tailored rewrite on top of this improved base.
---
## 🩺 Health Monitor Thresholds redesigned
- The **Settings → Health Monitor Thresholds** panel that controls per-category Warning and Critical levels (CPU, memory, temperature, storage, disks, …) was reworked with clearer visual grouping and inline hints.
- Tuning a threshold now takes a couple of clicks instead of scrolling through a wall of numbers.
---
## 🛠 Notable fixes
- **USB-NVMe / USB-SATA SMART on `removable=0` enclosures** — enclosures reporting `removable=0` (ASMedia, JMicron, Realtek, ASM105x) now walk sysfs to detect USB attachment, so `-d snt*` pass-through is tried and the drive's real model, serial, temperature, power-on hours and health surface. Temperature history sampler picks up the same fix.
- **PBS encryption prompt reworked** to a single explicit *Encrypt this backup?* Yes/No — nothing is uploaded to PBS unless the answer is Yes. Only when a keyfile is not yet installed does a second dialog ask whether to generate a new one or import an existing one. Cancelling never leaves a phantom keyfile behind.
- **Attached scheduled backups now inherit retention on every run** — jobs attached to a PVE vzdump parent re-read the parent's `prune-backups` config at each run and rewrite `KEEP_*` accordingly. Previously frozen to the value at job creation time.
- **Installer no longer auto-relaunches `menu` after an update** — the `exec MENU_SCRIPT` at the tail of the update path triggered *"line: syntax"* errors when bash tried to read the just-rewritten `/usr/local/bin/menu` under its feet. Flow now exits cleanly; operator types `menu` when ready. `change_release_channel` in Settings unaffected.
- **PBS restore listing broken on Proxmox 9 / jq 1.7** — `hb_pbs_list_snapshots` switched from the prefix form `and not (...)` (rejected by jq 1.7) to the postfix form `and ((...) | not)` (accepted by both jq 1.6 and 1.7). Silent stderr redirect removed so future parse errors surface.
- **`run_scheduled_backup.sh` no longer crashes when `LANGUAGE` is unset** — cron / systemd invocations now load language + initialize the translation cache before sourcing utility functions that require it.
- **Local archive restore prompts no longer freeze silently** — `hb_prompt_restore_source_dir` and `hb_prompt_local_archive` use the fd-9 TTY handoff already applied elsewhere.
- **Terminal modal auto-focuses xterm** so `dialog --yesno` inside CLI scripts receives arrow keys instead of the Close button.
- **NVIDIA VFIO passthrough writes back `vfio_passthrough` in `components_status.json`** — `switch_gpu_mode.sh`, `switch_gpu_mode_direct.sh` and `add_gpu_vm.sh` update component status when they flip the driver posture. Post-restore auto-reinstall no longer kicks the NVIDIA installer on hosts intentionally left in VFIO mode.
- **Secure Gateway update notifications no longer trail a bare `— v`** — when only sidecar packages need updating (Tailscale itself unchanged), the title now reads `secure-gateway update available — v<current> (packages only)` and the body shows a single line "Tailscale: v… (unchanged — only sidecar packages need updating)" instead of the confusing `v → v` arrow.
- **AI model auto-migration for deprecated aliases** — users with `claude-3-5-haiku-latest`, `claude-3-5-sonnet-latest` or `claude-3-opus-latest` (all 404 upstream now) are silently migrated to the current recommendation (`claude-haiku-4-5`, etc.) within 24 h of upgrade, with an `ai_model_migrated` notification explaining what happened.
- **NVIDIA installer no longer locked to the recommended branch** (#248) — `filter_option_c_branch` used to require an EXACT major match against the kernel-recommended branch, so kernel 7.0.14 users only saw 580.x drivers even when specific 580.x builds failed to compile on the newer PVE 9.1 toolchain. Filter now accepts branch ≥ recommended, so newer stable branches (590 / 595 / 600) are selectable in-menu when they compile. `MIN_DRIVER_VERSION` still gates the floor.
- **PBS keyfile auto-detection in the Monitor** — the *Upload PBS keyfile* modal (per-destination row) and the encrypted-backup keyfile-required panel (View contents / Download / Restore) now query `/etc/pve/priv/storage/<NAME>.enc` for the selected PBS repository and, when a match is found, offer a one-click *Use this key* import — the same convenience the shell TUI already provided.
- **Upload PBS keyfile — clearer placeholder** — the *Absolute path on this host* input placeholder was showing the ProxMenux canonical destination path (`/usr/local/share/proxmenux/pbs-key.conf`), which reads as "reuse the file already there". Replaced with a source-path example (`e.g. /etc/pve/priv/storage/<NAME>.enc or /root/my-pbs-key`).
- **Assorted minor** — PVE webhook URL follows the active SSL state; disk observations recorded before the SMART gate; Login screen no longer swallows a 401 forever after a brief stale-token state; toggles visible on light theme.
---
## 🤖 AI providers refresh
`AppImage/config/verified_ai_models.json` refreshed with functional verification against all five supported providers (`_updated: 2026-07-14`):
| Provider | Removed (deprecated / 404) | Added / kept | Recommended |
|-------------|-----------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------|-----------------------------------|
| groq | `llama-3.1-70b-versatile`, `llama3-70b/8b-8192`, `mixtral-8x7b`, `gemma2-9b-it` | `llama-3.3-70b-versatile`, `llama-3.1-8b-instant`, `llama-4-scout`, `openai/gpt-oss-20b`, `openai/gpt-oss-120b` | `llama-3.3-70b-versatile` |
| gemini | `gemini-2.0-flash*`, `gemini-1.5-flash`, `gemini-1.0-pro` | `gemini-flash-lite-latest`, `gemini-2.5-flash-lite/flash`, `gemini-3-flash-preview`, `gemini-3.1/3.5-flash-lite/flash` | `gemini-2.5-flash-lite` |
| openai | `gpt-5.4-nano`, `gpt-5.4-mini` (HTTP 400) | `gpt-4.1-nano/mini`, `gpt-4o-mini`, `gpt-4.1`, `gpt-4o`, `gpt-5-chat-latest`, `gpt-5-nano` | `gpt-4.1-nano` |
| anthropic | `claude-3-5-haiku-latest`, `claude-3-5-sonnet-latest`, `claude-3-opus-latest` (404 upstream) | `claude-haiku-4-5`, `claude-sonnet-5`, `claude-opus-4-8`, `claude-sonnet-4-6`, `claude-opus-4-6`, `claude-fable-5` | `claude-haiku-4-5` |
| openrouter | `claude-3.5-*`, `gemini-flash-1.5`, `mistral-7b`, `mixtral-8x7b` | `llama-4-scout`, `claude-haiku-4.5`, `claude-sonnet-4.6`, `gemini-2.5-flash/lite`, `mistral-small-3.2-24b` | `meta-llama/llama-3.3-70b-instruct` |
Auto-migration is built-in: `PollingCollector._check_ai_model_availability()` runs every 24 h and moves users whose configured model was removed to the recommended replacement, with an `ai_model_migrated` notification explaining what happened.
---
## ⬆ Upgrading from v1.2.2
- ProxMenux notifies stable users automatically on the next `menu` launch.
- Monitor service restarts in-place — **no host reboot is needed** for the upgrade itself.
- Users on the v1.2.2.x beta channel: the same `menu` flow detects the switch to stable and offers to move the install off the beta installer.
- Health Monitor settings, dismissed alerts and per-category suppression durations are preserved verbatim.
- AI configurations pointing at now-deprecated models (`claude-3-5-*-latest`, some `gemini-2.0-*`, retired Groq / OpenRouter IDs) are auto-migrated to the recommended replacement within 24 h of the first Monitor poll after the upgrade, with an explanatory notification sent through every enabled channel.
---
## 🙏 Acknowledgments
Special thanks to the community members who shaped this release with concrete designs, field reports and testing:
- **[@JF_Car](https://github.com/JF_Car)** — proposed the tree layout for the new Network Flow diagram so it reads correctly on mobile devices.
- **[@ghosthvj](https://github.com/ghosthvj)** — contributed the design for the new **Physical Disks** and **Physical Interfaces** cards.
- **[@riglesias](https://github.com/riglesias)**, **[@princo56](https://github.com/princo56)** and **[@jonatanc](https://github.com/jonatanc)** — tested the beta cycle end-to-end and provided the suggestions that closed most of the operator-visible gaps.
And to every user who opened an issue, commented in [GitHub Discussions](https://github.com/MacRimi/ProxMenux/discussions), reported a bug on the community channel, or told us what worked and what didn't on their hardware — most internal fixes in this release started as one of those reports. Keep them coming.
---
## 2026-06-02
### New version ProxMenux v1.2.2 — *Stable consolidation of the v1.2.1.x cycle*

BIN
images/ProxMenux_backup.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 337 KiB

View File

@@ -388,7 +388,7 @@ select_language() {
# Show installation confirmation for new installations
show_installation_confirmation() {
if whiptail --title "ProxMenux Installation" \
--yesno "ProxMenux will install:\n\n• dialog (interactive menus) - Official Debian package\n• curl (file downloads) - Official Debian package\n• jq (JSON processing) - Official Debian package\n• ProxMenux core files (/usr/local/share/proxmenux)\n• ProxMenux Monitor (Web dashboard on port 8008)\n• Pre-built translation files (English, Spanish, French, German, Italian, Portuguese)\n\nProceed with installation?" 20 70; then
--yesno "ProxMenux will install:\n\n• dialog (interactive menus) - Official Debian package\n• curl (file downloads) - Official Debian package\n• jq (JSON processing) - Official Debian package\n• ProxMenux core files (/usr/local/share/proxmenux)\n• ProxMenux Monitor (Web dashboard on port 8008)\n• Pre-built translation files\n\nProceed with installation?" 20 70; then
return 0
else
return 1

View File

@@ -822,10 +822,19 @@ filter_option_c_branch() {
return 0
fi
# Accept the target branch AND any newer branch (major ≥ target).
# Historical behaviour was an exact-major match, which locked kernel
# 7.x users to 580.x only. When a 580.x build happens to fail to
# compile on a very recent kernel + toolchain combo (reproduced on
# kernel 7.0.14-4-pve — see issue #248), the operator had no
# in-menu escape. `MIN_DRIVER_VERSION` from get_kernel_compatibility_info
# still gates the floor, so this only opens the ceiling: newer stable
# branches like 590 / 595 / 600 that satisfy the min version become
# selectable, while ancient branches remain filtered out.
while IFS= read -r ver; do
[[ -z "$ver" ]] && continue
local ver_major="${ver%%.*}"
if [[ "$ver_major" == "$target_branch" ]]; then
if (( 10#$ver_major >= 10#$target_branch )); then
printf '%s\n' "$ver"
fi
done <<< "$versions_in"

View File

@@ -97,7 +97,7 @@ export default async function InstallationPage({ params }: { params: Promise<{ l
<p className="mb-4 text-gray-800 leading-relaxed">{t.rich("during.outro", { code, strong })}</p>
<Image
src="https://macrimi.github.io/ProxMenux/install/install.png"
src="/install/install.png"
alt={t("during.imageAlt")}
width={900}
height={500}

View File

@@ -1,7 +1,7 @@
{
"meta": {
"title": "Installing ProxMenux | ProxMenux Documentation",
"description": "One-line installer for ProxMenux on Proxmox VE 8+ hosts. Choose between the Translation flavour (multi-language) or Normal (lightweight English-only). Beta channel also available for early access to new features.",
"description": "One-line installer for ProxMenux on Proxmox VE 8+ hosts. Ships pre-generated translation files for six languages (English, Spanish, French, German, Italian, Portuguese) — the language is picked once during installation. Beta channel also available for early access to new features.",
"ogTitle": "Installing ProxMenux | ProxMenux Documentation",
"ogDescription": "Install ProxMenux on Proxmox VE 8+ in one command. Stable and beta channels available."
},
@@ -85,7 +85,7 @@
"requirements": {
"heading": "Requirements & good practices",
"reqTitle": "Requirements",
"reqBody": "Proxmox VE <strong>8.x or later</strong>. PVE 7 and earlier are not supported. Internet access from the host (the installer downloads scripts, dependencies and — on the Translation install — Python packages from PyPI). Run as <strong>root</strong> on the Proxmox host.",
"reqBody": "Proxmox VE <strong>8.x or later</strong>. PVE 7 and earlier are not supported. Internet access from the host (the installer downloads scripts, dependencies and the ProxMenux Monitor AppImage). Run as <strong>root</strong> on the Proxmox host.",
"inspectTitle": "Always inspect scripts you run from the internet",
"inspectReview": "<sourcelink>Review the installer source</sourcelink> before running.",
"inspectCoc": "All executable links follow the <coclink>ProxMenux Code of Conduct</coclink>."

View File

@@ -1,7 +1,7 @@
{
"meta": {
"title": "Instalar ProxMenux | ProxMenux Documentation",
"description": "Instalador de una línea para ProxMenux en hosts Proxmox VE 8+. Elige entre el sabor con traducción (multi-idioma) o normal (ligero, solo inglés). Canal beta también disponible para acceso temprano a nuevas funciones.",
"description": "Instalador de una línea para ProxMenux en hosts Proxmox VE 8+. Incluye ficheros de traducción pre-generados para seis idiomas (inglés, español, francés, alemán, italiano, portugués) — el idioma se elige una vez durante la instalación. Canal beta también disponible para acceso temprano a nuevas funciones.",
"ogTitle": "Instalar ProxMenux | ProxMenux Documentation",
"ogDescription": "Instala ProxMenux en Proxmox VE 8+ con un comando. Canales estable y beta disponibles."
},
@@ -85,7 +85,7 @@
"requirements": {
"heading": "Requisitos y buenas prácticas",
"reqTitle": "Requisitos",
"reqBody": "Proxmox VE <strong>8.x o posterior</strong>. PVE 7 y anteriores no están soportados. Acceso a internet desde el host (el instalador descarga scripts, dependencias y — en la instalación con traducción — paquetes de Python desde PyPI). Ejecuta como <strong>root</strong> en el host Proxmox.",
"reqBody": "Proxmox VE <strong>8.x o posterior</strong>. PVE 7 y anteriores no están soportados. Acceso a internet desde el host (el instalador descarga scripts, dependencias y la AppImage de ProxMenux Monitor). Ejecuta como <strong>root</strong> en el host Proxmox.",
"inspectTitle": "Revisa siempre los scripts que ejecutas desde internet",
"inspectReview": "<sourcelink>Revisa la fuente del instalador</sourcelink> antes de ejecutarlo.",
"inspectCoc": "Todos los enlaces ejecutables siguen el <coclink>código de conducta de ProxMenux</coclink>."

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 65 KiB