mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-09-14 10:47:36 +00:00
New version 1.2.5
Stable release consolidating the v1.2.4 beta cycle (1.2.4.1-beta and 1.2.4.2-beta) into 1.2.5. Highlights: - Apps dashboard: single launcher for every LXC-registered app and user-defined Custom Web Link, with category badges, search, sort and one-click deep-links back to the guest modal. - LXC Apps & Updates end-to-end: App tab inside every guest modal, upstream version tracking, and Easy Updates that cover OS packages, registered apps, Docker Engine and per-image updates on the same 24-hour cycle. - Application detection catalog with 380+ tracked workloads generated live from community-scripts across seven detector methods. - Monitor now speaks 8 languages: English, Spanish, German, French, Italian, Portuguese, Slovak and Swedish (i18n scaffolding by @vaso73). - NVIDIA multi-GPU passthrough by exact BDF so one card can be assigned to a VM while another stays operational on the host or LXC. - Navigation reorder, Memory & Swap real memory-pressure signal, native Pushover channel, Actions API, plus wide-reaching improvements across health, hardware, network, backup and post-install. Full release notes: see CHANGELOG.md and https://github.com/MacRimi/ProxMenux/releases
This commit is contained in:
@@ -0,0 +1,181 @@
|
||||
import type { Metadata } from "next"
|
||||
import type React from "react"
|
||||
import { getMessages, getTranslations, setRequestLocale } from "next-intl/server"
|
||||
import { Link } from "@/i18n/navigation"
|
||||
import { Callout } from "@/components/ui/callout"
|
||||
import { DocHeader } from "@/components/ui/doc-header"
|
||||
|
||||
export async function generateMetadata({
|
||||
params,
|
||||
}: {
|
||||
params: Promise<{ locale: string }>
|
||||
}): Promise<Metadata> {
|
||||
const { locale } = await params
|
||||
const t = await getTranslations({ locale, namespace: "docs.monitor.dashboard.apps.meta" })
|
||||
return { title: t("title"), description: t("description") }
|
||||
}
|
||||
|
||||
type SourceRow = { source: string; appears: string; managedFrom: string }
|
||||
type FieldRow = { field: string; required: string; purpose: string }
|
||||
type ProblemRow = { problem: string; resolution: string }
|
||||
|
||||
export default async function AppsDashboardPage({
|
||||
params,
|
||||
}: {
|
||||
params: Promise<{ locale: string }>
|
||||
}) {
|
||||
const { locale } = await params
|
||||
setRequestLocale(locale)
|
||||
const t = await getTranslations({ locale, namespace: "docs.monitor.dashboard.apps" })
|
||||
const messages = (await getMessages({ locale })) as unknown as {
|
||||
docs: { monitor: { dashboard: { apps: {
|
||||
sources: { rows: SourceRow[] }
|
||||
cards: { items: string[] }
|
||||
toolbar: { items: string[] }
|
||||
customLinks: { steps: string[]; fields: FieldRow[] }
|
||||
categories: { items: string[] }
|
||||
persistence: { items: string[] }
|
||||
troubleshooting: { rows: ProblemRow[] }
|
||||
whereNext: { items: { label: string; href: string; tail: string }[] }
|
||||
} } } }
|
||||
}
|
||||
const a = messages.docs.monitor.dashboard.apps
|
||||
|
||||
const strong = (chunks: React.ReactNode) => <strong>{chunks}</strong>
|
||||
const em = (chunks: React.ReactNode) => <em>{chunks}</em>
|
||||
const code = (chunks: React.ReactNode) => <code className="rounded bg-gray-100 px-1 text-sm">{chunks}</code>
|
||||
const appTabLink = (chunks: React.ReactNode) => (
|
||||
<Link href="/docs/monitor/dashboard/vms-lxcs/app" className="text-blue-600 hover:underline">{chunks}</Link>
|
||||
)
|
||||
const updatesLink = (chunks: React.ReactNode) => (
|
||||
<Link href="/docs/monitor/dashboard/vms-lxcs/updates" className="text-blue-600 hover:underline">{chunks}</Link>
|
||||
)
|
||||
const settingsLink = (chunks: React.ReactNode) => (
|
||||
<Link href="/docs/monitor/dashboard/settings#navigation-order" className="text-blue-600 hover:underline">{chunks}</Link>
|
||||
)
|
||||
const richList = (base: string, items: string[]) => (
|
||||
<ul className="mt-2 list-disc space-y-2 pl-6 text-gray-800">
|
||||
{items.map((_, idx) => (
|
||||
<li key={idx}>{t.rich(`${base}.${idx}`, { strong, em, code, appTabLink, updatesLink, settingsLink })}</li>
|
||||
))}
|
||||
</ul>
|
||||
)
|
||||
|
||||
return (
|
||||
<div className="mx-auto max-w-4xl px-4 py-8">
|
||||
<DocHeader
|
||||
title={t("header.title")}
|
||||
description={t("header.description")}
|
||||
section={t("header.section")}
|
||||
estimatedMinutes={6}
|
||||
/>
|
||||
|
||||
<Callout variant="info" title={t("intro.title")}>
|
||||
{t.rich("intro.body", { strong, appTabLink })}
|
||||
</Callout>
|
||||
|
||||
<h2 className="mt-10 mb-4 text-2xl font-semibold text-gray-900">{t("sources.heading")}</h2>
|
||||
<p className="mb-4 text-gray-800 leading-relaxed">{t("sources.intro")}</p>
|
||||
<div className="my-4 overflow-x-auto">
|
||||
<table className="w-full border-collapse text-sm">
|
||||
<thead>
|
||||
<tr className="bg-gray-100">
|
||||
<th className="border border-gray-300 px-3 py-2 text-left">{t("sources.colSource")}</th>
|
||||
<th className="border border-gray-300 px-3 py-2 text-left">{t("sources.colAppears")}</th>
|
||||
<th className="border border-gray-300 px-3 py-2 text-left">{t("sources.colManagedFrom")}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{a.sources.rows.map((row) => (
|
||||
<tr key={row.source}>
|
||||
<td className="border border-gray-300 px-3 py-2 font-medium">{row.source}</td>
|
||||
<td className="border border-gray-300 px-3 py-2">{row.appears}</td>
|
||||
<td className="border border-gray-300 px-3 py-2">{row.managedFrom}</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<Callout variant="tip" title={t("sources.relationshipTitle")}>
|
||||
{t.rich("sources.relationshipBody", { strong, appTabLink })}
|
||||
</Callout>
|
||||
|
||||
<h2 className="mt-10 mb-4 text-2xl font-semibold text-gray-900">{t("cards.heading")}</h2>
|
||||
<p className="text-gray-800">{t("cards.intro")}</p>
|
||||
{richList("cards.items", a.cards.items)}
|
||||
|
||||
<h2 className="mt-10 mb-4 text-2xl font-semibold text-gray-900">{t("toolbar.heading")}</h2>
|
||||
<p className="text-gray-800">{t("toolbar.intro")}</p>
|
||||
{richList("toolbar.items", a.toolbar.items)}
|
||||
|
||||
<h2 className="mt-10 mb-4 text-2xl font-semibold text-gray-900">{t("customLinks.heading")}</h2>
|
||||
<p className="text-gray-800">{t("customLinks.intro")}</p>
|
||||
<ol className="mt-2 list-decimal space-y-2 pl-6 text-gray-800">
|
||||
{a.customLinks.steps.map((_, idx) => (
|
||||
<li key={idx}>{t.rich(`customLinks.steps.${idx}`, { strong, em, code })}</li>
|
||||
))}
|
||||
</ol>
|
||||
<div className="my-6 overflow-x-auto">
|
||||
<table className="w-full border-collapse text-sm">
|
||||
<thead>
|
||||
<tr className="bg-gray-100">
|
||||
<th className="border border-gray-300 px-3 py-2 text-left">{t("customLinks.colField")}</th>
|
||||
<th className="border border-gray-300 px-3 py-2 text-left">{t("customLinks.colRequired")}</th>
|
||||
<th className="border border-gray-300 px-3 py-2 text-left">{t("customLinks.colPurpose")}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{a.customLinks.fields.map((row) => (
|
||||
<tr key={row.field}>
|
||||
<td className="border border-gray-300 px-3 py-2 font-medium">{row.field}</td>
|
||||
<td className="border border-gray-300 px-3 py-2">{row.required}</td>
|
||||
<td className="border border-gray-300 px-3 py-2">{row.purpose}</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<Callout variant="warning" title={t("customLinks.editTitle")}>
|
||||
{t.rich("customLinks.editBody", { strong, appTabLink })}
|
||||
</Callout>
|
||||
|
||||
<h2 className="mt-10 mb-4 text-2xl font-semibold text-gray-900">{t("categories.heading")}</h2>
|
||||
<p className="text-gray-800">{t("categories.intro")}</p>
|
||||
{richList("categories.items", a.categories.items)}
|
||||
|
||||
<h2 className="mt-10 mb-4 text-2xl font-semibold text-gray-900">{t("persistence.heading")}</h2>
|
||||
<p className="text-gray-800">{t("persistence.intro")}</p>
|
||||
{richList("persistence.items", a.persistence.items)}
|
||||
|
||||
<h2 className="mt-10 mb-4 text-2xl font-semibold text-gray-900">{t("troubleshooting.heading")}</h2>
|
||||
<div className="my-4 overflow-x-auto">
|
||||
<table className="w-full border-collapse text-sm">
|
||||
<thead>
|
||||
<tr className="bg-gray-100">
|
||||
<th className="border border-gray-300 px-3 py-2 text-left">{t("troubleshooting.colProblem")}</th>
|
||||
<th className="border border-gray-300 px-3 py-2 text-left">{t("troubleshooting.colResolution")}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{a.troubleshooting.rows.map((row) => (
|
||||
<tr key={row.problem}>
|
||||
<td className="border border-gray-300 px-3 py-2 font-medium">{row.problem}</td>
|
||||
<td className="border border-gray-300 px-3 py-2">{row.resolution}</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<h2 className="mt-10 mb-4 text-2xl font-semibold text-gray-900">{t("whereNext.heading")}</h2>
|
||||
<ul className="list-disc space-y-1 pl-6 text-gray-800">
|
||||
{a.whereNext.items.map((item) => (
|
||||
<li key={item.href}>
|
||||
<Link href={item.href} className="text-blue-600 hover:underline">{item.label}</Link>
|
||||
{item.tail}
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -55,7 +55,7 @@ export default async function DashboardIndexPage({
|
||||
title={t("header.title")}
|
||||
description={t("header.description")}
|
||||
section={t("header.section")}
|
||||
estimatedMinutes={3}
|
||||
estimatedMinutes={4}
|
||||
/>
|
||||
|
||||
<Callout variant="info" title={t("oneHeader.title")}>
|
||||
|
||||
@@ -31,6 +31,8 @@ export default async function SettingsTabPage({
|
||||
|
||||
const messages = (await getMessages({ locale })) as unknown as {
|
||||
docs: { monitor: { dashboard: { settings: {
|
||||
interfaceLanguage: { items: string[] }
|
||||
navigationOrder: { items: string[] }
|
||||
health: { items: string[]; activeItems: string[] }
|
||||
thresholds: {
|
||||
whatForItems: string[]
|
||||
@@ -47,6 +49,8 @@ export default async function SettingsTabPage({
|
||||
} } } }
|
||||
}
|
||||
const s = messages.docs.monitor.dashboard.settings
|
||||
const interfaceLanguageItems = s.interfaceLanguage.items
|
||||
const navigationOrderItems = s.navigationOrder.items
|
||||
const healthItems = s.health.items
|
||||
const activeSuppressionItems = s.health.activeItems
|
||||
const whatForItems = s.thresholds.whatForItems
|
||||
@@ -99,13 +103,39 @@ export default async function SettingsTabPage({
|
||||
title={t("header.title")}
|
||||
description={t("header.description")}
|
||||
section={t("header.section")}
|
||||
estimatedMinutes={9}
|
||||
estimatedMinutes={10}
|
||||
/>
|
||||
|
||||
<Callout variant="info" title={t("intro.title")}>
|
||||
{t("intro.body")}
|
||||
</Callout>
|
||||
|
||||
<h2 id="interface-language" className="text-2xl font-semibold mt-10 mb-4 text-gray-900">{t("interfaceLanguage.heading")}</h2>
|
||||
<p className="mb-4 text-gray-800 leading-relaxed">
|
||||
{t.rich("interfaceLanguage.intro", { strong, code })}
|
||||
</p>
|
||||
<ul className="list-disc pl-6 mb-4 text-gray-800 leading-relaxed space-y-1">
|
||||
{interfaceLanguageItems.map((_, idx) => (
|
||||
<li key={idx}>{t.rich(`interfaceLanguage.items.${idx}`, { strong, code })}</li>
|
||||
))}
|
||||
</ul>
|
||||
<Callout variant="tip" title={t("interfaceLanguage.scopeTitle")}>
|
||||
{t.rich("interfaceLanguage.scopeBody", { strong, code })}
|
||||
</Callout>
|
||||
|
||||
<h2 id="navigation-order" className="text-2xl font-semibold mt-10 mb-4 text-gray-900">{t("navigationOrder.heading")}</h2>
|
||||
<p className="mb-4 text-gray-800 leading-relaxed">
|
||||
{t.rich("navigationOrder.intro", { strong, code })}
|
||||
</p>
|
||||
<ul className="list-disc pl-6 mb-4 text-gray-800 leading-relaxed space-y-1">
|
||||
{navigationOrderItems.map((_, idx) => (
|
||||
<li key={idx}>{t.rich(`navigationOrder.items.${idx}`, { strong, code })}</li>
|
||||
))}
|
||||
</ul>
|
||||
<Callout variant="info" title={t("navigationOrder.landingTitle")}>
|
||||
{t.rich("navigationOrder.landingBody", { strong, code })}
|
||||
</Callout>
|
||||
|
||||
<h2 className="text-2xl font-semibold mt-10 mb-4 text-gray-900">{t("networkUnits.heading")}</h2>
|
||||
|
||||
<figure className="my-4">
|
||||
|
||||
@@ -62,6 +62,11 @@ export default async function AppTabPage({
|
||||
{chunks}
|
||||
</Link>
|
||||
)
|
||||
const linkApps = (chunks: React.ReactNode) => (
|
||||
<Link href="/docs/monitor/dashboard/apps" className="text-blue-600 hover:underline">
|
||||
{chunks}
|
||||
</Link>
|
||||
)
|
||||
const richList = (base: string, items: string[]) => (
|
||||
<ul className="mt-2 list-disc space-y-2 pl-6 text-gray-800">
|
||||
{items.map((_, idx) => (
|
||||
@@ -77,6 +82,9 @@ export default async function AppTabPage({
|
||||
<p className="mt-6 text-gray-800">{t.rich("intro.p1", { strong, em, code })}</p>
|
||||
<p className="mt-4 text-gray-800">{t.rich("intro.p2", { strong, em, code, link: linkUpdates })}</p>
|
||||
<Callout variant="info">{t.rich("intro.callout", { strong, em, code })}</Callout>
|
||||
<Callout variant="tip" title={t("intro.dashboardTitle")}>
|
||||
{t.rich("intro.dashboard", { strong, appsLink: linkApps })}
|
||||
</Callout>
|
||||
|
||||
<h2 className="mt-10 mb-4 text-2xl font-semibold text-gray-900">{t("overview.heading")}</h2>
|
||||
<p className="text-gray-800">{t("overview.lead")}</p>
|
||||
|
||||
@@ -60,6 +60,7 @@ export const sidebarItems: MenuItem[] = [
|
||||
href: "/docs/monitor/dashboard",
|
||||
submenu: [
|
||||
{ title: "System Overview tab", i18nKey: "dashboardSystemOverview", href: "/docs/monitor/dashboard/system-overview" },
|
||||
{ title: "Apps tab", i18nKey: "dashboardApps", href: "/docs/monitor/dashboard/apps" },
|
||||
{ title: "Storage tab", i18nKey: "dashboardStorage", href: "/docs/monitor/dashboard/storage" },
|
||||
{ title: "Network tab", i18nKey: "dashboardNetwork", href: "/docs/monitor/dashboard/network" },
|
||||
{
|
||||
|
||||
@@ -59,6 +59,7 @@
|
||||
"accessAuth": "Access & Authentication",
|
||||
"dashboard": "Dashboard",
|
||||
"dashboardSystemOverview": "System Overview tab",
|
||||
"dashboardApps": "Apps tab",
|
||||
"dashboardStorage": "Storage tab",
|
||||
"dashboardNetwork": "Network tab",
|
||||
"dashboardVmsLxcs": "VMs & LXCs tab",
|
||||
|
||||
@@ -0,0 +1,127 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Apps dashboard: one launcher for every Web Link | ProxMenux",
|
||||
"description": "Use the Apps dashboard to open registered LXC Web Links and custom links, organize them by category, and jump back to the guest that owns each service."
|
||||
},
|
||||
"header": {
|
||||
"title": "Dashboard: Apps tab",
|
||||
"description": "A single launcher for the web interfaces you use across the node, whether they come from a registered LXC application or a custom Web Link.",
|
||||
"section": "ProxMenux Monitor · Dashboard"
|
||||
},
|
||||
"intro": {
|
||||
"title": "A launcher, not an application installer",
|
||||
"body": "The <strong>Apps</strong> tab does not install software or discover services by itself. It turns saved Web Links into one searchable grid. LXC-owned links are configured in the guest's <appTabLink>App tab</appTabLink>; custom links let you include VM services, reverse proxies and external dashboards."
|
||||
},
|
||||
"sources": {
|
||||
"heading": "What appears in Apps",
|
||||
"intro": "Each launchable URL becomes its own card. The source determines where that card is edited, but not how it looks during normal use.",
|
||||
"colSource": "Source",
|
||||
"colAppears": "What appears",
|
||||
"colManagedFrom": "Where it is managed",
|
||||
"rows": [
|
||||
{
|
||||
"source": "Registered LXC application",
|
||||
"appears": "One card for every Web Link saved on the application record.",
|
||||
"managedFrom": "VMs & LXCs → LXC modal → App"
|
||||
},
|
||||
{
|
||||
"source": "Custom link bound to a guest",
|
||||
"appears": "A service URL associated with a specific VM or LXC.",
|
||||
"managedFrom": "Apps → Edit"
|
||||
},
|
||||
{
|
||||
"source": "Unbound custom link",
|
||||
"appears": "Any HTTP(S) destination, including an external or reverse-proxied service.",
|
||||
"managedFrom": "Apps → Edit"
|
||||
}
|
||||
],
|
||||
"relationshipTitle": "Apps and the LXC App tab have different jobs",
|
||||
"relationshipBody": "The LXC <appTabLink>App tab</appTabLink> owns application identity, Web Links and optional version tracking. The top-level <strong>Apps</strong> tab consumes those links and makes them easy to launch. Editing an LXC-owned card therefore takes you back to its guest record rather than creating a second copy of the configuration."
|
||||
},
|
||||
"cards": {
|
||||
"heading": "How to use a card",
|
||||
"intro": "The whole card is the launch target, while its smaller controls provide context without opening the service.",
|
||||
"items": [
|
||||
"Click the card to open its URL in a new browser tab.",
|
||||
"The logo uses the Web Link logo first and falls back to the application logo when appropriate.",
|
||||
"The category chip uses the same colour and label as the corresponding Web Link in the LXC App tab.",
|
||||
"A guest pill identifies the bound VM or LXC. Click it to open that guest's modal; LXC links land directly on <strong>App</strong>, while VM links open <strong>Status</strong>.",
|
||||
"A purple upward arrow means the specific application or Docker image has an available update. It is not a general update count for the whole guest."
|
||||
]
|
||||
},
|
||||
"toolbar": {
|
||||
"heading": "Search, filter and sort",
|
||||
"intro": "The toolbar narrows a large application collection without changing the saved records.",
|
||||
"items": [
|
||||
"Search matches the application name, guest name, VMID and category.",
|
||||
"The category filter shows one category at a time or all applications.",
|
||||
"Sort by <strong>Name</strong>, <strong>ID</strong> or <strong>Category</strong>. Category sorting inserts group headings between card groups.",
|
||||
"The selected sort order is remembered in this browser. Search text and category filtering reset when the page is revisited.",
|
||||
"The Apps tab remains available when the grid is empty, so the first custom link can be added without registering an LXC application first."
|
||||
]
|
||||
},
|
||||
"customLinks": {
|
||||
"heading": "Adding and editing custom Web Links",
|
||||
"intro": "Use a custom link when the service is not represented by a registered LXC application.",
|
||||
"steps": [
|
||||
"Press <strong>Add link</strong> from the toolbar or the empty state.",
|
||||
"Enter a name and a complete <code>http://</code> or <code>https://</code> URL.",
|
||||
"Optionally add a logo, choose or create a category, and bind the link to a VM or LXC.",
|
||||
"Save it. The new card is inserted into the grid immediately.",
|
||||
"To change or remove a custom link, press <strong>Edit</strong> and use the pencil on its card."
|
||||
],
|
||||
"colField": "Field",
|
||||
"colRequired": "Required",
|
||||
"colPurpose": "Purpose",
|
||||
"fields": [
|
||||
{ "field": "Name", "required": "Yes", "purpose": "The card title and search term." },
|
||||
{ "field": "URL", "required": "Yes", "purpose": "The complete HTTP(S) destination opened by the card." },
|
||||
{ "field": "Logo URL", "required": "No", "purpose": "A remote image shown on the card." },
|
||||
{ "field": "Category", "required": "No", "purpose": "Adds a shared badge and enables category filtering." },
|
||||
{ "field": "Guest binding", "required": "No", "purpose": "Associates the link with a VM or LXC and enables the guest shortcut." }
|
||||
],
|
||||
"editTitle": "Edit the source of truth",
|
||||
"editBody": "Edit mode only exposes pencils for custom links. To change a card generated from a registered LXC application, open that guest's <appTabLink>App tab</appTabLink> and edit the saved Web Link there."
|
||||
},
|
||||
"categories": {
|
||||
"heading": "Categories and update signals",
|
||||
"intro": "Categories organize links; update signals report software state. They are intentionally separate.",
|
||||
"items": [
|
||||
"Catalog-assisted LXC registration can prefill a category, but it remains editable.",
|
||||
"Custom category names can be created from the same selector and then reused by the filter.",
|
||||
"Category colours are deterministic and adapt to the light or dark theme. Purple and red ranges are reserved for update and danger states.",
|
||||
"For Docker Web Links, ProxMenux matches the card to its container or image and reports that image's update state. A Docker Engine update remains in the LXC <updatesLink>Updates tab</updatesLink>."
|
||||
]
|
||||
},
|
||||
"persistence": {
|
||||
"heading": "Persistence and cache behaviour",
|
||||
"intro": "The dashboard is designed to open from already available Monitor data rather than rescan every guest.",
|
||||
"items": [
|
||||
"Custom links are stored atomically in <code>/etc/proxmenux/custom_links.json</code> and warmed into memory when the Monitor starts.",
|
||||
"Registered LXC links remain part of their application's saved Monitor record; the Apps dashboard does not duplicate them into the custom-link file.",
|
||||
"Creating, editing or deleting a custom link refreshes the in-memory list immediately.",
|
||||
"The sort preference is browser-local. It is not synchronized between devices or users.",
|
||||
"The top-level position of Apps is controlled separately by <settingsLink>Settings → Navigation order</settingsLink>."
|
||||
]
|
||||
},
|
||||
"troubleshooting": {
|
||||
"heading": "Common situations",
|
||||
"colProblem": "Situation",
|
||||
"colResolution": "Resolution",
|
||||
"rows": [
|
||||
{ "problem": "An LXC application is registered but no card appears", "resolution": "Open its App tab and add at least one Web Link. Version tracking alone does not create a launcher card." },
|
||||
{ "problem": "The URL or logo is wrong", "resolution": "Edit the custom link in Apps, or edit the Web Link in the owning LXC App tab." },
|
||||
{ "problem": "A Docker service is missing", "resolution": "Edit the registered Docker application and save the service's published web port as a Web Link." },
|
||||
{ "problem": "The purple arrow refers to the wrong Docker update", "resolution": "Review the Web Link name and description so they can be matched to the intended container or image." },
|
||||
{ "problem": "Apps opens first instead of System Overview", "resolution": "The first saved item in Settings → Navigation order becomes the landing tab. Restore the default order or move Overview first." }
|
||||
]
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Where to next",
|
||||
"items": [
|
||||
{ "label": "LXC App tab", "href": "/docs/monitor/dashboard/vms-lxcs/app", "tail": " — register applications, Web Links and optional version tracking." },
|
||||
{ "label": "LXC Updates tab", "href": "/docs/monitor/dashboard/vms-lxcs/updates", "tail": " — configure and run application, Docker Engine and image updates." },
|
||||
{ "label": "Settings tab", "href": "/docs/monitor/dashboard/settings#navigation-order", "tail": " — change the navigation order and landing tab." }
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1,19 +1,19 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Dashboard | ProxMenux Documentation",
|
||||
"description": "The dashboard is the main UI of ProxMenux Monitor: nine tabs (System Overview, Storage, Network, VMs & LXCs, Hardware, System Logs, Terminal, Security, Settings) plus the global header with the Health Monitor status pill."
|
||||
"description": "The dashboard is the main UI of ProxMenux Monitor: ten content tabs including the Apps launcher, plus the global header and a configurable top-level navigation order."
|
||||
},
|
||||
"header": {
|
||||
"title": "Dashboard",
|
||||
"description": "The dashboard is the everyday view of ProxMenux Monitor — nine tabs each focused on one slice of the host plus a global header with the Health Monitor status pill, the node identity and the quick-refresh control.",
|
||||
"description": "The dashboard is the everyday view of ProxMenux Monitor — ten content tabs, including the Apps launcher, plus a global header and a configurable top-level navigation order.",
|
||||
"section": "ProxMenux Monitor"
|
||||
},
|
||||
"oneHeader": {
|
||||
"title": "One header, nine tabs",
|
||||
"title": "One header, ten tabs",
|
||||
"body": "The header (logo, node name, status pill, uptime, refresh, theme toggle) stays visible everywhere. The active tab below it changes the entire content area. The status pill colour mirrors the worst category of the <link>Health Monitor</link> — it's the same data point seen from the dashboard."
|
||||
},
|
||||
"tabs": {
|
||||
"heading": "The nine tabs",
|
||||
"heading": "The ten tabs",
|
||||
"intro": "Each tab has its own dedicated page. Pages are added incrementally as the documentation is filled in; below is the full list and what each one is responsible for.",
|
||||
"headerTab": "Tab",
|
||||
"headerOwns": "What it owns",
|
||||
@@ -21,7 +21,12 @@
|
||||
{
|
||||
"name": "System Overview",
|
||||
"linksTo": "/docs/monitor/dashboard/system-overview",
|
||||
"owns": "CPU / memory / temperature widgets, active VM & LXC count, historical metrics charts, storage and network summaries. Default landing tab."
|
||||
"owns": "CPU / memory / temperature widgets, active VM & LXC count, historical metrics charts, storage and network summaries. Default landing tab until Navigation order is customized."
|
||||
},
|
||||
{
|
||||
"name": "Apps",
|
||||
"linksTo": "/docs/monitor/dashboard/apps",
|
||||
"owns": "Unified launcher for registered LXC Web Links and custom links, with categories, search, guest shortcuts and per-application update signals."
|
||||
},
|
||||
{
|
||||
"name": "Storage",
|
||||
@@ -53,7 +58,7 @@
|
||||
},
|
||||
{
|
||||
"name": "Settings",
|
||||
"owns": "Notification channels, AI provider, suppression durations, branding, advanced flags."
|
||||
"owns": "Monitor language, navigation order, notification channels, AI provider, health thresholds, exclusions and post-install optimization inventory."
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -71,6 +76,11 @@
|
||||
"whereNext": {
|
||||
"heading": "Where to next",
|
||||
"items": [
|
||||
{
|
||||
"label": "Apps tab",
|
||||
"href": "/docs/monitor/dashboard/apps",
|
||||
"tail": " — the unified Web Link launcher and its relationship with registered LXC applications."
|
||||
},
|
||||
{
|
||||
"label": "System Overview tab",
|
||||
"href": "/docs/monitor/dashboard/system-overview",
|
||||
|
||||
@@ -1,17 +1,42 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Dashboard: Settings tab | ProxMenux Documentation",
|
||||
"description": "The Settings tab groups dashboard preferences (network units, suppression durations, storage / interface exclusions), the embedded notification + AI panel, and a transparent inventory of every ProxMenux post-install optimization currently active on the host with click-through to its source code."
|
||||
"description": "The Settings tab controls the Monitor language, navigation order, dashboard preferences, health thresholds and exclusions, notifications, AI and the post-install optimization inventory."
|
||||
},
|
||||
"header": {
|
||||
"title": "Dashboard: Settings tab",
|
||||
"description": "Dashboard preferences, monitoring exclusions, the embedded notification + AI configuration panel, and a live inventory of the ProxMenux post-install optimizations currently active on the host.",
|
||||
"description": "Monitor language, navigation order, dashboard preferences, monitoring exclusions, notifications, AI configuration and the live ProxMenux optimization inventory.",
|
||||
"section": "ProxMenux Monitor · Dashboard"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Where each setting actually lives",
|
||||
"body": "The Settings tab is a single surface for several distinct concerns: how the dashboard renders, what gets watched by the Health Monitor, how alerts go out, and what ProxMenux has already changed on the host. Cards that have their own deep documentation page link out rather than duplicating content here — Settings is the entry point, not the manual."
|
||||
},
|
||||
"interfaceLanguage": {
|
||||
"heading": "Interface Language",
|
||||
"intro": "Choose the language used by the <strong>web Monitor</strong>. The change is applied immediately to the current interface; it does not restart the service and does not alter the language used by ProxMenux shell menus.",
|
||||
"items": [
|
||||
"ProxMenux Monitor currently offers English, German, Spanish, French, Italian, Portuguese, Slovak and Swedish.",
|
||||
"On the first visit, the Monitor uses the browser language when it is supported; otherwise it falls back to English.",
|
||||
"Changing the selection updates the page language and synchronizes other open tabs from the same browser profile.",
|
||||
"If a translated key is missing, only that text falls back to English instead of rendering a broken placeholder."
|
||||
],
|
||||
"scopeTitle": "Browser-local preference",
|
||||
"scopeBody": "The selection is stored in <code>localStorage</code> under <code>proxmenux-ui-language</code>. It is therefore specific to this browser profile and device, not a node-wide setting. Each operator can choose a different Monitor language."
|
||||
},
|
||||
"navigationOrder": {
|
||||
"heading": "Navigation order",
|
||||
"intro": "Use this card to arrange the seven top-level navigation slots: <strong>Overview, Apps, VMs & LXCs, Node, Backup, Terminal and Admin</strong>. Press <strong>Edit</strong>, drag the rows, then save the result.",
|
||||
"items": [
|
||||
"Mouse dragging starts on press. Touch uses a short 250 ms long-press so normal scrolling is not mistaken for a reorder.",
|
||||
"The grouped <strong>Node</strong> and <strong>Admin</strong> entries move as complete units; their internal pages keep their canonical order.",
|
||||
"The mobile menu follows the same saved order.",
|
||||
"<strong>Restore default</strong> resets the draft order. Save to make the reset permanent.",
|
||||
"A new top-level tab introduced by a future release is appended to an existing custom order rather than deleting the user's arrangement."
|
||||
],
|
||||
"landingTitle": "The first item becomes the landing tab",
|
||||
"landingBody": "The first saved slot is what the Monitor opens after loading. If <strong>Node</strong> is first, the landing page is Storage; if <strong>Admin</strong> is first, it is System Logs. The order is stored only in this browser under <code>proxmenux-nav-order</code>, so different devices can use different workflows."
|
||||
},
|
||||
"networkUnits": {
|
||||
"heading": "Network Units",
|
||||
"imageAlt": "Network Units card with Network Unit Display dropdown set to Bytes",
|
||||
@@ -257,6 +282,16 @@
|
||||
"headerEndpoint": "Endpoint",
|
||||
"headerSource": "Source",
|
||||
"rows": [
|
||||
{
|
||||
"card": "Interface Language",
|
||||
"endpoint": "localStorage",
|
||||
"source": "Browser preference <code>proxmenux-ui-language</code>, initially derived from the browser locale when no saved choice exists."
|
||||
},
|
||||
{
|
||||
"card": "Navigation order",
|
||||
"endpoint": "localStorage",
|
||||
"source": "Browser preference <code>proxmenux-nav-order</code>; it also determines the landing tab."
|
||||
},
|
||||
{
|
||||
"card": "Network Units",
|
||||
"endpoint": "/api/settings",
|
||||
@@ -292,6 +327,11 @@
|
||||
"whereNext": {
|
||||
"heading": "Where to next",
|
||||
"items": [
|
||||
{
|
||||
"label": "Apps tab",
|
||||
"href": "/docs/monitor/dashboard/apps",
|
||||
"tail": " — the launcher whose top-level position can be changed with Navigation order."
|
||||
},
|
||||
{
|
||||
"label": "Notifications",
|
||||
"href": "/docs/monitor/notifications",
|
||||
|
||||
@@ -10,7 +10,9 @@
|
||||
"intro": {
|
||||
"p1": "The <strong>App</strong> tab records which applications belong to an LXC. A registration can contain only a name and web link, or also include an installed-version detector and an upstream source.",
|
||||
"p2": "The procedure that changes software is configured separately on the <link>Updates tab</link>. Saving an app never runs an installer or updater.",
|
||||
"callout": "Registration, version tracking and updating are three independent capabilities. Any one can be used without requiring the other two."
|
||||
"callout": "Registration, version tracking and updating are three independent capabilities. Any one can be used without requiring the other two.",
|
||||
"dashboardTitle": "From registration to the Apps launcher",
|
||||
"dashboard": "Every Web Link saved here is also presented as a card in the top-level <appsLink>Apps tab</appsLink>. This LXC page remains the source of truth for the application's name, logo, links and version tracking."
|
||||
},
|
||||
"overview": {
|
||||
"heading": "What an application record can provide",
|
||||
|
||||
@@ -59,6 +59,7 @@
|
||||
"accessAuth": "Acceso y autenticación",
|
||||
"dashboard": "Panel",
|
||||
"dashboardSystemOverview": "Pestaña Resumen del sistema",
|
||||
"dashboardApps": "Pestaña Apps",
|
||||
"dashboardStorage": "Pestaña Almacenamiento",
|
||||
"dashboardNetwork": "Pestaña Red",
|
||||
"dashboardVmsLxcs": "Pestaña VMs y LXCs",
|
||||
@@ -68,7 +69,7 @@
|
||||
"dashboardSystemLogs": "Pestaña Logs del sistema",
|
||||
"dashboardTerminal": "Pestaña Terminal",
|
||||
"dashboardSecurity": "Pestaña Seguridad",
|
||||
"dashboardSettings": "Pestaña Settings",
|
||||
"dashboardSettings": "Pestaña Ajustes",
|
||||
"healthMonitor": "Monitor de salud",
|
||||
"notifications": "Notificaciones",
|
||||
"aiAssistant": "Asistente de IA",
|
||||
|
||||
@@ -0,0 +1,127 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Panel Apps: un lanzador para todos los enlaces web | ProxMenux",
|
||||
"description": "Utiliza el panel Apps para abrir enlaces web registrados en LXCs y enlaces personalizados, organizarlos por categoría y acceder al sistema invitado que aloja cada servicio."
|
||||
},
|
||||
"header": {
|
||||
"title": "Panel: pestaña Apps",
|
||||
"description": "Un único lanzador para las interfaces web que utilizas en el nodo, tanto si proceden de una aplicación registrada en un LXC como de un enlace web personalizado.",
|
||||
"section": "ProxMenux Monitor · Panel"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Un lanzador, no un instalador de aplicaciones",
|
||||
"body": "La pestaña <strong>Apps</strong> no instala software ni descubre servicios por sí sola. Convierte los enlaces web guardados en una cuadrícula con búsqueda. Los enlaces que pertenecen a un LXC se configuran en la <appTabLink>pestaña App</appTabLink> del contenedor; los enlaces personalizados permiten incluir servicios de VMs, proxies inversos y paneles externos."
|
||||
},
|
||||
"sources": {
|
||||
"heading": "Qué aparece en Apps",
|
||||
"intro": "Cada URL que se puede abrir genera su propia tarjeta. El origen determina dónde se edita, pero no cambia su aspecto durante el uso normal.",
|
||||
"colSource": "Origen",
|
||||
"colAppears": "Qué aparece",
|
||||
"colManagedFrom": "Dónde se gestiona",
|
||||
"rows": [
|
||||
{
|
||||
"source": "Aplicación registrada en un LXC",
|
||||
"appears": "Una tarjeta por cada enlace web guardado en el registro de la aplicación.",
|
||||
"managedFrom": "VMs y LXCs → modal del LXC → App"
|
||||
},
|
||||
{
|
||||
"source": "Enlace personalizado asociado a un invitado",
|
||||
"appears": "La URL de un servicio asociado a una VM o un LXC concretos.",
|
||||
"managedFrom": "Apps → Editar"
|
||||
},
|
||||
{
|
||||
"source": "Enlace personalizado sin asociación",
|
||||
"appears": "Cualquier destino HTTP(S), incluido un servicio externo o publicado mediante proxy inverso.",
|
||||
"managedFrom": "Apps → Editar"
|
||||
}
|
||||
],
|
||||
"relationshipTitle": "Apps y la pestaña App del LXC tienen funciones diferentes",
|
||||
"relationshipBody": "La <appTabLink>pestaña App</appTabLink> del LXC gestiona la identidad de la aplicación, sus enlaces web y el seguimiento opcional de versión. La pestaña principal <strong>Apps</strong> utiliza esos enlaces para ofrecer un acceso rápido. Por eso, al editar una tarjeta que pertenece a un LXC se vuelve a su registro original en lugar de crear una segunda configuración."
|
||||
},
|
||||
"cards": {
|
||||
"heading": "Cómo utilizar una tarjeta",
|
||||
"intro": "La tarjeta completa abre el servicio; sus controles pequeños aportan contexto sin abrir la URL.",
|
||||
"items": [
|
||||
"Pulsa la tarjeta para abrir su URL en una pestaña nueva del navegador.",
|
||||
"El logotipo utiliza primero el definido para el enlace web y, cuando corresponde, recurre al logotipo general de la aplicación.",
|
||||
"La etiqueta de categoría utiliza el mismo color y nombre que el enlace correspondiente en la pestaña App del LXC.",
|
||||
"La etiqueta del invitado identifica la VM o el LXC asociado. Púlsala para abrir su modal; los enlaces de LXC abren directamente <strong>App</strong> y los de VM abren <strong>Estado</strong>.",
|
||||
"La flecha morada hacia arriba indica que existe una actualización para esa aplicación o imagen Docker concreta. No representa el total de actualizaciones del invitado."
|
||||
]
|
||||
},
|
||||
"toolbar": {
|
||||
"heading": "Buscar, filtrar y ordenar",
|
||||
"intro": "La barra de herramientas permite reducir una colección grande sin modificar los registros guardados.",
|
||||
"items": [
|
||||
"La búsqueda tiene en cuenta el nombre de la aplicación, el nombre del invitado, el VMID y la categoría.",
|
||||
"El filtro de categoría permite mostrar una categoría concreta o todas las aplicaciones.",
|
||||
"Se puede ordenar por <strong>Nombre</strong>, <strong>ID</strong> o <strong>Categoría</strong>. Al ordenar por categoría se insertan encabezados entre los grupos de tarjetas.",
|
||||
"El orden seleccionado se recuerda en este navegador. El texto de búsqueda y el filtro de categoría se restablecen al volver a la página.",
|
||||
"La pestaña Apps permanece disponible aunque la cuadrícula esté vacía, de modo que se pueda añadir el primer enlace personalizado sin registrar antes una aplicación LXC."
|
||||
]
|
||||
},
|
||||
"customLinks": {
|
||||
"heading": "Añadir y editar enlaces web personalizados",
|
||||
"intro": "Utiliza un enlace personalizado cuando el servicio no esté representado por una aplicación registrada en un LXC.",
|
||||
"steps": [
|
||||
"Pulsa <strong>Añadir enlace</strong> en la barra de herramientas o en el estado vacío.",
|
||||
"Introduce un nombre y una URL completa que empiece por <code>http://</code> o <code>https://</code>.",
|
||||
"Opcionalmente, añade un logotipo, elige o crea una categoría y asocia el enlace a una VM o un LXC.",
|
||||
"Guarda el enlace. La nueva tarjeta se añade a la cuadrícula de inmediato.",
|
||||
"Para modificar o eliminar un enlace personalizado, pulsa <strong>Editar</strong> y utiliza el lápiz de su tarjeta."
|
||||
],
|
||||
"colField": "Campo",
|
||||
"colRequired": "Obligatorio",
|
||||
"colPurpose": "Finalidad",
|
||||
"fields": [
|
||||
{ "field": "Nombre", "required": "Sí", "purpose": "Título de la tarjeta y término de búsqueda." },
|
||||
{ "field": "URL", "required": "Sí", "purpose": "Destino HTTP(S) completo que abre la tarjeta." },
|
||||
{ "field": "URL del logotipo", "required": "No", "purpose": "Imagen remota que se muestra en la tarjeta." },
|
||||
{ "field": "Categoría", "required": "No", "purpose": "Añade una etiqueta común y permite filtrar por categoría." },
|
||||
{ "field": "Asociación a invitado", "required": "No", "purpose": "Vincula el enlace a una VM o un LXC y activa su acceso directo." }
|
||||
],
|
||||
"editTitle": "Edita la fuente original",
|
||||
"editBody": "El modo de edición solo muestra lápices en los enlaces personalizados. Para cambiar una tarjeta generada desde una aplicación LXC registrada, abre la <appTabLink>pestaña App</appTabLink> de ese contenedor y edita allí el enlace web guardado."
|
||||
},
|
||||
"categories": {
|
||||
"heading": "Categorías y señales de actualización",
|
||||
"intro": "Las categorías organizan los enlaces; las señales de actualización informan del estado del software. Son conceptos independientes.",
|
||||
"items": [
|
||||
"El registro asistido por catálogo puede proponer una categoría para una aplicación LXC, pero el usuario siempre puede modificarla.",
|
||||
"Desde el mismo selector se pueden crear categorías propias y reutilizarlas después en el filtro.",
|
||||
"Los colores de las categorías son estables y se adaptan al tema claro u oscuro. El morado y el rojo se reservan para actualizaciones y estados de peligro.",
|
||||
"En los enlaces web de Docker, ProxMenux relaciona la tarjeta con su contenedor o imagen y muestra el estado de actualización de esa imagen. Las actualizaciones de Docker Engine permanecen en la <updatesLink>pestaña Updates</updatesLink> del LXC."
|
||||
]
|
||||
},
|
||||
"persistence": {
|
||||
"heading": "Persistencia y comportamiento de la caché",
|
||||
"intro": "El panel está diseñado para abrirse con los datos ya disponibles en el Monitor, sin volver a analizar todos los invitados.",
|
||||
"items": [
|
||||
"Los enlaces personalizados se guardan de forma atómica en <code>/etc/proxmenux/custom_links.json</code> y se cargan en memoria al iniciar el Monitor.",
|
||||
"Los enlaces registrados en LXCs siguen formando parte del registro guardado de cada aplicación; el panel Apps no los duplica en el archivo de enlaces personalizados.",
|
||||
"Al crear, editar o eliminar un enlace personalizado, la lista en memoria se actualiza de inmediato.",
|
||||
"La preferencia de ordenación se guarda solo en el navegador. No se sincroniza entre dispositivos ni usuarios.",
|
||||
"La posición de Apps en la navegación principal se configura por separado en <settingsLink>Ajustes → Orden de navegación</settingsLink>."
|
||||
]
|
||||
},
|
||||
"troubleshooting": {
|
||||
"heading": "Situaciones habituales",
|
||||
"colProblem": "Situación",
|
||||
"colResolution": "Solución",
|
||||
"rows": [
|
||||
{ "problem": "Una aplicación LXC está registrada, pero no aparece ninguna tarjeta", "resolution": "Abre su pestaña App y añade al menos un enlace web. El seguimiento de versión por sí solo no crea una tarjeta en el lanzador." },
|
||||
{ "problem": "La URL o el logotipo son incorrectos", "resolution": "Edita el enlace personalizado desde Apps o modifica el enlace web en la pestaña App del LXC correspondiente." },
|
||||
{ "problem": "Falta un servicio Docker", "resolution": "Edita la aplicación Docker registrada y guarda el puerto web publicado por el servicio como enlace web." },
|
||||
{ "problem": "La flecha morada corresponde a otra actualización Docker", "resolution": "Revisa el nombre y la descripción del enlace web para que se puedan relacionar con el contenedor o la imagen correctos." },
|
||||
{ "problem": "Apps se abre antes que Resumen del sistema", "resolution": "El primer elemento guardado en Ajustes → Orden de navegación se convierte en la pestaña inicial. Restaura el orden predeterminado o mueve Resumen a la primera posición." }
|
||||
]
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Por dónde seguir",
|
||||
"items": [
|
||||
{ "label": "Pestaña App del LXC", "href": "/docs/monitor/dashboard/vms-lxcs/app", "tail": " — registrar aplicaciones, enlaces web y seguimiento opcional de versión." },
|
||||
{ "label": "Pestaña Updates del LXC", "href": "/docs/monitor/dashboard/vms-lxcs/updates", "tail": " — configurar y ejecutar actualizaciones de aplicaciones, Docker Engine e imágenes." },
|
||||
{ "label": "Pestaña Ajustes", "href": "/docs/monitor/dashboard/settings#navigation-order", "tail": " — cambiar el orden de navegación y la pestaña inicial." }
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1,19 +1,19 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Panel | ProxMenux Documentation",
|
||||
"description": "El panel es la UI principal de ProxMenux Monitor: nueve pestañas (Resumen del sistema, Almacenamiento, Red, VMs y LXCs, Hardware, Logs del sistema, Terminal, Seguridad, Settings) más la cabecera global con la información de estado del Monitor de salud."
|
||||
"description": "El panel es la interfaz principal de ProxMenux Monitor: diez pestañas de contenido, incluido el lanzador Apps, además de la cabecera global y un orden de navegación configurable."
|
||||
},
|
||||
"header": {
|
||||
"title": "Panel",
|
||||
"description": "El panel es la vista del día a día de ProxMenux Monitor — nueve pestañas, cada una centrada en una parte del host, más una cabecera global con la información de estado del Monitor de salud, la identidad del nodo y el control de refresco rápido.",
|
||||
"description": "El panel es la vista diaria de ProxMenux Monitor: diez pestañas de contenido, incluido el lanzador Apps, además de una cabecera global y un orden de navegación configurable.",
|
||||
"section": "ProxMenux Monitor"
|
||||
},
|
||||
"oneHeader": {
|
||||
"title": "Una cabecera, nueve pestañas",
|
||||
"title": "Una cabecera, diez pestañas",
|
||||
"body": "La cabecera (logo, nombre del nodo, información de estado, uptime, refresco, conmutador de tema) permanece visible en todo momento. La pestaña activa que hay debajo cambia el área de contenido entera. El color de la información de estado refleja la peor categoría del <link>Monitor de salud</link> — es el mismo dato visto desde el panel."
|
||||
},
|
||||
"tabs": {
|
||||
"heading": "Las nueve pestañas",
|
||||
"heading": "Las diez pestañas",
|
||||
"intro": "Cada pestaña tiene su propia página dedicada. Las páginas se añaden de forma incremental a medida que se completa la documentación; abajo está la lista completa con lo que cubre cada una.",
|
||||
"headerTab": "Pestaña",
|
||||
"headerOwns": "De qué se encarga",
|
||||
@@ -21,7 +21,12 @@
|
||||
{
|
||||
"name": "Resumen del sistema",
|
||||
"linksTo": "/docs/monitor/dashboard/system-overview",
|
||||
"owns": "Widgets de CPU / memoria / temperatura, contador de VMs y LXCs activos, gráficas de métricas históricas, resúmenes de almacenamiento y red. Pestaña por defecto al entrar."
|
||||
"owns": "Widgets de CPU, memoria y temperatura; contador de VMs y LXCs activos; gráficas históricas y resúmenes de almacenamiento y red. Es la pestaña inicial mientras no se personalice el orden de navegación."
|
||||
},
|
||||
{
|
||||
"name": "Apps",
|
||||
"linksTo": "/docs/monitor/dashboard/apps",
|
||||
"owns": "Lanzador unificado para enlaces web registrados en LXCs y enlaces personalizados, con categorías, búsqueda, acceso al invitado y señales de actualización por aplicación."
|
||||
},
|
||||
{
|
||||
"name": "Almacenamiento",
|
||||
@@ -52,8 +57,8 @@
|
||||
"owns": "Configuración de autenticación, contraseña / 2FA / tokens API, log de auditoría, panel opcional de Fail2Ban, despliegue de Secure Gateway."
|
||||
},
|
||||
{
|
||||
"name": "Settings",
|
||||
"owns": "Canales de notificación, proveedor de IA, duraciones de supresión, branding, flags avanzados."
|
||||
"name": "Ajustes",
|
||||
"owns": "Idioma del Monitor, orden de navegación, canales de notificación, proveedor de IA, umbrales de salud, exclusiones e inventario de optimizaciones."
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -71,10 +76,15 @@
|
||||
"whereNext": {
|
||||
"heading": "Por dónde seguir",
|
||||
"items": [
|
||||
{
|
||||
"label": "Pestaña Apps",
|
||||
"href": "/docs/monitor/dashboard/apps",
|
||||
"tail": " — el lanzador unificado de enlaces web y su relación con las aplicaciones registradas en LXCs."
|
||||
},
|
||||
{
|
||||
"label": "Pestaña Resumen del sistema",
|
||||
"href": "/docs/monitor/dashboard/system-overview",
|
||||
"tail": " — la pestaña por defecto, documentada al completo."
|
||||
"tail": " — la pestaña inicial predeterminada, documentada al completo."
|
||||
},
|
||||
{
|
||||
"label": "Monitor de salud",
|
||||
|
||||
@@ -1,16 +1,41 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "ProxMenux Monitor — Panel: pestaña Settings | ProxMenux Documentation",
|
||||
"description": "La pestaña Settings agrupa las preferencias del panel (unidades de red, duraciones de supresión, exclusiones de almacenamiento / interfaz), el panel embebido de notificaciones + IA y un inventario transparente de cada optimización post-instalación de ProxMenux actualmente activa en el host con acceso al código fuente."
|
||||
"title": "ProxMenux Monitor — Panel: pestaña Ajustes | Documentación de ProxMenux",
|
||||
"description": "La pestaña Ajustes controla el idioma del Monitor, el orden de navegación, las preferencias del panel, los umbrales y exclusiones de salud, las notificaciones, la IA y el inventario de optimizaciones."
|
||||
},
|
||||
"header": {
|
||||
"title": "Panel: pestaña Settings",
|
||||
"description": "Preferencias del panel, exclusiones de monitorización, el panel embebido de configuración de notificaciones + IA y un inventario en vivo de las optimizaciones post-instalación de ProxMenux actualmente activas en el host.",
|
||||
"title": "Panel: pestaña Ajustes",
|
||||
"description": "Idioma del Monitor, orden de navegación, preferencias del panel, exclusiones de monitorización, notificaciones, configuración de IA e inventario de optimizaciones de ProxMenux.",
|
||||
"section": "ProxMenux Monitor · Panel"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Dónde vive realmente cada setting",
|
||||
"body": "La pestaña Settings es una superficie única para varias preocupaciones distintas: cómo renderiza el panel, qué vigila el Monitor de salud, cómo salen las alertas y qué ha cambiado ya ProxMenux en el host. Las tarjetas que tienen su propia página de documentación profunda enlazan en lugar de duplicar el contenido aquí — Settings es el punto de entrada, no el manual."
|
||||
"body": "La pestaña Ajustes reúne varias funciones distintas: cómo se muestra el panel, qué vigila el Monitor de salud, cómo se envían las alertas y qué cambios ha aplicado ProxMenux en el host. Las tarjetas que tienen su propia página de documentación enlazan a ella en lugar de duplicar el contenido: Ajustes es el punto de entrada."
|
||||
},
|
||||
"interfaceLanguage": {
|
||||
"heading": "Idioma de la interfaz",
|
||||
"intro": "Selecciona el idioma de la <strong>interfaz web del Monitor</strong>. El cambio se aplica de inmediato; no reinicia el servicio ni modifica el idioma de los menús de ProxMenux ejecutados en la terminal.",
|
||||
"items": [
|
||||
"ProxMenux Monitor ofrece actualmente inglés, alemán, español, francés, italiano, portugués, eslovaco y sueco.",
|
||||
"En la primera visita, el Monitor utiliza el idioma del navegador si está disponible; en caso contrario, utiliza inglés.",
|
||||
"Al cambiar la selección, se actualiza el idioma de la página y también el de otras pestañas abiertas con el mismo perfil del navegador.",
|
||||
"Si falta una cadena traducida, solo ese texto se muestra en inglés en lugar de presentar una clave rota."
|
||||
],
|
||||
"scopeTitle": "Preferencia local del navegador",
|
||||
"scopeBody": "La selección se guarda en <code>localStorage</code> con la clave <code>proxmenux-ui-language</code>. Por tanto, pertenece a este perfil de navegador y dispositivo; no es un ajuste global del nodo. Cada administrador puede utilizar un idioma distinto."
|
||||
},
|
||||
"navigationOrder": {
|
||||
"heading": "Orden de navegación",
|
||||
"intro": "Esta tarjeta permite ordenar los siete elementos principales: <strong>Resumen, Apps, VMs y LXCs, Nodo, Copias, Terminal y Administración</strong>. Pulsa <strong>Editar</strong>, arrastra las filas y guarda el resultado.",
|
||||
"items": [
|
||||
"Con el ratón, el arrastre comienza al pulsar. En una pantalla táctil se utiliza una pulsación mantenida de 250 ms para no confundir el desplazamiento normal con una reordenación.",
|
||||
"Los grupos <strong>Nodo</strong> y <strong>Administración</strong> se mueven como unidades completas; sus páginas internas conservan el orden establecido por ProxMenux.",
|
||||
"El menú móvil respeta el mismo orden guardado.",
|
||||
"<strong>Restaurar valores predeterminados</strong> restablece el borrador. Es necesario guardar para aplicar el cambio.",
|
||||
"Si una versión futura añade una nueva pestaña principal, esta se incorpora al final del orden personalizado sin borrar la organización del usuario."
|
||||
],
|
||||
"landingTitle": "El primer elemento se convierte en la pestaña inicial",
|
||||
"landingBody": "El primer elemento guardado es la página que abre el Monitor al cargar. Si <strong>Nodo</strong> ocupa la primera posición, se abre Almacenamiento; si la ocupa <strong>Administración</strong>, se abren los Logs del sistema. El orden se guarda solo en este navegador con la clave <code>proxmenux-nav-order</code>, por lo que cada dispositivo puede utilizar una organización distinta."
|
||||
},
|
||||
"networkUnits": {
|
||||
"heading": "Network Units",
|
||||
@@ -257,6 +282,16 @@
|
||||
"headerEndpoint": "Endpoint",
|
||||
"headerSource": "Fuente",
|
||||
"rows": [
|
||||
{
|
||||
"card": "Idioma de la interfaz",
|
||||
"endpoint": "localStorage",
|
||||
"source": "Preferencia del navegador <code>proxmenux-ui-language</code>, obtenida inicialmente del idioma del navegador cuando todavía no existe una selección guardada."
|
||||
},
|
||||
{
|
||||
"card": "Orden de navegación",
|
||||
"endpoint": "localStorage",
|
||||
"source": "Preferencia del navegador <code>proxmenux-nav-order</code>; también determina la pestaña inicial."
|
||||
},
|
||||
{
|
||||
"card": "Network Units",
|
||||
"endpoint": "/api/settings",
|
||||
@@ -292,6 +327,11 @@
|
||||
"whereNext": {
|
||||
"heading": "Por dónde seguir",
|
||||
"items": [
|
||||
{
|
||||
"label": "Pestaña Apps",
|
||||
"href": "/docs/monitor/dashboard/apps",
|
||||
"tail": " — el lanzador cuya posición se puede cambiar desde Orden de navegación."
|
||||
},
|
||||
{
|
||||
"label": "Notificaciones",
|
||||
"href": "/docs/monitor/notifications",
|
||||
|
||||
@@ -10,7 +10,9 @@
|
||||
"intro": {
|
||||
"p1": "La pestaña <strong>App</strong> registra qué aplicaciones pertenecen a un LXC. Un registro puede contener solo un nombre y un enlace web o incluir también un detector de la versión instalada y una fuente para la versión disponible.",
|
||||
"p2": "El procedimiento que modifica el software se configura por separado en la <link>pestaña Actualizaciones</link>. Guardar una app nunca ejecuta un instalador ni un actualizador.",
|
||||
"callout": "El registro, el seguimiento de versiones y la actualización son tres capacidades independientes. Cada una puede utilizarse sin exigir las otras dos."
|
||||
"callout": "El registro, el seguimiento de versiones y la actualización son tres capacidades independientes. Cada una puede utilizarse sin exigir las otras dos.",
|
||||
"dashboardTitle": "Del registro al lanzador Apps",
|
||||
"dashboard": "Cada enlace web guardado aquí también se muestra como una tarjeta en la <appsLink>pestaña Apps</appsLink> principal. Esta página del LXC sigue siendo la fuente original para el nombre, el logotipo, los enlaces y el seguimiento de versión de la aplicación."
|
||||
},
|
||||
"overview": {
|
||||
"heading": "Qué puede contener un registro",
|
||||
|
||||
Reference in New Issue
Block a user