From ecafc361bfe7c3b34b0abd991d904d1890cd6900 Mon Sep 17 00:00:00 2001 From: ErnestoMuniz Date: Wed, 25 Feb 2026 23:49:44 -0300 Subject: [PATCH 1/4] feat: implement container alias. --- .gitignore | 1 + internal/hub/hub.go | 2 + .../1771782981_updated_containers.go | 45 ++++ .../container-alias-action-button.tsx | 99 ++++++++ .../containers-table-columns.tsx | 42 +++- .../containers-table/containers-table.tsx | 33 +-- internal/site/src/index.css | 23 ++ internal/site/src/locales/ar/ar.po | 27 +++ internal/site/src/locales/bg/bg.po | 27 +++ internal/site/src/locales/cs/cs.po | 27 +++ internal/site/src/locales/da/da.po | 27 +++ internal/site/src/locales/de/de.po | 27 +++ internal/site/src/locales/en/en.po | 27 +++ internal/site/src/locales/es/es.po | 27 +++ internal/site/src/locales/fa/fa.po | 27 +++ internal/site/src/locales/fr/fr.po | 27 +++ internal/site/src/locales/he/he.po | 27 +++ internal/site/src/locales/hr/hr.po | 27 +++ internal/site/src/locales/hu/hu.po | 27 +++ internal/site/src/locales/id/id.po | 27 +++ internal/site/src/locales/it/it.po | 27 +++ internal/site/src/locales/ja/ja.po | 27 +++ internal/site/src/locales/ko/ko.po | 27 +++ internal/site/src/locales/nl/nl.po | 27 +++ internal/site/src/locales/no/no.po | 27 +++ internal/site/src/locales/pl/pl.po | 27 +++ internal/site/src/locales/pt/pt.mo | Bin 0 -> 29992 bytes internal/site/src/locales/pt/pt.po | 41 +++- internal/site/src/locales/ru/ru.po | 27 +++ internal/site/src/locales/sl/sl.po | 27 +++ internal/site/src/locales/sr/sr.po | 27 +++ internal/site/src/locales/sv/sv.po | 27 +++ internal/site/src/locales/tr/tr.po | 27 +++ internal/site/src/locales/uk/uk.po | 27 +++ internal/site/src/locales/vi/vi.po | 27 +++ internal/site/src/locales/zh-CN/zh-CN.po | 27 +++ internal/site/src/locales/zh-HK/zh-HK.po | 27 +++ internal/site/src/locales/zh/zh.po | 27 +++ internal/site/src/types.d.ts | 227 +++++++++--------- 39 files changed, 1153 insertions(+), 143 deletions(-) create mode 100644 internal/migrations/1771782981_updated_containers.go create mode 100644 internal/site/src/components/containers-table/container-alias-action-button.tsx create mode 100644 internal/site/src/locales/pt/pt.mo diff --git a/.gitignore b/.gitignore index 98b0fb5df..3bfd3f12b 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ __debug_* agent/lhm/obj agent/lhm/bin dockerfile_agent_dev +.DS_Store \ No newline at end of file diff --git a/internal/hub/hub.go b/internal/hub/hub.go index 3a5b95047..26cf3bfbd 100644 --- a/internal/hub/hub.go +++ b/internal/hub/hub.go @@ -207,7 +207,9 @@ func setCollectionAuthSettings(app core.App) error { return err } containersListRule := strings.Replace(systemsReadRule, "users.id", "system.users.id", 1) + containersUpdateRule := containersListRule + " && @request.auth.role != \"readonly\"" containersCollection.ListRule = &containersListRule + containersCollection.UpdateRule = &containersUpdateRule if err := app.Save(containersCollection); err != nil { return err } diff --git a/internal/migrations/1771782981_updated_containers.go b/internal/migrations/1771782981_updated_containers.go new file mode 100644 index 000000000..0ed303889 --- /dev/null +++ b/internal/migrations/1771782981_updated_containers.go @@ -0,0 +1,45 @@ +package migrations + +import ( + "github.com/pocketbase/pocketbase/core" + m "github.com/pocketbase/pocketbase/migrations" +) + +func init() { + m.Register(func(app core.App) error { + collection, err := app.FindCollectionByNameOrId("pbc_1864144027") + if err != nil { + return err + } + + // add field + if err := collection.Fields.AddMarshaledJSONAt(10, []byte(`{ + "autogeneratePattern": "", + "hidden": false, + "id": "text3781979028", + "max": 0, + "min": 0, + "name": "alias", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }`)); err != nil { + return err + } + + return app.Save(collection) + }, func(app core.App) error { + collection, err := app.FindCollectionByNameOrId("pbc_1864144027") + if err != nil { + return err + } + + // remove field + collection.Fields.RemoveById("text3781979028") + + return app.Save(collection) + }) +} diff --git a/internal/site/src/components/containers-table/container-alias-action-button.tsx b/internal/site/src/components/containers-table/container-alias-action-button.tsx new file mode 100644 index 000000000..937e1b66e --- /dev/null +++ b/internal/site/src/components/containers-table/container-alias-action-button.tsx @@ -0,0 +1,99 @@ +import { t } from "@lingui/core/macro" +import { PenBoxIcon } from "lucide-react" +import { type KeyboardEvent, type MouseEvent, useEffect, useState } from "react" +import { Button } from "@/components/ui/button" +import { isReadOnlyUser, pb } from "@/lib/api" +import type { ContainerRecord } from "@/types" +import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "../ui/dialog" +import { Input } from "../ui/input" + +export function ContainerAliasActionButton({ + container, + onAliasUpdated, +}: { + container: ContainerRecord + onAliasUpdated?: (containerId: string, alias: string) => void +}) { + const [open, setOpen] = useState(false) + const [alias, setAlias] = useState(container.alias ?? "") + const [isSaving, setIsSaving] = useState(false) + + useEffect(() => { + if (open) { + setAlias(container.alias ?? "") + } + }, [container.alias, open]) + + if (isReadOnlyUser()) { + return null + } + + const openDialog = (event: MouseEvent) => { + event.stopPropagation() + setOpen(true) + } + + const saveAlias = async () => { + const nextAlias = alias.trim() + if (nextAlias === (container.alias ?? "")) { + setOpen(false) + return + } + setIsSaving(true) + try { + await pb.collection("containers").update(container.id, { alias: nextAlias }) + onAliasUpdated?.(container.id, nextAlias) + setOpen(false) + } catch (error) { + console.error(error) + } finally { + setIsSaving(false) + } + } + + const onKeyDown = (event: KeyboardEvent) => { + if (event.key === "Enter") { + event.preventDefault() + saveAlias() + } + } + + return ( + <> + + + event.stopPropagation()}> + + {t`Edit container alias`} + {t`Choose a friendly name for this container (optional).`} + + setAlias(event.target.value)} + onKeyDown={onKeyDown} + placeholder={t`Alias (optional)`} + autoFocus={true} + /> + + + + + + + + ) +} diff --git a/internal/site/src/components/containers-table/containers-table-columns.tsx b/internal/site/src/components/containers-table/containers-table-columns.tsx index a356b02cd..de3a20246 100644 --- a/internal/site/src/components/containers-table/containers-table-columns.tsx +++ b/internal/site/src/components/containers-table/containers-table-columns.tsx @@ -1,8 +1,6 @@ +import { t } from "@lingui/core/macro" +import { useStore } from "@nanostores/react" import type { Column, ColumnDef } from "@tanstack/react-table" -import { Button } from "@/components/ui/button" -import { cn, decimalString, formatBytes, hourWithSeconds } from "@/lib/utils" -import type { ContainerRecord } from "@/types" -import { ContainerHealth, ContainerHealthLabels } from "@/lib/enums" import { ArrowUpDownIcon, ClockIcon, @@ -13,11 +11,14 @@ import { ServerIcon, ShieldCheckIcon, } from "lucide-react" -import { EthernetIcon, HourglassIcon } from "../ui/icons" -import { Badge } from "../ui/badge" -import { t } from "@lingui/core/macro" +import { Button } from "@/components/ui/button" +import { ContainerHealth, ContainerHealthLabels } from "@/lib/enums" import { $allSystemsById } from "@/lib/stores" -import { useStore } from "@nanostores/react" +import { cn, decimalString, formatBytes, hourWithSeconds } from "@/lib/utils" +import type { ContainerRecord } from "@/types" +import { Badge } from "../ui/badge" +import { EthernetIcon, HourglassIcon } from "../ui/icons" +import { ContainerAliasActionButton } from "./container-alias-action-button" // Unit names and their corresponding number of seconds for converting docker status strings const unitSeconds = [ @@ -41,13 +42,25 @@ function getStatusValue(status: string): number { return 0 } +export type ContainerTableMeta = { + onAliasUpdated?: (containerId: string, alias: string) => void +} + export const containerChartCols: ColumnDef[] = [ { id: "name", sortingFn: (a, b) => a.original.name.localeCompare(b.original.name), accessorFn: (record) => record.name, header: ({ column }) => , - cell: ({ getValue }) => { + cell: ({ getValue, row }) => { + if (row.original.alias) { + return ( +
+ {row.original.alias} + {getValue() as string} +
+ ) + } return {getValue() as string} }, }, @@ -165,6 +178,17 @@ export const containerChartCols: ColumnDef[] = [ return {hourWithSeconds(new Date(timestamp).toISOString())} }, }, + { + id: "actions", + enableSorting: false, + enableHiding: false, + size: 52, + header: () => {t`Actions`}, + cell: ({ row, table }) => { + const onAliasUpdated = (table.options.meta as ContainerTableMeta | undefined)?.onAliasUpdated + return + }, + }, ] function HeaderButton({ diff --git a/internal/site/src/components/containers-table/containers-table.tsx b/internal/site/src/components/containers-table/containers-table.tsx index 773d478df..4c575238d 100644 --- a/internal/site/src/components/containers-table/containers-table.tsx +++ b/internal/site/src/components/containers-table/containers-table.tsx @@ -1,5 +1,6 @@ import { t } from "@lingui/core/macro" import { Trans } from "@lingui/react/macro" +import { getPagePath } from "@nanostores/router" import { type ColumnFiltersState, flexRender, @@ -13,24 +14,23 @@ import { type VisibilityState, } from "@tanstack/react-table" import { useVirtualizer, type VirtualItem } from "@tanstack/react-virtual" -import { memo, RefObject, useEffect, useRef, useState } from "react" +import { LoaderCircleIcon, MaximizeIcon, RefreshCwIcon, XIcon } from "lucide-react" +import { listenKeys } from "nanostores" +import { memo, type RefObject, useEffect, useRef, useState } from "react" +import { type ContainerTableMeta, containerChartCols } from "@/components/containers-table/containers-table-columns" +import { Button } from "@/components/ui/button" +import { Card, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Input } from "@/components/ui/input" import { TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { pb } from "@/lib/api" -import type { ContainerRecord } from "@/types" -import { containerChartCols } from "@/components/containers-table/containers-table-columns" -import { Card, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { type ContainerHealth, ContainerHealthLabels } from "@/lib/enums" +import { $allSystemsById } from "@/lib/stores" import { cn, useBrowserStorage } from "@/lib/utils" -import { Sheet, SheetTitle, SheetHeader, SheetContent, SheetDescription } from "../ui/sheet" +import type { ContainerRecord } from "@/types" +import { $router, Link } from "../router" import { Dialog, DialogContent, DialogTitle } from "../ui/dialog" -import { Button } from "@/components/ui/button" -import { $allSystemsById } from "@/lib/stores" -import { LoaderCircleIcon, MaximizeIcon, RefreshCwIcon, XIcon } from "lucide-react" import { Separator } from "../ui/separator" -import { $router, Link } from "../router" -import { listenKeys } from "nanostores" -import { getPagePath } from "@nanostores/router" +import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from "../ui/sheet" const syntaxTheme = "github-dark-dimmed" @@ -46,12 +46,15 @@ export default function ContainersTable({ systemId }: { systemId?: string }) { const [columnVisibility, setColumnVisibility] = useState({}) const [rowSelection, setRowSelection] = useState({}) const [globalFilter, setGlobalFilter] = useState("") + const onAliasUpdated: NonNullable = (containerId, alias) => { + setData((curItems) => curItems?.map((item) => (item.id === containerId ? { ...item, alias } : item))) + } useEffect(() => { function fetchData(systemId?: string) { pb.collection("containers") .getList(0, 2000, { - fields: "id,name,image,cpu,memory,net,health,status,system,updated", + fields: "id,name,image,cpu,memory,net,health,status,system,updated,alias", filter: systemId ? pb.filter("system={:system}", { system: systemId }) : undefined, }) .then(({ items }) => { @@ -67,7 +70,7 @@ export default function ContainersTable({ systemId }: { systemId?: string }) { setData((curItems) => { const lastUpdated = Math.max(items[0].updated, items.at(-1)?.updated ?? 0) const containerIds = new Set() - const newItems = [] + const newItems: ContainerRecord[] = [] for (const item of items) { if (Math.abs(lastUpdated - item.updated) < 70_000) { containerIds.add(item.id) @@ -113,6 +116,7 @@ export default function ContainersTable({ systemId }: { systemId?: string }) { onColumnFiltersChange: setColumnFilters, onColumnVisibilityChange: setColumnVisibility, onRowSelectionChange: setRowSelection, + meta: { onAliasUpdated }, defaultColumn: { sortUndefined: "last", size: 100, @@ -131,10 +135,11 @@ export default function ContainersTable({ systemId }: { systemId?: string }) { const systemName = $allSystemsById.get()[container.system]?.name ?? "" const id = container.id ?? "" const name = container.name ?? "" + const alias = container.alias ?? "" const status = container.status ?? "" const healthLabel = ContainerHealthLabels[container.health as ContainerHealth] ?? "" const image = container.image ?? "" - const searchString = `${systemName} ${id} ${name} ${healthLabel} ${status} ${image}`.toLowerCase() + const searchString = `${systemName} ${id} ${name} ${alias} ${healthLabel} ${status} ${image}`.toLowerCase() return (filterValue as string) .toLowerCase() diff --git a/internal/site/src/index.css b/internal/site/src/index.css index 32ec5d146..2288e194b 100644 --- a/internal/site/src/index.css +++ b/internal/site/src/index.css @@ -171,3 +171,26 @@ .recharts-yAxis { @apply tabular-nums; } + + +.alias-name-cell span:first-child { + position: absolute; + top: 1.2em; + transition: all 200ms; +} + +.alias-name-cell:hover span:first-child { + top: 0.6em; +} + +.alias-name-cell span:last-child { + opacity: 0; + position: absolute; + bottom: 1.2em; + transition: all 200ms; +} + +.alias-name-cell:hover span:last-child { + opacity: 1; + bottom: 0.6em; +} \ No newline at end of file diff --git a/internal/site/src/locales/ar/ar.po b/internal/site/src/locales/ar/ar.po index 4b179165e..10daa7161 100644 --- a/internal/site/src/locales/ar/ar.po +++ b/internal/site/src/locales/ar/ar.po @@ -84,6 +84,7 @@ msgid "5 min" msgstr "5 دقائق" #. Table column +#: src/components/containers-table/containers-table-columns.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/routes/settings/tokens-fingerprints.tsx #: src/components/routes/system/smart-table.tsx @@ -160,6 +161,10 @@ msgstr "سجل التنبيهات" msgid "Alerts" msgstr "التنبيهات" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Alias (optional)" +msgstr "" + #: src/components/command-palette.tsx #: src/components/containers-table/containers-table.tsx #: src/components/navbar.tsx @@ -304,6 +309,7 @@ msgstr "يمكن البدء" msgid "Can stop" msgstr "يمكن الإيقاف" +#: src/components/containers-table/container-alias-action-button.tsx #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/systems-table/systems-table-columns.tsx @@ -363,6 +369,10 @@ msgstr "تحقق من خدمة المراقبة الخاصة بك" msgid "Check your notification service" msgstr "تحقق من خدمة الإشعارات الخاصة بك" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Choose a friendly name for this container (optional)." +msgstr "" + #: src/components/containers-table/containers-table.tsx #: src/components/routes/system/smart-table.tsx #: src/components/systems-table/systems-table.tsx @@ -632,6 +642,15 @@ msgstr "تعديل" msgid "Edit {foo}" msgstr "إضافة {foo}" +#: src/components/containers-table/container-alias-action-button.tsx +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit alias" +msgstr "" + +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit container alias" +msgstr "" + #: src/components/login/auth-form.tsx #: src/components/login/forgot-pass-form.tsx #: src/components/login/otp-forms.tsx @@ -1327,6 +1346,10 @@ msgstr "تفاصيل S.M.A.R.T." msgid "S.M.A.R.T. Self-Test" msgstr "اختبار S.M.A.R.T. الذاتي" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Save" +msgstr "" + #: src/components/routes/settings/notifications.tsx msgid "Save address using enter key or comma. Leave blank to disable email notifications." msgstr "احفظ العنوان باستخدام مفتاح الإدخال أو الفاصلة. اتركه فارغًا لتعطيل إشعارات البريد الإشباكي." @@ -1344,6 +1367,10 @@ msgstr "احفظ النظام" msgid "Saved in the database and does not expire until you disable it." msgstr "محفوظ في قاعدة البيانات ولا ينتهي حتى تقوم بتعطيله." +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Saving..." +msgstr "" + #: src/components/routes/settings/quiet-hours.tsx msgid "Schedule" msgstr "جدولة" diff --git a/internal/site/src/locales/bg/bg.po b/internal/site/src/locales/bg/bg.po index 467bcc1fa..6acd47c11 100644 --- a/internal/site/src/locales/bg/bg.po +++ b/internal/site/src/locales/bg/bg.po @@ -84,6 +84,7 @@ msgid "5 min" msgstr "5 минути" #. Table column +#: src/components/containers-table/containers-table-columns.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/routes/settings/tokens-fingerprints.tsx #: src/components/routes/system/smart-table.tsx @@ -160,6 +161,10 @@ msgstr "История на нотификациите" msgid "Alerts" msgstr "Тревоги" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Alias (optional)" +msgstr "" + #: src/components/command-palette.tsx #: src/components/containers-table/containers-table.tsx #: src/components/navbar.tsx @@ -304,6 +309,7 @@ msgstr "Може да се стартира" msgid "Can stop" msgstr "Може да се спре" +#: src/components/containers-table/container-alias-action-button.tsx #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/systems-table/systems-table-columns.tsx @@ -363,6 +369,10 @@ msgstr "Проверете вашата услуга за мониторинг" msgid "Check your notification service" msgstr "Провери услугата си за удостоверяване" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Choose a friendly name for this container (optional)." +msgstr "" + #: src/components/containers-table/containers-table.tsx #: src/components/routes/system/smart-table.tsx #: src/components/systems-table/systems-table.tsx @@ -632,6 +642,15 @@ msgstr "Редактирай" msgid "Edit {foo}" msgstr "Редактиране на {foo}" +#: src/components/containers-table/container-alias-action-button.tsx +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit alias" +msgstr "" + +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit container alias" +msgstr "" + #: src/components/login/auth-form.tsx #: src/components/login/forgot-pass-form.tsx #: src/components/login/otp-forms.tsx @@ -1327,6 +1346,10 @@ msgstr "S.M.A.R.T. Детайли" msgid "S.M.A.R.T. Self-Test" msgstr "S.M.A.R.T. Самотест" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Save" +msgstr "" + #: src/components/routes/settings/notifications.tsx msgid "Save address using enter key or comma. Leave blank to disable email notifications." msgstr "Запази адреса с enter или запетая. Остави празно за да изключиш нотификациите чрез имейл." @@ -1344,6 +1367,10 @@ msgstr "Запази система" msgid "Saved in the database and does not expire until you disable it." msgstr "Запазен е в базата данни и не изтича, докато не го деактивирате." +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Saving..." +msgstr "" + #: src/components/routes/settings/quiet-hours.tsx msgid "Schedule" msgstr "График" diff --git a/internal/site/src/locales/cs/cs.po b/internal/site/src/locales/cs/cs.po index 7c4648fcc..e6c072bb3 100644 --- a/internal/site/src/locales/cs/cs.po +++ b/internal/site/src/locales/cs/cs.po @@ -84,6 +84,7 @@ msgid "5 min" msgstr "5 min" #. Table column +#: src/components/containers-table/containers-table-columns.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/routes/settings/tokens-fingerprints.tsx #: src/components/routes/system/smart-table.tsx @@ -160,6 +161,10 @@ msgstr "Historie upozornění" msgid "Alerts" msgstr "Výstrahy" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Alias (optional)" +msgstr "" + #: src/components/command-palette.tsx #: src/components/containers-table/containers-table.tsx #: src/components/navbar.tsx @@ -304,6 +309,7 @@ msgstr "Může spustit" msgid "Can stop" msgstr "Může zastavit" +#: src/components/containers-table/container-alias-action-button.tsx #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/systems-table/systems-table-columns.tsx @@ -363,6 +369,10 @@ msgstr "Zkontrolujte svou monitorovací službu" msgid "Check your notification service" msgstr "Zkontrolujte službu upozornění" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Choose a friendly name for this container (optional)." +msgstr "" + #: src/components/containers-table/containers-table.tsx #: src/components/routes/system/smart-table.tsx #: src/components/systems-table/systems-table.tsx @@ -632,6 +642,15 @@ msgstr "Upravit" msgid "Edit {foo}" msgstr "Upravit {foo}" +#: src/components/containers-table/container-alias-action-button.tsx +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit alias" +msgstr "" + +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit container alias" +msgstr "" + #: src/components/login/auth-form.tsx #: src/components/login/forgot-pass-form.tsx #: src/components/login/otp-forms.tsx @@ -1327,6 +1346,10 @@ msgstr "S.M.A.R.T. Detaily" msgid "S.M.A.R.T. Self-Test" msgstr "S.M.A.R.T. Vlastní test" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Save" +msgstr "" + #: src/components/routes/settings/notifications.tsx msgid "Save address using enter key or comma. Leave blank to disable email notifications." msgstr "Adresu uložte pomocí klávesy enter nebo čárky. Pro deaktivaci e-mailových oznámení ponechte prázdné pole." @@ -1344,6 +1367,10 @@ msgstr "Uložit systém" msgid "Saved in the database and does not expire until you disable it." msgstr "Uložen v databázi a nevyprší, dokud jej nezablokujete." +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Saving..." +msgstr "" + #: src/components/routes/settings/quiet-hours.tsx msgid "Schedule" msgstr "Plán" diff --git a/internal/site/src/locales/da/da.po b/internal/site/src/locales/da/da.po index 6c1ee55ff..b6d73575c 100644 --- a/internal/site/src/locales/da/da.po +++ b/internal/site/src/locales/da/da.po @@ -84,6 +84,7 @@ msgid "5 min" msgstr "5 minutter" #. Table column +#: src/components/containers-table/containers-table-columns.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/routes/settings/tokens-fingerprints.tsx #: src/components/routes/system/smart-table.tsx @@ -160,6 +161,10 @@ msgstr "Advarselshistorik" msgid "Alerts" msgstr "Alarmer" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Alias (optional)" +msgstr "" + #: src/components/command-palette.tsx #: src/components/containers-table/containers-table.tsx #: src/components/navbar.tsx @@ -304,6 +309,7 @@ msgstr "Kan starte" msgid "Can stop" msgstr "Kan stoppe" +#: src/components/containers-table/container-alias-action-button.tsx #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/systems-table/systems-table-columns.tsx @@ -363,6 +369,10 @@ msgstr "Tjek din overvågningstjeneste" msgid "Check your notification service" msgstr "Tjek din notifikationstjeneste" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Choose a friendly name for this container (optional)." +msgstr "" + #: src/components/containers-table/containers-table.tsx #: src/components/routes/system/smart-table.tsx #: src/components/systems-table/systems-table.tsx @@ -632,6 +642,15 @@ msgstr "Rediger" msgid "Edit {foo}" msgstr "Rediger {foo}" +#: src/components/containers-table/container-alias-action-button.tsx +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit alias" +msgstr "" + +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit container alias" +msgstr "" + #: src/components/login/auth-form.tsx #: src/components/login/forgot-pass-form.tsx #: src/components/login/otp-forms.tsx @@ -1327,6 +1346,10 @@ msgstr "S.M.A.R.T.-detaljer" msgid "S.M.A.R.T. Self-Test" msgstr "S.M.A.R.T. selvtest" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Save" +msgstr "" + #: src/components/routes/settings/notifications.tsx msgid "Save address using enter key or comma. Leave blank to disable email notifications." msgstr "Gem adresse ved hjælp af enter eller komma. Lad feltet stå tomt for at deaktivere e-mail-meddelelser." @@ -1344,6 +1367,10 @@ msgstr "Gem system" msgid "Saved in the database and does not expire until you disable it." msgstr "Gemt i databasen og udløber ikke, før du deaktiverer det." +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Saving..." +msgstr "" + #: src/components/routes/settings/quiet-hours.tsx msgid "Schedule" msgstr "Planlæg" diff --git a/internal/site/src/locales/de/de.po b/internal/site/src/locales/de/de.po index 76371cc50..c3b589085 100644 --- a/internal/site/src/locales/de/de.po +++ b/internal/site/src/locales/de/de.po @@ -84,6 +84,7 @@ msgid "5 min" msgstr "5 Min" #. Table column +#: src/components/containers-table/containers-table-columns.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/routes/settings/tokens-fingerprints.tsx #: src/components/routes/system/smart-table.tsx @@ -160,6 +161,10 @@ msgstr "Warnungsverlauf" msgid "Alerts" msgstr "Warnungen" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Alias (optional)" +msgstr "" + #: src/components/command-palette.tsx #: src/components/containers-table/containers-table.tsx #: src/components/navbar.tsx @@ -304,6 +309,7 @@ msgstr "Kann starten" msgid "Can stop" msgstr "Kann stoppen" +#: src/components/containers-table/container-alias-action-button.tsx #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/systems-table/systems-table-columns.tsx @@ -363,6 +369,10 @@ msgstr "Überprüfen Sie Ihren Überwachungsdienst" msgid "Check your notification service" msgstr "Überprüfe deinen Benachrichtigungsdienst" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Choose a friendly name for this container (optional)." +msgstr "" + #: src/components/containers-table/containers-table.tsx #: src/components/routes/system/smart-table.tsx #: src/components/systems-table/systems-table.tsx @@ -632,6 +642,15 @@ msgstr "Bearbeiten" msgid "Edit {foo}" msgstr "{foo} bearbeiten" +#: src/components/containers-table/container-alias-action-button.tsx +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit alias" +msgstr "" + +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit container alias" +msgstr "" + #: src/components/login/auth-form.tsx #: src/components/login/forgot-pass-form.tsx #: src/components/login/otp-forms.tsx @@ -1327,6 +1346,10 @@ msgstr "S.M.A.R.T.-Details" msgid "S.M.A.R.T. Self-Test" msgstr "S.M.A.R.T.-Selbsttest" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Save" +msgstr "" + #: src/components/routes/settings/notifications.tsx msgid "Save address using enter key or comma. Leave blank to disable email notifications." msgstr "Adresse mit der Enter-Taste oder Komma speichern. Leer lassen, um E-Mail-Benachrichtigungen zu deaktivieren." @@ -1344,6 +1367,10 @@ msgstr "System speichern" msgid "Saved in the database and does not expire until you disable it." msgstr "In der Datenbank gespeichert und läuft nicht ab, bis Sie es deaktivieren." +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Saving..." +msgstr "" + #: src/components/routes/settings/quiet-hours.tsx msgid "Schedule" msgstr "Zeitplan" diff --git a/internal/site/src/locales/en/en.po b/internal/site/src/locales/en/en.po index 554730b7d..5d5dbd9e1 100644 --- a/internal/site/src/locales/en/en.po +++ b/internal/site/src/locales/en/en.po @@ -79,6 +79,7 @@ msgid "5 min" msgstr "5 min" #. Table column +#: src/components/containers-table/containers-table-columns.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/routes/settings/tokens-fingerprints.tsx #: src/components/routes/system/smart-table.tsx @@ -155,6 +156,10 @@ msgstr "Alert History" msgid "Alerts" msgstr "Alerts" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Alias (optional)" +msgstr "Alias (optional)" + #: src/components/command-palette.tsx #: src/components/containers-table/containers-table.tsx #: src/components/navbar.tsx @@ -299,6 +304,7 @@ msgstr "Can start" msgid "Can stop" msgstr "Can stop" +#: src/components/containers-table/container-alias-action-button.tsx #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/systems-table/systems-table-columns.tsx @@ -358,6 +364,10 @@ msgstr "Check your monitoring service" msgid "Check your notification service" msgstr "Check your notification service" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Choose a friendly name for this container (optional)." +msgstr "Choose a friendly name for this container (optional)." + #: src/components/containers-table/containers-table.tsx #: src/components/routes/system/smart-table.tsx #: src/components/systems-table/systems-table.tsx @@ -627,6 +637,15 @@ msgstr "Edit" msgid "Edit {foo}" msgstr "Edit {foo}" +#: src/components/containers-table/container-alias-action-button.tsx +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit alias" +msgstr "Edit alias" + +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit container alias" +msgstr "Edit container alias" + #: src/components/login/auth-form.tsx #: src/components/login/forgot-pass-form.tsx #: src/components/login/otp-forms.tsx @@ -1322,6 +1341,10 @@ msgstr "S.M.A.R.T. Details" msgid "S.M.A.R.T. Self-Test" msgstr "S.M.A.R.T. Self-Test" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Save" +msgstr "Save" + #: src/components/routes/settings/notifications.tsx msgid "Save address using enter key or comma. Leave blank to disable email notifications." msgstr "Save address using enter key or comma. Leave blank to disable email notifications." @@ -1339,6 +1362,10 @@ msgstr "Save system" msgid "Saved in the database and does not expire until you disable it." msgstr "Saved in the database and does not expire until you disable it." +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Saving..." +msgstr "Saving..." + #: src/components/routes/settings/quiet-hours.tsx msgid "Schedule" msgstr "Schedule" diff --git a/internal/site/src/locales/es/es.po b/internal/site/src/locales/es/es.po index ffbeee994..2b769181d 100644 --- a/internal/site/src/locales/es/es.po +++ b/internal/site/src/locales/es/es.po @@ -84,6 +84,7 @@ msgid "5 min" msgstr "5 min" #. Table column +#: src/components/containers-table/containers-table-columns.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/routes/settings/tokens-fingerprints.tsx #: src/components/routes/system/smart-table.tsx @@ -160,6 +161,10 @@ msgstr "Historial de alertas" msgid "Alerts" msgstr "Alertas" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Alias (optional)" +msgstr "" + #: src/components/command-palette.tsx #: src/components/containers-table/containers-table.tsx #: src/components/navbar.tsx @@ -304,6 +309,7 @@ msgstr "Puede iniciarse" msgid "Can stop" msgstr "Puede detenerse" +#: src/components/containers-table/container-alias-action-button.tsx #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/systems-table/systems-table-columns.tsx @@ -363,6 +369,10 @@ msgstr "Compruebe su servicio de monitorización" msgid "Check your notification service" msgstr "Verifica tu servicio de notificaciones" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Choose a friendly name for this container (optional)." +msgstr "" + #: src/components/containers-table/containers-table.tsx #: src/components/routes/system/smart-table.tsx #: src/components/systems-table/systems-table.tsx @@ -632,6 +642,15 @@ msgstr "Editar" msgid "Edit {foo}" msgstr "Editar {foo}" +#: src/components/containers-table/container-alias-action-button.tsx +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit alias" +msgstr "" + +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit container alias" +msgstr "" + #: src/components/login/auth-form.tsx #: src/components/login/forgot-pass-form.tsx #: src/components/login/otp-forms.tsx @@ -1327,6 +1346,10 @@ msgstr "Detalles S.M.A.R.T." msgid "S.M.A.R.T. Self-Test" msgstr "Autoprueba S.M.A.R.T." +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Save" +msgstr "" + #: src/components/routes/settings/notifications.tsx msgid "Save address using enter key or comma. Leave blank to disable email notifications." msgstr "Guarda la dirección usando la tecla enter o coma. Deja en blanco para desactivar las notificaciones por correo." @@ -1344,6 +1367,10 @@ msgstr "Guardar sistema" msgid "Saved in the database and does not expire until you disable it." msgstr "Guardado en la base de datos y no expira hasta que lo desactives." +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Saving..." +msgstr "" + #: src/components/routes/settings/quiet-hours.tsx msgid "Schedule" msgstr "Programar" diff --git a/internal/site/src/locales/fa/fa.po b/internal/site/src/locales/fa/fa.po index fa61432dd..ea157a71f 100644 --- a/internal/site/src/locales/fa/fa.po +++ b/internal/site/src/locales/fa/fa.po @@ -84,6 +84,7 @@ msgid "5 min" msgstr "۵ دقیقه" #. Table column +#: src/components/containers-table/containers-table-columns.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/routes/settings/tokens-fingerprints.tsx #: src/components/routes/system/smart-table.tsx @@ -160,6 +161,10 @@ msgstr "تاریخچه هشدارها" msgid "Alerts" msgstr "هشدارها" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Alias (optional)" +msgstr "" + #: src/components/command-palette.tsx #: src/components/containers-table/containers-table.tsx #: src/components/navbar.tsx @@ -304,6 +309,7 @@ msgstr "می‌تواند شروع شود" msgid "Can stop" msgstr "می‌تواند متوقف شود" +#: src/components/containers-table/container-alias-action-button.tsx #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/systems-table/systems-table-columns.tsx @@ -363,6 +369,10 @@ msgstr "سرویس نظارتی خود را بررسی کنید" msgid "Check your notification service" msgstr "سرویس اطلاع‌رسانی خود را بررسی کنید" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Choose a friendly name for this container (optional)." +msgstr "" + #: src/components/containers-table/containers-table.tsx #: src/components/routes/system/smart-table.tsx #: src/components/systems-table/systems-table.tsx @@ -632,6 +642,15 @@ msgstr "ویرایش" msgid "Edit {foo}" msgstr "ویرایش {foo}" +#: src/components/containers-table/container-alias-action-button.tsx +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit alias" +msgstr "" + +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit container alias" +msgstr "" + #: src/components/login/auth-form.tsx #: src/components/login/forgot-pass-form.tsx #: src/components/login/otp-forms.tsx @@ -1327,6 +1346,10 @@ msgstr "جزئیات S.M.A.R.T" msgid "S.M.A.R.T. Self-Test" msgstr "تست خود S.M.A.R.T" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Save" +msgstr "" + #: src/components/routes/settings/notifications.tsx msgid "Save address using enter key or comma. Leave blank to disable email notifications." msgstr "آدرس را با استفاده از کلید Enter یا کاما ذخیره کنید. برای غیرفعال کردن اعلان‌های ایمیلی، خالی بگذارید." @@ -1344,6 +1367,10 @@ msgstr "ذخیره سیستم" msgid "Saved in the database and does not expire until you disable it." msgstr "در پایگاه داده ذخیره شده و تا زمانی که آن را غیرفعال نکنید، منقضی نمی‌شود." +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Saving..." +msgstr "" + #: src/components/routes/settings/quiet-hours.tsx msgid "Schedule" msgstr "برنامه‌ریزی" diff --git a/internal/site/src/locales/fr/fr.po b/internal/site/src/locales/fr/fr.po index 1ed908aff..d1c5f730a 100644 --- a/internal/site/src/locales/fr/fr.po +++ b/internal/site/src/locales/fr/fr.po @@ -84,6 +84,7 @@ msgid "5 min" msgstr "5 min" #. Table column +#: src/components/containers-table/containers-table-columns.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/routes/settings/tokens-fingerprints.tsx #: src/components/routes/system/smart-table.tsx @@ -160,6 +161,10 @@ msgstr "Historique des alertes" msgid "Alerts" msgstr "Alertes" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Alias (optional)" +msgstr "" + #: src/components/command-palette.tsx #: src/components/containers-table/containers-table.tsx #: src/components/navbar.tsx @@ -304,6 +309,7 @@ msgstr "Peut démarrer" msgid "Can stop" msgstr "Peut arrêter" +#: src/components/containers-table/container-alias-action-button.tsx #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/systems-table/systems-table-columns.tsx @@ -363,6 +369,10 @@ msgstr "Vérifiez votre service de surveillance" msgid "Check your notification service" msgstr "Vérifiez votre service de notification" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Choose a friendly name for this container (optional)." +msgstr "" + #: src/components/containers-table/containers-table.tsx #: src/components/routes/system/smart-table.tsx #: src/components/systems-table/systems-table.tsx @@ -632,6 +642,15 @@ msgstr "Éditer" msgid "Edit {foo}" msgstr "Modifier {foo}" +#: src/components/containers-table/container-alias-action-button.tsx +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit alias" +msgstr "" + +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit container alias" +msgstr "" + #: src/components/login/auth-form.tsx #: src/components/login/forgot-pass-form.tsx #: src/components/login/otp-forms.tsx @@ -1327,6 +1346,10 @@ msgstr "Détails S.M.A.R.T." msgid "S.M.A.R.T. Self-Test" msgstr "Auto-test S.M.A.R.T." +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Save" +msgstr "" + #: src/components/routes/settings/notifications.tsx msgid "Save address using enter key or comma. Leave blank to disable email notifications." msgstr "Enregistrez l'adresse en utilisant la touche Entrée ou la virgule. Laissez vide pour désactiver les notifications par email." @@ -1344,6 +1367,10 @@ msgstr "Sauvegarder le système" msgid "Saved in the database and does not expire until you disable it." msgstr "Enregistré dans la base de données et n'expire pas tant que vous ne le désactivez pas." +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Saving..." +msgstr "" + #: src/components/routes/settings/quiet-hours.tsx msgid "Schedule" msgstr "Programmer" diff --git a/internal/site/src/locales/he/he.po b/internal/site/src/locales/he/he.po index dedb888b8..6e9e74ce6 100644 --- a/internal/site/src/locales/he/he.po +++ b/internal/site/src/locales/he/he.po @@ -84,6 +84,7 @@ msgid "5 min" msgstr "5 דק'" #. Table column +#: src/components/containers-table/containers-table-columns.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/routes/settings/tokens-fingerprints.tsx #: src/components/routes/system/smart-table.tsx @@ -160,6 +161,10 @@ msgstr "היסטוריית התראות" msgid "Alerts" msgstr "התראות" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Alias (optional)" +msgstr "" + #: src/components/command-palette.tsx #: src/components/containers-table/containers-table.tsx #: src/components/navbar.tsx @@ -304,6 +309,7 @@ msgstr "יכול להתחיל" msgid "Can stop" msgstr "יכול לעצור" +#: src/components/containers-table/container-alias-action-button.tsx #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/systems-table/systems-table-columns.tsx @@ -363,6 +369,10 @@ msgstr "בדוק את שירות הניטור שלך" msgid "Check your notification service" msgstr "בדוק את שירות ההתראות שלך" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Choose a friendly name for this container (optional)." +msgstr "" + #: src/components/containers-table/containers-table.tsx #: src/components/routes/system/smart-table.tsx #: src/components/systems-table/systems-table.tsx @@ -632,6 +642,15 @@ msgstr "ערוך" msgid "Edit {foo}" msgstr "ערוך {foo}" +#: src/components/containers-table/container-alias-action-button.tsx +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit alias" +msgstr "" + +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit container alias" +msgstr "" + #: src/components/login/auth-form.tsx #: src/components/login/forgot-pass-form.tsx #: src/components/login/otp-forms.tsx @@ -1327,6 +1346,10 @@ msgstr "פרטי S.M.A.R.T." msgid "S.M.A.R.T. Self-Test" msgstr "בדיקה עצמית S.M.A.R.T." +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Save" +msgstr "" + #: src/components/routes/settings/notifications.tsx msgid "Save address using enter key or comma. Leave blank to disable email notifications." msgstr "שמור כתובת באמצעות מקש enter או פסיק. השאר ריק כדי להשבית התראות אימייל." @@ -1344,6 +1367,10 @@ msgstr "שמור מערכת" msgid "Saved in the database and does not expire until you disable it." msgstr "נשמר במסד הנתונים ולא פג תוקף עד שתבטל אותו." +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Saving..." +msgstr "" + #: src/components/routes/settings/quiet-hours.tsx msgid "Schedule" msgstr "לוח זמנים" diff --git a/internal/site/src/locales/hr/hr.po b/internal/site/src/locales/hr/hr.po index df6fe99c8..7767ebbef 100644 --- a/internal/site/src/locales/hr/hr.po +++ b/internal/site/src/locales/hr/hr.po @@ -84,6 +84,7 @@ msgid "5 min" msgstr "5 minuta" #. Table column +#: src/components/containers-table/containers-table-columns.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/routes/settings/tokens-fingerprints.tsx #: src/components/routes/system/smart-table.tsx @@ -160,6 +161,10 @@ msgstr "Povijest Upozorenja" msgid "Alerts" msgstr "Upozorenja" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Alias (optional)" +msgstr "" + #: src/components/command-palette.tsx #: src/components/containers-table/containers-table.tsx #: src/components/navbar.tsx @@ -304,6 +309,7 @@ msgstr "Može se pokrenuti" msgid "Can stop" msgstr "Može se zaustaviti" +#: src/components/containers-table/container-alias-action-button.tsx #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/systems-table/systems-table-columns.tsx @@ -363,6 +369,10 @@ msgstr "Provjerite svoju uslugu nadzora" msgid "Check your notification service" msgstr "Provjerite svoju obavještajnu uslugu" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Choose a friendly name for this container (optional)." +msgstr "" + #: src/components/containers-table/containers-table.tsx #: src/components/routes/system/smart-table.tsx #: src/components/systems-table/systems-table.tsx @@ -632,6 +642,15 @@ msgstr "Uredi" msgid "Edit {foo}" msgstr "Uredi {foo}" +#: src/components/containers-table/container-alias-action-button.tsx +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit alias" +msgstr "" + +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit container alias" +msgstr "" + #: src/components/login/auth-form.tsx #: src/components/login/forgot-pass-form.tsx #: src/components/login/otp-forms.tsx @@ -1327,6 +1346,10 @@ msgstr "S.M.A.R.T. Detalji" msgid "S.M.A.R.T. Self-Test" msgstr "S.M.A.R.T. Samotestiranje" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Save" +msgstr "" + #: src/components/routes/settings/notifications.tsx msgid "Save address using enter key or comma. Leave blank to disable email notifications." msgstr "Spremite adresu pomoću tipke enter ili zareza. Ostavite prazno kako biste onemogućili obavijesti e-poštom." @@ -1344,6 +1367,10 @@ msgstr "Spremi sustav" msgid "Saved in the database and does not expire until you disable it." msgstr "Spremljeno u bazi podataka i ne istječe dok ga ne onemogućite." +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Saving..." +msgstr "" + #: src/components/routes/settings/quiet-hours.tsx msgid "Schedule" msgstr "Raspored" diff --git a/internal/site/src/locales/hu/hu.po b/internal/site/src/locales/hu/hu.po index 791e3d72b..1c0e87901 100644 --- a/internal/site/src/locales/hu/hu.po +++ b/internal/site/src/locales/hu/hu.po @@ -84,6 +84,7 @@ msgid "5 min" msgstr "5 perc" #. Table column +#: src/components/containers-table/containers-table-columns.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/routes/settings/tokens-fingerprints.tsx #: src/components/routes/system/smart-table.tsx @@ -160,6 +161,10 @@ msgstr "Riasztási előzmények" msgid "Alerts" msgstr "Riasztások" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Alias (optional)" +msgstr "" + #: src/components/command-palette.tsx #: src/components/containers-table/containers-table.tsx #: src/components/navbar.tsx @@ -304,6 +309,7 @@ msgstr "Indítható" msgid "Can stop" msgstr "Leállítható" +#: src/components/containers-table/container-alias-action-button.tsx #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/systems-table/systems-table-columns.tsx @@ -363,6 +369,10 @@ msgstr "Ellenőrizze a megfigyelő szolgáltatást" msgid "Check your notification service" msgstr "Ellenőrizd az értesítési szolgáltatásodat" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Choose a friendly name for this container (optional)." +msgstr "" + #: src/components/containers-table/containers-table.tsx #: src/components/routes/system/smart-table.tsx #: src/components/systems-table/systems-table.tsx @@ -632,6 +642,15 @@ msgstr "Szerkesztés" msgid "Edit {foo}" msgstr "Szerkesztés {foo}" +#: src/components/containers-table/container-alias-action-button.tsx +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit alias" +msgstr "" + +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit container alias" +msgstr "" + #: src/components/login/auth-form.tsx #: src/components/login/forgot-pass-form.tsx #: src/components/login/otp-forms.tsx @@ -1327,6 +1346,10 @@ msgstr "S.M.A.R.T. Részletek" msgid "S.M.A.R.T. Self-Test" msgstr "S.M.A.R.T. Önteszt" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Save" +msgstr "" + #: src/components/routes/settings/notifications.tsx msgid "Save address using enter key or comma. Leave blank to disable email notifications." msgstr "Mentse el a címet az Enter billentyű vagy a vessző használatával. Hagyja üresen az e-mail értesítések letiltásához." @@ -1344,6 +1367,10 @@ msgstr "Rendszer mentése" msgid "Saved in the database and does not expire until you disable it." msgstr "Elmentve az adatbázisban és nem jár le, amíg ki nem kapcsolod." +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Saving..." +msgstr "" + #: src/components/routes/settings/quiet-hours.tsx msgid "Schedule" msgstr "Ütemezés" diff --git a/internal/site/src/locales/id/id.po b/internal/site/src/locales/id/id.po index ba6865b29..40f74e4f2 100644 --- a/internal/site/src/locales/id/id.po +++ b/internal/site/src/locales/id/id.po @@ -84,6 +84,7 @@ msgid "5 min" msgstr "5 mnt" #. Table column +#: src/components/containers-table/containers-table-columns.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/routes/settings/tokens-fingerprints.tsx #: src/components/routes/system/smart-table.tsx @@ -160,6 +161,10 @@ msgstr "Riwayat Peringatan" msgid "Alerts" msgstr "Peringatan" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Alias (optional)" +msgstr "" + #: src/components/command-palette.tsx #: src/components/containers-table/containers-table.tsx #: src/components/navbar.tsx @@ -304,6 +309,7 @@ msgstr "Dapat dimulai" msgid "Can stop" msgstr "Dapat diberhentikan" +#: src/components/containers-table/container-alias-action-button.tsx #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/systems-table/systems-table-columns.tsx @@ -363,6 +369,10 @@ msgstr "Periksa layanan pemantauan Anda" msgid "Check your notification service" msgstr "Periksa jasa penyedia notifikasi anda" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Choose a friendly name for this container (optional)." +msgstr "" + #: src/components/containers-table/containers-table.tsx #: src/components/routes/system/smart-table.tsx #: src/components/systems-table/systems-table.tsx @@ -632,6 +642,15 @@ msgstr "Ubah" msgid "Edit {foo}" msgstr "Ubah {foo}" +#: src/components/containers-table/container-alias-action-button.tsx +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit alias" +msgstr "" + +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit container alias" +msgstr "" + #: src/components/login/auth-form.tsx #: src/components/login/forgot-pass-form.tsx #: src/components/login/otp-forms.tsx @@ -1327,6 +1346,10 @@ msgstr "Detail S.M.A.R.T." msgid "S.M.A.R.T. Self-Test" msgstr "Self-Test S.M.A.R.T." +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Save" +msgstr "" + #: src/components/routes/settings/notifications.tsx msgid "Save address using enter key or comma. Leave blank to disable email notifications." msgstr "Simpan alamat menggunakan tombol enter atau koma. Biarkan kosong untuk menonaktifkan notifikasi email." @@ -1344,6 +1367,10 @@ msgstr "Simpan sistem" msgid "Saved in the database and does not expire until you disable it." msgstr "Disimpan di database dan tidak kedaluwarsa sampai Anda menonaktifkannya." +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Saving..." +msgstr "" + #: src/components/routes/settings/quiet-hours.tsx msgid "Schedule" msgstr "Jadwal" diff --git a/internal/site/src/locales/it/it.po b/internal/site/src/locales/it/it.po index bc4cb2f8c..f9f29505d 100644 --- a/internal/site/src/locales/it/it.po +++ b/internal/site/src/locales/it/it.po @@ -84,6 +84,7 @@ msgid "5 min" msgstr "5 min" #. Table column +#: src/components/containers-table/containers-table-columns.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/routes/settings/tokens-fingerprints.tsx #: src/components/routes/system/smart-table.tsx @@ -160,6 +161,10 @@ msgstr "Cronologia Avvisi" msgid "Alerts" msgstr "Avvisi" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Alias (optional)" +msgstr "" + #: src/components/command-palette.tsx #: src/components/containers-table/containers-table.tsx #: src/components/navbar.tsx @@ -304,6 +309,7 @@ msgstr "Può avviare" msgid "Can stop" msgstr "Può fermare" +#: src/components/containers-table/container-alias-action-button.tsx #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/systems-table/systems-table-columns.tsx @@ -363,6 +369,10 @@ msgstr "Controlla il tuo servizio di monitoraggio" msgid "Check your notification service" msgstr "Controlla il tuo servizio di notifica" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Choose a friendly name for this container (optional)." +msgstr "" + #: src/components/containers-table/containers-table.tsx #: src/components/routes/system/smart-table.tsx #: src/components/systems-table/systems-table.tsx @@ -632,6 +642,15 @@ msgstr "Modifica" msgid "Edit {foo}" msgstr "Modifica {foo}" +#: src/components/containers-table/container-alias-action-button.tsx +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit alias" +msgstr "" + +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit container alias" +msgstr "" + #: src/components/login/auth-form.tsx #: src/components/login/forgot-pass-form.tsx #: src/components/login/otp-forms.tsx @@ -1327,6 +1346,10 @@ msgstr "Dettagli S.M.A.R.T." msgid "S.M.A.R.T. Self-Test" msgstr "Autotest S.M.A.R.T." +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Save" +msgstr "" + #: src/components/routes/settings/notifications.tsx msgid "Save address using enter key or comma. Leave blank to disable email notifications." msgstr "Salva l'indirizzo usando il tasto invio o la virgola. Lascia vuoto per disabilitare le notifiche email." @@ -1344,6 +1367,10 @@ msgstr "Salva sistema" msgid "Saved in the database and does not expire until you disable it." msgstr "Salvato nel database e non scade finché non lo disabiliti." +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Saving..." +msgstr "" + #: src/components/routes/settings/quiet-hours.tsx msgid "Schedule" msgstr "Pianifica" diff --git a/internal/site/src/locales/ja/ja.po b/internal/site/src/locales/ja/ja.po index 85b025fbc..3a0659a25 100644 --- a/internal/site/src/locales/ja/ja.po +++ b/internal/site/src/locales/ja/ja.po @@ -84,6 +84,7 @@ msgid "5 min" msgstr "5分" #. Table column +#: src/components/containers-table/containers-table-columns.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/routes/settings/tokens-fingerprints.tsx #: src/components/routes/system/smart-table.tsx @@ -160,6 +161,10 @@ msgstr "アラート履歴" msgid "Alerts" msgstr "アラート" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Alias (optional)" +msgstr "" + #: src/components/command-palette.tsx #: src/components/containers-table/containers-table.tsx #: src/components/navbar.tsx @@ -304,6 +309,7 @@ msgstr "開始可能" msgid "Can stop" msgstr "停止可能" +#: src/components/containers-table/container-alias-action-button.tsx #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/systems-table/systems-table-columns.tsx @@ -363,6 +369,10 @@ msgstr "監視サービスを確認する" msgid "Check your notification service" msgstr "通知サービスを確認してください" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Choose a friendly name for this container (optional)." +msgstr "" + #: src/components/containers-table/containers-table.tsx #: src/components/routes/system/smart-table.tsx #: src/components/systems-table/systems-table.tsx @@ -632,6 +642,15 @@ msgstr "編集" msgid "Edit {foo}" msgstr "{foo}を編集" +#: src/components/containers-table/container-alias-action-button.tsx +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit alias" +msgstr "" + +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit container alias" +msgstr "" + #: src/components/login/auth-form.tsx #: src/components/login/forgot-pass-form.tsx #: src/components/login/otp-forms.tsx @@ -1327,6 +1346,10 @@ msgstr "S.M.A.R.T.詳細" msgid "S.M.A.R.T. Self-Test" msgstr "S.M.A.R.T.セルフテスト" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Save" +msgstr "" + #: src/components/routes/settings/notifications.tsx msgid "Save address using enter key or comma. Leave blank to disable email notifications." msgstr "Enterキーまたはカンマを使用してアドレスを保存します。空白のままにするとメール通知が無効になります。" @@ -1344,6 +1367,10 @@ msgstr "システムを保存" msgid "Saved in the database and does not expire until you disable it." msgstr "データベースに保存され、無効にするまで有効期限が切れません。" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Saving..." +msgstr "" + #: src/components/routes/settings/quiet-hours.tsx msgid "Schedule" msgstr "スケジュール" diff --git a/internal/site/src/locales/ko/ko.po b/internal/site/src/locales/ko/ko.po index 49626b389..a01d9002f 100644 --- a/internal/site/src/locales/ko/ko.po +++ b/internal/site/src/locales/ko/ko.po @@ -84,6 +84,7 @@ msgid "5 min" msgstr "5분" #. Table column +#: src/components/containers-table/containers-table-columns.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/routes/settings/tokens-fingerprints.tsx #: src/components/routes/system/smart-table.tsx @@ -160,6 +161,10 @@ msgstr "알림 기록" msgid "Alerts" msgstr "알림" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Alias (optional)" +msgstr "" + #: src/components/command-palette.tsx #: src/components/containers-table/containers-table.tsx #: src/components/navbar.tsx @@ -304,6 +309,7 @@ msgstr "시작 가능" msgid "Can stop" msgstr "중지 가능" +#: src/components/containers-table/container-alias-action-button.tsx #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/systems-table/systems-table-columns.tsx @@ -363,6 +369,10 @@ msgstr "모니터링 서비스 확인" msgid "Check your notification service" msgstr "알림 서비스를 확인하세요." +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Choose a friendly name for this container (optional)." +msgstr "" + #: src/components/containers-table/containers-table.tsx #: src/components/routes/system/smart-table.tsx #: src/components/systems-table/systems-table.tsx @@ -632,6 +642,15 @@ msgstr "수정" msgid "Edit {foo}" msgstr "{foo} 수정" +#: src/components/containers-table/container-alias-action-button.tsx +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit alias" +msgstr "" + +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit container alias" +msgstr "" + #: src/components/login/auth-form.tsx #: src/components/login/forgot-pass-form.tsx #: src/components/login/otp-forms.tsx @@ -1327,6 +1346,10 @@ msgstr "S.M.A.R.T. 세부 정보" msgid "S.M.A.R.T. Self-Test" msgstr "S.M.A.R.T. 자체 테스트" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Save" +msgstr "" + #: src/components/routes/settings/notifications.tsx msgid "Save address using enter key or comma. Leave blank to disable email notifications." msgstr "Enter 키 또는 쉼표를 사용하여 주소를 저장하세요. 이메일 알림을 비활성화하려면 비워 두세요." @@ -1344,6 +1367,10 @@ msgstr "시스템 저장" msgid "Saved in the database and does not expire until you disable it." msgstr "데이터베이스에 저장되며 비활성화할 때까지 만료되지 않습니다." +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Saving..." +msgstr "" + #: src/components/routes/settings/quiet-hours.tsx msgid "Schedule" msgstr "일정" diff --git a/internal/site/src/locales/nl/nl.po b/internal/site/src/locales/nl/nl.po index bd3661f99..cf3cc4085 100644 --- a/internal/site/src/locales/nl/nl.po +++ b/internal/site/src/locales/nl/nl.po @@ -84,6 +84,7 @@ msgid "5 min" msgstr "5 minuten" #. Table column +#: src/components/containers-table/containers-table-columns.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/routes/settings/tokens-fingerprints.tsx #: src/components/routes/system/smart-table.tsx @@ -160,6 +161,10 @@ msgstr "Melding geschiedenis" msgid "Alerts" msgstr "Waarschuwingen" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Alias (optional)" +msgstr "" + #: src/components/command-palette.tsx #: src/components/containers-table/containers-table.tsx #: src/components/navbar.tsx @@ -304,6 +309,7 @@ msgstr "Kan starten" msgid "Can stop" msgstr "Kan stoppen" +#: src/components/containers-table/container-alias-action-button.tsx #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/systems-table/systems-table-columns.tsx @@ -363,6 +369,10 @@ msgstr "Controleer je monitoringservice" msgid "Check your notification service" msgstr "Controleer je meldingsservice" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Choose a friendly name for this container (optional)." +msgstr "" + #: src/components/containers-table/containers-table.tsx #: src/components/routes/system/smart-table.tsx #: src/components/systems-table/systems-table.tsx @@ -632,6 +642,15 @@ msgstr "Bewerken" msgid "Edit {foo}" msgstr "Bewerk {foo}" +#: src/components/containers-table/container-alias-action-button.tsx +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit alias" +msgstr "" + +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit container alias" +msgstr "" + #: src/components/login/auth-form.tsx #: src/components/login/forgot-pass-form.tsx #: src/components/login/otp-forms.tsx @@ -1327,6 +1346,10 @@ msgstr "S.M.A.R.T.-details" msgid "S.M.A.R.T. Self-Test" msgstr "S.M.A.R.T. Zelf-test" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Save" +msgstr "" + #: src/components/routes/settings/notifications.tsx msgid "Save address using enter key or comma. Leave blank to disable email notifications." msgstr "Bewaar het adres met de enter-toets of komma. Laat leeg om e-mailmeldingen uit te schakelen." @@ -1344,6 +1367,10 @@ msgstr "Systeem bewaren" msgid "Saved in the database and does not expire until you disable it." msgstr "Opgeslagen in de database en verloopt niet totdat u het uitschakelt." +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Saving..." +msgstr "" + #: src/components/routes/settings/quiet-hours.tsx msgid "Schedule" msgstr "Schema" diff --git a/internal/site/src/locales/no/no.po b/internal/site/src/locales/no/no.po index 8c2d07c7c..63b910b96 100644 --- a/internal/site/src/locales/no/no.po +++ b/internal/site/src/locales/no/no.po @@ -84,6 +84,7 @@ msgid "5 min" msgstr "5 min" #. Table column +#: src/components/containers-table/containers-table-columns.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/routes/settings/tokens-fingerprints.tsx #: src/components/routes/system/smart-table.tsx @@ -160,6 +161,10 @@ msgstr "Varselhistorikk" msgid "Alerts" msgstr "Alarmer" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Alias (optional)" +msgstr "" + #: src/components/command-palette.tsx #: src/components/containers-table/containers-table.tsx #: src/components/navbar.tsx @@ -304,6 +309,7 @@ msgstr "Kan starte" msgid "Can stop" msgstr "Kan stoppe" +#: src/components/containers-table/container-alias-action-button.tsx #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/systems-table/systems-table-columns.tsx @@ -363,6 +369,10 @@ msgstr "Sjekk overvåkingstjenesten din" msgid "Check your notification service" msgstr "Sjekk din meldingstjeneste" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Choose a friendly name for this container (optional)." +msgstr "" + #: src/components/containers-table/containers-table.tsx #: src/components/routes/system/smart-table.tsx #: src/components/systems-table/systems-table.tsx @@ -632,6 +642,15 @@ msgstr "Rediger" msgid "Edit {foo}" msgstr "Rediger {foo}" +#: src/components/containers-table/container-alias-action-button.tsx +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit alias" +msgstr "" + +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit container alias" +msgstr "" + #: src/components/login/auth-form.tsx #: src/components/login/forgot-pass-form.tsx #: src/components/login/otp-forms.tsx @@ -1327,6 +1346,10 @@ msgstr "S.M.A.R.T.-detaljer" msgid "S.M.A.R.T. Self-Test" msgstr "S.M.A.R.T. selvtest" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Save" +msgstr "" + #: src/components/routes/settings/notifications.tsx msgid "Save address using enter key or comma. Leave blank to disable email notifications." msgstr "Lagre adressen med Enter-tasten eller komma. La feltet være tomt for å deaktivere e-postvarsler." @@ -1344,6 +1367,10 @@ msgstr "Lagre system" msgid "Saved in the database and does not expire until you disable it." msgstr "Lagret i databasen og utløper ikke før du deaktiverer det." +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Saving..." +msgstr "" + #: src/components/routes/settings/quiet-hours.tsx msgid "Schedule" msgstr "Tidsplan" diff --git a/internal/site/src/locales/pl/pl.po b/internal/site/src/locales/pl/pl.po index e2210a082..4ea4038b0 100644 --- a/internal/site/src/locales/pl/pl.po +++ b/internal/site/src/locales/pl/pl.po @@ -84,6 +84,7 @@ msgid "5 min" msgstr "5 min" #. Table column +#: src/components/containers-table/containers-table-columns.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/routes/settings/tokens-fingerprints.tsx #: src/components/routes/system/smart-table.tsx @@ -160,6 +161,10 @@ msgstr "Historia alertów" msgid "Alerts" msgstr "Alerty" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Alias (optional)" +msgstr "" + #: src/components/command-palette.tsx #: src/components/containers-table/containers-table.tsx #: src/components/navbar.tsx @@ -304,6 +309,7 @@ msgstr "Może uruchomić" msgid "Can stop" msgstr "Może zatrzymać" +#: src/components/containers-table/container-alias-action-button.tsx #: src/components/routes/settings/alerts-history-data-table.tsx #: src/components/routes/settings/quiet-hours.tsx #: src/components/systems-table/systems-table-columns.tsx @@ -363,6 +369,10 @@ msgstr "Sprawdź usługę monitorowania" msgid "Check your notification service" msgstr "Sprawdź swój serwis powiadomień" +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Choose a friendly name for this container (optional)." +msgstr "" + #: src/components/containers-table/containers-table.tsx #: src/components/routes/system/smart-table.tsx #: src/components/systems-table/systems-table.tsx @@ -632,6 +642,15 @@ msgstr "Edytuj" msgid "Edit {foo}" msgstr "Edytuj {foo}" +#: src/components/containers-table/container-alias-action-button.tsx +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit alias" +msgstr "" + +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Edit container alias" +msgstr "" + #: src/components/login/auth-form.tsx #: src/components/login/forgot-pass-form.tsx #: src/components/login/otp-forms.tsx @@ -1327,6 +1346,10 @@ msgstr "Szczegóły S.M.A.R.T." msgid "S.M.A.R.T. Self-Test" msgstr "Samodiagnostyka S.M.A.R.T." +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Save" +msgstr "" + #: src/components/routes/settings/notifications.tsx msgid "Save address using enter key or comma. Leave blank to disable email notifications." msgstr "Zapisz adres, używając klawisza enter lub przecinka. Pozostaw puste, aby wyłączyć powiadomienia e-mail." @@ -1344,6 +1367,10 @@ msgstr "Zapisz system" msgid "Saved in the database and does not expire until you disable it." msgstr "Zapisany w bazie danych. Nie wygasa, dopóki go nie wyłączysz." +#: src/components/containers-table/container-alias-action-button.tsx +msgid "Saving..." +msgstr "" + #: src/components/routes/settings/quiet-hours.tsx msgid "Schedule" msgstr "Harmonogram" diff --git a/internal/site/src/locales/pt/pt.mo b/internal/site/src/locales/pt/pt.mo new file mode 100644 index 0000000000000000000000000000000000000000..fc4f6efae317558e7db80d096e7c91887cf0f259 GIT binary patch literal 29992 zcmbuH37i~dng2^}BKHk)6jw+vGs#Q{V1VFcW^zD|Au}OFJgDienQ7A9)pT_ynZ$S_ zBFdtO>+#>eW<3zrtRlE7x{EmC!Ro53crPmMiYLe_f(yF){XOqn)!masqShyG|LT3~ zt+(Fed7tZjCJ!F5&n*GhTb~sKCxTx(CX+m8^YG-&+G72CfGW0j~z14Nih*f!BhnzXO~NeiBqa z{tG-4{FTQe&jT<`*q z>5s&uiez zz#oH}k5M`!IxB(ugPTFk&nrN+|3*;sz8zFQ?*#SUy`aYR1yJ?=&6hs}sy{yipAA0k z%MY02-a8aj`7z)=;A!9i;91}da2}{}TmU`?90WBF5vcFfLAC!{k8cOnuMdK1?`}|Z zeGjO1zw7bG{`oIKedjUoDDY{YKfKG0=R{E7InC$K1=Y@l;6dOZsC8ZgLgGOkJO+Fl zC_4BMcry59P~-R|sCoJwsCJ$P2f%$<J?-8GW5>)^8na5bcgF$`g z5>WGcC8+nV0uKSppx)mKif*n2)t@(ls{a;H_1_NCbnrg^`~gt!eIL}gegbNppYr9$ z!W{Jeso+)MOi=y0&f`s>#`$)i|1hZUegf3`d>T~yU-tQLfrpX*Pw-IiagY1N|&>xx98lvq7hD1^2E~uB2cHY> z0M*WSeEE~$k>pQ2&+*-Ppq`I`>c_R9`ulot7I-sw1o$aXfb$}>ixTa{xGP1J?``W1Fj)|!1G*xt^_Y8KMrbLZw1w#JHQu%cY_PTBfUC&Q z0oC4CkFNyP@9RLV-y1-^_cl=N+y-hKUjWt5Z-d8x4};f(e*`t(uUo_(1-}OlfXkTl zlfXBE&jJ4dRQsRz_;rsz05z|_0M)N2!K1-Hg0BFNdcJG_7EsTB3eE%{0Z#*u?sM~W zKB#v3LCxzB2#E&kK}aHalh5A|Y901k?64c0L;eLITRXT8>;*psc7u__e;)X9@J4W7@Q@|0{!yUnhv44eeDF;0JW%ys1ZuqtU>Epukf8-TK$;33178K6 zx75w&-QZWB#d?DKQGU;I*Uslat>c$GKH%{|Q1u@6`A0y_;}f91|Gz%J?kz1ZjDeb; zsxN;fsP_LBoDJRvsvlnm=Yl^3)$U;{96cTj&LZCrY8}g<`f(#T2fPbB9sCh^0=Vx= z_x%tQ9i9tnU6z9C&!wQoH4LgB1yJK@f=pGg6{HKnec&4K@KtW!i=gPP0*XGb1+_2V z1*)Bof@=5kpuYPppZ_VS`F#>pKMr5*>KzR}oBWxe_(~5r0~`Vm0@G)>E7!JAdE(O)jN>K9S3Q+S}0iO%r44wtv z1I_~<1`!RxahJLESp)WvUk@UhgByJQUQp}(8!!a-V-ofJEbvh9Mc{#81=PH3^7)%U z_3s^^`g1R+aedR{LmnRiH9!9YHo*Odkrm)eL9Jsj;@;a26dfG_s{Zky^cR6jO=hk$iZ^Yltk@7(}uy>9d6cY&(^FQDq*2a3;p1Jw6_4XQtX z05#8h!^D(75!5(O1GOIAp!U}yuooN$MUU?QwckDg>igdVMQ^_c_W}1>=koi5OUNGv z>ig@!0+@p8@3+7%@F7s|A9jV?N5_LbofqK2(AJ(UmJY+^`PkJW^fdIr_cYb;MFTCe*+wSPZ&Joq(V{tFNi34RT# z{*o8MGr(2pq@Vto&fIqVn^p8cpUk;;3jYxsQLXgsQvu~Q2qTrsP`WR zwVqFar+|L|RsW=yxPG4rs{Qjp)f)!Yzx5tp4bCIK1JrvDf*RjXeEwJ9DdZmqH4jH$ zfdKTednt_{|Kn>JPoSe z-fV8YcOso@(+Oe z-r}P33$6jRU*81kdw&O3!1sZJ;E}QG*LrXc`2si-ya|N$1Rn#{uS3Tiy@%lI$!`R; zAD%Vt+I`;0U+@ya`nQo(7Kr51Me}I2}|!&j$7UTwlJ#<4REN zjex56V(>KZYH)w>jbIme3#fiffd_yOfDAQw5Zn*!FS+`cfcubN1FF4sp!!n)&j7c8 zYUf>`#(xKRGWZ$r{os#4rXYCT)%b+KN5RX$5`*joKM9@%J_2ey$FMk}lbN9C>l~l& z2lpj^87TT$2YwK2g5ocyu~>S(89W<&88{of4V(df9Xtqp5Y#w+0bT??0bUF)s5&}m zf^*2<DEhn{6hA3}hk~yH)sHuW z2ZHYcHQ%>^qLUB%^7}#c`x~If`vXwx^aoJ&_q)dJw}U~g$KjyHKMPd5-9CRlsQQaQ zy*~(QzE^>Vfg3@M_c~DPe;26w$JbpuA*gz1gX+fxAYBO7gExTpgKGEk)a}2Qcuc{) zDZdWX{M-Pl-Fv~)!7qUG!C!*?VAyc`tOzbAe>zXhKK>RT@(>3S^%T0>ojkhI@# zrtD>;jVkn)`1k8cPm{D}KOj9u+ST<{3bp@U>mOG1QGb0HJexeE5PXFMD-LcXular( z>02aS*EtA&>QV42f4_+Oi~apex&IXR&jLjoTR~mJB+ZrPTi11z-va&zX+K|QGxyK- z_uK|=B^|39t`}4OS@0ro5ZnMhkMvRQw~#L6{sBr|d)!(hHiTjlRxDxPK$}>p@*_C;f!fP1*0j=aN1|x{8!tzvf2# zaItS=Gx#w1dwqqnFFynPC1uC@{E^(hnY7*4I~CME*Y$hSk<@!9xRmq=>3gLAM>>Y` z8^Je#=ac@1^a=9kfiEOgNxH5eebVmWv6Q`+`y0TwfNvt5;Okw&{ijL)KpLTJ0Q@#d z*9oKn%3kB^&H%3@9ZDJ}eTnCLfpya3+=rx>lb%oh0Ftf-xB`5LG^zrw&yc=mckZVL zcmt`6^itB%ymN|w|Lf$>_4muc%Sp>f;vwCn_G<^3eSBT<)|>ppVag6_tN3N^U+nYy zfOUWW0kFrvucB-H{R$!JDAEz6=P2KHUCaH=q;;g%@$5A4yQEp%e+SI2A~!QBy9V4B zoI@&ce;Y|Ms{IOiHvL*pSwDpf{e%AxR!BpXPk^rk=aP=%{xXuTe{m4JoN`^CBRyqz z%r|8t+)t4X=DtR{p0tSktH3kBUXrePQjKjr(_jzabsM{ai2t-vhpgG@Eo4 z`F{srN7_Kr_4lN=P=18v+|NpX|0uYYXMLo9<^Fck&q=Q!W!IhlW*c?3aUX;K1^$gM zA0+=q?#rYrxW5v-lynXEr+~MTPUc?M7LUK;{v6WP-^!%Sl_mDnLT0;5z!L=k^ zXSLNkmwbu*>7;+Qr|@R(f8_54|3gYB)3wY&a6fn%Ws^StO>iOkmA>8@j}hf}k>-RPyNC#4O6X_!ESCO`oY9w7}JFwrG{JxoblcYPiznt`Z(o*uP zNPBaCIQWm?TfujOx(?&MpA>Wd2hte#y5^8hA{9t4qU=8KkEHhNC6xb61wG+J(yRlO zQq}!78!)!o=g$j^(PSF9;=V$olvL9|xH0w+_Lbv$BP$Hk zMnt=P#bS8jyhX#4X(O&&ICtJ6D_Of{g<)#NcDr>fNw#r!bu(>*#Zp=;N0VVvv+sms zNj)q~M6}+WRcTDb;igitF%c$Xp)!@IR1JA4X*Q^%!S#(b;=20{)40(nRmZJnT-{iz zC)G+^ZG;=6dMO$$$LXA~9@FJ|Bcz3TxHwL?#N}|JIhuXEIv%HCBMBSPhB%DJ#^OSQ z&WzJYU;_`AmC{C1pL98$73n^f#L# z`o_nKaXD_p;nr$YiML(cQIA}+kyN5asSp;D+9dtIrdeVTVZ>+)YN^22;?3&j#<(7h zvl4bF-nMn#Hn)zxR=l|o z$Hnwd)Tkw!V%86WX;y4O^}VG-YZlsh)TV7{ce|bNQtK-aNtC?w4=xMMx zDr{)hQm|Sya^bF_1ZhkLi{k8jV4rTYKk(wQ{o_ zmFI*>l@&T&`-PpfEli-sdaEGaMlT#SrOjF`fr!J^wYa)`K-5r$j6(Vb`Bo>x)hy{m zZy50lU6l%Mb!zowBQsNn_RtR?edc9etxe5a>cDzOT^fyXXwkG=}tG=Wj$BTytvivhu zUzSwj(R#dTPwTHMRg1}{v{ikw!F4RhnrN$&TkUk64#gaEfIZ+vQ-H5_+g1y=wm(x;{0et4e{q%Vvf|cbgwprEki@{dn zM!i&kE_@AG8(gCtMzvZwBOcF?txjEofhn^G$L*$(@oRE%VFMo@_boF$url~d*_ziw z1#>ReQQCvh~lm#<2VHHtTmJ&K)>@El zs2P!xLbZ)#LtGVK)WGQw9F^yeF?I1dajx#kO4(RvL4uMGY8yzG_{%=uv-9VB^m&*7 znverzO(AKbGq@~^P-ia}=r*c5w{Xy3{@*P|urDk&|&fD;yCd;T?7urg*xO?H;8iW^X- z|B$Ozs?h2_%k`_Kn$p^gX2`);^%Kt8Dw6fe)C#nM#>BSS_Q>XI05L7v4hD<#RX=PH zlrwj$wKv75z0hf+gJLp){dR69%4)FPLFBghyl!d@i)WqIqdF`w?o97~A zV_;!aEW*4@uXIc--<-Rs)!p6gUpDrL+R^3K*>7k)-GyfBgeyvKFj$+2E8^+FV7;Ey zgTc*FrB;p?a^rNkze>p&+#DC27Cy9mfF{|n#@J2APc?za0LTw!f)>SQWai;t`6k>{ zLc)(qP>5cO-Qf^S8CG7A!VLp3Rc6%ba}0HJiAtI3Hn_RwR9~t5rjW_V5$AxVNr`86 zrQGX1sbC(&=8c7V`mkqCG@(GdP3F7bQL{T(5>4=UB8HX_t4n56fEHBr5cV~YrK6~W z>B6iCN@&yT;C2cQ9euWbVrp727WcmZz?qu<86`D1qzZV0(c%d}dU`eUW z1c{KAwDEx@h=olNs_qgdjD^{XDr-u9sJm&3?ld*mWu@fu@;GapQSimVl4iLaNKYU1 zdb;k1%orG`N1N=CV+l*0su3(LC!FEE^da3RlLB30Rojqn~iUFdSMvJTfO- zI>-;*T{hS^5YB?I#P{68*}<|nDmNwse(v(SaAmG?v>r40VyDdlYH>P7uP1|L$S-uW zpVmS_$kBKVIVx7>aV6VuCY@FKSwjU!Iof&_hWAeCy4eRzbbka<<9rWs0QpTiE z&da^-V0mVAEEjjc(xQalQn8a!bO$TY-kM^DE1aq8z?s6qiV|k2BXn7`vmzM}S7T;_nA!Fl%A$fPhGT9YP?+*0*`QHM)W`Hk z;&l_okts?A6N^q&NiPnaGNswU;4DLha~FjrHeD)ap<<^t!7630cLyus*`XNC%BU*2 zQ}iwa*-{;fW33*eUdL$9=s;9%B5T=f&6;&9SEg1*n?vUlae^uE^2rqX4q4?hzmbY(V!m7NK%eX!DeBE?vAx9Zvsurdwk*js zFmpBRWuL5GKG4qwGV?ZAT@B-?Fp=@xIr-B0m6T;ND$bs9e8;X#$3(a0&Gz+flNq*m zV6)wP!pXk;Cf|;MY-?M!ukS z|BoIPq*pop&6J9iX>4fk*-|w1ks=+!;Ke9l>o-s-qj7jc-kxVOaOQUY zoIQ@KwlVOObm1myZIBfD$m*0~cT7Y_vuPYlQi>wkzAdfP%n9+ic1tZETv{5(!ZJsS z6B*tZ7?MijB;#s&&Z3vt9_{WdNK4=136`78F{zzYgtajPVJ;Ph>WPGyY=b)bQ847# z#-;IOa9Oj2mAnkSC=J%Yj`=ZbQ8#07feBE?2RwJ8gv)G=C&AStL-~Cq-KtaTv}Y(^ zMJPGD*UK`=Gs;&sDQ~1d+^A<(fmsXI$jJon##<1<`1etsLivuJ2}cG`ObxBBrro&) z+ex+!ih-OJK^w<&7EDLca9kei8sU?Ktr|6&6PPM&0{dz0Y8B<`xD(aT6`$P@8u837{v>a78Nbu8hqaUZux62*2v^D7%sNI|1YZQ|)Kv8Tl!M7ykI5r(N)Bww- zJ!FlSP+Mus3*TX=zt}{?XEz~kU*=j0Z|cQsM@Jl+)fZq<(sW?RO_(g+>0;A-FPJ$D zwJHyjHyYJ@|D8X(d0s{DDol8=J(YHojY$f zb!?}#4=HaW^Lu8>`EEQR8VyDTo>phq4NI}cOU~C2in)gEEHzdYj#L_(bXpx%ooR>E zl;GAX&>9UulbF{M;myXVgs1Pm6n)s{W{9VXuCcR^D@;ve3=35APebq6mD`r)L<@Ntaw3Pb>gww)m35b=Co;2)qqUuz&~MLO^KNFtWfB*vX&H#@Mt>8g?5$!j z?3iRQ3{wmjPX@zwDl;O6$1QAGzfE4ltn&q%qMCOk4C^+S`53KY@J7*?<{hkxptaAq#oacC|U592MsFthvPz13J{OxiODy z5ms5yIZ<~oBG$ogx*-ilP@e6F-ZT)B?f0+*G)>j;59#cfACfk7%1ZGVZ2^gd2SU5T z<@1Sm*=c(SiWy;PHE=oCQ=3*f0BI)KV0#N~9l@uE-VBZq+RfUW@WP%&Sd2K>dKQW2 zsFDuQ63S7$j8Cwt9vKsG8etUI))rhzi8POZU}=$sEW*^L>Z~}K(@+#oRHa%9h12`Ly!+46MfW%etz?@C8)tNYjgHVeW$WO#&yf+n{izB}9^WsdYrrvhJm1HI)Lae`@ zY{F-i+hq9>q#Dvk>s5VJCokE3z7KgEk8+l{0n>k|nND;#m3Sy|<O83%&zk9B42();-kcEbHVK;cs16t_b_hHQs)o z9iyy|(_p=(UD7t!#ls1+jHJeUe@=Jcd}J+W3LnCAjz&@Wgw!}sJQdwx$=Afr<-u0BHhM4a5XdEwY=DMIlC8{TZksBP^TGdVjYZh ztxU&D#jeH8@w96sSs2b3THUnpyOzOOu`6MvFqY9pRT5pcy)Qa;b3&UDt#>(X@2V0%#>7F+O%F}6V*9dHJ zA%@Q8#$2|4sd|CQ1C)k~){ZRcI=@vb<~I+eNdg;i(seJ+m*EaYdIqfPh*`C&hI{-a?eA${LJOkwbPTXGbiTD^#>OK@O4ip7Abtk?l1@Ae&$~5=MIuh1!c+xsyfi{hV1&$=e1cNRW z!);96js^omY?b;smVs9Z3$zk%VeBzp8F^3B`07Y{PMOHRJW8;wCP9K>Vd~CWDRLnb zQ`;46z;JmT{!NS8Ynzd&DF>|egcFjf+aQc!t&0wHi&3#MeO20_x~tdnzV?N_LLn-J zc=k)1ZR`l(=^=wzMJYkFwsQ^UfFQxd)w5P~GB{56nK+gJjq|MZPj!w-YA~U!V@7zp z90^0HBy4shDNXLKL7kZP+w2*+*c3(8saqos-#if#_)+U#fVMs1OIeS$dJks3;j#esT~`MTE+uWG$x@Z z)b5D?>oYFK=C8WO)Z6Kdm;KBb3y~PFub%U1JUfxtClbNO1#X0G^s^x%{c1EU1jlfm zQPO^+_DlUlHvlLh{PkSgpVRCO5>6o%&xl38H>|+fn!9$)DrfwJc#`rC#|o;!-%WzsP=*Y%-i=RUaTL?%R0 zh)fGh(qKZlX9M@wr*-|h?Rj|>Mty8 zI&^A0wL{XG*=-optVP8-G(b3(sW2IuanBYLc@#_ICAscgu%gKp?u}Q77iXKqp10T! zPYN_UcUa$Y8PA!0#&JJAEm~Fo)G{jVbg#C!x|V3bLK8DqPY8$$4;=j8_N=~cP zf*32zr9Usu#*&sxqmP1%%Ah9Qv8iqFjQygfduH(`UeVbhEUQGvsNM8$sKqAYcj|6*dC4Tl8T2PU zJL~+x;Mmmd1Vch398N%Z&|^7qp^&um*J@-$CbjGm8!FL}O}A*7N-wdi7z%X3uxg}k z0!aEbG5|insA1=pYJ5T~MU>k%A;8Lx-bM)2p8r8_7hOIn=B~ zW)X^gp>E3Vnc9IVqE$6Nxr>h!O<6Fc;|k7#@+4>F@H`P!+XKF)&?@yFQOu9VR*?#^ zi&)7reiW=ti%{YPxGqCM+$vg9QnzaMN}GD>%cCSD`VH;IthroZ%XW1yQb7llJWrSw zxiXQvoc`2{Q#&F!!t`2gvP-;1e2H$is@b5>M){tZaP}l=wxTJ~(Tp1LMowc`c~m8y z53S}iM^(0z`<7}yn4&Hf(1JXXU#!1?U{|heGhh0>)kOCPy}5+`XNHZ_Ms>SXr+lpl zOX-d)QS-!(6<*nqX$!Ixp|}`J2IwZdh+jzFNzUdYq!u=B9%q?FS9ofQbe?0CCnAr+=++7?FnQTms_prs)dTWb! zuse|&kzs1ronkmm&01=+G&&T=_t;{vhT@T4i=4(^STgAqE2p-%MQWPl&FwSJb6kO! z*O_RRPA>67pQl&J^2WGCQkh#Llkyh7nGh+7$|!-(2@hVWc-**!w#07V+__?;XjUlA z0yx9k)ZL2djBseQv=Ox!tddT&3Y8hZ}9}C(v9Y}xCq}?A7zKql#MoH1%!00qA+XHP`@>pZQ_hjX62&Qi39PMt)^M(J@7&7@&zJP&!vz$-h22c;crLT8AF~4nwgP?!<>pRxk(CFT!Fc=MlJ@u-zV)- ziWo&@9ATV6*hkrJepA##MXI)P+4gI*33wMuAr=O@PSlcefMYFCmw74HSg@)-x+YVP zQ*QOg_EgRSRILjfJzE?NUWW;2gGS-%j%P@@G9OxNJ3s<)%M9>FEMv~2_U%vlyG#Xb zFP+9f5ND(560N@>_u^S2HS4WA@4>KB_^o5fE;v5h#F;PrsTS&eW9l}q-uaJA zZSN{eHfdZaXAiyN{r2B0pzAwSa3@Ds?1-F1h#u0mviMp13wPf;`%q>s$s8y~9FxNL zVQEr+*jMP3=8G_`M5+Zl*|?}X$)VZ5>TB$)7|opx0@uy%j6O1@Nwd!$%PlC@&4t8{ zD?$z4BJPz%#CGW3=Moirx!>i}S`e*um^7_jpVu_c{WKSzXPnXuIGJ|`eBMRC^cf3w zR<(=5s&wd%rsX)KMfXLZJd zrG6&|g$&=wFXQ~)T`L)9H~`JR-ix6;6PN~2N|#7)VrM;X3@0j z3f*pvhyFMt(4N2rI1P}aKyy1hbsJng^FKj58mc=2Ve0%@2#;|j6Dp678@)3^$m?Cc zoJ&aSF?4Hz4Qi#rku&nGJ9}4jj_i`QxVuwJZ86QW{=AVE+7B%Ko^79sTtmnQx)29R z2l=^g%K;88dOMqqlNlDPF~W54I|S#9wErs1hb?Q`IXX6+lW5+kk*ix)*Y>te zY3M_KE#lW#2g;JR*~mKF{;>T)Ee!-;jOL&O%Bz*>IOg7hnV@ZXbrBa|6JMK@10-c~yK+v7HHu6>tuWwVG#{A)S7=1s2EQa_<-uOEHfw6Qylw zdJ}A($wk9;R*z=VpQO0cH3f;G$7hOVTY;PBg%z@BuziX__H=ZA>+j$CYXymQ< zWY||*Jo138ZG+fk`sl4TI%49%Y^K~@5Oh>^n|n7kE!5e0DEs`Tl2kybi?Ndv zt*PIgNQykh!*kp?w4fqRw6quG=Rg`;K%f2h5MJgQ|Je20J_4Ce{zdQa`Rj>k_;ip% z_h9gZB9&vYjKHTNYw=*Jd`t zKD8E1XcqIVsIvYn`XY~d=2%lMa~Oewot;QE&bihcCu_ZYvAAcp6k*KrNnVcpfH_hs zwH%7K6A;BdXChKhZG%gp(}xwv67ss7c)Zx>jy2HyGiIk&nnb@@gqmjw<~^s(2Ks&&9D7M6ufTl};Rp4^|n%QS@3nTx8e zSpubDdQuv+HN9Gy?GZVEv; - JobRunningTimeoutUSec: number; - JobTimeoutAction: string; - JobTimeoutRebootArgument: string; - JobTimeoutUSec: number; - JoinsNamespaceOf: any[]; - LoadError: string[]; - LoadState: string; - MainPID: number; - Markers: any[]; - MemoryCurrent: number; - MemoryLimit: number; - MemoryPeak: number; - NRestarts: number; - Names: string[]; - NeedDaemonReload: boolean; - OnFailure: any[]; - OnFailureJobMode: string; - OnFailureOf: any[]; - OnSuccess: any[]; - OnSuccessJobMode: string; - OnSuccessOf: any[]; - PartOf: any[]; - Perpetual: boolean; - PropagatesReloadTo: any[]; - PropagatesStopTo: any[]; - RebootArgument: string; - Refs: any[]; - RefuseManualStart: boolean; - RefuseManualStop: boolean; - ReloadPropagatedFrom: any[]; - RequiredBy: any[]; - Requires: string[]; - RequiresMountsFor: any[]; - Requisite: any[]; - RequisiteOf: any[]; - Result: string; - SliceOf: any[]; - SourcePath: string; - StartLimitAction: string; - StartLimitBurst: number; - StartLimitIntervalUSec: number; - StateChangeTimestamp: number; - StateChangeTimestampMonotonic: number; - StopPropagatedFrom: any[]; - StopWhenUnneeded: boolean; - SubState: string; - SuccessAction: string; - SuccessActionExitStatus: number; - SurviveFinalKillSignal: boolean; - TasksCurrent: number; - TasksMax: number; - Transient: boolean; - TriggeredBy: string[]; - Triggers: any[]; - UnitFilePreset: string; - UnitFileState: string; - UpheldBy: any[]; - Upholds: any[]; - WantedBy: any[]; - Wants: string[]; - WantsMountsFor: any[]; -} \ No newline at end of file + AccessSELinuxContext: string + ActivationDetails: any[] + ActiveEnterTimestamp: number + ActiveEnterTimestampMonotonic: number + ActiveExitTimestamp: number + ActiveExitTimestampMonotonic: number + ActiveState: string + After: string[] + AllowIsolate: boolean + AssertResult: boolean + AssertTimestamp: number + AssertTimestampMonotonic: number + Asserts: any[] + Before: string[] + BindsTo: any[] + BoundBy: any[] + CPUUsageNSec: number + CanClean: any[] + CanFreeze: boolean + CanIsolate: boolean + CanLiveMount: boolean + CanReload: boolean + CanStart: boolean + CanStop: boolean + CollectMode: string + ConditionResult: boolean + ConditionTimestamp: number + ConditionTimestampMonotonic: number + Conditions: any[] + ConflictedBy: any[] + Conflicts: string[] + ConsistsOf: any[] + DebugInvocation: boolean + DefaultDependencies: boolean + Description: string + Documentation: string[] + DropInPaths: any[] + ExecMainPID: number + FailureAction: string + FailureActionExitStatus: number + Following: string + FragmentPath: string + FreezerState: string + Id: string + IgnoreOnIsolate: boolean + InactiveEnterTimestamp: number + InactiveEnterTimestampMonotonic: number + InactiveExitTimestamp: number + InactiveExitTimestampMonotonic: number + InvocationID: string + Job: Array + JobRunningTimeoutUSec: number + JobTimeoutAction: string + JobTimeoutRebootArgument: string + JobTimeoutUSec: number + JoinsNamespaceOf: any[] + LoadError: string[] + LoadState: string + MainPID: number + Markers: any[] + MemoryCurrent: number + MemoryLimit: number + MemoryPeak: number + NRestarts: number + Names: string[] + NeedDaemonReload: boolean + OnFailure: any[] + OnFailureJobMode: string + OnFailureOf: any[] + OnSuccess: any[] + OnSuccessJobMode: string + OnSuccessOf: any[] + PartOf: any[] + Perpetual: boolean + PropagatesReloadTo: any[] + PropagatesStopTo: any[] + RebootArgument: string + Refs: any[] + RefuseManualStart: boolean + RefuseManualStop: boolean + ReloadPropagatedFrom: any[] + RequiredBy: any[] + Requires: string[] + RequiresMountsFor: any[] + Requisite: any[] + RequisiteOf: any[] + Result: string + SliceOf: any[] + SourcePath: string + StartLimitAction: string + StartLimitBurst: number + StartLimitIntervalUSec: number + StateChangeTimestamp: number + StateChangeTimestampMonotonic: number + StopPropagatedFrom: any[] + StopWhenUnneeded: boolean + SubState: string + SuccessAction: string + SuccessActionExitStatus: number + SurviveFinalKillSignal: boolean + TasksCurrent: number + TasksMax: number + Transient: boolean + TriggeredBy: string[] + Triggers: any[] + UnitFilePreset: string + UnitFileState: string + UpheldBy: any[] + Upholds: any[] + WantedBy: any[] + Wants: string[] + WantsMountsFor: any[] +} From 4519424f8088b3405dbcb8d851fb64e5e2ce6a98 Mon Sep 17 00:00:00 2001 From: ErnestoMuniz Date: Thu, 26 Feb 2026 12:42:56 -0300 Subject: [PATCH 2/4] feat: auto container aliasing --- agent/docker.go | 104 +++++++++++++++--- internal/entities/container/container.go | 11 +- internal/hub/systems/system.go | 37 ++++++- internal/hub/systems/system_alias_test.go | 38 +++++++ ...000_add_auto_container_alias_to_systems.go | 43 ++++++++ internal/site/src/components/add-system.tsx | 14 +++ .../src/components/charts/container-chart.tsx | 18 ++- internal/site/src/components/charts/hooks.ts | 12 +- .../site/src/components/routes/system.tsx | 42 ++++++- internal/site/src/lib/systemsManager.ts | 2 +- internal/site/src/locales/ar/ar.po | 8 ++ internal/site/src/locales/bg/bg.po | 8 ++ internal/site/src/locales/cs/cs.po | 8 ++ internal/site/src/locales/da/da.po | 8 ++ internal/site/src/locales/de/de.po | 8 ++ internal/site/src/locales/en/en.po | 8 ++ internal/site/src/locales/es/es.po | 8 ++ internal/site/src/locales/fa/fa.po | 8 ++ internal/site/src/locales/fr/fr.po | 8 ++ internal/site/src/locales/he/he.po | 8 ++ internal/site/src/locales/hr/hr.po | 8 ++ internal/site/src/locales/hu/hu.po | 8 ++ internal/site/src/locales/id/id.po | 8 ++ internal/site/src/locales/it/it.po | 8 ++ internal/site/src/locales/ja/ja.po | 8 ++ internal/site/src/locales/ko/ko.po | 8 ++ internal/site/src/locales/nl/nl.po | 8 ++ internal/site/src/locales/no/no.po | 8 ++ internal/site/src/locales/pl/pl.po | 8 ++ internal/site/src/locales/pt/pt.mo | Bin 29992 -> 30264 bytes internal/site/src/locales/pt/pt.po | 10 +- internal/site/src/locales/ru/ru.po | 8 ++ internal/site/src/locales/sl/sl.po | 8 ++ internal/site/src/locales/sr/sr.po | 8 ++ internal/site/src/locales/sv/sv.po | 8 ++ internal/site/src/locales/tr/tr.po | 8 ++ internal/site/src/locales/uk/uk.po | 8 ++ internal/site/src/locales/vi/vi.po | 8 ++ internal/site/src/locales/zh-CN/zh-CN.po | 8 ++ internal/site/src/locales/zh-HK/zh-HK.po | 8 ++ internal/site/src/locales/zh/zh.po | 8 ++ internal/site/src/types.d.ts | 1 + 42 files changed, 529 insertions(+), 35 deletions(-) create mode 100644 internal/hub/systems/system_alias_test.go create mode 100644 internal/migrations/1771869000_add_auto_container_alias_to_systems.go diff --git a/agent/docker.go b/agent/docker.go index a5880f928..eaae263b2 100644 --- a/agent/docker.go +++ b/agent/docker.go @@ -55,14 +55,15 @@ type dockerManager struct { containerStatsMutex sync.RWMutex // Mutex to prevent concurrent access to containerStatsMap apiContainerList []*container.ApiInfo // List of containers from Docker API containerStatsMap map[string]*container.Stats // Keeps track of container stats - validIds map[string]struct{} // Map of valid container ids, used to prune invalid containers from containerStatsMap - goodDockerVersion bool // Whether docker version is at least 25.0.0 (one-shot works correctly) - isWindows bool // Whether the Docker Engine API is running on Windows - buf *bytes.Buffer // Buffer to store and read response bodies - decoder *json.Decoder // Reusable JSON decoder that reads from buf - apiStats *container.ApiStats // Reusable API stats object - excludeContainers []string // Patterns to exclude containers by name - usingPodman bool // Whether the Docker Engine API is running on Podman + containerLabelsMap map[string]map[string]string + validIds map[string]struct{} // Map of valid container ids, used to prune invalid containers from containerStatsMap + goodDockerVersion bool // Whether docker version is at least 25.0.0 (one-shot works correctly) + isWindows bool // Whether the Docker Engine API is running on Windows + buf *bytes.Buffer // Buffer to store and read response bodies + decoder *json.Decoder // Reusable JSON decoder that reads from buf + apiStats *container.ApiStats // Reusable API stats object + excludeContainers []string // Patterns to exclude containers by name + usingPodman bool // Whether the Docker Engine API is running on Podman // Cache-time-aware tracking for CPU stats (similar to cpu.go) // Maps cache time intervals to container-specific CPU usage tracking @@ -196,6 +197,7 @@ func (dm *dockerManager) getDockerStats(cacheTimeMs uint16) ([]*container.Stats, for id, v := range dm.containerStatsMap { if _, exists := dm.validIds[id]; !exists { delete(dm.containerStatsMap, id) + delete(dm.containerLabelsMap, id) } else { stats = append(stats, v) } @@ -383,6 +385,7 @@ func parseDockerStatus(status string) (string, container.DockerHealth) { // Updates stats for individual container with cache-time-aware delta tracking func (dm *dockerManager) updateContainerStats(ctr *container.ApiInfo, cacheTimeMs uint16) error { name := ctr.Names[0][1:] + labels := dm.getContainerLabels(ctr) resp, err := dm.client.Get(fmt.Sprintf("http://localhost/containers/%s/stats?stream=0&one-shot=1", ctr.IdShort)) if err != nil { @@ -399,7 +402,12 @@ func (dm *dockerManager) updateContainerStats(ctr *container.ApiInfo, cacheTimeM dm.containerStatsMap[ctr.IdShort] = stats } + fmt.Printf("opa - %+v\n", ctr) + stats.Id = ctr.IdShort + stats.Name = name + stats.Image = ctr.Image + stats.Labels = labels statusText, health := parseDockerStatus(ctr.Status) stats.Status = statusText @@ -474,6 +482,7 @@ func (dm *dockerManager) deleteContainerStatsSync(id string) { dm.containerStatsMutex.Lock() defer dm.containerStatsMutex.Unlock() delete(dm.containerStatsMap, id) + delete(dm.containerLabelsMap, id) for ct := range dm.lastCpuContainer { delete(dm.lastCpuContainer[ct], id) } @@ -556,11 +565,12 @@ func newDockerManager() *dockerManager { Timeout: timeout, Transport: userAgentTransport, }, - containerStatsMap: make(map[string]*container.Stats), - sem: make(chan struct{}, 5), - apiContainerList: []*container.ApiInfo{}, - apiStats: &container.ApiStats{}, - excludeContainers: excludeContainers, + containerStatsMap: make(map[string]*container.Stats), + containerLabelsMap: make(map[string]map[string]string), + sem: make(chan struct{}, 5), + apiContainerList: []*container.ApiInfo{}, + apiStats: &container.ApiStats{}, + excludeContainers: excludeContainers, // Initialize cache-time-aware tracking structures lastCpuContainer: make(map[uint16]map[string]uint64), @@ -587,6 +597,74 @@ func newDockerManager() *dockerManager { return manager } +func copyLabels(src map[string]string) map[string]string { + if len(src) == 0 { + return map[string]string{} + } + out := make(map[string]string, len(src)) + for k, v := range src { + out[k] = v + } + return out +} + +func mergeLabels(base, extra map[string]string) map[string]string { + if len(extra) == 0 { + return base + } + merged := copyLabels(base) + for k, v := range extra { + merged[k] = v + } + return merged +} + +func (dm *dockerManager) getContainerLabels(ctr *container.ApiInfo) map[string]string { + base := copyLabels(ctr.Labels) + + dm.containerStatsMutex.RLock() + cached, ok := dm.containerLabelsMap[ctr.IdShort] + dm.containerStatsMutex.RUnlock() + if ok { + return cached + } + + inspectLabels, err := dm.fetchInspectLabels(ctr.IdShort) + if err != nil { + dm.containerStatsMutex.Lock() + dm.containerLabelsMap[ctr.IdShort] = base + dm.containerStatsMutex.Unlock() + return base + } + + labels := mergeLabels(base, inspectLabels) + dm.containerStatsMutex.Lock() + dm.containerLabelsMap[ctr.IdShort] = labels + dm.containerStatsMutex.Unlock() + return labels +} + +func (dm *dockerManager) fetchInspectLabels(containerID string) (map[string]string, error) { + type inspectResponse struct { + Config struct { + Labels map[string]string `json:"Labels"` + } `json:"Config"` + } + + resp, err := dm.client.Get(fmt.Sprintf("http://localhost/containers/%s/json", containerID)) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + var info inspectResponse + if err := json.NewDecoder(resp.Body).Decode(&info); err != nil { + return nil, err + } + + return info.Config.Labels, nil +} + // checkDockerVersion checks Docker version and sets goodDockerVersion if at least 25.0.0. // Versions before 25.0.0 have a bug with one-shot which requires all requests to be made in one batch. func (dm *dockerManager) checkDockerVersion() { diff --git a/internal/entities/container/container.go b/internal/entities/container/container.go index a0d96c712..e3d96f1a7 100644 --- a/internal/entities/container/container.go +++ b/internal/entities/container/container.go @@ -10,13 +10,13 @@ type ApiInfo struct { Status string State string Image string + Labels map[string]string // ImageID string // Command string // Created int64 // Ports []Port // SizeRw int64 `json:",omitempty"` // SizeRootFs int64 `json:",omitempty"` - // Labels map[string]string // HostConfig struct { // NetworkMode string `json:",omitempty"` // Annotations map[string]string `json:",omitempty"` @@ -136,10 +136,11 @@ type Stats struct { NetworkRecv float64 `json:"nr,omitzero" cbor:"4,keyasint,omitzero"` // deprecated 0.18.3 (MB) - keep field for old agents/records Bandwidth [2]uint64 `json:"b,omitzero" cbor:"9,keyasint,omitzero"` // [sent bytes, recv bytes] - Health DockerHealth `json:"-" cbor:"5,keyasint"` - Status string `json:"-" cbor:"6,keyasint"` - Id string `json:"-" cbor:"7,keyasint"` - Image string `json:"-" cbor:"8,keyasint"` + Health DockerHealth `json:"-" cbor:"5,keyasint"` + Status string `json:"-" cbor:"6,keyasint"` + Id string `json:"-" cbor:"7,keyasint"` + Image string `json:"-" cbor:"8,keyasint"` + Labels map[string]string `json:"-" cbor:"10,keyasint,omitempty"` // PrevCpu [2]uint64 `json:"-"` CpuSystem uint64 `json:"-"` CpuContainer uint64 `json:"-"` diff --git a/internal/hub/systems/system.go b/internal/hub/systems/system.go index 109db35ac..827b23628 100644 --- a/internal/hub/systems/system.go +++ b/internal/hub/systems/system.go @@ -8,6 +8,7 @@ import ( "hash/fnv" "math/rand" "net" + "regexp" "strings" "sync/atomic" "time" @@ -31,6 +32,8 @@ import ( "golang.org/x/crypto/ssh" ) +var autoContainerAliasVarPattern = regexp.MustCompile(`\$([A-Za-z0-9_.]+)`) + type System struct { Id string `db:"id"` Host string `db:"host"` @@ -192,7 +195,8 @@ func (sys *System) createRecords(data *system.CombinedData) (*core.Record, error // add containers and container_stats records if len(data.Containers) > 0 { if data.Containers[0].Id != "" { - if err := createContainerRecords(txApp, data.Containers, sys.Id); err != nil { + fmt.Printf("RECORDS - %+v", systemRecord.Collection()) + if err := createContainerRecords(txApp, data.Containers, sys.Id, systemRecord.GetString("auto_container_alias")); err != nil { return err } } @@ -297,7 +301,7 @@ func createSystemdStatsRecords(app core.App, data []*systemd.Service, systemId s } // createContainerRecords creates container records -func createContainerRecords(app core.App, data []*container.Stats, systemId string) error { +func createContainerRecords(app core.App, data []*container.Stats, systemId string, autoContainerAliasTemplate string) error { if len(data) == 0 { return nil } @@ -309,7 +313,7 @@ func createContainerRecords(app core.App, data []*container.Stats, systemId stri valueStrings := make([]string, 0, len(data)) for i, container := range data { suffix := fmt.Sprintf("%d", i) - valueStrings = append(valueStrings, fmt.Sprintf("({:id%[1]s}, {:system}, {:name%[1]s}, {:image%[1]s}, {:status%[1]s}, {:health%[1]s}, {:cpu%[1]s}, {:memory%[1]s}, {:net%[1]s}, {:updated})", suffix)) + valueStrings = append(valueStrings, fmt.Sprintf("({:id%[1]s}, {:system}, {:name%[1]s}, {:image%[1]s}, {:status%[1]s}, {:health%[1]s}, {:cpu%[1]s}, {:memory%[1]s}, {:net%[1]s}, {:alias%[1]s}, {:updated})", suffix)) params["id"+suffix] = container.Id params["name"+suffix] = container.Name params["image"+suffix] = container.Image @@ -322,15 +326,40 @@ func createContainerRecords(app core.App, data []*container.Stats, systemId stri netBytes = uint64((container.NetworkSent + container.NetworkRecv) * 1024 * 1024) } params["net"+suffix] = netBytes + params["alias"+suffix] = resolveAutoContainerAlias(autoContainerAliasTemplate, container.Labels) } queryString := fmt.Sprintf( - "INSERT INTO containers (id, system, name, image, status, health, cpu, memory, net, updated) VALUES %s ON CONFLICT(id) DO UPDATE SET system = excluded.system, name = excluded.name, image = excluded.image, status = excluded.status, health = excluded.health, cpu = excluded.cpu, memory = excluded.memory, net = excluded.net, updated = excluded.updated", + "INSERT INTO containers (id, system, name, image, status, health, cpu, memory, net, alias, updated) VALUES %s ON CONFLICT(id) DO UPDATE SET system = excluded.system, name = excluded.name, image = excluded.image, status = excluded.status, health = excluded.health, cpu = excluded.cpu, memory = excluded.memory, net = excluded.net, alias = CASE WHEN (containers.alias IS NULL OR containers.alias = '') AND (excluded.alias IS NOT NULL AND excluded.alias != '') THEN excluded.alias ELSE containers.alias END, updated = excluded.updated", strings.Join(valueStrings, ","), ) _, err := app.DB().NewQuery(queryString).Bind(params).Execute() return err } +func resolveAutoContainerAlias(template string, labels map[string]string) string { + template = strings.TrimSpace(template) + if template == "" || len(labels) == 0 { + return "" + } + + matches := autoContainerAliasVarPattern.FindAllStringSubmatch(template, -1) + if len(matches) == 0 { + return "" + } + + alias := template + for _, match := range matches { + labelKey := match[1] + labelValue, ok := labels[labelKey] + if !ok || strings.TrimSpace(labelValue) == "" { + return "" + } + alias = strings.ReplaceAll(alias, match[0], strings.TrimSpace(labelValue)) + } + + return strings.TrimSpace(alias) +} + // getRecord retrieves the system record from the database. // If the record is not found, it removes the system from the manager. func (sys *System) getRecord() (*core.Record, error) { diff --git a/internal/hub/systems/system_alias_test.go b/internal/hub/systems/system_alias_test.go new file mode 100644 index 000000000..e5df031ab --- /dev/null +++ b/internal/hub/systems/system_alias_test.go @@ -0,0 +1,38 @@ +//go:build testing + +package systems + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestResolveAutoContainerAlias(t *testing.T) { + t.Run("replaces variables from labels", func(t *testing.T) { + alias := resolveAutoContainerAlias("$SERVICE-$ENV", map[string]string{ + "SERVICE": "api", + "ENV": "prod", + }) + assert.Equal(t, "api-prod", alias) + }) + + t.Run("returns empty when a label is missing", func(t *testing.T) { + alias := resolveAutoContainerAlias("$SERVICE-$ENV", map[string]string{ + "SERVICE": "api", + }) + assert.Equal(t, "", alias) + }) + + t.Run("returns empty when template has no variables", func(t *testing.T) { + alias := resolveAutoContainerAlias("plain-text", map[string]string{ + "SERVICE": "api", + }) + assert.Equal(t, "", alias) + }) + + t.Run("returns empty when labels are missing", func(t *testing.T) { + alias := resolveAutoContainerAlias("$SERVICE", nil) + assert.Equal(t, "", alias) + }) +} diff --git a/internal/migrations/1771869000_add_auto_container_alias_to_systems.go b/internal/migrations/1771869000_add_auto_container_alias_to_systems.go new file mode 100644 index 000000000..66282a853 --- /dev/null +++ b/internal/migrations/1771869000_add_auto_container_alias_to_systems.go @@ -0,0 +1,43 @@ +package migrations + +import ( + "github.com/pocketbase/pocketbase/core" + m "github.com/pocketbase/pocketbase/migrations" +) + +func init() { + m.Register(func(app core.App) error { + collection, err := app.FindCollectionByNameOrId("systems") + if err != nil { + return err + } + + if err := collection.Fields.AddMarshaledJSONAt(7, []byte(`{ + "autogeneratePattern": "", + "hidden": false, + "id": "text1585300463", + "max": 0, + "min": 0, + "name": "auto_container_alias", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }`)); err != nil { + return err + } + + return app.Save(collection) + }, func(app core.App) error { + collection, err := app.FindCollectionByNameOrId("systems") + if err != nil { + return err + } + + collection.Fields.RemoveById("text1585300463") + + return app.Save(collection) + }) +} diff --git a/internal/site/src/components/add-system.tsx b/internal/site/src/components/add-system.tsx index 1ee852f58..b736d59f8 100644 --- a/internal/site/src/components/add-system.tsx +++ b/internal/site/src/components/add-system.tsx @@ -191,6 +191,20 @@ export const SystemDialog = ({ setOpen, system }: { setOpen: (open: boolean) => Name + +
+ +

+ Use variables like $LABEL_KEY to build aliases from container labels. +

+
diff --git a/internal/site/src/components/charts/container-chart.tsx b/internal/site/src/components/charts/container-chart.tsx index f9274e1fc..27bbc9d74 100644 --- a/internal/site/src/components/charts/container-chart.tsx +++ b/internal/site/src/components/charts/container-chart.tsx @@ -50,13 +50,23 @@ export default memo(function ContainerChart({ return new Set( Object.keys(chartConfig).filter((key) => { const keyLower = key.toLowerCase() - return !filterTerms.some((term) => keyLower.includes(term)) + const label = chartConfig[key]?.label + const labelLower = typeof label === "string" ? label.toLowerCase() : "" + return !filterTerms.some((term) => keyLower.includes(term) || labelLower.includes(term)) }) ) }, [chartConfig, filter]) // biome-ignore lint/correctness/useExhaustiveDependencies: not necessary const { toolTipFormatter, dataFunction, tickFormatter } = useMemo(() => { + const labelToKey = new Map() + for (const [containerKey, config] of Object.entries(chartConfig)) { + const label = config?.label + if (typeof label === "string" && label.length > 0) { + labelToKey.set(label, containerKey) + } + } + const resolveContainerKey = (key: string) => labelToKey.get(key) || key const obj = {} as { toolTipFormatter: (item: any, key: string) => React.ReactNode | string dataFunction: (key: string, data: any) => number | null @@ -116,7 +126,8 @@ export default memo(function ContainerChart({ } return formatRxTx(totalRecv, totalSent) } - const [sent, recv] = getRxTxBytes(item?.payload?.[key]) + const containerKey = resolveContainerKey(key) + const [sent, recv] = getRxTxBytes(item?.payload?.[containerKey]) return formatRxTx(recv, sent) } catch (e) { return null @@ -192,12 +203,13 @@ export default memo(function ContainerChart({ const filtered = filteredKeys.has(key) const fillOpacity = filtered ? 0.05 : 0.4 const strokeOpacity = filtered ? 0.1 : 1 + const label = chartConfig[key]?.label return ( 0 ? label : key} type="monotoneX" fill={chartConfig[key].color} fillOpacity={fillOpacity} diff --git a/internal/site/src/components/charts/hooks.ts b/internal/site/src/components/charts/hooks.ts index 33c41d5b0..ae9910ad0 100644 --- a/internal/site/src/components/charts/hooks.ts +++ b/internal/site/src/components/charts/hooks.ts @@ -14,7 +14,10 @@ export interface ContainerChartConfigs { * @param containerData - Array of container statistics data points * @returns Chart configurations for CPU, memory, and network metrics */ -export function useContainerChartConfigs(containerData: ChartData["containerData"]): ContainerChartConfigs { +export function useContainerChartConfigs( + containerData: ChartData["containerData"], + containerAliases: Record = {} +): ContainerChartConfigs { return useMemo(() => { const configs = { cpu: {} as ChartConfig, @@ -68,9 +71,10 @@ export function useContainerChartConfigs(containerData: ChartData["containerData // Generate colors for each container for (let i = 0; i < count; i++) { const [containerName] = sortedContainers[i] + const alias = containerAliases[containerName]?.trim() const hue = ((i * 360) / count) % 360 chartConfig[containerName] = { - label: containerName, + label: alias || containerName, color: `hsl(${hue}, var(--chart-saturation), var(--chart-lightness))`, } } @@ -79,7 +83,7 @@ export function useContainerChartConfigs(containerData: ChartData["containerData }) return configs - }, [containerData]) + }, [containerAliases, containerData]) } /** Sets the correct width of the y axis in recharts based on the longest label */ @@ -124,4 +128,4 @@ export function useNetworkInterfaces(interfaces: SystemStats["ni"]) { })) }, } -} \ No newline at end of file +} diff --git a/internal/site/src/components/routes/system.tsx b/internal/site/src/components/routes/system.tsx index 7d2bab7b5..85aff3209 100644 --- a/internal/site/src/components/routes/system.tsx +++ b/internal/site/src/components/routes/system.tsx @@ -44,6 +44,7 @@ import { import type { ChartData, ChartTimes, + ContainerRecord, ContainerStatsRecord, GPUData, SystemDetailsRecord, @@ -52,18 +53,18 @@ import type { SystemStats, SystemStatsRecord, } from "@/types" +import LineChartDefault from "../charts/line-chart" import { $router, navigate } from "../router" import Spinner from "../spinner" import { Button } from "../ui/button" import { Card, CardDescription, CardHeader, CardTitle } from "../ui/card" +import { pinnedAxisDomain } from "../ui/chart" import { ChartAverage, ChartMax } from "../ui/icons" import { Input } from "../ui/input" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../ui/select" -import NetworkSheet from "./system/network-sheet" import CpuCoresSheet from "./system/cpu-sheet" -import LineChartDefault from "../charts/line-chart" -import { pinnedAxisDomain } from "../ui/chart" import InfoBar from "./system/info-bar" +import NetworkSheet from "./system/network-sheet" type ChartTimeData = { time: number @@ -160,6 +161,7 @@ export default memo(function SystemDetail({ id }: { id: string }) { const [system, setSystem] = useState({} as SystemRecord) const [systemStats, setSystemStats] = useState([] as SystemStatsRecord[]) const [containerData, setContainerData] = useState([] as ChartData["containerData"]) + const [containerAliases, setContainerAliases] = useState>({}) const temperatureChartRef = useRef(null) const persistChartTime = useRef(false) const [bottomSpacing, setBottomSpacing] = useState(0) @@ -177,6 +179,7 @@ export default memo(function SystemDetail({ id }: { id: string }) { persistChartTime.current = false setSystemStats([]) setContainerData([]) + setContainerAliases({}) setDetails({} as SystemDetailsRecord) $containerFilter.set("") } @@ -221,6 +224,37 @@ export default memo(function SystemDetail({ id }: { id: string }) { .then(setDetails) }, [system.id]) + useEffect(() => { + if (!system.id) { + setContainerAliases({}) + return + } + let ignore = false + pb.collection>("containers") + .getFullList({ + fields: "name,alias", + filter: pb.filter("system={:system}", { system: system.id }), + }) + .then((containers) => { + if (ignore) { + return + } + const aliases = {} as Record + for (const container of containers) { + aliases[container.name] = container.alias?.trim() || container.name + } + setContainerAliases(aliases) + }) + .catch(() => { + if (!ignore) { + setContainerAliases({}) + } + }) + return () => { + ignore = true + } + }, [system.id]) + // subscribe to realtime metrics if chart time is 1m useEffect(() => { let unsub = () => {} @@ -275,7 +309,7 @@ export default memo(function SystemDetail({ id }: { id: string }) { }, [systemStats, containerData, direction]) // Share chart config computation for all container charts - const containerChartConfigs = useContainerChartConfigs(containerData) + const containerChartConfigs = useContainerChartConfigs(containerData, containerAliases) // make container stats for charts const makeContainerData = useCallback((containers: ContainerStatsRecord[]) => { diff --git a/internal/site/src/lib/systemsManager.ts b/internal/site/src/lib/systemsManager.ts index 2ee586028..1f90f3a45 100644 --- a/internal/site/src/lib/systemsManager.ts +++ b/internal/site/src/lib/systemsManager.ts @@ -14,7 +14,7 @@ import type { SystemRecord } from "@/types" import { SystemStatus } from "./enums" const COLLECTION = pb.collection("systems") -const FIELDS_DEFAULT = "id,name,host,port,info,status" +const FIELDS_DEFAULT = "id,name,host,port,info,status,auto_container_alias" /** Maximum system name length for display purposes */ const MAX_SYSTEM_NAME_LENGTH = 22 diff --git a/internal/site/src/locales/ar/ar.po b/internal/site/src/locales/ar/ar.po index 10daa7161..34927abea 100644 --- a/internal/site/src/locales/ar/ar.po +++ b/internal/site/src/locales/ar/ar.po @@ -189,6 +189,10 @@ msgstr "هل أنت متأكد أنك تريد حذف {name}؟" msgid "Are you sure?" msgstr "هل أنت متأكد؟" +#: src/components/add-system.tsx +msgid "Auto Container Alias" +msgstr "" + #: src/components/copy-to-clipboard.tsx msgid "Automatic copy requires a secure context." msgstr "النسخ التلقائي يتطلب سياقًا آمنًا." @@ -1770,6 +1774,10 @@ msgstr "الاستخدام" msgid "Usage of root partition" msgstr "استخدام القسم الجذر" +#: src/components/add-system.tsx +msgid "Use variables like $LABEL_KEY to build aliases from container labels." +msgstr "" + #: src/components/charts/mem-chart.tsx #: src/components/charts/swap-chart.tsx msgid "Used" diff --git a/internal/site/src/locales/bg/bg.po b/internal/site/src/locales/bg/bg.po index 6acd47c11..0a581747b 100644 --- a/internal/site/src/locales/bg/bg.po +++ b/internal/site/src/locales/bg/bg.po @@ -189,6 +189,10 @@ msgstr "Сигурен ли си, че искаш да изтриеш {name}?" msgid "Are you sure?" msgstr "Сигурни ли сте?" +#: src/components/add-system.tsx +msgid "Auto Container Alias" +msgstr "" + #: src/components/copy-to-clipboard.tsx msgid "Automatic copy requires a secure context." msgstr "Автоматичното копиране изисква защитен контескт." @@ -1770,6 +1774,10 @@ msgstr "Употреба" msgid "Usage of root partition" msgstr "Употреба на root partition-а" +#: src/components/add-system.tsx +msgid "Use variables like $LABEL_KEY to build aliases from container labels." +msgstr "" + #: src/components/charts/mem-chart.tsx #: src/components/charts/swap-chart.tsx msgid "Used" diff --git a/internal/site/src/locales/cs/cs.po b/internal/site/src/locales/cs/cs.po index e6c072bb3..2a1dcea45 100644 --- a/internal/site/src/locales/cs/cs.po +++ b/internal/site/src/locales/cs/cs.po @@ -189,6 +189,10 @@ msgstr "Opravdu chcete odstranit {name}?" msgid "Are you sure?" msgstr "Jste si jistý?" +#: src/components/add-system.tsx +msgid "Auto Container Alias" +msgstr "" + #: src/components/copy-to-clipboard.tsx msgid "Automatic copy requires a secure context." msgstr "Automatická kopie vyžaduje zabezpečený kontext." @@ -1770,6 +1774,10 @@ msgstr "Využití" msgid "Usage of root partition" msgstr "Využití kořenového oddílu" +#: src/components/add-system.tsx +msgid "Use variables like $LABEL_KEY to build aliases from container labels." +msgstr "" + #: src/components/charts/mem-chart.tsx #: src/components/charts/swap-chart.tsx msgid "Used" diff --git a/internal/site/src/locales/da/da.po b/internal/site/src/locales/da/da.po index b6d73575c..7527cc34c 100644 --- a/internal/site/src/locales/da/da.po +++ b/internal/site/src/locales/da/da.po @@ -189,6 +189,10 @@ msgstr "Er du sikker på, at du vil slette {name}?" msgid "Are you sure?" msgstr "Er du sikker?" +#: src/components/add-system.tsx +msgid "Auto Container Alias" +msgstr "" + #: src/components/copy-to-clipboard.tsx msgid "Automatic copy requires a secure context." msgstr "Automatisk kopiering kræver en sikker kontekst." @@ -1770,6 +1774,10 @@ msgstr "Forbrug" msgid "Usage of root partition" msgstr "Brug af rodpartition" +#: src/components/add-system.tsx +msgid "Use variables like $LABEL_KEY to build aliases from container labels." +msgstr "" + #: src/components/charts/mem-chart.tsx #: src/components/charts/swap-chart.tsx msgid "Used" diff --git a/internal/site/src/locales/de/de.po b/internal/site/src/locales/de/de.po index c3b589085..51fa84d86 100644 --- a/internal/site/src/locales/de/de.po +++ b/internal/site/src/locales/de/de.po @@ -189,6 +189,10 @@ msgstr "Möchtest du {name} wirklich löschen?" msgid "Are you sure?" msgstr "Bist du sicher?" +#: src/components/add-system.tsx +msgid "Auto Container Alias" +msgstr "" + #: src/components/copy-to-clipboard.tsx msgid "Automatic copy requires a secure context." msgstr "Automatisches Kopieren erfordert einen sicheren Kontext." @@ -1770,6 +1774,10 @@ msgstr "Nutzung" msgid "Usage of root partition" msgstr "Nutzung der Root-Partition" +#: src/components/add-system.tsx +msgid "Use variables like $LABEL_KEY to build aliases from container labels." +msgstr "" + #: src/components/charts/mem-chart.tsx #: src/components/charts/swap-chart.tsx msgid "Used" diff --git a/internal/site/src/locales/en/en.po b/internal/site/src/locales/en/en.po index 5d5dbd9e1..ef6a8f4cb 100644 --- a/internal/site/src/locales/en/en.po +++ b/internal/site/src/locales/en/en.po @@ -184,6 +184,10 @@ msgstr "Are you sure you want to delete {name}?" msgid "Are you sure?" msgstr "Are you sure?" +#: src/components/add-system.tsx +msgid "Auto Container Alias" +msgstr "Auto Container Alias" + #: src/components/copy-to-clipboard.tsx msgid "Automatic copy requires a secure context." msgstr "Automatic copy requires a secure context." @@ -1765,6 +1769,10 @@ msgstr "Usage" msgid "Usage of root partition" msgstr "Usage of root partition" +#: src/components/add-system.tsx +msgid "Use variables like $LABEL_KEY to build aliases from container labels." +msgstr "Use variables like $LABEL_KEY to build aliases from container labels." + #: src/components/charts/mem-chart.tsx #: src/components/charts/swap-chart.tsx msgid "Used" diff --git a/internal/site/src/locales/es/es.po b/internal/site/src/locales/es/es.po index 2b769181d..f193c0353 100644 --- a/internal/site/src/locales/es/es.po +++ b/internal/site/src/locales/es/es.po @@ -189,6 +189,10 @@ msgstr "¿Estás seguro de que deseas eliminar {name}?" msgid "Are you sure?" msgstr "¿Estás seguro?" +#: src/components/add-system.tsx +msgid "Auto Container Alias" +msgstr "" + #: src/components/copy-to-clipboard.tsx msgid "Automatic copy requires a secure context." msgstr "La copia automática requiere un contexto seguro." @@ -1770,6 +1774,10 @@ msgstr "Uso" msgid "Usage of root partition" msgstr "Uso de la partición raíz" +#: src/components/add-system.tsx +msgid "Use variables like $LABEL_KEY to build aliases from container labels." +msgstr "" + #: src/components/charts/mem-chart.tsx #: src/components/charts/swap-chart.tsx msgid "Used" diff --git a/internal/site/src/locales/fa/fa.po b/internal/site/src/locales/fa/fa.po index ea157a71f..91173d0c9 100644 --- a/internal/site/src/locales/fa/fa.po +++ b/internal/site/src/locales/fa/fa.po @@ -189,6 +189,10 @@ msgstr "آیا مطمئن هستید که می‌خواهید {name} را حذف msgid "Are you sure?" msgstr "آیا مطمئن هستید؟" +#: src/components/add-system.tsx +msgid "Auto Container Alias" +msgstr "" + #: src/components/copy-to-clipboard.tsx msgid "Automatic copy requires a secure context." msgstr "کپی خودکار نیاز به یک زمینه امن دارد." @@ -1770,6 +1774,10 @@ msgstr "میزان استفاده" msgid "Usage of root partition" msgstr "میزان استفاده از پارتیشن ریشه" +#: src/components/add-system.tsx +msgid "Use variables like $LABEL_KEY to build aliases from container labels." +msgstr "" + #: src/components/charts/mem-chart.tsx #: src/components/charts/swap-chart.tsx msgid "Used" diff --git a/internal/site/src/locales/fr/fr.po b/internal/site/src/locales/fr/fr.po index d1c5f730a..bf68fb631 100644 --- a/internal/site/src/locales/fr/fr.po +++ b/internal/site/src/locales/fr/fr.po @@ -189,6 +189,10 @@ msgstr "Êtes-vous sûr de vouloir supprimer {name} ?" msgid "Are you sure?" msgstr "Êtes-vous sûr ?" +#: src/components/add-system.tsx +msgid "Auto Container Alias" +msgstr "" + #: src/components/copy-to-clipboard.tsx msgid "Automatic copy requires a secure context." msgstr "La copie automatique nécessite un contexte sécurisé." @@ -1770,6 +1774,10 @@ msgstr "Utilisation" msgid "Usage of root partition" msgstr "Utilisation de la partition racine" +#: src/components/add-system.tsx +msgid "Use variables like $LABEL_KEY to build aliases from container labels." +msgstr "" + #: src/components/charts/mem-chart.tsx #: src/components/charts/swap-chart.tsx msgid "Used" diff --git a/internal/site/src/locales/he/he.po b/internal/site/src/locales/he/he.po index 6e9e74ce6..b585c4f5f 100644 --- a/internal/site/src/locales/he/he.po +++ b/internal/site/src/locales/he/he.po @@ -189,6 +189,10 @@ msgstr "האם אתה בטוח שברצונך למחוק את {name}?" msgid "Are you sure?" msgstr "האם אתה בטוח?" +#: src/components/add-system.tsx +msgid "Auto Container Alias" +msgstr "" + #: src/components/copy-to-clipboard.tsx msgid "Automatic copy requires a secure context." msgstr "העתקה אוטומטית דורשת הקשר מאובטח." @@ -1770,6 +1774,10 @@ msgstr "שימוש" msgid "Usage of root partition" msgstr "שימוש במחיצה הראשית" +#: src/components/add-system.tsx +msgid "Use variables like $LABEL_KEY to build aliases from container labels." +msgstr "" + #: src/components/charts/mem-chart.tsx #: src/components/charts/swap-chart.tsx msgid "Used" diff --git a/internal/site/src/locales/hr/hr.po b/internal/site/src/locales/hr/hr.po index 7767ebbef..d803c1636 100644 --- a/internal/site/src/locales/hr/hr.po +++ b/internal/site/src/locales/hr/hr.po @@ -189,6 +189,10 @@ msgstr "Jeste li sigurni da želite izbrisati {name}?" msgid "Are you sure?" msgstr "Jeste li sigurni?" +#: src/components/add-system.tsx +msgid "Auto Container Alias" +msgstr "" + #: src/components/copy-to-clipboard.tsx msgid "Automatic copy requires a secure context." msgstr "Automatsko kopiranje zahtijeva siguran kontekst." @@ -1770,6 +1774,10 @@ msgstr "Iskorištenost" msgid "Usage of root partition" msgstr "Iskorištenost root datotečnog sustava" +#: src/components/add-system.tsx +msgid "Use variables like $LABEL_KEY to build aliases from container labels." +msgstr "" + #: src/components/charts/mem-chart.tsx #: src/components/charts/swap-chart.tsx msgid "Used" diff --git a/internal/site/src/locales/hu/hu.po b/internal/site/src/locales/hu/hu.po index 1c0e87901..511918a0b 100644 --- a/internal/site/src/locales/hu/hu.po +++ b/internal/site/src/locales/hu/hu.po @@ -189,6 +189,10 @@ msgstr "Biztosan törölni szeretnéd {name}-t?" msgid "Are you sure?" msgstr "Biztos vagy benne?" +#: src/components/add-system.tsx +msgid "Auto Container Alias" +msgstr "" + #: src/components/copy-to-clipboard.tsx msgid "Automatic copy requires a secure context." msgstr "Az automatikus másolás biztonságos környezetet igényel." @@ -1770,6 +1774,10 @@ msgstr "Használat" msgid "Usage of root partition" msgstr "Root partíció kihasználtsága" +#: src/components/add-system.tsx +msgid "Use variables like $LABEL_KEY to build aliases from container labels." +msgstr "" + #: src/components/charts/mem-chart.tsx #: src/components/charts/swap-chart.tsx msgid "Used" diff --git a/internal/site/src/locales/id/id.po b/internal/site/src/locales/id/id.po index 40f74e4f2..260e97ea7 100644 --- a/internal/site/src/locales/id/id.po +++ b/internal/site/src/locales/id/id.po @@ -189,6 +189,10 @@ msgstr "Apakah anda yakin ingin menghapus {name}?" msgid "Are you sure?" msgstr "Apakah anda yakin?" +#: src/components/add-system.tsx +msgid "Auto Container Alias" +msgstr "" + #: src/components/copy-to-clipboard.tsx msgid "Automatic copy requires a secure context." msgstr "Copy memerlukan https." @@ -1770,6 +1774,10 @@ msgstr "Penggunaan" msgid "Usage of root partition" msgstr "Penggunaan partisi root" +#: src/components/add-system.tsx +msgid "Use variables like $LABEL_KEY to build aliases from container labels." +msgstr "" + #: src/components/charts/mem-chart.tsx #: src/components/charts/swap-chart.tsx msgid "Used" diff --git a/internal/site/src/locales/it/it.po b/internal/site/src/locales/it/it.po index f9f29505d..356f50980 100644 --- a/internal/site/src/locales/it/it.po +++ b/internal/site/src/locales/it/it.po @@ -189,6 +189,10 @@ msgstr "Sei sicuro di voler eliminare {name}?" msgid "Are you sure?" msgstr "Sei sicuro?" +#: src/components/add-system.tsx +msgid "Auto Container Alias" +msgstr "" + #: src/components/copy-to-clipboard.tsx msgid "Automatic copy requires a secure context." msgstr "La copia automatica richiede un contesto sicuro." @@ -1770,6 +1774,10 @@ msgstr "Utilizzo" msgid "Usage of root partition" msgstr "Utilizzo della partizione root" +#: src/components/add-system.tsx +msgid "Use variables like $LABEL_KEY to build aliases from container labels." +msgstr "" + #: src/components/charts/mem-chart.tsx #: src/components/charts/swap-chart.tsx msgid "Used" diff --git a/internal/site/src/locales/ja/ja.po b/internal/site/src/locales/ja/ja.po index 3a0659a25..0cb22706a 100644 --- a/internal/site/src/locales/ja/ja.po +++ b/internal/site/src/locales/ja/ja.po @@ -189,6 +189,10 @@ msgstr "{name}を削除してもよろしいですか?" msgid "Are you sure?" msgstr "よろしいですか?" +#: src/components/add-system.tsx +msgid "Auto Container Alias" +msgstr "" + #: src/components/copy-to-clipboard.tsx msgid "Automatic copy requires a secure context." msgstr "自動コピーには安全なコンテキストが必要です。" @@ -1770,6 +1774,10 @@ msgstr "使用量" msgid "Usage of root partition" msgstr "ルートパーティションの使用量" +#: src/components/add-system.tsx +msgid "Use variables like $LABEL_KEY to build aliases from container labels." +msgstr "" + #: src/components/charts/mem-chart.tsx #: src/components/charts/swap-chart.tsx msgid "Used" diff --git a/internal/site/src/locales/ko/ko.po b/internal/site/src/locales/ko/ko.po index a01d9002f..56d9b4727 100644 --- a/internal/site/src/locales/ko/ko.po +++ b/internal/site/src/locales/ko/ko.po @@ -189,6 +189,10 @@ msgstr "{name}을(를) 삭제하시겠습니까?" msgid "Are you sure?" msgstr "확실합니까?" +#: src/components/add-system.tsx +msgid "Auto Container Alias" +msgstr "" + #: src/components/copy-to-clipboard.tsx msgid "Automatic copy requires a secure context." msgstr "자동 복사는 안전한 컨텍스트가 필요합니다." @@ -1770,6 +1774,10 @@ msgstr "사용량" msgid "Usage of root partition" msgstr "루트 파티션의 사용량" +#: src/components/add-system.tsx +msgid "Use variables like $LABEL_KEY to build aliases from container labels." +msgstr "" + #: src/components/charts/mem-chart.tsx #: src/components/charts/swap-chart.tsx msgid "Used" diff --git a/internal/site/src/locales/nl/nl.po b/internal/site/src/locales/nl/nl.po index cf3cc4085..62df30ab3 100644 --- a/internal/site/src/locales/nl/nl.po +++ b/internal/site/src/locales/nl/nl.po @@ -189,6 +189,10 @@ msgstr "Weet je zeker dat je {name} wilt verwijderen?" msgid "Are you sure?" msgstr "Weet je het zeker?" +#: src/components/add-system.tsx +msgid "Auto Container Alias" +msgstr "" + #: src/components/copy-to-clipboard.tsx msgid "Automatic copy requires a secure context." msgstr "Automatisch kopiëren vereist een veilige context." @@ -1770,6 +1774,10 @@ msgstr "Gebruik" msgid "Usage of root partition" msgstr "Gebruik van root-partitie" +#: src/components/add-system.tsx +msgid "Use variables like $LABEL_KEY to build aliases from container labels." +msgstr "" + #: src/components/charts/mem-chart.tsx #: src/components/charts/swap-chart.tsx msgid "Used" diff --git a/internal/site/src/locales/no/no.po b/internal/site/src/locales/no/no.po index 63b910b96..db60dcba8 100644 --- a/internal/site/src/locales/no/no.po +++ b/internal/site/src/locales/no/no.po @@ -189,6 +189,10 @@ msgstr "Er du sikker på at du vil slette {name}?" msgid "Are you sure?" msgstr "Er du sikker?" +#: src/components/add-system.tsx +msgid "Auto Container Alias" +msgstr "" + #: src/components/copy-to-clipboard.tsx msgid "Automatic copy requires a secure context." msgstr "Automatisk kopiering krever en sikker kontekst." @@ -1770,6 +1774,10 @@ msgstr "Forbruk" msgid "Usage of root partition" msgstr "Forbruk av rot-partisjon" +#: src/components/add-system.tsx +msgid "Use variables like $LABEL_KEY to build aliases from container labels." +msgstr "" + #: src/components/charts/mem-chart.tsx #: src/components/charts/swap-chart.tsx msgid "Used" diff --git a/internal/site/src/locales/pl/pl.po b/internal/site/src/locales/pl/pl.po index 4ea4038b0..b6dbe15a3 100644 --- a/internal/site/src/locales/pl/pl.po +++ b/internal/site/src/locales/pl/pl.po @@ -189,6 +189,10 @@ msgstr "Czy na pewno chcesz usunąć {name}?" msgid "Are you sure?" msgstr "Czy jesteś pewien?" +#: src/components/add-system.tsx +msgid "Auto Container Alias" +msgstr "" + #: src/components/copy-to-clipboard.tsx msgid "Automatic copy requires a secure context." msgstr "Automatyczne kopiowanie wymaga bezpiecznego kontekstu." @@ -1770,6 +1774,10 @@ msgstr "Wykorzystanie" msgid "Usage of root partition" msgstr "Użycie partycji głównej" +#: src/components/add-system.tsx +msgid "Use variables like $LABEL_KEY to build aliases from container labels." +msgstr "" + #: src/components/charts/mem-chart.tsx #: src/components/charts/swap-chart.tsx msgid "Used" diff --git a/internal/site/src/locales/pt/pt.mo b/internal/site/src/locales/pt/pt.mo index fc4f6efae317558e7db80d096e7c91887cf0f259..3d1febe77ad04ac00fe287b354de305ff9cff7de 100644 GIT binary patch delta 9042 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 Ax&QzG delta 8759 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 Date: Thu, 26 Feb 2026 14:52:24 -0300 Subject: [PATCH 3/4] fix: Fix migration files for aliasing --- internal/hub/systems/system_alias_test.go | 8 +- .../0_collections_snapshot_0_18_0_dev_2.go | 1700 ------------ .../0_collections_snapshot_0_18_3_dev_1.go | 2386 +++++++++++++++++ .../1771782981_updated_containers.go | 45 - ...000_add_auto_container_alias_to_systems.go | 43 - 5 files changed, 2389 insertions(+), 1793 deletions(-) delete mode 100644 internal/migrations/0_collections_snapshot_0_18_0_dev_2.go create mode 100644 internal/migrations/0_collections_snapshot_0_18_3_dev_1.go delete mode 100644 internal/migrations/1771782981_updated_containers.go delete mode 100644 internal/migrations/1771869000_add_auto_container_alias_to_systems.go diff --git a/internal/hub/systems/system_alias_test.go b/internal/hub/systems/system_alias_test.go index e5df031ab..8be4617c8 100644 --- a/internal/hub/systems/system_alias_test.go +++ b/internal/hub/systems/system_alias_test.go @@ -1,5 +1,3 @@ -//go:build testing - package systems import ( @@ -21,18 +19,18 @@ func TestResolveAutoContainerAlias(t *testing.T) { alias := resolveAutoContainerAlias("$SERVICE-$ENV", map[string]string{ "SERVICE": "api", }) - assert.Equal(t, "", alias) + assert.Empty(t, alias) }) t.Run("returns empty when template has no variables", func(t *testing.T) { alias := resolveAutoContainerAlias("plain-text", map[string]string{ "SERVICE": "api", }) - assert.Equal(t, "", alias) + assert.Empty(t, alias) }) t.Run("returns empty when labels are missing", func(t *testing.T) { alias := resolveAutoContainerAlias("$SERVICE", nil) - assert.Equal(t, "", alias) + assert.Empty(t, alias) }) } diff --git a/internal/migrations/0_collections_snapshot_0_18_0_dev_2.go b/internal/migrations/0_collections_snapshot_0_18_0_dev_2.go deleted file mode 100644 index 798006499..000000000 --- a/internal/migrations/0_collections_snapshot_0_18_0_dev_2.go +++ /dev/null @@ -1,1700 +0,0 @@ -package migrations - -import ( - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" -) - -func init() { - m.Register(func(app core.App) error { - // update collections - jsonData := `[ - { - "id": "elngm8x1l60zi2v", - "listRule": "@request.auth.id != \"\" && user.id = @request.auth.id", - "viewRule": "", - "createRule": "@request.auth.id != \"\" && user.id = @request.auth.id", - "updateRule": "@request.auth.id != \"\" && user.id = @request.auth.id", - "deleteRule": "@request.auth.id != \"\" && user.id = @request.auth.id", - "name": "alerts", - "type": "base", - "fields": [ - { - "autogeneratePattern": "[a-z0-9]{15}", - "hidden": false, - "id": "text3208210256", - "max": 15, - "min": 15, - "name": "id", - "pattern": "^[a-z0-9]+$", - "presentable": false, - "primaryKey": true, - "required": true, - "system": true, - "type": "text" - }, - { - "cascadeDelete": true, - "collectionId": "_pb_users_auth_", - "hidden": false, - "id": "hn5ly3vi", - "maxSelect": 1, - "minSelect": 0, - "name": "user", - "presentable": false, - "required": true, - "system": false, - "type": "relation" - }, - { - "cascadeDelete": true, - "collectionId": "2hz5ncl8tizk5nx", - "hidden": false, - "id": "g5sl3jdg", - "maxSelect": 1, - "minSelect": 0, - "name": "system", - "presentable": false, - "required": true, - "system": false, - "type": "relation" - }, - { - "hidden": false, - "id": "zj3ingrv", - "maxSelect": 1, - "name": "name", - "presentable": false, - "required": true, - "system": false, - "type": "select", - "values": [ - "Status", - "CPU", - "Memory", - "Disk", - "Temperature", - "Bandwidth", - "GPU", - "LoadAvg1", - "LoadAvg5", - "LoadAvg15", - "Battery" - ] - }, - { - "hidden": false, - "id": "o2ablxvn", - "max": null, - "min": null, - "name": "value", - "onlyInt": false, - "presentable": false, - "required": false, - "system": false, - "type": "number" - }, - { - "hidden": false, - "id": "fstdehcq", - "max": 60, - "min": null, - "name": "min", - "onlyInt": true, - "presentable": false, - "required": false, - "system": false, - "type": "number" - }, - { - "hidden": false, - "id": "6hgdf6hs", - "name": "triggered", - "presentable": false, - "required": false, - "system": false, - "type": "bool" - }, - { - "hidden": false, - "id": "autodate2990389176", - "name": "created", - "onCreate": true, - "onUpdate": false, - "presentable": false, - "system": false, - "type": "autodate" - }, - { - "hidden": false, - "id": "autodate3332085495", - "name": "updated", - "onCreate": true, - "onUpdate": true, - "presentable": false, - "system": false, - "type": "autodate" - } - ], - "indexes": [ - "CREATE UNIQUE INDEX ` + "`" + `idx_MnhEt21L5r` + "`" + ` ON ` + "`" + `alerts` + "`" + ` (\n ` + "`" + `user` + "`" + `,\n ` + "`" + `system` + "`" + `,\n ` + "`" + `name` + "`" + `\n)" - ], - "system": false - }, - { - "id": "pbc_1697146157", - "listRule": "@request.auth.id != \"\" && user.id = @request.auth.id", - "viewRule": "@request.auth.id != \"\" && user.id = @request.auth.id", - "createRule": null, - "updateRule": null, - "deleteRule": "@request.auth.id != \"\" && user.id = @request.auth.id", - "name": "alerts_history", - "type": "base", - "fields": [ - { - "autogeneratePattern": "[a-z0-9]{15}", - "hidden": false, - "id": "text3208210256", - "max": 15, - "min": 15, - "name": "id", - "pattern": "^[a-z0-9]+$", - "presentable": false, - "primaryKey": true, - "required": true, - "system": true, - "type": "text" - }, - { - "cascadeDelete": true, - "collectionId": "_pb_users_auth_", - "hidden": false, - "id": "relation2375276105", - "maxSelect": 1, - "minSelect": 0, - "name": "user", - "presentable": false, - "required": true, - "system": false, - "type": "relation" - }, - { - "cascadeDelete": true, - "collectionId": "2hz5ncl8tizk5nx", - "hidden": false, - "id": "relation3377271179", - "maxSelect": 1, - "minSelect": 0, - "name": "system", - "presentable": false, - "required": true, - "system": false, - "type": "relation" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text2466471794", - "max": 0, - "min": 0, - "name": "alert_id", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text1579384326", - "max": 0, - "min": 0, - "name": "name", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": true, - "system": false, - "type": "text" - }, - { - "hidden": false, - "id": "number494360628", - "max": null, - "min": null, - "name": "value", - "onlyInt": false, - "presentable": false, - "required": false, - "system": false, - "type": "number" - }, - { - "hidden": false, - "id": "autodate2990389176", - "name": "created", - "onCreate": true, - "onUpdate": false, - "presentable": false, - "system": false, - "type": "autodate" - }, - { - "hidden": false, - "id": "date2276568630", - "max": "", - "min": "", - "name": "resolved", - "presentable": false, - "required": false, - "system": false, - "type": "date" - } - ], - "indexes": [ - "CREATE INDEX ` + "`" + `idx_YdGnup5aqB` + "`" + ` ON ` + "`" + `alerts_history` + "`" + ` (` + "`" + `user` + "`" + `)", - "CREATE INDEX ` + "`" + `idx_taLet9VdME` + "`" + ` ON ` + "`" + `alerts_history` + "`" + ` (` + "`" + `created` + "`" + `)" - ], - "system": false - }, - { - "id": "juohu4jipgc13v7", - "listRule": "@request.auth.id != \"\"", - "viewRule": null, - "createRule": null, - "updateRule": null, - "deleteRule": null, - "name": "container_stats", - "type": "base", - "fields": [ - { - "autogeneratePattern": "[a-z0-9]{15}", - "hidden": false, - "id": "text3208210256", - "max": 15, - "min": 15, - "name": "id", - "pattern": "^[a-z0-9]+$", - "presentable": false, - "primaryKey": true, - "required": true, - "system": true, - "type": "text" - }, - { - "cascadeDelete": true, - "collectionId": "2hz5ncl8tizk5nx", - "hidden": false, - "id": "hutcu6ps", - "maxSelect": 1, - "minSelect": 0, - "name": "system", - "presentable": false, - "required": true, - "system": false, - "type": "relation" - }, - { - "hidden": false, - "id": "r39hhnil", - "maxSize": 2000000, - "name": "stats", - "presentable": false, - "required": true, - "system": false, - "type": "json" - }, - { - "hidden": false, - "id": "vo7iuj96", - "maxSelect": 1, - "name": "type", - "presentable": false, - "required": true, - "system": false, - "type": "select", - "values": [ - "1m", - "10m", - "20m", - "120m", - "480m" - ] - }, - { - "hidden": false, - "id": "autodate2990389176", - "name": "created", - "onCreate": true, - "onUpdate": false, - "presentable": false, - "system": false, - "type": "autodate" - }, - { - "hidden": false, - "id": "autodate3332085495", - "name": "updated", - "onCreate": true, - "onUpdate": true, - "presentable": false, - "system": false, - "type": "autodate" - } - ], - "indexes": [ - "CREATE INDEX ` + "`" + `idx_d87OiXGZD8` + "`" + ` ON ` + "`" + `container_stats` + "`" + ` (\n ` + "`" + `system` + "`" + `,\n ` + "`" + `type` + "`" + `,\n ` + "`" + `created` + "`" + `\n)" - ], - "system": false - }, - { - "id": "pbc_3663931638", - "listRule": "@request.auth.id != \"\" && system.users.id ?= @request.auth.id", - "viewRule": "@request.auth.id != \"\" && system.users.id ?= @request.auth.id", - "createRule": "@request.auth.id != \"\" && system.users.id ?= @request.auth.id && @request.auth.role != \"readonly\"", - "updateRule": "@request.auth.id != \"\" && system.users.id ?= @request.auth.id && @request.auth.role != \"readonly\"", - "deleteRule": null, - "name": "fingerprints", - "type": "base", - "fields": [ - { - "autogeneratePattern": "[a-z0-9]{9}", - "hidden": false, - "id": "text3208210256", - "max": 15, - "min": 9, - "name": "id", - "pattern": "^[a-z0-9]+$", - "presentable": false, - "primaryKey": true, - "required": true, - "system": true, - "type": "text" - }, - { - "cascadeDelete": true, - "collectionId": "2hz5ncl8tizk5nx", - "hidden": false, - "id": "relation3377271179", - "maxSelect": 1, - "minSelect": 0, - "name": "system", - "presentable": false, - "required": true, - "system": false, - "type": "relation" - }, - { - "autogeneratePattern": "[a-zA-Z9-9]{20}", - "hidden": false, - "id": "text1597481275", - "max": 255, - "min": 9, - "name": "token", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": true, - "system": false, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text4228609354", - "max": 255, - "min": 9, - "name": "fingerprint", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "hidden": false, - "id": "autodate3332085495", - "name": "updated", - "onCreate": true, - "onUpdate": true, - "presentable": false, - "system": false, - "type": "autodate" - } - ], - "indexes": [ - "CREATE INDEX ` + "`" + `idx_p9qZlu26po` + "`" + ` ON ` + "`" + `fingerprints` + "`" + ` (` + "`" + `token` + "`" + `)", - "CREATE UNIQUE INDEX ` + "`" + `idx_ngboulGMYw` + "`" + ` ON ` + "`" + `fingerprints` + "`" + ` (` + "`" + `system` + "`" + `)" - ], - "system": false - }, - { - "id": "ej9oowivz8b2mht", - "listRule": "@request.auth.id != \"\"", - "viewRule": null, - "createRule": null, - "updateRule": null, - "deleteRule": null, - "name": "system_stats", - "type": "base", - "fields": [ - { - "autogeneratePattern": "[a-z0-9]{15}", - "hidden": false, - "id": "text3208210256", - "max": 15, - "min": 15, - "name": "id", - "pattern": "^[a-z0-9]+$", - "presentable": false, - "primaryKey": true, - "required": true, - "system": true, - "type": "text" - }, - { - "cascadeDelete": true, - "collectionId": "2hz5ncl8tizk5nx", - "hidden": false, - "id": "h9sg148r", - "maxSelect": 1, - "minSelect": 0, - "name": "system", - "presentable": false, - "required": true, - "system": false, - "type": "relation" - }, - { - "hidden": false, - "id": "azftn0be", - "maxSize": 2000000, - "name": "stats", - "presentable": false, - "required": true, - "system": false, - "type": "json" - }, - { - "hidden": false, - "id": "m1ekhli3", - "maxSelect": 1, - "name": "type", - "presentable": false, - "required": true, - "system": false, - "type": "select", - "values": [ - "1m", - "10m", - "20m", - "120m", - "480m" - ] - }, - { - "hidden": false, - "id": "autodate2990389176", - "name": "created", - "onCreate": true, - "onUpdate": false, - "presentable": false, - "system": false, - "type": "autodate" - }, - { - "hidden": false, - "id": "autodate3332085495", - "name": "updated", - "onCreate": true, - "onUpdate": true, - "presentable": false, - "system": false, - "type": "autodate" - } - ], - "indexes": [ - "CREATE INDEX ` + "`" + `idx_GxIee0j` + "`" + ` ON ` + "`" + `system_stats` + "`" + ` (\n ` + "`" + `system` + "`" + `,\n ` + "`" + `type` + "`" + `,\n ` + "`" + `created` + "`" + `\n)" - ], - "system": false - }, - { - "id": "4afacsdnlu8q8r2", - "listRule": "@request.auth.id != \"\" && user.id = @request.auth.id", - "viewRule": null, - "createRule": "@request.auth.id != \"\" && user.id = @request.auth.id", - "updateRule": "@request.auth.id != \"\" && user.id = @request.auth.id", - "deleteRule": null, - "name": "user_settings", - "type": "base", - "fields": [ - { - "autogeneratePattern": "[a-z0-9]{15}", - "hidden": false, - "id": "text3208210256", - "max": 15, - "min": 15, - "name": "id", - "pattern": "^[a-z0-9]+$", - "presentable": false, - "primaryKey": true, - "required": true, - "system": true, - "type": "text" - }, - { - "cascadeDelete": true, - "collectionId": "_pb_users_auth_", - "hidden": false, - "id": "d5vztyxa", - "maxSelect": 1, - "minSelect": 0, - "name": "user", - "presentable": false, - "required": true, - "system": false, - "type": "relation" - }, - { - "hidden": false, - "id": "xcx4qgqq", - "maxSize": 2000000, - "name": "settings", - "presentable": false, - "required": false, - "system": false, - "type": "json" - }, - { - "hidden": false, - "id": "autodate2990389176", - "name": "created", - "onCreate": true, - "onUpdate": false, - "presentable": false, - "system": false, - "type": "autodate" - }, - { - "hidden": false, - "id": "autodate3332085495", - "name": "updated", - "onCreate": true, - "onUpdate": true, - "presentable": false, - "system": false, - "type": "autodate" - } - ], - "indexes": [ - "CREATE UNIQUE INDEX ` + "`" + `idx_30Lwgf2` + "`" + ` ON ` + "`" + `user_settings` + "`" + ` (` + "`" + `user` + "`" + `)" - ], - "system": false - }, - { - "id": "2hz5ncl8tizk5nx", - "listRule": "@request.auth.id != \"\" && users.id ?= @request.auth.id", - "viewRule": "@request.auth.id != \"\" && users.id ?= @request.auth.id", - "createRule": "@request.auth.id != \"\" && users.id ?= @request.auth.id && @request.auth.role != \"readonly\"", - "updateRule": "@request.auth.id != \"\" && users.id ?= @request.auth.id && @request.auth.role != \"readonly\"", - "deleteRule": "@request.auth.id != \"\" && users.id ?= @request.auth.id && @request.auth.role != \"readonly\"", - "name": "systems", - "type": "base", - "fields": [ - { - "autogeneratePattern": "[a-z0-9]{15}", - "hidden": false, - "id": "text3208210256", - "max": 15, - "min": 15, - "name": "id", - "pattern": "^[a-z0-9]+$", - "presentable": false, - "primaryKey": true, - "required": true, - "system": true, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "7xloxkwk", - "max": 0, - "min": 0, - "name": "name", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": true, - "system": false, - "type": "text" - }, - { - "hidden": false, - "id": "waj7seaf", - "maxSelect": 1, - "name": "status", - "presentable": false, - "required": false, - "system": false, - "type": "select", - "values": [ - "up", - "down", - "paused", - "pending" - ] - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "ve781smf", - "max": 0, - "min": 0, - "name": "host", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": true, - "system": false, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "pij0k2jk", - "max": 0, - "min": 0, - "name": "port", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "hidden": false, - "id": "qoq64ntl", - "maxSize": 2000000, - "name": "info", - "presentable": false, - "required": false, - "system": false, - "type": "json" - }, - { - "cascadeDelete": true, - "collectionId": "_pb_users_auth_", - "hidden": false, - "id": "jcarjnjj", - "maxSelect": 2147483647, - "minSelect": 0, - "name": "users", - "presentable": false, - "required": true, - "system": false, - "type": "relation" - }, - { - "hidden": false, - "id": "autodate2990389176", - "name": "created", - "onCreate": true, - "onUpdate": false, - "presentable": false, - "system": false, - "type": "autodate" - }, - { - "hidden": false, - "id": "autodate3332085495", - "name": "updated", - "onCreate": true, - "onUpdate": true, - "presentable": false, - "system": false, - "type": "autodate" - } - ], - "indexes": [ - "CREATE INDEX ` + "`" + `idx_systems_status` + "`" + ` ON ` + "`" + `systems` + "`" + ` (` + "`" + `status` + "`" + `)" - ], - "system": false - }, - { - "id": "_pb_users_auth_", - "listRule": "id = @request.auth.id", - "viewRule": "id = @request.auth.id", - "createRule": null, - "updateRule": null, - "deleteRule": null, - "name": "users", - "type": "auth", - "fields": [ - { - "autogeneratePattern": "[a-z0-9]{15}", - "hidden": false, - "id": "text3208210256", - "max": 15, - "min": 15, - "name": "id", - "pattern": "^[a-z0-9]+$", - "presentable": false, - "primaryKey": true, - "required": true, - "system": true, - "type": "text" - }, - { - "cost": 10, - "hidden": true, - "id": "password901924565", - "max": 0, - "min": 8, - "name": "password", - "pattern": "", - "presentable": false, - "required": true, - "system": true, - "type": "password" - }, - { - "autogeneratePattern": "[a-zA-Z0-9_]{50}", - "hidden": true, - "id": "text2504183744", - "max": 60, - "min": 30, - "name": "tokenKey", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": true, - "system": true, - "type": "text" - }, - { - "exceptDomains": null, - "hidden": false, - "id": "email3885137012", - "name": "email", - "onlyDomains": null, - "presentable": false, - "required": true, - "system": true, - "type": "email" - }, - { - "hidden": false, - "id": "bool1547992806", - "name": "emailVisibility", - "presentable": false, - "required": false, - "system": true, - "type": "bool" - }, - { - "hidden": false, - "id": "bool256245529", - "name": "verified", - "presentable": false, - "required": false, - "system": true, - "type": "bool" - }, - { - "autogeneratePattern": "users[0-9]{6}", - "hidden": false, - "id": "text4166911607", - "max": 150, - "min": 3, - "name": "username", - "pattern": "^[\\w][\\w\\.\\-]*$", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "hidden": false, - "id": "qkbp58ae", - "maxSelect": 1, - "name": "role", - "presentable": false, - "required": false, - "system": false, - "type": "select", - "values": [ - "user", - "admin", - "readonly" - ] - }, - { - "hidden": false, - "id": "autodate2990389176", - "name": "created", - "onCreate": true, - "onUpdate": false, - "presentable": false, - "system": false, - "type": "autodate" - }, - { - "hidden": false, - "id": "autodate3332085495", - "name": "updated", - "onCreate": true, - "onUpdate": true, - "presentable": false, - "system": false, - "type": "autodate" - } - ], - "indexes": [ - "CREATE UNIQUE INDEX ` + "`" + `__pb_users_auth__username_idx` + "`" + ` ON ` + "`" + `users` + "`" + ` (username COLLATE NOCASE)", - "CREATE UNIQUE INDEX ` + "`" + `__pb_users_auth__email_idx` + "`" + ` ON ` + "`" + `users` + "`" + ` (` + "`" + `email` + "`" + `) WHERE ` + "`" + `email` + "`" + ` != ''", - "CREATE UNIQUE INDEX ` + "`" + `__pb_users_auth__tokenKey_idx` + "`" + ` ON ` + "`" + `users` + "`" + ` (` + "`" + `tokenKey` + "`" + `)" - ], - "system": false, - "authRule": "verified=true", - "manageRule": null - }, - { - "id": "pbc_1864144027", - "listRule": "@request.auth.id != \"\" && system.users.id ?= @request.auth.id", - "viewRule": null, - "createRule": null, - "updateRule": null, - "deleteRule": null, - "name": "containers", - "type": "base", - "fields": [ - { - "autogeneratePattern": "[a-f0-9]{6}", - "hidden": false, - "id": "text3208210256", - "max": 12, - "min": 6, - "name": "id", - "pattern": "^[a-f0-9]+$", - "presentable": false, - "primaryKey": true, - "required": true, - "system": true, - "type": "text" - }, - { - "cascadeDelete": false, - "collectionId": "2hz5ncl8tizk5nx", - "hidden": false, - "id": "relation3377271179", - "maxSelect": 1, - "minSelect": 0, - "name": "system", - "presentable": false, - "required": false, - "system": false, - "type": "relation" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text1579384326", - "max": 0, - "min": 0, - "name": "name", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text2063623452", - "max": 0, - "min": 0, - "name": "status", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "hidden": false, - "id": "number3470402323", - "max": null, - "min": null, - "name": "health", - "onlyInt": false, - "presentable": false, - "required": false, - "system": false, - "type": "number" - }, - { - "hidden": false, - "id": "number3128971310", - "max": 100, - "min": 0, - "name": "cpu", - "onlyInt": false, - "presentable": false, - "required": false, - "system": false, - "type": "number" - }, - { - "hidden": false, - "id": "number3933025333", - "max": null, - "min": 0, - "name": "memory", - "onlyInt": false, - "presentable": false, - "required": false, - "system": false, - "type": "number" - }, - { - "hidden": false, - "id": "number4075427327", - "max": null, - "min": null, - "name": "net", - "onlyInt": false, - "presentable": false, - "required": false, - "system": false, - "type": "number" - }, - { - "hidden": false, - "id": "number3332085495", - "max": null, - "min": null, - "name": "updated", - "onlyInt": true, - "presentable": false, - "required": true, - "system": false, - "type": "number" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text3309110367", - "max": 0, - "min": 0, - "name": "image", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - } - ], - "indexes": [ - "CREATE INDEX ` + "`" + `idx_JxWirjdhyO` + "`" + ` ON ` + "`" + `containers` + "`" + ` (` + "`" + `updated` + "`" + `)", - "CREATE INDEX ` + "`" + `idx_r3Ja0rs102` + "`" + ` ON ` + "`" + `containers` + "`" + ` (` + "`" + `system` + "`" + `)" - ], - "system": false - }, - { - "createRule": null, - "deleteRule": null, - "fields": [ - { - "autogeneratePattern": "[a-z0-9]{10}", - "hidden": false, - "id": "text3208210256", - "max": 10, - "min": 6, - "name": "id", - "pattern": "^[a-z0-9]+$", - "presentable": false, - "primaryKey": true, - "required": true, - "system": true, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text1579384326", - "max": 0, - "min": 0, - "name": "name", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "cascadeDelete": true, - "collectionId": "2hz5ncl8tizk5nx", - "hidden": false, - "id": "relation3377271179", - "maxSelect": 1, - "minSelect": 0, - "name": "system", - "presentable": false, - "required": false, - "system": false, - "type": "relation" - }, - { - "hidden": false, - "id": "number2063623452", - "max": null, - "min": null, - "name": "state", - "onlyInt": true, - "presentable": false, - "required": false, - "system": false, - "type": "number" - }, - { - "hidden": false, - "id": "number1476559580", - "max": null, - "min": null, - "name": "sub", - "onlyInt": true, - "presentable": false, - "required": false, - "system": false, - "type": "number" - }, - { - "hidden": false, - "id": "number3128971310", - "max": null, - "min": null, - "name": "cpu", - "onlyInt": false, - "presentable": false, - "required": false, - "system": false, - "type": "number" - }, - { - "hidden": false, - "id": "number1052053287", - "max": null, - "min": null, - "name": "cpuPeak", - "onlyInt": false, - "presentable": false, - "required": false, - "system": false, - "type": "number" - }, - { - "hidden": false, - "id": "number3933025333", - "max": null, - "min": null, - "name": "memory", - "onlyInt": false, - "presentable": false, - "required": false, - "system": false, - "type": "number" - }, - { - "hidden": false, - "id": "number1828797201", - "max": null, - "min": null, - "name": "memPeak", - "onlyInt": false, - "presentable": false, - "required": false, - "system": false, - "type": "number" - }, - { - "hidden": false, - "id": "number3332085495", - "max": null, - "min": null, - "name": "updated", - "onlyInt": false, - "presentable": false, - "required": false, - "system": false, - "type": "number" - } - ], - "id": "pbc_3494996990", - "indexes": [ - "CREATE INDEX ` + "`" + `idx_4Z7LuLNdQb` + "`" + ` ON ` + "`" + `systemd_services` + "`" + ` (` + "`" + `system` + "`" + `)", - "CREATE INDEX ` + "`" + `idx_pBp1fF837e` + "`" + ` ON ` + "`" + `systemd_services` + "`" + ` (` + "`" + `updated` + "`" + `)" - ], - "listRule": "@request.auth.id != \"\" && system.users.id ?= @request.auth.id", - "name": "systemd_services", - "system": false, - "type": "base", - "updateRule": null, - "viewRule": null - }, - { - "createRule": "@request.auth.id != \"\" && user.id = @request.auth.id", - "deleteRule": "@request.auth.id != \"\" && user.id = @request.auth.id", - "fields": [ - { - "autogeneratePattern": "[a-z0-9]{10}", - "hidden": false, - "id": "text3208210256", - "max": 10, - "min": 10, - "name": "id", - "pattern": "^[a-z0-9]+$", - "presentable": false, - "primaryKey": true, - "required": true, - "system": true, - "type": "text" - }, - { - "cascadeDelete": true, - "collectionId": "_pb_users_auth_", - "hidden": false, - "id": "relation2375276105", - "maxSelect": 1, - "minSelect": 0, - "name": "user", - "presentable": false, - "required": false, - "system": false, - "type": "relation" - }, - { - "cascadeDelete": true, - "collectionId": "2hz5ncl8tizk5nx", - "hidden": false, - "id": "relation3377271179", - "maxSelect": 1, - "minSelect": 0, - "name": "system", - "presentable": false, - "required": false, - "system": false, - "type": "relation" - }, - { - "hidden": false, - "id": "select2844932856", - "maxSelect": 1, - "name": "type", - "presentable": false, - "required": true, - "system": false, - "type": "select", - "values": [ - "one-time", - "daily" - ] - }, - { - "hidden": false, - "id": "date2675529103", - "max": "", - "min": "", - "name": "start", - "presentable": false, - "required": true, - "system": false, - "type": "date" - }, - { - "hidden": false, - "id": "date16528305", - "max": "", - "min": "", - "name": "end", - "presentable": false, - "required": true, - "system": false, - "type": "date" - } - ], - "id": "pbc_451525641", - "indexes": [ - "CREATE INDEX ` + "`" + `idx_q0iKnRP9v8` + "`" + ` ON ` + "`" + `quiet_hours` + "`" + ` (\n ` + "`" + `user` + "`" + `,\n ` + "`" + `system` + "`" + `\n)", - "CREATE INDEX ` + "`" + `idx_6T7ljT7FJd` + "`" + ` ON ` + "`" + `quiet_hours` + "`" + ` (\n ` + "`" + `type` + "`" + `,\n ` + "`" + `end` + "`" + `\n)" - ], - "listRule": "@request.auth.id != \"\" && user.id = @request.auth.id", - "name": "quiet_hours", - "system": false, - "type": "base", - "updateRule": "@request.auth.id != \"\" && user.id = @request.auth.id", - "viewRule": "@request.auth.id != \"\" && user.id = @request.auth.id" - }, - { - "createRule": null, - "deleteRule": "@request.auth.id != \"\" && system.users.id ?= @request.auth.id", - "fields": [ - { - "autogeneratePattern": "[a-z0-9]{10}", - "hidden": false, - "id": "text3208210256", - "max": 10, - "min": 10, - "name": "id", - "pattern": "^[a-z0-9]+$", - "presentable": false, - "primaryKey": true, - "required": true, - "system": true, - "type": "text" - }, - { - "cascadeDelete": true, - "collectionId": "2hz5ncl8tizk5nx", - "hidden": false, - "id": "relation3377271179", - "maxSelect": 1, - "minSelect": 0, - "name": "system", - "presentable": false, - "required": true, - "system": false, - "type": "relation" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text1579384326", - "max": 0, - "min": 0, - "name": "name", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text3616895705", - "max": 0, - "min": 0, - "name": "model", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text2744374011", - "max": 0, - "min": 0, - "name": "state", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "hidden": false, - "id": "number3051925876", - "max": null, - "min": null, - "name": "capacity", - "onlyInt": false, - "presentable": false, - "required": false, - "system": false, - "type": "number" - }, - { - "hidden": false, - "id": "number190023114", - "max": null, - "min": null, - "name": "temp", - "onlyInt": false, - "presentable": false, - "required": false, - "system": false, - "type": "number" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text3589068740", - "max": 0, - "min": 0, - "name": "firmware", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text3547646428", - "max": 0, - "min": 0, - "name": "serial", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text2363381545", - "max": 0, - "min": 0, - "name": "type", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "hidden": false, - "id": "number1234567890", - "max": null, - "min": null, - "name": "hours", - "onlyInt": true, - "presentable": false, - "required": false, - "system": false, - "type": "number" - }, - { - "hidden": false, - "id": "number0987654321", - "max": null, - "min": null, - "name": "cycles", - "onlyInt": true, - "presentable": false, - "required": false, - "system": false, - "type": "number" - }, - { - "hidden": false, - "id": "json832282224", - "maxSize": 0, - "name": "attributes", - "presentable": false, - "required": false, - "system": false, - "type": "json" - }, - { - "hidden": false, - "id": "autodate3332085495", - "name": "updated", - "onCreate": true, - "onUpdate": true, - "presentable": false, - "system": false, - "type": "autodate" - } - ], - "id": "pbc_2571630677", - "indexes": [ - "CREATE INDEX ` + "`" + `idx_DZ9yhvgl44` + "`" + ` ON ` + "`" + `smart_devices` + "`" + ` (` + "`" + `system` + "`" + `)" - ], - "listRule": "@request.auth.id != \"\" && system.users.id ?= @request.auth.id", - "name": "smart_devices", - "system": false, - "type": "base", - "updateRule": null, - "viewRule": "@request.auth.id != \"\" && system.users.id ?= @request.auth.id" - }, - { - "createRule": "", - "deleteRule": "", - "fields": [ - { - "autogeneratePattern": "[a-z0-9]{15}", - "hidden": false, - "id": "text3208210256", - "max": 15, - "min": 15, - "name": "id", - "pattern": "^[a-z0-9]+$", - "presentable": false, - "primaryKey": true, - "required": true, - "system": true, - "type": "text" - }, - { - "cascadeDelete": true, - "collectionId": "2hz5ncl8tizk5nx", - "hidden": false, - "id": "relation3377271179", - "maxSelect": 1, - "minSelect": 0, - "name": "system", - "presentable": false, - "required": true, - "system": false, - "type": "relation" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text3847340049", - "max": 0, - "min": 0, - "name": "hostname", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "hidden": false, - "id": "number1789936913", - "max": null, - "min": null, - "name": "os", - "onlyInt": false, - "presentable": false, - "required": false, - "system": false, - "type": "number" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text2818598173", - "max": 0, - "min": 0, - "name": "os_name", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text1574083243", - "max": 0, - "min": 0, - "name": "kernel", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text3128971310", - "max": 0, - "min": 0, - "name": "cpu", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text4161937994", - "max": 0, - "min": 0, - "name": "arch", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "hidden": false, - "id": "number4245036687", - "max": null, - "min": null, - "name": "cores", - "onlyInt": false, - "presentable": false, - "required": false, - "system": false, - "type": "number" - }, - { - "hidden": false, - "id": "number1871592925", - "max": null, - "min": null, - "name": "threads", - "onlyInt": false, - "presentable": false, - "required": false, - "system": false, - "type": "number" - }, - { - "hidden": false, - "id": "number3933025333", - "max": null, - "min": null, - "name": "memory", - "onlyInt": false, - "presentable": false, - "required": false, - "system": false, - "type": "number" - }, - { - "hidden": false, - "id": "bool2200265312", - "name": "podman", - "presentable": false, - "required": false, - "system": false, - "type": "bool" - }, - { - "hidden": false, - "id": "autodate3332085495", - "name": "updated", - "onCreate": true, - "onUpdate": true, - "presentable": false, - "system": false, - "type": "autodate" - } - ], - "id": "pbc_3116237454", - "indexes": [], - "listRule": "@request.auth.id != \"\" && system.users.id ?= @request.auth.id", - "name": "system_details", - "system": false, - "type": "base", - "updateRule": "", - "viewRule": "@request.auth.id != \"\" && system.users.id ?= @request.auth.id" - }, - { - "createRule": null, - "deleteRule": null, - "fields": [ - { - "autogeneratePattern": "[a-z0-9]{10}", - "hidden": false, - "id": "text3208210256", - "max": 10, - "min": 10, - "name": "id", - "pattern": "^[a-z0-9]+$", - "presentable": false, - "primaryKey": true, - "required": true, - "system": true, - "type": "text" - }, - { - "cascadeDelete": true, - "collectionId": "_pb_users_auth_", - "hidden": false, - "id": "relation2375276105", - "maxSelect": 1, - "minSelect": 0, - "name": "user", - "presentable": false, - "required": true, - "system": false, - "type": "relation" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text1597481275", - "max": 0, - "min": 0, - "name": "token", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "hidden": false, - "id": "autodate2990389176", - "name": "created", - "onCreate": true, - "onUpdate": false, - "presentable": false, - "system": false, - "type": "autodate" - } - ], - "id": "pbc_3383022248", - "indexes": [ - "CREATE INDEX ` + "`" + `idx_iaD9Y2Lgbl` + "`" + ` ON ` + "`" + `universal_tokens` + "`" + ` (` + "`" + `token` + "`" + `)", - "CREATE UNIQUE INDEX ` + "`" + `idx_wdR0A4PbRG` + "`" + ` ON ` + "`" + `universal_tokens` + "`" + ` (` + "`" + `user` + "`" + `)" - ], - "listRule": null, - "name": "universal_tokens", - "system": false, - "type": "base", - "updateRule": null, - "viewRule": null - } -]` - - err := app.ImportCollectionsByMarshaledJSON([]byte(jsonData), false) - if err != nil { - return err - } - - return nil - }, func(app core.App) error { - return nil - }) -} diff --git a/internal/migrations/0_collections_snapshot_0_18_3_dev_1.go b/internal/migrations/0_collections_snapshot_0_18_3_dev_1.go new file mode 100644 index 000000000..8b000cd55 --- /dev/null +++ b/internal/migrations/0_collections_snapshot_0_18_3_dev_1.go @@ -0,0 +1,2386 @@ +package migrations + +import ( + "github.com/pocketbase/pocketbase/core" + m "github.com/pocketbase/pocketbase/migrations" +) + +func init() { + m.Register(func(app core.App) error { + jsonData := `[ + { + "createRule": null, + "deleteRule": null, + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text455797646", + "max": 0, + "min": 0, + "name": "collectionRef", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": true, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text127846527", + "max": 0, + "min": 0, + "name": "recordRef", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": true, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1582905952", + "max": 0, + "min": 0, + "name": "method", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": true, + "type": "text" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": true, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": true, + "type": "autodate" + } + ], + "id": "pbc_2279338944", + "indexes": [ + "CREATE INDEX ` + "`" + `idx_mfas_collectionRef_recordRef` + "`" + ` ON ` + "`" + `_mfas` + "`" + ` (collectionRef,recordRef)" + ], + "listRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId", + "name": "_mfas", + "system": true, + "type": "base", + "updateRule": null, + "viewRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId" + }, + { + "createRule": null, + "deleteRule": null, + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text455797646", + "max": 0, + "min": 0, + "name": "collectionRef", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": true, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text127846527", + "max": 0, + "min": 0, + "name": "recordRef", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": true, + "type": "text" + }, + { + "cost": 8, + "hidden": true, + "id": "password901924565", + "max": 0, + "min": 0, + "name": "password", + "pattern": "", + "presentable": false, + "required": true, + "system": true, + "type": "password" + }, + { + "autogeneratePattern": "", + "hidden": true, + "id": "text3866985172", + "max": 0, + "min": 0, + "name": "sentTo", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": true, + "type": "text" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": true, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": true, + "type": "autodate" + } + ], + "id": "pbc_1638494021", + "indexes": [ + "CREATE INDEX ` + "`" + `idx_otps_collectionRef_recordRef` + "`" + ` ON ` + "`" + `_otps` + "`" + ` (collectionRef, recordRef)" + ], + "listRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId", + "name": "_otps", + "system": true, + "type": "base", + "updateRule": null, + "viewRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId" + }, + { + "createRule": null, + "deleteRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId", + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text455797646", + "max": 0, + "min": 0, + "name": "collectionRef", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": true, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text127846527", + "max": 0, + "min": 0, + "name": "recordRef", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": true, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text2462348188", + "max": 0, + "min": 0, + "name": "provider", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": true, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1044722854", + "max": 0, + "min": 0, + "name": "providerId", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": true, + "type": "text" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": true, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": true, + "type": "autodate" + } + ], + "id": "pbc_2281828961", + "indexes": [ + "CREATE UNIQUE INDEX ` + "`" + `idx_externalAuths_record_provider` + "`" + ` ON ` + "`" + `_externalAuths` + "`" + ` (collectionRef, recordRef, provider)", + "CREATE UNIQUE INDEX ` + "`" + `idx_externalAuths_collection_provider` + "`" + ` ON ` + "`" + `_externalAuths` + "`" + ` (collectionRef, provider, providerId)" + ], + "listRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId", + "name": "_externalAuths", + "system": true, + "type": "base", + "updateRule": null, + "viewRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId" + }, + { + "createRule": null, + "deleteRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId", + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text455797646", + "max": 0, + "min": 0, + "name": "collectionRef", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": true, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text127846527", + "max": 0, + "min": 0, + "name": "recordRef", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": true, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text4228609354", + "max": 0, + "min": 0, + "name": "fingerprint", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": true, + "type": "text" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": true, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": true, + "type": "autodate" + } + ], + "id": "pbc_4275539003", + "indexes": [ + "CREATE UNIQUE INDEX ` + "`" + `idx_authOrigins_unique_pairs` + "`" + ` ON ` + "`" + `_authOrigins` + "`" + ` (collectionRef, recordRef, fingerprint)" + ], + "listRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId", + "name": "_authOrigins", + "system": true, + "type": "base", + "updateRule": null, + "viewRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId" + }, + { + "authAlert": { + "emailTemplate": { + "body": "

Hello,

\n

We noticed a login to your {APP_NAME} account from a new location:

\n

{ALERT_INFO}

\n

If this wasn't you, you should immediately change your {APP_NAME} account password to revoke access from all other locations.

\n

If this was you, you may disregard this email.

\n

\n Thanks,
\n {APP_NAME} team\n

", + "subject": "Login from a new location" + }, + "enabled": true + }, + "authRule": "", + "authToken": { + "duration": 86400 + }, + "confirmEmailChangeTemplate": { + "body": "

Hello,

\n

Click on the button below to confirm your new email address.

\n

\n Confirm new email\n

\n

If you didn't ask to change your email address, you can ignore this email.

\n

\n Thanks,
\n {APP_NAME} team\n

", + "subject": "Confirm your {APP_NAME} new email address" + }, + "createRule": null, + "deleteRule": null, + "emailChangeToken": { + "duration": 1800 + }, + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "cost": 0, + "hidden": true, + "id": "password901924565", + "max": 0, + "min": 8, + "name": "password", + "pattern": "", + "presentable": false, + "required": true, + "system": true, + "type": "password" + }, + { + "autogeneratePattern": "[a-zA-Z0-9]{50}", + "hidden": true, + "id": "text2504183744", + "max": 60, + "min": 30, + "name": "tokenKey", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": true, + "type": "text" + }, + { + "exceptDomains": null, + "hidden": false, + "id": "email3885137012", + "name": "email", + "onlyDomains": null, + "presentable": false, + "required": true, + "system": true, + "type": "email" + }, + { + "hidden": false, + "id": "bool1547992806", + "name": "emailVisibility", + "presentable": false, + "required": false, + "system": true, + "type": "bool" + }, + { + "hidden": false, + "id": "bool256245529", + "name": "verified", + "presentable": false, + "required": false, + "system": true, + "type": "bool" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": true, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": true, + "type": "autodate" + } + ], + "fileToken": { + "duration": 180 + }, + "id": "pbc_3142635823", + "indexes": [ + "CREATE UNIQUE INDEX ` + "`" + `idx_tokenKey_pbc_3142635823` + "`" + ` ON ` + "`" + `_superusers` + "`" + ` (` + "`" + `tokenKey` + "`" + `)", + "CREATE UNIQUE INDEX ` + "`" + `idx_email_pbc_3142635823` + "`" + ` ON ` + "`" + `_superusers` + "`" + ` (` + "`" + `email` + "`" + `) WHERE ` + "`" + `email` + "`" + ` != ''" + ], + "listRule": null, + "manageRule": null, + "mfa": { + "duration": 1800, + "enabled": false, + "rule": "" + }, + "name": "_superusers", + "oauth2": { + "enabled": false, + "mappedFields": { + "avatarURL": "", + "id": "", + "name": "", + "username": "" + } + }, + "otp": { + "duration": 180, + "emailTemplate": { + "body": "

Hello,

\n

Your one-time password is: {OTP}

\n

If you didn't ask for the one-time password, you can ignore this email.

\n

\n Thanks,
\n {APP_NAME} team\n

", + "subject": "OTP for {APP_NAME}" + }, + "enabled": false, + "length": 6 + }, + "passwordAuth": { + "enabled": true, + "identityFields": [ + "email" + ] + }, + "passwordResetToken": { + "duration": 1800 + }, + "resetPasswordTemplate": { + "body": "

Hello,

\n

Click on the button below to reset your password.

\n

\n Reset password\n

\n

If you didn't ask to reset your password, you can ignore this email.

\n

\n Thanks,
\n {APP_NAME} team\n

", + "subject": "Reset your {APP_NAME} password" + }, + "system": true, + "type": "auth", + "updateRule": null, + "verificationTemplate": { + "body": "

Hello,

\n

Thank you for joining us at {APP_NAME}.

\n

Click on the button below to verify your email address.

\n

\n Verify\n

\n

\n Thanks,
\n {APP_NAME} team\n

", + "subject": "Verify your {APP_NAME} email" + }, + "verificationToken": { + "duration": 259200 + }, + "viewRule": null + }, + { + "authAlert": { + "emailTemplate": { + "body": "

Hello,

\n

We noticed a login to your {APP_NAME} account from a new location:

\n

{ALERT_INFO}

\n

If this wasn't you, you should immediately change your {APP_NAME} account password to revoke access from all other locations.

\n

If this was you, you may disregard this email.

\n

\n Thanks,
\n {APP_NAME} team\n

", + "subject": "Login from a new location" + }, + "enabled": true + }, + "authRule": "", + "authToken": { + "duration": 604800 + }, + "confirmEmailChangeTemplate": { + "body": "

Hello,

\n

Click on the button below to confirm your new email address.

\n

\n Confirm new email\n

\n

If you didn't ask to change your email address, you can ignore this email.

\n

\n Thanks,
\n {APP_NAME} team\n

", + "subject": "Confirm your {APP_NAME} new email address" + }, + "createRule": null, + "deleteRule": "id = @request.auth.id", + "emailChangeToken": { + "duration": 1800 + }, + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "cost": 0, + "hidden": true, + "id": "password901924565", + "max": 0, + "min": 8, + "name": "password", + "pattern": "", + "presentable": false, + "required": true, + "system": true, + "type": "password" + }, + { + "autogeneratePattern": "[a-zA-Z0-9]{50}", + "hidden": true, + "id": "text2504183744", + "max": 60, + "min": 30, + "name": "tokenKey", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": true, + "type": "text" + }, + { + "exceptDomains": null, + "hidden": false, + "id": "email3885137012", + "name": "email", + "onlyDomains": null, + "presentable": false, + "required": true, + "system": true, + "type": "email" + }, + { + "hidden": false, + "id": "bool1547992806", + "name": "emailVisibility", + "presentable": false, + "required": false, + "system": true, + "type": "bool" + }, + { + "hidden": false, + "id": "bool256245529", + "name": "verified", + "presentable": false, + "required": false, + "system": true, + "type": "bool" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1579384326", + "max": 255, + "min": 0, + "name": "name", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "file376926767", + "maxSelect": 1, + "maxSize": 0, + "mimeTypes": [ + "image/jpeg", + "image/png", + "image/svg+xml", + "image/gif", + "image/webp" + ], + "name": "avatar", + "presentable": false, + "protected": false, + "required": false, + "system": false, + "thumbs": null, + "type": "file" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "autogeneratePattern": "users[0-9]{6}", + "hidden": false, + "id": "text4166911607", + "max": 150, + "min": 3, + "name": "username", + "pattern": "^[\\w][\\w\\.\\-]*$", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "qkbp58ae", + "maxSelect": 1, + "name": "role", + "presentable": false, + "required": false, + "system": false, + "type": "select", + "values": [ + "user", + "admin", + "readonly" + ] + } + ], + "fileToken": { + "duration": 180 + }, + "id": "_pb_users_auth_", + "indexes": [ + "CREATE UNIQUE INDEX ` + "`" + `idx_tokenKey__pb_users_auth_` + "`" + ` ON ` + "`" + `users` + "`" + ` (` + "`" + `tokenKey` + "`" + `)", + "CREATE UNIQUE INDEX ` + "`" + `idx_email__pb_users_auth_` + "`" + ` ON ` + "`" + `users` + "`" + ` (` + "`" + `email` + "`" + `) WHERE ` + "`" + `email` + "`" + ` != ''" + ], + "listRule": "id = @request.auth.id", + "manageRule": null, + "mfa": { + "duration": 1800, + "enabled": false, + "rule": "" + }, + "name": "users", + "oauth2": { + "enabled": false, + "mappedFields": { + "avatarURL": "avatar", + "id": "", + "name": "name", + "username": "" + } + }, + "otp": { + "duration": 180, + "emailTemplate": { + "body": "

Hello,

\n

Your one-time password is: {OTP}

\n

If you didn't ask for the one-time password, you can ignore this email.

\n

\n Thanks,
\n {APP_NAME} team\n

", + "subject": "OTP for {APP_NAME}" + }, + "enabled": false, + "length": 6 + }, + "passwordAuth": { + "enabled": true, + "identityFields": [ + "email" + ] + }, + "passwordResetToken": { + "duration": 1800 + }, + "resetPasswordTemplate": { + "body": "

Hello,

\n

Click on the button below to reset your password.

\n

\n Reset password\n

\n

If you didn't ask to reset your password, you can ignore this email.

\n

\n Thanks,
\n {APP_NAME} team\n

", + "subject": "Reset your {APP_NAME} password" + }, + "system": false, + "type": "auth", + "updateRule": "id = @request.auth.id", + "verificationTemplate": { + "body": "

Hello,

\n

Thank you for joining us at {APP_NAME}.

\n

Click on the button below to verify your email address.

\n

\n Verify\n

\n

\n Thanks,
\n {APP_NAME} team\n

", + "subject": "Verify your {APP_NAME} email" + }, + "verificationToken": { + "duration": 259200 + }, + "viewRule": "id = @request.auth.id" + }, + { + "createRule": "@request.auth.id != \"\" && user.id = @request.auth.id", + "deleteRule": "@request.auth.id != \"\" && user.id = @request.auth.id", + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "cascadeDelete": true, + "collectionId": "_pb_users_auth_", + "hidden": false, + "id": "hn5ly3vi", + "maxSelect": 1, + "minSelect": 0, + "name": "user", + "presentable": false, + "required": true, + "system": false, + "type": "relation" + }, + { + "cascadeDelete": true, + "collectionId": "2hz5ncl8tizk5nx", + "hidden": false, + "id": "g5sl3jdg", + "maxSelect": 1, + "minSelect": 0, + "name": "system", + "presentable": false, + "required": true, + "system": false, + "type": "relation" + }, + { + "hidden": false, + "id": "zj3ingrv", + "maxSelect": 1, + "name": "name", + "presentable": false, + "required": true, + "system": false, + "type": "select", + "values": [ + "Status", + "CPU", + "Memory", + "Disk", + "Temperature", + "Bandwidth", + "GPU", + "LoadAvg1", + "LoadAvg5", + "LoadAvg15", + "Battery" + ] + }, + { + "hidden": false, + "id": "o2ablxvn", + "max": null, + "min": null, + "name": "value", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + }, + { + "hidden": false, + "id": "fstdehcq", + "max": 60, + "min": null, + "name": "min", + "onlyInt": true, + "presentable": false, + "required": false, + "system": false, + "type": "number" + }, + { + "hidden": false, + "id": "6hgdf6hs", + "name": "triggered", + "presentable": false, + "required": false, + "system": false, + "type": "bool" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "id": "elngm8x1l60zi2v", + "indexes": [ + "CREATE UNIQUE INDEX ` + "`" + `idx_MnhEt21L5r` + "`" + ` ON ` + "`" + `alerts` + "`" + ` (\n ` + "`" + `user` + "`" + `,\n ` + "`" + `system` + "`" + `,\n ` + "`" + `name` + "`" + `\n)" + ], + "listRule": "@request.auth.id != \"\" && user.id = @request.auth.id", + "name": "alerts", + "system": false, + "type": "base", + "updateRule": "@request.auth.id != \"\" && user.id = @request.auth.id", + "viewRule": "" + }, + { + "createRule": null, + "deleteRule": "@request.auth.id != \"\" && user.id = @request.auth.id", + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "cascadeDelete": true, + "collectionId": "_pb_users_auth_", + "hidden": false, + "id": "relation2375276105", + "maxSelect": 1, + "minSelect": 0, + "name": "user", + "presentable": false, + "required": true, + "system": false, + "type": "relation" + }, + { + "cascadeDelete": true, + "collectionId": "2hz5ncl8tizk5nx", + "hidden": false, + "id": "relation3377271179", + "maxSelect": 1, + "minSelect": 0, + "name": "system", + "presentable": false, + "required": true, + "system": false, + "type": "relation" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text2466471794", + "max": 0, + "min": 0, + "name": "alert_id", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1579384326", + "max": 0, + "min": 0, + "name": "name", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "number494360628", + "max": null, + "min": null, + "name": "value", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "hidden": false, + "id": "date2276568630", + "max": "", + "min": "", + "name": "resolved", + "presentable": false, + "required": false, + "system": false, + "type": "date" + } + ], + "id": "pbc_1697146157", + "indexes": [ + "CREATE INDEX ` + "`" + `idx_YdGnup5aqB` + "`" + ` ON ` + "`" + `alerts_history` + "`" + ` (` + "`" + `user` + "`" + `)", + "CREATE INDEX ` + "`" + `idx_taLet9VdME` + "`" + ` ON ` + "`" + `alerts_history` + "`" + ` (` + "`" + `created` + "`" + `)" + ], + "listRule": "@request.auth.id != \"\" && user.id = @request.auth.id", + "name": "alerts_history", + "system": false, + "type": "base", + "updateRule": null, + "viewRule": "@request.auth.id != \"\" && user.id = @request.auth.id" + }, + { + "createRule": null, + "deleteRule": null, + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "cascadeDelete": true, + "collectionId": "2hz5ncl8tizk5nx", + "hidden": false, + "id": "hutcu6ps", + "maxSelect": 1, + "minSelect": 0, + "name": "system", + "presentable": false, + "required": true, + "system": false, + "type": "relation" + }, + { + "hidden": false, + "id": "r39hhnil", + "maxSize": 2000000, + "name": "stats", + "presentable": false, + "required": true, + "system": false, + "type": "json" + }, + { + "hidden": false, + "id": "vo7iuj96", + "maxSelect": 1, + "name": "type", + "presentable": false, + "required": true, + "system": false, + "type": "select", + "values": [ + "1m", + "10m", + "20m", + "120m", + "480m" + ] + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "id": "juohu4jipgc13v7", + "indexes": [ + "CREATE INDEX ` + "`" + `idx_d87OiXGZD8` + "`" + ` ON ` + "`" + `container_stats` + "`" + ` (\n ` + "`" + `system` + "`" + `,\n ` + "`" + `type` + "`" + `,\n ` + "`" + `created` + "`" + `\n)" + ], + "listRule": "@request.auth.id != \"\"", + "name": "container_stats", + "system": false, + "type": "base", + "updateRule": null, + "viewRule": null + }, + { + "createRule": "@request.auth.id != \"\" && system.users.id ?= @request.auth.id && @request.auth.role != \"readonly\"", + "deleteRule": null, + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{9}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 9, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "cascadeDelete": true, + "collectionId": "2hz5ncl8tizk5nx", + "hidden": false, + "id": "relation3377271179", + "maxSelect": 1, + "minSelect": 0, + "name": "system", + "presentable": false, + "required": true, + "system": false, + "type": "relation" + }, + { + "autogeneratePattern": "[a-zA-Z9-9]{20}", + "hidden": false, + "id": "text1597481275", + "max": 255, + "min": 9, + "name": "token", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text4228609354", + "max": 255, + "min": 9, + "name": "fingerprint", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "id": "pbc_3663931638", + "indexes": [ + "CREATE INDEX ` + "`" + `idx_p9qZlu26po` + "`" + ` ON ` + "`" + `fingerprints` + "`" + ` (` + "`" + `token` + "`" + `)", + "CREATE UNIQUE INDEX ` + "`" + `idx_ngboulGMYw` + "`" + ` ON ` + "`" + `fingerprints` + "`" + ` (` + "`" + `system` + "`" + `)" + ], + "listRule": "@request.auth.id != \"\" && system.users.id ?= @request.auth.id", + "name": "fingerprints", + "system": false, + "type": "base", + "updateRule": "@request.auth.id != \"\" && system.users.id ?= @request.auth.id && @request.auth.role != \"readonly\"", + "viewRule": "@request.auth.id != \"\" && system.users.id ?= @request.auth.id" + }, + { + "createRule": null, + "deleteRule": null, + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "cascadeDelete": true, + "collectionId": "2hz5ncl8tizk5nx", + "hidden": false, + "id": "h9sg148r", + "maxSelect": 1, + "minSelect": 0, + "name": "system", + "presentable": false, + "required": true, + "system": false, + "type": "relation" + }, + { + "hidden": false, + "id": "azftn0be", + "maxSize": 2000000, + "name": "stats", + "presentable": false, + "required": true, + "system": false, + "type": "json" + }, + { + "hidden": false, + "id": "m1ekhli3", + "maxSelect": 1, + "name": "type", + "presentable": false, + "required": true, + "system": false, + "type": "select", + "values": [ + "1m", + "10m", + "20m", + "120m", + "480m" + ] + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "id": "ej9oowivz8b2mht", + "indexes": [ + "CREATE INDEX ` + "`" + `idx_GxIee0j` + "`" + ` ON ` + "`" + `system_stats` + "`" + ` (\n ` + "`" + `system` + "`" + `,\n ` + "`" + `type` + "`" + `,\n ` + "`" + `created` + "`" + `\n)" + ], + "listRule": "@request.auth.id != \"\"", + "name": "system_stats", + "system": false, + "type": "base", + "updateRule": null, + "viewRule": null + }, + { + "createRule": "@request.auth.id != \"\" && user.id = @request.auth.id", + "deleteRule": null, + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "cascadeDelete": true, + "collectionId": "_pb_users_auth_", + "hidden": false, + "id": "d5vztyxa", + "maxSelect": 1, + "minSelect": 0, + "name": "user", + "presentable": false, + "required": true, + "system": false, + "type": "relation" + }, + { + "hidden": false, + "id": "xcx4qgqq", + "maxSize": 2000000, + "name": "settings", + "presentable": false, + "required": false, + "system": false, + "type": "json" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "id": "4afacsdnlu8q8r2", + "indexes": [ + "CREATE UNIQUE INDEX ` + "`" + `idx_30Lwgf2` + "`" + ` ON ` + "`" + `user_settings` + "`" + ` (` + "`" + `user` + "`" + `)" + ], + "listRule": "@request.auth.id != \"\" && user.id = @request.auth.id", + "name": "user_settings", + "system": false, + "type": "base", + "updateRule": "@request.auth.id != \"\" && user.id = @request.auth.id", + "viewRule": null + }, + { + "createRule": "@request.auth.id != \"\" && users.id ?= @request.auth.id && @request.auth.role != \"readonly\"", + "deleteRule": "@request.auth.id != \"\" && users.id ?= @request.auth.id && @request.auth.role != \"readonly\"", + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "7xloxkwk", + "max": 0, + "min": 0, + "name": "name", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "waj7seaf", + "maxSelect": 1, + "name": "status", + "presentable": false, + "required": false, + "system": false, + "type": "select", + "values": [ + "up", + "down", + "paused", + "pending" + ] + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "ve781smf", + "max": 0, + "min": 0, + "name": "host", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "pij0k2jk", + "max": 0, + "min": 0, + "name": "port", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "qoq64ntl", + "maxSize": 2000000, + "name": "info", + "presentable": false, + "required": false, + "system": false, + "type": "json" + }, + { + "cascadeDelete": true, + "collectionId": "_pb_users_auth_", + "hidden": false, + "id": "jcarjnjj", + "maxSelect": 2147483647, + "minSelect": 0, + "name": "users", + "presentable": false, + "required": true, + "system": false, + "type": "relation" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1585300463", + "max": 0, + "min": 0, + "name": "auto_container_alias", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "id": "2hz5ncl8tizk5nx", + "indexes": [ + "CREATE INDEX ` + "`" + `idx_systems_status` + "`" + ` ON ` + "`" + `systems` + "`" + ` (` + "`" + `status` + "`" + `)" + ], + "listRule": "@request.auth.id != \"\" && users.id ?= @request.auth.id", + "name": "systems", + "system": false, + "type": "base", + "updateRule": "@request.auth.id != \"\" && users.id ?= @request.auth.id && @request.auth.role != \"readonly\"", + "viewRule": "@request.auth.id != \"\" && users.id ?= @request.auth.id" + }, + { + "createRule": null, + "deleteRule": null, + "fields": [ + { + "autogeneratePattern": "[a-f0-9]{6}", + "hidden": false, + "id": "text3208210256", + "max": 12, + "min": 6, + "name": "id", + "pattern": "^[a-f0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "cascadeDelete": false, + "collectionId": "2hz5ncl8tizk5nx", + "hidden": false, + "id": "relation3377271179", + "maxSelect": 1, + "minSelect": 0, + "name": "system", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1579384326", + "max": 0, + "min": 0, + "name": "name", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text2063623452", + "max": 0, + "min": 0, + "name": "status", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "number3470402323", + "max": null, + "min": null, + "name": "health", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + }, + { + "hidden": false, + "id": "number3128971310", + "max": 100, + "min": 0, + "name": "cpu", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + }, + { + "hidden": false, + "id": "number3933025333", + "max": null, + "min": 0, + "name": "memory", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + }, + { + "hidden": false, + "id": "number4075427327", + "max": null, + "min": null, + "name": "net", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + }, + { + "hidden": false, + "id": "number3332085495", + "max": null, + "min": null, + "name": "updated", + "onlyInt": true, + "presentable": false, + "required": true, + "system": false, + "type": "number" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text3309110367", + "max": 0, + "min": 0, + "name": "image", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text3781979028", + "max": 0, + "min": 0, + "name": "alias", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + } + ], + "id": "pbc_1864144027", + "indexes": [ + "CREATE INDEX ` + "`" + `idx_JxWirjdhyO` + "`" + ` ON ` + "`" + `containers` + "`" + ` (` + "`" + `updated` + "`" + `)", + "CREATE INDEX ` + "`" + `idx_r3Ja0rs102` + "`" + ` ON ` + "`" + `containers` + "`" + ` (` + "`" + `system` + "`" + `)" + ], + "listRule": "@request.auth.id != \"\" && system.users.id ?= @request.auth.id", + "name": "containers", + "system": false, + "type": "base", + "updateRule": "@request.auth.id != \"\" && system.users.id ?= @request.auth.id && @request.auth.role != \"readonly\"", + "viewRule": null + }, + { + "createRule": null, + "deleteRule": null, + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{10}", + "hidden": false, + "id": "text3208210256", + "max": 10, + "min": 6, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1579384326", + "max": 0, + "min": 0, + "name": "name", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "cascadeDelete": true, + "collectionId": "2hz5ncl8tizk5nx", + "hidden": false, + "id": "relation3377271179", + "maxSelect": 1, + "minSelect": 0, + "name": "system", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + }, + { + "hidden": false, + "id": "number2063623452", + "max": null, + "min": null, + "name": "state", + "onlyInt": true, + "presentable": false, + "required": false, + "system": false, + "type": "number" + }, + { + "hidden": false, + "id": "number1476559580", + "max": null, + "min": null, + "name": "sub", + "onlyInt": true, + "presentable": false, + "required": false, + "system": false, + "type": "number" + }, + { + "hidden": false, + "id": "number3128971310", + "max": null, + "min": null, + "name": "cpu", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + }, + { + "hidden": false, + "id": "number1052053287", + "max": null, + "min": null, + "name": "cpuPeak", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + }, + { + "hidden": false, + "id": "number3933025333", + "max": null, + "min": null, + "name": "memory", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + }, + { + "hidden": false, + "id": "number1828797201", + "max": null, + "min": null, + "name": "memPeak", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + }, + { + "hidden": false, + "id": "number3332085495", + "max": null, + "min": null, + "name": "updated", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + } + ], + "id": "pbc_3494996990", + "indexes": [ + "CREATE INDEX ` + "`" + `idx_4Z7LuLNdQb` + "`" + ` ON ` + "`" + `systemd_services` + "`" + ` (` + "`" + `system` + "`" + `)", + "CREATE INDEX ` + "`" + `idx_pBp1fF837e` + "`" + ` ON ` + "`" + `systemd_services` + "`" + ` (` + "`" + `updated` + "`" + `)" + ], + "listRule": "@request.auth.id != \"\" && system.users.id ?= @request.auth.id", + "name": "systemd_services", + "system": false, + "type": "base", + "updateRule": null, + "viewRule": null + }, + { + "createRule": "@request.auth.id != \"\" && user.id = @request.auth.id", + "deleteRule": "@request.auth.id != \"\" && user.id = @request.auth.id", + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{10}", + "hidden": false, + "id": "text3208210256", + "max": 10, + "min": 10, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "cascadeDelete": true, + "collectionId": "_pb_users_auth_", + "hidden": false, + "id": "relation2375276105", + "maxSelect": 1, + "minSelect": 0, + "name": "user", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + }, + { + "cascadeDelete": true, + "collectionId": "2hz5ncl8tizk5nx", + "hidden": false, + "id": "relation3377271179", + "maxSelect": 1, + "minSelect": 0, + "name": "system", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + }, + { + "hidden": false, + "id": "select2844932856", + "maxSelect": 1, + "name": "type", + "presentable": false, + "required": true, + "system": false, + "type": "select", + "values": [ + "one-time", + "daily" + ] + }, + { + "hidden": false, + "id": "date2675529103", + "max": "", + "min": "", + "name": "start", + "presentable": false, + "required": true, + "system": false, + "type": "date" + }, + { + "hidden": false, + "id": "date16528305", + "max": "", + "min": "", + "name": "end", + "presentable": false, + "required": true, + "system": false, + "type": "date" + } + ], + "id": "pbc_451525641", + "indexes": [ + "CREATE INDEX ` + "`" + `idx_q0iKnRP9v8` + "`" + ` ON ` + "`" + `quiet_hours` + "`" + ` (\n ` + "`" + `user` + "`" + `,\n ` + "`" + `system` + "`" + `\n)", + "CREATE INDEX ` + "`" + `idx_6T7ljT7FJd` + "`" + ` ON ` + "`" + `quiet_hours` + "`" + ` (\n ` + "`" + `type` + "`" + `,\n ` + "`" + `end` + "`" + `\n)" + ], + "listRule": "@request.auth.id != \"\" && user.id = @request.auth.id", + "name": "quiet_hours", + "system": false, + "type": "base", + "updateRule": "@request.auth.id != \"\" && user.id = @request.auth.id", + "viewRule": "@request.auth.id != \"\" && user.id = @request.auth.id" + }, + { + "createRule": null, + "deleteRule": "@request.auth.id != \"\" && system.users.id ?= @request.auth.id && @request.auth.role != \"readonly\"", + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{10}", + "hidden": false, + "id": "text3208210256", + "max": 10, + "min": 10, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "cascadeDelete": true, + "collectionId": "2hz5ncl8tizk5nx", + "hidden": false, + "id": "relation3377271179", + "maxSelect": 1, + "minSelect": 0, + "name": "system", + "presentable": false, + "required": true, + "system": false, + "type": "relation" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1579384326", + "max": 0, + "min": 0, + "name": "name", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text3616895705", + "max": 0, + "min": 0, + "name": "model", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text2744374011", + "max": 0, + "min": 0, + "name": "state", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "number3051925876", + "max": null, + "min": null, + "name": "capacity", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + }, + { + "hidden": false, + "id": "number190023114", + "max": null, + "min": null, + "name": "temp", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text3589068740", + "max": 0, + "min": 0, + "name": "firmware", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text3547646428", + "max": 0, + "min": 0, + "name": "serial", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text2363381545", + "max": 0, + "min": 0, + "name": "type", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "number1234567890", + "max": null, + "min": null, + "name": "hours", + "onlyInt": true, + "presentable": false, + "required": false, + "system": false, + "type": "number" + }, + { + "hidden": false, + "id": "number0987654321", + "max": null, + "min": null, + "name": "cycles", + "onlyInt": true, + "presentable": false, + "required": false, + "system": false, + "type": "number" + }, + { + "hidden": false, + "id": "json832282224", + "maxSize": 0, + "name": "attributes", + "presentable": false, + "required": false, + "system": false, + "type": "json" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "id": "pbc_2571630677", + "indexes": [ + "CREATE INDEX ` + "`" + `idx_DZ9yhvgl44` + "`" + ` ON ` + "`" + `smart_devices` + "`" + ` (` + "`" + `system` + "`" + `)" + ], + "listRule": "@request.auth.id != \"\" && system.users.id ?= @request.auth.id", + "name": "smart_devices", + "system": false, + "type": "base", + "updateRule": null, + "viewRule": "@request.auth.id != \"\" && system.users.id ?= @request.auth.id" + }, + { + "createRule": "", + "deleteRule": "", + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "cascadeDelete": true, + "collectionId": "2hz5ncl8tizk5nx", + "hidden": false, + "id": "relation3377271179", + "maxSelect": 1, + "minSelect": 0, + "name": "system", + "presentable": false, + "required": true, + "system": false, + "type": "relation" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text3847340049", + "max": 0, + "min": 0, + "name": "hostname", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "number1789936913", + "max": null, + "min": null, + "name": "os", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text2818598173", + "max": 0, + "min": 0, + "name": "os_name", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1574083243", + "max": 0, + "min": 0, + "name": "kernel", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text3128971310", + "max": 0, + "min": 0, + "name": "cpu", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text4161937994", + "max": 0, + "min": 0, + "name": "arch", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "number4245036687", + "max": null, + "min": null, + "name": "cores", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + }, + { + "hidden": false, + "id": "number1871592925", + "max": null, + "min": null, + "name": "threads", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + }, + { + "hidden": false, + "id": "number3933025333", + "max": null, + "min": null, + "name": "memory", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + }, + { + "hidden": false, + "id": "bool2200265312", + "name": "podman", + "presentable": false, + "required": false, + "system": false, + "type": "bool" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "id": "pbc_3116237454", + "indexes": [], + "listRule": "@request.auth.id != \"\" && system.users.id ?= @request.auth.id", + "name": "system_details", + "system": false, + "type": "base", + "updateRule": "", + "viewRule": "@request.auth.id != \"\" && system.users.id ?= @request.auth.id" + }, + { + "createRule": null, + "deleteRule": null, + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{10}", + "hidden": false, + "id": "text3208210256", + "max": 10, + "min": 10, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "cascadeDelete": true, + "collectionId": "_pb_users_auth_", + "hidden": false, + "id": "relation2375276105", + "maxSelect": 1, + "minSelect": 0, + "name": "user", + "presentable": false, + "required": true, + "system": false, + "type": "relation" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1597481275", + "max": 0, + "min": 0, + "name": "token", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "id": "pbc_3383022248", + "indexes": [ + "CREATE INDEX ` + "`" + `idx_iaD9Y2Lgbl` + "`" + ` ON ` + "`" + `universal_tokens` + "`" + ` (` + "`" + `token` + "`" + `)", + "CREATE UNIQUE INDEX ` + "`" + `idx_wdR0A4PbRG` + "`" + ` ON ` + "`" + `universal_tokens` + "`" + ` (` + "`" + `user` + "`" + `)" + ], + "listRule": null, + "name": "universal_tokens", + "system": false, + "type": "base", + "updateRule": null, + "viewRule": null + } + ]` + + return app.ImportCollectionsByMarshaledJSON([]byte(jsonData), false) + }, func(app core.App) error { + return nil + }) +} diff --git a/internal/migrations/1771782981_updated_containers.go b/internal/migrations/1771782981_updated_containers.go deleted file mode 100644 index 0ed303889..000000000 --- a/internal/migrations/1771782981_updated_containers.go +++ /dev/null @@ -1,45 +0,0 @@ -package migrations - -import ( - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" -) - -func init() { - m.Register(func(app core.App) error { - collection, err := app.FindCollectionByNameOrId("pbc_1864144027") - if err != nil { - return err - } - - // add field - if err := collection.Fields.AddMarshaledJSONAt(10, []byte(`{ - "autogeneratePattern": "", - "hidden": false, - "id": "text3781979028", - "max": 0, - "min": 0, - "name": "alias", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }`)); err != nil { - return err - } - - return app.Save(collection) - }, func(app core.App) error { - collection, err := app.FindCollectionByNameOrId("pbc_1864144027") - if err != nil { - return err - } - - // remove field - collection.Fields.RemoveById("text3781979028") - - return app.Save(collection) - }) -} diff --git a/internal/migrations/1771869000_add_auto_container_alias_to_systems.go b/internal/migrations/1771869000_add_auto_container_alias_to_systems.go deleted file mode 100644 index 66282a853..000000000 --- a/internal/migrations/1771869000_add_auto_container_alias_to_systems.go +++ /dev/null @@ -1,43 +0,0 @@ -package migrations - -import ( - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" -) - -func init() { - m.Register(func(app core.App) error { - collection, err := app.FindCollectionByNameOrId("systems") - if err != nil { - return err - } - - if err := collection.Fields.AddMarshaledJSONAt(7, []byte(`{ - "autogeneratePattern": "", - "hidden": false, - "id": "text1585300463", - "max": 0, - "min": 0, - "name": "auto_container_alias", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }`)); err != nil { - return err - } - - return app.Save(collection) - }, func(app core.App) error { - collection, err := app.FindCollectionByNameOrId("systems") - if err != nil { - return err - } - - collection.Fields.RemoveById("text1585300463") - - return app.Save(collection) - }) -} From b4bf4fd24db79e968427dc6e8b0f7ce75344f1df Mon Sep 17 00:00:00 2001 From: ErnestoMuniz Date: Thu, 26 Feb 2026 14:55:20 -0300 Subject: [PATCH 4/4] fix: Remove forgotten printf --- agent/docker.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/agent/docker.go b/agent/docker.go index eaae263b2..bf48fb7a1 100644 --- a/agent/docker.go +++ b/agent/docker.go @@ -402,8 +402,6 @@ func (dm *dockerManager) updateContainerStats(ctr *container.ApiInfo, cacheTimeM dm.containerStatsMap[ctr.IdShort] = stats } - fmt.Printf("opa - %+v\n", ctr) - stats.Id = ctr.IdShort stats.Name = name stats.Image = ctr.Image