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.backupRestore.destinations.meta" }) return { title: t("title"), description: t("description"), keywords: [ "proxmox backup destinations", "proxmox local backup", "proxmox backup server", "borg backup proxmox", "tar zst backup", "pbs snapshot", "borg repository", ], alternates: { canonical: "https://proxmenux.com/docs/backup-restore/destinations" }, openGraph: { title: t("ogTitle"), description: t("ogDescription"), type: "article", url: "https://proxmenux.com/docs/backup-restore/destinations", }, twitter: { card: "summary_large_image", title: t("twitterTitle"), description: t("twitterDescription"), }, } } type ComparisonRow = { feature: string local: string pbs: string borg: string } type WhereNextItem = { label: string; href: string; tail: string } export default async function DestinationsIndexPage({ params, }: { params: Promise<{ locale: string }> }) { const { locale } = await params setRequestLocale(locale) const t = await getTranslations({ locale, namespace: "docs.backupRestore.destinations" }) const messages = (await getMessages({ locale })) as unknown as { docs: { backupRestore: { destinations: { comparison: { rows: ComparisonRow[] } whereNext: { items: WhereNextItem[] } } } } } const dest = messages.docs.backupRestore.destinations const rows = dest.comparison.rows const whereNextItems = dest.whereNext.items const code = (chunks: React.ReactNode) => {chunks} const strong = (chunks: React.ReactNode) => {chunks} const em = (chunks: React.ReactNode) => {chunks} return (
{t.rich("intro.body", { code, strong })}

{t("comparison.heading")}

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

{rows.map((row, idx) => ( ))}
{t("comparison.captionCode")} {t("comparison.captionLocal")} {t("comparison.captionPbs")} {t("comparison.captionBorg")}
{row.feature} {t.rich(`comparison.rows.${idx}.local`, { code })} {t.rich(`comparison.rows.${idx}.pbs`, { code })} {t.rich(`comparison.rows.${idx}.borg`, { code })}

{t("sameArchive.heading")}

{t.rich("sameArchive.body", { code, em })}

{t("extractStandalone.heading")}

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

{t("comparison.captionLocal")}

{t("comparison.captionPbs")}

{t("comparison.captionBorg")}

{t.rich("extractStandalone.note", { em })}

{t("whereNext.heading")}

{t.rich("whereNext.intro", { em })}

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