refine post-install and hardware GPU docs, Monitor UX and CLI styling

- rewrite the 15 post-install pages and the 3 hardware GPU pages so they reflect the current scripts (reversibility, tracked-tool counts, kernel parameters, per-tool commands, Alpine LXC propagation flow)
- migrate the legacy step-badge helper on post-install/optional and create-vm/synology to the canonical pill component, with the stepLabel key added in each locale
- fix rich-text i18n calls missing helpers across network, automated, optional, security, customization and the post-install landing pages, and escape the `<iface>` placeholder in automated so intl no longer parses it as a tag
- remove the mouse-follow blue overlay from the docs landing layout
- reposition the App-tab Edit button and stack the Search and Register controls vertically on mobile
- move the Bulk update Configure/Edit control into the section header so it behaves the same on desktop and mobile
- show a spinner during the final autoremove/autoclean pass of update-pve-safe so the cleanup step reads as active instead of silent
- restyle the shell spinner and msg_info in a distinctive purple and drop the unused msg_lang duplicate
- add a web-docs i18n build script and its CI workflow, plus tests for the pushover notification channel
This commit is contained in:
MacRimi
2026-08-26 17:23:09 +02:00
parent b71dd65898
commit fcfe8da765
106 changed files with 3376 additions and 1358 deletions
+59 -16
View File
@@ -1,10 +1,11 @@
# Contributing translations
The ProxMenux documentation site is built with Next.js (App Router) and
serves every page under two URLs:
serves every published page under locale-prefixed URLs:
- `/en/<path>` — English, the source of truth
- `/es/<path>` — Spanish, in progress
- `/es/<path>` — Spanish
- `/sk/<path>` — Slovak, with English fallback where needed
We use [`next-intl`](https://next-intl.dev) for the i18n plumbing. Anyone
can translate the docs without writing TypeScript: most of the work is
@@ -20,8 +21,8 @@ filling in a JSON file. This guide explains the workflow end to end.
Out of the box you get:
- Routing under `app/[locale]/...` — every page already renders at both
`/en/...` and `/es/...`.
- Routing under `app/[locale]/...` — every page renders for every locale
enabled in `i18n/routing.ts`.
- Locale-aware navigation via `@/i18n/navigation` (`<Link>`, `useRouter`,
`usePathname`). Use these instead of `next/link` for internal hrefs so
the active `[locale]` prefix is preserved.
@@ -50,11 +51,13 @@ web/
│ │ └── docs/
│ │ └── monitor/
│ │ └── index.json # page-specific strings for /docs/monitor
── es/
── es/
│ ├── common.json
│ └── docs/
│ └── monitor/
│ └── index.json
│ └── sk/
│ └── ...
└── app/[locale]/
└── docs/
└── monitor/
@@ -81,7 +84,7 @@ web/
Browse `app/[locale]/docs/` and find a page that:
- Has no entry yet under `messages/es/<same-path>/` (Spanish), **and**
- Has no entry yet under `messages/<locale>/<same-path>/`, **and**
- Is not already mid-translation by someone else (check open PRs).
If you're translating to a new locale, start with the smallest pages so
@@ -175,6 +178,45 @@ also had to refactor the `.tsx` (case B) or only added JSON (case A).
---
## Automated baseline and incremental updates
The `Build web documentation translations` GitHub Action can create a
machine-translated baseline and fill newly added English keys later. It uses
`.github/scripts/build_web_docs_i18n.py` and supports a locale list, a file or
directory scope, a per-locale file limit and a dry run.
The builder is resumable and writes each completed JSON file atomically. By
default it preserves every non-empty translated value, including wording
reviewed by native speakers. It also protects rich-text tags, placeholders,
URLs, paths, commands, variables and official product names before sending a
string to the translation provider. `--refresh` deliberately overwrites the
selected scope and should only be used when those translations are going to be
reviewed again.
Run a coverage report without contacting a translation service:
```bash
python .github/scripts/build_web_docs_i18n.py \
--languages de,fr,it,pt,sk,sv \
--section docs \
--check
```
Translate a small resumable batch locally:
```bash
python .github/scripts/build_web_docs_i18n.py \
--languages de \
--section docs/monitor \
--max-files 5
```
Machine translation is a starting point, not the final authority. Native
contributors can edit the generated JSON normally; later incremental runs
will keep their non-empty wording unchanged.
---
## Workflow: convert a page from hard-coded English to i18n (case B)
This is the more involved path. Use the pilot
@@ -268,7 +310,12 @@ registers a renderer for them.
If you want to add a language that isn't in the project yet:
1. Add the locale code to `routing.ts`:
1. Create `messages/<locale>/common.json` and the page catalogs. The automated
builder can provide the initial baseline.
2. Review the shared navigation and a representative set of documentation
pages with a native speaker.
3. Add the locale code to `routing.ts` only when the locale is ready to be
exposed publicly:
```ts
export const routing = defineRouting({
locales: ["en", "es", "fr"], // add your code here
@@ -276,12 +323,9 @@ If you want to add a language that isn't in the project yet:
localePrefix: "always",
})
```
2. Create the `messages/<locale>/` folder.
3. Copy `messages/en/common.json` over and translate it. **This is
mandatory** — without it the navbar and footer fall back to English
on every page.
4. Start translating individual pages one PR at a time.
5. Mention in your first PR that you're seeding the locale so reviewers
4. Add its human-readable label to the language switcher.
5. Continue reviewing individual pages one PR at a time.
6. Mention in your first PR that you're seeding the locale so reviewers
know to expect a follow-up batch.
---
@@ -305,9 +349,8 @@ Three common causes:
### What about translations of the Monitor (the AppImage), not just the docs?
This guide only covers the **public documentation site** in `web/`.
The Monitor's dashboard UI in `AppImage/` is a separate project and
not currently i18n-enabled. Translating the Monitor would require a
parallel effort.
The Monitor dashboard uses the separate catalogs under
`AppImage/messages/` and its own translation workflow.
### Where can I see what's missing?
@@ -51,13 +51,13 @@ function ImageWithCaption({ src, alt, caption }: { src: string; alt: string; cap
)
}
function StepNumber({ number }: { number: number }) {
function StepHeading({ number, label, title, id }: { number: number; label: string; title: string; id?: string }) {
return (
<div
className="inline-flex items-center justify-center w-8 h-8 mr-3 text-white bg-blue-500 rounded-full"
aria-hidden="true"
>
<span className="text-sm font-bold">{number}</span>
<div className="flex items-center gap-3 mb-4" id={id}>
<span className="inline-flex items-center rounded-full border border-blue-200 bg-blue-50 px-2.5 py-0.5 text-xs font-semibold text-blue-800">
{label} {number}
</span>
<h2 className="text-xl font-semibold m-0">{title}</h2>
</div>
)
}
@@ -271,10 +271,7 @@ export default function Page() {
const media = step.loaders[activeLoader] || []
return (
<section key={step.id} className="mb-12 border-b pb-8">
<h2 className="text-xl font-semibold mb-4 flex items-center" id={step.id}>
<StepNumber number={stepIdx + 1} />
{step.title}
</h2>
<StepHeading number={stepIdx + 1} label={t("stepLabel")} title={step.title} id={step.id} />
<p className="mb-4">{step.intro}</p>
<div className="mt-6">
@@ -169,18 +169,11 @@ export default async function GpuVmPassthroughPage({
├─ Not in SR-IOV
├─ Not D3cold (AMD)
├─ Has FLR or equivalent reset
├─ Not on the block-list (Intel Arc, Apollo Lake)
├─ Warn if single-GPU host
└─ Resolve IOMMU group
Audio companion
├─ Has .1 sibling? (dGPU: NVIDIA/AMD HDMI)
│ → auto-include (never used by host)
└─ No .1 sibling? (Intel iGPU, split audio)
→ checklist of host audio controllers,
default = none (user opts in)
User selects VM
@@ -190,14 +183,24 @@ export default async function GpuVmPassthroughPage({
GPU already assigned elsewhere?
├─ To LXC → offer to remove it from LXC
├─ To other VM → offer to remove it there
│ + clean up orphan audio
│ (skips audio whose
display sibling stays)
├─ To LXC → menu: keep + disable onboot
│ OR remove GPU lines + keep onboot
├─ To other VM (running) → abort
├─ To other VM (stopped) → menu: keep + disable onboot
OR remove GPU lines + keep onboot
│ (fast-path: already vfio-pci → no
│ host reconfig, no reboot needed)
└─ Free → continue
Audio companion
├─ Has .1 sibling? (dGPU: NVIDIA/AMD HDMI)
│ → auto-include (never used by host)
└─ No .1 sibling? (Intel iGPU, split audio)
→ checklist of host audio controllers,
default = none (user opts in)
Show confirmation summary
(GPU + IOMMU siblings + audio + target VM)
@@ -209,12 +212,17 @@ export default async function GpuVmPassthroughPage({
Host:
├─ /etc/modules (vfio_*)
├─ /etc/modprobe.d/vfio.conf (ids=...)
├─ /etc/modprobe.d/blacklist.conf
├─ /etc/modprobe.d/vfio.conf (ids=... disable_vga=1)
├─ /etc/modprobe.d/blacklist.conf (vendor drivers only)
├─ kernel cmdline (IOMMU if missing)
├─ NVIDIA: disable udev rule + hard blacklist
├─ AMD: dump ROM → /usr/share/kvm/*.bin
├─ NVIDIA: per-BDF udev rule at
│ 10-proxmenux-vfio-bind.rules
│ + BDF state at vfio-bind.bdfs
│ (blacklist nvidia only when
│ every NVIDIA GPU is in VFIO)
├─ AMD: dump ROM → vbios_<vendor>_<device>.bin
└─ update-initramfs -u -k all
+ proxmox-boot-tool refresh
VM config (qm set <vmid>):
├─ hostpci0 = GPU (x-vga=1 unless Intel iGPU)
@@ -336,7 +344,7 @@ export default async function GpuVmPassthroughPage({
code={`# Example — what ends up in the VM config after a GPU + audio passthrough
# (you don't type this, ProxMenux does it for you)
hostpci0: 0000:01:00.0,pcie=1,x-vga=1[,romfile=vbios_card.bin] # GPU video
hostpci0: 0000:01:00.0,pcie=1,x-vga=1[,romfile=vbios_1002_15dd.bin] # GPU video (AMD ROM file named vbios_<vendor>_<device>.bin)
hostpci1: 0000:01:00.1,pcie=1 # GPU audio
vga: std
@@ -455,9 +463,9 @@ qm set <vmid> --delete hostpci0
# Release the GPU back to the host driver:
rm -f /etc/modprobe.d/vfio.conf
rm -f /etc/modprobe.d/blacklist.conf # careful — this file may have other blacklists
# NVIDIA only — re-enable the udev rule + unpin the hard blacklist
# NVIDIA only — re-enable the udev rule + drop the all-NVIDIA-in-VFIO blacklist (if present)
mv /etc/udev/rules.d/70-nvidia.rules.proxmenux-disabled /etc/udev/rules.d/70-nvidia.rules 2>/dev/null
rm -f /etc/modprobe.d/nvidia-blacklist.conf
rm -f /etc/modprobe.d/proxmenux-nvidia-vfio-blacklist.conf
update-initramfs -u -k all
reboot`}
@@ -22,7 +22,6 @@ export async function generateMetadata({
}
}
type MatrixRow = { kernel: string; pve: string; minCode: string; minTail: string }
type StringItem = string
type RelatedItem = { label: string; href: string; tail?: string }
@@ -38,7 +37,6 @@ export default async function NvidiaHostPage({
const messages = (await getMessages({ locale })) as unknown as {
docs: { hardware: { nvidiaHost: {
walkthrough: {
version: { rows: MatrixRow[] }
prepare: { items: StringItem[] }
}
reinstallUninstall: { uninstallItems: StringItem[] }
@@ -46,7 +44,6 @@ export default async function NvidiaHostPage({
related: { items: RelatedItem[] }
} } }
}
const matrixRows = messages.docs.hardware.nvidiaHost.walkthrough.version.rows
const prepareItems = messages.docs.hardware.nvidiaHost.walkthrough.prepare.items
const uninstallItems = messages.docs.hardware.nvidiaHost.reinstallUninstall.uninstallItems
const kindsItems = messages.docs.hardware.nvidiaHost.updates.kindsItems
@@ -255,29 +252,6 @@ export default async function NvidiaHostPage({
<p className="mb-3 text-gray-800">{t.rich("walkthrough.version.body1", { strong, em })}</p>
<p className="mb-3 text-gray-800">{t("walkthrough.version.body2")}</p>
<div className="my-4 overflow-x-auto">
<table className="min-w-full border border-gray-200 text-sm">
<thead className="bg-gray-100">
<tr>
<th className="border border-gray-200 px-3 py-2 text-left text-gray-900">{t("walkthrough.version.headerKernel")}</th>
<th className="border border-gray-200 px-3 py-2 text-left text-gray-900">{t("walkthrough.version.headerPve")}</th>
<th className="border border-gray-200 px-3 py-2 text-left text-gray-900">{t("walkthrough.version.headerMin")}</th>
</tr>
</thead>
<tbody className="text-gray-800">
{matrixRows.map((row, idx) => (
<tr key={idx}>
<td className="border border-gray-200 px-3 py-2">{row.kernel}</td>
<td className="border border-gray-200 px-3 py-2">{row.pve}</td>
<td className="border border-gray-200 px-3 py-2">
<code>{row.minCode}</code>{row.minTail}
</td>
</tr>
))}
</tbody>
</table>
</div>
<Callout variant="tip" title={t("walkthrough.version.whyTitle")}>
{t("walkthrough.version.whyBody")}
</Callout>
@@ -170,7 +170,8 @@ export default async function SwitchGpuModePage({
Validations
├─ SR-IOV VF / active PF? → block
├─ Target = VM and blocked ID? → block
└─ IOMMU parameter present? → warn if missing
└─ IOMMU parameter present? → auto-add to boot
cmdline if missing
Find affected workloads
@@ -122,6 +122,9 @@ export default async function UpdatesTabPage({
</tbody>
</table>
</div>
<Callout variant="tip">
{t.rich("mechanisms.officialReference", { helper: linkHelper })}
</Callout>
<Callout variant="warning">{t.rich("mechanisms.callout", { strong, em, code })}</Callout>
<h2 className="mt-10 mb-4 text-2xl font-semibold text-gray-900">{t("docker.heading")}</h2>
@@ -24,6 +24,7 @@ export async function generateMetadata({
"proxmox discord",
"proxmox email alerts",
"proxmox gotify",
"proxmox pushover",
"proxmox apprise",
"proxmox ntfy",
"proxmox matrix notifications",
@@ -72,6 +73,7 @@ export default async function NotificationsPage({
discord: { items: string[] }
gotify: { items: string[] }
email: { gmailItems: string[]; outlookItems: string[] }
pushover: { steps: string[] }
apprise: { listItems: string[]; steps: string[] }
rich: { togglesItems: string[] }
quiet: { purposeItems: string[]; howItems: string[] }
@@ -101,6 +103,7 @@ export default async function NotificationsPage({
const gotifyItems = n.gotify.items
const gmailItems = n.email.gmailItems
const outlookItems = n.email.outlookItems
const pushoverSteps = n.pushover.steps
const appriseListItems = n.apprise.listItems
const appriseSteps = n.apprise.steps
const togglesItems = n.rich.togglesItems
@@ -152,7 +155,7 @@ export default async function NotificationsPage({
title={t("header.title")}
description={t("header.description")}
section={t("header.section")}
estimatedMinutes={18}
estimatedMinutes={20}
/>
<Callout variant="info" title={t("intro.title")}>
@@ -392,6 +395,34 @@ export default async function NotificationsPage({
{t("email.relayBody")}
</Callout>
<h3 id="pushover" className="text-xl font-semibold mt-8 mb-3 text-gray-900">{t("pushover.heading")}</h3>
<p className="mb-4 text-gray-800 leading-relaxed">
{t.rich("pushover.intro", { a: ext("https://pushover.net/api") })}
</p>
<h4 className="text-base font-semibold mt-6 mb-2 text-gray-900">{t("pushover.stepsTitle")}</h4>
<ol className="list-decimal pl-6 mb-4 text-gray-800 leading-relaxed space-y-1">
{pushoverSteps.map((_, idx) => (
<li key={idx}>
{t.rich(`pushover.steps.${idx}`, {
em,
code,
a: ext(idx === 2 ? "https://pushover.net/apps/build" : "https://pushover.net/"),
})}
</li>
))}
</ol>
<Callout variant="info" title={t("pushover.priorityTitle")}>
{t.rich("pushover.priorityBody", { strong })}
</Callout>
<Callout variant="warning" title={t("pushover.secretTitle")}>
{t("pushover.secretBody")}
</Callout>
<h3 id="apprise" className="text-xl font-semibold mt-8 mb-3 text-gray-900">{t("apprise.heading")}</h3>
<p className="mb-4 text-gray-800 leading-relaxed">{t("apprise.intro")}</p>
@@ -402,7 +433,7 @@ export default async function NotificationsPage({
{appriseListItems.map((_, idx) => (
<li key={idx}>
{t.rich(`apprise.listItems.${idx}`, {
a: idx === 0 ? ext("https://github.com/caronc/apprise/wiki") : ext("https://github.com/caronc/apprise/wiki/URLBasics"),
a: idx === 0 ? ext("https://appriseit.com/services/") : ext("https://github.com/caronc/apprise/wiki/URLBasics"),
})}
</li>
))}
@@ -412,7 +443,7 @@ export default async function NotificationsPage({
<ol className="list-decimal pl-6 mb-4 text-gray-800 leading-relaxed space-y-1">
{appriseSteps.map((_, idx) => (
<li key={idx}>{t.rich(`apprise.steps.${idx}`, { em, code, a: ext("https://github.com/caronc/apprise/wiki") })}</li>
<li key={idx}>{t.rich(`apprise.steps.${idx}`, { em, code, a: ext("https://appriseit.com/services/") })}</li>
))}
</ol>
@@ -120,7 +120,7 @@ export default async function AutomatedPage({
<td className="px-4 py-2 text-gray-500 font-mono">{i + 1}</td>
<td className="px-4 py-2 font-semibold">{o.tool}</td>
<td className="px-4 py-2 text-gray-700 leading-relaxed">
{t.rich(`optimizations.${i}.what`, { link: log2ramLink })}
{t.rich(`optimizations.${i}.what`, { link: log2ramLink, code: (chunks) => <code>{chunks}</code>, strong: (chunks) => <strong>{chunks}</strong>, em: (chunks) => <em>{chunks}</em> })}
</td>
<td className="px-4 py-2">
<Link
@@ -66,6 +66,7 @@ export default async function PostInstallBasicSettingsPage({
<DocHeader
title={t("header.title")}
section={t("header.section")}
estimatedMinutes={10}
/>
<Callout variant="info" title={t("intro.title")}>
@@ -229,8 +230,7 @@ Acquire::Languages "none";`}
<CopyableCode
code={`# Remove a utility you no longer want
apt purge htop
apt autoremove --purge`}
apt purge htop`}
className="my-4"
/>
@@ -48,6 +48,7 @@ export default async function PostInstallCustomizationPage({
title={t("header.title")}
description={t("header.description")}
section={t("header.section")}
estimatedMinutes={7}
/>
<Callout variant="info" title={t("intro.title")}>
@@ -142,7 +143,7 @@ cat /etc/motd
/>
<Callout variant="tip" title={t("verify.reversibleTitle")}>
{t.rich("verify.reversibleBody", { code, link: uninstallLink })}
{t.rich("verify.reversibleBody", { code, strong, link: uninstallLink })}
</Callout>
<h2 className="text-2xl font-semibold mt-10 mb-4 text-gray-900">{t("related.heading")}</h2>
@@ -58,6 +58,7 @@ export default async function PostInstallMonitoringPage({
title={t("header.title")}
description={t("header.description")}
section={t("header.section")}
estimatedMinutes={6}
/>
<Callout variant="info" title={t("intro.title")}>
@@ -110,10 +111,6 @@ journalctl -u ovh-rtm --since "10 min ago"`}
<h3 className="text-lg font-semibold mt-6 mb-2 text-gray-900">{t("ovh.troubleTitle")}</h3>
<Callout variant="tip" title={t("ovh.spuriousTitle")}>
{t.rich("ovh.spuriousBody", { em, code })}
</Callout>
<Callout variant="tip" title={t("ovh.revertTitle")}>
{t.rich("ovh.revertBody", { code })}
</Callout>
@@ -50,6 +50,7 @@ export default async function PostInstallNetworkPage({
<DocHeader
title={t("header.title")}
section={t("header.section")}
estimatedMinutes={8}
/>
<Callout variant="info" title={t("intro.title")}>
@@ -116,7 +117,7 @@ export default async function PostInstallNetworkPage({
</Callout>
<Callout variant="warning" title={t("ovs.revertTitle")}>
{t("ovs.revertBody")}
{t.rich("ovs.revertBody", { code, em, link: uninstallLink })}
</Callout>
<CopyableCode
@@ -158,8 +159,8 @@ sysctl net.ipv4.tcp_fastopen`}
{t("bbr.impactBody")}
</Callout>
<Callout variant="warning" title={t("bbr.revertTitle")}>
{t("bbr.revertBody")}
<Callout variant="tip" title={t("bbr.revertTitle")}>
{t.rich("bbr.revertBody", { code, link: uninstallLink })}
</Callout>
<CopyableCode
@@ -38,10 +38,13 @@ export async function generateMetadata({
type Logo = { name: string; alt: string; src: string }
function StepNumber({ number }: { number: number }) {
function StepHeading({ number, label, title }: { number: number; label: string; title: string }) {
return (
<div className="inline-flex items-center justify-center w-8 h-8 mr-3 text-white bg-blue-500 rounded-full">
<span className="text-sm font-bold">{number}</span>
<div className="flex items-center gap-3 mt-16 mb-4">
<span className="inline-flex items-center rounded-full border border-blue-200 bg-blue-50 px-2.5 py-0.5 text-xs font-semibold text-blue-800">
{label} {number}
</span>
<h3 className="text-xl font-semibold m-0">{title}</h3>
</div>
)
}
@@ -60,7 +63,7 @@ export default async function OptionalSettingsPage({
ceph: { doesItems: string[] }
amd: { doesItems: string[] }
ha: { doesItems: string[] }
testing: { doesItems: string[] }
pveam: { doesItems: string[] }
fastfetch: { doesItems: string[]; customItems: string[]; logos: Logo[] }
figurine: { doesItems: string[] }
log2ram: { doesItems: string[] }
@@ -69,7 +72,7 @@ export default async function OptionalSettingsPage({
const cephItems = messages.docs.postInstall.optional.ceph.doesItems
const amdItems = messages.docs.postInstall.optional.amd.doesItems
const haItems = messages.docs.postInstall.optional.ha.doesItems
const testingItems = messages.docs.postInstall.optional.testing.doesItems
const pveamItems = messages.docs.postInstall.optional.pveam.doesItems
const fastfetchItems = messages.docs.postInstall.optional.fastfetch.doesItems
const fastfetchCustomItems = messages.docs.postInstall.optional.fastfetch.customItems
const fastfetchLogos = messages.docs.postInstall.optional.fastfetch.logos
@@ -91,10 +94,7 @@ export default async function OptionalSettingsPage({
</p>
<h2 className="text-2xl font-semibold mt-8 mb-4">{t("available")}</h2>
<h3 className="text-xl font-semibold mt-16 mb-4 flex items-center">
<StepNumber number={1} />
{t("ceph.title")}
</h3>
<StepHeading number={1} label={t("stepLabel")} title={t("ceph.title")} />
<p className="mb-4">{t("ceph.intro")}</p>
<p className="mb-4">{t("ceph.doesIntro")}</p>
<ul className="list-disc pl-5 mb-4">
@@ -106,8 +106,18 @@ export default async function OptionalSettingsPage({
<p className="text-lg mb-2">{t("ceph.automates")}</p>
<CopyableCode
code={`
# Add Ceph repository
echo "deb https://download.proxmox.com/debian/ceph-squid $(lsb_release -cs) no-subscription" > /etc/apt/sources.list.d/ceph-squid.list
# On Proxmox VE 9 (Debian trixie) — deb822 format
cat > /etc/apt/sources.list.d/ceph.sources <<'EOF'
Types: deb
URIs: http://download.proxmox.com/debian/ceph-squid
Suites: trixie
Components: no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
EOF
# On Proxmox VE 8 (Debian bookworm) — legacy one-liner
# echo "deb https://download.proxmox.com/debian/ceph-squid $(lsb_release -cs) no-subscription" \\
# > /etc/apt/sources.list.d/ceph-squid.list
# Update package lists
apt-get update
@@ -120,10 +130,7 @@ pveceph status
`}
/>
<h3 className="text-xl font-semibold mt-16 mb-4 flex items-center">
<StepNumber number={2} />
{t("amd.title")}
</h3>
<StepHeading number={2} label={t("stepLabel")} title={t("amd.title")} />
<p className="mb-4">{t("amd.intro")}</p>
<p className="mb-4">{t("amd.doesIntro")}</p>
<ul className="list-disc pl-5 mb-4">
@@ -135,23 +142,21 @@ pveceph status
<p className="text-lg mb-2">{t("amd.automates")}</p>
<CopyableCode
code={`
# Set kernel parameter
# Set kernel parameter — GRUB path
sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="/GRUB_CMDLINE_LINUX_DEFAULT="idle=nomwait /g' /etc/default/grub
update-grub
# Set kernel parameter — systemd-boot path (ZFS-on-root)
# Adds 'idle=nomwait' to /etc/kernel/cmdline and runs:
# proxmox-boot-tool refresh
# Configure KVM
echo "options kvm ignore_msrs=Y" >> /etc/modprobe.d/kvm.conf
echo "options kvm report_ignored_msrs=N" >> /etc/modprobe.d/kvm.conf
# Install latest Proxmox VE kernel
apt-get install pve-kernel-$(uname -r | cut -d'-' -f1-2)
`}
/>
<h3 className="text-xl font-semibold mt-16 mb-4 flex items-center">
<StepNumber number={3} />
{t("ha.title")}
</h3>
<StepHeading number={3} label={t("stepLabel")} title={t("ha.title")} />
<p className="mb-4">{t("ha.intro")}</p>
<p className="mb-4">{t("ha.doesIntro")}</p>
<ul className="list-disc pl-5 mb-4">
@@ -167,39 +172,23 @@ systemctl enable --now pve-ha-lrm pve-ha-crm corosync
`}
/>
<h3 className="text-xl font-semibold mt-16 mb-4 flex items-center">
<StepNumber number={4} />
{t("testing.title")}
</h3>
<p className="mb-4">{t("testing.intro")}</p>
<p className="mb-4">{t("testing.doesIntro")}</p>
<StepHeading number={4} label={t("stepLabel")} title={t("pveam.title")} />
<p className="mb-4">{t.rich("pveam.intro", { code })}</p>
<p className="mb-4">{t("pveam.doesIntro")}</p>
<ul className="list-disc pl-5 mb-4">
{testingItems.map((_, idx) => (
<li key={idx}>{t(`testing.doesItems.${idx}`)}</li>
{pveamItems.map((_, idx) => (
<li key={idx}>{t.rich(`pveam.doesItems.${idx}`, { code })}</li>
))}
</ul>
<p className="mb-4">{t("testing.howUse")}</p>
<p className="text-lg mb-2">{t("testing.manualIntro")}</p>
<p className="mb-4">{t("pveam.howUse")}</p>
<p className="text-lg mb-2">{t("pveam.automates")}</p>
<CopyableCode
code={`
# Add Proxmox testing repository
echo "deb http://download.proxmox.com/debian/pve $(lsb_release -cs) pvetest" | sudo tee /etc/apt/sources.list.d/pve-testing-repo.list
# Update package lists
sudo apt update
pveam update
`}
/>
<p className="mt-4 text-sm text-gray-600">
<strong>{t("testing.noteLabel")}</strong> {t("testing.noteBody")}
</p>
<p className="mt-4 text-yellow-600">
<strong>{t("testing.warnLabel")}</strong> {t("testing.warnBody")}
</p>
<h3 className="text-xl font-semibold mt-16 mb-4 flex items-center">
<StepNumber number={5} />
{t("fastfetch.title")}
</h3>
<StepHeading number={5} label={t("stepLabel")} title={t("fastfetch.title")} />
<p className="mb-4">{t("fastfetch.intro")}</p>
@@ -255,24 +244,39 @@ systemctl enable --now pve-ha-lrm pve-ha-crm corosync
<p className="text-lg mb-2">{t("fastfetch.automates")}</p>
<CopyableCode
code={`
# Download and install the latest version of Fastfetch
FASTFETCH_URL=$(curl -s https://api.github.com/repos/fastfetch-cli/fastfetch/releases/latest | grep "browser_download_url.*fastfetch-linux-amd64.deb" | cut -d '"' -f 4)
# Remove any previous install so the newest .deb lands clean
apt-get remove --purge -y fastfetch 2>/dev/null
rm -f /usr/bin/fastfetch /usr/local/bin/fastfetch
# Download and install the latest .deb via the GitHub Releases API
FASTFETCH_URL=$(curl -sSf --connect-timeout 5 --max-time 15 \\
https://api.github.com/repos/fastfetch-cli/fastfetch/releases/latest \\
| jq -r '.assets[] | select(.name | test("fastfetch-linux-amd64.deb")) | .browser_download_url')
wget -q -O /tmp/fastfetch.deb "$FASTFETCH_URL"
dpkg -i /tmp/fastfetch.deb
apt-get install -f -y
# Configure Fastfetch (logo selection remains interactive)
# The configuration is done through a series of jq commands
# The configuration is done through a series of jq commands.
# A custom "System optimised by ProxMenux" line is prepended
# to the modules array so it shows above the standard sections.
# Set Fastfetch to run at login
echo "clear && fastfetch" >> ~/.bashrc
# Wire Fastfetch into ~/.bashrc — inside a marker block so the
# same block can be replaced on re-run without polluting the file.
# The block is guarded so it only runs on interactive shells that
# actually have the fastfetch binary available.
cat >> ~/.bashrc <<'EOF'
# BEGIN FASTFETCH
if [[ $- == *i* ]] && command -v fastfetch >/dev/null 2>&1; then
clear
fastfetch
fi
# END FASTFETCH
EOF
`}
/>
<h3 className="text-xl font-semibold mt-16 mb-4 flex items-center">
<StepNumber number={6} />
{t("figurine.title")}
</h3>
<StepHeading number={6} label={t("stepLabel")} title={t("figurine.title")} />
<p className="mb-4">{t("figurine.intro")}</p>
@@ -330,10 +334,7 @@ chmod +x "/etc/profile.d/figurine.sh"
<p className="mt-4">{t("figurine.outro")}</p>
<h3 className="text-xl font-semibold mt-16 mb-4 flex items-center">
<StepNumber number={7} />
{t("log2ram.title")}
</h3>
<StepHeading number={7} label={t("stepLabel")} title={t("log2ram.title")} />
<p className="mb-4">
{t.rich("log2ram.intro", { code, em })}
+1 -1
View File
@@ -163,7 +163,7 @@ export default async function PostInstallPage({
/>
<h2 className="text-2xl font-semibold mt-10 mb-4 text-gray-900">{t("threeWays.heading")}</h2>
<p className="mb-6 text-gray-800 leading-relaxed">{t("threeWays.body")}</p>
<p className="mb-6 text-gray-800 leading-relaxed">{t.rich("threeWays.body", { em: (chunks) => <em>{chunks}</em> })}</p>
<div className="grid gap-4 md:grid-cols-2 lg:grid-cols-4 mb-8 not-prose">
{ROUTE_CONFIG.map(({ key, href, Icon, accent, iconBg }, idx) => {
@@ -52,6 +52,7 @@ export default async function PostInstallPerformancePage({
title={t("header.title")}
description={t("header.description")}
section={t("header.section")}
estimatedMinutes={5}
/>
<Callout variant="info" title={t("intro.title")}>
@@ -77,6 +78,10 @@ export default async function PostInstallPerformancePage({
sed -i "s/#pigz:.*/pigz: 1/" /etc/vzdump.conf
apt-get -y install pigz
# The wrapper pins PATH so gzip resolves inside the script even under sudo,
# and sets GZIP="-1" — fastest compression level, lowest ratio. The trade
# is intentional: on multi-core hosts wall-clock time drops far more than
# the archive grows.
cat > /bin/pigzwrapper <<'EOF'
#!/bin/sh
PATH=/bin:$PATH
@@ -95,8 +100,8 @@ chmod +x /bin/pigzwrapper
{t.rich("pigz.replacesBody", { code })}
</Callout>
<Callout variant="danger" title={t("pigz.revertTitle")}>
{t.rich("pigz.revertBody", { strong })}
<Callout variant="tip" title={t("pigz.revertTitle")}>
{t.rich("pigz.revertBody", { strong, link: (chunks) => <Link href="/docs/post-install/uninstall" className="text-blue-600 hover:underline">{chunks}</Link>, code: (chunks) => <code>{chunks}</code> })}
</Callout>
<CopyableCode
@@ -47,6 +47,7 @@ export default async function PostInstallSecurityPage({
<DocHeader
title={t("header.title")}
section={t("header.section")}
estimatedMinutes={5}
/>
<Callout variant="info" title={t("intro.title")}>
@@ -72,9 +73,8 @@ export default async function PostInstallSecurityPage({
<h3 className="text-lg font-semibold mt-6 mb-2 text-gray-900">{t("rpcbind.runsTitle")}</h3>
<CopyableCode
code={`# Stop and disable the rpcbind service
systemctl stop rpcbind
systemctl disable rpcbind`}
code={`# Stop and disable both activation paths
systemctl disable --now rpcbind.socket rpcbind.service`}
className="my-4"
/>
<p className="mb-4 text-gray-800 leading-relaxed">{t("rpcbind.runsOutro")}</p>
@@ -84,14 +84,14 @@ systemctl disable rpcbind`}
{t.rich("rpcbind.verifyBody", { code })}
</p>
<CopyableCode
code={`systemctl is-active rpcbind # should report: inactive
systemctl is-enabled rpcbind # should report: disabled
code={`systemctl is-active rpcbind.service rpcbind.socket
systemctl is-enabled rpcbind.service rpcbind.socket
ss -tulpn | grep ':111 ' # should return nothing`}
className="my-4"
/>
<Callout variant="tip" title={t("rpcbind.reversibleTitle")}>
{t.rich("rpcbind.reversibleBody", { em, link: uninstallLink })}
<Callout variant="warning" title={t("rpcbind.reversibleTitle")}>
{t.rich("rpcbind.reversibleBody", { em, strong, code, link: uninstallLink })}
</Callout>
<h2 className="text-2xl font-semibold mt-10 mb-4 text-gray-900">{t("related.heading")}</h2>
@@ -61,6 +61,7 @@ export default async function PostInstallStoragePage({
<DocHeader
title={t("header.title")}
section={t("header.section")}
estimatedMinutes={12}
/>
<Callout variant="info" title={t("intro.title")}>
@@ -75,8 +76,8 @@ export default async function PostInstallStoragePage({
})}
</Callout>
<Callout variant="warning" title={t("notTrackedTitle")}>
{t.rich("notTrackedBody", { strong })}
<Callout variant="tip" title={t("trackedTitle")}>
{t.rich("trackedBody", { strong, link: (chunks) => <Link href="/docs/post-install/uninstall" className="text-blue-600 hover:underline">{chunks}</Link>, code: (chunks) => <code>{chunks}</code> })}
</Callout>
<h2 className="text-2xl font-semibold mt-10 mb-4 text-gray-900">{t("arc.heading")}</h2>
@@ -286,8 +287,8 @@ ionice: 5 # Lower I/O priority (5 = best-effort class, lowest priority in
className="my-4"
/>
<Callout variant="warning" title={t("vzdump.noBackupTitle")}>
{t.rich("vzdump.noBackupBody", { strong, code, em })}
<Callout variant="tip" title={t("vzdump.backupTitle")}>
{t.rich("vzdump.backupBody", { strong, code })}
</Callout>
<Callout variant="tip" title={t("vzdump.skipTitle")}>
@@ -55,6 +55,7 @@ export default async function PostInstallSystemPage({
<DocHeader
title={t("header.title")}
section={t("header.section")}
estimatedMinutes={10}
/>
<Callout variant="info" title={t("intro.title")}>
@@ -89,7 +90,9 @@ export default async function PostInstallSystemPage({
daily
su root adm
rotate 7
create
create 0640 root adm
missingok
notifempty
compress
size 10M
delaycompress
@@ -141,9 +144,10 @@ include /etc/logrotate.d`}
vm.swappiness = 10 # Avoid swapping unless truly necessary
vm.dirty_ratio = 15 # Start writeback sooner (default 20)
vm.dirty_background_ratio = 5 # Start async writeback earlier (default 10)
vm.overcommit_memory = 1 # Allow overcommit (needed by many applications)
vm.max_map_count = 262144 # Enough for modern apps (ES, Docker, some games)
vm.compaction_proactiveness = 20 # Only on kernels that support it`}
vm.compaction_proactiveness = 20 # Only on kernels that support it
# Note: the kernel's memory-overcommit policy (vm.overcommit_memory) is
# NOT modified — Proxmox's default is left in place.`}
className="my-4"
/>
@@ -60,6 +60,7 @@ export default async function UninstallOptimizationsPage({
title={t("header.title")}
description={t("header.description")}
section={t("header.section")}
estimatedMinutes={8}
/>
<Callout variant="info" title={t("intro.title")}>
@@ -151,6 +151,10 @@ export default async function PostInstallUpdatesPage({
))}
</Steps>
<Callout variant="warning" title={t("applying.jqTitle")}>
{t.rich("applying.jqBody", { code })}
</Callout>
<h2 className="text-2xl font-semibold mt-10 mb-4 text-gray-900">{t("differs.heading")}</h2>
<div className="overflow-x-auto mb-6">
@@ -61,6 +61,7 @@ export default async function PostInstallVirtualizationPage({
<DocHeader
title={t("header.title")}
section={t("header.section")}
estimatedMinutes={9}
/>
<Callout variant="info" title={t("intro.title")}>
@@ -146,6 +147,10 @@ pcie_acs_override=downstream,multifunction`}
className="my-4"
/>
<Callout variant="warning" title={t("vfio.acsTitle")}>
{t.rich("vfio.acsBody", { code, strong })}
</Callout>
<p className="mb-3 text-gray-800 leading-relaxed">
{t.rich("vfio.modulesIntro", { code })}
</p>
-2
View File
@@ -1,6 +1,5 @@
import { Suspense } from "react"
import Navbar from "@/components/navbar"
import MouseMoveEffect from "@/components/mouse-move-effect"
import { PagefindHighlighter } from "@/components/pagefind-highlighter"
import { LocaleHtmlSync } from "@/components/locale-html-sync"
import type React from "react"
@@ -175,7 +174,6 @@ export default async function LocaleLayout({
}}
/>
<Navbar />
<MouseMoveEffect />
<div className="pt-16 md:pt-16">{children}</div>
<script src="/pagefind/pagefind-highlight.js" type="module" defer />
<Suspense fallback={null}>
-29
View File
@@ -1,29 +0,0 @@
"use client"
import { useEffect, useState } from "react"
export default function MouseMoveEffect() {
const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 })
useEffect(() => {
const handleMouseMove = (event: MouseEvent) => {
setMousePosition({ x: event.clientX, y: event.clientY })
}
window.addEventListener("mousemove", handleMouseMove)
return () => {
window.removeEventListener("mousemove", handleMouseMove)
}
}, [])
return (
<div
className="pointer-events-none fixed inset-0 z-30 transition-opacity duration-300"
style={{
background: `radial-gradient(600px at ${mousePosition.x}px ${mousePosition.y}px, rgba(29, 78, 216, 0.15), transparent 80%)`,
}}
/>
)
}
@@ -1,5 +1,6 @@
{
"title": "Synology VM Creator Script",
"stepLabel": "Step",
"intro": {
"heading": "Introduction",
"intro": "ProxMenux provides an automated script that creates and configures a virtual machine (VM) to install Synology DSM (DiskStation Manager) on Proxmox VE. This script simplifies the process by downloading and adding one of the available loaders to the VM boot, giving you the option between four different choices:",
@@ -45,7 +45,7 @@
"heading": "Walking through the flow",
"detect": {
"title": "Detect GPUs and check IOMMU",
"body": "The script lists every GPU it finds. If IOMMU isn't already enabled in the running kernel cmdline, you'll get a yes/no prompt to append <code>intel_iommu=on</code> (or <code>amd_iommu=on</code>) + <code>iommu=pt</code> to the right boot file — <code>/etc/kernel/cmdline</code> on ZFS (systemd-boot) or <code>/etc/default/grub</code> on LVM/ext4. If you accept and the kernel cmdline changes, the script flags that the reboot prompt at the end will be required.",
"body": "The script lists every GPU it finds. If IOMMU isn't already enabled in the running kernel cmdline, you'll get a yes/no prompt to append <code>intel_iommu=on</code> (or <code>amd_iommu=on</code>) + <code>iommu=pt</code> to the right boot file. Selection is based on the bootloader: <code>/etc/kernel/cmdline</code> when the host boots via systemd-boot (detected by the presence of <code>root=ZFS=</code> in that file, the default on ProxmoxVE-installed ZFS-on-root systems), otherwise <code>/etc/default/grub</code>. If you accept and the kernel cmdline changes, the script flags that a reboot will be needed at the end.",
"tipTitle": "Already ran post-install?",
"tipBody": "If you previously enabled <postLink>VFIO IOMMU support</postLink> from the post-install scripts, IOMMU is already on and this step silently passes. Good.",
"imageAlt": "List of detected GPUs with vendor and PCI address"
@@ -74,8 +74,8 @@
"intro": "The script scans every VM config and every LXC config on the host looking for the GPU you picked. Three possible outcomes:",
"items": [
"<strong>GPU is free.</strong> Nothing to do, continue.",
"<strong>GPU is in a different VM.</strong> You're offered to remove it from that other VM before assigning it here. If you decline, the script aborts — two VMs can't share an exclusive VFIO assignment.",
"<strong>GPU is in an LXC (shared mode).</strong> You're offered to remove the LXC passthrough configuration (<code>lxc.cgroup2.devices.allow</code> + <code>lxc.mount.entry</code> lines). The LXC won't see the GPU anymore, but the VM will — this is the \"switch mode\" mechanic that gives this menu entry its secondary label."
"<strong>GPU is in a different VM.</strong> If the source VM is currently running, the script aborts — two VMs can't share an exclusive VFIO assignment, and the source VM has to be stopped first. If the source VM is stopped, you get two options: <em>Keep GPU in the source VM's config but disable Start on boot</em>, or <em>Remove the GPU lines from the source VM's config and keep Start on boot</em>. A fast-path also exists: if the GPU is already bound to <code>vfio-pci</code> and the source VM is a plain VM→VM swap, no host reconfiguration is done and no reboot is needed.",
"<strong>GPU is in an LXC (shared mode).</strong> You get two options on a menu: <em>Keep GPU in the LXC config but disable Start on boot</em>, or <em>Remove the GPU lines from the LXC config (<code>lxc.cgroup2.devices.allow</code> / <code>lxc.mount.entry</code>) and keep Start on boot</em>. Either way the LXC won't see the GPU after the switch, and the VM will — this is the \"switch mode\" mechanic that gives this menu entry its secondary label."
],
"imageAlt": "Dialog offering to remove the GPU from an LXC before assigning it to the VM",
"smartTitle": "Audio siblings are cleaned up smartly too",
@@ -100,10 +100,10 @@
"<code>/etc/modules</code> — adds <code>vfio</code>, <code>vfio_iommu_type1</code>, <code>vfio_pci</code> (plus <code>vfio_virqfd</code> on kernels &lt; 6.2).",
"<code>/etc/modprobe.d/vfio.conf</code> — for AMD / Intel, sets <code>options vfio-pci ids=&lt;vendor:device,...&gt; disable_vga=1</code> so VFIO claims the GPU early at boot. For NVIDIA the file only adds <code>softdep nvidia pre: vfio-pci</code> (plus <code>_drm</code>/<code>_modeset</code>/<code>_uvm</code>) — actual binding is per-BDF via the udev rule below. On AMD, also adds <code>softdep</code> lines forcing <code>vfio-pci</code> to load before <code>radeon</code> / <code>amdgpu</code>.",
"<code>/etc/modprobe.d/iommu_unsafe_interrupts.conf</code> and <code>kvm.conf</code> — sensible workarounds that most Windows / macOS VMs need (<code>allow_unsafe_interrupts=1</code>, <code>ignore_msrs=1</code>).",
"<code>/etc/modprobe.d/blacklist.conf</code> — blacklists the open-source companion drivers (<code>nouveau</code>, <code>amdgpu</code>, <code>radeon</code>, <code>i915</code>) that would otherwise grab the GPU before VFIO. The proprietary <code>nvidia</code> module is <strong>never blacklisted</strong> — it stays available for any OTHER NVIDIA GPU you keep on the host.",
"<code>/etc/modprobe.d/blacklist.conf</code> — blacklists only the open-source drivers for the selected vendor (<code>nouveau</code>/<code>lbm-nouveau</code> for NVIDIA; <code>radeon</code>+<code>amdgpu</code> for AMD; <code>i915</code> for Intel), so drivers for other vendors on the same host stay loaded. The proprietary <code>nvidia</code> module is <strong>only</strong> blacklisted (via a separate <code>/etc/modprobe.d/proxmenux-nvidia-vfio-blacklist.conf</code>) once <em>every</em> NVIDIA GPU on the host has been switched to VFIO — until that point it stays loaded so any NVIDIA card you keep on the host keeps working.",
"<code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> + <code>/etc/proxmenux/vfio-bind.bdfs</code> — <strong>NVIDIA only</strong>. Per-BDF binding state. The udev rule applies <code>ATTR'{'driver_override'}'=\"vfio-pci\"</code> at the PCI ADD event for each tracked Bus:Device.Function, so only the GPU(s) you've explicitly passed go to VFIO. This is what makes multi-GPU NVIDIA work — your other NVIDIA cards keep their <code>nvidia</code> driver and stay usable on the host.",
"<strong>AMD only.</strong> Dumps the GPU ROM from sysfs (<code>/sys/bus/pci/.../rom</code>) or the ACPI VFCT table to <code>/usr/share/kvm/vbios_&lt;card&gt;.bin</code>. The VM references it via <code>romfile=</code> so cards that misreport their own VBIOS still initialise correctly.",
"<strong>NVIDIA only.</strong> Stops and disables host NVIDIA services that could probe / lock the GPU at boot (<code>nvidia-persistenced</code>, <code>nvidia-powerd</code>, <code>nvidia-fabricmanager</code>). The <code>nvidia</code> module itself is left loaded so other NVIDIA GPUs on the host keep working with <code>nvidia-smi</code>.",
"<strong>NVIDIA only.</strong> Host NVIDIA services (<code>nvidia-persistenced</code>, <code>nvidia-powerd</code>, <code>nvidia-fabricmanager</code>) are stopped and disabled only when every NVIDIA GPU is assigned to VFIO. With a mixed host they remain active, together with the <code>nvidia</code> module, for the GPU(s) that stay native.",
"<code>update-initramfs -u -k all</code> — only runs if any of the above actually changed."
]
},
+24 -54
View File
@@ -1,16 +1,16 @@
{
"meta": {
"title": "Install NVIDIA Drivers on the Host | ProxMenux Documentation",
"description": "Install and configure NVIDIA proprietary drivers on a Proxmox VE host using ProxMenux. Covers kernel compatibility, VFIO setup, persistence service, optional NVENC patch and automatic LXC propagation."
"description": "Install and configure NVIDIA proprietary drivers on a Proxmox VE host using ProxMenux. Covers GPU support filtering, DKMS validation, persistence service, optional NVENC patch and automatic LXC propagation."
},
"header": {
"title": "Install NVIDIA Drivers on the Host",
"description": "Install the NVIDIA proprietary driver on a Proxmox VE host using ProxMenux. The installer handles kernel compatibility, nouveau blacklisting, VFIO configuration, persistence service and can propagate the driver to any LXC container that already has NVIDIA passthrough configured.",
"description": "Install the NVIDIA proprietary driver on a Proxmox VE host using ProxMenux. The installer filters maintained branches by GPU PCI ID, validates the selected release through DKMS, manages nouveau, installs the persistence service and can propagate the driver to LXC containers with NVIDIA passthrough.",
"section": "Hardware: GPUs and Coral-TPU"
},
"intro": {
"title": "What this does",
"body": "ProxMenux automates the whole NVIDIA driver lifecycle on the host: detects your GPU, picks a driver version that is compatible with your running kernel, blacklists <code>nouveau</code>, downloads and runs the official NVIDIA <code>.run</code> installer with DKMS, installs the <code>nvidia-persistenced</code> service and udev rules, and offers to apply the optional NVENC patch. If you already have LXC containers with NVIDIA passthrough, it can update the userspace libraries inside them so their version matches the host."
"body": "ProxMenux automates the whole NVIDIA driver lifecycle on the host: detects your GPU, offers maintained NVIDIA branches that list its PCI Device ID, blacklists <code>nouveau</code>, downloads and runs the official NVIDIA <code>.run</code> installer with DKMS, installs the <code>nvidia-persistenced</code> service and udev rules, and offers to apply the optional NVENC patch. The DKMS build is the final compatibility check against the running kernel. If you already have LXC containers with NVIDIA passthrough, it can update their userspace libraries to match the host."
},
"who": {
"heading": "Who is this for?",
@@ -22,7 +22,7 @@
"gpuCheck": "lspci | grep -i nvidia",
"notVm": "The GPU <strong>is not currently assigned to a VM via VFIO passthrough</strong>. If it is, the script will refuse to install the host driver to avoid breaking the passthrough config.",
"internet": "Internet access on the host. The installer downloads the driver from <code>download.nvidia.com</code> and, optionally, clones <code>nvidia-persistenced</code> and <code>nvidia-patch</code> from GitHub.",
"space": "About <strong>2 GB of free space</strong> in <code>/opt/nvidia</code> (workdir) plus the RAM used during the install. A reboot is required at the end."
"space": "Some free space in <code>/opt/nvidia</code> for the <code>.run</code> installer plus the RAM used during the build. When propagating to LXCs on non-Arch distros, each container needs at least 1.5 GB free; ProxMenux temporarily raises container RAM to 2 GB and restores it after. A reboot is required at the end of the host install."
},
"vmWarn": {
"title": "GPU assigned to a VM? Stop here",
@@ -46,40 +46,11 @@
},
"version": {
"title": "Choose the driver version",
"body1": "ProxMenux fetches the list of available drivers from NVIDIA and <strong>filters out versions that are not compatible with your running kernel</strong>. The <em>Latest available</em> option is almost always the right pick.",
"body2": "The compatibility matrix the script uses:",
"headerKernel": "Kernel",
"headerPve": "Typical PVE version",
"headerMin": "Minimum NVIDIA driver",
"rows": [
{
"kernel": "6.17+",
"pve": "Proxmox VE 9.x",
"minCode": "580.82.07",
"minTail": " or newer"
},
{
"kernel": "6.8 6.16",
"pve": "Proxmox VE 8.2+",
"minCode": "550.x",
"minTail": " or newer"
},
{
"kernel": "6.2 6.7",
"pve": "Proxmox VE 8.0 8.1",
"minCode": "535.x",
"minTail": " or newer"
},
{
"kernel": "5.15+",
"pve": "Proxmox VE 7.x (legacy)",
"minCode": "470.x",
"minTail": " or newer"
}
],
"whyTitle": "Why kernel matters",
"whyBody": "Kernel 6.17 introduced internal API changes that break older NVIDIA drivers. If you install a driver below the minimum for your kernel, DKMS will fail to build the module and the GPU will not be available after reboot. ProxMenux filters the list so you can't pick an incompatible version by accident.",
"imageAlt": "Driver version selector with kernel-compatible versions, Latest available on top"
"body1": "ProxMenux fetches the list of available drivers from NVIDIA and narrows the picker to versions that <strong>list your GPU's PCI Device ID in the supported chips table</strong> of the corresponding branch on <code>nvidia.com</code>. Additional heuristics discard developer / beta CDN drops that would otherwise appear at the top. The first entry is labelled <em>&lt;version&gt; — Recommended</em>: it prefers the head of the branch of the driver already installed on the host (bugfix in place), otherwise the head of the current Production Branch, otherwise the highest supported numeric.",
"body2": "If the currently installed driver was patched via keylase (NVENC), the picker auto-narrows to versions still covered by the patch table, so applying <em>Reinstall / update</em> without losing the patch is one click.",
"whyTitle": "How kernel compatibility is validated",
"whyBody": "The version list is filtered by NVIDIA branch maintenance and GPU PCI support, not by a hard-coded kernel/driver matrix. After selection, DKMS builds the module against the running kernel. A failed build stops the installation from being treated as valid; choose another maintained branch if NVIDIA has not adapted that release to your kernel.",
"imageAlt": "Driver version selector with GPU-supported NVIDIA branches and the Recommended entry on top"
},
"uninstall": {
"title": "Clean uninstall (only if reinstalling)",
@@ -90,8 +61,8 @@
"body": "Behind a single confirmation, the script:",
"items": [
"Installs <code>pve-headers-$(uname -r)</code> (or <code>proxmox-headers-$(uname -r)</code>), <code>build-essential</code> and <code>dkms</code>.",
"Creates <code>/etc/modprobe.d/nouveau-blacklist.conf</code> blacklisting <code>nouveau</code>, and tries to unload it immediately.",
"Writes <code>/etc/modules-load.d/nvidia-vfio.conf</code> with <code>vfio</code>, <code>vfio_pci</code>, <code>nvidia</code>, <code>nvidia_uvm</code> and related modules."
"Creates the ProxMenux-owned <code>/etc/modprobe.d/proxmenux-nouveau-blacklist.conf</code> with <code>blacklist nouveau</code> and <code>options nouveau modeset=0</code>, records whether it added the companion line to <code>blacklist.conf</code>, and tries to unload the module immediately.",
"Writes <code>/etc/modules-load.d/nvidia-vfio.conf</code> with <code>nvidia</code> and <code>nvidia_uvm</code> so the modules load early at boot."
]
},
"download": {
@@ -112,7 +83,7 @@
"propagate": {
"title": "Optional: propagate the driver to LXC containers",
"body1": "If the overview screen listed containers with NVIDIA passthrough, ProxMenux now offers to update the userspace libraries inside each one to match the host. Host kernel module and container userspace <strong>must be the exact same version</strong> — otherwise <code>nvidia-smi</code> inside the container will fail with a \"version mismatch\" error.",
"body2": "The update is distro-aware: <code>apk</code> for Alpine, <code>pacman</code> for Arch, and the same <code>.run</code> installer (with <code>--no-kernel-modules --no-dkms --no-install-compat32-libs</code>) for Debian/Ubuntu and other distros. It temporarily raises container RAM to 2 GB if lower, runs the install, then restores the original RAM setting.",
"body2": "The update is distro-aware. For Debian / Ubuntu and other glibc distros, the same <code>.run</code> installer (with <code>--no-kernel-modules --no-dkms --no-install-compat32-libs</code>) is pushed into the container and executed; container RAM is temporarily raised to 2 GB if lower and restored after. For <strong>Arch, Manjaro and EndeavourOS</strong> the update is a <code>pacman -Syu nvidia-utils</code> pinned to the host's driver branch. <strong>Alpine</strong> uses a different path — the <code>.run</code> is extracted on the host, only the userspace libraries are packaged as a tarball and pushed with <code>pct push</code>, then <code>gcompat</code> + <code>binutils</code> shims are installed via <code>apk</code> and SONAME symlinks are recreated with <code>readelf</code> so the glibc-linked libraries load correctly on musl.",
"imageAlt": "Prompt listing LXCs with NVIDIA passthrough and current driver version, with Yes/No to update them all"
},
"reboot": {
@@ -122,33 +93,32 @@
},
"reinstallUninstall": {
"heading": "Reinstall or uninstall",
"intro": "When the installer detects that a NVIDIA driver is already loaded (<code>nvidia-smi</code> returns a version), it doesn't silently re-install on top. Instead it shows an action menu so you can choose what to do.",
"intro": "When the installer detects that the <code>nvidia</code> kernel module is currently loaded and <code>nvidia-smi</code> returns a version, it doesn't silently re-install on top. Instead it shows an action menu so you can choose what to do. (Binaries present on disk but the module not loaded do not count as installed — the module has to be live.)",
"imageAlt": "NVIDIA action menu offered when a driver is already installed — two choices: Reinstall / update driver, or Uninstall the NVIDIA driver completely",
"imageCaption": "The action menu only appears when an NVIDIA driver is currently active on the host.",
"reinstallHeading": "Reinstall / update",
"reinstallBody": "Continues with the normal install flow but, before downloading anything, runs a clean removal of the current driver (apt purge + DKMS entries dropped + leftover modules unloaded). This is the safe path to apply a newer driver version, switch branches when the kernel demands it, or recover from a half-broken state. The LXC propagation and NVENC patch prompts re-run at the end.",
"reinstallBody": "Continues with the normal install flow but, before downloading anything, runs a clean removal of the current driver (apt purge + DKMS entries dropped + leftover modules unloaded). This is the safe path to apply a newer same-branch version, choose another maintained branch when needed, or recover from a half-broken state. The LXC propagation and NVENC patch prompts re-run at the end.",
"uninstallHeading": "Uninstall — what gets removed",
"uninstallIntro": "Confirms with a yes/no dialog first. Then performs a full, idempotent rollback:",
"uninstallItems": [
"Stops and disables <code>nvidia-persistenced</code>, unloads the kernel modules (<code>nvidia_uvm</code>, <code>nvidia_drm</code>, <code>nvidia_modeset</code>, <code>nvidia</code>) — any LXC container with NVIDIA passthrough will be cleanly cut off.",
"Runs <code>apt purge</code> on every NVIDIA package, removes the DKMS source tree and the <code>/opt/nvidia</code> .run installer cache.",
"Reverts the nouveau blacklist (<code>/etc/modprobe.d/nouveau-blacklist.conf</code>) and the modules-load config (<code>/etc/modules-load.d/nvidia-vfio.conf</code>) so nouveau can come back if you want generic graphics again.",
"Removes the udev rules (<code>/etc/udev/rules.d/70-nvidia.rules</code>) and the NVENC patch state file (if the keylase patch was applied earlier).",
"Rebuilds <code>initramfs</code> for all kernels and prompts for a reboot to finalise (the nouveau unblacklist only takes effect after restart)."
"Runs <code>nvidia-uninstall --silent</code> first (the counterpart to the <code>.run</code> installer), then stops and disables <code>nvidia-persistenced</code> and <code>nvidia-powerd</code>, and unloads the kernel modules (<code>nvidia_uvm</code>, <code>nvidia_drm</code>, <code>nvidia_modeset</code>, <code>nvidia</code>) — any LXC container with NVIDIA passthrough will be cleanly cut off.",
"Runs <code>apt purge</code> on <code>nvidia-*</code>, <code>libnvidia-*</code>, <code>cuda-*</code> and <code>libcudnn*</code>, removes the DKMS source tree and the <code>/opt/nvidia</code> .run installer cache.",
"Removes the modules-load config (<code>/etc/modules-load.d/nvidia-vfio.conf</code>) and the nouveau blacklist entries owned by ProxMenux. Legacy two-line ProxMenux blacklist files are migrated and removed too; modified or unrelated administrator files are preserved.",
"Removes the udev rules (<code>/etc/udev/rules.d/70-nvidia.rules</code>) and clears the NVENC patch state (a field in the ProxMenux managed-installs registry, set to <em>removed</em> — no separate file to delete).",
"Rebuilds <code>initramfs</code> for all kernels, runs <code>proxmox-boot-tool refresh</code> on systemd-boot hosts, and prompts for a reboot to finalise."
],
"lxcWarnTitle": "LXC containers with NVIDIA passthrough",
"lxcWarnBody": "Removing the host driver invalidates the device paths and CUDA libraries mapped into any LXC with NVIDIA passthrough. Plan the operation during a maintenance window if Frigate / Plex / Jellyfin / Ollama (or anything else) depends on it."
},
"updates": {
"heading": "Update notifications",
"body": "The installed NVIDIA driver is tracked in ProxMenux's managed-installs registry. On startup and every 24h the Monitor checks the upstream listing at <code>download.nvidia.com/XFree86/Linux-x86_64/</code> against the version <code>nvidia-smi</code> reports, and fires a notification when a newer compatible version is available.",
"kindsHeading": "Two kinds of update message",
"body": "The installed NVIDIA driver is tracked in ProxMenux's managed-installs registry. On startup and every 24h the Monitor checks the upstream listing at <code>download.nvidia.com/XFree86/Linux-x86_64/</code> against the version <code>nvidia-smi</code> reports, and notifies only when a newer maintenance release exists in the installed branch.",
"kindsHeading": "Update message",
"kindsItems": [
"<strong>Same-branch patch.</strong> A newer maintenance release in your current driver branch (e.g. installed 580.65.06 → available 580.105.08). Bug fixes and security patches without changing branch.",
"<strong>Branch upgrade required by kernel.</strong> If the host is on a kernel that no longer supports your current branch (e.g. you upgraded the host kernel to 6.17 while still on driver 570.x), the message says so explicitly and recommends the kernel's minimum compatible branch — same matrix the installer uses to filter the version menu."
"<strong>Same-branch maintenance.</strong> A newer release in your current driver branch (e.g. installed 580.65.06 → available 580.105.08). The Monitor does not infer cross-branch kernel compatibility."
],
"antiTitle": "Anti-cascade by design",
"antiBody": "One notification per distinct upstream version, never on every 24h scan. The branch-upgrade message in particular only fires once you actually need to switch — until then the same-branch tracker stays muted.",
"antiBody": "One notification per distinct upstream version, never on every 24h scan. If no newer release exists in the installed branch, the tracker stays quiet.",
"applyTitle": "Applying the update",
"applyBody": "The Monitor doesn't auto-apply driver updates — reinstalling the NVIDIA driver always needs a reboot. Open the same installer entry described above, pick <strong>Reinstall / update</strong>, and the new version is downloaded, the DKMS module rebuilt against the running kernel, and the reboot prompted at the end."
},
@@ -161,7 +131,7 @@
"troubleshoot": {
"heading": "Troubleshooting",
"smiFailTitle": "`nvidia-smi` says 'NVIDIA-SMI has failed'",
"smiFailBody": "Almost always a <strong>nouveau</strong> still loaded or a <strong>kernel header mismatch</strong>. After reboot, run <code>lsmod | grep nouveau</code> — if it returns anything, the blacklist didn't take effect (check <code>/etc/modprobe.d/nouveau-blacklist.conf</code> exists and rebuild initramfs with <code>update-initramfs -u -k all</code>, then reboot). If nouveau is gone, check <code>dmesg | grep -i nvidia</code> — DKMS build errors usually mean your kernel headers don't match the running kernel; reinstall them with <code>apt install --reinstall pve-headers-$(uname -r)</code>.",
"smiFailBody": "Almost always a <strong>nouveau</strong> still loaded or a <strong>kernel header mismatch</strong>. After reboot, run <code>lsmod | grep nouveau</code> — if it returns anything, check <code>/etc/modprobe.d/proxmenux-nouveau-blacklist.conf</code>, rebuild initramfs with <code>update-initramfs -u -k all</code>, and reboot. If nouveau is gone, check <code>dmesg | grep -i nvidia</code> — DKMS build errors usually mean the headers do not match the running kernel.",
"lxcMissTitle": "LXC container can't see the GPU after host update",
"lxcMissBody": "The container's userspace libraries are stuck at the previous driver version. Either re-run the NVIDIA installer and accept the LXC propagation prompt, or install the same driver version manually inside the container with <code>--no-kernel-modules</code>.",
"logTitle": "Check the install log",
@@ -49,7 +49,7 @@
"prereqs": {
"title": "Before you start",
"assigned": "<strong>A GPU already assigned</strong> — either in a VM via VFIO or attached to at least one LXC. If you haven't assigned it yet, start from Add GPU to VM / LXC instead.",
"iommu": "<strong>IOMMU enabled on the host</strong> — only strictly required when switching <em>to</em> VM mode, but worth having on either way. The script warns if the kernel param is missing.",
"iommu": "<strong>IOMMU enabled on the host</strong> — only strictly required when switching <em>to</em> VM mode, but worth having on either way. If the kernel param is missing the script auto-adds <code>intel_iommu=on iommu=pt</code> or <code>amd_iommu=on</code> to the boot command line (via <code>proxmox-boot-tool refresh</code> on systemd-boot or <code>update-grub</code> on GRUB) and includes it in the reboot prompt at the end.",
"iommuCheck": "dmesg | grep -i 'IOMMU enabled' | head -1",
"reboot": "<strong>Be OK with a reboot.</strong> Switching GPU bindings at the kernel level means the host regenerates initramfs and you reboot to apply. The script prompts at the end.",
"knowList": "<strong>Know which VMs / LXCs are using the GPU.</strong> The script will find them and ask what to do with each, but it's faster if you already know the list."
@@ -110,7 +110,7 @@
},
"apply": {
"title": "Apply host + workload changes",
"body": "Once you confirm, the script writes the host-side changes — <code>vfio.conf</code>, blacklist, modules, and (for NVIDIA) the per-BDF udev rule at <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> plus the BDF state at <code>/etc/proxmenux/vfio-bind.bdfs</code>. It also applies the chosen conflict policy to each affected VM/LXC. If the host config actually changed, it runs <code>update-initramfs -u -k all</code> — otherwise it skips that step."
"body": "Once you confirm, the script writes the host-side changes — <code>vfio.conf</code>, blacklist, modules, and (for NVIDIA) the per-BDF udev rule at <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> plus the BDF state at <code>/etc/proxmenux/vfio-bind.bdfs</code>. It also applies the chosen conflict policy to each affected VM/LXC. If the host config actually changed, it runs <code>update-initramfs -u -k all</code> followed by <code>proxmox-boot-tool refresh</code>; otherwise both are skipped."
},
"reboot": {
"title": "Reboot",
+1 -1
View File
@@ -107,7 +107,7 @@
},
{
"title": "Notifications",
"description": "Telegram, Discord, Email, Gotify and Apprise (multi-channel) — with deduplication, cooldown, burst aggregation, quiet hours and a complete history.",
"description": "Telegram, Discord, Email, Gotify, Pushover and Apprise (multi-channel) — with deduplication, cooldown, burst aggregation, quiet hours and a complete history.",
"icon": "Bell",
"href": "/docs/monitor/notifications"
},
@@ -254,8 +254,8 @@
"items": [
"<strong>Watchers</strong> push events: <code>JournalWatcher</code> tails the system journal, <code>TaskWatcher</code> polls the Proxmox task list, <code>ProxmoxHookWatcher</code> reacts to backup / replication / snapshot hooks, and <code>PollingCollector</code> handles slow data sources.",
"<strong>Templates</strong> turn an event into a (title, body) pair. The same template can run through the configured AI provider (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter) to produce a plain-language rewrite; both versions are stored in <code>notification_history</code>.",
"<strong>Channels</strong> deliver messages: Telegram, Discord, Email, Gotify and Apprise (multi-channel). Each is implemented in <code>notification_channels.py</code> behind the same <code>create_channel()</code> / <code>send()</code> interface, so adding a new channel is a single class.",
"<strong>Encryption.</strong> Sensitive settings (<code>telegram.token</code>, <code>discord.webhook_url</code>, <code>ai_api_key_*</code>, <code>email.password</code>) are XOR-encrypted with the key in <code>.notification_key</code> before being written to the DB. Plaintext never touches disk."
"<strong>Channels</strong> deliver messages: Telegram, Discord, Email, Gotify, Pushover and Apprise (multi-channel). Each is implemented in <code>notification_channels.py</code> behind the same <code>create_channel()</code> / <code>send()</code> interface, so adding a new channel is a single class.",
"<strong>Encryption.</strong> Sensitive settings (<code>telegram.bot_token</code>, <code>discord.webhook_url</code>, <code>pushover.user_key</code>, <code>pushover.api_token</code>, <code>ai_api_key_*</code>, <code>email.password</code>) are encrypted with the key in <code>.notification_key</code> before being written to the DB and are masked in the interface."
],
"linksFooter": "Per-event toggles, channel overrides and AI configuration are surfaced in <notifLink>Settings → Notifications</notifLink> and <aiLink>Settings → AI Assistant</aiLink>."
},
@@ -25,6 +25,7 @@
"mechanisms": {
"heading": "How an update method is selected",
"lead": "The integrated Proxmox VE Helper-Scripts path follows the official <helper>update-apps mechanism</helper>. Other install types use the matching package, Docker or custom path.",
"officialReference": "Official reference: the <helper>Proxmox VE Helper-Scripts update-apps documentation</helper> covers interactive and unattended modes, backups, dry runs, temporary build resources, logs and exit codes.",
"colSource": "Source",
"colAction": "Displayed action",
"colNotes": "What runs",
+1 -1
View File
@@ -105,7 +105,7 @@
"body1": "Inside the dashboard, the <strong>Health Monitor</strong> runs continuously in the background and produces a structured stream of events: high CPU temperature, disk SMART warnings, ZFS pool degradation, OOM kills, VM/CT failures, security incidents, and so on. Each event has a category, a severity (INFO / WARNING / CRITICAL) and a stable <code>error_key</code> so duplicates collapse instead of flooding the screen.",
"feedsIntro": "Events feed three things at the same time:",
"feedsHealth": "The <strong>Health Monitor view</strong> in the dashboard (active + dismissed lists).",
"feedsChannels": "The <strong>notification engine</strong> — Telegram, Discord, Email, Gotify and Apprise (multi-channel). Each channel is configured independently and per-event categories can be silenced.",
"feedsChannels": "The <strong>notification engine</strong> — Telegram, Discord, Email, Gotify, Pushover and Apprise (multi-channel). Each channel is configured independently and per-event categories can be silenced.",
"feedsAI": "The optional <strong>AI assistant</strong> — when enabled, the configured provider (OpenAI, Anthropic, Gemini, Groq, Ollama or OpenRouter) explains incoming events in plain language and, if enabled in the AI settings, proposes next steps.",
"suppressionTitle": "Suppression instead of mute-all",
"suppressionBody": "Each category has its own <em>Suppression Duration</em>: once you dismiss an alert, the same alert is silenced for that window (default 24 hours, configurable per category up to permanent). Real escalations — e.g. CPU temperature crossing the critical threshold — always re-trigger regardless of suppression."
+30 -14
View File
@@ -1,15 +1,15 @@
{
"meta": {
"title": "Proxmox Notifications — Telegram, Discord, Email, Gotify, Apprise | ProxMenux Monitor",
"description": "Send Proxmox VE notifications to Telegram, Discord, Email, Gotify and ~80 extra services via Apprise. ProxMenux Monitor turns events from the Health Monitor, the journal watcher and the Proxmox VE webhook into rich messages with deduplication, cooldown, burst aggregation, an optional AI rewrite and a complete history.",
"ogTitle": "Proxmox Notifications — Telegram, Discord, Email, Gotify, Apprise",
"ogDescription": "Send Proxmox VE alerts to Telegram, Discord, Email, Gotify and ~80 extra services via Apprise — with deduplication, cooldown, burst aggregation and an optional AI rewrite.",
"title": "Proxmox Notifications — Telegram, Discord, Email, Gotify, Pushover, Apprise | ProxMenux Monitor",
"description": "Send Proxmox VE notifications to Telegram, Discord, Email, Gotify, Pushover and ~80 extra services via Apprise. ProxMenux Monitor turns events from the Health Monitor, the journal watcher and the Proxmox VE webhook into rich messages with deduplication, cooldown, burst aggregation, an optional AI rewrite and a complete history.",
"ogTitle": "Proxmox Notifications — Telegram, Discord, Email, Gotify, Pushover, Apprise",
"ogDescription": "Send Proxmox VE alerts to Telegram, Discord, Email, Gotify, Pushover and ~80 extra services via Apprise — with deduplication, cooldown, burst aggregation and an optional AI rewrite.",
"twitterTitle": "Proxmox Notifications | ProxMenux Monitor",
"twitterDescription": "Send Proxmox VE alerts to Telegram, Discord, Email, Gotify and ~80 extra services via Apprise."
"twitterDescription": "Send Proxmox VE alerts to Telegram, Discord, Email, Gotify, Pushover and ~80 extra services via Apprise."
},
"header": {
"title": "Notifications",
"description": "The fan-out engine that takes events from every collector inside the Monitor and delivers them to Telegram, Discord, Email, Gotify and ~80 extra services via Apprise — with deduplication, cooldown, burst aggregation, per-event and per-channel toggles, an optional AI rewriter, and a queryable history.",
"description": "The fan-out engine that takes events from every collector inside the Monitor and delivers them to Telegram, Discord, Email, Gotify, Pushover and ~80 extra services via Apprise — with deduplication, cooldown, burst aggregation, per-event and per-channel toggles, an optional AI rewriter, and a queryable history.",
"section": "ProxMenux Monitor"
},
"intro": {
@@ -29,7 +29,7 @@
"aiLabel": "AI rewrite (opt.)",
"aiDetail": "OpenAI / Anthropic\nGemini / Groq\nOpenRouter / Ollama\n(off by default)",
"channelsLabel": "Channels",
"channelsDetail": "Telegram\nDiscord\nEmail (SMTP)\nGotify\nApprise (~80 services)"
"channelsDetail": "Telegram\nDiscord\nEmail (SMTP)\nGotify\nPushover\nApprise (~80 services)"
}
},
"enabling": {
@@ -43,8 +43,8 @@
"Registers a Proxmox VE webhook target in <code>/etc/pve/notifications.cfg</code> pointing at <code>POST http://127.0.0.1:8008/api/notifications/webhook</code>. From this moment on, anything Proxmox VE emits on its own (HA, replication, vzdump from the GUI) flows into the same pipeline as the Monitor's own events. See <pvelink>PVE webhook integration</pvelink> below for the full mechanics.",
"Starts the dispatch background thread. The thread polls the event queue and walks every event through the pipeline diagrammed above."
],
"activeAlt": "Notifications card after enabling — Active badge, channel tabs (Telegram, Gotify, Discord, Email), Display Name field and Advanced AI Enhancement collapsible section",
"activeCaption": "Active state — channel tabs at the top (Telegram / Gotify / Discord / Email), the Display Name field, the per-channel category list, and the collapsible <em>Advanced: AI Enhancement</em> section."
"activeAlt": "Notifications card after enabling — Active badge, channel tabs, Display Name field and Advanced AI Enhancement collapsible section",
"activeCaption": "Active state — channel tabs at the top (Telegram / Gotify / Discord / Email / Pushover / Apprise), the Display Name field, the per-channel category list, and the collapsible <em>Advanced: AI Enhancement</em> section."
},
"sources": {
"heading": "Event sources",
@@ -89,9 +89,9 @@
},
"channels": {
"heading": "Channel walkthroughs",
"intro": "Five channels are currently supported: Telegram, Discord, Gotify, Email (SMTP) and Apprise. The first four are native — each one has its own tab inside the Notifications panel with a <em>+ setup guide</em> link opening an in-app modal. Apprise is a generic hub that adds ~80 additional services (ntfy, Matrix, Pushover, Slack, Teams, Pushbullet, AWS SNS, Mattermost…) through a single URL field. They are all documented step by step below.",
"intro": "Six channels are currently supported: Telegram, Discord, Gotify, Email (SMTP), Pushover and Apprise. The first five are native integrations with their own configuration fields. Apprise is a generic hub that adds around 80 additional services (ntfy, Matrix, Slack, Teams, Pushbullet, AWS SNS, Mattermost…) through a single URL field. They are all documented step by step below.",
"credsTitle": "Where credentials live",
"credsBody": "Tokens, webhook URLs and SMTP passwords are stored locally in the Monitor's SQLite database under <code>/usr/local/share/proxmenux/</code>. They never leave the host except to reach their respective services. A backup of that directory is enough to recover the configured channels."
"credsBody": "Tokens, keys, webhook URLs and SMTP passwords are stored locally in the Monitor's SQLite database under <code>/usr/local/share/proxmenux/</code>. Sensitive values are protected and masked in the interface. They never leave the host except to reach their respective services. A backup of that directory is enough to recover the configured channels."
},
"telegram": {
"heading": "Telegram",
@@ -176,12 +176,28 @@
"relayTitle": "Self-hosted SMTP relay",
"relayBody": "If you run your own SMTP relay (Postfix, msmtp, etc.) on the LAN, point the Monitor at it and skip the app-password dance entirely. The relay handles auth upstream and the Monitor sends in cleartext on a trusted network."
},
"pushover": {
"heading": "Pushover",
"intro": "Pushover is a mobile push service with official apps for iOS, Android and desktop browsers. The dedicated ProxMenux channel talks directly to the <a>Pushover API</a>, so no Apprise URL is required.",
"stepsTitle": "Setup",
"steps": [
"Create a <a>Pushover account</a>, install the official app on the devices that should receive alerts and sign in.",
"Copy the <em>User Key</em> shown on your Pushover dashboard. A group key can be used instead when several people or devices must receive the same alert.",
"Open <a>Create an Application/API Token</a>, create an application named <em>ProxMenux</em> and copy its 30-character API token.",
"In <em>Settings → Notifications → Pushover</em>, paste the user or group key and the application API token. The device and sound fields are optional.",
"Save the settings and press <em>Send test</em>. The Pushover app should receive the message immediately."
],
"priorityTitle": "Priority mapping",
"priorityBody": "Normal ProxMenux messages use Pushover priority 0. When <strong>High priority for critical alerts</strong> is enabled, CRITICAL events use priority 1 so they stand out and bypass the user's Pushover quiet hours. ProxMenux does not use emergency priority 2, which would require repeated notifications and an acknowledgement callback.",
"secretTitle": "Protect both values",
"secretBody": "The user or group key and the application API token both authorize message delivery. ProxMenux stores them as protected notification secrets and masks them in the interface; do not publish either value in screenshots or support logs."
},
"apprise": {
"heading": "Apprise (generic hub for ~80 services)",
"intro": "Apprise is an open-source notification library that speaks the protocol of around 80 different services through a single URL format. Adding it as one more channel inside the Monitor means you can deliver alerts to services that don't have a dedicated tab — ntfy, Matrix, Pushover, Slack, Microsoft Teams, Mattermost, Pushbullet, AWS SNS, Pushsafer, Rocket.Chat, Signal API and many others — without ProxMenux having to implement each integration separately.",
"listIntro": "The full list of supported services and the exact URL format for each one lives in the official Apprise wiki:",
"intro": "Apprise is an open-source notification library that speaks the protocol of around 80 different services through a single URL format. Adding it as one more channel inside the Monitor means you can deliver alerts to services that don't have a dedicated tab — ntfy, Matrix, Slack, Microsoft Teams, Mattermost, Pushbullet, AWS SNS, Pushsafer, Rocket.Chat, Signal API and many others — without ProxMenux having to implement each integration separately. Pushover can also be reached through Apprise, although its dedicated tab is simpler for a single Pushover destination.",
"listIntro": "The full list of supported services and the exact URL format for each one is available in the official Apprise documentation:",
"listItems": [
"<a>github.com/caronc/apprise/wiki</a> — full index of supported services.",
"<a>Apprise service documentation</a> — full index of supported services.",
"<a>URL basics</a> — how Apprise URLs are structured."
],
"stepsTitle": "Steps",
@@ -1,13 +1,13 @@
{
"meta": {
"title": "Automated Post-Install Script | ProxMenux Documentation",
"description": "The ProxMenux Automated post-install script applies a curated set of 13 safe, hardware-aware optimizations to a fresh Proxmox VE host with zero prompts. Every change is registered for later reversal via Uninstall Optimizations.",
"description": "The ProxMenux Automated post-install script applies a curated set of 14 safe, hardware-aware optimizations to a fresh Proxmox VE host with zero prompts. Reversible configuration changes are registered for later restoration.",
"ogTitle": "Automated Post-Install Script | ProxMenux Documentation",
"ogDescription": "13 curated optimizations applied to a fresh Proxmox VE host with zero prompts. Hardware-aware (SSD/NVMe auto-detect) and fully reversible."
"ogDescription": "14 curated optimizations applied to a fresh Proxmox VE host with zero prompts. Hardware-aware, with reversible configuration changes tracked."
},
"header": {
"title": "Automated Post-Install Script",
"description": "One click, zero prompts — ProxMenux applies a curated set of 13 safe optimizations that almost every Proxmox host benefits from. Every change is registered in the tools JSON so you can undo any of them later from Uninstall Optimizations.",
"description": "One click, zero prompts — ProxMenux applies a curated set of 14 safe optimizations that almost every Proxmox host benefits from. Reversible configuration changes are registered for Uninstall Optimizations; package upgrades are not described as reversible.",
"section": "Post-Install · Automated"
},
"intro": {
@@ -55,7 +55,7 @@
},
{
"tool": "Memory tuning",
"what": "Sets vm.swappiness=10, balanced dirty ratios, vm.overcommit_memory=1, vm.max_map_count=262144 and compaction proactiveness when supported.",
"what": "Sets vm.swappiness=10, balanced dirty ratios, vm.max_map_count=262144 and compaction proactiveness when supported. The kernel's memory-overcommit policy is left at the Proxmox default.",
"category": "System",
"categorySlug": "system"
},
@@ -103,7 +103,7 @@
},
{
"tool": "Persistent interface names",
"what": "Writes one /etc/systemd/network/10-proxmenux-<iface>.link per physical NIC (each starting with a 'Managed by ProxMenux' header) that pins the MAC to the current name, so eth0 / enp… names stay stable across reboots and new NIC additions.",
"what": "Writes one <code>/etc/systemd/network/10-proxmenux-&lt;iface&gt;.link</code> per physical NIC (each starting with a 'Managed by ProxMenux' header) that pins the MAC to the current name, so <code>eth0</code> / <code>enp…</code> names stay stable across reboots and new NIC additions.",
"category": "Network",
"categorySlug": "network"
}
@@ -9,7 +9,7 @@
},
"intro": {
"title": "What this category covers",
"body": "Four foundational options you typically want on any fresh Proxmox host: switch to the free community repositories and run a full system upgrade, auto-configure the timezone and NTP sync, strip APT language downloads to save bandwidth and disk, and pick from a list of 25 common system utilities."
"body": "Five foundational options you typically want on any fresh Proxmox host: switch to the free community repositories, run a full system upgrade, auto-configure the timezone and NTP sync, strip APT language downloads to save bandwidth and disk, and pick from a list of 25 common system utilities."
},
"upgrade": {
"heading": "Update and upgrade system",
@@ -45,7 +45,7 @@
"shortTitle": "In short",
"shortBody": "The option runs the exact <code>apt update && apt full-upgrade -y</code> Proxmox recommends, wraps it with the repo hygiene and post-upgrade cleanup that the official guide also tells you to do, and prompts for the reboot at the end. See <link>Proxmox System Update</link> — the same updater is also available as a standalone utility in the main menu, with the full process diagram.",
"subTitle": "Don't apply to a subscribed host",
"subBody": "If you actually have a Proxmox subscription and want to keep using the enterprise repositories, skip this option. Re-running it would disable the enterprise repo and route you to the community channel. You can restore enterprise repos from the Uninstall menu if you change your mind later.",
"subBody": "If you actually have a Proxmox subscription and want to keep using the enterprise repositories, skip this option. Running it disables the enterprise repository and routes the host to the community channel. The package upgrade and repository rewrite are not presented as reversible in Uninstall Optimizations; restore your repository configuration deliberately if you need to change channels later.",
"safetyTitle": "Post-update safety check",
"safetyBody": "After the upgrade, the script checks for disks with stale PV (Physical Volume) metadata — an edge case that can happen when a VM with disk passthrough scribbles LVM headers onto a raw disk. If anything suspicious is found you'll see a warning suggesting <code>pvs</code> to inspect. No action is taken automatically."
},
@@ -209,8 +209,8 @@
}
],
"actionTitle": "A few of them in action",
"noBulkTitle": "No bulk uninstall for utilities",
"noBulkBody": "The Uninstall Optimizations menu does <strong>not</strong> track which utilities you installed — only whether the \"apt languages\", \"time sync\" and \"apt upgrade\" options were applied. To remove a specific utility later, uninstall it by hand:"
"noBulkTitle": "Only ProxMenux-installed utilities are removed",
"noBulkBody": "ProxMenux records only the selected utility packages that were not already installed before this action. Uninstall Optimizations can purge those packages later, while utilities that were already present on the host are left untouched. The general APT system upgrade is intentionally not tracked as reversible because upgraded packages have no safe atomic rollback."
},
"related": {
"heading": "Related",
@@ -1,22 +1,22 @@
{
"meta": {
"title": "Customizable Post-Install Script | ProxMenux Documentation",
"description": "Cherry-pick exactly which optimizations to apply to a Proxmox VE host with ProxMenux. 10 categories, ~30 individual tools, checklist UI. Includes everything the Automated script does, plus opt-in features (IOMMU, Fastfetch, Figurine, Ceph, HA, AMD fixes…).",
"description": "Cherry-pick exactly which optimizations to apply to a Proxmox VE host with ProxMenux. 10 categories, ~35 individual tools, checklist UI. Includes everything the Automated script does, plus opt-in features (IOMMU, Fastfetch, Figurine, Ceph, HA, AMD fixes…).",
"ogTitle": "Customizable Post-Install Script | ProxMenux Documentation",
"ogDescription": "10 categories, ~30 individual optimizations. Pick exactly what you want on a Proxmox VE host. Fully reversible."
"ogDescription": "10 categories, ~35 individual optimizations. Pick exactly what you want on a Proxmox VE host. Reversible changes are tracked."
},
"header": {
"title": "Customizable Post-Install Script",
"description": "Cherry-pick exactly which optimizations to apply to a Proxmox VE host. ProxMenux groups ~30 individual tools into 10 categories, each with its own checklist dialog. Same engine as Automated, but with full control over what gets applied.",
"description": "Cherry-pick exactly which optimizations to apply to a Proxmox VE host. ProxMenux groups ~35 individual tools into 10 categories, each with its own checklist dialog. Same engine as Automated, but with full control over what gets applied.",
"section": "Post-Install · Customizable"
},
"intro": {
"title": "When to pick Customizable",
"body": "Choose this path when you already know which tweaks you want on the host — or which you definitely do not want. The script presents a checklist per category so you can pre-select, deselect or mix-and-match optimizations. Every item can be applied again later (it is idempotent) or reverted from <link>Uninstall Optimizations</link>."
"body": "Choose this path when you already know which tweaks you want on the host — or which you definitely do not want. The script presents a checklist per category so you can pre-select, deselect or mix-and-match optimizations. Items can be applied again later, and reversible configuration changes are tracked for <link>Uninstall Optimizations</link>. Package upgrades are not presented as reversible."
},
"compare": {
"heading": "How it compares to Automated",
"body": "Customizable is a superset of the <link>Automated script</link>. It covers the same 13 baseline optimizations plus a long list of opt-in ones that Automated intentionally skips — things that are useful only on specific hardware (AMD fixes), specific hosting (OVH RTM), or specific workloads (IOMMU/VFIO, Ceph repo, High Availability, Fastfetch, Figurine, ZFS ARC tuning, pigz, ZFS auto-snapshot, vzdump speed limits, Open vSwitch, TCP BBR…)."
"body": "Customizable is a superset of the <link>Automated script</link>. It covers the same 14 baseline optimizations plus a long list of opt-in ones that Automated intentionally skips — things that are useful only on specific hardware (AMD fixes), specific hosting (OVH RTM), or specific workloads (IOMMU/VFIO, Ceph repo, High Availability, Fastfetch, Figurine, ZFS ARC tuning, pigz, ZFS auto-snapshot, vzdump speed limits, Open vSwitch, TCP BBR…)."
},
"categoriesSection": {
"heading": "The 10 categories",
@@ -37,11 +37,11 @@
},
{
"name": "Network",
"description": "Harden and tune the host's network stack. Forces APT over IPv4, applies sysctl hardening + TCP buffer tuning, offers Open vSwitch and BBR, and pins persistent interface names by MAC."
"description": "Harden and tune the host's network stack. Forces APT over IPv4, applies sysctl hardening + TCP buffer tuning, offers Open vSwitch, TCP BBR + TCP Fast Open, and pins persistent interface names by MAC."
},
{
"name": "Storage",
"description": "Set up Proxmox's common storage subsystems: ZFS ARC sizing, ZFS auto-snapshot, and vzdump speed limits to avoid saturating the disk during backups."
"description": "Set up Proxmox's common storage subsystems: ZFS ARC sizing, ZFS auto-snapshot, ZFS autotrim for SSD/NVMe pools, and vzdump speed limits to avoid saturating the disk during backups."
},
{
"name": "Security",
@@ -61,7 +61,7 @@
},
{
"name": "Optional",
"description": "Niche pieces not every host needs: AMD CPU fixes, Fastfetch banner, Figurine 3D hostname, Ceph repository, High Availability services and Log2RAM to reduce SSD wear."
"description": "Niche pieces not every host needs: AMD CPU fixes, Fastfetch banner, Figurine 3D hostname, PVE Appliance Manager index refresh, Ceph repository, High Availability services and Log2RAM to reduce SSD wear."
}
],
"mixTip": {
@@ -5,7 +5,7 @@
},
"header": {
"title": "Post-Install: Customization",
"description": "Cosmetic and quality-of-life tweaks for the Proxmox host. None of them change functional behaviour — they just make the shell nicer to use and hide the subscription nag in the web UI. All three are tracked and reversible from the Uninstall menu.",
"description": "Cosmetic and quality-of-life tweaks for the Proxmox host. They make the shell nicer to use and hide the subscription nag in the web UI. Bashrc, MOTD and the subscription banner are tracked and reversible from the Uninstall menu.",
"section": "Settings post-install Proxmox"
},
"intro": {
@@ -24,7 +24,7 @@
"heading": "Set up custom MOTD banner",
"intro": "Prepends <em>\"This system is optimised by: ProxMenux\"</em> to <code>/etc/motd</code>, the message shown after a successful SSH login (above the shell prompt, before any <code>update-motd</code> scripts run). Harmless and purely informational — useful as a quick visual confirmation that ProxMenux has been applied on this host.",
"writesTitle": "What ProxMenux writes",
"writesOutro": "Original <code>/etc/motd</code> is backed up to <code>/etc/motd.bak</code> on first apply. The operation is idempotent: if the marker line is already present, nothing is added."
"writesOutro": "On first apply, ProxMenux records whether <code>/etc/motd</code> existed and stores its original contents under <code>/usr/local/share/proxmenux</code>. The operation is idempotent: if the marker line is already present, nothing is added. Older installations with an existing <code>/etc/motd.bak</code> are migrated to the same reversible state."
},
"banner": {
"heading": "Remove subscription banner",
@@ -43,8 +43,8 @@
"verify": {
"heading": "Verification",
"intro": "After applying all three:",
"reversibleTitle": "All three are reversible",
"reversibleBody": "<link>Uninstall Optimizations</link> restores <code>/root/.bashrc</code> and <code>/etc/motd</code> from their <code>.bak</code> backups, and either restores the patched UI files from the backup directory or reinstalls <code>pve-manager</code>, <code>proxmox-widget-toolkit</code>, <code>libjs-extjs</code> and <code>libpve-http-server-perl</code> with <code>--force-confnew</code> to bring the web UI back to vanilla."
"reversibleTitle": "All three customization changes are tracked",
"reversibleBody": "<link>Uninstall Optimizations</link> restores <code>/root/.bashrc</code>, returns MOTD to its exact pre-ProxMenux contents (or removes the file if it did not previously exist), and restores the patched UI files from backup or reinstalls the affected Proxmox packages when necessary."
},
"related": {
"heading": "Related",
+10 -10
View File
@@ -1,7 +1,7 @@
{
"meta": {
"title": "Proxmox VE Post-Install Script — Automated and Customizable | ProxMenux",
"description": "Overview of the ProxMenux Post-Install scripts for Proxmox VE. Run the Automated script for sane defaults with zero prompts, the Customizable script to pick exactly what you want across 10 categories (system, virtualization, network, storage, security, performance, optional), or fully reverse any change with the Uninstall Optimizations option.",
"description": "Overview of the ProxMenux Post-Install scripts for Proxmox VE. Run the Automated script for sane defaults with zero prompts, the Customizable script to pick exactly what you want across 10 categories, or restore supported reversible changes with Uninstall Optimizations.",
"ogTitle": "Proxmox VE Post-Install Script — Automated and Customizable",
"ogDescription": "Apply common Proxmox VE post-install optimizations across 10 categories — automated or à la carte, with reversible options.",
"twitterTitle": "Proxmox VE Post-Install Script | ProxMenux",
@@ -9,26 +9,26 @@
},
"header": {
"title": "Post-Install Scripts",
"description": "Configure a fresh Proxmox VE host with ProxMenux's post-install optimizations. Three paths: run everything automatically, cherry-pick what you want, or reverse any change. All changes are tracked.",
"description": "Configure a fresh Proxmox VE host with ProxMenux's post-install optimizations. Apply the baseline automatically, choose individual options, update installed functions or restore supported reversible changes. Package upgrades are not presented as reversible.",
"section": "Settings post-install Proxmox"
},
"intro": {
"title": "What this menu is for",
"body": "Right after installing Proxmox VE, there are dozens of small changes that make the host faster and easier to maintain — free repositories, sane journald limits, sensible TCP buffers, SSD-friendly log storage, bashrc niceties, and more. ProxMenux automates all of them, tracks what it changed, and lets you revert."
"body": "Right after installing Proxmox VE, there are dozens of small changes that make the host faster and easier to maintain — free repositories, sane journald limits, sensible TCP buffers, SSD-friendly log storage, bashrc niceties, and more. ProxMenux automates them and tracks the supported reversible configuration changes."
},
"openingMenu": {
"heading": "Opening the menu",
"body": "From ProxMenux's main menu, select <strong>Settings post-install Proxmox</strong>. You will see this:",
"imageAlt": "Post-Installation Scripts menu with 3 ProxMenux options (Automated / Customizable / Uninstall) followed by the Community Scripts section"
"imageAlt": "Post-Installation Scripts menu Automated, Customizable, the conditional Apply Available Updates (only when updates are pending), and Uninstall, followed by the Community Scripts section"
},
"threeWays": {
"heading": "Three ways to apply optimizations",
"body": "The three ProxMenux entries share the same underlying code and the same registry of installed tools — they just give you different levels of control. Pick the one that matches how much you want to decide."
"heading": "Four ways to apply optimizations",
"body": "The four ProxMenux entries share the same underlying code and the same registry of installed tools — they just give you different levels of control. The <em>Apply Available Updates</em> entry only shows when at least one installed optimization has a newer version on disk than what is registered; on a freshly applied host it stays hidden."
},
"routes": [
{
"title": "Automated",
"description": "A curated set of 13 safe, always-useful optimizations applied in sequence with zero prompts. Good default for most users.",
"description": "A curated set of 14 safe, always-useful optimizations applied in sequence with zero prompts. Good default for most users.",
"bullets": [
"Free repos + system upgrade",
"Memory, kernel, network tuning",
@@ -39,7 +39,7 @@
},
{
"title": "Customizable",
"description": "~30 individual optimizations across 10 categories. You pick exactly which ones to apply. Same engine as Automated, but with full control.",
"description": "~35 individual optimizations across 10 categories. You pick exactly which ones to apply. Same engine as Automated, but with full control.",
"bullets": [
"Checklist UI per category",
"Includes everything Automated does, plus opt-in items (IOMMU, Fastfetch, Figurine, Ceph, HA, AMD fixes…)",
@@ -57,10 +57,10 @@
},
{
"title": "Uninstall Optimizations",
"description": "Every change made by either path is tracked in a JSON registry, and every optimization has a reverse function. Pick what to revert, and the host goes back.",
"description": "Supported reversible changes are tracked in a JSON registry and paired with a restoration function. Actions without a safe rollback, such as a full package upgrade, are intentionally excluded.",
"bullets": [
"Detects previously applied optimizations automatically",
"Reversal restores original configs from backup files",
"Reversal picks the right path for each item — restores from a .bak backup where one was made, deletes the sysctl.d snippet where nothing needed backing up, or reinstalls the vanilla package with --force-confnew (e.g. subscription banner)",
"Reboot prompt if needed (VFIO, persistent names, etc.)"
]
}
@@ -25,13 +25,11 @@
"remoteTitle": "Remote script piped to bash",
"remoteBody": "The installation runs <code>wget -qO - https://…apply.sh | bash</code>. If the OVH mirror is ever compromised, the script executes as root on your host. Before enabling this option, decide whether you trust OVH's mirror chain more than the monitoring you gain. For most home-lab or non-OVH users this option should simply stay off.",
"noOpTitle": "Only enable if the host is actually at OVH",
"noOpBody": "The option is a no-op on non-OVH servers, so ticking it on a home-lab Proxmox doesn't break anything. But there is a cosmetic bug today: even on non-OVH servers the script prints <em>\"Server belongs to OVH\"</em> at the end, which can be misleading. See the troubleshooting note below.",
"noOpBody": "The option is a no-op on non-OVH servers, so ticking it on a home-lab Proxmox doesn't break anything. On a non-OVH host the script prints <em>\"Not an OVH server, skipping RTM installation\"</em> and exits cleanly; no packages are installed.",
"runsTitle": "What ProxMenux runs",
"verifyTitle": "Verification",
"verifyBody": "On a real OVH host, after a reboot you should see the <a>RTM dashboard</a> in your OVH Manager populated with live data for the host. On the Proxmox side, the RTM collector is a systemd service — check it directly:",
"troubleTitle": "Troubleshooting",
"spuriousTitle": "\"Server belongs to OVH\" but I'm not on OVH",
"spuriousBody": "This is a known cosmetic quirk in the current script: the success message fires outside the OVH-detected conditional, so it prints on every run. If the RTM install did <em>not</em> actually happen (check <code>systemctl status ovh-rtm</code> — it will not exist), the message is spurious and can be ignored. Nothing was installed on your host.",
"revertTitle": "Not reversible from the Uninstall menu",
"revertBody": "There is no dedicated uninstall entry for RTM. On a real OVH host, remove the packages manually with <code>apt purge ovh-*</code> and delete any puppet manifests under <code>/etc/puppet/</code> that RTM installed. On a non-OVH host, nothing was ever installed, so there's nothing to revert."
},
@@ -34,7 +34,7 @@
},
{
"area": "Routing safety",
"settings": "<code>accept_redirects=0</code>, <code>accept_source_route=0</code>, <code>secure_redirects=0</code>, <code>send_redirects=0</code>"
"settings": "<code>accept_redirects=0</code>, <code>accept_source_route=0</code>, <code>secure_redirects=0</code>, <code>send_redirects=0</code>, <code>log_martians=0</code>"
},
{
"area": "Reverse path filter",
@@ -55,7 +55,7 @@
],
"sourceOutro": "It also adds <code>source /etc/network/interfaces.d/*</code> to <code>/etc/network/interfaces</code> if not already present — standard practice so you can drop modular interface snippets without editing the main file.",
"fwbrTitle": "Automatic tuning of virtual firewall bridges",
"fwbrBody": "Alongside the sysctl profile, ProxMenux installs a helper at <code>/usr/local/sbin/proxmenux-fwbr-tune</code> that applies <code>rp_filter=0</code> and <code>log_martians=0</code> to the <code>fwbr*</code> / <code>fwln*</code> / <code>fwpr*</code> / <code>tap*</code> interfaces Proxmox creates around VMs and containers. The helper is invoked by the <code>proxmenux-fwbr-tune.service</code> one-shot unit at boot, and by the <code>/etc/udev/rules.d/99-proxmenux-fwbr-tune.rules</code> rule on every <code>net add</code> event matching those prefixes — covering interfaces that Proxmox recreates on VM start/stop, reboot and live migration.",
"fwbrBody": "Alongside the sysctl profile, ProxMenux installs a helper at <code>/usr/local/sbin/proxmenux-fwbr-tune</code> that applies <code>rp_filter=0</code> and <code>log_martians=0</code> to the <code>fwbr*</code> / <code>fwln*</code> / <code>fwpr*</code> / <code>tap*</code> interfaces Proxmox creates around VMs and containers. The helper is invoked by the <code>proxmenux-fwbr-tune.service</code> one-shot unit at boot, and by the <code>/etc/udev/rules.d/99-zz-proxmenux-fwbr-tune.rules</code> rule on every <code>net add</code> event matching those prefixes — covering interfaces that Proxmox recreates on VM start/stop, reboot and live migration. The helper also runs immediately after install to sweep interfaces already present.",
"rpFilterTitle": "Why rp_filter=2 (loose) instead of 1 (strict)",
"rpFilterBody": "Strict reverse-path filtering drops packets whose source would be routed out a <em>different</em> interface. That's the right default on a client machine, but breaks badly on a Proxmox host where VM traffic often arrives on a bridge and leaves on an uplink with asymmetric routes. <code>rp_filter=2</code> (loose) only drops packets with truly unroutable sources. It's a pragmatic trade-off — slight reduction in local-IP-spoof detection in exchange for not breaking your VM network."
},
@@ -64,8 +64,8 @@
"intro": "Installs <code>openvswitch-switch</code> + <code>openvswitch-common</code>. These packages add OVS as a bridge implementation alternative to the standard Linux bridges that Proxmox uses by default. The install alone doesn't change any networking — existing <code>vmbrX</code> bridges keep working. OVS becomes available in the Proxmox UI when you <em>create</em> a new bridge and pick it from the type dropdown.",
"tipTitle": "When OVS makes sense",
"tipBody": "Consider OVS if you need <strong>VLAN trunking with non-contiguous VLAN IDs</strong>, <strong>LACP with LLDP on specific modes</strong>, <strong>fine-grained flow programming</strong> (OpenFlow), or interoperation with SDN controllers. For a home lab with a couple of VLANs and a single LACP uplink, standard Linux bridges + <code>vmbrX.VID</code> are simpler and perfectly fine.",
"revertTitle": "Not reversible from the Uninstall menu",
"revertBody": "Installing OVS is not tracked in Uninstall Optimizations. If you decide you don't want it, remove it manually — but only after migrating any bridges back to Linux bridges first:"
"revertTitle": "Reversible from the Uninstall menu",
"revertBody": "OVS is tracked. <link>Uninstall Optimizations</link> runs <code>apt purge</code> on <code>openvswitch-switch</code> and <code>openvswitch-common</code>. Migrate any OVS bridges back to Linux bridges <em>before</em> uninstalling, otherwise the VMs on those bridges lose networking on next boot. Manual equivalent:"
},
"bbr": {
"heading": "Enable TCP BBR + TCP Fast Open",
@@ -73,8 +73,8 @@
"verifyTitle": "Verification",
"impactTitle": "Impact is workload-dependent",
"impactBody": "BBR shines on high-latency or lossy links (cross-continent replication, VPN tunnels, mobile clients). On a LAN between two machines on the same switch, the difference is often within noise. TFO helps short, repeated HTTP connections the most.",
"revertTitle": "Not reversible from the Uninstall menu",
"revertBody": "BBR/TFO aren't tracked. To revert, remove the two sysctl files and reload:"
"revertTitle": "Reversible from the Uninstall menu",
"revertBody": "BBR/TFO are tracked. <link>Uninstall Optimizations</link> removes the two sysctl files (<code>/etc/sysctl.d/99-tcp-bbr.conf</code> and <code>99-tcp-fastopen.conf</code>) and reloads sysctl so the kernel returns to <code>cubic</code> and <code>tcp_fastopen=1</code>. Manual equivalent:"
},
"names": {
"heading": "Interface Names (persistent)",
+10 -15
View File
@@ -9,6 +9,7 @@
"title": "Optional Settings",
"intro": "The <strong>Optional Settings</strong> category provides additional features and optimizations that you can choose to apply to your Proxmox VE installation. These settings are not essential but can enhance your system's capabilities in specific scenarios.",
"available": "Available Optional Features",
"stepLabel": "Step",
"ceph": {
"title": "Add Latest Ceph Support",
"intro": "This option installs the latest Ceph storage system support for Proxmox VE. Ceph is a distributed storage system that provides high performance, reliability, and scalability.",
@@ -28,9 +29,8 @@
"doesIntro": "What it does:",
"doesItems": [
"Detects if an AMD EPYC or Ryzen CPU is present",
"Applies kernel parameter 'idle=nomwait' to prevent random crashes",
"Configures KVM to ignore certain MSRs (Model Specific Registers) for better Windows guest compatibility",
"Installs the latest Proxmox VE kernel"
"Applies kernel parameter 'idle=nomwait' to prevent random crashes (via /etc/kernel/cmdline on systemd-boot hosts, or /etc/default/grub on GRUB hosts — with a .bak of the original)",
"Configures KVM to ignore certain MSRs (Model Specific Registers) for better Windows guest compatibility"
],
"howUse": "How to use: These fixes are applied automatically and require a system reboot to take effect.",
"automates": "This adjustment automates the following commands:"
@@ -47,21 +47,16 @@
"howUse": "How to use: After enabling these services, you can configure HA groups and resources in the Proxmox VE web interface.",
"automates": "This adjustment automates the following commands:"
},
"testing": {
"title": "Enable Proxmox Testing Repository",
"intro": "This option enables the Proxmox testing repository, allowing access to the latest, potentially unstable versions of Proxmox VE packages.",
"pveam": {
"title": "Update Proxmox VE Appliance Manager",
"intro": "Refreshes the local index of container templates that <code>pveam</code> exposes in the Proxmox UI, so the list of available appliances is up to date the next time you create an LXC.",
"doesIntro": "What it does:",
"doesItems": [
"Adds the Proxmox testing repository to the system's package sources",
"Creates a new file in /etc/apt/sources.list.d/ for the testing repository",
"Updates the package lists to include packages from the new repository"
"Runs <code>pveam update</code> against the Proxmox mirrors to fetch the current appliance catalogue",
"Populates the appliance list shown by the web UI when creating a container"
],
"howUse": "How to use: After enabling this repository, you can update and upgrade your system to get the latest testing versions of Proxmox VE packages. Use with caution as these versions may be unstable.",
"manualIntro": "To manually add the Proxmox testing repository, you can use these commands:",
"noteLabel": "Note:",
"noteBody": "$(lsb_release -cs) automatically detects your Proxmox VE version codename (e.g., bullseye).",
"warnLabel": "Warning:",
"warnBody": "Enabling the testing repository may lead to system instability. It's recommended for testing environments only."
"howUse": "How to use: run it once when the appliance list in the UI feels stale, or after switching mirrors. It does not download the templates themselves — only the catalogue index.",
"automates": "This adjustment automates the following command:"
},
"fastfetch": {
"title": "Install and Configure Fastfetch",
@@ -25,8 +25,8 @@
],
"replacesTitle": "This replaces a system binary",
"replacesBody": "Replacing <code>/bin/gzip</code> with a wrapper is unusual. It is safe (the wrapper produces gzip-compatible output), but worth knowing: scripts that hardcode paths, run inside restrictive chroots, or verify binary hashes may behave differently. The original binary is preserved as <code>/bin/gzip.original</code> so you can always swap it back.",
"revertTitle": "Not reversible from the Uninstall menu",
"revertBody": "This optimization is applied by Customizable, but <strong>does not currently have a matching entry in the Uninstall Optimizations menu</strong>. To revert it by hand, restore the original gzip and clear the wrapper:",
"revertTitle": "Reversible from the Uninstall menu",
"revertBody": "This optimization is tracked. <link>Uninstall Optimizations</link> restores <code>/bin/gzip.original</code> back into place, removes the <code>pigzwrapper</code>, reverts the two lines added to <code>/etc/vzdump.conf</code>, and runs <code>apt purge pigz</code>. Manual equivalent:",
"verifyTitle": "Verification",
"verifyBody": "After applying, <code>gzip --version</code> should mention pigz. A quick benchmark also shows the speed difference on a multi-core host:",
"whenTitle": "When this matters most",
@@ -23,11 +23,11 @@
"nfsTitle": "Don't disable this if you use NFS",
"nfsBody": "NFS server <strong>and</strong> NFS client rely on <code>rpcbind</code> to negotiate the ports used by <code>mountd</code>, <code>statd</code>, <code>lockd</code>, etc. If your Proxmox host either <em>exports</em> NFS shares to other machines or <em>mounts</em> NFS shares from a NAS, do not apply this option. Mounts will fail with <code>mount.nfs: rpc.statd is not running</code> or similar.",
"runsTitle": "What ProxMenux runs",
"runsOutro": "The package stays installed (so you or another tool can re-enable it later). The service unit is disabled so the service does not come back on reboot.",
"runsOutro": "The package stays installed. ProxMenux records the original enabled/active state of both rpcbind.service and rpcbind.socket, then disables and stops both units so socket activation cannot bring the service back.",
"verifyTitle": "Verification",
"verifyBody": "After applying, confirm <code>rpcbind</code> is off and nothing is listening on port 111:",
"reversibleTitle": "Reversible from the Uninstall menu",
"reversibleBody": "This change is tracked. Open <link>Uninstall Optimizations</link> and pick <em>RPC Disable</em> to restore it. Nothing is purged from the system — just re-enable the service and it starts again."
"reversibleTitle": "Restores the original service state",
"reversibleBody": "This change is registered in <code>installed_tools.json</code>. <link>Uninstall Optimizations</link> restores each rpcbind unit to the enabled/disabled and active/inactive state captured before ProxMenux changed it; it does not assume that rpcbind was enabled on every host."
},
"related": {
"heading": "Related",
+20 -12
View File
@@ -9,10 +9,10 @@
},
"intro": {
"title": "What this category covers",
"body": "Three storage-related optimizations: tune the <strong>ZFS ARC</strong> cache size to a sensible fraction of host RAM, install and schedule <strong>ZFS auto-snapshots</strong>, and remove throttles from <strong>vzdump</strong> so backups run at full speed. All three are independent — pick the ones that match your setup. A fourth storage-adjacent optimization, <link>Log2RAM</link>, reduces SSD/NVMe wear by moving <code>/var/log</code> to a ramdisk — it lives on the Optional page because the ProxMenux Customizable menu groups it there."
"body": "Four storage-related optimizations: tune the <strong>ZFS ARC</strong> cache size to a sensible fraction of host RAM, install and schedule <strong>ZFS auto-snapshots</strong>, enable <strong>ZFS autotrim</strong> on SSD/NVMe pools, and remove throttles from <strong>vzdump</strong> so backups run at full speed. All four are independent — pick the ones that match your setup. A fifth storage-adjacent optimization, <link>Log2RAM</link>, reduces SSD/NVMe wear by moving <code>/var/log</code> to a ramdisk — it lives on the Optional page because the ProxMenux Customizable menu groups it there."
},
"notTrackedTitle": "None of these are in the Uninstall menu",
"notTrackedBody": "Unlike most post-install optimizations, the three Storage options are <strong>not currently tracked</strong> in the Uninstall Optimizations flow. If you apply them and later want to revert, you'll have to do it by hand. The manual rollback commands are shown below each section.",
"trackedTitle": "All four are tracked in the Uninstall menu",
"trackedBody": "Each of these options registers a tool in <code>installed_tools.json</code>, so they appear in <link>Uninstall Optimizations</link>. Reverting <code>zfs_arc</code> removes <code>/etc/modprobe.d/99-zfsarc.conf</code> and rebuilds initramfs; <code>zfs_auto_snapshot</code> reverses the cron schedule and offers to purge the package; <code>zfs_autotrim</code> sets <code>autotrim=off</code> on the pools it enabled; <code>vzdump_speed</code> restores <code>/etc/vzdump.conf</code> from the <code>.bak</code> the install created.",
"arc": {
"heading": "Optimize ZFS ARC size",
"intro": "The <strong>Adaptive Replacement Cache (ARC)</strong> is ZFS's in-memory read cache. Without explicit tuning, ZFS happily grabs up to half the host RAM for itself, which is excessive on a Proxmox host that also needs memory for VMs and LXCs. This option caps ARC to a sane fraction of total RAM based on the size of the machine.",
@@ -21,19 +21,27 @@
"headerMax": "ARC cap",
"rows": [
{
"ram": "≤ 16 GB",
"max": "512 MiB"
"ram": "Formula",
"max": "RAM / 10, capped at 16 GiB, with a 64 MiB floor"
},
{
"ram": "17 32 GB",
"max": "1 GiB"
"ram": "8 GB host",
"max": "≈ 819 MiB (RAM/10)"
},
{
"ram": "> 32 GB",
"max": "RAM / 8 (floor 512 MiB)"
"ram": "16 GB host",
"max": "≈ 1.6 GiB (RAM/10)"
},
{
"ram": "64 GB host",
"max": "≈ 6.4 GiB (RAM/10)"
},
{
"ram": "≥ 160 GB host",
"max": "16 GiB (cap)"
}
],
"after": "On a 64 GB host, that means an 8 GB cap for ARC. The file <code>/etc/modprobe.d/99-zfsarc.conf</code> contains a single directive — <code>options zfs zfs_arc_max=…</code>. Every other ZFS module parameter (<code>zfs_arc_min</code>, L2ARC prefetch/write throttle, TXG timeout) is left at its OpenZFS default. After writing the file, ProxMenux runs <code>update-initramfs -u -k all</code> and, when applicable, <code>proxmox-boot-tool refresh</code>, so the cap also lands in the initramfs used by ZFS-on-root setups.",
"after": "The file <code>/etc/modprobe.d/99-zfsarc.conf</code> contains a single directive — <code>options zfs zfs_arc_max=…</code>. Every other ZFS module parameter (<code>zfs_arc_min</code>, L2ARC prefetch/write throttle, TXG timeout) is left at its OpenZFS default. Before writing, a reconcile step scans any other <code>*.conf</code> in <code>/etc/modprobe.d/</code> that sets <code>zfs_arc_min</code> / <code>zfs_arc_max</code>, backs them up to <code>/usr/local/share/proxmenux/backups/zfs_arc/</code> with a manifest, and strips the conflicting lines so only ProxMenux's file is active. After writing the file, ProxMenux runs <code>update-initramfs -u -k all</code> and, when applicable, <code>proxmox-boot-tool refresh</code>, so the cap also lands in the initramfs used by ZFS-on-root setups.",
"rebootTitle": "Requires a reboot to take effect",
"rebootBody": "ARC settings are read when the <code>zfs</code> kernel module loads. To make the cap take effect on ZFS-on-root hosts, ProxMenux regenerates the initramfs with <code>update-initramfs -u -k all</code> and, when applicable, refreshes the boot loader with <code>proxmox-boot-tool refresh</code>. A reboot is still required to pick up the new module parameter; the \"reboot required\" flag is set automatically.",
"safeTitle": "Safe on non-ZFS hosts",
@@ -115,8 +123,8 @@
"heading": "Increase vzdump backup speed",
"intro": "By default, Proxmox vzdump throttles backups to protect running VMs/CTs from IO starvation. On many setups that throttle is more conservative than needed. This option removes the bandwidth cap and lowers the I/O priority so vzdump can saturate the storage path during backup windows.",
"changedTitle": "What gets changed in /etc/vzdump.conf",
"noBackupTitle": "No backup of vzdump.conf",
"noBackupBody": "The script <strong>edits <code>/etc/vzdump.conf</code> in place</strong> without creating a <code>.bak</code> first. If you had custom values there (bwlimit, ionice, compress, pigz, tmpdir, exclude-path, etc.), the changes to <em>those two lines</em> are made with <code>sed</code> — surrounding config is preserved — but there's no \"undo\" snapshot. Make a manual backup if your config is non-trivial: <code>cp /etc/vzdump.conf /etc/vzdump.conf.pre-proxmenux</code>.",
"backupTitle": "First run creates a .bak of vzdump.conf",
"backupBody": "The first time this option runs, ProxMenux copies <code>/etc/vzdump.conf</code> to <code>/etc/vzdump.conf.bak</code> before touching it. Subsequent runs re-use that backup and won't overwrite it, so a hand-edited config from before the first apply stays recoverable. The changes to <code>bwlimit</code> and <code>ionice</code> are then made with <code>sed</code>, and any other options in the file (compress, pigz, tmpdir, exclude-path, etc.) are preserved.",
"skipTitle": "When to skip this",
"skipBody": "On a host with slow local storage and VMs that are latency-sensitive, removing the bandwidth cap can cause noticeable slowdowns during backups. If you've previously set a specific <code>bwlimit</code> for that reason, keep it — skip this option.",
"verifyTitle": "Verification and manual rollback"
@@ -85,7 +85,7 @@
"intro": "Installs <code>kexec-tools</code> and wires it up so you can reboot the host straight into a new kernel <em>without going through BIOS/UEFI firmware</em>. On big servers where POST takes 45 90 seconds, this turns a reboot from a coffee break into a few seconds of downtime.",
"installsTitle": "What ProxMenux installs",
"installsItems": [
"Package <code>kexec-tools</code> (with debconf pre-answered so apt doesn't prompt during install).",
"Package <code>kexec-tools</code> (debconf pre-answered with <code>kexec-tools/load_kexec boolean false</code> so apt doesn't prompt and the auto-load on shutdown stays off).",
"Systemd unit <code>/etc/systemd/system/kexec-pve.service</code> — loads the Proxmox kernel and initrd into memory at boot, reusing the current cmdline.",
"An alias in <code>/root/.bash_profile</code>: <code>reboot-quick</code> → <code>systemctl kexec</code>."
],
@@ -1,16 +1,16 @@
{
"meta": {
"title": "Uninstall Optimizations | ProxMenux Documentation",
"description": "Reverse any post-install optimization applied by ProxMenux. Every change is tracked in a JSON registry, and every tool has a dedicated uninstaller that restores the original configuration."
"description": "Restore reversible post-install configuration changes applied by ProxMenux. Registered tools use dedicated uninstallers that preserve the pre-existing host state where possible."
},
"header": {
"title": "Uninstall Optimizations",
"description": "Reverse any change made by the Automated or Customizable post-install scripts. ProxMenux keeps a registry of every optimization it applied and has a dedicated reversal function for each one — pick which to revert, and the host goes back.",
"description": "Restore reversible changes made by the Automated or Customizable post-install scripts. ProxMenux registers each supported optimization with its dedicated restoration function; package upgrades are intentionally excluded.",
"section": "Settings post-install Proxmox"
},
"intro": {
"title": "Why this exists",
"body": "Every tweak the post-install scripts apply is <strong>tracked</strong> in a JSON registry at <code>/usr/local/share/proxmenux/installed_tools.json</code>. That registry is what powers the uninstall flow it shows you the list of optimizations currently applied, and a reversal function that restores the original state for each one (from backup files where possible, or by reinstalling the affected packages)."
"body": "Every supported reversible tweak is <strong>tracked</strong> in <code>/usr/local/share/proxmenux/installed_tools.json</code>. That registry powers the uninstall flow: it lists the active optimizations and dispatches the matching restoration function. Actions without a safe rollback, such as a full package upgrade, are not added."
},
"openMenu": {
"heading": "How to open it",
@@ -40,21 +40,21 @@
"body2": "Each reversal logs its progress. Items that require a reboot (VFIO, persistent interface names) set a flag that triggers the reboot prompt at the end."
},
{
"title": "Reboot if needed",
"body1": "If any reversed item modified kernel parameters, kernel modules, or network naming, you'll be offered a reboot. Otherwise the changes are live immediately."
"title": "Reboot prompt at the end",
"body1": "After the reversal finishes the menu shows a reboot prompt. Items that changed kernel parameters, kernel modules or network naming (VFIO, persistent interface names) do need the reboot to take effect; other items do not, and the prompt is a safety default rather than a per-item check."
}
]
},
"reversible": {
"heading": "What is reversible",
"intro": "Every optimization the post-install scripts apply has a matching uninstaller. Grouped here by area:",
"intro": "Registered reversible optimizations and their matching uninstallers are grouped here by area:",
"groups": [
{
"title": "Repositories & APT",
"items": [
{
"tool": "Subscription Banner Removal",
"restores": "Reinstalls pve-manager, proxmox-widget-toolkit, libjs-extjs and libpve-http-server-perl with force-confnew to restore the original UI files. Also clears cached .js / .gz copies."
"restores": "First tries to restore the UI files from ProxMenux's own backups (/usr/local/share/proxmenux/backups/proxmoxlib.js.backup.* and, when the mobile UI is patched, index.html.tpl.backup.*). Only if a backup is missing or corrupt, falls back to reinstalling pve-manager, proxmox-widget-toolkit, libjs-extjs and libpve-http-server-perl with force-confnew. Also clears cached .js / .gz copies."
},
{
"tool": "APT Language Skip",
@@ -63,6 +63,10 @@
{
"tool": "APT IPv4 Force",
"restores": "Removes /etc/apt/apt.conf.d/99-force-ipv4."
},
{
"tool": "System Utilities",
"restores": "Purges only the selected utility packages that ProxMenux recorded as newly installed. Packages already present before the action are never added to this list and are left untouched."
}
]
},
@@ -79,7 +83,7 @@
},
{
"tool": "System Limits Increase",
"restores": "Removes /etc/sysctl.d/99-maxwatches.conf, 99-maxkeys.conf, 99-swap.conf, 99-fs.conf and /etc/security/limits.d/99-limits.conf. Reverts PAM limits and systemd DefaultLimitNOFILE."
"restores": "Removes /etc/sysctl.d/99-maxwatches.conf, 99-maxkeys.conf, 99-swap.conf, 99-fs.conf and /etc/security/limits.d/99-limits.conf. Reverts PAM limits and systemd DefaultLimitNOFILE, and strips the ulimit -n 256000 line from /root/.profile."
}
]
},
@@ -88,7 +92,15 @@
"items": [
{
"tool": "Network Optimizations",
"restores": "Removes /etc/sysctl.d/99-network.conf together with the proxmenux-fwbr-tune.service unit, the /usr/local/sbin/proxmenux-fwbr-tune helper and the /etc/udev/rules.d/99-proxmenux-fwbr-tune.rules udev rule. Reloads sysctl, systemd and the udev ruleset."
"restores": "Removes /etc/sysctl.d/99-network.conf, 97-proxmenux-fwbr.conf and 98-proxmenux-rpf.conf together with the proxmenux-fwbr-tune.service unit, the /usr/local/sbin/proxmenux-fwbr-tune helper and the /etc/udev/rules.d/99-zz-proxmenux-fwbr-tune.rules udev rule. Also strips the source /etc/network/interfaces.d/* line from /etc/network/interfaces. Reloads sysctl, systemd and the udev ruleset."
},
{
"tool": "Open vSwitch",
"restores": "Runs apt purge on openvswitch-switch and openvswitch-common. Migrate any OVS bridges back to Linux bridges before running this uninstall — otherwise the VMs on those bridges lose networking on next boot."
},
{
"tool": "TCP BBR + TCP Fast Open",
"restores": "Removes /etc/sysctl.d/99-tcp-bbr.conf and 99-tcp-fastopen.conf and reloads sysctl so the kernel returns to the cubic congestion control and to tcp_fastopen=1."
},
{
"tool": "Persistent Interface Names",
@@ -124,9 +136,13 @@
"tool": "Bashrc Customization",
"restores": "Restores /root/.bashrc from the .bak backup. If no backup exists, removes the PMX_CORE_BASHRC block by markers."
},
{
"tool": "Custom MOTD Banner",
"restores": "Restores the exact original /etc/motd content kept under /usr/local/share/proxmenux, removes the file when it did not exist before, or safely removes the legacy marker when migrating an older installation."
},
{
"tool": "Fastfetch",
"restores": "Removes the binary, config directory, update-motd hook and the bashrc block. Purges the apt package if installed."
"restores": "Removes the binary, config directory, update-motd hook and the fenced BEGIN FASTFETCH / END FASTFETCH block from /root/.bashrc, ~/.profile, /etc/profile and /etc/profile.d/fastfetch.sh. Purges the apt package if installed."
},
{
"tool": "Figurine",
@@ -144,6 +160,27 @@
{
"tool": "AMD CPU fixes (Ryzen/EPYC)",
"restores": "Removes idle=nomwait from kernel cmdline (ZFS) or GRUB, and the ignore_msrs / report_ignored_msrs options from /etc/modprobe.d/kvm.conf."
},
{
"tool": "QEMU Guest Agent (templates)",
"restores": "Reads /usr/local/share/proxmenux/guest_agent.pkg (recorded at install time) and apt purges whichever package was installed (qemu-guest-agent for standard hosts, spice-vdagent when Spice mode is used)."
}
]
},
{
"title": "Storage",
"items": [
{
"tool": "ZFS ARC sizing",
"restores": "Removes /etc/modprobe.d/99-zfsarc.conf, restores any conflicting external *.conf that was staged aside in /usr/local/share/proxmenux/backups/zfs_arc/, rebuilds initramfs and runs proxmox-boot-tool refresh on systemd-boot hosts."
},
{
"tool": "ZFS auto-snapshot",
"restores": "Removes the cron entries the script wrote and offers to apt purge zfs-auto-snapshot. Existing snapshot datasets on the pools are left intact — remove them separately if you want them gone."
},
{
"tool": "vzdump speed limits",
"restores": "Restores /etc/vzdump.conf from the .bak the install created, bringing back bwlimit and ionice to their pre-ProxMenux values."
}
]
},
@@ -160,7 +197,27 @@
},
{
"tool": "kexec (fast reboots)",
"restores": "Disables kexec-pve.service, removes the unit file and the reboot-quick alias, purges kexec-tools."
"restores": "Disables kexec-pve.service, removes the unit file and the reboot-quick alias from /root/.bash_profile, purges kexec-tools."
},
{
"tool": "RPC / rpcbind Disable",
"restores": "Restores rpcbind.service and rpcbind.socket independently to the enabled/disabled and active/inactive states recorded before ProxMenux changed them."
},
{
"tool": "pigz (parallel gzip)",
"restores": "Puts /bin/gzip.original back in place, removes the /bin/pigzwrapper, reverts the pigz and bwlimit lines in /etc/vzdump.conf and apt purges pigz."
},
{
"tool": "High Availability services",
"restores": "Stops and disables pve-ha-lrm, pve-ha-crm and corosync. Existing HA groups and resource definitions are not deleted — remove them from the web UI if you no longer need them."
},
{
"tool": "Ceph repository",
"restores": "Purges the Ceph packages installed by this option, removes the deb822 /etc/apt/sources.list.d/ceph.sources on PVE 9 (or the legacy Ceph list on PVE 8), and refreshes the APT cache."
},
{
"tool": "OVH RTM (monitoring)",
"restores": "apt purges any ovh-* packages the RTM installer added and deletes the puppet manifests it dropped under /etc/puppet/. On non-OVH hosts nothing was ever installed, so nothing is removed."
}
]
}
@@ -66,8 +66,14 @@
{
"title": "No reboot unless the function says so",
"body": "Most updates take effect immediately. Updates that touch kernel modules, persistent interface names, or VFIO show the same reboot prompt as a fresh install would."
},
{
"title": "Registry refresh sent to the Monitor",
"body": "Once the batch finishes, the menu POSTs to <code>http://127.0.0.1:8008/api/updates/post-install/scan</code> to rebuild <code>/usr/local/share/proxmenux/updates_available.json</code>. That is what makes the Monitor's Optimizations card and the shell menu entry disappear immediately after the update, without waiting for the next scheduled scan."
}
]
],
"jqTitle": "jq is required",
"jqBody": "The Path A checklist relies on <code>jq</code> to parse the pending-updates JSON. If <code>jq</code> is missing, the flow exits silently — you would see the menu entry with a count but nothing would happen after picking rows. On any modern Proxmox install <code>jq</code> is present; if in doubt run <code>apt install -y jq</code>."
},
"differs": {
"heading": "How it differs from the other paths",
@@ -117,7 +117,7 @@
},
"switchToHttps": {
"heading": "Switch the Monitor to HTTPS",
"bodyRich": "Once <code>/etc/pve/local/pveproxy-ssl.pem</code> is signed by Let's Encrypt, the Monitor side is one click: open <strong>Settings → Security → HTTPS / SSL</strong>, confirm the issuer shown in the detected-certificate panel reads <em>Let's Encrypt</em> (and not the local Proxmox CA), and click <strong>Use Proxmox Certificate</strong>. The Monitor service restarts and the next browser load is HTTPS on port 8008 — no certificate warning, since the chain is publicly trusted."
"bodyRich": "Once <code>/etc/pve/local/pveproxy-ssl.pem</code> is signed by Let's Encrypt, the Monitor side is one click: open <strong>Settings → Security → HTTPS / SSL</strong>, confirm the issuer shown in the detected-certificate panel reads <em>Let's Encrypt</em> (and not the local Proxmox CA), and click <strong>Use Proxmox Certificate</strong>. The Monitor service restarts and the next browser load is HTTPS on port 8008 — no certificate warning, since the chain is publicly trusted. Later Proxmox ACME renewals are validated and selected during the next new TLS connection; there is no recurring certificate poller or renewal-time service restart. <strong>Update certificate</strong> remains available in Security as an explicit diagnostic and recovery action."
},
"custom": {
"heading": "Custom certificate — when to use it",
@@ -1,5 +1,6 @@
{
"title": "Script de creación de VM Synology",
"stepLabel": "Paso",
"intro": {
"heading": "Introducción",
"intro": "ProxMenux ofrece un script automatizado que crea y configura una máquina virtual (VM) para instalar Synology DSM (DiskStation Manager) en Proxmox VE. Este script simplifica el proceso descargando y añadiendo uno de los loaders disponibles al arranque de la VM, dándote la opción de elegir entre cuatro alternativas distintas:",
@@ -45,7 +45,7 @@
"heading": "Recorriendo el flujo",
"detect": {
"title": "Detectar GPUs y comprobar IOMMU",
"body": "El script lista cada GPU que encuentra. Si IOMMU no está ya habilitado en la cmdline del kernel en ejecución, recibirás un prompt sí/no para añadir <code>intel_iommu=on</code> (o <code>amd_iommu=on</code>) + <code>iommu=pt</code> al archivo de arranque correcto — <code>/etc/kernel/cmdline</code> en ZFS (systemd-boot) o <code>/etc/default/grub</code> en LVM/ext4. Si aceptas y la cmdline del kernel cambia, el script marca que el prompt de reinicio al final será obligatorio.",
"body": "El script lista cada GPU que encuentra. Si IOMMU no está ya habilitado en la cmdline del kernel en ejecución, recibirás un prompt sí/no para añadir <code>intel_iommu=on</code> (o <code>amd_iommu=on</code>) + <code>iommu=pt</code> al archivo de arranque correcto. La selección depende del bootloader: <code>/etc/kernel/cmdline</code> cuando el host arranca con systemd-boot (se detecta por la presencia de <code>root=ZFS=</code> en ese fichero, lo habitual en instalaciones de Proxmox VE sobre ZFS-on-root), o <code>/etc/default/grub</code> en el resto. Si aceptas y la cmdline cambia, el script marca que hará falta un reinicio al final.",
"tipTitle": "¿Ya ejecutaste post-instalación?",
"tipBody": "Si habilitaste anteriormente <postLink>soporte VFIO IOMMU</postLink> desde los scripts post-instalación, IOMMU ya está activo y este paso pasa silenciosamente. Bien.",
"imageAlt": "Lista de GPUs detectadas con fabricante y dirección PCI"
@@ -74,8 +74,8 @@
"intro": "El script escanea cada config de VM y cada config de LXC en el host buscando la GPU que elegiste. Tres resultados posibles:",
"items": [
"<strong>La GPU está libre.</strong> Nada que hacer, continúa.",
"<strong>La GPU está en otra VM.</strong> Se te ofrece quitarla de esa otra VM antes de asignarla aquí. Si rechazas, el script aborta — dos VMs no pueden compartir una asignación VFIO exclusiva.",
"<strong>La GPU está en un LXC (modo compartido).</strong> Se te ofrece quitar la configuración de passthrough del LXC (líneas <code>lxc.cgroup2.devices.allow</code> + <code>lxc.mount.entry</code>). El LXC dejará de ver la GPU, pero la VM la verá — esta es la mecánica de \"switch mode\" que le da a esta entrada de menú su etiqueta secundaria."
"<strong>La GPU está en otra VM.</strong> Si la VM origen está en ejecución, el script aborta — dos VMs no pueden compartir una asignación VFIO exclusiva y la VM origen ha de pararse antes. Si la VM origen está parada, aparece un menú con dos opciones: <em>Mantener la GPU en la config de la VM origen pero desactivar Arranque al inicio</em>, o <em>Eliminar las líneas de la GPU de la config de la VM origen y mantener Arranque al inicio</em>. También existe un camino rápido: si la GPU ya está vinculada a <code>vfio-pci</code> y es un simple traspaso VM→VM, no se reconfigura el host y no hace falta reinicio.",
"<strong>La GPU está en un LXC (modo compartido).</strong> Aparece un menú con dos opciones: <em>Mantener la GPU en la config del LXC pero desactivar Arranque al inicio</em>, o <em>Eliminar las líneas de la GPU de la config del LXC (<code>lxc.cgroup2.devices.allow</code> / <code>lxc.mount.entry</code>) y mantener Arranque al inicio</em>. En ambos casos, el LXC dejará de ver la GPU tras el switch, y la VM la verá — esta es la mecánica de \"switch mode\" que le da a esta entrada de menú su etiqueta secundaria."
],
"imageAlt": "Diálogo que ofrece quitar la GPU de un LXC antes de asignarla a la VM",
"smartTitle": "Los hermanos de audio también se limpian con inteligencia",
@@ -100,10 +100,10 @@
"<code>/etc/modules</code> — añade <code>vfio</code>, <code>vfio_iommu_type1</code>, <code>vfio_pci</code> (más <code>vfio_virqfd</code> en kernels &lt; 6.2).",
"<code>/etc/modprobe.d/vfio.conf</code> — para AMD / Intel, define <code>options vfio-pci ids=&lt;vendor:device,...&gt; disable_vga=1</code> para que VFIO reclame la GPU pronto en el arranque. Para NVIDIA el archivo solo añade <code>softdep nvidia pre: vfio-pci</code> (más <code>_drm</code>/<code>_modeset</code>/<code>_uvm</code>) — el binding real es por BDF vía la regla udev de abajo. En AMD, también añade líneas <code>softdep</code> forzando que <code>vfio-pci</code> cargue antes de <code>radeon</code> / <code>amdgpu</code>.",
"<code>/etc/modprobe.d/iommu_unsafe_interrupts.conf</code> y <code>kvm.conf</code> — workarounds sensatos que la mayoría de VMs Windows / macOS necesitan (<code>allow_unsafe_interrupts=1</code>, <code>ignore_msrs=1</code>).",
"<code>/etc/modprobe.d/blacklist.conf</code> — pone en blacklist los drivers open-source compañeros (<code>nouveau</code>, <code>amdgpu</code>, <code>radeon</code>, <code>i915</code>) que si no agarrarían la GPU antes que VFIO. El módulo propietario <code>nvidia</code> <strong>nunca se pone en blacklist</strong> — sigue disponible para cualquier OTRA GPU NVIDIA que mantengas en el host.",
"<code>/etc/modprobe.d/blacklist.conf</code> — solo pone en blacklist los drivers open-source del vendor seleccionado (<code>nouveau</code>/<code>lbm-nouveau</code> para NVIDIA; <code>radeon</code>+<code>amdgpu</code> para AMD; <code>i915</code> para Intel), así los drivers de otros vendors en el mismo host siguen cargados. El módulo propietario <code>nvidia</code> <strong>solo</strong> se pone en blacklist (mediante un fichero aparte, <code>/etc/modprobe.d/proxmenux-nvidia-vfio-blacklist.conf</code>) una vez que <em>todas</em> las GPUs NVIDIA del host han pasado a VFIO — hasta entonces sigue cargado para que cualquier NVIDIA que mantengas en el host siga funcionando.",
"<code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> + <code>/etc/proxmenux/vfio-bind.bdfs</code> — <strong>solo NVIDIA</strong>. Estado de binding por BDF. La regla udev aplica <code>ATTR'{'driver_override'}'=\"vfio-pci\"</code> en el evento PCI ADD para cada Bus:Device.Function rastreado, así que solo las GPUs que has pasado explícitamente van a VFIO. Esto es lo que hace que NVIDIA multi-GPU funcione — tus otras tarjetas NVIDIA mantienen su driver <code>nvidia</code> y siguen siendo usables en el host.",
"<strong>Solo AMD.</strong> Vuelca la ROM de la GPU desde sysfs (<code>/sys/bus/pci/.../rom</code>) o la tabla ACPI VFCT a <code>/usr/share/kvm/vbios_&lt;card&gt;.bin</code>. La VM la referencia vía <code>romfile=</code> para que las tarjetas que mal-reportan su propia VBIOS aún inicialicen correctamente.",
"<strong>Solo NVIDIA.</strong> Para y deshabilita los servicios NVIDIA del host que podrían sondear / bloquear la GPU en el arranque (<code>nvidia-persistenced</code>, <code>nvidia-powerd</code>, <code>nvidia-fabricmanager</code>). El propio módulo <code>nvidia</code> se deja cargado para que otras GPUs NVIDIA del host sigan funcionando con <code>nvidia-smi</code>.",
"<strong>Solo NVIDIA.</strong> Los servicios NVIDIA del host (<code>nvidia-persistenced</code>, <code>nvidia-powerd</code>, <code>nvidia-fabricmanager</code>) solo se detienen y deshabilitan cuando todas las GPU NVIDIA están asignadas a VFIO. En un host mixto permanecen activos, junto con el módulo <code>nvidia</code>, para las GPU que continúan en modo nativo.",
"<code>update-initramfs -u -k all</code> — solo se ejecuta si algo de lo de arriba ha cambiado realmente."
]
},
+24 -54
View File
@@ -1,16 +1,16 @@
{
"meta": {
"title": "Instalar drivers NVIDIA en el host | ProxMenux Documentation",
"description": "Instala y configura los drivers propietarios NVIDIA en un host Proxmox VE usando ProxMenux. Cubre compatibilidad de kernel, setup VFIO, servicio de persistencia, parche NVENC opcional y propagación automática a LXCs."
"description": "Instala y configura los drivers propietarios NVIDIA en un host Proxmox VE usando ProxMenux. Cubre filtrado por GPU, validación DKMS, servicio de persistencia, parche NVENC opcional y propagación automática a LXC."
},
"header": {
"title": "Instalar drivers NVIDIA en el host",
"description": "Instala el driver propietario NVIDIA en un host Proxmox VE usando ProxMenux. El instalador gestiona la compatibilidad de kernel, el blacklisting de nouveau, la configuración VFIO, el servicio de persistencia y puede propagar el driver a cualquier contenedor LXC que ya tenga passthrough NVIDIA configurado.",
"description": "Instala el driver propietario NVIDIA en un host Proxmox VE usando ProxMenux. El instalador filtra las ramas mantenidas por el PCI ID de la GPU, valida la versión elegida mediante DKMS, gestiona nouveau, instala el servicio de persistencia y puede propagar el driver a contenedores LXC con passthrough NVIDIA.",
"section": "Hardware: GPUs y Coral-TPU"
},
"intro": {
"title": "Qué hace esto",
"body": "ProxMenux automatiza todo el ciclo de vida del driver NVIDIA en el host: detecta tu GPU, elige una versión de driver compatible con tu kernel en ejecución, pone <code>nouveau</code> en blacklist, descarga y ejecuta el instalador oficial <code>.run</code> de NVIDIA con DKMS, instala el servicio <code>nvidia-persistenced</code> y las reglas udev, y se ofrece a aplicar el parche NVENC opcional. Si ya tienes contenedores LXC con passthrough NVIDIA, puede actualizar las librerías userspace dentro de ellos para que su versión coincida con la del host."
"body": "ProxMenux automatiza todo el ciclo de vida del driver NVIDIA en el host: detecta tu GPU, ofrece ramas mantenidas por NVIDIA que incluyen su PCI Device ID, pone <code>nouveau</code> en blacklist, descarga y ejecuta el instalador oficial <code>.run</code> con DKMS, instala <code>nvidia-persistenced</code> y las reglas udev, y ofrece aplicar el parche NVENC opcional. La compilación DKMS es la validación final frente al kernel en ejecución. Si ya tienes contenedores LXC con passthrough NVIDIA, puede actualizar sus librerías de espacio de usuario para que coincidan con el host."
},
"who": {
"heading": "¿Para quién es esto?",
@@ -22,7 +22,7 @@
"gpuCheck": "lspci | grep -i nvidia",
"notVm": "La GPU <strong>no está asignada actualmente a una VM vía passthrough VFIO</strong>. Si lo está, el script se negará a instalar el driver del host para evitar romper la config de passthrough.",
"internet": "Acceso a internet en el host. El instalador descarga el driver desde <code>download.nvidia.com</code> y, opcionalmente, clona <code>nvidia-persistenced</code> y <code>nvidia-patch</code> desde GitHub.",
"space": "Unos <strong>2 GB de espacio libre</strong> en <code>/opt/nvidia</code> (workdir) más la RAM usada durante la instalación. Se necesita reiniciar al final."
"space": "Algo de espacio libre en <code>/opt/nvidia</code> para el instalador <code>.run</code> más la RAM usada durante el build. Al propagar a LXCs con distros no-Arch, cada contenedor necesita al menos 1.5 GB libres; ProxMenux eleva temporalmente la RAM del contenedor a 2 GB y la restaura al terminar. Se necesita reiniciar al final de la instalación del host."
},
"vmWarn": {
"title": "¿GPU asignada a una VM? Para aquí",
@@ -46,40 +46,11 @@
},
"version": {
"title": "Elegir la versión del driver",
"body1": "ProxMenux obtiene la lista de drivers disponibles de NVIDIA y <strong>filtra las versiones que no son compatibles con tu kernel en ejecución</strong>. La opción <em>Latest available</em> es casi siempre la elección correcta.",
"body2": "La matriz de compatibilidad que usa el script:",
"headerKernel": "Kernel",
"headerPve": "Versión típica de PVE",
"headerMin": "Driver NVIDIA mínimo",
"rows": [
{
"kernel": "6.17+",
"pve": "Proxmox VE 9.x",
"minCode": "580.82.07",
"minTail": " o más nuevo"
},
{
"kernel": "6.8 6.16",
"pve": "Proxmox VE 8.2+",
"minCode": "550.x",
"minTail": " o más nuevo"
},
{
"kernel": "6.2 6.7",
"pve": "Proxmox VE 8.0 8.1",
"minCode": "535.x",
"minTail": " o más nuevo"
},
{
"kernel": "5.15+",
"pve": "Proxmox VE 7.x (legacy)",
"minCode": "470.x",
"minTail": " o más nuevo"
}
],
"whyTitle": "Por qué importa el kernel",
"whyBody": "El kernel 6.17 introdujo cambios en la API interna que rompen los drivers NVIDIA más viejos. Si instalas un driver por debajo del mínimo de tu kernel, DKMS no podrá construir el módulo y la GPU no estará disponible después de reiniciar. ProxMenux filtra la lista para que no puedas elegir una versión incompatible por accidente.",
"imageAlt": "Selector de versión del driver con las versiones compatibles con el kernel, Latest available arriba"
"body1": "ProxMenux obtiene la lista de drivers disponibles de NVIDIA y acota el selector a las versiones que <strong>listan el PCI Device ID de tu GPU en la tabla de chips soportados</strong> de la rama correspondiente en <code>nvidia.com</code>. Una serie de heurísticas descartan además las builds developer / beta del CDN que aparecerían al principio. La primera entrada se etiqueta como <em>&lt;versión&gt; — Recommended</em>: prefiere la cabeza de la rama del driver ya instalado en el host (bugfix in place), en su defecto la cabeza de la Production Branch actual, y en último caso el número más alto entre los filtrados.",
"body2": "Si el driver actualmente instalado fue parcheado con keylase (NVENC), el selector se acota automáticamente a versiones aún cubiertas por la tabla de parches, para que aplicar <em>Reinstalar / actualizar</em> sin perder el parche sea un click.",
"whyTitle": "Cómo se valida la compatibilidad con el kernel",
"whyBody": "La lista se filtra por el mantenimiento de la rama NVIDIA y el soporte del PCI ID de la GPU, no mediante una matriz fija de kernel y driver. Después de elegir, DKMS compila el módulo contra el kernel en ejecución. Si la compilación falla, la instalación no se considera válida; elige otra rama mantenida si NVIDIA todavía no ha adaptado esa versión a tu kernel.",
"imageAlt": "Selector de versiones con ramas NVIDIA compatibles con la GPU y la opción recomendada en primer lugar"
},
"uninstall": {
"title": "Desinstalación limpia (solo si reinstalas)",
@@ -90,8 +61,8 @@
"body": "Tras una única confirmación, el script:",
"items": [
"Instala <code>pve-headers-$(uname -r)</code> (o <code>proxmox-headers-$(uname -r)</code>), <code>build-essential</code> y <code>dkms</code>.",
"Crea <code>/etc/modprobe.d/nouveau-blacklist.conf</code> poniendo <code>nouveau</code> en blacklist e intenta descargarlo inmediatamente.",
"Escribe <code>/etc/modules-load.d/nvidia-vfio.conf</code> con <code>vfio</code>, <code>vfio_pci</code>, <code>nvidia</code>, <code>nvidia_uvm</code> y módulos relacionados."
"Crea el archivo propiedad de ProxMenux <code>/etc/modprobe.d/proxmenux-nouveau-blacklist.conf</code> con <code>blacklist nouveau</code> y <code>options nouveau modeset=0</code>, registra si añadió la línea complementaria a <code>blacklist.conf</code> e intenta descargar el módulo inmediatamente.",
"Escribe <code>/etc/modules-load.d/nvidia-vfio.conf</code> con <code>nvidia</code> y <code>nvidia_uvm</code> para que los módulos se carguen pronto en el arranque."
]
},
"download": {
@@ -112,7 +83,7 @@
"propagate": {
"title": "Opcional: propagar el driver a los contenedores LXC",
"body1": "Si la pantalla de resumen listó contenedores con passthrough NVIDIA, ProxMenux ahora se ofrece a actualizar las librerías userspace dentro de cada uno para que coincidan con el host. El módulo de kernel del host y el userspace del contenedor <strong>deben ser exactamente la misma versión</strong> — si no <code>nvidia-smi</code> dentro del contenedor fallará con un error \"version mismatch\".",
"body2": "La actualización es consciente de la distro: <code>apk</code> para Alpine, <code>pacman</code> para Arch y el mismo instalador <code>.run</code> (con <code>--no-kernel-modules --no-dkms --no-install-compat32-libs</code>) para Debian/Ubuntu y otras distros. Eleva temporalmente la RAM del contenedor a 2 GB si es menor, ejecuta la instalación y luego restaura la RAM original.",
"body2": "La actualización es consciente de la distro. Para Debian / Ubuntu y otras distros glibc, el mismo instalador <code>.run</code> (con <code>--no-kernel-modules --no-dkms --no-install-compat32-libs</code>) se copia al contenedor y se ejecuta; la RAM del contenedor se eleva temporalmente a 2 GB si es menor y se restaura al terminar. Para <strong>Arch, Manjaro y EndeavourOS</strong> la actualización es un <code>pacman -Syu nvidia-utils</code> pineado a la rama del driver del host. <strong>Alpine</strong> usa un camino distinto — se extrae el <code>.run</code> en el host, solo las librerías userspace se empaquetan como tarball y se envían con <code>pct push</code>, luego se instalan los shims <code>gcompat</code> + <code>binutils</code> vía <code>apk</code> y se recrean los symlinks SONAME con <code>readelf</code> para que las librerías glibc-linked carguen correctamente sobre musl.",
"imageAlt": "Prompt listando los LXCs con passthrough NVIDIA y la versión actual del driver, con Sí/No para actualizarlos todos"
},
"reboot": {
@@ -122,33 +93,32 @@
},
"reinstallUninstall": {
"heading": "Reinstalar o desinstalar",
"intro": "Cuando el instalador detecta que ya hay un driver NVIDIA cargado (<code>nvidia-smi</code> devuelve una versión), no reinstala silenciosamente encima. En lugar de eso muestra un menú de acciones para que elijas qué hacer.",
"intro": "Cuando el instalador detecta que el módulo de kernel <code>nvidia</code> está cargado actualmente y <code>nvidia-smi</code> devuelve una versión, no reinstala silenciosamente encima. En lugar de eso muestra un menú de acciones para que elijas qué hacer. (Los binarios presentes en disco pero el módulo no cargado no cuentan como instalados — el módulo tiene que estar activo.)",
"imageAlt": "Menú de acciones NVIDIA ofrecido cuando ya hay un driver instalado — dos opciones: Reinstalar / actualizar driver, o Desinstalar el driver NVIDIA completamente",
"imageCaption": "El menú de acciones solo aparece cuando hay un driver NVIDIA activo actualmente en el host.",
"reinstallHeading": "Reinstalar / actualizar",
"reinstallBody": "Continúa con el flujo normal de instalación pero, antes de descargar nada, ejecuta una eliminación limpia del driver actual (apt purge + entradas DKMS quitadas + módulos residuales descargados). Esta es la ruta segura para aplicar una versión más nueva del driver, cambiar de rama cuando el kernel lo exige o recuperarte de un estado medio roto. Los prompts de propagación LXC y parche NVENC se vuelven a ejecutar al final.",
"reinstallBody": "Continúa con el flujo normal de instalación pero, antes de descargar nada, ejecuta una eliminación limpia del driver actual (apt purge + entradas DKMS eliminadas + módulos residuales descargados). Es la ruta segura para aplicar una versión más nueva de la misma rama, elegir otra rama mantenida cuando sea necesario o recuperarse de un estado incompleto. Al final vuelven a mostrarse las opciones de propagación LXC y del parche NVENC.",
"uninstallHeading": "Desinstalar — qué se elimina",
"uninstallIntro": "Confirma primero con un diálogo sí/no. Luego ejecuta un rollback completo e idempotente:",
"uninstallItems": [
"Para y deshabilita <code>nvidia-persistenced</code>, descarga los módulos de kernel (<code>nvidia_uvm</code>, <code>nvidia_drm</code>, <code>nvidia_modeset</code>, <code>nvidia</code>) — cualquier contenedor LXC con passthrough NVIDIA será cortado limpiamente.",
"Ejecuta <code>apt purge</code> sobre cada paquete NVIDIA, quita el árbol fuente DKMS y la caché del instalador .run de <code>/opt/nvidia</code>.",
"Revierte el blacklist de nouveau (<code>/etc/modprobe.d/nouveau-blacklist.conf</code>) y la config de modules-load (<code>/etc/modules-load.d/nvidia-vfio.conf</code>) para que nouveau pueda volver si quieres gráficos genéricos otra vez.",
"Quita las reglas udev (<code>/etc/udev/rules.d/70-nvidia.rules</code>) y el archivo de estado del parche NVENC (si el parche keylase se aplicó antes).",
"Reconstruye <code>initramfs</code> para todos los kernels y pide reiniciar para finalizar (el desblacklisting de nouveau solo surte efecto tras reiniciar)."
"Ejecuta primero <code>nvidia-uninstall --silent</code> (el reverso del instalador <code>.run</code>), luego para y deshabilita <code>nvidia-persistenced</code> y <code>nvidia-powerd</code>, y descarga los módulos de kernel (<code>nvidia_uvm</code>, <code>nvidia_drm</code>, <code>nvidia_modeset</code>, <code>nvidia</code>) — cualquier contenedor LXC con passthrough NVIDIA será cortado limpiamente.",
"Ejecuta <code>apt purge</code> sobre <code>nvidia-*</code>, <code>libnvidia-*</code>, <code>cuda-*</code> y <code>libcudnn*</code>, quita el árbol fuente DKMS y la caché del instalador .run de <code>/opt/nvidia</code>.",
"Quita la configuración de carga de módulos (<code>/etc/modules-load.d/nvidia-vfio.conf</code>) y las entradas de blacklist de nouveau creadas por ProxMenux. También migra y elimina los archivos antiguos de ProxMenux con las dos líneas conocidas; conserva los archivos modificados o ajenos del administrador.",
"Quita las reglas udev (<code>/etc/udev/rules.d/70-nvidia.rules</code>) y limpia el estado del parche NVENC (un campo del registro de instalaciones gestionadas de ProxMenux, marcado como <em>removed</em> — no hay fichero aparte que borrar).",
"Reconstruye <code>initramfs</code> para todos los kernels, ejecuta <code>proxmox-boot-tool refresh</code> en hosts con systemd-boot, y pide reiniciar para finalizar."
],
"lxcWarnTitle": "Contenedores LXC con passthrough NVIDIA",
"lxcWarnBody": "Quitar el driver del host invalida las rutas de dispositivo y las librerías CUDA mapeadas a cualquier LXC con passthrough NVIDIA. Planifica la operación en una ventana de mantenimiento si Frigate / Plex / Jellyfin / Ollama (o cualquier otra cosa) depende de ello."
},
"updates": {
"heading": "Notificaciones de actualización",
"body": "El driver NVIDIA instalado se rastrea en el registro de instalaciones gestionadas de ProxMenux. En el arranque y cada 24h el Monitor comprueba el listado upstream en <code>download.nvidia.com/XFree86/Linux-x86_64/</code> contra la versión que reporta <code>nvidia-smi</code>, y dispara una notificación cuando hay una nueva versión compatible disponible.",
"kindsHeading": "Dos tipos de mensaje de actualización",
"body": "El driver NVIDIA instalado se rastrea en el registro de instalaciones gestionadas de ProxMenux. En el arranque y cada 24 horas, el Monitor compara el listado de <code>download.nvidia.com/XFree86/Linux-x86_64/</code> con la versión que devuelve <code>nvidia-smi</code> y solo avisa cuando existe una versión de mantenimiento más nueva en la rama instalada.",
"kindsHeading": "Mensaje de actualización",
"kindsItems": [
"<strong>Parche de la misma rama.</strong> Una release de mantenimiento más nueva en tu rama actual de driver (p. ej. instalado 580.65.06 → disponible 580.105.08). Bug fixes y parches de seguridad sin cambiar de rama.",
"<strong>Subida de rama requerida por el kernel.</strong> Si el host está en un kernel que ya no soporta tu rama actual (p. ej. subiste el kernel del host a 6.17 mientras seguías en el driver 570.x), el mensaje lo dice explícitamente y recomienda la rama mínima compatible con el kernel — la misma matriz que usa el instalador para filtrar el menú de versión."
"<strong>Mantenimiento de la misma rama.</strong> Una versión más reciente dentro de la rama instalada (por ejemplo, 580.65.06 instalada → 580.105.08 disponible). El Monitor no deduce compatibilidad entre ramas y kernels."
],
"antiTitle": "Anti-cascada por diseño",
"antiBody": "Una notificación por versión upstream distinta, nunca en cada escaneo de 24h. El mensaje de subida de rama en particular solo se dispara cuando realmente necesitas cambiar — hasta entonces el tracker de la misma rama se queda silenciado.",
"antiBody": "Una notificación por cada versión nueva distinta, nunca en cada comprobación de 24 horas. Si no hay una versión más reciente en la rama instalada, el seguimiento permanece silencioso.",
"applyTitle": "Aplicar la actualización",
"applyBody": "El Monitor no autoaplica actualizaciones de driver — reinstalar el driver NVIDIA siempre necesita un reinicio. Abre la misma entrada del instalador descrita arriba, elige <strong>Reinstall / update</strong> y la nueva versión se descarga, el módulo DKMS se reconstruye contra el kernel en ejecución y se pide el reinicio al final."
},
@@ -161,7 +131,7 @@
"troubleshoot": {
"heading": "Solución de problemas",
"smiFailTitle": "`nvidia-smi` dice 'NVIDIA-SMI has failed'",
"smiFailBody": "Casi siempre es <strong>nouveau</strong> aún cargado o un <strong>mismatch de headers del kernel</strong>. Tras reiniciar, ejecuta <code>lsmod | grep nouveau</code> — si devuelve algo, el blacklist no surtió efecto (comprueba que <code>/etc/modprobe.d/nouveau-blacklist.conf</code> existe y reconstruye initramfs con <code>update-initramfs -u -k all</code>, luego reinicia). Si nouveau no está, comprueba <code>dmesg | grep -i nvidia</code> los errores de build DKMS suelen significar que tus headers de kernel no coinciden con el kernel en ejecución; reinstálalos con <code>apt install --reinstall pve-headers-$(uname -r)</code>.",
"smiFailBody": "Casi siempre se debe a que <strong>nouveau</strong> sigue cargado o a que las <strong>cabeceras no coinciden con el kernel</strong>. Tras reiniciar, ejecuta <code>lsmod | grep nouveau</code>. Si devuelve algo, comprueba <code>/etc/modprobe.d/proxmenux-nouveau-blacklist.conf</code>, reconstruye initramfs con <code>update-initramfs -u -k all</code> y reinicia. Si nouveau no aparece, revisa <code>dmesg | grep -i nvidia</code>; los errores de DKMS suelen indicar que faltan las cabeceras del kernel en ejecución.",
"lxcMissTitle": "El contenedor LXC no ve la GPU tras actualizar el host",
"lxcMissBody": "Las librerías userspace del contenedor están atascadas en la versión anterior del driver. O vuelves a ejecutar el instalador NVIDIA y aceptas el prompt de propagación LXC, o instalas la misma versión del driver manualmente dentro del contenedor con <code>--no-kernel-modules</code>.",
"logTitle": "Revisa el log de instalación",
@@ -49,7 +49,7 @@
"prereqs": {
"title": "Antes de empezar",
"assigned": "<strong>Una GPU ya asignada</strong> — o bien en una VM vía VFIO o adjuntada al menos a un LXC. Si aún no la has asignado, empieza desde Añadir GPU a VM / LXC en su lugar.",
"iommu": "<strong>IOMMU habilitado en el host</strong> — solo estrictamente necesario al cambiar <em>a</em> modo VM, pero vale la pena tenerlo en cualquier caso. El script avisa si falta el parámetro del kernel.",
"iommu": "<strong>IOMMU habilitado en el host</strong> — solo estrictamente necesario al cambiar <em>a</em> modo VM, pero vale la pena tenerlo en cualquier caso. Si falta el parámetro del kernel, el script lo añade automáticamente al command line de arranque (<code>intel_iommu=on iommu=pt</code> o <code>amd_iommu=on</code>, vía <code>proxmox-boot-tool refresh</code> en systemd-boot o <code>update-grub</code> en GRUB) y lo incluye en el aviso de reinicio final.",
"iommuCheck": "dmesg | grep -i 'IOMMU enabled' | head -1",
"reboot": "<strong>Asume un reinicio.</strong> Cambiar bindings de GPU a nivel de kernel significa que el host regenera initramfs y reinicias para aplicar. El script lo pide al final.",
"knowList": "<strong>Saber qué VMs / LXCs están usando la GPU.</strong> El script las encontrará y preguntará qué hacer con cada una, pero es más rápido si ya conoces la lista."
+1 -1
View File
@@ -107,7 +107,7 @@
},
{
"title": "Notificaciones",
"description": "Telegram, Discord, Email, Gotify y Apprise (multicanal) con deduplicación, cooldown, agregación de ráfagas, horas silenciosas y un historial completo.",
"description": "Telegram, Discord, Email, Gotify, Pushover y Apprise (multicanal), con deduplicación, cooldown, agregación de ráfagas, horas silenciosas e historial completo.",
"icon": "Bell",
"href": "/docs/monitor/notifications"
},
@@ -254,8 +254,8 @@
"items": [
"<strong>Los watchers</strong> empujan eventos: <code>JournalWatcher</code> sigue el journal del sistema, <code>TaskWatcher</code> hace polling de la lista de tareas Proxmox, <code>ProxmoxHookWatcher</code> reacciona a hooks de backup / replicación / snapshot y <code>PollingCollector</code> gestiona fuentes de datos lentas.",
"<strong>Las templates</strong> convierten un evento en un par (título, cuerpo). La misma template puede pasar por el proveedor de IA configurado (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter) para producir una reescritura en lenguaje natural; ambas versiones se guardan en <code>notification_history</code>.",
"<strong>Los canales</strong> entregan los mensajes: Telegram, Discord, Email, Gotify y Apprise (multicanal). Cada uno está implementado en <code>notification_channels.py</code> detrás de la misma interfaz <code>create_channel()</code> / <code>send()</code>, así que añadir un canal nuevo es una sola clase.",
"<strong>Cifrado.</strong> Los ajustes sensibles (<code>telegram.token</code>, <code>discord.webhook_url</code>, <code>ai_api_key_*</code>, <code>email.password</code>) se cifran con XOR usando la clave en <code>.notification_key</code> antes de escribirse en la DB. El texto plano nunca toca disco."
"<strong>Los canales</strong> entregan los mensajes: Telegram, Discord, Email, Gotify, Pushover y Apprise (multicanal). Cada uno está implementado en <code>notification_channels.py</code> mediante la misma interfaz <code>create_channel()</code> / <code>send()</code>.",
"<strong>Cifrado.</strong> Los ajustes sensibles (<code>telegram.bot_token</code>, <code>discord.webhook_url</code>, <code>pushover.user_key</code>, <code>pushover.api_token</code>, <code>ai_api_key_*</code>, <code>email.password</code>) se cifran con la clave de <code>.notification_key</code> antes de escribirse en la base de datos y aparecen ocultos en la interfaz."
],
"linksFooter": "Los toggles por evento, los overrides por canal y la configuración de IA se exponen en <notifLink>Settings → Notifications</notifLink> y <aiLink>Settings → AI Assistant</aiLink>."
},
@@ -25,6 +25,7 @@
"mechanisms": {
"heading": "Cómo se selecciona el método",
"lead": "La vía integrada de Proxmox VE Helper-Scripts sigue el mecanismo oficial <helper>update-apps</helper>. El resto de instalaciones usa el método de paquetes, Docker o el comando personalizado correspondiente.",
"officialReference": "Referencia oficial: la <helper>documentación de update-apps de Proxmox VE Helper-Scripts</helper> explica los modos interactivo y desatendido, las copias de seguridad, la simulación, los recursos temporales de compilación, los registros y los códigos de salida.",
"colSource": "Origen",
"colAction": "Acción mostrada",
"colNotes": "Qué se ejecuta",
+1 -1
View File
@@ -105,7 +105,7 @@
"body1": "Dentro del panel, el <strong>Health Monitor</strong> se ejecuta continuamente en segundo plano y produce un flujo estructurado de eventos: alta temperatura de CPU, avisos SMART de discos, degradación de pools ZFS, OOM kills, fallos de VM/CT, incidentes de seguridad, etc. Cada evento tiene una categoría, una severidad (INFO / WARNING / CRITICAL) y un <code>error_key</code> estable para que los duplicados se colapsen en vez de inundar la pantalla.",
"feedsIntro": "Los eventos alimentan tres cosas al mismo tiempo:",
"feedsHealth": "La <strong>vista del Health Monitor</strong> en el panel (listas de activas + descartadas).",
"feedsChannels": "El <strong>motor de notificaciones</strong> Telegram, Discord, Email, Gotify y Apprise (multicanal). Cada canal se configura independientemente y se pueden silenciar categorías por evento.",
"feedsChannels": "El <strong>motor de notificaciones</strong>: Telegram, Discord, Email, Gotify, Pushover y Apprise (multicanal). Cada canal se configura de forma independiente y permite silenciar categorías por evento.",
"feedsAI": "El <strong>asistente IA</strong> opcional — cuando está activado, el proveedor configurado (OpenAI, Anthropic, Gemini, Groq, Ollama u OpenRouter) explica los eventos entrantes en lenguaje claro y propone próximos pasos si está activado en los ajustes de la IA.",
"suppressionTitle": "Supresión en vez de silenciar todo",
"suppressionBody": "Cada categoría tiene su propia <em>duración de supresión</em>: una vez que descartas una alerta, la misma alerta se silencia durante esa ventana (24 horas por defecto, configurable por categoría hasta permanente). Las escalaciones reales — p. ej. la temperatura de CPU cruzando el umbral crítico — siempre se vuelven a disparar independientemente de la supresión."
+30 -14
View File
@@ -1,15 +1,15 @@
{
"meta": {
"title": "Notificaciones de Proxmox — Telegram, Discord, Email, Gotify, Apprise | ProxMenux Monitor",
"description": "Envía notificaciones de Proxmox VE a Telegram, Discord, Email, Gotify y ~80 servicios extra vía Apprise. ProxMenux Monitor convierte eventos del Monitor de salud, el journal watcher y el webhook de Proxmox VE en mensajes ricos con deduplicación, cooldown, agregación de ráfagas, una reescritura con IA opcional y un historial completo.",
"ogTitle": "Notificaciones de Proxmox — Telegram, Discord, Email, Gotify, Apprise",
"ogDescription": "Envía alertas de Proxmox VE a Telegram, Discord, Email, Gotify y ~80 servicios extra vía Apprise — con deduplicación, cooldown, agregación de ráfagas y una reescritura con IA opcional.",
"title": "Notificaciones de Proxmox — Telegram, Discord, Email, Gotify, Pushover, Apprise | ProxMenux Monitor",
"description": "Envía notificaciones de Proxmox VE a Telegram, Discord, Email, Gotify, Pushover y unos 80 servicios adicionales mediante Apprise. ProxMenux Monitor convierte los eventos del monitor de salud, el journal watcher y el webhook de Proxmox VE en mensajes enriquecidos con deduplicación, cooldown, agregación de ráfagas, una reescritura opcional con IA y un historial completo.",
"ogTitle": "Notificaciones de Proxmox — Telegram, Discord, Email, Gotify, Pushover, Apprise",
"ogDescription": "Envía alertas de Proxmox VE a Telegram, Discord, Email, Gotify, Pushover y unos 80 servicios adicionales mediante Apprise.",
"twitterTitle": "Notificaciones de Proxmox | ProxMenux Monitor",
"twitterDescription": "Envía alertas de Proxmox VE a Telegram, Discord, Email, Gotify y ~80 servicios extra vía Apprise."
"twitterDescription": "Envía alertas de Proxmox VE a Telegram, Discord, Email, Gotify, Pushover y unos 80 servicios adicionales mediante Apprise."
},
"header": {
"title": "Notifications",
"description": "El motor de fan-out que toma eventos de cada colector dentro del Monitor y los entrega a Telegram, Discord, Email, Gotify y ~80 servicios extra vía Apprise con deduplicación, cooldown, agregación de ráfagas, toggles por evento y por canal, un reescritor de IA opcional y un historial consultable.",
"description": "El motor de distribución que recibe eventos de todos los colectores del Monitor y los entrega a Telegram, Discord, Email, Gotify, Pushover y unos 80 servicios adicionales mediante Apprise, con deduplicación, cooldown, agregación de ráfagas, controles por evento y por canal, reescritura opcional con IA e historial consultable.",
"section": "ProxMenux Monitor"
},
"intro": {
@@ -29,7 +29,7 @@
"aiLabel": "Reescritura IA (opc.)",
"aiDetail": "OpenAI / Anthropic\nGemini / Groq\nOpenRouter / Ollama\n(off por defecto)",
"channelsLabel": "Canales",
"channelsDetail": "Telegram\nDiscord\nEmail (SMTP)\nGotify\nApprise (~80 servicios)"
"channelsDetail": "Telegram\nDiscord\nEmail (SMTP)\nGotify\nPushover\nApprise (~80 servicios)"
}
},
"enabling": {
@@ -43,8 +43,8 @@
"Registra un destino webhook de Proxmox VE en <code>/etc/pve/notifications.cfg</code> apuntando a <code>POST http://127.0.0.1:8008/api/notifications/webhook</code>. Desde este momento, todo lo que Proxmox VE emite por sí mismo (HA, replicación, vzdump desde la GUI) fluye a la misma pipeline que los eventos propios del Monitor. Mira <pvelink>Integración del webhook de PVE</pvelink> más abajo para la mecánica completa.",
"Arranca el hilo de fondo de despacho. El hilo hace polling de la cola de eventos y camina cada evento por la pipeline diagramada arriba."
],
"activeAlt": "Tarjeta Notifications tras activar — badge Active, pestañas de canal (Telegram, Gotify, Discord, Email), campo Display Name y sección colapsable Advanced AI Enhancement",
"activeCaption": "Estado Active — pestañas de canal arriba (Telegram / Gotify / Discord / Email), el campo Display Name, la lista de categorías por canal y la sección colapsable <em>Advanced: AI Enhancement</em>."
"activeAlt": "Tarjeta de notificaciones activada con pestañas de canales, nombre visible y opciones avanzadas de IA",
"activeCaption": "Estado activo: pestañas Telegram, Gotify, Discord, Email, Pushover y Apprise, nombre visible, categorías por canal y opciones avanzadas de IA."
},
"sources": {
"heading": "Fuentes de eventos",
@@ -89,9 +89,9 @@
},
"channels": {
"heading": "Walkthroughs de canales",
"intro": "Cinco canales están actualmente soportados: Telegram, Discord, Gotify, Email (SMTP) y Apprise. Los primeros cuatro son nativos — cada uno tiene su propia pestaña dentro del panel Notifications con un enlace <em>+ setup guide</em> que abre un modal in-app. Apprise es un hub genérico que añade ~80 servicios adicionales (ntfy, Matrix, Pushover, Slack, Teams, Pushbullet, AWS SNS, Mattermost…) a través de un único campo de URL. Están todos documentados paso a paso abajo.",
"intro": "Actualmente se admiten seis canales: Telegram, Discord, Gotify, Email (SMTP), Pushover y Apprise. Los cinco primeros son integraciones nativas con sus propios campos de configuración. Apprise funciona como un concentrador genérico que añade unos 80 servicios adicionales (ntfy, Matrix, Slack, Teams, Pushbullet, AWS SNS, Mattermost…) mediante una única URL. Todos están documentados paso a paso a continuación.",
"credsTitle": "Dónde viven las credenciales",
"credsBody": "Los tokens, URLs de webhook y contraseñas SMTP se guardan localmente en la base de datos SQLite del Monitor bajo <code>/usr/local/share/proxmenux/</code>. Nunca salen del host excepto para llegar a sus respectivos servicios. Un backup de ese directorio basta para recuperar los canales configurados."
"credsBody": "Los tokens, las claves, las URL de webhook y las contraseñas SMTP se guardan localmente en la base de datos SQLite del Monitor dentro de <code>/usr/local/share/proxmenux/</code>. Los valores sensibles están protegidos y se ocultan en la interfaz. Solo salen del host para comunicarse con el servicio correspondiente. Una copia de ese directorio permite recuperar los canales configurados."
},
"telegram": {
"heading": "Telegram",
@@ -176,12 +176,28 @@
"relayTitle": "Relay SMTP autoalojado",
"relayBody": "Si corres tu propio relay SMTP (Postfix, msmtp, etc.) en la LAN, apunta el Monitor a él y saltea el baile de app-password por completo. El relay maneja la auth upstream y el Monitor envía en cleartext sobre una red de confianza."
},
"pushover": {
"heading": "Pushover",
"intro": "Pushover es un servicio de notificaciones push con aplicaciones oficiales para iOS, Android y navegadores de escritorio. El canal específico de ProxMenux se comunica directamente con la <a>API de Pushover</a>, por lo que no necesita una URL de Apprise.",
"stepsTitle": "Configuración",
"steps": [
"Crea una <a>cuenta de Pushover</a>, instala la aplicación oficial en los dispositivos que recibirán las alertas e inicia sesión.",
"Copia la <em>User Key</em> que aparece en el panel de Pushover. También puedes usar una clave de grupo si varias personas o dispositivos deben recibir la misma alerta.",
"Abre <a>Create an Application/API Token</a>, crea una aplicación llamada <em>ProxMenux</em> y copia su token API de 30 caracteres.",
"En <em>Ajustes → Notificaciones → Pushover</em>, pega la clave de usuario o grupo y el token API de la aplicación. Los campos de dispositivo y sonido son opcionales.",
"Guarda los ajustes y pulsa <em>Enviar prueba</em>. La aplicación Pushover debería recibir el mensaje inmediatamente."
],
"priorityTitle": "Asignación de prioridad",
"priorityBody": "Las notificaciones normales de ProxMenux usan la prioridad 0 de Pushover. Si activas <strong>Prioridad alta para alertas críticas</strong>, los eventos CRÍTICOS usan la prioridad 1 para destacar e ignorar las horas de silencio configuradas por el usuario en Pushover. ProxMenux no usa la prioridad de emergencia 2, que exige notificaciones repetidas y una confirmación mediante callback.",
"secretTitle": "Protege ambos valores",
"secretBody": "Tanto la clave de usuario o grupo como el token API de la aplicación autorizan el envío de mensajes. ProxMenux los almacena como secretos protegidos y los oculta en la interfaz; no publiques ninguno de los dos en capturas ni registros de soporte."
},
"apprise": {
"heading": "Apprise (hub genérico para ~80 servicios)",
"intro": "Apprise es una librería de notificaciones de código abierto que habla el protocolo de unos 80 servicios distintos a través de un único formato de URL. Añadirlo como un canal más dentro del Monitor significa que puedes entregar alertas a servicios que no tienen una pestaña dedicada — ntfy, Matrix, Pushover, Slack, Microsoft Teams, Mattermost, Pushbullet, AWS SNS, Pushsafer, Rocket.Chat, Signal API y muchos otros — sin que ProxMenux tenga que implementar cada integración por separado.",
"listIntro": "La lista completa de servicios soportados y el formato exacto de URL para cada uno vive en la wiki oficial de Apprise:",
"intro": "Apprise es una biblioteca de notificaciones de código abierto compatible con unos 80 servicios mediante un único formato de URL. Permite enviar alertas a servicios sin pestaña propia, como ntfy, Matrix, Slack, Microsoft Teams, Mattermost, Pushbullet, AWS SNS, Pushsafer, Rocket.Chat o Signal API. Pushover también puede utilizarse mediante Apprise, aunque su pestaña específica es más sencilla para un único destino Pushover.",
"listIntro": "La lista completa de servicios compatibles y el formato exacto de cada URL están disponibles en la documentación oficial de Apprise:",
"listItems": [
"<a>github.com/caronc/apprise/wiki</a> — índice completo de servicios soportados.",
"<a>Documentación de servicios de Apprise</a> — índice completo de servicios compatibles.",
"<a>URL basics</a> — cómo se estructuran las URLs de Apprise."
],
"stepsTitle": "Pasos",
@@ -1,13 +1,13 @@
{
"meta": {
"title": "Script Automatizado post-instalación | ProxMenux Documentation",
"description": "El script Automatizado post-instalación de ProxMenux aplica un conjunto curado de 13 optimizaciones seguras y conscientes del hardware a un host de Proxmox VE recién instalado, sin preguntas. Cada cambio queda registrado para revertirlo después vía Uninstall Optimizations.",
"description": "El script Automatizado post-instalación de ProxMenux aplica un conjunto seleccionado de 14 optimizaciones seguras y adaptadas al hardware a un host Proxmox VE recién instalado, sin preguntas. Los cambios de configuración reversibles quedan registrados para restaurarlos después.",
"ogTitle": "Script Automatizado post-instalación | ProxMenux Documentation",
"ogDescription": "13 optimizaciones curadas aplicadas a un host de Proxmox VE recién instalado sin preguntas. Consciente del hardware (autodetección SSD/NVMe) y totalmente reversible."
"ogDescription": "14 optimizaciones aplicadas a un host Proxmox VE recién instalado sin preguntas. Adaptadas al hardware y con los cambios reversibles registrados."
},
"header": {
"title": "Script Automatizado post-instalación",
"description": "Un clic, sin preguntas ProxMenux aplica un conjunto curado de 13 optimizaciones seguras de las que se beneficia casi cualquier host Proxmox. Cada cambio queda registrado en el JSON de herramientas para que puedas deshacer cualquiera de ellos más tarde desde Uninstall Optimizations.",
"description": "Un clic, sin preguntas: ProxMenux aplica 14 optimizaciones seguras de las que se beneficia casi cualquier host Proxmox. Los cambios de configuración reversibles quedan registrados para Uninstall Optimizations; las actualizaciones de paquetes no se describen como reversibles.",
"section": "Post-Install · Automated"
},
"intro": {
@@ -55,7 +55,7 @@
},
{
"tool": "Tuning de memoria",
"what": "Establece vm.swappiness=10, dirty ratios balanceados, vm.overcommit_memory=1, vm.max_map_count=262144 y compaction proactiveness cuando es soportado.",
"what": "Establece vm.swappiness=10, dirty ratios balanceados, vm.max_map_count=262144 y compaction proactiveness cuando es soportado. La política de memory-overcommit del kernel se deja en el valor por defecto de Proxmox.",
"category": "System",
"categorySlug": "system"
},
@@ -103,7 +103,7 @@
},
{
"tool": "Nombres de interfaz persistentes",
"what": "Escribe un /etc/systemd/network/10-proxmenux-<iface>.link por NIC física (cada uno comenzando con la cabecera 'Managed by ProxMenux') que fija el MAC al nombre actual, de forma que los nombres eth0 / enp… se mantengan estables tras reinicios y al añadir nuevas NICs.",
"what": "Escribe un <code>/etc/systemd/network/10-proxmenux-&lt;iface&gt;.link</code> por NIC física (cada uno comenzando con la cabecera 'Managed by ProxMenux') que fija el MAC al nombre actual, de forma que los nombres <code>eth0</code> / <code>enp…</code> se mantengan estables tras reinicios y al añadir nuevas NICs.",
"category": "Network",
"categorySlug": "network"
}
@@ -9,7 +9,7 @@
},
"intro": {
"title": "Qué cubre esta categoría",
"body": "Cuatro opciones fundamentales que normalmente quieres en cualquier host Proxmox recién instalado: cambiar a los repositorios comunitarios sin suscripción y ejecutar un upgrade completo del sistema, autoconfigurar la zona horaria y la sincronización NTP, eliminar las descargas de idiomas de APT para ahorrar ancho de banda y disco, y elegir de una lista de 25 utilidades de sistema comunes."
"body": "Cinco opciones fundamentales que normalmente quieres en cualquier host Proxmox recién instalado: cambiar a los repositorios comunitarios sin suscripción, ejecutar un upgrade completo del sistema, autoconfigurar la zona horaria y la sincronización NTP, eliminar las descargas de idiomas de APT para ahorrar ancho de banda y disco, y elegir de una lista de 25 utilidades de sistema comunes."
},
"upgrade": {
"heading": "Actualizar y hacer upgrade del sistema",
@@ -45,7 +45,7 @@
"shortTitle": "En resumen",
"shortBody": "La opción ejecuta el exacto <code>apt update && apt full-upgrade -y</code> que Proxmox recomienda, lo envuelve con la limpieza de repos y la limpieza post-upgrade que la guía oficial también te dice que hagas, y pregunta por el reinicio al final. Mira <link>Proxmox System Update</link> — el mismo updater también está disponible como utilidad independiente en el menú principal, con el diagrama completo del proceso.",
"subTitle": "No apliques esto a un host con suscripción",
"subBody": "Si realmente tienes una suscripción de Proxmox y quieres seguir usando los repositorios enterprise, sáltate esta opción. Volver a ejecutarla desactivaría el repo enterprise y te llevaría al canal comunitario. Puedes restaurar los repos enterprise desde el menú Uninstall si cambias de opinión más tarde.",
"subBody": "Si tienes una suscripción de Proxmox y quieres seguir usando los repositorios enterprise, omite esta opción. Al ejecutarla se desactiva el repositorio enterprise y el host pasa al canal comunitario. La actualización de paquetes y la reescritura de repositorios no se presentan como reversibles en Uninstall Optimizations; restaura deliberadamente la configuración de repositorios si más adelante necesitas cambiar de canal.",
"safetyTitle": "Comprobación de seguridad post-update",
"safetyBody": "Tras el upgrade, el script comprueba si hay discos con metadatos PV (Physical Volume) obsoletos — un caso límite que puede pasar cuando una VM con passthrough de disco garabatea cabeceras LVM sobre un disco en bruto. Si encuentra algo sospechoso verás un aviso sugiriendo <code>pvs</code> para inspeccionarlo. No se toma ninguna acción automáticamente."
},
@@ -209,8 +209,8 @@
}
],
"actionTitle": "Algunas de ellas en acción",
"noBulkTitle": "No hay uninstall masivo para utilidades",
"noBulkBody": "El menú Uninstall Optimizations <strong>no</strong> registra qué utilidades has instalado — solo si se aplicaron las opciones \"apt languages\", \"time sync\" y \"apt upgrade\". Para eliminar una utilidad concreta más tarde, desinstálala a mano:"
"noBulkTitle": "Solo se eliminan las utilidades instaladas por ProxMenux",
"noBulkBody": "ProxMenux registra únicamente los paquetes seleccionados que no estaban instalados antes de esta acción. Uninstall Optimizations puede purgar después esos paquetes, mientras que las utilidades que ya existían en el host permanecen intactas. La actualización general mediante APT no se registra como reversible porque los paquetes actualizados no disponen de una restauración atómica segura."
},
"related": {
"heading": "Relacionado",
@@ -1,26 +1,26 @@
{
"meta": {
"title": "Script Personalizable post-instalación | ProxMenux Documentation",
"description": "Elige exactamente qué optimizaciones aplicar a un host Proxmox VE con ProxMenux. 10 categorías, ~30 herramientas individuales, UI de checklist. Incluye todo lo que hace el script Automatizado, más funcionalidades opt-in (IOMMU, Fastfetch, Figurine, Ceph, HA, fixes de AMD…).",
"description": "Elige exactamente qué optimizaciones aplicar a un host Proxmox VE con ProxMenux. 10 categorías, ~35 herramientas individuales, UI de selección. Incluye todo lo que hace el script Automatizado, más funcionalidades opcionales (IOMMU, Fastfetch, Figurine, Ceph, HA, ajustes de AMD…).",
"ogTitle": "Script Personalizable post-instalación | ProxMenux Documentation",
"ogDescription": "10 categorías, ~30 optimizaciones individuales. Elige exactamente qué quieres en un host Proxmox VE. Totalmente reversible."
"ogDescription": "10 categorías, ~35 optimizaciones individuales. Elige exactamente qué quieres en un host Proxmox VE. Los cambios reversibles quedan registrados."
},
"header": {
"title": "Script Personalizable post-instalación",
"description": "Elige exactamente qué optimizaciones aplicar a un host Proxmox VE. ProxMenux agrupa ~30 herramientas individuales en 10 categorías, cada una con su propio diálogo de checklist. Mismo motor que el Automatizado, pero con control total sobre qué se aplica.",
"description": "Elige exactamente qué optimizaciones aplicar a un host Proxmox VE. ProxMenux agrupa ~35 herramientas individuales en 10 categorías, cada una con su propio diálogo de selección. Mismo motor que el Automatizado, pero con control total sobre qué se aplica.",
"section": "Post-Install · Customizable"
},
"intro": {
"title": "Cuándo elegir Personalizable",
"body": "Elige esta ruta cuando ya sabes qué tweaks quieres en el host — o cuáles definitivamente no quieres. El script presenta un checklist por categoría para que puedas preseleccionar, deseleccionar o mezclar optimizaciones. Cada item puede aplicarse otra vez más tarde (es idempotente) o revertirse desde <link>Uninstall Optimizations</link>."
"body": "Elige esta ruta cuando ya sabes qué ajustes quieres en el host — o cuáles definitivamente no quieres. El script presenta una selección por categoría para que puedas combinar optimizaciones. Las opciones se pueden volver a aplicar y los cambios de configuración reversibles quedan registrados para <link>Uninstall Optimizations</link>. Las actualizaciones de paquetes no se presentan como reversibles."
},
"compare": {
"heading": "Comparación con el Automatizado",
"body": "Personalizable es un superset del <link>script Automatizado</link>. Cubre las mismas 13 optimizaciones de baseline más una larga lista de opt-ins que el Automatizado se salta a propósito — cosas que solo son útiles en hardware específico (fixes de AMD), hosting específico (OVH RTM), o cargas específicas (IOMMU/VFIO, repo de Ceph, High Availability, Fastfetch, Figurine, tuning del ARC de ZFS, pigz, ZFS auto-snapshot, límites de velocidad de vzdump, Open vSwitch, TCP BBR…)."
"body": "Personalizable es un superset del <link>script Automatizado</link>. Cubre las mismas 14 optimizaciones de baseline más una larga lista de opt-ins que el Automatizado se salta a propósito — cosas que solo son útiles en hardware específico (fixes de AMD), hosting específico (OVH RTM), o cargas específicas (IOMMU/VFIO, repo de Ceph, High Availability, Fastfetch, Figurine, tuning del ARC de ZFS, pigz, ZFS auto-snapshot, límites de velocidad de vzdump, Open vSwitch, TCP BBR + TCP Fast Open, refresco del índice del PVE Appliance Manager…)."
},
"categoriesSection": {
"heading": "Las 10 categorías",
"body": "El script Personalizable agrupa optimizaciones en 10 categorías. Cada categoría tiene su propio diálogo de checklist y su propia página de documentación — abre una de las tarjetas de abajo para ver el razonamiento, los valores por defecto y los pasos de verificación por opción."
"body": "El script Personalizable agrupa optimizaciones en 10 categorías. Cada categoría tiene su propio diálogo de selección y su propia página de documentación — abre una de las tarjetas para consultar el razonamiento, los valores predeterminados y los pasos de verificación."
},
"categories": [
{
@@ -37,11 +37,11 @@
},
{
"name": "Network",
"description": "Endurece y afina la pila de red del host. Fuerza APT sobre IPv4, aplica sysctl con hardening y tuning de buffers TCP, ofrece Open vSwitch y BBR, y fija nombres persistentes de interfaces por MAC."
"description": "Endurece y afina la pila de red del host. Fuerza APT sobre IPv4, aplica sysctl con hardening y tuning de buffers TCP, ofrece Open vSwitch, TCP BBR + TCP Fast Open, y fija nombres persistentes de interfaces por MAC."
},
{
"name": "Storage",
"description": "Configura los subsistemas de almacenamiento habituales de Proxmox: ARC de ZFS, auto-snapshots y límites de velocidad de vzdump para evitar saturar el disco durante backups."
"description": "Configura los subsistemas de almacenamiento habituales de Proxmox: ARC de ZFS, auto-snapshots, ZFS autotrim para pools SSD/NVMe y límites de velocidad de vzdump para evitar saturar el disco durante backups."
},
{
"name": "Security",
@@ -61,7 +61,7 @@
},
{
"name": "Optional",
"description": "Piezas de nicho que no todo host necesita: fixes de CPU AMD, banner Fastfetch, hostname 3D con Figurine, repositorio de Ceph, servicios de Alta Disponibilidad y Log2RAM para reducir el desgaste del SSD."
"description": "Opciones que no necesita todo host: ajustes de CPU AMD, banner Fastfetch, nombre 3D con Figurine, actualización del índice de PVE Appliance Manager, repositorio Ceph, servicios de alta disponibilidad y Log2RAM para reducir el desgaste del SSD."
}
],
"mixTip": {
@@ -5,7 +5,7 @@
},
"header": {
"title": "Post-instalación: Customización",
"description": "Tweaks cosméticos y de calidad de vida para el host Proxmox. Ninguno cambia el comportamiento funcional — solo hacen la shell más agradable de usar y ocultan el aviso de suscripción en la UI web. Los tres están registrados y son reversibles desde el menú Uninstall.",
"description": "Ajustes estéticos y de comodidad para el host Proxmox. Hacen más agradable el uso de la consola y ocultan el aviso de suscripción de la interfaz web. Bashrc, MOTD y el banner de suscripción quedan registrados y son reversibles desde el menú Uninstall.",
"section": "Settings post-install Proxmox"
},
"intro": {
@@ -24,7 +24,7 @@
"heading": "Configurar banner MOTD personalizado",
"intro": "Antepone <em>\"This system is optimised by: ProxMenux\"</em> a <code>/etc/motd</code>, el mensaje mostrado tras un login SSH exitoso (encima del prompt de la shell, antes de que se ejecute cualquier script de <code>update-motd</code>). Inofensivo y puramente informativo — útil como confirmación visual rápida de que ProxMenux se ha aplicado en este host.",
"writesTitle": "Qué escribe ProxMenux",
"writesOutro": "El <code>/etc/motd</code> original se respalda en <code>/etc/motd.bak</code> en la primera aplicación. La operación es idempotente: si la línea marcador ya está presente, no se añade nada."
"writesOutro": "En la primera aplicación, ProxMenux registra si <code>/etc/motd</code> existía y conserva su contenido original en <code>/usr/local/share/proxmenux</code>. La operación es idempotente: si la línea identificadora ya está presente, no se añade otra vez. Las instalaciones antiguas que tengan <code>/etc/motd.bak</code> se migran al mismo estado reversible."
},
"banner": {
"heading": "Eliminar banner de suscripción",
@@ -43,8 +43,8 @@
"verify": {
"heading": "Verificación",
"intro": "Tras aplicar los tres:",
"reversibleTitle": "Los tres son reversibles",
"reversibleBody": "<link>Uninstall Optimizations</link> restaura <code>/root/.bashrc</code> y <code>/etc/motd</code> desde sus backups <code>.bak</code>, y o bien restaura los archivos parcheados de la UI desde el directorio de backups o reinstala <code>pve-manager</code>, <code>proxmox-widget-toolkit</code>, <code>libjs-extjs</code> y <code>libpve-http-server-perl</code> con <code>--force-confnew</code> para devolver la UI web al estado vanilla."
"reversibleTitle": "Los tres cambios de personalización quedan registrados",
"reversibleBody": "<link>Uninstall Optimizations</link> restaura <code>/root/.bashrc</code>, devuelve MOTD exactamente al contenido anterior a ProxMenux (o elimina el archivo si antes no existía) y restaura los archivos parcheados de la interfaz desde sus copias o reinstala los paquetes de Proxmox afectados cuando sea necesario."
},
"related": {
"heading": "Relacionado",
+10 -10
View File
@@ -1,7 +1,7 @@
{
"meta": {
"title": "Script post-instalación de Proxmox VE — Automatizado y personalizable | ProxMenux",
"description": "Resumen de los scripts post-instalación de ProxMenux para Proxmox VE. Ejecuta el script Automatizado para valores por defecto sensatos sin preguntas, el script Personalizable para elegir exactamente qué quieres entre 10 categorías (sistema, virtualización, red, almacenamiento, seguridad, rendimiento, opcional), o revierte cualquier cambio por completo con la opción Uninstall Optimizations.",
"description": "Resumen de los scripts post-instalación de ProxMenux para Proxmox VE. Ejecuta el script Automatizado para aplicar valores recomendados sin preguntas, usa Personalizable para elegir entre 10 categorías o restaura los cambios reversibles compatibles mediante Uninstall Optimizations.",
"ogTitle": "Script post-instalación de Proxmox VE — Automatizado y personalizable",
"ogDescription": "Aplica optimizaciones comunes post-instalación de Proxmox VE en 10 categorías — automatizadas o a la carta, con opciones reversibles.",
"twitterTitle": "Script post-instalación de Proxmox VE | ProxMenux",
@@ -9,26 +9,26 @@
},
"header": {
"title": "Scripts post-instalación",
"description": "Configura un host de Proxmox VE recién instalado con las optimizaciones post-instalación de ProxMenux. Tres rutas: ejecutar todo automáticamente, elegir lo que quieres, o revertir cualquier cambio. Todos los cambios quedan registrados.",
"description": "Configura un host de Proxmox VE recién instalado con las optimizaciones post-instalación de ProxMenux. Aplica la configuración base automáticamente, elige opciones individuales, actualiza funciones instaladas o restaura cambios reversibles compatibles. Las actualizaciones de paquetes no se presentan como reversibles.",
"section": "Settings post-install Proxmox"
},
"intro": {
"title": "Para qué sirve este menú",
"body": "Justo después de instalar Proxmox VE, hay decenas de pequeños cambios que hacen el host más rápido y más fácil de mantener — repositorios sin suscripción, límites sensatos para journald, buffers TCP razonables, almacenamiento de logs amigable con SSD, mejoras en bashrc y más. ProxMenux los automatiza todos, registra lo que cambió y te permite revertirlo."
"body": "Justo después de instalar Proxmox VE, hay decenas de pequeños cambios que hacen el host más rápido y más fácil de mantener — repositorios sin suscripción, límites sensatos para journald, buffers TCP razonables, almacenamiento de logs compatible con SSD, mejoras en bashrc y más. ProxMenux los automatiza y registra los cambios de configuración reversibles compatibles."
},
"openingMenu": {
"heading": "Abrir el menú",
"body": "Desde el menú principal de ProxMenux, selecciona <strong>Settings post-install Proxmox</strong>. Verás esto:",
"imageAlt": "Menú de scripts post-instalación con 3 opciones de ProxMenux (Automatizado / Personalizable / Uninstall) seguidas de la sección Community Scripts"
"imageAlt": "Menú de scripts post-instalación — Automatizado, Personalizable, la entrada condicional Aplicar Actualizaciones Disponibles (solo cuando hay updates pendientes) y Uninstall, seguidos de la sección Community Scripts"
},
"threeWays": {
"heading": "Tres formas de aplicar optimizaciones",
"body": "Las tres entradas de ProxMenux comparten el mismo código subyacente y el mismo registro de herramientas instaladas — solo te dan distintos niveles de control. Elige la que se ajusta a cuánto quieres decidir."
"heading": "Cuatro formas de aplicar optimizaciones",
"body": "Las cuatro entradas de ProxMenux comparten el mismo código subyacente y el mismo registro de herramientas instaladas — solo te dan distintos niveles de control. La entrada <em>Aplicar Actualizaciones Disponibles</em> solo se muestra cuando al menos una optimización instalada tiene una versión más nueva en disco que la registrada; en un host recién configurado permanece oculta."
},
"routes": [
{
"title": "Automatizado",
"description": "Un conjunto curado de 13 optimizaciones seguras y siempre útiles aplicadas en secuencia sin preguntas. Buen valor por defecto para la mayoría de usuarios.",
"description": "Un conjunto curado de 14 optimizaciones seguras y siempre útiles aplicadas en secuencia sin preguntas. Buen valor por defecto para la mayoría de usuarios.",
"bullets": [
"Repos sin suscripción + upgrade del sistema",
"Tuning de memoria, kernel y red",
@@ -39,7 +39,7 @@
},
{
"title": "Personalizable",
"description": "~30 optimizaciones individuales en 10 categorías. Eliges exactamente cuáles aplicar. Mismo motor que el Automatizado, pero con control total.",
"description": "~35 optimizaciones individuales en 10 categorías. Eliges exactamente cuáles aplicar. Mismo motor que el Automatizado, pero con control total.",
"bullets": [
"UI de checklist por categoría",
"Incluye todo lo que hace el Automatizado, más opciones opt-in (IOMMU, Fastfetch, Figurine, Ceph, HA, fixes de AMD…)",
@@ -57,10 +57,10 @@
},
{
"title": "Uninstall Optimizations",
"description": "Cada cambio hecho por cualquiera de las rutas queda registrado en un JSON, y cada optimización tiene una función inversa. Elige qué revertir y el host vuelve atrás.",
"description": "Los cambios reversibles compatibles quedan registrados en un JSON y asociados a una función de restauración. Las acciones sin reversión segura, como una actualización completa de paquetes, se excluyen deliberadamente.",
"bullets": [
"Detecta automáticamente las optimizaciones aplicadas previamente",
"La reversión restaura las configuraciones originales desde archivos de backup",
"La reversión elige el camino adecuado para cada elemento — restaura desde un backup .bak donde se hizo uno, elimina el snippet en sysctl.d donde no había nada que respaldar, o reinstala el paquete vanilla con --force-confnew (p. ej. banner de suscripción)",
"Pregunta antes de reiniciar si hace falta (VFIO, nombres persistentes, etc.)"
]
}
@@ -25,13 +25,11 @@
"remoteTitle": "Script remoto pasado por tubería a bash",
"remoteBody": "La instalación ejecuta <code>wget -qO - https://…apply.sh | bash</code>. Si el mirror de OVH se ve comprometido alguna vez, el script se ejecuta como root en tu host. Antes de activar esta opción, decide si confías más en la cadena de mirrors de OVH que en la monitorización que ganas. Para la mayoría de usuarios de home-lab o no-OVH esta opción debería quedarse simplemente apagada.",
"noOpTitle": "Actívalo solo si el host está realmente en OVH",
"noOpBody": "La opción es un no-op en servidores no-OVH, así que marcarla en un Proxmox de home-lab no rompe nada. Pero hoy hay un bug cosmético: incluso en servidores no-OVH el script imprime <em>\"Server belongs to OVH\"</em> al final, lo que puede inducir a error. Mira la nota de solución de problemas más abajo.",
"noOpBody": "La opción es un no-op en servidores no-OVH, así que marcarla en un Proxmox de home-lab no rompe nada. En un host no-OVH el script imprime <em>\"Not an OVH server, skipping RTM installation\"</em> y termina limpiamente; no se instala ningún paquete.",
"runsTitle": "Qué ejecuta ProxMenux",
"verifyTitle": "Verificación",
"verifyBody": "En un host OVH real, tras un reinicio deberías ver el <a>panel de RTM</a> en tu OVH Manager con datos en vivo del host. En el lado de Proxmox, el colector RTM es un servicio systemd — compruébalo directamente:",
"troubleTitle": "Solución de problemas",
"spuriousTitle": "\"Server belongs to OVH\" pero no estoy en OVH",
"spuriousBody": "Es una peculiaridad cosmética conocida del script actual: el mensaje de éxito se dispara fuera del condicional de detección de OVH, así que se imprime en cada ejecución. Si la instalación de RTM <em>no</em> ocurrió realmente (comprueba <code>systemctl status ovh-rtm</code> — no existirá), el mensaje es espurio y se puede ignorar. No se instaló nada en tu host.",
"revertTitle": "No reversible desde el menú Uninstall",
"revertBody": "No hay una entrada de uninstall dedicada para RTM. En un host OVH real, elimina los paquetes a mano con <code>apt purge ovh-*</code> y borra cualquier manifest puppet bajo <code>/etc/puppet/</code> que RTM haya instalado. En un host no-OVH no se instaló nada, así que no hay nada que revertir."
},
@@ -34,7 +34,7 @@
},
{
"area": "Seguridad de routing",
"settings": "<code>accept_redirects=0</code>, <code>accept_source_route=0</code>, <code>secure_redirects=0</code>, <code>send_redirects=0</code>"
"settings": "<code>accept_redirects=0</code>, <code>accept_source_route=0</code>, <code>secure_redirects=0</code>, <code>send_redirects=0</code>, <code>log_martians=0</code>"
},
{
"area": "Reverse path filter",
@@ -55,7 +55,7 @@
],
"sourceOutro": "También añade <code>source /etc/network/interfaces.d/*</code> a <code>/etc/network/interfaces</code> si no está ya presente — práctica estándar para que puedas dejar snippets modulares de interfaz sin editar el archivo principal.",
"fwbrTitle": "Ajuste automático de los bridges de firewall virtual",
"fwbrBody": "Junto al perfil sysctl, ProxMenux instala un helper en <code>/usr/local/sbin/proxmenux-fwbr-tune</code> que aplica <code>rp_filter=0</code> y <code>log_martians=0</code> a las interfaces <code>fwbr*</code> / <code>fwln*</code> / <code>fwpr*</code> / <code>tap*</code> que Proxmox crea alrededor de VMs y contenedores. El helper lo lanza la unit oneshot <code>proxmenux-fwbr-tune.service</code> al arranque y la regla <code>/etc/udev/rules.d/99-proxmenux-fwbr-tune.rules</code> en cada evento <code>net add</code> que coincida con esos prefijos — cubriendo las interfaces que Proxmox recrea al iniciar/parar VMs, en reinicios y en migraciones en vivo.",
"fwbrBody": "Junto al perfil sysctl, ProxMenux instala un helper en <code>/usr/local/sbin/proxmenux-fwbr-tune</code> que aplica <code>rp_filter=0</code> y <code>log_martians=0</code> a las interfaces <code>fwbr*</code> / <code>fwln*</code> / <code>fwpr*</code> / <code>tap*</code> que Proxmox crea alrededor de VMs y contenedores. El helper lo lanza la unit oneshot <code>proxmenux-fwbr-tune.service</code> al arranque y la regla <code>/etc/udev/rules.d/99-zz-proxmenux-fwbr-tune.rules</code> en cada evento <code>net add</code> que coincida con esos prefijos — cubriendo las interfaces que Proxmox recrea al iniciar/parar VMs, en reinicios y en migraciones en vivo. Además el helper se ejecuta inmediatamente al terminar la instalación para barrer las interfaces ya presentes.",
"rpFilterTitle": "Por qué rp_filter=2 (loose) en lugar de 1 (strict)",
"rpFilterBody": "El reverse-path filtering strict descarta paquetes cuya fuente se rutearía por una interfaz <em>distinta</em>. Es el valor por defecto correcto en una máquina cliente, pero rompe gravemente en un host Proxmox donde el tráfico de VMs a menudo llega por un bridge y sale por un uplink con rutas asimétricas. <code>rp_filter=2</code> (loose) solo descarta paquetes con fuentes verdaderamente no enrutables. Es un trade-off pragmático — ligera reducción en la detección de spoofing de IP local a cambio de no romper tu red de VMs."
},
@@ -64,8 +64,8 @@
"intro": "Instala <code>openvswitch-switch</code> + <code>openvswitch-common</code>. Estos paquetes añaden OVS como implementación alternativa de bridges a los bridges Linux estándar que Proxmox usa por defecto. La instalación por sí sola no cambia ninguna configuración de red — los bridges <code>vmbrX</code> existentes siguen funcionando. OVS pasa a estar disponible en la UI de Proxmox cuando <em>creas</em> un bridge nuevo y lo eliges del desplegable de tipo.",
"tipTitle": "Cuándo tiene sentido OVS",
"tipBody": "Considera OVS si necesitas <strong>trunking VLAN con IDs de VLAN no contiguos</strong>, <strong>LACP con LLDP en modos específicos</strong>, <strong>programación de flujos granular</strong> (OpenFlow), o interoperación con controladores SDN. Para un home lab con un par de VLANs y un único uplink LACP, los bridges Linux estándar + <code>vmbrX.VID</code> son más simples y van perfectamente bien.",
"revertTitle": "No reversible desde el menú Uninstall",
"revertBody": "La instalación de OVS no se registra en Uninstall Optimizations. Si decides que no lo quieres, elimínalo a mano — pero solo después de migrar cualquier bridge de vuelta a bridges Linux:"
"revertTitle": "Reversible desde el menú Uninstall",
"revertBody": "OVS está registrado. <link>Uninstall Optimizations</link> ejecuta <code>apt purge</code> sobre <code>openvswitch-switch</code> y <code>openvswitch-common</code>. Migra cualquier bridge OVS de vuelta a bridges Linux <em>antes</em> de desinstalar, si no las VMs sobre esos bridges pierden red en el próximo arranque. Equivalente manual:"
},
"bbr": {
"heading": "Activar TCP BBR + TCP Fast Open",
@@ -73,8 +73,8 @@
"verifyTitle": "Verificación",
"impactTitle": "El impacto depende de la carga",
"impactBody": "BBR brilla en enlaces de alta latencia o con pérdidas (replicación intercontinental, túneles VPN, clientes móviles). En una LAN entre dos máquinas en el mismo switch, la diferencia a menudo está dentro del ruido. TFO ayuda más a conexiones HTTP cortas y repetidas.",
"revertTitle": "No reversible desde el menú Uninstall",
"revertBody": "BBR/TFO no se registran. Para revertir, quita los dos archivos sysctl y recarga:"
"revertTitle": "Reversible desde el menú Uninstall",
"revertBody": "BBR/TFO están registrados. <link>Uninstall Optimizations</link> elimina los dos ficheros sysctl (<code>/etc/sysctl.d/99-tcp-bbr.conf</code> y <code>99-tcp-fastopen.conf</code>) y recarga sysctl para que el kernel vuelva a <code>cubic</code> y a <code>tcp_fastopen=1</code>. Equivalente manual:"
},
"names": {
"heading": "Nombres de interfaz (persistentes)",
+10 -15
View File
@@ -9,6 +9,7 @@
"title": "Optional Settings",
"intro": "La categoría <strong>Optional Settings</strong> ofrece funcionalidades y optimizaciones adicionales que puedes elegir aplicar a tu instalación de Proxmox VE. Estos ajustes no son esenciales pero pueden mejorar las capacidades de tu sistema en escenarios específicos.",
"available": "Funcionalidades opcionales disponibles",
"stepLabel": "Paso",
"ceph": {
"title": "Añadir soporte Ceph más reciente",
"intro": "Esta opción instala el soporte más reciente del sistema de almacenamiento Ceph para Proxmox VE. Ceph es un sistema de almacenamiento distribuido que ofrece alto rendimiento, fiabilidad y escalabilidad.",
@@ -28,9 +29,8 @@
"doesIntro": "Qué hace:",
"doesItems": [
"Detecta si hay presente una CPU AMD EPYC o Ryzen",
"Aplica el parámetro de kernel 'idle=nomwait' para prevenir crashes aleatorios",
"Configura KVM para que ignore ciertos MSRs (Model Specific Registers) y mejorar la compatibilidad con guests Windows",
"Instala el último kernel de Proxmox VE"
"Aplica el parámetro de kernel 'idle=nomwait' para prevenir crashes aleatorios (vía /etc/kernel/cmdline en hosts con systemd-boot, o /etc/default/grub en hosts con GRUB — con un .bak del original)",
"Configura KVM para que ignore ciertos MSRs (Model Specific Registers) y mejorar la compatibilidad con guests Windows"
],
"howUse": "Cómo usarlo: Estos fixes se aplican automáticamente y requieren un reinicio del sistema para surtir efecto.",
"automates": "Este ajuste automatiza los siguientes comandos:"
@@ -47,21 +47,16 @@
"howUse": "Cómo usarlo: Tras activar estos servicios, puedes configurar grupos y recursos HA en la interfaz web de Proxmox VE.",
"automates": "Este ajuste automatiza los siguientes comandos:"
},
"testing": {
"title": "Activar el repositorio testing de Proxmox",
"intro": "Esta opción activa el repositorio testing de Proxmox, dando acceso a las versiones más recientes y potencialmente inestables de los paquetes de Proxmox VE.",
"pveam": {
"title": "Actualizar el Proxmox VE Appliance Manager",
"intro": "Refresca el índice local de plantillas de contenedores que <code>pveam</code> expone en la UI de Proxmox, para que la lista de appliances disponibles esté al día la próxima vez que crees un LXC.",
"doesIntro": "Qué hace:",
"doesItems": [
"Añade el repositorio testing de Proxmox a las fuentes de paquetes del sistema",
"Crea un archivo nuevo en /etc/apt/sources.list.d/ para el repositorio testing",
"Actualiza las listas de paquetes para incluir paquetes del nuevo repositorio"
"Ejecuta <code>pveam update</code> contra los mirrors de Proxmox para bajar el catálogo actual de appliances",
"Puebla la lista de appliances que muestra la web UI al crear un contenedor"
],
"howUse": "Cómo usarlo: Tras activar este repositorio, puedes actualizar y hacer upgrade de tu sistema para obtener las últimas versiones testing de los paquetes de Proxmox VE. Úsalo con precaución ya que estas versiones pueden ser inestables.",
"manualIntro": "Para añadir el repositorio testing de Proxmox manualmente, puedes usar estos comandos:",
"noteLabel": "Nota:",
"noteBody": "$(lsb_release -cs) detecta automáticamente el codename de la versión de tu Proxmox VE (p. ej., bullseye).",
"warnLabel": "Advertencia:",
"warnBody": "Activar el repositorio testing puede provocar inestabilidad del sistema. Se recomienda solo para entornos de pruebas."
"howUse": "Cómo usarlo: ejecútalo cuando la lista de appliances en la UI se sienta desactualizada, o tras cambiar de mirror. No descarga las plantillas en sí — solo el índice del catálogo.",
"automates": "Este ajuste automatiza el siguiente comando:"
},
"fastfetch": {
"title": "Instalar y configurar Fastfetch",
@@ -25,8 +25,8 @@
],
"replacesTitle": "Esto sustituye un binario del sistema",
"replacesBody": "Sustituir <code>/bin/gzip</code> por un wrapper es inusual. Es seguro (el wrapper produce salida compatible con gzip), pero conviene saberlo: scripts que tengan paths hardcodeados, que se ejecuten dentro de chroots restrictivos o que verifiquen hashes de binarios pueden comportarse de forma distinta. El binario original se conserva como <code>/bin/gzip.original</code> para que siempre puedas dar marcha atrás.",
"revertTitle": "No reversible desde el menú Uninstall",
"revertBody": "Esta optimización se aplica desde Customizable, pero <strong>actualmente no tiene una entrada equivalente en el menú Uninstall Optimizations</strong>. Para revertirla a mano, restaura el gzip original y borra el wrapper:",
"revertTitle": "Reversible desde el menú Uninstall",
"revertBody": "Esta optimización está registrada. <link>Uninstall Optimizations</link> restaura <code>/bin/gzip.original</code> en su sitio, elimina el <code>pigzwrapper</code>, revierte las dos líneas añadidas a <code>/etc/vzdump.conf</code> y ejecuta <code>apt purge pigz</code>. Equivalente manual:",
"verifyTitle": "Verificación",
"verifyBody": "Tras aplicar, <code>gzip --version</code> debería mencionar pigz. Un benchmark rápido también muestra la diferencia de velocidad en un host multinúcleo:",
"whenTitle": "Cuándo importa más",
@@ -23,11 +23,11 @@
"nfsTitle": "No desactives esto si usas NFS",
"nfsBody": "El servidor NFS <strong>y</strong> el cliente NFS dependen de <code>rpcbind</code> para negociar los puertos que usan <code>mountd</code>, <code>statd</code>, <code>lockd</code>, etc. Si tu host Proxmox <em>exporta</em> shares NFS a otras máquinas o <em>monta</em> shares NFS desde un NAS, no apliques esta opción. Los montajes fallarán con <code>mount.nfs: rpc.statd is not running</code> o similar.",
"runsTitle": "Qué ejecuta ProxMenux",
"runsOutro": "El paquete se queda instalado (para que tú u otra herramienta podáis reactivarlo más tarde). La unidad de servicio se desactiva para que el servicio no vuelva tras un reinicio.",
"runsOutro": "El paquete permanece instalado. ProxMenux registra el estado original de activación y ejecución de rpcbind.service y rpcbind.socket, y después detiene y desactiva ambas unidades para impedir que la activación por socket vuelva a iniciar el servicio.",
"verifyTitle": "Verificación",
"verifyBody": "Tras aplicar, confirma que <code>rpcbind</code> está apagado y que nada escucha en el puerto 111:",
"reversibleTitle": "Reversible desde el menú Uninstall",
"reversibleBody": "Este cambio queda registrado. Abre <link>Uninstall Optimizations</link> y elige <em>RPC Disable</em> para restaurarlo. No se purga nada del sistema — simplemente se vuelve a activar el servicio y arranca de nuevo."
"reversibleTitle": "Restaura el estado original del servicio",
"reversibleBody": "El cambio queda registrado en <code>installed_tools.json</code>. <link>Uninstall Optimizations</link> devuelve cada unidad de rpcbind al estado habilitado o deshabilitado y activo o inactivo que tenía antes de aplicar ProxMenux; no presupone que rpcbind estuviera habilitado en todos los hosts."
},
"related": {
"heading": "Relacionado",
+20 -12
View File
@@ -9,10 +9,10 @@
},
"intro": {
"title": "Qué cubre esta categoría",
"body": "Tres optimizaciones relacionadas con almacenamiento: tunear el tamaño de la caché <strong>ARC de ZFS</strong> a una fracción sensata de la RAM del host, instalar y programar <strong>auto-snapshots de ZFS</strong>, y eliminar throttles de <strong>vzdump</strong> para que los backups corran a máxima velocidad. Las tres son independientes — elige las que se ajusten a tu setup. Una cuarta optimización cercana al almacenamiento, <link>Log2RAM</link>, reduce el desgaste del SSD/NVMe moviendo <code>/var/log</code> a una ramdisk — vive en la página Optional porque el menú Personalizable de ProxMenux la agrupa allí."
"body": "Cuatro optimizaciones relacionadas con almacenamiento: tunear el tamaño de la caché <strong>ARC de ZFS</strong> a una fracción sensata de la RAM del host, instalar y programar <strong>auto-snapshots de ZFS</strong>, activar <strong>autotrim de ZFS</strong> en pools SSD/NVMe y eliminar throttles de <strong>vzdump</strong> para que los backups corran a máxima velocidad. Las cuatro son independientes — elige las que se ajusten a tu setup. Una quinta optimización cercana al almacenamiento, <link>Log2RAM</link>, reduce el desgaste del SSD/NVMe moviendo <code>/var/log</code> a una ramdisk — vive en la página Optional porque el menú Personalizable de ProxMenux la agrupa allí."
},
"notTrackedTitle": "Ninguna de estas está en el menú Uninstall",
"notTrackedBody": "A diferencia de la mayoría de optimizaciones post-instalación, las tres opciones de Almacenamiento <strong>no se registran actualmente</strong> en el flujo Uninstall Optimizations. Si las aplicas y más tarde quieres revertir, tendrás que hacerlo a mano. Los comandos manuales de rollback se muestran bajo cada sección.",
"trackedTitle": "Las cuatro están registradas en el menú Uninstall",
"trackedBody": "Cada una de estas opciones registra un tool en <code>installed_tools.json</code>, así que aparecen en <link>Uninstall Optimizations</link>. Revertir <code>zfs_arc</code> elimina <code>/etc/modprobe.d/99-zfsarc.conf</code> y reconstruye initramfs; <code>zfs_auto_snapshot</code> revierte la programación cron y ofrece purgar el paquete; <code>zfs_autotrim</code> pone <code>autotrim=off</code> en los pools que activó; <code>vzdump_speed</code> restaura <code>/etc/vzdump.conf</code> desde el <code>.bak</code> que la instalación creó.",
"arc": {
"heading": "Optimizar el tamaño del ARC de ZFS",
"intro": "El <strong>Adaptive Replacement Cache (ARC)</strong> es la caché de lectura en memoria de ZFS. Sin tuning explícito, ZFS coge alegremente hasta la mitad de la RAM del host para sí mismo, lo que es excesivo en un host Proxmox que también necesita memoria para VMs y LXCs. Esta opción limita el ARC a una fracción sensata de la RAM total según el tamaño de la máquina.",
@@ -21,19 +21,27 @@
"headerMax": "Cap ARC",
"rows": [
{
"ram": "≤ 16 GB",
"max": "512 MiB"
"ram": "Fórmula",
"max": "RAM / 10, tope de 16 GiB, mínimo 64 MiB"
},
{
"ram": "17 32 GB",
"max": "1 GiB"
"ram": "Host de 8 GB",
"max": "≈ 819 MiB (RAM/10)"
},
{
"ram": "> 32 GB",
"max": "RAM / 8 (mínimo 512 MiB)"
"ram": "Host de 16 GB",
"max": "≈ 1,6 GiB (RAM/10)"
},
{
"ram": "Host de 64 GB",
"max": "≈ 6,4 GiB (RAM/10)"
},
{
"ram": "Host ≥ 160 GB",
"max": "16 GiB (tope)"
}
],
"after": "En un host de 64 GB, eso se traduce en un cap de 8 GB para el ARC. El archivo <code>/etc/modprobe.d/99-zfsarc.conf</code> contiene una única directiva — <code>options zfs zfs_arc_max=…</code>. El resto de parámetros del módulo (<code>zfs_arc_min</code>, prefetch/write throttle de L2ARC, timeout de TXG) se dejan en los valores por defecto de OpenZFS. Tras escribir el archivo, ProxMenux ejecuta <code>update-initramfs -u -k all</code> y, cuando corresponde, <code>proxmox-boot-tool refresh</code>, para que el cap llegue también al initramfs que usan las instalaciones con ZFS-on-root.",
"after": "El archivo <code>/etc/modprobe.d/99-zfsarc.conf</code> contiene una única directiva — <code>options zfs zfs_arc_max=…</code>. El resto de parámetros del módulo (<code>zfs_arc_min</code>, prefetch/write throttle de L2ARC, timeout de TXG) se dejan en los valores por defecto de OpenZFS. Antes de escribir, un paso de reconciliación escanea otros <code>*.conf</code> en <code>/etc/modprobe.d/</code> que definan <code>zfs_arc_min</code> / <code>zfs_arc_max</code>, los respalda a <code>/usr/local/share/proxmenux/backups/zfs_arc/</code> con un manifest, y elimina las líneas en conflicto para que solo quede activo el fichero de ProxMenux. Tras escribir el archivo, ProxMenux ejecuta <code>update-initramfs -u -k all</code> y, cuando corresponde, <code>proxmox-boot-tool refresh</code>, para que el cap llegue también al initramfs que usan las instalaciones con ZFS-on-root.",
"rebootTitle": "Requiere reinicio para surtir efecto",
"rebootBody": "Los ajustes del ARC se leen cuando se carga el módulo del kernel <code>zfs</code>. Para que el cap se aplique en hosts ZFS-on-root, ProxMenux regenera el initramfs con <code>update-initramfs -u -k all</code> y, cuando corresponde, refresca el cargador de arranque con <code>proxmox-boot-tool refresh</code>. Un reinicio sigue siendo necesario para que el módulo relea el parámetro; el flag de \"se requiere reinicio\" se activa automáticamente.",
"safeTitle": "Seguro en hosts sin ZFS",
@@ -115,8 +123,8 @@
"heading": "Aumentar la velocidad de backup de vzdump",
"intro": "Por defecto, vzdump de Proxmox throttlea los backups para proteger las VMs/CTs en ejecución de inanición de IO. En muchos setups ese throttle es más conservador de lo necesario. Esta opción quita el cap de ancho de banda y baja la prioridad de I/O para que vzdump pueda saturar el path de almacenamiento durante las ventanas de backup.",
"changedTitle": "Qué se cambia en /etc/vzdump.conf",
"noBackupTitle": "Sin backup de vzdump.conf",
"noBackupBody": "El script <strong>edita <code>/etc/vzdump.conf</code> in place</strong> sin crear un <code>.bak</code> primero. Si tenías valores custom ahí (bwlimit, ionice, compress, pigz, tmpdir, exclude-path, etc.), los cambios a <em>esas dos líneas</em> se hacen con <code>sed</code> — la config circundante se preserva — pero no hay snapshot de \"undo\". Haz un backup manual si tu config no es trivial: <code>cp /etc/vzdump.conf /etc/vzdump.conf.pre-proxmenux</code>.",
"backupTitle": "La primera ejecución crea un .bak de vzdump.conf",
"backupBody": "La primera vez que se ejecuta esta opción, ProxMenux copia <code>/etc/vzdump.conf</code> a <code>/etc/vzdump.conf.bak</code> antes de tocarlo. Las ejecuciones siguientes reutilizan ese backup y no lo sobrescriben, para que una configuración editada a mano previa a la primera aplicación se pueda recuperar. Los cambios sobre <code>bwlimit</code> y <code>ionice</code> se hacen con <code>sed</code>, y cualquier otra opción del fichero (compress, pigz, tmpdir, exclude-path, etc.) se preserva.",
"skipTitle": "Cuándo saltárselo",
"skipBody": "En un host con almacenamiento local lento y VMs sensibles a la latencia, quitar el cap de ancho de banda puede causar ralentizaciones notables durante los backups. Si previamente has puesto un <code>bwlimit</code> específico por esa razón, mantenlo — sáltate esta opción.",
"verifyTitle": "Verificación y rollback manual"
@@ -85,7 +85,7 @@
"intro": "Instala <code>kexec-tools</code> y lo conecta para que puedas reiniciar el host directamente a un kernel nuevo <em>sin pasar por el firmware BIOS/UEFI</em>. En servidores grandes donde el POST tarda 45 90 segundos, esto convierte un reinicio de una pausa para el café en unos pocos segundos de downtime.",
"installsTitle": "Qué instala ProxMenux",
"installsItems": [
"Paquete <code>kexec-tools</code> (con debconf pre-respondido para que apt no pregunte durante la instalación).",
"Paquete <code>kexec-tools</code> (debconf pre-respondido con <code>kexec-tools/load_kexec boolean false</code> para que apt no pregunte y quede desactivado el auto-load al apagar).",
"Unit systemd <code>/etc/systemd/system/kexec-pve.service</code> — carga el kernel de Proxmox y el initrd en memoria al arrancar, reutilizando la cmdline actual.",
"Un alias en <code>/root/.bash_profile</code>: <code>reboot-quick</code> → <code>systemctl kexec</code>."
],
@@ -1,16 +1,16 @@
{
"meta": {
"title": "Uninstall Optimizations | ProxMenux Documentation",
"description": "Revierte cualquier optimización post-instalación aplicada por ProxMenux. Cada cambio queda registrado en un JSON, y cada herramienta tiene un uninstaller dedicado que restaura la configuración original."
"description": "Restaura los cambios reversibles de post-instalación aplicados por ProxMenux. Las herramientas registradas usan desinstaladores específicos que conservan el estado anterior del host cuando es posible."
},
"header": {
"title": "Uninstall Optimizations",
"description": "Revierte cualquier cambio hecho por los scripts post-instalación Automatizado o Personalizable. ProxMenux mantiene un registro de cada optimización que aplicó y tiene una función de reversión dedicada para cada una — elige cuáles revertir, y el host vuelve atrás.",
"description": "Restaura los cambios reversibles realizados por los scripts de post-instalación Automatizado o Personalizable. ProxMenux registra cada optimización compatible con su función de restauración; las actualizaciones de paquetes quedan excluidas deliberadamente.",
"section": "Settings post-install Proxmox"
},
"intro": {
"title": "Por qué existe",
"body": "Cada tweak que aplican los scripts post-instalación queda <strong>registrado</strong> en un JSON en <code>/usr/local/share/proxmenux/installed_tools.json</code>. Ese registro es lo que alimenta el flujo de uninstall — te muestra la lista de optimizaciones actualmente aplicadas, y una función de reversión que restaura el estado original para cada una (desde archivos de backup cuando es posible, o reinstalando los paquetes afectados)."
"body": "Cada ajuste reversible compatible queda <strong>registrado</strong> en <code>/usr/local/share/proxmenux/installed_tools.json</code>. Ese registro alimenta el proceso de desinstalación: muestra las optimizaciones activas y ejecuta la función de restauración correspondiente. Las acciones sin una reversión segura, como una actualización completa de paquetes, no se añaden."
},
"openMenu": {
"heading": "Cómo abrirlo",
@@ -40,21 +40,21 @@
"body2": "Cada reversión registra su progreso. Los items que requieren un reinicio (VFIO, nombres de interfaz persistentes) activan un flag que dispara el prompt de reinicio al final."
},
{
"title": "Reinicio si hace falta",
"body1": "Si algún item revertido modificó parámetros del kernel, módulos del kernel, o naming de red, se te ofrecerá un reinicio. Si no, los cambios están en vivo inmediatamente."
"title": "Prompt de reinicio al final",
"body1": "Al terminar la reversión el menú muestra un prompt de reinicio. Los items que cambiaron parámetros del kernel, módulos del kernel o naming de red (VFIO, nombres de interfaz persistentes) sí necesitan el reinicio para surtir efecto; otros no lo necesitan, y el prompt es un valor por defecto de seguridad más que una comprobación por item."
}
]
},
"reversible": {
"heading": "Qué es reversible",
"intro": "Cada optimización que aplican los scripts post-instalación tiene un uninstaller correspondiente. Agrupados aquí por área:",
"intro": "Las optimizaciones reversibles registradas y sus desinstaladores correspondientes se agrupan aquí por área:",
"groups": [
{
"title": "Repositorios y APT",
"items": [
{
"tool": "Subscription Banner Removal",
"restores": "Reinstala pve-manager, proxmox-widget-toolkit, libjs-extjs y libpve-http-server-perl con force-confnew para restaurar los archivos originales de la UI. También limpia las copias .js / .gz cacheadas."
"restores": "Primero intenta restaurar los archivos de la UI desde los backups propios de ProxMenux (/usr/local/share/proxmenux/backups/proxmoxlib.js.backup.* y, cuando la UI móvil está parcheada, index.html.tpl.backup.*). Solo si un backup falta o está corrupto, cae al reinstalado de pve-manager, proxmox-widget-toolkit, libjs-extjs y libpve-http-server-perl con force-confnew. También limpia las copias .js / .gz cacheadas."
},
{
"tool": "APT Language Skip",
@@ -63,6 +63,10 @@
{
"tool": "APT IPv4 Force",
"restores": "Elimina /etc/apt/apt.conf.d/99-force-ipv4."
},
{
"tool": "Utilidades del sistema",
"restores": "Purga únicamente los paquetes seleccionados que ProxMenux registró como nuevas instalaciones. Los paquetes que ya existían antes de la acción nunca se añaden a esta lista y permanecen intactos."
}
]
},
@@ -79,7 +83,7 @@
},
{
"tool": "System Limits Increase",
"restores": "Elimina /etc/sysctl.d/99-maxwatches.conf, 99-maxkeys.conf, 99-swap.conf, 99-fs.conf y /etc/security/limits.d/99-limits.conf. Revierte los límites PAM y DefaultLimitNOFILE de systemd."
"restores": "Elimina /etc/sysctl.d/99-maxwatches.conf, 99-maxkeys.conf, 99-swap.conf, 99-fs.conf y /etc/security/limits.d/99-limits.conf. Revierte los límites PAM y DefaultLimitNOFILE de systemd, y elimina la línea ulimit -n 256000 de /root/.profile."
}
]
},
@@ -88,7 +92,15 @@
"items": [
{
"tool": "Network Optimizations",
"restores": "Elimina /etc/sysctl.d/99-network.conf junto con la unit proxmenux-fwbr-tune.service, el helper /usr/local/sbin/proxmenux-fwbr-tune y la regla /etc/udev/rules.d/99-proxmenux-fwbr-tune.rules. Recarga sysctl, systemd y el conjunto de reglas udev."
"restores": "Elimina /etc/sysctl.d/99-network.conf, 97-proxmenux-fwbr.conf y 98-proxmenux-rpf.conf junto con la unit proxmenux-fwbr-tune.service, el helper /usr/local/sbin/proxmenux-fwbr-tune y la regla /etc/udev/rules.d/99-zz-proxmenux-fwbr-tune.rules. También elimina la línea source /etc/network/interfaces.d/* de /etc/network/interfaces. Recarga sysctl, systemd y el conjunto de reglas udev."
},
{
"tool": "Open vSwitch",
"restores": "Ejecuta apt purge sobre openvswitch-switch y openvswitch-common. Migra cualquier bridge OVS de vuelta a bridges Linux antes de ejecutar este uninstall — si no las VMs sobre esos bridges pierden red en el próximo arranque."
},
{
"tool": "TCP BBR + TCP Fast Open",
"restores": "Elimina /etc/sysctl.d/99-tcp-bbr.conf y 99-tcp-fastopen.conf y recarga sysctl para que el kernel vuelva al control de congestión cubic y a tcp_fastopen=1."
},
{
"tool": "Persistent Interface Names",
@@ -124,9 +136,13 @@
"tool": "Bashrc Customization",
"restores": "Restaura /root/.bashrc desde el backup .bak. Si no existe backup, elimina el bloque PMX_CORE_BASHRC por marcadores."
},
{
"tool": "Banner MOTD personalizado",
"restores": "Restaura el contenido original exacto de /etc/motd guardado en /usr/local/share/proxmenux, elimina el archivo si antes no existía o retira de forma segura el marcador antiguo al migrar una instalación anterior."
},
{
"tool": "Fastfetch",
"restores": "Elimina el binario, el directorio de configuración, el hook update-motd y el bloque de bashrc. Purga el paquete apt si está instalado."
"restores": "Elimina el binario, el directorio de configuración, el hook update-motd y el bloque delimitado BEGIN FASTFETCH / END FASTFETCH de /root/.bashrc, ~/.profile, /etc/profile y /etc/profile.d/fastfetch.sh. Purga el paquete apt si está instalado."
},
{
"tool": "Figurine",
@@ -144,6 +160,27 @@
{
"tool": "AMD CPU fixes (Ryzen/EPYC)",
"restores": "Elimina idle=nomwait de la cmdline del kernel (ZFS) o GRUB, y las opciones ignore_msrs / report_ignored_msrs de /etc/modprobe.d/kvm.conf."
},
{
"tool": "QEMU Guest Agent (templates)",
"restores": "Lee /usr/local/share/proxmenux/guest_agent.pkg (registrado en tiempo de instalación) y hace apt purge del paquete que se instaló (qemu-guest-agent en hosts estándar, spice-vdagent cuando se usa modo Spice)."
}
]
},
{
"title": "Storage",
"items": [
{
"tool": "ZFS ARC sizing",
"restores": "Elimina /etc/modprobe.d/99-zfsarc.conf, restaura cualquier *.conf externo en conflicto que se dejó apartado en /usr/local/share/proxmenux/backups/zfs_arc/, reconstruye initramfs y ejecuta proxmox-boot-tool refresh en hosts con systemd-boot."
},
{
"tool": "ZFS auto-snapshot",
"restores": "Elimina las entradas cron que el script escribió y ofrece hacer apt purge zfs-auto-snapshot. Los datasets de snapshots existentes en los pools se dejan intactos — bórralos por separado si los quieres fuera."
},
{
"tool": "vzdump speed limits",
"restores": "Restaura /etc/vzdump.conf desde el .bak que creó la instalación, devolviendo bwlimit e ionice a sus valores previos a ProxMenux."
}
]
},
@@ -160,7 +197,27 @@
},
{
"tool": "kexec (fast reboots)",
"restores": "Desactiva kexec-pve.service, elimina el archivo de unit y el alias reboot-quick, purga kexec-tools."
"restores": "Desactiva kexec-pve.service, elimina el archivo de unit y el alias reboot-quick de /root/.bash_profile, purga kexec-tools."
},
{
"tool": "Desactivación de RPC / rpcbind",
"restores": "Restaura rpcbind.service y rpcbind.socket de forma independiente a los estados habilitado o deshabilitado y activo o inactivo registrados antes de aplicar ProxMenux."
},
{
"tool": "pigz (gzip paralelo)",
"restores": "Devuelve /bin/gzip.original a su sitio, elimina /bin/pigzwrapper, revierte las líneas pigz y bwlimit en /etc/vzdump.conf y hace apt purge pigz."
},
{
"tool": "High Availability services",
"restores": "Para y desactiva pve-ha-lrm, pve-ha-crm y corosync. Los grupos HA y las definiciones de recursos existentes no se eliminan — quítalos desde la UI web si ya no los necesitas."
},
{
"tool": "Ceph repository",
"restores": "Purga los paquetes Ceph instalados por esta opción, elimina /etc/apt/sources.list.d/ceph.sources en PVE 9 (o la lista Ceph tradicional en PVE 8) y actualiza la caché de APT."
},
{
"tool": "OVH RTM (monitoring)",
"restores": "Ejecuta apt purge sobre cualquier paquete ovh-* que el instalador RTM añadió y borra los manifests puppet que dejó bajo /etc/puppet/. En hosts no-OVH nunca se instaló nada, así que no se elimina nada."
}
]
}
@@ -66,8 +66,14 @@
{
"title": "Sin reinicio salvo que la función lo diga",
"body": "La mayoría de las actualizaciones surten efecto inmediatamente. Las actualizaciones que tocan módulos del kernel, nombres de interfaz persistentes o VFIO muestran el mismo prompt de reinicio que una instalación recién hecha."
},
{
"title": "Refresco del registro enviado al Monitor",
"body": "Al terminar el batch, el menú hace POST a <code>http://127.0.0.1:8008/api/updates/post-install/scan</code> para reconstruir <code>/usr/local/share/proxmenux/updates_available.json</code>. Eso hace que la tarjeta de Optimizations del Monitor y la entrada del menú de shell desaparezcan inmediatamente tras la actualización, sin esperar al siguiente escaneo programado."
}
]
],
"jqTitle": "jq es obligatorio",
"jqBody": "La checklist de la Ruta A depende de <code>jq</code> para parsear el JSON de actualizaciones pendientes. Si <code>jq</code> no está, el flujo termina en silencio — verías la entrada del menú con contador pero al elegir filas no ocurriría nada. En cualquier instalación moderna de Proxmox <code>jq</code> está presente; si tienes dudas ejecuta <code>apt install -y jq</code>."
},
"differs": {
"heading": "En qué se diferencia de las otras rutas",
@@ -117,7 +117,7 @@
},
"switchToHttps": {
"heading": "Cambiar el Monitor a HTTPS",
"bodyRich": "Una vez que <code>/etc/pve/local/pveproxy-ssl.pem</code> está firmado por Let's Encrypt, el lado del Monitor es un clic: abre <strong>Settings → Security → HTTPS / SSL</strong>, confirma que el issuer mostrado en el panel del certificado detectado pone <em>Let's Encrypt</em> (y no la CA local de Proxmox) y pulsa <strong>Use Proxmox Certificate</strong>. El servicio del Monitor reinicia y la siguiente carga del navegador es HTTPS en el puerto 8008 sin warning de certificado, ya que la cadena está confiada públicamente."
"bodyRich": "Una vez que <code>/etc/pve/local/pveproxy-ssl.pem</code> está firmado por Let's Encrypt, en el Monitor solo hace falta un clic: abre <strong>Ajustes → Seguridad → HTTPS / SSL</strong>, confirma que el emisor mostrado en el panel del certificado detectado sea <em>Let's Encrypt</em> (y no la CA local de Proxmox) y pulsa <strong>Usar certificado de Proxmox</strong>. El servicio del Monitor se reinicia y la siguiente carga del navegador usa HTTPS en el puerto 8008, sin advertencias porque la cadena es de confianza pública. Las renovaciones posteriores de Proxmox ACME se validan y seleccionan durante la siguiente conexión TLS nueva; no existe un comprobador periódico del certificado ni se reinicia el servicio durante la renovación. <strong>Actualizar certificado</strong> permanece disponible en Seguridad como acción explícita de diagnóstico y recuperación."
},
"custom": {
"heading": "Certificado personalizado — cuándo usarlo",
@@ -25,6 +25,7 @@
"mechanisms": {
"heading": "Výber metódy aktualizácie",
"lead": "Integrovaná cesta Proxmox VE Helper-Scripts používa oficiálny mechanizmus <helper>update-apps</helper>. Ostatné inštalácie používajú príslušnú metódu balíkov, Dockeru alebo vlastného príkazu.",
"officialReference": "Oficiálna referencia: <helper>dokumentácia update-apps od Proxmox VE Helper-Scripts</helper> opisuje interaktívny aj bezobslužný režim, zálohy, simuláciu, dočasné prostriedky na zostavenie, protokoly a návratové kódy.",
"colSource": "Zdroj",
"colAction": "Zobrazená akcia",
"colNotes": "Čo sa spustí",