mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-10-15 01:52:44 +00:00
This commit is contained in:
@@ -250,7 +250,7 @@ export default async function NvidiaHostPage({
|
||||
|
||||
<Steps.Step title={t("walkthrough.version.title")}>
|
||||
<p className="mb-3 text-gray-800">{t.rich("walkthrough.version.body1", { strong, em, code })}</p>
|
||||
<p className="mb-3 text-gray-800">{t("walkthrough.version.body2")}</p>
|
||||
<p className="mb-3 text-gray-800">{t.rich("walkthrough.version.body2", { em })}</p>
|
||||
|
||||
<Callout variant="tip" title={t("walkthrough.version.whyTitle")}>
|
||||
{t("walkthrough.version.whyBody")}
|
||||
|
||||
@@ -49,6 +49,7 @@ export async function generateMetadata({
|
||||
type SourceRow = { collector: string; watches: string; events: string }
|
||||
type DispatchRow = { stage: string; what: string; tunable: string }
|
||||
type CatalogueRow = { group: string; events: string }
|
||||
type BackupResultRow = { icon: string; result: string; when: string }
|
||||
type ApiRow = { endpoint: string; method: string; use: string }
|
||||
type WhereNextItem = { label: string; href: string; tail?: string; tailRich?: string }
|
||||
|
||||
@@ -88,7 +89,7 @@ export default async function NotificationsPage({
|
||||
securityItems: string[]
|
||||
actionsItems: string[]
|
||||
}
|
||||
catalogue: { rows: CatalogueRow[] }
|
||||
catalogue: { rows: CatalogueRow[]; backupResults: { rows: BackupResultRow[]; items: string[] } }
|
||||
api: { rows: ApiRow[] }
|
||||
whereNext: { items: WhereNextItem[] }
|
||||
} } }
|
||||
@@ -117,6 +118,8 @@ export default async function NotificationsPage({
|
||||
const pveSecurity = n.pveWebhook.securityItems
|
||||
const pveActions = n.pveWebhook.actionsItems
|
||||
const catalogueRows = n.catalogue.rows
|
||||
const backupResultRows = n.catalogue.backupResults.rows
|
||||
const backupResultItems = n.catalogue.backupResults.items
|
||||
const apiRows = n.api.rows
|
||||
const whereNextItems = n.whereNext.items
|
||||
|
||||
@@ -722,6 +725,37 @@ running on node pve-01
|
||||
{t.rich("catalogue.burstNote", { code })}
|
||||
</p>
|
||||
|
||||
<h3 id="backup-results" className="text-lg font-semibold mt-6 mb-2 text-gray-900">{t("catalogue.backupResults.heading")}</h3>
|
||||
|
||||
<p className="mb-4 text-gray-800 leading-relaxed">{t.rich("catalogue.backupResults.intro", { em })}</p>
|
||||
|
||||
<div className="overflow-x-auto mb-6">
|
||||
<table className="w-full text-sm border border-gray-200 rounded-md">
|
||||
<thead className="bg-gray-50 text-gray-900">
|
||||
<tr>
|
||||
<th className="text-left px-3 py-2 border-b border-gray-200">{t("catalogue.backupResults.headerIcon")}</th>
|
||||
<th className="text-left px-3 py-2 border-b border-gray-200">{t("catalogue.backupResults.headerResult")}</th>
|
||||
<th className="text-left px-3 py-2 border-b border-gray-200">{t("catalogue.backupResults.headerWhen")}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody className="text-gray-800">
|
||||
{backupResultRows.map((row, idx) => (
|
||||
<tr key={row.icon} className={idx < backupResultRows.length - 1 ? "border-b border-gray-100" : ""}>
|
||||
<td className="px-3 py-2 align-top whitespace-nowrap">{row.icon}</td>
|
||||
<td className="px-3 py-2 align-top whitespace-nowrap"><strong>{row.result}</strong></td>
|
||||
<td className="px-3 py-2 align-top">{row.when}</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<ul className="list-disc pl-6 mb-6 text-gray-800 leading-relaxed space-y-1">
|
||||
{backupResultItems.map((_, idx) => (
|
||||
<li key={idx}>{t.rich(`catalogue.backupResults.items.${idx}`, { strong })}</li>
|
||||
))}
|
||||
</ul>
|
||||
|
||||
<h2 className="text-2xl font-semibold mt-10 mb-4 text-gray-900">{t("history.heading")}</h2>
|
||||
|
||||
<p className="mb-4 text-gray-800 leading-relaxed">
|
||||
|
||||
@@ -85,14 +85,17 @@ apt-get -y install pigz
|
||||
cat > /bin/pigzwrapper <<'EOF'
|
||||
#!/bin/sh
|
||||
PATH=/bin:$PATH
|
||||
GZIP="-1"
|
||||
export GZIP="-1"
|
||||
exec /usr/bin/pigz "$@"
|
||||
EOF
|
||||
chmod +x /bin/pigzwrapper
|
||||
|
||||
# Only replaces gzip if not already replaced (idempotent)
|
||||
[ ! -f /bin/gzip.original ] && mv /bin/gzip /bin/gzip.original \\
|
||||
&& cp /bin/pigzwrapper /bin/gzip && chmod +x /bin/gzip`}
|
||||
# gzip is diverted: the real binary is kept as gzip.distrib, package updates
|
||||
# land there, and the wrapper takes the place of gzip.
|
||||
# Path on Proxmox VE 9; on Proxmox VE 8 it is /bin/gzip.
|
||||
cp -p /usr/bin/gzip /usr/bin/gzip.distrib
|
||||
dpkg-divert --local --no-rename --divert /usr/bin/gzip.distrib --add /usr/bin/gzip
|
||||
cat /bin/pigzwrapper > /usr/bin/gzip`}
|
||||
className="my-4"
|
||||
/>
|
||||
|
||||
@@ -106,8 +109,9 @@ chmod +x /bin/pigzwrapper
|
||||
|
||||
<CopyableCode
|
||||
code={`# Manual rollback of pigz
|
||||
mv /bin/gzip.original /bin/gzip # restore original binary
|
||||
rm /bin/pigzwrapper
|
||||
cat /usr/bin/gzip.distrib > /usr/bin/gzip # restore the real binary
|
||||
dpkg-divert --local --no-rename --remove /usr/bin/gzip
|
||||
rm /usr/bin/gzip.distrib /bin/pigzwrapper
|
||||
sed -i 's/^pigz: 1/#pigz: 1/' /etc/vzdump.conf
|
||||
# Optional: remove the package
|
||||
apt purge pigz`}
|
||||
|
||||
@@ -74,7 +74,7 @@ export default async function SystemUpdatePage({
|
||||
<div>
|
||||
<DocHeader
|
||||
title={t("header.title")}
|
||||
description={t("header.description")}
|
||||
description={t.rich("header.description", { code, em })}
|
||||
section={t("header.section")}
|
||||
estimatedMinutes={5}
|
||||
scriptPath="utilities/proxmox_update.sh"
|
||||
@@ -175,14 +175,14 @@ export default async function SystemUpdatePage({
|
||||
|
||||
<h2 className="text-2xl font-semibold mt-10 mb-4 text-gray-900">{t("noSub.heading")}</h2>
|
||||
<p className="mb-6 text-gray-800 leading-relaxed">
|
||||
{t.rich("noSub.intro", { code, strong })}
|
||||
{t.rich("noSub.intro", { code, strong, em })}
|
||||
</p>
|
||||
<ol className="list-decimal pl-6 mb-6 text-gray-800 leading-relaxed space-y-1">
|
||||
<ul className="list-disc pl-6 mb-6 text-gray-800 leading-relaxed space-y-1">
|
||||
{noSubItems.map((_, idx) => (
|
||||
<li key={idx}>{t.rich(`noSub.items.${idx}`, { code, strong })}</li>
|
||||
<li key={idx}>{t.rich(`noSub.items.${idx}`, { code, strong, em })}</li>
|
||||
))}
|
||||
</ol>
|
||||
<p className="mb-6 text-gray-800 leading-relaxed">{t("noSub.outro")}</p>
|
||||
</ul>
|
||||
<p className="mb-6 text-gray-800 leading-relaxed">{t.rich("noSub.outro", { code, em })}</p>
|
||||
|
||||
<h2 className="text-2xl font-semibold mt-10 mb-4 text-gray-900">{t("cluster.heading")}</h2>
|
||||
<Callout variant="warning" title={t("cluster.calloutTitle")}>
|
||||
@@ -200,7 +200,7 @@ export default async function SystemUpdatePage({
|
||||
|
||||
{troubleItems.map((_, idx) => (
|
||||
<Callout key={idx} variant="troubleshoot" title={t(`troubleshooting.items.${idx}.title`)}>
|
||||
{t.rich(`troubleshooting.items.${idx}.body`, { code, kbd })}
|
||||
{t.rich(`troubleshooting.items.${idx}.body`, { code, kbd, em })}
|
||||
</Callout>
|
||||
))}
|
||||
|
||||
|
||||
@@ -157,7 +157,7 @@ export default async function SystemUtilsPage({
|
||||
<h2 className="text-2xl font-semibold mt-10 mb-4 text-gray-900">{t("troubleshoot.heading")}</h2>
|
||||
|
||||
<Callout variant="troubleshoot" title={t("troubleshoot.reposTitle")}>
|
||||
{t.rich("troubleshoot.reposBody", { code })}
|
||||
{t.rich("troubleshoot.reposBody", { code, em })}
|
||||
</Callout>
|
||||
|
||||
<Callout variant="troubleshoot" title={t("troubleshoot.warningsTitle")}>
|
||||
|
||||
Reference in New Issue
Block a user