mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-09-30 02:26:53 +00:00
ProxMenux 1.2.6.2-beta: OCI containers in the Monitor, docs and fixes
OCI manager Apps - App tab: containers installed from an OCI image are identified from their installation record; the application and image versions are shown and an update is detected by image digest; repository link; Refresh data. - Updates tab for OCI containers: Update and Recreate run the same flow as the OCI menu in the Monitor terminal; the pre-update backup can be kept in a backup storage; scheduled image updates with an optional minimum age. - Logs tab: console output of the application, kept on the host (lxc.console.logfile + logrotate) and followed live. - The Proxmox console opens a shell (cmode: shell) when the image has one. - A damaged image download is fetched again before failing. - Multi-container applications open at their LAN address; volume mount points on block storage report their usage. Monitor - Proxmox notifications are delivered to a loopback-only HTTP listener when HTTPS is enabled, so they no longer fail certificate verification. - Log persistence counts recurring patterns only; an ended burst is not reported as persistent and its warning clears on its own (#386). - Proxmox notification config backups are deduplicated and capped at three. - The update icon on the Apps page opens the container on its Updates tab. - Version 1.2.6.2-beta and its release notes in every Monitor language. Docs - OCI manager Apps and Audit & Report rebuilt as per-page message files, with a new page for OCI containers in the Monitor. - Seven pages fixed where rich-text tags were missing from t.rich. Translations - Spanish fixes across the OCI engine, the Monitor and the TUI menus. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
386d33df6e
commit
4437a671d2
@@ -288,7 +288,7 @@ export default async function GpuVmPassthroughPage({
|
||||
<p className="mb-3 text-gray-800">{t("walkthrough.switchMode.intro")}</p>
|
||||
<ul className="list-disc pl-6 space-y-1 text-gray-800 mb-3">
|
||||
{switchModeItems.map((_, idx) => (
|
||||
<li key={idx}>{t.rich(`walkthrough.switchMode.items.${idx}`, { strong, code })}</li>
|
||||
<li key={idx}>{t.rich(`walkthrough.switchMode.items.${idx}`, { strong, code, em })}</li>
|
||||
))}
|
||||
</ul>
|
||||
<Image
|
||||
@@ -333,7 +333,7 @@ export default async function GpuVmPassthroughPage({
|
||||
<p className="mb-3 text-gray-800">{t("walkthrough.hostApply.intro")}</p>
|
||||
<ul className="list-disc pl-6 space-y-1 text-gray-800 mb-3">
|
||||
{hostApplyItems.map((_, idx) => (
|
||||
<li key={idx}>{t.rich(`walkthrough.hostApply.items.${idx}`, { strong, code })}</li>
|
||||
<li key={idx}>{t.rich(`walkthrough.hostApply.items.${idx}`, { strong, code, em })}</li>
|
||||
))}
|
||||
</ul>
|
||||
</Steps.Step>
|
||||
|
||||
@@ -249,7 +249,7 @@ export default async function NvidiaHostPage({
|
||||
</Steps.Step>
|
||||
|
||||
<Steps.Step title={t("walkthrough.version.title")}>
|
||||
<p className="mb-3 text-gray-800">{t.rich("walkthrough.version.body1", { strong, em })}</p>
|
||||
<p className="mb-3 text-gray-800">{t.rich("walkthrough.version.body1", { strong, em, code })}</p>
|
||||
<p className="mb-3 text-gray-800">{t("walkthrough.version.body2")}</p>
|
||||
|
||||
<Callout variant="tip" title={t("walkthrough.version.whyTitle")}>
|
||||
@@ -312,7 +312,7 @@ sh NVIDIA-Linux-x86_64-<version>.run \\
|
||||
|
||||
<Steps.Step title={t("walkthrough.propagate.title")}>
|
||||
<p className="mb-3 text-gray-800">{t.rich("walkthrough.propagate.body1", { code, strong })}</p>
|
||||
<p className="mb-3 text-gray-800">{t.rich("walkthrough.propagate.body2", { code })}</p>
|
||||
<p className="mb-3 text-gray-800">{t.rich("walkthrough.propagate.body2", { code, strong })}</p>
|
||||
<Image
|
||||
src="/gpu-tpu/nvidia-host-05-lxc-update.png"
|
||||
alt={t("walkthrough.propagate.imageAlt")}
|
||||
@@ -353,7 +353,7 @@ sh NVIDIA-Linux-x86_64-<version>.run \\
|
||||
<p className="mb-4 text-gray-800 leading-relaxed">{t("reinstallUninstall.uninstallIntro")}</p>
|
||||
<ul className="list-disc pl-6 mb-4 text-gray-800 leading-relaxed space-y-1">
|
||||
{uninstallItems.map((_, idx) => (
|
||||
<li key={idx}>{t.rich(`reinstallUninstall.uninstallItems.${idx}`, { code })}</li>
|
||||
<li key={idx}>{t.rich(`reinstallUninstall.uninstallItems.${idx}`, { code, em })}</li>
|
||||
))}
|
||||
</ul>
|
||||
|
||||
|
||||
@@ -119,7 +119,7 @@ export default async function SwitchGpuModePage({
|
||||
items={[
|
||||
{ label: <>{t.rich("prereqs.assigned", { strong })}</> },
|
||||
{
|
||||
label: <>{t.rich("prereqs.iommu", { strong, em })}</>,
|
||||
label: <>{t.rich("prereqs.iommu", { strong, em, code })}</>,
|
||||
check: t("prereqs.iommuCheck"),
|
||||
},
|
||||
{ label: <>{t.rich("prereqs.reboot", { strong })}</> },
|
||||
|
||||
@@ -63,7 +63,7 @@ export default async function MonitorApiPage({
|
||||
auth: { rows: EndpointRow[]; items: string[] }
|
||||
conventions: { items: string[] }
|
||||
system: { rows: EndpointRow[] }
|
||||
actions: { rows: EndpointRow[] }
|
||||
actions: { rows: EndpointRow[]; shapeCode: string; curlCode: string; haCode: string }
|
||||
health: { rows: EndpointRow[] }
|
||||
storage: { rows: EndpointRow[] }
|
||||
network: { rows: EndpointRow[] }
|
||||
@@ -188,7 +188,7 @@ export default async function MonitorApiPage({
|
||||
|
||||
<h3 className="text-lg font-semibold mt-6 mb-2 text-gray-900">{t("actions.shapeTitle")}</h3>
|
||||
<p className="mb-2 text-gray-800 leading-relaxed">{t("actions.shapeIntro")}</p>
|
||||
<CopyableCode code={t("actions.shapeCode")} className="my-4" />
|
||||
<CopyableCode code={messages.docs.monitor.apiReference.actions.shapeCode} className="my-4" />
|
||||
|
||||
<h3 className="text-lg font-semibold mt-6 mb-2 text-gray-900">{t("actions.concurrencyTitle")}</h3>
|
||||
<p className="mb-4 text-gray-800 leading-relaxed">{t.rich("actions.concurrencyBody", { code })}</p>
|
||||
@@ -200,11 +200,11 @@ export default async function MonitorApiPage({
|
||||
|
||||
<h3 className="text-lg font-semibold mt-6 mb-2 text-gray-900">{t("actions.curlTitle")}</h3>
|
||||
<p className="mb-2 text-gray-800 leading-relaxed">{t("actions.curlBody")}</p>
|
||||
<CopyableCode code={t("actions.curlCode")} className="my-4" />
|
||||
<CopyableCode code={messages.docs.monitor.apiReference.actions.curlCode} className="my-4" />
|
||||
|
||||
<h3 className="text-lg font-semibold mt-6 mb-2 text-gray-900">{t("actions.haTitle")}</h3>
|
||||
<p className="mb-2 text-gray-800 leading-relaxed">{t.rich("actions.haBody", { code })}</p>
|
||||
<CopyableCode code={t("actions.haCode")} className="my-4" />
|
||||
<CopyableCode code={messages.docs.monitor.apiReference.actions.haCode} className="my-4" />
|
||||
|
||||
<h2 className="text-2xl font-semibold mt-10 mb-4 text-gray-900">{t("health.heading")}</h2>
|
||||
{endpointTable(healthRows, "health.rows")}
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
import type { Metadata } from "next"
|
||||
import { getTranslations, setRequestLocale } from "next-intl/server"
|
||||
import { DocPage } from "@/components/docs/DocBlocks"
|
||||
|
||||
const NAMESPACE = "docs.monitor.auditReport.assessment"
|
||||
const LINKS = {
|
||||
reportsLink: "/docs/monitor/audit-report/reports",
|
||||
}
|
||||
const URL = "https://proxmenux.com/docs/monitor/audit-report/assessment"
|
||||
|
||||
export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }): Promise<Metadata> {
|
||||
const { locale } = await params
|
||||
const t = await getTranslations({ locale, namespace: `${NAMESPACE}.meta` })
|
||||
return {
|
||||
title: t("title"),
|
||||
description: t("description"),
|
||||
alternates: { canonical: URL },
|
||||
openGraph: { title: t("title"), description: t("description"), type: "article", url: URL },
|
||||
}
|
||||
}
|
||||
|
||||
export default async function Page({ params }: { params: Promise<{ locale: string }> }) {
|
||||
const { locale } = await params
|
||||
setRequestLocale(locale)
|
||||
return <DocPage locale={locale} namespace={NAMESPACE} minutes={6} links={LINKS} />
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
import type { Metadata } from "next"
|
||||
import { getTranslations, setRequestLocale } from "next-intl/server"
|
||||
import { DocPage } from "@/components/docs/DocBlocks"
|
||||
|
||||
const NAMESPACE = "docs.monitor.auditReport.changes"
|
||||
const URL = "https://proxmenux.com/docs/monitor/audit-report/changes"
|
||||
|
||||
export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }): Promise<Metadata> {
|
||||
const { locale } = await params
|
||||
const t = await getTranslations({ locale, namespace: `${NAMESPACE}.meta` })
|
||||
return {
|
||||
title: t("title"),
|
||||
description: t("description"),
|
||||
alternates: { canonical: URL },
|
||||
openGraph: { title: t("title"), description: t("description"), type: "article", url: URL },
|
||||
}
|
||||
}
|
||||
|
||||
export default async function Page({ params }: { params: Promise<{ locale: string }> }) {
|
||||
const { locale } = await params
|
||||
setRequestLocale(locale)
|
||||
return <DocPage locale={locale} namespace={NAMESPACE} minutes={5} />
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
import type { Metadata } from "next"
|
||||
import { getTranslations, setRequestLocale } from "next-intl/server"
|
||||
import { DocPage } from "@/components/docs/DocBlocks"
|
||||
|
||||
const NAMESPACE = "docs.monitor.auditReport"
|
||||
const LINKS = {
|
||||
healthLink: "/docs/monitor/health-monitor",
|
||||
}
|
||||
const URL = "https://proxmenux.com/docs/monitor/audit-report"
|
||||
|
||||
export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }): Promise<Metadata> {
|
||||
const { locale } = await params
|
||||
const t = await getTranslations({ locale, namespace: `${NAMESPACE}.meta` })
|
||||
return {
|
||||
title: t("title"),
|
||||
description: t("description"),
|
||||
alternates: { canonical: URL },
|
||||
openGraph: { title: t("title"), description: t("description"), type: "article", url: URL },
|
||||
}
|
||||
}
|
||||
|
||||
export default async function Page({ params }: { params: Promise<{ locale: string }> }) {
|
||||
const { locale } = await params
|
||||
setRequestLocale(locale)
|
||||
return <DocPage locale={locale} namespace={NAMESPACE} minutes={3} links={LINKS} />
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
import type { Metadata } from "next"
|
||||
import { getTranslations, setRequestLocale } from "next-intl/server"
|
||||
import { DocPage } from "@/components/docs/DocBlocks"
|
||||
|
||||
const NAMESPACE = "docs.monitor.auditReport.policy"
|
||||
const URL = "https://proxmenux.com/docs/monitor/audit-report/policy"
|
||||
|
||||
export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }): Promise<Metadata> {
|
||||
const { locale } = await params
|
||||
const t = await getTranslations({ locale, namespace: `${NAMESPACE}.meta` })
|
||||
return {
|
||||
title: t("title"),
|
||||
description: t("description"),
|
||||
alternates: { canonical: URL },
|
||||
openGraph: { title: t("title"), description: t("description"), type: "article", url: URL },
|
||||
}
|
||||
}
|
||||
|
||||
export default async function Page({ params }: { params: Promise<{ locale: string }> }) {
|
||||
const { locale } = await params
|
||||
setRequestLocale(locale)
|
||||
return <DocPage locale={locale} namespace={NAMESPACE} minutes={4} />
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
import type { Metadata } from "next"
|
||||
import { getTranslations, setRequestLocale } from "next-intl/server"
|
||||
import { DocPage } from "@/components/docs/DocBlocks"
|
||||
|
||||
const NAMESPACE = "docs.monitor.auditReport.reports"
|
||||
const URL = "https://proxmenux.com/docs/monitor/audit-report/reports"
|
||||
|
||||
export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }): Promise<Metadata> {
|
||||
const { locale } = await params
|
||||
const t = await getTranslations({ locale, namespace: `${NAMESPACE}.meta` })
|
||||
return {
|
||||
title: t("title"),
|
||||
description: t("description"),
|
||||
alternates: { canonical: URL },
|
||||
openGraph: { title: t("title"), description: t("description"), type: "article", url: URL },
|
||||
}
|
||||
}
|
||||
|
||||
export default async function Page({ params }: { params: Promise<{ locale: string }> }) {
|
||||
const { locale } = await params
|
||||
setRequestLocale(locale)
|
||||
return <DocPage locale={locale} namespace={NAMESPACE} minutes={6} />
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
import type { Metadata } from "next"
|
||||
import { getTranslations, setRequestLocale } from "next-intl/server"
|
||||
import { DocPage } from "@/components/docs/DocBlocks"
|
||||
|
||||
const NAMESPACE = "docs.monitor.auditReport.scope"
|
||||
const URL = "https://proxmenux.com/docs/monitor/audit-report/scope"
|
||||
|
||||
export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }): Promise<Metadata> {
|
||||
const { locale } = await params
|
||||
const t = await getTranslations({ locale, namespace: `${NAMESPACE}.meta` })
|
||||
return {
|
||||
title: t("title"),
|
||||
description: t("description"),
|
||||
alternates: { canonical: URL },
|
||||
openGraph: { title: t("title"), description: t("description"), type: "article", url: URL },
|
||||
}
|
||||
}
|
||||
|
||||
export default async function Page({ params }: { params: Promise<{ locale: string }> }) {
|
||||
const { locale } = await params
|
||||
setRequestLocale(locale)
|
||||
return <DocPage locale={locale} namespace={NAMESPACE} minutes={3} />
|
||||
}
|
||||
@@ -292,6 +292,16 @@ export default async function VmsLxcsTabPage({
|
||||
{t("drillIn.mountsCalloutBody")}
|
||||
</Callout>
|
||||
|
||||
<h3 className="text-lg font-semibold mt-8 mb-2 text-gray-900">{t("drillIn.logsTitle")}</h3>
|
||||
<p className="mb-4 text-gray-800 leading-relaxed">
|
||||
{t.rich("drillIn.logsBody", {
|
||||
code,
|
||||
ociLink: (chunks: React.ReactNode) => (
|
||||
<Link href="/docs/oci-manager/monitor" className="text-blue-600 hover:underline">{chunks}</Link>
|
||||
),
|
||||
})}
|
||||
</p>
|
||||
|
||||
<h3 className="text-lg font-semibold mt-8 mb-2 text-gray-900">{t("drillIn.backupsTitle")}</h3>
|
||||
|
||||
<figure className="my-4">
|
||||
|
||||
@@ -173,7 +173,7 @@ export default async function HealthMonitorPage({
|
||||
<tr key={row.category} className={idx < categoryRows.length - 1 ? "border-b border-gray-100" : ""}>
|
||||
<td className="px-3 py-2 align-top whitespace-nowrap"><strong>{row.category}</strong></td>
|
||||
<td className="px-3 py-2 align-top">{t.rich(`categories.rows.${idx}.checks`, { code })}</td>
|
||||
<td className="px-3 py-2 align-top">{t.rich(`categories.rows.${idx}.events`, { code })}</td>
|
||||
<td className="px-3 py-2 align-top">{t.rich(`categories.rows.${idx}.events`, { code, em })}</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
import type { Metadata } from "next"
|
||||
import { getTranslations, setRequestLocale } from "next-intl/server"
|
||||
import { DocPage } from "@/components/docs/DocBlocks"
|
||||
|
||||
const NAMESPACE = "docs.ociManager.architecture"
|
||||
const URL = "https://proxmenux.com/docs/oci-manager/architecture"
|
||||
|
||||
export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }): Promise<Metadata> {
|
||||
const { locale } = await params
|
||||
const t = await getTranslations({ locale, namespace: `${NAMESPACE}.meta` })
|
||||
return {
|
||||
title: t("title"),
|
||||
description: t("description"),
|
||||
alternates: { canonical: URL },
|
||||
openGraph: { title: t("title"), description: t("description"), type: "article", url: URL },
|
||||
}
|
||||
}
|
||||
|
||||
export default async function Page({ params }: { params: Promise<{ locale: string }> }) {
|
||||
const { locale } = await params
|
||||
setRequestLocale(locale)
|
||||
return <DocPage locale={locale} namespace={NAMESPACE} minutes={6} />
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
import type { Metadata } from "next"
|
||||
import { getTranslations, setRequestLocale } from "next-intl/server"
|
||||
import { DocPage } from "@/components/docs/DocBlocks"
|
||||
|
||||
const NAMESPACE = "docs.ociManager.customImage"
|
||||
const URL = "https://proxmenux.com/docs/oci-manager/custom-image"
|
||||
|
||||
export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }): Promise<Metadata> {
|
||||
const { locale } = await params
|
||||
const t = await getTranslations({ locale, namespace: `${NAMESPACE}.meta` })
|
||||
return {
|
||||
title: t("title"),
|
||||
description: t("description"),
|
||||
alternates: { canonical: URL },
|
||||
openGraph: { title: t("title"), description: t("description"), type: "article", url: URL },
|
||||
}
|
||||
}
|
||||
|
||||
export default async function Page({ params }: { params: Promise<{ locale: string }> }) {
|
||||
const { locale } = await params
|
||||
setRequestLocale(locale)
|
||||
return <DocPage locale={locale} namespace={NAMESPACE} minutes={6} />
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
import type { Metadata } from "next"
|
||||
import { getTranslations, setRequestLocale } from "next-intl/server"
|
||||
import { DocPage } from "@/components/docs/DocBlocks"
|
||||
|
||||
const NAMESPACE = "docs.ociManager.hardware"
|
||||
const URL = "https://proxmenux.com/docs/oci-manager/hardware"
|
||||
|
||||
const LINKS = {
|
||||
nvidiaLink: "/docs/hardware/nvidia-host",
|
||||
auditLink: "/docs/monitor/audit-report/changes",
|
||||
toolkitLink: "https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html",
|
||||
}
|
||||
|
||||
export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }): Promise<Metadata> {
|
||||
const { locale } = await params
|
||||
const t = await getTranslations({ locale, namespace: `${NAMESPACE}.meta` })
|
||||
return {
|
||||
title: t("title"),
|
||||
description: t("description"),
|
||||
alternates: { canonical: URL },
|
||||
openGraph: { title: t("title"), description: t("description"), type: "article", url: URL },
|
||||
}
|
||||
}
|
||||
|
||||
export default async function Page({ params }: { params: Promise<{ locale: string }> }) {
|
||||
const { locale } = await params
|
||||
setRequestLocale(locale)
|
||||
return <DocPage locale={locale} namespace={NAMESPACE} minutes={9} links={LINKS} />
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
import type { Metadata } from "next"
|
||||
import { getTranslations, setRequestLocale } from "next-intl/server"
|
||||
import { DocPage } from "@/components/docs/DocBlocks"
|
||||
|
||||
const NAMESPACE = "docs.ociManager.lifecycle"
|
||||
const URL = "https://proxmenux.com/docs/oci-manager/lifecycle"
|
||||
|
||||
const LINKS = {
|
||||
monitorLink: "/docs/oci-manager/monitor",
|
||||
}
|
||||
|
||||
export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }): Promise<Metadata> {
|
||||
const { locale } = await params
|
||||
const t = await getTranslations({ locale, namespace: `${NAMESPACE}.meta` })
|
||||
return {
|
||||
title: t("title"),
|
||||
description: t("description"),
|
||||
alternates: { canonical: URL },
|
||||
openGraph: { title: t("title"), description: t("description"), type: "article", url: URL },
|
||||
}
|
||||
}
|
||||
|
||||
export default async function Page({ params }: { params: Promise<{ locale: string }> }) {
|
||||
const { locale } = await params
|
||||
setRequestLocale(locale)
|
||||
return <DocPage locale={locale} namespace={NAMESPACE} minutes={7} links={LINKS} />
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
import type { Metadata } from "next"
|
||||
import { getTranslations, setRequestLocale } from "next-intl/server"
|
||||
import { DocPage } from "@/components/docs/DocBlocks"
|
||||
|
||||
const NAMESPACE = "docs.ociManager.monitor"
|
||||
const URL = "https://proxmenux.com/docs/oci-manager/monitor"
|
||||
|
||||
const LINKS = {
|
||||
appLink: "/docs/monitor/dashboard/vms-lxcs/app",
|
||||
notificationsLink: "/docs/monitor/notifications",
|
||||
lifecycleLink: "/docs/oci-manager/lifecycle",
|
||||
mountsLink: "/docs/monitor/dashboard/vms-lxcs",
|
||||
}
|
||||
|
||||
export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }): Promise<Metadata> {
|
||||
const { locale } = await params
|
||||
const t = await getTranslations({ locale, namespace: `${NAMESPACE}.meta` })
|
||||
return {
|
||||
title: t("title"),
|
||||
description: t("description"),
|
||||
alternates: { canonical: URL },
|
||||
openGraph: { title: t("title"), description: t("description"), type: "article", url: URL },
|
||||
}
|
||||
}
|
||||
|
||||
export default async function Page({ params }: { params: Promise<{ locale: string }> }) {
|
||||
const { locale } = await params
|
||||
setRequestLocale(locale)
|
||||
return <DocPage locale={locale} namespace={NAMESPACE} minutes={6} links={LINKS} />
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
import type { Metadata } from "next"
|
||||
import { getTranslations, setRequestLocale } from "next-intl/server"
|
||||
import { DocPage } from "@/components/docs/DocBlocks"
|
||||
|
||||
const NAMESPACE = "docs.ociManager"
|
||||
const URL = "https://proxmenux.com/docs/oci-manager"
|
||||
|
||||
export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }): Promise<Metadata> {
|
||||
const { locale } = await params
|
||||
const t = await getTranslations({ locale, namespace: `${NAMESPACE}.meta` })
|
||||
return {
|
||||
title: t("title"),
|
||||
description: t("description"),
|
||||
alternates: { canonical: URL },
|
||||
openGraph: { title: t("title"), description: t("description"), type: "article", url: URL },
|
||||
}
|
||||
}
|
||||
|
||||
export default async function Page({ params }: { params: Promise<{ locale: string }> }) {
|
||||
const { locale } = await params
|
||||
setRequestLocale(locale)
|
||||
return <DocPage locale={locale} namespace={NAMESPACE} minutes={4} />
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
import type { Metadata } from "next"
|
||||
import { getTranslations, setRequestLocale } from "next-intl/server"
|
||||
import { DocPage } from "@/components/docs/DocBlocks"
|
||||
|
||||
const NAMESPACE = "docs.ociManager.stacks"
|
||||
const URL = "https://proxmenux.com/docs/oci-manager/stacks"
|
||||
|
||||
export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }): Promise<Metadata> {
|
||||
const { locale } = await params
|
||||
const t = await getTranslations({ locale, namespace: `${NAMESPACE}.meta` })
|
||||
return {
|
||||
title: t("title"),
|
||||
description: t("description"),
|
||||
alternates: { canonical: URL },
|
||||
openGraph: { title: t("title"), description: t("description"), type: "article", url: URL },
|
||||
}
|
||||
}
|
||||
|
||||
export default async function Page({ params }: { params: Promise<{ locale: string }> }) {
|
||||
const { locale } = await params
|
||||
setRequestLocale(locale)
|
||||
return <DocPage locale={locale} namespace={NAMESPACE} minutes={10} />
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
import type { Metadata } from "next"
|
||||
import { getTranslations, setRequestLocale } from "next-intl/server"
|
||||
import { DocPage } from "@/components/docs/DocBlocks"
|
||||
|
||||
const NAMESPACE = "docs.ociManager.storageNetwork"
|
||||
const URL = "https://proxmenux.com/docs/oci-manager/storage-network"
|
||||
|
||||
export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }): Promise<Metadata> {
|
||||
const { locale } = await params
|
||||
const t = await getTranslations({ locale, namespace: `${NAMESPACE}.meta` })
|
||||
return {
|
||||
title: t("title"),
|
||||
description: t("description"),
|
||||
alternates: { canonical: URL },
|
||||
openGraph: { title: t("title"), description: t("description"), type: "article", url: URL },
|
||||
}
|
||||
}
|
||||
|
||||
export default async function Page({ params }: { params: Promise<{ locale: string }> }) {
|
||||
const { locale } = await params
|
||||
setRequestLocale(locale)
|
||||
return <DocPage locale={locale} namespace={NAMESPACE} minutes={8} />
|
||||
}
|
||||
@@ -175,11 +175,11 @@ export default async function SystemUpdatePage({
|
||||
|
||||
<h2 className="text-2xl font-semibold mt-10 mb-4 text-gray-900">{t("noSub.heading")}</h2>
|
||||
<p className="mb-6 text-gray-800 leading-relaxed">
|
||||
{t.rich("noSub.intro", { code })}
|
||||
{t.rich("noSub.intro", { code, strong })}
|
||||
</p>
|
||||
<ol className="list-decimal pl-6 mb-6 text-gray-800 leading-relaxed space-y-1">
|
||||
{noSubItems.map((_, idx) => (
|
||||
<li key={idx}>{t.rich(`noSub.items.${idx}`, { code })}</li>
|
||||
<li key={idx}>{t.rich(`noSub.items.${idx}`, { code, strong })}</li>
|
||||
))}
|
||||
</ol>
|
||||
<p className="mb-6 text-gray-800 leading-relaxed">{t("noSub.outro")}</p>
|
||||
|
||||
Reference in New Issue
Block a user