import type { Metadata } from "next" import { getTranslations, getMessages, setRequestLocale } from "next-intl/server" import { Link } from "@/i18n/navigation" 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.system.meta" }) return { title: t("title"), description: t("description") } } type LimitRow = { file: string; sets: string } type RelatedItem = { label: string; href: string; tail: string } export default async function PostInstallSystemPage({ params, }: { params: Promise<{ locale: string }> }) { const { locale } = await params setRequestLocale(locale) const t = await getTranslations({ locale, namespace: "docs.postInstall.system" }) const messages = (await getMessages({ locale })) as unknown as { docs: { postInstall: { system: { journald: { keyItems: string[] } limits: { rows: LimitRow[] } kexec: { installsItems: string[] } related: { items: RelatedItem[] } } } } } const keyItems = messages.docs.postInstall.system.journald.keyItems const limitRows = messages.docs.postInstall.system.limits.rows const installsItems = messages.docs.postInstall.system.kexec.installsItems const relatedItems = messages.docs.postInstall.system.related.items const code = (chunks: React.ReactNode) => {chunks} const strong = (chunks: React.ReactNode) => {chunks} const em = (chunks: React.ReactNode) => {chunks} const kexecLink = (chunks: React.ReactNode) => ( {chunks} ) const uninstallLink = (chunks: React.ReactNode) => ( {chunks} ) return (
{t.rich("intro.body", { strong })}

{t("journald.heading")}

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

{t("journald.keyTitle")}

    {keyItems.map((_, idx) => (
  • {t.rich(`journald.keyItems.${idx}`, { code })}
  • ))}
{t.rich("journald.tipBody", { code })}

{t("logrotate.heading")}

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

{t.rich("logrotate.tipBody", { code, em })}

{t("limits.heading")}

{t("limits.intro")}

{limitRows.map((row, idx) => ( ))}
{t("limits.headerFile")} {t("limits.headerSets")}
{row.file} {t.rich(`limits.rows.${idx}.sets`, { code })}
{t.rich("limits.tipBody", { code })}

{t("memory.heading")}

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

{t.rich("memory.warnBody", { code })}

{t("kexec.heading")}

{t.rich("kexec.intro", { code, em })}

{t("kexec.installsTitle")}

    {installsItems.map((_, idx) => (
  • {t.rich(`kexec.installsItems.${idx}`, { code })}
  • ))}

{t.rich("kexec.usageIntro", { code })}

{t.rich("kexec.warnBody", { code })}

{t("panic.heading")}

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

{t.rich("panic.tipBody", { em, link: kexecLink })}

{t("verify.heading")}

{t("verify.intro")}

&1 | head -20 # System limits: check a few effective values sysctl fs.inotify.max_user_watches fs.file-max vm.swappiness vm.dirty_ratio ulimit -n # inside a new root shell # kexec: service enabled systemctl is-enabled kexec-pve # kernel panic config sysctl kernel.panic kernel.panic_on_oops kernel.hardlockup_panic`} className="my-4" /> {t.rich("verify.tipBody", { code, link: uninstallLink })}

{t("related.heading")}

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