import type { Metadata } from "next" import { getTranslations, getMessages, setRequestLocale } from "next-intl/server" import { Link } from "@/i18n/navigation" import Image from "next/image" import { DocHeader } from "@/components/ui/doc-header" import { Callout } from "@/components/ui/callout" import { DataFlowDiagram } from "@/components/ui/data-flow-diagram" export async function generateMetadata({ params, }: { params: Promise<{ locale: string }> }): Promise { const { locale } = await params const t = await getTranslations({ locale, namespace: "docs.security.fail2ban.meta" }) return { title: t("title"), description: t("description"), openGraph: { title: t("ogTitle"), description: t("ogDescription"), type: "article", url: "https://macrimi.github.io/ProxMenux/docs/security/fail2ban", }, } } type JailRow = { jail: string; protects: string; retries: string; ban: string } type LoggerRow = { service: string; source: string; output: string } type ManageRow = { action: string; what: string } export default async function Fail2BanPage({ params, }: { params: Promise<{ locale: string }> }) { const { locale } = await params setRequestLocale(locale) const t = await getTranslations({ locale, namespace: "docs.security.fail2ban" }) const messages = (await getMessages({ locale })) as unknown as { docs: { security: { fail2ban: { jails: { rows: JailRow[] } loggers: { rows: LoggerRow[] } manage: { rows: ManageRow[] } hardening: { items: string[] } } } } } const block = messages.docs.security.fail2ban const jailRows = block.jails.rows const loggerRows = block.loggers.rows const manageRows = block.manage.rows const hardeningItems = block.hardening.items const code = (chunks: React.ReactNode) => {chunks} const strong = (chunks: React.ReactNode) => {chunks} const em = (chunks: React.ReactNode) => {chunks} const codeNw = (chunks: React.ReactNode) => {chunks} const codeXs = (chunks: React.ReactNode) => {chunks} return (
{t("intro.body")}

{t("firstLaunch.heading")}

{t("firstLaunch.body")}

{t("firstLaunch.imageAlt")}

{t("jails.heading")}

{jailRows.map((row, idx) => ( ))}
{t("jails.headerJail")} {t("jails.headerProtects")} {t("jails.headerRetries")} {t("jails.headerBan")}
{row.jail} {row.protects} {row.retries} {row.ban}

{t.rich("jails.outro", { code })}

{t("journald.heading")}

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

{t.rich("journald.afterDiagram", { code, codeXs })}

{t.raw("journald.code") as string}

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

{t("loggers.heading")}

{t.rich("loggers.intro1", { code })}

{t.rich("loggers.intro2", { code })}

{loggerRows.map((row, idx) => ( ))}
{t("loggers.headerService")} {t("loggers.headerSource")} {t("loggers.headerOutput")}
{row.service} {row.source} {row.output}

{t.rich("loggers.outro", { code })}

{t("backend.heading")}

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

{t.raw("backend.code") as string}

{t("hardening.heading")}

{t.rich("hardening.intro", { code, strong })}

{t("hardening.installerIntro")}

    {hardeningItems.map((_, idx) => (
  1. {t.rich(`hardening.items.${idx}`, { code, strong })}
  2. ))}

{t.rich("hardening.outro", { code })}

{t("manage.heading")}

{t("manage.intro")}

{manageRows.map((row, idx) => ( ))}
{t("manage.headerAction")} {t("manage.headerWhat")}
{row.action} {row.what}

{t("verify.heading")}

{t("verify.intro")}

{t.raw("verify.code") as string}

{t("troubleshoot.heading")}

{t.rich("troubleshoot.neverBansBody", { code, em })} {t.rich("troubleshoot.monitorEmptyBody", { code })} {t("troubleshoot.selfBanIntro")}
{t.raw("troubleshoot.selfBanCode") as string}
{t.rich("troubleshoot.aptFailBody", { code })} {t.rich("troubleshoot.lockoutBody", { code })}

{t("files.heading")}

{t.raw("files.code") as string}

{t("related.heading")}

  • {t("related.monitorLabel")} {t("related.monitorTail")}
  • {t("related.lynisLabel")} {t("related.lynisTail")}
  • {t("related.securityLabel")} {t("related.securityTail")}
) }