import type { Metadata } from "next" import { getTranslations, getMessages, setRequestLocale } from "next-intl/server" import { Link } from "@/i18n/navigation" import Image from "next/image" import { ArrowRight, Activity, LineChart, Wrench, ListChecks, Tag, Archive, ShieldCheck, ShieldAlert, Eye, } from "lucide-react" import { DocHeader } from "@/components/ui/doc-header" import { Callout } from "@/components/ui/callout" export async function generateMetadata({ params, }: { params: Promise<{ locale: string }> }): Promise { const { locale } = await params const t = await getTranslations({ locale, namespace: "docs.network.meta" }) return { title: t("title"), description: t("description"), keywords: [ "proxmox network management", "proxmox bridge configuration", "proxmox bond", "proxmox vlan", "proxmox network repair", "proxmox /etc/network/interfaces", "proxmox network diagnostics", "proxmox persistent interface names", "proxmox network backup", ], alternates: { canonical: "https://proxmenux.com/docs/network" }, openGraph: { title: t("ogTitle"), description: t("ogDescription"), type: "article", url: "https://proxmenux.com/docs/network", }, twitter: { card: "summary", title: t("twitterTitle"), description: t("twitterDescription"), }, } } type SectionOption = { title: string; description: string } const READ_ONLY_CONFIG = [ { Icon: Activity, href: "/docs/network/diagnostics" }, { Icon: LineChart, href: "/docs/network/monitoring" }, ] const ANALYZE_CONFIG = [ { Icon: Wrench, href: "/docs/network/bridge-analysis" }, { Icon: ListChecks, href: "/docs/network/config-analysis" }, ] const APPLY_CONFIG = [ { Icon: Tag, href: "/docs/network/persistent-names" }, { Icon: Archive, href: "/docs/network/backup-restore" }, ] function OptionCard({ title, description, Icon, href, }: SectionOption & { Icon: React.ComponentType<{ className?: string; "aria-hidden"?: boolean }> href: string }) { return (
{title}
{description}
) } export default async function NetworkOverviewPage({ params, }: { params: Promise<{ locale: string }> }) { const { locale } = await params setRequestLocale(locale) const t = await getTranslations({ locale, namespace: "docs.network" }) const messages = (await getMessages({ locale })) as unknown as { docs: { network: { tiers: { readOnly: { items: string[] } analyze: { items: string[] } apply: { items: string[] } } readOnlySection: { options: SectionOption[] } analyzeSection: { options: SectionOption[] } applySection: { options: SectionOption[] } } } } const readOnlyTierItems = messages.docs.network.tiers.readOnly.items const analyzeTierItems = messages.docs.network.tiers.analyze.items const applyTierItems = messages.docs.network.tiers.apply.items const readOnlyOptions = messages.docs.network.readOnlySection.options const analyzeOptions = messages.docs.network.analyzeSection.options const applyOptions = messages.docs.network.applySection.options const code = (chunks: React.ReactNode) => {chunks} const strong = (chunks: React.ReactNode) => {chunks} const em = (chunks: React.ReactNode) => {chunks} return (
{t.rich("intro.body", { strong })}

{t("openingMenu.heading")}

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

{t("openingMenu.imageAlt")}

{t("safety.heading")}

{t("safety.body")}

{t("tiers.readOnly.title")}

{t("tiers.readOnly.body")}

    {readOnlyTierItems.map((item, idx) => (
  • {item}
  • ))}

{t("tiers.analyze.title")}

{t("tiers.analyze.body")}

    {analyzeTierItems.map((item, idx) => (
  • {item}
  • ))}

{t("tiers.apply.title")}

{t("tiers.apply.body")}

    {applyTierItems.map((item, idx) => (
  • {item}
  • ))}
{t.rich("classicBody", { strong, code })}

{t("backups.heading")}

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

{`/var/backups/proxmenux/
├── interfaces_backup_2026-04-26_14-30-12
├── interfaces_backup_2026-04-26_15-08-44
└── interfaces_backup_2026-04-26_18-22-09`}

{t("backups.rollbackIntro")}

{`cp /var/backups/proxmenux/interfaces_backup_ /etc/network/interfaces
systemctl restart networking`}

{t("readOnlySection.heading")}

{t.rich("readOnlySection.body", { code })}

{readOnlyOptions.map((o, idx) => ( ))}

{t("analyzeSection.heading")}

{t.rich("analyzeSection.body", { code, strong })}

{analyzeOptions.map((o, idx) => ( ))}

{t("applySection.heading")}

{t.rich("applySection.body", { em })}

{applyOptions.map((o, idx) => ( ))}

{t("consoleTitle")}

{t("consoleBody")}
) }