import type { Metadata } from "next" import { getTranslations, getMessages, setRequestLocale } from "next-intl/server" import { Link } from "@/i18n/navigation" import { ExternalLink } from "lucide-react" import { DocHeader } from "@/components/ui/doc-header" import { Callout } from "@/components/ui/callout" import CopyableCode from "@/components/CopyableCode" export async function generateMetadata({ params, }: { params: Promise<{ locale: string }> }): Promise { const { locale } = await params const t = await getTranslations({ locale, namespace: "docs.postInstall.storage.meta" }) return { title: t("title"), description: t("description") } } type ArcRow = { ram: string; min: string; max: string } type SnapRow = { label: string; runs: string; kept: string } type RelatedItem = { label: string; href: string; tail: string } export default async function PostInstallStoragePage({ params, }: { params: Promise<{ locale: string }> }) { const { locale } = await params setRequestLocale(locale) const t = await getTranslations({ locale, namespace: "docs.postInstall.storage" }) const messages = (await getMessages({ locale })) as unknown as { docs: { postInstall: { storage: { arc: { rows: ArcRow[] } autoSnap: { rows: SnapRow[] } autotrim: { practicalItems: string[] whenSkipItems: string[] } related: { items: RelatedItem[] } } } } } const arcRows = messages.docs.postInstall.storage.arc.rows const snapRows = messages.docs.postInstall.storage.autoSnap.rows const practicalItems = messages.docs.postInstall.storage.autotrim.practicalItems const whenSkipItems = messages.docs.postInstall.storage.autotrim.whenSkipItems const relatedItems = messages.docs.postInstall.storage.related.items const code = (chunks: React.ReactNode) => {chunks} const strong = (chunks: React.ReactNode) => {chunks} const em = (chunks: React.ReactNode) => {chunks} const zfsAutoAnchor = (chunks: React.ReactNode) => ( {chunks} ) return (
{t.rich("intro.body", { strong })} {t.rich("notTrackedBody", { strong })}

{t("arc.heading")}

{t.rich("arc.intro", { strong })}

{t("arc.sizingTitle")}

{arcRows.map((row) => ( ))}
{t("arc.headerRam")} {t("arc.headerMin")} {t("arc.headerMax")}
{row.ram} {row.min} {row.max}

{t.rich("arc.after", { code })}

{t.rich("arc.rebootBody", { code, strong })} {t.rich("arc.safeBody", { code })}

{t("arc.verifyTitle")}

{t("autoSnap.heading")}

{t.rich("autoSnap.intro", { a: zfsAutoAnchor })}

{t("autoSnap.cadenceTitle")}

{snapRows.map((row) => ( ))}
{t("autoSnap.headerLabel")} {t("autoSnap.headerRuns")} {t("autoSnap.headerKept")}
{row.label} {row.runs} {row.kept}
{t.rich("autoSnap.conservativeBody", { code })} {t("autoSnap.onlyZfsBody")}

{t("autoSnap.verifyTitle")}

{t("autotrim.heading")}

{t.rich("autotrim.intro", { code })}

{t("autotrim.trimTitle")}

{t.rich("autotrim.trimBody1", { strong })}

{t("autotrim.trimBody2")}

{t.rich("autotrim.trimBody3", { code })}

{t("autotrim.practicalTitle")}

    {practicalItems.map((_, idx) => (
  • {t.rich(`autotrim.practicalItems.${idx}`, { strong, code })}
  • ))}

{t("autotrim.whenTitle")}

  • {t.rich("autotrim.whenIntro1", { strong })}
  • {t.rich("autotrim.whenIntro2", { strong })}
      {whenSkipItems.map((_, idx) => (
    • {t.rich(`autotrim.whenSkipItems.${idx}`, { code })}
    • ))}
  • {t.rich("autotrim.whenIntro3", { strong })}
{t.rich("autotrim.recordedBody", { code })}

{t("autotrim.manualTitle")}

{t("autotrim.manualIntro")}

# 3. Verify the pool is backed by SSD/NVMe with TRIM support # For each vdev (use the device path you see in 'zpool status -P '): DEV=sda # replace with the actual short name (sda, nvme0n1, ...) cat /sys/block/\${DEV}/queue/rotational # must be 0 (SSD/NVMe, not HDD) cat /sys/block/\${DEV}/queue/discard_granularity # must be > 0 (TRIM supported) # 4. Turn it on zpool set autotrim=on # 5. Confirm zpool get autotrim `} className="my-4" />

{t("autotrim.verifyTitle")}

# Or revert all pools ProxMenux changed (manual equivalent of the Uninstall option) while read -r p; do zpool set autotrim=off "$p" done < /usr/local/share/proxmenux/zfs_autotrim_pools`} className="my-4" /> {t.rich("autotrim.oneShotBody", { code })}

{t("vzdump.heading")}

{t("vzdump.intro")}

{t("vzdump.changedTitle")}

{t.rich("vzdump.noBackupBody", { strong, code, em })} {t.rich("vzdump.skipBody", { code })}

{t("vzdump.verifyTitle")}

{t("related.heading")}

    {relatedItems.map((item) => (
  • {item.label} {item.tail}
  • ))}
) }