import type { Metadata } from "next" import { getTranslations, getMessages, setRequestLocale } from "next-intl/server" import { ExternalLink } from "lucide-react" import { DocHeader } from "@/components/ui/doc-header" import { Callout } from "@/components/ui/callout" import Image from "next/image" import CopyableCode from "@/components/CopyableCode" import Footer from "@/components/footer" export async function generateMetadata({ params, }: { params: Promise<{ locale: string }> }): Promise { const { locale } = await params const t = await getTranslations({ locale, namespace: "guides.backupCloud.meta" }) return { title: t("title"), description: t("description"), alternates: { canonical: "https://proxmenux.com/docs/guides/backup-cloud" }, openGraph: { title: t("ogTitle"), description: t("ogDescription"), type: "article", url: "https://proxmenux.com/docs/guides/backup-cloud", }, } } export default async function BackupCloudGuide({ params, }: { params: Promise<{ locale: string }> }) { const { locale } = await params setRequestLocale(locale) const t = await getTranslations({ locale, namespace: "guides.backupCloud" }) const messages = (await getMessages({ locale })) as unknown as { guides: { backupCloud: { intro: { steps: string[] } createDir: { configItems: string[] } mount: { mountItems: string[] } retention: { starterItems: string[] } troubleshoot: { items: string[] } } } } const introSteps = messages.guides.backupCloud.intro.steps const configItems = messages.guides.backupCloud.createDir.configItems const mountItems = messages.guides.backupCloud.mount.mountItems const starterItems = messages.guides.backupCloud.retention.starterItems const troubleItems = messages.guides.backupCloud.troubleshoot.items const code = (chunks: React.ReactNode) => {chunks} const strong = (chunks: React.ReactNode) => {chunks} const pbsLink = (chunks: React.ReactNode) => ( {chunks} ) const rcloneLink = (chunks: React.ReactNode) => ( {chunks} ) const remoteSetupLink = (chunks: React.ReactNode) => ( {chunks} ) const providerDocsLink = (chunks: React.ReactNode) => ( {chunks} ) return (
{t.rich("intro.pbsCalloutBody", { strong, code, pbsLink })}

{t("intro.stepsTitle")}

    {introSteps.map((_, idx) => (
  1. {t(`intro.steps.${idx}`)}
  2. ))}
{t.rich("intro.vzdumpCalloutBody", { strong, code })}

{t("createDir.heading")}

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

{t.rich("createDir.afterMkdir", { strong, code })}

{t("createDir.image1Alt")}

{t("createDir.configIntro")}

    {configItems.map((_, idx) => (
  • {t.rich(`createDir.configItems.${idx}`, { strong, code })}
  • ))}
{t("createDir.image2Alt")}

{t.rich("createDir.afterConfig", { strong })}

{t("createDir.image3Alt")}

{t("createDir.afterAdd")}

{t("installRclone.heading")}

{t.rich("installRclone.body", { rcloneLink })}

{t("installRclone.newerCalloutBody")}

{t("installRclone.tunnelHeading")}

{t.rich("installRclone.tunnelBody", { remoteSetupLink })}

{t.rich("installRclone.tunnelFrom", { strong, code })}

{t("installRclone.tunnelAfter")}

{t("installRclone.runHeading")}

{t("installRclone.runBody")}

{t.rich("installRclone.runAfter", { providerDocsLink })}

{t.rich("installRclone.authAfter", { strong })}

{t.rich("installRclone.nameRemote", { code })}

{t("mount.heading")}

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

{t("mount.mountIntro")}

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

{t.rich("mount.mountFootnote", { strong })}

{t("systemd.heading")}

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

{t("systemd.createIntro")}

{t("systemd.pasteIntro")}

{t.rich("systemd.adjust", { code })}

{t("systemd.verifyIntro")}

{t.rich("systemd.verifyAfter", { code })}

{t.rich("systemd.vfsCalloutBody", { code })}

{t("configureBackup.heading")}

{t.rich("configureBackup.body", { strong })}

{t("configureBackup.image5Alt")}

{t("configureBackup.after")}

{t("configureBackup.image6Alt")}

{t("retention.heading")}

{t.rich("retention.body", { strong })}

{t.rich("retention.uiPath", { strong })}

{t("retention.image7Alt")}

{t("retention.starterIntro")}

    {starterItems.map((_, idx) => (
  • {t(`retention.starterItems.${idx}`)}
  • ))}

{t("retention.adjust")}

{t("troubleshoot.heading")}

    {troubleItems.map((_, idx) => (
  • {t.rich(`troubleshoot.items.${idx}`, { code, strong })}
  • ))}
) }