From dace78214a518e154795436e619e80767d87b207 Mon Sep 17 00:00:00 2001 From: Jonatan <190036+jcastro@users.noreply.github.com> Date: Sat, 17 Oct 2026 15:08:53 +0200 Subject: [PATCH 1/4] docs: review Monitor documentation in all seven translations --- .github/workflows/test-i18n.yml | 10 + .../docs/monitor/access-auth/page.tsx | 8 +- .../docs/monitor/integrations/page.tsx | 10 +- web/messages/de/docs/monitor/access-auth.json | 396 +++++++++ .../de/docs/monitor/ai-assistant.json | 342 ++++++++ .../de/docs/monitor/api-reference.json | 760 ++++++++++++++++++ .../de/docs/monitor/architecture.json | 303 +++++++ .../docs/monitor/audit-report/assessment.json | 218 +++++ .../de/docs/monitor/audit-report/changes.json | 208 +++++ .../de/docs/monitor/audit-report/index.json | 136 ++++ .../de/docs/monitor/audit-report/policy.json | 111 +++ .../de/docs/monitor/audit-report/reports.json | 247 ++++++ .../de/docs/monitor/audit-report/scope.json | 115 +++ .../de/docs/monitor/dashboard/apps.json | 174 ++++ .../de/docs/monitor/dashboard/hardware.json | 248 ++++++ .../de/docs/monitor/dashboard/index.json | 101 +++ .../de/docs/monitor/dashboard/network.json | 251 ++++++ .../de/docs/monitor/dashboard/security.json | 246 ++++++ .../de/docs/monitor/dashboard/settings.json | 367 +++++++++ .../de/docs/monitor/dashboard/storage.json | 268 ++++++ .../docs/monitor/dashboard/system-logs.json | 120 +++ .../monitor/dashboard/system-overview.json | 177 ++++ .../de/docs/monitor/dashboard/terminal.json | 174 ++++ .../docs/monitor/dashboard/vms-lxcs-app.json | 245 ++++++ .../monitor/dashboard/vms-lxcs-updates.json | 203 +++++ .../de/docs/monitor/dashboard/vms-lxcs.json | 244 ++++++ .../de/docs/monitor/health-monitor.json | 372 +++++++++ web/messages/de/docs/monitor/index.json | 151 ++++ .../de/docs/monitor/integrations.json | 255 ++++++ .../de/docs/monitor/notifications.json | 535 ++++++++++++ web/messages/en/docs/monitor/access-auth.json | 60 +- .../en/docs/monitor/ai-assistant.json | 60 +- .../en/docs/monitor/api-reference.json | 70 +- .../en/docs/monitor/architecture.json | 66 +- .../en/docs/monitor/dashboard/hardware.json | 4 +- .../en/docs/monitor/dashboard/network.json | 18 +- .../en/docs/monitor/dashboard/security.json | 16 +- .../en/docs/monitor/dashboard/settings.json | 56 +- .../en/docs/monitor/dashboard/storage.json | 34 +- .../docs/monitor/dashboard/system-logs.json | 2 +- .../monitor/dashboard/system-overview.json | 12 +- .../en/docs/monitor/dashboard/terminal.json | 4 +- .../en/docs/monitor/dashboard/vms-lxcs.json | 8 +- .../en/docs/monitor/health-monitor.json | 44 +- web/messages/en/docs/monitor/index.json | 10 +- .../en/docs/monitor/integrations.json | 40 +- .../en/docs/monitor/notifications.json | 72 +- web/messages/es/docs/monitor/access-auth.json | 122 +-- .../es/docs/monitor/ai-assistant.json | 92 +-- .../es/docs/monitor/api-reference.json | 248 +++--- .../es/docs/monitor/architecture.json | 182 ++--- .../docs/monitor/audit-report/assessment.json | 130 ++- .../es/docs/monitor/audit-report/changes.json | 122 ++- .../es/docs/monitor/audit-report/index.json | 91 ++- .../es/docs/monitor/audit-report/policy.json | 50 +- .../es/docs/monitor/audit-report/reports.json | 157 +++- .../es/docs/monitor/audit-report/scope.json | 40 +- .../es/docs/monitor/dashboard/apps.json | 97 ++- .../es/docs/monitor/dashboard/hardware.json | 154 ++-- .../es/docs/monitor/dashboard/index.json | 36 +- .../es/docs/monitor/dashboard/network.json | 184 ++--- .../es/docs/monitor/dashboard/security.json | 242 +++--- .../es/docs/monitor/dashboard/settings.json | 310 +++---- .../es/docs/monitor/dashboard/storage.json | 272 +++---- .../docs/monitor/dashboard/system-logs.json | 56 +- .../monitor/dashboard/system-overview.json | 102 +-- .../es/docs/monitor/dashboard/terminal.json | 100 +-- .../docs/monitor/dashboard/vms-lxcs-app.json | 113 ++- .../monitor/dashboard/vms-lxcs-updates.json | 18 +- .../es/docs/monitor/dashboard/vms-lxcs.json | 174 ++-- .../es/docs/monitor/health-monitor.json | 106 +-- web/messages/es/docs/monitor/index.json | 46 +- .../es/docs/monitor/integrations.json | 86 +- .../es/docs/monitor/notifications.json | 308 +++---- web/messages/fr/docs/monitor/access-auth.json | 396 +++++++++ .../fr/docs/monitor/ai-assistant.json | 342 ++++++++ .../fr/docs/monitor/api-reference.json | 760 ++++++++++++++++++ .../fr/docs/monitor/architecture.json | 303 +++++++ .../docs/monitor/audit-report/assessment.json | 218 +++++ .../fr/docs/monitor/audit-report/changes.json | 208 +++++ .../fr/docs/monitor/audit-report/index.json | 136 ++++ .../fr/docs/monitor/audit-report/policy.json | 111 +++ .../fr/docs/monitor/audit-report/reports.json | 247 ++++++ .../fr/docs/monitor/audit-report/scope.json | 115 +++ .../fr/docs/monitor/dashboard/apps.json | 174 ++++ .../fr/docs/monitor/dashboard/hardware.json | 248 ++++++ .../fr/docs/monitor/dashboard/index.json | 101 +++ .../fr/docs/monitor/dashboard/network.json | 251 ++++++ .../fr/docs/monitor/dashboard/security.json | 246 ++++++ .../fr/docs/monitor/dashboard/settings.json | 367 +++++++++ .../fr/docs/monitor/dashboard/storage.json | 268 ++++++ .../docs/monitor/dashboard/system-logs.json | 120 +++ .../monitor/dashboard/system-overview.json | 177 ++++ .../fr/docs/monitor/dashboard/terminal.json | 174 ++++ .../docs/monitor/dashboard/vms-lxcs-app.json | 245 ++++++ .../monitor/dashboard/vms-lxcs-updates.json | 203 +++++ .../fr/docs/monitor/dashboard/vms-lxcs.json | 244 ++++++ .../fr/docs/monitor/health-monitor.json | 372 +++++++++ web/messages/fr/docs/monitor/index.json | 151 ++++ .../fr/docs/monitor/integrations.json | 255 ++++++ .../fr/docs/monitor/notifications.json | 535 ++++++++++++ web/messages/it/docs/monitor/access-auth.json | 396 +++++++++ .../it/docs/monitor/ai-assistant.json | 342 ++++++++ .../it/docs/monitor/api-reference.json | 760 ++++++++++++++++++ .../it/docs/monitor/architecture.json | 303 +++++++ .../docs/monitor/audit-report/assessment.json | 218 +++++ .../it/docs/monitor/audit-report/changes.json | 208 +++++ .../it/docs/monitor/audit-report/index.json | 136 ++++ .../it/docs/monitor/audit-report/policy.json | 111 +++ .../it/docs/monitor/audit-report/reports.json | 247 ++++++ .../it/docs/monitor/audit-report/scope.json | 115 +++ .../it/docs/monitor/dashboard/apps.json | 174 ++++ .../it/docs/monitor/dashboard/hardware.json | 248 ++++++ .../it/docs/monitor/dashboard/index.json | 101 +++ .../it/docs/monitor/dashboard/network.json | 251 ++++++ .../it/docs/monitor/dashboard/security.json | 246 ++++++ .../it/docs/monitor/dashboard/settings.json | 367 +++++++++ .../it/docs/monitor/dashboard/storage.json | 268 ++++++ .../docs/monitor/dashboard/system-logs.json | 120 +++ .../monitor/dashboard/system-overview.json | 177 ++++ .../it/docs/monitor/dashboard/terminal.json | 174 ++++ .../docs/monitor/dashboard/vms-lxcs-app.json | 245 ++++++ .../monitor/dashboard/vms-lxcs-updates.json | 203 +++++ .../it/docs/monitor/dashboard/vms-lxcs.json | 244 ++++++ .../it/docs/monitor/health-monitor.json | 372 +++++++++ web/messages/it/docs/monitor/index.json | 151 ++++ .../it/docs/monitor/integrations.json | 255 ++++++ .../it/docs/monitor/notifications.json | 535 ++++++++++++ web/messages/pt/docs/monitor/access-auth.json | 396 +++++++++ .../pt/docs/monitor/ai-assistant.json | 342 ++++++++ .../pt/docs/monitor/api-reference.json | 760 ++++++++++++++++++ .../pt/docs/monitor/architecture.json | 303 +++++++ .../docs/monitor/audit-report/assessment.json | 218 +++++ .../pt/docs/monitor/audit-report/changes.json | 208 +++++ .../pt/docs/monitor/audit-report/index.json | 136 ++++ .../pt/docs/monitor/audit-report/policy.json | 111 +++ .../pt/docs/monitor/audit-report/reports.json | 247 ++++++ .../pt/docs/monitor/audit-report/scope.json | 115 +++ .../pt/docs/monitor/dashboard/apps.json | 174 ++++ .../pt/docs/monitor/dashboard/hardware.json | 248 ++++++ .../pt/docs/monitor/dashboard/index.json | 101 +++ .../pt/docs/monitor/dashboard/network.json | 251 ++++++ .../pt/docs/monitor/dashboard/security.json | 246 ++++++ .../pt/docs/monitor/dashboard/settings.json | 367 +++++++++ .../pt/docs/monitor/dashboard/storage.json | 268 ++++++ .../docs/monitor/dashboard/system-logs.json | 120 +++ .../monitor/dashboard/system-overview.json | 177 ++++ .../pt/docs/monitor/dashboard/terminal.json | 174 ++++ .../docs/monitor/dashboard/vms-lxcs-app.json | 245 ++++++ .../monitor/dashboard/vms-lxcs-updates.json | 203 +++++ .../pt/docs/monitor/dashboard/vms-lxcs.json | 244 ++++++ .../pt/docs/monitor/health-monitor.json | 372 +++++++++ web/messages/pt/docs/monitor/index.json | 151 ++++ .../pt/docs/monitor/integrations.json | 255 ++++++ .../pt/docs/monitor/notifications.json | 535 ++++++++++++ web/messages/sk/docs/monitor/access-auth.json | 396 +++++++++ .../sk/docs/monitor/ai-assistant.json | 342 ++++++++ .../sk/docs/monitor/api-reference.json | 760 ++++++++++++++++++ .../sk/docs/monitor/architecture.json | 303 +++++++ .../docs/monitor/audit-report/assessment.json | 218 +++++ .../sk/docs/monitor/audit-report/changes.json | 208 +++++ .../sk/docs/monitor/audit-report/index.json | 136 ++++ .../sk/docs/monitor/audit-report/policy.json | 111 +++ .../sk/docs/monitor/audit-report/reports.json | 247 ++++++ .../sk/docs/monitor/audit-report/scope.json | 115 +++ .../sk/docs/monitor/dashboard/apps.json | 174 ++++ .../sk/docs/monitor/dashboard/hardware.json | 248 ++++++ .../sk/docs/monitor/dashboard/index.json | 101 +++ .../sk/docs/monitor/dashboard/network.json | 251 ++++++ .../sk/docs/monitor/dashboard/security.json | 246 ++++++ .../sk/docs/monitor/dashboard/settings.json | 367 +++++++++ .../sk/docs/monitor/dashboard/storage.json | 268 ++++++ .../docs/monitor/dashboard/system-logs.json | 120 +++ .../monitor/dashboard/system-overview.json | 177 ++++ .../sk/docs/monitor/dashboard/terminal.json | 174 ++++ .../docs/monitor/dashboard/vms-lxcs-app.json | 108 ++- .../monitor/dashboard/vms-lxcs-updates.json | 26 +- .../sk/docs/monitor/dashboard/vms-lxcs.json | 244 ++++++ .../sk/docs/monitor/health-monitor.json | 372 +++++++++ web/messages/sk/docs/monitor/index.json | 151 ++++ .../sk/docs/monitor/integrations.json | 255 ++++++ .../sk/docs/monitor/notifications.json | 535 ++++++++++++ web/messages/sv/docs/monitor/access-auth.json | 396 +++++++++ .../sv/docs/monitor/ai-assistant.json | 342 ++++++++ .../sv/docs/monitor/api-reference.json | 760 ++++++++++++++++++ .../sv/docs/monitor/architecture.json | 303 +++++++ .../docs/monitor/audit-report/assessment.json | 218 +++++ .../sv/docs/monitor/audit-report/changes.json | 208 +++++ .../sv/docs/monitor/audit-report/index.json | 136 ++++ .../sv/docs/monitor/audit-report/policy.json | 111 +++ .../sv/docs/monitor/audit-report/reports.json | 247 ++++++ .../sv/docs/monitor/audit-report/scope.json | 115 +++ .../sv/docs/monitor/dashboard/apps.json | 174 ++++ .../sv/docs/monitor/dashboard/hardware.json | 248 ++++++ .../sv/docs/monitor/dashboard/index.json | 101 +++ .../sv/docs/monitor/dashboard/network.json | 251 ++++++ .../sv/docs/monitor/dashboard/security.json | 246 ++++++ .../sv/docs/monitor/dashboard/settings.json | 367 +++++++++ .../sv/docs/monitor/dashboard/storage.json | 268 ++++++ .../docs/monitor/dashboard/system-logs.json | 120 +++ .../monitor/dashboard/system-overview.json | 177 ++++ .../sv/docs/monitor/dashboard/terminal.json | 174 ++++ .../docs/monitor/dashboard/vms-lxcs-app.json | 245 ++++++ .../monitor/dashboard/vms-lxcs-updates.json | 203 +++++ .../sv/docs/monitor/dashboard/vms-lxcs.json | 244 ++++++ .../sv/docs/monitor/health-monitor.json | 372 +++++++++ web/messages/sv/docs/monitor/index.json | 151 ++++ .../sv/docs/monitor/integrations.json | 255 ++++++ .../sv/docs/monitor/notifications.json | 535 ++++++++++++ 209 files changed, 43788 insertions(+), 1942 deletions(-) create mode 100644 web/messages/de/docs/monitor/access-auth.json create mode 100644 web/messages/de/docs/monitor/ai-assistant.json create mode 100644 web/messages/de/docs/monitor/api-reference.json create mode 100644 web/messages/de/docs/monitor/architecture.json create mode 100644 web/messages/de/docs/monitor/audit-report/assessment.json create mode 100644 web/messages/de/docs/monitor/audit-report/changes.json create mode 100644 web/messages/de/docs/monitor/audit-report/index.json create mode 100644 web/messages/de/docs/monitor/audit-report/policy.json create mode 100644 web/messages/de/docs/monitor/audit-report/reports.json create mode 100644 web/messages/de/docs/monitor/audit-report/scope.json create mode 100644 web/messages/de/docs/monitor/dashboard/apps.json create mode 100644 web/messages/de/docs/monitor/dashboard/hardware.json create mode 100644 web/messages/de/docs/monitor/dashboard/index.json create mode 100644 web/messages/de/docs/monitor/dashboard/network.json create mode 100644 web/messages/de/docs/monitor/dashboard/security.json create mode 100644 web/messages/de/docs/monitor/dashboard/settings.json create mode 100644 web/messages/de/docs/monitor/dashboard/storage.json create mode 100644 web/messages/de/docs/monitor/dashboard/system-logs.json create mode 100644 web/messages/de/docs/monitor/dashboard/system-overview.json create mode 100644 web/messages/de/docs/monitor/dashboard/terminal.json create mode 100644 web/messages/de/docs/monitor/dashboard/vms-lxcs-app.json create mode 100644 web/messages/de/docs/monitor/dashboard/vms-lxcs-updates.json create mode 100644 web/messages/de/docs/monitor/dashboard/vms-lxcs.json create mode 100644 web/messages/de/docs/monitor/health-monitor.json create mode 100644 web/messages/de/docs/monitor/index.json create mode 100644 web/messages/de/docs/monitor/integrations.json create mode 100644 web/messages/de/docs/monitor/notifications.json create mode 100644 web/messages/fr/docs/monitor/access-auth.json create mode 100644 web/messages/fr/docs/monitor/ai-assistant.json create mode 100644 web/messages/fr/docs/monitor/api-reference.json create mode 100644 web/messages/fr/docs/monitor/architecture.json create mode 100644 web/messages/fr/docs/monitor/audit-report/assessment.json create mode 100644 web/messages/fr/docs/monitor/audit-report/changes.json create mode 100644 web/messages/fr/docs/monitor/audit-report/index.json create mode 100644 web/messages/fr/docs/monitor/audit-report/policy.json create mode 100644 web/messages/fr/docs/monitor/audit-report/reports.json create mode 100644 web/messages/fr/docs/monitor/audit-report/scope.json create mode 100644 web/messages/fr/docs/monitor/dashboard/apps.json create mode 100644 web/messages/fr/docs/monitor/dashboard/hardware.json create mode 100644 web/messages/fr/docs/monitor/dashboard/index.json create mode 100644 web/messages/fr/docs/monitor/dashboard/network.json create mode 100644 web/messages/fr/docs/monitor/dashboard/security.json create mode 100644 web/messages/fr/docs/monitor/dashboard/settings.json create mode 100644 web/messages/fr/docs/monitor/dashboard/storage.json create mode 100644 web/messages/fr/docs/monitor/dashboard/system-logs.json create mode 100644 web/messages/fr/docs/monitor/dashboard/system-overview.json create mode 100644 web/messages/fr/docs/monitor/dashboard/terminal.json create mode 100644 web/messages/fr/docs/monitor/dashboard/vms-lxcs-app.json create mode 100644 web/messages/fr/docs/monitor/dashboard/vms-lxcs-updates.json create mode 100644 web/messages/fr/docs/monitor/dashboard/vms-lxcs.json create mode 100644 web/messages/fr/docs/monitor/health-monitor.json create mode 100644 web/messages/fr/docs/monitor/index.json create mode 100644 web/messages/fr/docs/monitor/integrations.json create mode 100644 web/messages/fr/docs/monitor/notifications.json create mode 100644 web/messages/it/docs/monitor/access-auth.json create mode 100644 web/messages/it/docs/monitor/ai-assistant.json create mode 100644 web/messages/it/docs/monitor/api-reference.json create mode 100644 web/messages/it/docs/monitor/architecture.json create mode 100644 web/messages/it/docs/monitor/audit-report/assessment.json create mode 100644 web/messages/it/docs/monitor/audit-report/changes.json create mode 100644 web/messages/it/docs/monitor/audit-report/index.json create mode 100644 web/messages/it/docs/monitor/audit-report/policy.json create mode 100644 web/messages/it/docs/monitor/audit-report/reports.json create mode 100644 web/messages/it/docs/monitor/audit-report/scope.json create mode 100644 web/messages/it/docs/monitor/dashboard/apps.json create mode 100644 web/messages/it/docs/monitor/dashboard/hardware.json create mode 100644 web/messages/it/docs/monitor/dashboard/index.json create mode 100644 web/messages/it/docs/monitor/dashboard/network.json create mode 100644 web/messages/it/docs/monitor/dashboard/security.json create mode 100644 web/messages/it/docs/monitor/dashboard/settings.json create mode 100644 web/messages/it/docs/monitor/dashboard/storage.json create mode 100644 web/messages/it/docs/monitor/dashboard/system-logs.json create mode 100644 web/messages/it/docs/monitor/dashboard/system-overview.json create mode 100644 web/messages/it/docs/monitor/dashboard/terminal.json create mode 100644 web/messages/it/docs/monitor/dashboard/vms-lxcs-app.json create mode 100644 web/messages/it/docs/monitor/dashboard/vms-lxcs-updates.json create mode 100644 web/messages/it/docs/monitor/dashboard/vms-lxcs.json create mode 100644 web/messages/it/docs/monitor/health-monitor.json create mode 100644 web/messages/it/docs/monitor/index.json create mode 100644 web/messages/it/docs/monitor/integrations.json create mode 100644 web/messages/it/docs/monitor/notifications.json create mode 100644 web/messages/pt/docs/monitor/access-auth.json create mode 100644 web/messages/pt/docs/monitor/ai-assistant.json create mode 100644 web/messages/pt/docs/monitor/api-reference.json create mode 100644 web/messages/pt/docs/monitor/architecture.json create mode 100644 web/messages/pt/docs/monitor/audit-report/assessment.json create mode 100644 web/messages/pt/docs/monitor/audit-report/changes.json create mode 100644 web/messages/pt/docs/monitor/audit-report/index.json create mode 100644 web/messages/pt/docs/monitor/audit-report/policy.json create mode 100644 web/messages/pt/docs/monitor/audit-report/reports.json create mode 100644 web/messages/pt/docs/monitor/audit-report/scope.json create mode 100644 web/messages/pt/docs/monitor/dashboard/apps.json create mode 100644 web/messages/pt/docs/monitor/dashboard/hardware.json create mode 100644 web/messages/pt/docs/monitor/dashboard/index.json create mode 100644 web/messages/pt/docs/monitor/dashboard/network.json create mode 100644 web/messages/pt/docs/monitor/dashboard/security.json create mode 100644 web/messages/pt/docs/monitor/dashboard/settings.json create mode 100644 web/messages/pt/docs/monitor/dashboard/storage.json create mode 100644 web/messages/pt/docs/monitor/dashboard/system-logs.json create mode 100644 web/messages/pt/docs/monitor/dashboard/system-overview.json create mode 100644 web/messages/pt/docs/monitor/dashboard/terminal.json create mode 100644 web/messages/pt/docs/monitor/dashboard/vms-lxcs-app.json create mode 100644 web/messages/pt/docs/monitor/dashboard/vms-lxcs-updates.json create mode 100644 web/messages/pt/docs/monitor/dashboard/vms-lxcs.json create mode 100644 web/messages/pt/docs/monitor/health-monitor.json create mode 100644 web/messages/pt/docs/monitor/index.json create mode 100644 web/messages/pt/docs/monitor/integrations.json create mode 100644 web/messages/pt/docs/monitor/notifications.json create mode 100644 web/messages/sk/docs/monitor/access-auth.json create mode 100644 web/messages/sk/docs/monitor/ai-assistant.json create mode 100644 web/messages/sk/docs/monitor/api-reference.json create mode 100644 web/messages/sk/docs/monitor/architecture.json create mode 100644 web/messages/sk/docs/monitor/audit-report/assessment.json create mode 100644 web/messages/sk/docs/monitor/audit-report/changes.json create mode 100644 web/messages/sk/docs/monitor/audit-report/index.json create mode 100644 web/messages/sk/docs/monitor/audit-report/policy.json create mode 100644 web/messages/sk/docs/monitor/audit-report/reports.json create mode 100644 web/messages/sk/docs/monitor/audit-report/scope.json create mode 100644 web/messages/sk/docs/monitor/dashboard/apps.json create mode 100644 web/messages/sk/docs/monitor/dashboard/hardware.json create mode 100644 web/messages/sk/docs/monitor/dashboard/index.json create mode 100644 web/messages/sk/docs/monitor/dashboard/network.json create mode 100644 web/messages/sk/docs/monitor/dashboard/security.json create mode 100644 web/messages/sk/docs/monitor/dashboard/settings.json create mode 100644 web/messages/sk/docs/monitor/dashboard/storage.json create mode 100644 web/messages/sk/docs/monitor/dashboard/system-logs.json create mode 100644 web/messages/sk/docs/monitor/dashboard/system-overview.json create mode 100644 web/messages/sk/docs/monitor/dashboard/terminal.json create mode 100644 web/messages/sk/docs/monitor/dashboard/vms-lxcs.json create mode 100644 web/messages/sk/docs/monitor/health-monitor.json create mode 100644 web/messages/sk/docs/monitor/index.json create mode 100644 web/messages/sk/docs/monitor/integrations.json create mode 100644 web/messages/sk/docs/monitor/notifications.json create mode 100644 web/messages/sv/docs/monitor/access-auth.json create mode 100644 web/messages/sv/docs/monitor/ai-assistant.json create mode 100644 web/messages/sv/docs/monitor/api-reference.json create mode 100644 web/messages/sv/docs/monitor/architecture.json create mode 100644 web/messages/sv/docs/monitor/audit-report/assessment.json create mode 100644 web/messages/sv/docs/monitor/audit-report/changes.json create mode 100644 web/messages/sv/docs/monitor/audit-report/index.json create mode 100644 web/messages/sv/docs/monitor/audit-report/policy.json create mode 100644 web/messages/sv/docs/monitor/audit-report/reports.json create mode 100644 web/messages/sv/docs/monitor/audit-report/scope.json create mode 100644 web/messages/sv/docs/monitor/dashboard/apps.json create mode 100644 web/messages/sv/docs/monitor/dashboard/hardware.json create mode 100644 web/messages/sv/docs/monitor/dashboard/index.json create mode 100644 web/messages/sv/docs/monitor/dashboard/network.json create mode 100644 web/messages/sv/docs/monitor/dashboard/security.json create mode 100644 web/messages/sv/docs/monitor/dashboard/settings.json create mode 100644 web/messages/sv/docs/monitor/dashboard/storage.json create mode 100644 web/messages/sv/docs/monitor/dashboard/system-logs.json create mode 100644 web/messages/sv/docs/monitor/dashboard/system-overview.json create mode 100644 web/messages/sv/docs/monitor/dashboard/terminal.json create mode 100644 web/messages/sv/docs/monitor/dashboard/vms-lxcs-app.json create mode 100644 web/messages/sv/docs/monitor/dashboard/vms-lxcs-updates.json create mode 100644 web/messages/sv/docs/monitor/dashboard/vms-lxcs.json create mode 100644 web/messages/sv/docs/monitor/health-monitor.json create mode 100644 web/messages/sv/docs/monitor/index.json create mode 100644 web/messages/sv/docs/monitor/integrations.json create mode 100644 web/messages/sv/docs/monitor/notifications.json diff --git a/.github/workflows/test-i18n.yml b/.github/workflows/test-i18n.yml index 2b3e4685..7f4dfb51 100644 --- a/.github/workflows/test-i18n.yml +++ b/.github/workflows/test-i18n.yml @@ -9,15 +9,20 @@ on: - 'AppImage/messages/**' - 'AppImage/lib/i18n/**' - 'AppImage/components/terminal-panel.tsx' + - 'web/**' - 'CONTRIBUTING.md' # Scheduler consumers and the offline extractor's .sh/.func inputs. - 'scripts/**/*.sh' - 'scripts/**/*.func' - 'scripts/**/*.py' - 'lang/*.json' + - 'menu' + - 'install_proxmenux.sh' + - 'install_proxmenux_beta.sh' - 'oci/src/**/*.py' - 'oci/catalog/**/*.json' - 'oci/remote/**/*.sh' + - 'oci/remote/**/*.py' push: branches: [main, develop] paths: @@ -27,15 +32,20 @@ on: - 'AppImage/messages/**' - 'AppImage/lib/i18n/**' - 'AppImage/components/terminal-panel.tsx' + - 'web/**' - 'CONTRIBUTING.md' # Scheduler consumers and the offline extractor's .sh/.func inputs. - 'scripts/**/*.sh' - 'scripts/**/*.func' - 'scripts/**/*.py' - 'lang/*.json' + - 'menu' + - 'install_proxmenux.sh' + - 'install_proxmenux_beta.sh' - 'oci/src/**/*.py' - 'oci/catalog/**/*.json' - 'oci/remote/**/*.sh' + - 'oci/remote/**/*.py' workflow_dispatch: permissions: diff --git a/web/app/[locale]/docs/monitor/access-auth/page.tsx b/web/app/[locale]/docs/monitor/access-auth/page.tsx index ee2a4469..427bd543 100644 --- a/web/app/[locale]/docs/monitor/access-auth/page.tsx +++ b/web/app/[locale]/docs/monitor/access-auth/page.tsx @@ -643,11 +643,11 @@ labels: {t.rich("audit.intro", { code })}

diff --git a/web/app/[locale]/docs/monitor/integrations/page.tsx b/web/app/[locale]/docs/monitor/integrations/page.tsx index bbed0903..2b0cbb6c 100644 --- a/web/app/[locale]/docs/monitor/integrations/page.tsx +++ b/web/app/[locale]/docs/monitor/integrations/page.tsx @@ -580,7 +580,7 @@ template: - binary_sensor: - name: "ProxMenux Healthy" default_entity_id: binary_sensor.proxmenux_is_healthy - device_class: problem + device_class: connectivity delay_off: 30 state: "{{ states('sensor.proxmenux_health') == 'OK' }}" - name: "ProxMenux Critical" @@ -1087,12 +1087,12 @@ scrape_configs: @@ -1121,7 +1121,7 @@ curl -X POST http://proxmox.example.tld:8008/api/notifications/send \\ "event_type":"system_problem", "severity":"WARNING", "title":"Nightly rsync took 4h27m", - "body":"The nightly-rsync job exceeded the 2h alert threshold. Check the source storage.", + "message":"The nightly-rsync job exceeded the 2h alert threshold. Check the source storage.", "data":{ "service_name":"nightly-rsync", "hostname":"backup-host" diff --git a/web/messages/de/docs/monitor/access-auth.json b/web/messages/de/docs/monitor/access-auth.json new file mode 100644 index 00000000..c35012e4 --- /dev/null +++ b/web/messages/de/docs/monitor/access-auth.json @@ -0,0 +1,396 @@ +{ + "meta": { + "title": "Proxmox-Dashboard-Authentifizierung — 2FA, API-Tokens, Benutzerprofil, Reverse-Proxy | ProxMenux Monitor", + "description": "Zugriff und Schutz für ProxMenux Monitor: Ersteinrichtung, Passwort mit Anzeigename und Avatar, Profilseite, TOTP-2FA, langlebige API-Tokens, HTTPS, Beispiele für Nginx/Caddy/Traefik, Audit-Protokoll und optionale Fail2Ban-Jail.", + "ogTitle": "Proxmox-Dashboard-Authentifizierung — 2FA, API-Tokens, Reverse-Proxy", + "ogDescription": "ProxMenux Monitor mit Passwort, TOTP-2FA, langlebigen API-Tokens, HTTPS, Reverse-Proxy-Beispielen und optionaler Fail2Ban-Jail schützen.", + "twitterTitle": "Proxmox Dashboard-Authentifizierung | ProxMenux Monitor", + "twitterDescription": "Passwort + TOTP 2FA, API Token, HTTPS, Nginx/Caddy/Traefik Snippets und Audit Log." + }, + "header": { + "title": "Zugriff und Authentifizierung", + "description": "Dashboard-Zugriff, Ersteinrichtung und Schutzschichten: Passwort und TOTP, JWT-Sitzungen, langlebige API-Tokens, HTTPS, Reverse-Proxys, Secure Gateway und optionale Fail2Ban-Jail.", + "section": "ProxMenux-Monitor" + }, + "intro": { + "title": "Authentifizierung ist optional", + "body": "Beim ersten Start zeigt das Dashboard den Dialog „Dashboard schützen?“ mit den Schaltflächen Ja, Passwort einrichten und Nein, ohne Schutz fortfahren. Bei der zweiten Option bleiben die API-Endpunkte über TCP 8008 offen. Das kann für ein isoliertes Labor-LAN ausreichen, ist in anderen Umgebungen jedoch gefährlich. Die Zwei-Faktor-Authentifizierung (2FA) ist nicht Teil dieser ersten Auswahl; sie wird nach dem Einrichten eines Passworts unter Sicherheit konfiguriert." + }, + "reaching": { + "heading": "Dashboard öffnen", + "intro": "ProxMenux Monitor lauscht auf 0.0.0.0:8008. Drei übliche Zugriffswege:", + "outro": "Direktzugriff entspricht der Standard-systemd-Unit. Reverse-Proxy und Secure Gateway werden unten beschrieben. Client-IPs aus X-Forwarded-For werden nur mit PROXMENUX_TRUST_PROXY=1 und einem von Ihnen kontrollierten Proxy verwendet. X-Forwarded-Proto oder X-Forwarded-Host allein aktivieren dieses Vertrauen nicht; das Frontend erstellt API-URLs aus dem Ursprung des Browsers." + }, + "firstLaunch": { + "heading": "Ablauf beim ersten Start", + "intro": "Beim ersten Öffnen ruft das Frontend GET /api/auth/status auf. Wurde die Authentifizierung noch nie eingerichtet (configured: false), erscheint „Dashboard schützen?“ mit zwei Optionen:", + "imageAlt": "Ersteinrichtungsdialog „Dashboard schützen?“ mit „Ja, Passwort einrichten“ und „Nein, ohne Schutz fortfahren“", + "imageCaption": "Authentifizierung beim ersten Start: Passwortschutz einrichten oder überspringen. Erscheint nach einer Neuinstallation oder nach „Authentifizierung deaktivieren“ in den Einstellungen erneut.", + "headerButton": "Schaltfläche", + "headerWhat": "Was passiert", + "headerApi": "API-Aufruf", + "rows": [ + { + "button": "Ja, Passwort einrichten", + "what": "Öffnet ein Formular mit verpflichtendem Benutzernamen und Passwort sowie optionalem Anzeigenamen und Avatarbild. Aktiviert die Authentifizierung in auth.json mit enabled: true und gibt ein JWT zur Anmeldung zurück. Optionale Profilfelder werden durch weitere Aufrufe gespeichert, wie unten beschrieben.", + "api": "POST /api/auth/setup" + }, + { + "button": "Nein, fahren Sie ohne Schutz fort", + "what": "Markiert declined: true in auth.json. Jeder API-Endpunkt ist öffentlich zugänglich, bis Sie Ihre Meinung über Einstellungen ändern.", + "api": "POST /api/auth/skip" + } + ], + "twofaCalloutTitle": "2FA wird später konfiguriert, nicht hier", + "twofaCalloutBody": "Der erste Dialog entscheidet nur über den Passwortschutz. Zwei-Faktor-Authentifizierung (TOTP) richten Sie danach unter Sicherheit ein, sobald Sie mit Passwort angemeldet sind. Die vollständige Anleitung folgt weiter unten.", + "createTitle": "Erstellen des ersten Benutzers", + "createIntro": "Mit Ja, Passwort einrichten öffnen Sie ein Formular für Konto und optionales Profil. So erscheint der Avatar direkt nach dem Speichern im Kopfbereich. Die Felder:", + "headerField": "Feld", + "headerRequired": "Erforderlich", + "headerNotes": "Notizen", + "fieldRows": [ + { + "field": "Benutzername", + "required": "Ja", + "notes": "Kennung zur Anmeldung. Später nicht über die Oberfläche änderbar; dafür muss auth.json direkt bearbeitet werden." + }, + { + "field": "Passwort", + "required": "Ja", + "notes": "Mindestens 10 Zeichen aus mindestens 3 von 4 Kategorien: Kleinbuchstaben, Großbuchstaben, Ziffern und Symbole. Offensichtliche Passwörter wie password, 12345678 oder proxmenux werden abgelehnt. Dieselben Regeln gelten serverseitig und lassen sich nicht per curl umgehen." + }, + { + "field": "Anzeigename", + "required": "Nein", + "notes": "Name im Menü des Kopfbereichs und auf der Profilseite. Ohne Angabe wird der Benutzername verwendet. Später über Avatar → Profil ansehen änderbar." + }, + { + "field": "Avatarbild", + "required": "Nein", + "notes": "PNG, JPEG, WebP oder GIF bis 2 MB. Erscheint als Kreis im Kopfbereich und im Profil. Ohne Bild wird der erste Buchstabe des Anzeigenamens oder Benutzernamens auf farbigem Hintergrund gezeigt. Im Profil können Sie das Bild später hochladen, ersetzen oder entfernen." + } + ], + "createImageAlt": "Formular mit verpflichtendem Benutzernamen und Passwort sowie optionalem Anzeigenamen und Avatar-Upload", + "createImageCaption": "Formular zur Ersteinrichtung. Anzeigename und Avatar sind optional. Ohne Angaben wird das Konto angelegt und im Kopfbereich ein Kreis mit einem Buchstaben angezeigt.", + "saveCalloutTitle": "Einmal speichern, bis zu drei API-Aufrufe", + "saveCalloutBody": "Zuerst sendet das Formular POST /api/auth/setup mit Benutzername und Passwort. Mit dem neuen JWT folgen gegebenenfalls PUT /api/auth/profile für den Anzeigenamen und POST /api/auth/profile/avatar für das Bild. Fehler beim Profil verhindern die Kontoerstellung nicht; das Profil lässt sich später ergänzen.", + "avatarTitle": "Avatar-Menü und Profilseite", + "avatarBody1": "Nach der Einrichtung erscheint oben rechts neben dem Designschalter ein Avatar. Sein Menü führt zum Profil und zur Sicherheit und bietet Abmelden. Eine Abmeldung ist auch unter Sicherheit möglich.", + "avatarBody2": "Die Profilseite zeigt eine Avatarvorschau, den schreibgeschützten Benutzernamen und den bearbeitbaren Anzeigenamen. Avatar-Uploads, Ersetzungen und Löschungen erfolgen atomar; der Avatar im Kopfbereich aktualisiert sich nach Erfolg ohne Neuladen. Ersteinrichtung und Profilseite verwenden die nachfolgend beschriebenen Endpunkte.", + "profileImageAlt": "Profilseite mit Avatarvorschau, Schaltflächen zum Hochladen, Ersetzen und Entfernen, schreibgeschütztem Benutzernamen und bearbeitbarem Anzeigenamen", + "profileImageCaption": "Die dedizierte Profilseite. Benutzername ist schreibgeschützt; Anzeigename und Avatar können von hier aus bearbeitet werden, ohne die Registerkarte Sicherheit zu berühren.", + "headerEndpoint": "Endpunkt", + "headerEpWhat": "Was es tut", + "endpointRows": [ + { + "endpoint": "GET /api/auth/profile", + "what": "Gibt den aktuellen Benutzernamen, den Anzeigenamen und ob ein Avatar gesetzt ist (has_avatar, avatar_mtime) zurück." + }, + { + "endpoint": "PUT /api/auth/profile", + "what": "Aktualisiert den Anzeigenamen. Anfrageinhalt: '{' \"display_name\": \"...\" '}'." + }, + { + "endpoint": "GET /api/auth/profile/avatar", + "what": "Gibt das Avatarbild als PNG / JPEG / WebP / GIF mit passendem Inhaltstyp zurück. Benötigt den Bearer-Header; das Frontend lädt einen Blob und erzeugt daraus eine lokale Objekt-URL." + }, + { + "endpoint": "POST /api/auth/profile/avatar", + "what": "Ladet einen neuen Avatar hoch (max 2 MB). Der Inhaltstyp muss der Datei entsprechen. Der alte Avatar wird atomar ersetzt." + }, + { + "endpoint": "DELETE /api/auth/profile/avatar", + "what": "Entfernt den Avatar. Im Kopfbereich erscheint wieder eine Initiale in einem farbigen Kreis." + } + ], + "reversibleTitle": "Der Verzicht auf Schutz lässt sich später ändern", + "reversibleBody": "Nach Nein, ohne Schutz fortfahren erscheint der Dialog nicht erneut. Aktivieren Sie die Authentifizierung unter Sicherheit oder bearbeiten Sie /root/.config/proxmenux-monitor/auth.json, entfernen Sie das Flag declined und starten Sie den Dienst neu." + }, + "password": { + "heading": "Passwort-Authentifizierung", + "intro": "Nach der Einrichtung benötigen geschützte API-Aufrufe ein JWT in Authorization: Bearer <token>:", + "items": [ + "Sitzungstoken zur Anmeldung: 24 Stunden gültig. Ausgestellt über POST /api/auth/login.", + "API-Token für Integrationen: 365 Tage gültig. Ausgestellt über POST /api/auth/generate-api-token. Weitere Informationen im nächsten Abschnitt." + ], + "loginImageAlt": "Anmeldebildschirm nach der Konfiguration der Authentifizierung angezeigt - Benutzername und Passwortfelder", + "loginImageCaption": "Sobald die Authentifizierung konfiguriert ist, beginnt hier jeder Besuch des Dashboards. Wenn 2FA aktiviert ist, fragt der Bildschirm in einem zweiten Schritt nach dem akzeptierten Passwort nach dem 6-stelligen Code.", + "loginFlowTitle": "Loginfluss", + "twofaIntro": "Mit 2FA antwortet derselbe Aufruf zunächst mit requires_totp: true. Senden Sie ihn erneut mit dem sechsstelligen Code:", + "publicTitle": "Öffentlicher Zugriff und geschützte Prüfungen", + "publicIntro": "Anmeldung und Authentifizierungsstatus sind öffentlich. Die Ersteinrichtung ist möglich, solange Benutzername und Passwort fehlen, auch nach abgelehntem Schutz. Systemdaten benötigen bei aktiviertem Schutz eine Authentifizierung:", + "publicItems": [ + "/api/auth/login und /api/auth/status sind öffentlich. /api/auth/setup erstellt das erste Konto und lehnt das Überschreiben vorhandener Zugangsdaten ab.", + "/api/system-info ist ein öffentlicher Endpunkt für grundlegende Systemdaten einschließlich health.status. Er verlangt kein Token. Auch /api/auth/status ist öffentlich und eignet sich für eine Erreichbarkeitsprüfung." + ], + "cryptoTitle": "Kryptographie und Speicherung", + "cryptoIntro": "ProxMenux Monitor ist Open Source – nichts davon ist geheim. Die Dokumentation des Stacks hier ist eine bewusste Entscheidung: Betreiber, die Anmeldeinformationen auf ihrem Host speichern, verdienen es zu wissen, wie diese Anmeldeinformationen geschützt sind, bevor sie sich entscheiden, ihnen zu vertrauen. Die folgenden Algorithmen sind die gleichen, die der Code in scripts/auth_manager.py verwendet; dieser Abschnitt ist ein Vertrag, kein Marketingversprechen.", + "headerAsset": "Datenelement", + "headerAlgo": "Algorithmus", + "headerWhere": "Speicherort", + "cryptoRows": [ + { + "asset": "Passwort", + "algorithm": "PBKDF2-HMAC-SHA256 mit einem Zufallssalz pro Passwort und einer hohen Iterationszahl (OWASP 2023+ Baseline). Speichert als pbkdf2_sha256$<iters>$<salt>$<hash>.", + "where": "auth.json → password_hash" + }, + { + "asset": "Sitzung / API JWT", + "algorithm": "HS256 mit einem pro Installation beim ersten Start erzeugten Geheimnis (secrets.token_urlsafe, ≥48 Byte). Tokens enthalten die Angaben iss=proxmenux-monitor und aud=api; die Signatur wird bei jeder Anfrage mit dem aktuellen Geheimnis geprüft.", + "where": "Geheimnis: auth.json → jwt_secret. JWT selbst: nur auf dem Client." + }, + { + "asset": "API Token Metadaten", + "algorithm": "Der SHA-256-Hash des JWT wird mit dem Fingerabdruck signed_with des verwendeten jwt_secret gespeichert. Damit lassen sich Token-Metadaten anzeigen und Tokens nach einem Wechsel des Signaturgeheimnisses erkennen.", + "where": "auth.json → api_tokens[]" + }, + { + "asset": "2FA-TOTP-Geheimnis", + "algorithm": "Standard-TOTP (RFC 6238) mit Base32-kodiertem Geheimnis. Die acht Wiederherstellungscodes sind einmalig und werden als SHA-256-Hashes gespeichert.", + "where": "auth.json → totp_secret + backup_codes[]" + }, + { + "asset": "Widerrufe", + "algorithm": "Bei Widerruf eines Tokens oder einer Sitzung wird dessen SHA-256-Hash in eine Sperrliste aufgenommen, die bei jeder Prüfung berücksichtigt wird. Eine etwa 30 Sekunden gültige Speicherkopie vermeidet häufige Datenträgerzugriffe.", + "where": "auth.json → revoked_tokens[]" + } + ], + "authJsonTitle": "auth.json - was es enthält und wie es geschützt ist", + "authJsonBody": "Die Authentifizierungsdaten liegen in /root/.config/proxmenux-monitor/auth.json, mit Modus 0600 und Eigentümer root. Die Datei enthält Hashes (PBKDF2) und geheimes Schlüsselmaterial (jwt_secret, totp_secret), niemals das Klartextpasswort. Sichern oder replizieren Sie den Host nur auf ein verschlüsseltes Ziel und nehmen Sie diese Datei niemals in die Versionsverwaltung auf.", + "rotateTitle": "Ein Wechsel von jwt_secret macht bestehende JWTs ungültig", + "rotateBody": "Wird auth.json neu erstellt oder mit einem anderen Geheimnis wiederhergestellt, ändert sich jwt_secret. Bisherige Sitzungs- und API-Tokens scheitern dann mit „Invalid or expired token“. Die Oberfläche kennzeichnet betroffene Tokens mit Ungültig — neu erstellen. Widerrufen und ersetzen Sie sie auch in Home Assistant, Skripten und anderen Clients.", + "recoverTitle": "Wiederherstellen eines verlorenen Passworts", + "recoverIntro": "Es gibt keinen Online-Fluss für \"Passwort vergessen\" - von Grund auf, da das Dashboard auf dem eigenen Host des Betreibers läuft und der Wiederherstellungspfad Shell-Zugriff auf diesen Host ist. ProxMenux liefert einen geführten Reset im Konfigurationsmenü, sodass Sie auth.json nicht von Hand bearbeiten müssen:", + "survivesTitle": "Was den Reset überlebt", + "survivesBody": "Die interaktive Anmeldung wird gelöscht, jwt_secret und registrierte api_tokens bleiben erhalten. Home Assistant und andere Integrationen können ihre Tokens weiterverwenden. Für einen vollständigen Neustart samt neuem Signaturgeheimnis auth.json manuell löschen und den Dienst neu starten. Dann sind alle alten Tokens ungültig.", + "physicalTitle": "Voraussetzung für den physischen Zugang", + "physicalBody": "Erfordert eine Root-Shell auf dem Host. Wer menu als root ausführen kann, besitzt bereits vollständige Kontrolle; die Passwortzurücksetzung erweitert seine Rechte nicht. Ein Monitor-Passwort schützt den Host daher nicht vor Personen mit unberechtigtem Root-Zugang." + }, + "twofa": { + "heading": "Zwei-Faktor-Authentifizierung (TOTP)", + "intro": "2FA fügt Ihrem Passwort einen zweiten Faktor hinzu: einen 6-stelligen Code, der alle 30 Sekunden rotiert und auf einem von Ihnen kontrollierten Telefon- oder Passwortmanager generiert wird. Selbst wenn jemand das Passwort erhält, kann er sich immer noch nicht ohne den Code von Ihrem Gerät anmelden. ProxMenux Monitor implementiert das Standard-Protokoll TOTP (RFC 6238), so dass jede Authentifizierungs-App funktioniert.", + "pickTitle": "Wählen Sie eine Authenticator App", + "pickIntro": "Eine vorhandene TOTP-App können Sie weiterverwenden. Die Tabelle nennt übliche Optionen: einige kostenlos, andere mit Abonnement. Plattformen und Sicherungsverfahren unterscheiden sich ebenfalls.", + "headerApp": "App", + "headerPlatforms": "Plattformen", + "headerAppNotes": "Notizen", + "apps": [ + { + "name": "Google Authenticator", + "href": "https://safety.google/authentication/", + "platforms": "iOS, Android", + "notes": "Der Standard für viele Benutzer. Optionales Google-Konto Cloud-Backup." + }, + { + "name": "Microsoft Authenticator", + "href": "https://www.microsoft.com/en-us/security/mobile-authenticator-app", + "platforms": "iOS, Android", + "notes": "Microsoft-Account Backup. Behandelt auch MS-Push-Benachrichtigungen, wenn Sie sie bei der Arbeit verwenden." + }, + { + "name": "Authy", + "href": "https://authy.com/", + "platforms": "iOS, Android", + "notes": "Verschlüsselte Synchronisierung zwischen Geräten. Die Desktop-App wird seit dem 19. März 2024 nicht mehr unterstützt." + }, + { + "name": "Apple Passwords", + "href": "https://support.apple.com/guide/passwords/welcome/mac", + "platforms": "iOS, iPadOS, macOS, visionOS, Windows (über iCloud)", + "notes": "In Apple-Betriebssystemen enthalten; eigenständige Passwords-App seit iOS 18 / macOS Sequoia. Speichert TOTP neben dem Passwort und synchronisiert über den iCloud-Schlüsselbund." + }, + { + "name": "Bitwarden", + "href": "https://bitwarden.com/", + "platforms": "iOS, Android, Desktop, Browser", + "notes": "Open Source. TOTP kann im Passworttresor neben Passwörtern gespeichert werden. Das ist praktisch, bietet aber keine Trennung auf ein zweites Gerät." + }, + { + "name": "1Password", + "href": "https://1password.com/", + "platforms": "iOS, Android, Desktop, Browser", + "notes": "Wie Bitwarden: TOTP im Passworttresor. Kostenpflichtiges Abonnement." + }, + { + "name": "Aegis Authenticator", + "href": "https://getaegis.app/", + "platforms": "Android", + "notes": "Open Source. Verschlüsselte Backup-Datei auf dem Gerät, die Sie kontrollieren. Keine Cloud, kein Account erforderlich." + }, + { + "name": "Raivo OTP", + "href": "https://raivo-otp.com/", + "platforms": "iOS, macOS", + "notes": "Open Source. Optionale iCloud Sync. Das Apple-Ökosystem Pendant zu Aegis." + }, + { + "name": "Ente Auth", + "href": "https://ente.io/auth/", + "platforms": "iOS, Android, Desktop, Web", + "notes": "Open Source. Ende-zu-Ende verschlüsselte Cloud-Synchronisierung über Geräte hinweg." + }, + { + "name": "2FAS", + "href": "https://2fas.com/", + "platforms": "iOS, Android, Browsererweiterung", + "notes": "Open Source. Optionales verschlüsseltes Cloud-Backup; Browsererweiterung kann automatisch Codes ausfüllen." + }, + { + "name": "FreeOTP+", + "href": "https://github.com/helloworld1/FreeOTPPlus", + "platforms": "Android", + "notes": "Open-Source-Abspaltung von FreeOTP für Android mit Import und Export. Kein Konto erforderlich." + } + ], + "backupTitle": "Warum Sicherungen wichtig sind", + "backupBody": "Bei Verlust des Authenticator-Geräts einen gesicherten Wiederherstellungscode verwenden oder eine zuvor eingerichtete App-Sicherung wiederherstellen. Cloud-Synchronisierung und lokale Exporte unterscheiden sich je nach App; prüfen Sie, ob die TOTP-Geheimnisse tatsächlich wiederhergestellt werden. Mit Root-Zugang zum Host ist die unten beschriebene Wiederherstellung ebenfalls möglich. Bewahren Sie eine separate, sichere Kopie auf.", + "setupTitle": "Schritt-für-Schritt-Setup aus dem Dashboard", + "setupImageAlt": "Einrichtungsbildschirm 2FA mit QR-Code und Backup-Codes", + "setupImageCaption": "Der 2FA-Dialog zeigt QR-Code, Base32-Geheimnis zur manuellen Eingabe und acht einmalige Wiederherstellungscodes. Vor dem Schließen kopieren; sie werden nicht erneut angezeigt.", + "setupSteps": [ + "Installieren Sie die Authenticator-App auf Ihrem Telefon (oder öffnen Sie Ihren Passwort-Manager). Eine der Apps aus der Tabelle oben. Sie müssen dies nur einmal tun - die gleiche app enthält codes für jeden dienst, den sie schützen.", + "Am Dashboard anmelden mit Benutzername und Passwort.", + "Sicherheit öffnen und 2FA aktivieren wählen. Der Dialog zeigt QR-Code, Base32-Geheimnis und acht Wiederherstellungscodes.", + "Fügen Sie den Eintrag zur Authenticator-App hinzu:", + "Wiederherstellungscodes sichern. Alle acht in einem Passwortmanager, einer verschlüsselten Notiz oder einem sicheren Ausdruck aufbewahren. Jeder funktioniert einmal, wenn der Authenticator fehlt.", + "Bestätigen Sie, indem Sie den aktuellen 6-stelligen Code aus der App in das Feld \"Verifizierungscode\" des Setup-Dialogs eingeben und senden. Codes aktualisieren alle 30 Sekunden, wenn es also abläuft, während Sie tippen, geben Sie einfach den nächsten ein.", + "Fertig. 2FA ist aktiv. Bei der nächsten Anmeldung wird zuerst das Passwort und danach der aktuelle sechsstellige Code abgefragt." + ], + "setupStep4Sub": [ + "Einfaches Verfahren: In der App Konto hinzufügen → QR-Code scannen wählen und die Kamera auf den QR-Code richten. Die App benennt den Eintrag automatisch, etwa ProxMenux Monitor (your-username), und zeigt alle 30 Sekunden einen neuen sechsstelligen Code.", + "Manuelle Alternative, falls Scannen nicht möglich ist, etwa auf demselben Telefon: Konto hinzufügen → Einrichtungsschlüssel eingeben. Einen Namen wie Proxmox Monitor wählen, Base32-Geheimnis einfügen, Typ auf Zeitbasiert belassen und speichern." + ], + "testTitle": "Test vor dem Abmelden", + "testBody": "Die bestehende Sitzung geöffnet lassen und sofort in einem privaten Fenster eine neue Anmeldung testen. Bei abgelehntem Code zuerst Server- und Telefonuhr prüfen, bevor Sie die funktionierende Sitzung schließen. Bei bereits verlorenem Zugang Wiederherstellungscode verwenden oder auth.json in der Host-Shell bearbeiten.", + "lostTitle": "Verlorener Authentifikator", + "lostIntro": "Drei Wiederherstellungswege, von geringem bis stärkerem Eingriff:", + "lostItems": [ + "Wiederherstellungscode verwenden. Einen der acht gesicherten Codes im TOTP-Feld eingeben. Jeder funktioniert einmal; unbenutzte bleiben gültig. Danach 2FA in den Einstellungen neu einrichten, um acht neue Codes zu erhalten.", + "Authenticator aus Cloud oder Sicherung wiederherstellen. Bei eingerichteter Cloud-Synchronisierung die App auf dem neuen Gerät installieren und anmelden, etwa Google, Microsoft, Authy, Apple Passwords über iCloud-Schlüsselbund, Ente oder 2FAS. Bei einer Exportdatei, etwa aus Aegis, Raivo oder FreeOTP+, die App installieren und die Datei importieren.", + "Deaktivieren Sie 2FA von der Host-Shell. Wenn die vorherigen Optionen nicht verfügbar sind, bearbeiten Sie /root/.config/proxmenux-monitor/auth.json auf dem Proxmox-Host (Sie benötigen SSH oder Konsolenzugriff), setzen Sie totp_enabled auf false, speichern und starten Sie den Dienst neu:" + ], + "lostShellOutro": "Sie können sich nur mit Benutzername + Passwort anmelden und dann 2FA aus Einstellungen wieder aktivieren.", + "disableTitle": "Deaktivieren Sie 2FA", + "disableBody": "Sicherheit öffnen und 2FA deaktivieren wählen. POST /api/auth/totp/disable benötigt Passwort und gültigen TOTP- oder Wiederherstellungscode. Danach werden Geheimnis und Wiederherstellungscodes gelöscht. Alten Eintrag auch in der App entfernen.", + "rejectedTitle": "Der 6-stellige Code wird immer abgelehnt", + "rejectedIntro": "TOTP ist zeitbasiert. Server- und Telefonuhr dürfen nur etwa 30 Sekunden voneinander abweichen. Zwei Prüfungen:", + "rejectedItems": [ + "Telefon: Einstellungen → Datum und Uhrzeit → automatische / Netzwerksynchronisierung aktivieren.", + "Proxmox-Host: timedatectl status sollte „System clock synchronized: yes“ anzeigen. Andernfalls timedatectl set-ntp true ausführen und eine Minute warten." + ], + "rejectedOutro": "Sobald beide Uhren übereinstimmen, wird der Code innerhalb des nächsten 30-Sekundenfensters akzeptiert." + }, + "apiTokens": { + "heading": "API-Token (langlebig)", + "intro": "Browsersitzungen laufen nach 24 Stunden ab. Für Homepage-Widgets, Home Assistant, Grafana oder Uptime Kuma erstellen Sie ein separates API-Token mit 365 Tagen Laufzeit. Es verwendet dasselbe Signaturgeheimnis; die Angabe token_name erlaubt die Zuordnung und den einzelnen Widerruf.", + "imageAlt": "API-Token-Panel zeigt die Token-Liste mit Name, Präfix, erstelltem Datum und Ablauf", + "imageCaption": "Die API-Tokenliste unter Einstellungen — Name, Präfix (die letzten 4-Zeichen werden zur Identifizierung angezeigt), erstellt und Ablaufdatum, Widerrufsaktion.", + "generateTitle": "Generieren Sie ein Token", + "generateIntro": "Aus dem Dashboard:", + "generateSteps": [ + "Unter Sicherheit → API-Zugriffstokens öffnen.", + "Beschreibenden Namen angeben, z. B. „Home Assistant“.", + "Geben Sie Ihr Passwort erneut ein. Wenn 2FA eingeschaltet ist, auch der aktuelle 6-stellige Code.", + "Token erstellen wählen. Es erscheint nur einmal; sofort kopieren." + ], + "generateCli": "Aus der Kommandozeile:", + "useTitle": "Verwenden Sie ein Token", + "revokeTitle": "Einen Token widerrufen", + "revokeBody": "Jede Zeile bietet Widerrufen. Dadurch wird der Token-Hash unter revoked_tokens in auth.json gespeichert. Ab der nächsten Anfrage wird das Token abgelehnt.", + "cheatTitle": "Kurzübersicht zur Token-Sicherheit", + "cheatItems": [ + "Tokens im Geheimnisspeicher der Integration ablegen: Homepage secrets.yaml, Home Assistant !secret oder Umgebungsvariablen. Niemals in Git aufnehmen.", + "Ein nach der jeweiligen Integration benanntes Token verwenden. Beim Entfernen der Integration dieses Token einzeln widerrufen.", + "Rotieren Sie alle 6–12 Monate. Der Ablauf ist eine harte Grenze, keine Empfehlung." + ], + "outro": "Hinweise zur sicheren Speicherung und Integrationsbeispiele: API-Referenz → Token-Verwaltung und Integrationen." + }, + "https": { + "heading": "HTTPS", + "intro": "Zwei Wege zu TLS:", + "items": [ + "Reverse-Proxy (empfohlen). Beenden Sie TLS auf Nginx / Caddy / Traefik und leiten Sie HTTP auf Port 8008 zum Flask-Prozess weiter. Snippets unten.", + "Direktes HTTPS in der AppImage. Zertifikat über POST /api/ssl/configure einrichten (Oberfläche: Einstellungen → SSL). HTTPS verwendet gevent.pywsgi mit dem Standardhandler; flask-sock übernimmt WebSocket-Verbindungen für WSS. Zertifikatspfade stehen in der SSL-Konfiguration." + ], + "calloutTitle": "Direkte HTTPS-Beschränkungen", + "calloutBody": "Der Monitor kann ein von Proxmox verwaltetes Zertifikat oder eigene Zertifikatsdateien verwenden. Er stellt selbst keine ACME-Zertifikate aus. Für automatische Ausstellung und Erneuerung Proxmox ACME oder einen Reverse-Proxy wie Caddy, Traefik oder Nginx verwenden; erneuerte Zertifikate müssen geladen werden." + }, + "gateway": { + "heading": "Sicheres Gateway (Tailscale)", + "intro": "Ein Reverse-Proxy ermöglicht Fernzugriff. Secure Gateway bietet Zugriff ohne Veröffentlichung von TCP 8008: Ein Alpine-LXC führt Tailscale als Subnetz-Router aus. Die LAN-IP des Hosts ist über genehmigte Subnetzrouten und Tailnet-Zugriffsregeln erreichbar.", + "calloutTitle": "Warum dies bequem ist", + "calloutBody": "Die LAN-URL http://<proxmox-lan-ip>:8008 über die genehmigte Route verwenden. Tailscale-Subnetz-Router nutzen standardmäßig SNAT. Der Monitor sieht daher üblicherweise die LAN-IP des Gateways statt der Clientadresse 100.x.y.z. Protokoll und Fail2Ban erkennen die tatsächlich am Host ankommende Quelladresse.", + "deployBody": "Auf einer Seite LXC-Speicher wählen, einen unter login.tailscale.com/admin/settings/keys erzeugten Tailscale-Schlüssel einfügen, Subnetze wählen und bereitstellen. Der LXC wird in etwa 30 Sekunden eingerichtet und im Tailnet registriert.", + "outro": "Bereitstellung, Subnetzrouten, Tailscale-ACLs und Exit-Node-Modus stehen unter Dashboard → Sicherheit → Secure Gateway. Dort befindet sich auch der Assistent. Diese Seite beschreibt den Zugriff." + }, + "proxy": { + "heading": "Konfigurationsbeispiele für Reverse-Proxys", + "intro": "Einen eigenen Hostnamen wie monitor.example.com auf Port 8008 des Proxmox-Hosts weiterleiten. Die Beispiele nutzen dieses Schema. Ein Unterpfad wie example.com/proxmenux-monitor/ braucht weitere Frontend- und Proxy-Anpassungen; Entfernen des Präfixes allein reicht nicht.", + "nginxTitle": "Nginx", + "caddyTitle": "Caddy", + "traefikTitle": "Traefik (Labels — Docker / Kubernetes)", + "subPathTitle": "Erweitert: Bereitstellung unter einem Unterpfad", + "subPathBody": "Das aktuelle Frontend hat keine konfigurierte Unterpfad-Basis und erstellt API-Aufrufe mit rootrelativen /api/*-URLs. Ein Präfix wie example.com/proxmenux-monitor/ zu entfernen reicht weder für diese API-Aufrufe noch für alle Frontend-Dateien aus. Verwenden Sie einen eigenen Hostnamen. Ein Unterpfad erfordert abgestimmte Frontend-/Proxy-Anpassungen und eigene Tests." + }, + "audit": { + "heading": "Prüfprotokoll", + "intro": "Fehlgeschlagene Anmeldungen und Warnungen des Anmeldelimits werden zeilenweise in /var/log/proxmenux-auth.log geschrieben. Erfolgreiche Anmeldungen protokolliert dieser Logger nicht:", + "outro": "Mit tail -F /var/log/proxmenux-auth.log verfolgen. Eine zusätzliche Konfiguration für logrotate ermöglicht die Rotation; der Monitor führt sie nicht selbst durch." + }, + "fail2ban": { + "heading": "Optional: Fail2Ban-Jail", + "calloutTitle": "Fail2Ban ist nicht mit dem Monitor gebündelt", + "calloutBody": "Fail2Ban wird nicht von ProxMenux Monitor selbst installiert. Installieren Sie es über Sicherheit → Fail2Ban im Menü ProxMenux (oder mit dem Standard-Debian-Paket). Ohne sie schreibt der Monitor immer noch das obige Überwachungsprotokoll – Wiederholungstäter werden einfach nicht automatisch gesperrt.", + "intro": "Wenn Fail2Ban installiert ist, liefert die ProxMenux-Integration einen [proxmenux] jail mit, der:", + "items": [ + "Liest /var/log/proxmenux-auth.log.", + "Erkennt das Muster authentication failure; rhost=<ip> mit einem eigenen Filter.", + "Sperrt die beanstandete IP standardmäßig auf Kernel-Firewall-Ebene.", + "Der Flask-Hook before_request prüft Anfragen anhand der für 30 Sekunden zwischengespeicherten Sperrliste. Hinter einem Reverse-Proxy sind PROXMENUX_TRUST_PROXY=1 und ein kontrollierter Proxy mit vertrauenswürdigen Weiterleitungsheadern erforderlich." + ], + "outro": "Konfiguration, Sperrdauer und Entsperren: Sicherheit → Fail2Ban." + }, + "troubleshoot": { + "heading": "Fehlerbehebung", + "noScreenTitle": "Der erste Launch-Bildschirm erscheint nie", + "noScreenBody": "Die Authentifizierung ist bereits eingerichtet (configured: true) oder wurde übersprungen. Für eine neue Einrichtung:", + "noScreenOutro": "Löscht den Authentifizierungszustand einschließlich TOTP-Geheimnissen und API-Tokens. Zuerst auth.json sichern, falls Sie Tokens behalten möchten.", + "tokenTitle": "HTTP 401 bei jeder Anfrage von einem funktionierenden API-Token", + "tokenBody": "Token abgelaufen (365 Tage) oder in revoked_tokens eingetragen. Neues Token in den Einstellungen erstellen und die Integration aktualisieren. Prüfen mit:", + "tokenOutro": "Abgelaufene oder widerrufene Token geben '{'\"error\":\"Invalid or expired token\"'}' zurück.", + "no2faTitle": "Kann sich nicht anmelden, nachdem 2FA aktiviert wurde, kein Authentifikator zur Hand", + "no2faBody": "Verwenden Sie einen Backup-Code im TOTP-Feld. Wenn diese nicht mehr vorhanden sind, bearbeiten Sie /root/.config/proxmenux-monitor/auth.json von einer Host-Shell, setzen totp_enabled auf false, starten Sie den Dienst neu.", + "wsTitle": "Reverse Proxy funktioniert, aber der Terminal-Tab trennt sich jede Minute", + "wsBody": "Möglicher Grund ist das WebSocket-Leerlaufzeitlimit des Proxys. Lesezeitlimit erhöhen (Nginx: proxy_read_timeout 86400s; Traefik: idleTimeout im Einstiegspunkt oder der Middleware). In Nginx proxy_set_header Upgrade $http_upgrade und Connection \"upgrade\" prüfen." + }, + "whereNext": { + "heading": "Wohin als nächstes", + "items": [ + { + "label": "API-Referenz → Token-Verwaltung", + "href": "/docs/monitor/api", + "tail": " — API-Tokens erstellen, auflisten und widerrufen; sichere Speicherung und Sicherheitsregeln." + }, + { + "label": "Integrationen", + "href": "/docs/monitor/integrations", + "tail": " — Homepage, Home Assistant, Grafana / Prometheus, Uptime Kuma und allgemeine cURL-Beispiele." + }, + { + "label": "Übersicht → Sicherheit → Sicheres Gateway", + "href": "/docs/monitor/dashboard/security", + "tail": " — Tailscale-Gateway-LXC schrittweise bereitstellen: Subnetzrouten, ACLs und Exit-Node-Modus." + }, + { + "label": "Sicherheit: Fail2Ban", + "href": "/docs/security/fail2ban", + "tail": " — optionale Jail installieren und konfigurieren." + }, + { + "label": "Einstellungen → ProxMenux Monitor", + "href": "/docs/settings/proxmenux-monitor", + "tail": " — systemd-Dienst über die ProxMenux-TUI starten und stoppen." + } + ] + } +} diff --git a/web/messages/de/docs/monitor/ai-assistant.json b/web/messages/de/docs/monitor/ai-assistant.json new file mode 100644 index 00000000..eb3b0679 --- /dev/null +++ b/web/messages/de/docs/monitor/ai-assistant.json @@ -0,0 +1,342 @@ +{ + "meta": { + "title": "Proxmox-KI-Assistent — OpenAI, Claude, Gemini, Groq, Ollama | ProxMenux Monitor", + "description": "Der optionale KI-Assistent formuliert Proxmox-VE-Benachrichtigungen verständlich um. Sechs Anbieter: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter und Ollama. Die Oberfläche bietet dreizehn Sprachen, drei Detailstufen pro Kanal, eigene Prompts mit Community-Bibliothek sowie Ereigniskontext mit Laufzeit, Wiederholungen und SMART-Daten.", + "ogTitle": "Proxmox-KI-Assistent — OpenAI, Claude, Gemini, Groq, Ollama", + "ogDescription": "Beschreiben Sie Proxmox VE-Benachrichtigungen in einfacher Sprache mit OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter oder lokalem Ollama.", + "twitterTitle": "Proxmox-KI-Assistent | ProxMenux Monitor", + "twitterDescription": "Beschreiben Sie Proxmox VE-Benachrichtigungen in einfacher Sprache mit OpenAI, Anthropic, Gemini, Groq, OpenRouter oder lokalem Ollama." + }, + "header": { + "title": "KI-Assistent", + "description": "Die optionale KI formuliert geeignete Benachrichtigungsvorlagen verständlich um: mit Detailstufen pro Kanal, dreizehn Oberflächensprachen, eigenen Prompts, öffentlicher Community-Bibliothek und zusätzlichem Kontext. Die Backup-Berichte backup_complete und backup_fail umgehen die KI vollständig.", + "section": "ProxMenux-Monitor" + }, + "intro": { + "title": "Standardmäßig aus, mit einem Schalter aktivieren", + "body": "Die KI-Umschreibung ist standardmäßig aus. Aktivieren Sie sie unter Einstellungen → Benachrichtigungen → Erweitert: KI-Verbesserung. Schlagen Kontextanreicherung oder Umschreibung fehl, wird die ursprüngliche Vorlage gesendet. Nach spätestens 25 Sekunden Wartezeit pro Umschreibung wird auf die Vorlage zurückgegriffen." + }, + "howItWorks": { + "heading": "Wie es funktioniert", + "intro": "Die versendeten Monitor-Ereignisse durchlaufen denselben Ablauf. Die KI-Umschreibung ist ein optionaler Schritt zwischen Vorlagentext und Kanalversand. Ein Ereignis durchläuft vier Schritte:", + "steps": [ + "Ereignis und Vorlage. Ein Ereignis kommt von einem der sechs Datensammler. notification_templates.py formatiert es als strukturierten Klartext. Diesen Text würde der Kanal ohne KI-Umschreibung senden.", + "Kontext-Anreicherung. Der Dispatcher inspiziert das Ereignis und fügt die relevanten zusätzlichen Signale bedingt an: System-Uptime (nur für kritische Systemausfälle), Ereignis-Frequenz, SMART-Daten (nur für Festplatten-Ereignisse), Bekannte Fehler-Datenbankübereinstimmungen und Journal-Logleitungen.", + "Prompt-Erstellung. Der Systemprompt setzt sich aus Vorlage und Kanaleinstellungen zusammen: Zielsprache, Detailstufe, Emoji-Regeln aus Formatierte Nachrichten und optionalen KI-Vorschlägen. Ein eigener Prompt ersetzt den Systemprompt vollständig. Die Benutzernachricht enthält Vorlagentext und ergänzte Kontextblöcke.", + "Anbieteraufruf. Groq, OpenAI, Anthropic, Gemini, Ollama oder OpenRouter liefert umformulierten Titel und Nachrichtentext. Der Dispatcher verarbeitet die Antwort, ersetzt diese Inhalte für den Kanal und übergibt sie an dessen Versandadapter." + ], + "notesIntro": "Drei Details, an denen es sich zu halten lohnt, bevor Sie den Rest dieser Seite lesen:", + "notes": [ + "Die KI erzeugt keine Ereignisse. Jedes Ereignis stammt aus einem echten Signal wie Zustandsprüfung, Journalzeile oder PVE-Webhook. Vor der KI-Verarbeitung wird es als Vorlagentext formatiert. Die KI übersetzt und formatiert, sie überwacht das System nicht.", + "Die AI läuft per-channel. Telegram und Discord können eine kurze Umschreibung verwenden, während E-Mail einen detaillierten Bericht erhält - dasselbe Ereignis, unterschiedliche Form, alles von einem Anbieteranruf pro Kanal.", + "Fehler führen zur Vorlage zurück. Bei HTTP-5xx-Fehlern, Zeitüberschreitung, ungültiger Ausgabe oder abgelehnter Anfrage protokolliert der Dispatcher den Fehler und sendet den ursprünglichen Vorlagentext für den Kanal. Ein KI-Fehler verhindert die Benachrichtigung nicht." + ] + }, + "enabling": { + "heading": "Panel aktivieren", + "intro": "Die AI-Konfiguration befindet sich am unteren Rand des Benachrichtigungsfeldes innerhalb der Registerkarte Einstellungen als zusammenklappbarer Advanced: AI Enhancement-Block. Klicken Sie auf den Header, um zu erweitern:", + "collapsedAlt": "Eingeklappter Bereich für erweiterte KI-Einstellungen mit Pfeilsymbol", + "collapsedCaption": "Standardmäßig eingeklappt; ein Klick öffnet das Panel.", + "panelAlt": "Geöffnetes KI-Panel mit Hauptschalter, Anbieter Google Gemini, verdecktem API-Schlüssel, Modell gemini-2.5-flash, Standardprompt, Sprache Englisch, Detailstufe für Telegram, Discord, Gotify und E-Mail, KI-Vorschlägen und Verbindungstest", + "panelCaption": "Das vollständige AI Enhancement-Panel - jedes auf dieser Seite dokumentierte Steuerelement wird einem der oben genannten Felder zugeordnet.", + "outro": "Von oben nach unten zeigt das Panel: den AI-Enhanced Messages Master-Toggle, den Provider-Selektor mit einem Informationsmodal daneben, den API-Schlüsseleingang (oder die Ollama-URL für den lokalen Modus), den Modell-Dropdown (vom Provider nach Eingabe des Schlüssels geladen), den prompten Modus (Default / Custom), die Ausgabesprache, die Pro-Kanal-Detailebene, die AI Suggestions Opt-in und eine Test Connection-Taste, die eine Probenachricht an den Provider sendet, um die Anmeldeinformationen zu validieren." + }, + "context": { + "heading": "Welchen Kontext die KI erhält", + "intro": "Bevor die Eingabeaufforderung erstellt wird, führt der Dispatcher eine Kontextanreicherungsroutine durch, die entscheidet, welche zusätzlichen Signale für das jeweilige Ereignis relevant sind. Ziel ist es, dem LLM genügend Informationen zu geben, um eine nützliche Nachricht zu erstellen, ohne sie (und Ihren Geldbeutel) mit Lärm zu überschwemmen, der nicht zutrifft. Fünf Kontextblöcke können der Benutzernachricht hinzugefügt werden:", + "headerBlock": "Block", + "headerWhen": "Wenn es injiziert wird", + "headerWhat": "Was es trägt", + "rows": [ + { + "block": "Systemlaufzeit", + "when": "Nur bei kritischen Systemfehlern: crash, panic, oom, kernel, split_brain, quorum_lost, node_offline, node_fail, system_fail, boot_fail. Bei Laufwerksfehlern, Warnungen und Routinevorgängen wird dieser Kontext für einen knappen Prompt ausgelassen.", + "what": "Eine Linie wie System uptime: 14 days (stable system). LLM unterscheidet Startprobleme von lang andauernden Fehlern." + }, + { + "block": "Ereignishäufigkeit", + "when": "Immer, wenn der Monitor den gleichen Fingerabdruck schon einmal gesehen hat.", + "what": "Häufigkeit, erstgesehener Zeitstempel, optionale Musterbezeichnung (wiederkehrend / einmalig / Spike). Das LLM verwendet dies, um \"wiederkehrendes Problem\" vs \"erstes Mal gesehen\" zu formulieren." + }, + { + "block": "SMART-Daten", + "when": "Nur für plattenbezogene Ereignisse (der Ereignistyp enthält disk, smart, storage, io_error oder der Körper erwähnt /dev/sd, ata, i/o error).", + "what": "Ausgabe von smartctl für das betroffene Gerät — Gesamtzustand (PASSED / FAILED) zuzüglich der relevanten Attribute für den Fehlermodus." + }, + { + "block": "Bekannte Fehler DB", + "when": "Wenn der Body- oder Journalkontext mit einem Proxmox-spezifischen Fehlermuster übereinstimmt, das mit dem Monitor ausgeliefert wird.", + "what": "Ein KNOWN PROXMOX ERROR DETECTED Block mit der passenden Ursache und einer konkreten Lösung. Die Aufforderung weist das LLM an, dieses wörtlich zu übersetzen - keine Paraphrasierung des empfohlenen Fixes." + }, + { + "block": "Journalprotokolle", + "when": "Wenn der ursprüngliche Datensammler Journalzeilen zum Ereignis erfasst hat, vor allem die Journal- und Aufgabenüberwachung.", + "what": "Rohe journalctl-Auszüge. Die Aufforderung sagt dem LLM, IDs, Zeitstempel und Root-Cause-Hinweise zu extrahieren und nicht verwandte Einträge zu ignorieren." + } + ], + "afterBlocks": "Sobald diese Blöcke verbunden sind, hat die an den LLM gesendete Benutzernachricht diese Form:", + "calloutTitle": "Keine Telemetrie über das Ereignis selbst hinaus", + "calloutBody": "Der Monitor sendet nur das, was er für das aktuelle Ereignis zur Hand hat - keine systemweite Telemetrie, keine historischen metrischen Serien, keine Inventar-Dumps. Die fünf Blöcke oben sind die obere Grenze dessen, was den Host bei einer einzelnen KI-Umschreibung verlässt." + }, + "tokens": { + "heading": "Tokens - was sie sind und wie sie konsumiert werden", + "intro1": "Kommerzielle Anbieter rechnen nach Token ab. Ein Token entspricht grob vier englischen Zeichen oder drei Vierteln eines Wortes. Der englische Satz \"Backup completed on storage local-bak\" hat ungefähr acht Token. Zehn Journalzeilen können je nach technischem Inhalt 200–400 Token umfassen.", + "intro2": "Zwei Dinge werden bei jedem Anruf in Rechnung gestellt:", + "items": [ + "Eingabe-Token umfassen Systemprompt und Benutzernachricht: Schweregrad, Titel, Vorlagentext und Kontext. Die Anzahl hängt vom tatsächlichen Prompt und Ereignis ab. Jeder umgeschriebene Kanal kann eigene Eingabe-Token verbrauchen; Backup-Abschluss- und Fehlerberichte umgehen die KI.", + "Ausgabe-Token sind die Modellantwort. Monitor begrenzt sie mit max_tokens. Die Grenze ist ein Höchstwert, kein fester Verbrauch: Erzeugt das Modell 250 Token bei einem Limit von 1500, werden 250 berechnet." + ], + "capsIntro": "Dies sind die tatsächlichen Obergrenzen, die der Dispatcher anwendet, direkt aus AI_DETAIL_TOKENS in notification_templates.py entnommen:", + "headerLevel": "Detailebene", + "headerCap": "Ausgabegrenze (Token)", + "headerConsumption": "Typischer realer Verbrauch", + "capRows": [ + { + "level": "kurz", + "cap": "500", + "consumption": "50–200 Ausgabe-Token für kurze Ereignisse." + }, + { + "level": "Standard", + "cap": "1500", + "consumption": "200–700 Ausgabe-Token für typische Ereignisse mit wenig Kontext." + }, + { + "level": "ausführlich", + "cap": "3000", + "consumption": "500–2000 Ausgabe-Token für vollständige E-Mail-Berichte mit Protokollen und SMART-Tabellen." + } + ], + "customNote": "Der benutzerdefinierte Eingabeaufforderungsmodus verwendet eine feste Obergrenze von 500-Ausgabetoken unabhängig von der Detailstufe - die benutzerdefinierte Eingabeaufforderung ist in Ihrer Kontrolle und die Obergrenze schützt vor außer Kontrolle geratenen Antworten.", + "sizingTitle": "Praktische Dimensionierung", + "sizingBody": "Schätzen Sie den Verbrauch als umgeschriebene Ereignisse × KI-Kanäle × Eingabe- und Ausgabe-Token je Aufruf. Beispiel: 50 Ereignisse × ein Kanal × (500 Eingabe + 300 Ausgabe) ergeben 40.000 Token täglich. Verbrauch und Kosten hängen von Modell, Kontext, Cache und Anbieterlimits ab. Detailstufe pro Kanal erklärt brief für Chats statt standard, bei weiterhin ausführlichen E-Mails." + }, + "providers": { + "heading": "KI-Anbieter", + "intro": "Sechs Anbieter sind mit dem Monitor verbunden. Die Anbieter-Dropdown in der Benutzeroberfläche zeigt sie alle; ein Informationsbutton daneben öffnet ein Modal mit einer einzeiligen Beschreibung für jeden. Unten finden Sie die vollständige Referenz mit der URL zum Erhalten eines API-Schlüssels, der Beschreibung in der Benutzeroberfläche und den entsprechenden Notizen aus der Codebasis.", + "imageAlt": "AI Providers Informationen modal Auflistung der sechs unterstützten Anbieter - Groq, OpenAI, Anthropic Claude, Google Gemini, Ollama, OpenRouter - jeder mit seinem Symbol und einzeilige Beschreibung und eine spezielle OpenAI-Kompatible APIs Hinweis für OpenAI", + "imageCaption": "Informationsfenster mit sechs Karten, einer je Anbieter, und den unten beschriebenen Angaben.", + "groq": { + "heading": "Groq", + "tagline": "Sehr schnelle, großzügige freie Stufe (30 req/min). Ideal zum Starten.", + "items": [ + "API-Schlüssel: console.groq.com/keys", + "Beispiele aus der mitgelieferten Modellliste: allam-2-7b, qwen/qwen3.8-27b, openai/gpt-oss-20b, groq/compound-mini.", + "Mitgelieferte Empfehlung: openai/gpt-oss-20b. Prüfen Sie die Verfügbarkeit für Ihr Konto über die Anbieterauswahl und den Verbindungstest." + ] + }, + "openai": { + "heading": "OpenAI", + "tagline": "Industriestandard. Sehr genau und weit verbreitet.", + "items": [ + "API-Schlüssel: platform.openai.com/api-keys", + "Beispiele aus der mitgelieferten Modellliste: gpt-4.1-nano, gpt-4.1-mini, gpt-4o-mini, gpt-4.1, gpt-4o, gpt-5-nano.", + "Mitgelieferte Empfehlung: gpt-4.1-nano. Der Adapter unterstützt auch besondere Anforderungen von Reasoning-Modellen; die Liste enthält gpt-5-nano. Diese Modelle sind daher nicht pauschal ausgeschlossen." + ], + "baseUrlTitle": "OpenAI-kompatible Basis URL", + "baseUrlBody": "Der OpenAI-Anbieter akzeptiert eine eigene Basis-URL für OpenAI-kompatible Endpunkte, etwa BytePlus / ByteDance (Kimi K2.5), LocalAI, LM Studio, vLLM, Together AI und Fireworks AI, die das Format /v1/chat/completions unterstützen. Tragen Sie die URL im OpenAI-Bereich neben dem API-Schlüssel ein." + }, + "anthropic": { + "heading": "Anthropic (Claude)", + "tagline": "Hervorragend zum Schreiben und Übersetzen. Schnell und wirtschaftlich.", + "items": [ + "API-Schlüssel: console.anthropic.com/settings/keys", + "Beispiele aus der mitgelieferten Modellliste: claude-haiku-4-5-20251001, claude-sonnet-4-6, claude-opus-4-6.", + "Mitgelieferte Empfehlung: claude-haiku-4-5-20251001. Dieser genaue Snapshot ist als Empfehlung konfiguriert; die älteren Claude-3.5-Einträge stehen nicht mehr in der mitgelieferten Liste." + ] + }, + "gemini": { + "heading": "Google Gemini", + "tagline": "Kostenloses Kontingent verfügbar, gutes Verhältnis von Qualität und Preis.", + "items": [ + "API-Schlüssel: aistudio.google.com/app/apikey", + "Beispiele aus der mitgelieferten Modellliste: gemini-2.5-flash-lite, gemini-2.5-flash, gemini-3-flash-preview.", + "Empfohlen: gemini-2.5-flash-lite - Flash und Flash-Lite passieren den Verifier konsequent. Die Pro-Varianten lehnen die thinkingBudget=0-Einstellung ab, die der Monitor verwendet, und sind für diese Workload übertrieben." + ] + }, + "openrouter": { + "heading": "OpenRouter", + "tagline": "Aggregator mit Zugriff auf 100+ Modelle mit einem einzigen API-Schlüssel. Maximale Flexibilität.", + "items": [ + "API-Schlüssel: openrouter.ai/keys", + "Beispiele aus der mitgelieferten Modellliste: meta-llama/llama-3.3-70b-instruct, meta-llama/llama-3.1-70b-instruct, meta-llama/llama-3.1-8b-instruct, anthropic/claude-haiku-4.5, google/gemini-2.5-flash-lite, openai/gpt-4o-mini, mistralai/mistral-medium-3.", + "Empfohlen: meta-llama/llama-3.3-70b-instruct - dasselbe Modell wie der Groq-Eintrag, aber über OpenRouter geroutet, was einen einzigen Schlüssel für alle aufgeführten Modelle bedeutet." + ] + }, + "ollama": { + "heading": "Ollama (lokal)", + "tagline": "Nutzt die Modelle Ihres konfigurierten Ollama-Servers. Lokale Modelle laufen dort; Ollama-Cloud-Modelle leiten Anfragen an einen Cloud-Anbieter weiter. Lokale Ausführung vermeidet gehostete API-Gebühren, verbraucht aber eigene Hardware und Strom.", + "items": [ + "Kein API-Schlüssel. Setzen Sie das Ollama URL-Feld auf Ihren Server (Standard http://localhost:11434 oder welcher Host Ihre Ollama-Instanz ausführt).", + "Modelle: nicht gefiltert. Der Monitor liest die Modelle, die Sie auf der Ollama-Seite über ollama pull <model> gezogen haben. Der Dropdown wird von GET /api/tags auf Ihrem Ollama-Server ausgefüllt.", + "Installieren: ollama.com/download – läuft unter Linux, macOS, Windows. Für beste Ergebnisse wählen Sie ein Modell, das in RAM mit einem ausreichend großen Kontextfenster für die Journalblöcke passt, die der Dispatcher injiziert." + ] + } + }, + "models": { + "heading": "Warum diese spezifischen Modelle", + "intro": "Die Modellauswahl nutzt den mitgelieferten Katalog verified_ai_models.json und Verfügbarkeitsprüfungen der Anbieteradapter. Diese setzen die interne Anfrage system_prompt + user_message + max_tokens in das jeweilige API-Format um. Der Katalog enthält getestete und manuell ergänzte Einträge; er garantiert weder aktuellen Kontozugriff noch denselben Verifikationstest für jedes Modell.", + "consequencesIntro": "Zwei Konsequenzen, die es wert sind, beachtet zu werden:", + "consequences": [ + "Die mitgelieferte Empfehlung ist ein Ausgangspunkt für Benachrichtigungen. Bewerten Sie Sprachqualität, Latenz und Kosten mit Ihren Ereignissen und Ihrem Konto; sie ist keine allgemeine Modellrangliste.", + "Sie können ein anderes aufgeführtes Modell wählen, passend zu Kontingent und Vorlieben. Prüfen Sie die Verfügbarkeit mit dem Verbindungstest; ein Listeneintrag garantiert keinen aktuellen Kontozugriff." + ], + "ollamaTitle": "Ollama ist die Ausnahme", + "ollamaBody": "Die Ollama-Auswahl wird nicht vom kommerziellen Katalog gefiltert; sie zeigt die Modelle des Ollama-Servers. Wählen Sie für lokale Ausführung ein lokales Modell mit ausreichend RAM und Kontext für Journalblöcke. Cloud-Modelle bleiben auch über einen lokalen Ollama-Server remote." + }, + "defaultPrompt": { + "heading": "Standard-Eingabeaufforderung", + "intro": "Im Modus Standard nutzt Monitor den unten gezeigten Systemprompt. Vor dem Aufruf werden die Platzhalter ersetzt: '{'language'}', '{'detail_level'}', '{'emoji_instructions'}', '{'suggestions_addon'}'. Danach folgen Varianten für formatierte und einfache Kanäle sowie der Zusatz für KI-Vorschläge.", + "showFullSummary": "Vollständige Standardsystemaufforderung anzeigen", + "passagesIntro": "Zwei Textvarianten werden entsprechend dem Schalter Formatierte Nachrichten des jeweiligen Kanals eingesetzt:", + "passages": [ + "Rich on → ein Emoji-Block wird eingeschleust, der die Symbole auflistet, die der LLM verwenden kann, sowie eine Hostnamenregel (der LLM muss das Hostnamenpräfix aus dem Titel wörtlich beibehalten) und eine Handvoll formatierter Beispiele (Backup-Start, Backup vollständig, Updates, VM Start, Gesundheit beeinträchtigt). Dies erzeugt die emoji-präfixierten Nachrichten auf Telegram und Discord.", + "Rich off → Ein einzeiliger Block weist den LLM an, nur einfache ASCII zu verwenden - keine Emojis, keine Unicode-Symbole. Wird für E-Mails und jeden Kanal verwendet, bei dem Formatierungsgeräusche die Posteingangsregeln oder die Lesbarkeit verletzen." + ], + "suggestionsPlaceholder": "Und der '{'suggestions_addon'}' Platzhalter ist leer, es sei denn, Sie aktivieren AI Suggestions (nächster Abschnitt), in welchem Fall dieser Block injiziert wird:", + "showAddonSummary": "AI Suggestions Addon anzeigen" + }, + "customPrompt": { + "heading": "Benutzerdefinierter Eingabeaufforderungsmodus", + "intro": "Der Modus Benutzerdefiniert ersetzt den gesamten Standard-Systemprompt durch Ihren eigenen Text. Er wird in den SQLite-Einstellungen gespeichert und bei jedem KI-Aufruf unverändert gesendet. So können Sie Ton, Aufbau und Schwerpunkt frei festlegen.", + "imageAlt": "Eigener Prompt mit Textfeld für Übersetzungsregeln, Export- und Import-Schaltflächen sowie Link zu Community-Prompts", + "imageCaption": "Benutzerdefinierte Eingabeaufforderung — großer Textbereich mit der Eingabeaufforderung des Benutzers sowie Export, Import und ein Link zur Community-Galerie auf GitHub.", + "changesTitle": "Was sich ändert, wenn Custom eingeschaltet ist", + "changes": [ + "Die Standardaufforderung wird vollständig ersetzt. Die Proxmox-Mappings, die Kontext-Handling-Regeln und die Emoji-Anweisungen sind alle verschwunden. Wenn Sie eine davon behalten möchten, fügen Sie sie in Ihre Eingabeaufforderung ein - die unten gezeigte gebündelte EXAMPLE_CUSTOM_PROMPT ist ein Ausgangspunkt.", + "Die Sprachauswahl wird ignoriert. Die Standard-Eingabeaufforderung hat einen '{'language'}'-Platzhalter; die benutzerdefinierte Eingabeaufforderung nicht. Wenn Sie eine Ausgabe in einer bestimmten Sprache wünschen, deklarieren Sie sie in Ihrer Eingabeaufforderung (\"Ins Spanische übersetzen\", \"Alles auf Französisch ausgeben\").", + "Der eigene Prompt hat ein festes Limit von 500 Token, unabhängig von der gespeicherten Detailstufe. Der Standardmodus nutzt 500 / 1500 / 3000. Prompt-Änderungen erhöhen das Limit nicht; fordern Sie kürzere Antworten an oder wählen Sie eine passende Standardstufe.", + "Die Ausgabemarker bleiben erforderlich. Geben Sie [TITLE] und [BODY] im Antwortformat vor. Der Parser liest deren Inhalt; fehlt ein Marker, wird die ursprüngliche Vorlage verwendet.", + "Emoji-Regeln formatierter Nachrichten werden nicht automatisch ergänzt. Fordern Sie Emojis im eigenen Prompt ausdrücklich an oder untersagen Sie sie für Klartext. Der Schalter steuert nur die Standardblöcke, nicht Ihren eigenen Text." + ], + "starterTitle": "Startaufforderung", + "starterIntro": "Der Textbereich Benutzerdefinierte Eingabeaufforderung wird mit einem minimalen Beispiel ausgeliefert, das Sie anpassen können:", + "showStarterSummary": "Benutzerdefinierten Beispielprompt anzeigen", + "shareTitle": "Aufforderungen mit der Community teilen", + "shareIntro": "Die Schaltfläche Export schreibt Ihre aktuelle benutzerdefinierte Eingabeaufforderung in eine Datei (.txt / .md), die Sie als Backup oder Hand an eine andere Person speichern können. Import zieht einen zurück. Der dritte Button neben ihnen verlinkt zu einer öffentlichen Community-Galerie auf GitHub:", + "shareLinkLabel": "github.com/MacRimi/ProxMenux/discussions — Eigene Prompts für KI-Benachrichtigungen teilen", + "shareOutro": "Durchsuchen sie die diskussion, um zu sehen, was andere betreiber erstellt haben - knappe pager-alarme, ausführliche technische berichte, sprachspezifische varianten. Wenn Sie Ihre optimieren und das Ergebnis mögen, posten Sie es dort: Selbst eine Beschreibung mit einem Absatz, für die Ihre Eingabeaufforderung optimiert wird, hilft den Menschen, einen guten Ausgangspunkt zu finden. Feedback darüber, was funktioniert und was nicht, ist ebenso willkommen." + }, + "suggestions": { + "heading": "KI-Vorschläge (BETA)", + "intro": "KI-Vorschläge sind ein optionaler Zusatz für einen kurzen, umsetzbaren Tipp am Ende der Nachricht. Dafür müssen Modus Standard, der KI-Hauptschalter und KI-Vorschläge aktiv sein. Der Prompt verlangt, den Tipp bei unklarer Ursache oder Lösung auszulassen.", + "formatIntro": "Wenn ein Tipp hinzugefügt wird, folgt er genau diesem Format:", + "rulesIntro": "Die Regeln im Addon (sichtbar im zusammenklappbaren Block unter der Standard-Eingabeaufforderung oben):", + "rules": [ + "Der Tipp ist nur enthalten, wenn der Journalkontext oder die Datenbank mit bekannten Fehlern eindeutig auf einen bestimmten Fix hinweist.", + "Der Prompt verlangt einen Tipp unter 100 Zeichen; der Parser prüft diese Länge nicht unabhängig.", + "Der Prompt verlangt einen konkreten Befehl oder Pfad und weist das Modell an, allgemeine Ratschläge zu vermeiden.", + "Wenn ein bekannter Fehler eine Lösung bietet, muss der LLM diese Lösung verwenden und keine neue erfinden.", + "Der Prompt weist das Modell an, den Tipp wegzulassen, wenn die Eingabe keine konkrete Lösung belegt." + ], + "betaTitle": "Warum Beta", + "betaBody": "Die Tip-Qualität hängt von zwei Dingen ab, die außerhalb von ProxMenux liegen: das ausgewählte Modell und wie reich der Journal-Kontext für die Veranstaltung war. Mit einem starken Modell (Claude 3.5 Haiku, GPT-4.1 Mini, Llama 3.3 70B) und einem Festplattenfehler, der mit smartctl + Zeitschriftenzeilen geliefert wird, ist der Tipp durchweg nützlich. Mit einem winzigen lokalen Ollama-Modell und einem einzeiligen Ereignis kann die Spitze flach fallen oder ganz übersprungen werden. Deaktivieren Sie den Schalter, wenn Sie die Tipps laut finden, und aktivieren Sie ihn wieder, wenn Sie ihn zurückhaben möchten." + }, + "detailLevel": { + "heading": "Detailebene pro Kanal", + "intro": "Telegram, Discord, Gotify und E-Mail haben jeweils eine eigene Auswahl der Detailstufe. Drei Werte steuern im Standardprompt sowohl das Ausgabe-Token-Limit als auch die Detailvorgaben:", + "headerLevel": "Ebene", + "headerLabel": "UI-Kennzeichnung", + "headerCap": "Ausgabegrenze", + "headerProduce": "Was der Prompt vom LLM verlangt", + "rows": [ + { + "level": "kurz", + "label": "2–3 Zeilen, nur das Wesentliche", + "cap": "500-Token", + "produce": "\"Was passiert ist + wo\". Nichts anderes." + }, + { + "level": "Standard", + "label": "Knapp mit grundlegendem Kontext", + "cap": "1500-Token", + "produce": "3–6 Zeilen: was, wo, Ursache, betroffene Geräte." + }, + { + "level": "ausführlich", + "label": "Vollständige technische Angaben", + "cap": "3000-Token", + "produce": "Vollständiger Bericht: was, wo, Ursache, Betroffene, Protokolle, SMART-Daten und Verlauf." + } + ], + "defaultsIntro": "Standardwerte bei der ersten Installation:", + "defaults": [ + "Telegram, Discord, Gotify — standard.", + "Email — detailed. E-Mail ist der Kanal, in dem Sie normalerweise das vollständige Bild für die Archivierung wünschen." + ], + "emailTitle": "E-Mail-Detailebene fügt das Original hinzu", + "emailBody": "Liefert der KI-Formatter ein Ergebnis für E-Mail mit detailed und hat der Ursprungstext mehr als 50 Zeichen, hängt er ihn nach 40 Bindestrichen und Original message: an. Das bewahrt Details für spätere Suchen. Bei KI-Umgehung oder Fehlern kann nur die ursprüngliche Vorlage versendet werden." + }, + "language": { + "heading": "Sprache", + "intro": "Die Oberflächenauswahl bietet dreizehn Sprachen. Sie speichert ai_language, das der Standardprompt in \"translate alerts into '{'language'}'\" verwendet. Die Liste:", + "list": "Englisch (en), Slowakisch (sk), Spanisch (es), Französisch (fr), Deutsch (de), Portugiesisch (pt), Italienisch (it), Russisch (ru), Schwedisch (sv), Norwegisch (no), Japanisch (ja), Chinesisch (zh), Niederländisch (nl).", + "rulesIntro": "Zwei wichtige Regeln direkt aus der Aufforderung:", + "rules": [ + "Übersetzen: Beschriftungen, Beschreibungen, Statuswörter und Einheiten, etwa GB → Go auf Französisch.", + "Nicht übersetzen: Hostnamen, IPs, Pfade, VM/CT IDs, Gerätenamen wie /dev/sdX, technische Identifikatoren. Diese bleiben wortwörtlich unabhängig von der Sprache." + ], + "customNote": "Der eigene Prompt verwendet die Sprachauswahl nicht. Geben Sie die gewünschte Ausgabesprache direkt im Prompt an." + }, + "templates": { + "heading": "Ein Hinweis auf Vorlagen", + "body1": "Die KI erhält formatierten Vorlagentext statt roher Ereignisdaten. Typen wie vm_start, auth_fail und health_degraded haben Vorlagen in notification_templates.py. Die KI formuliert geeignete Texte um; backup_complete und backup_fail behalten deterministische Berichte und umgehen die KI.", + "body2": "Zwei praktische Implikationen: Die KI sieht nie einen Hostnamen oder VMID, den sie erfinden muss - diese Felder werden von der Vorlage vor dem Umschreiben platziert. Und wenn AI deaktiviert ist, wird der vorgefertigte Körper direkt versandt. Die Notifications-Seite dokumentiert die Versandpipeline vollständig und ist der richtige Querverweis für alles, was mit einem Ereignis passiert, bevor es diese Ebene erreicht." + }, + "privacy": { + "heading": "Datenschutz & Datenfluss", + "intro": "Bei aktivierter KI-Umschreibung sendet Monitor den Vorlagentext samt Kontextblöcken an den Anbieter. Dazu können Hostnamen, IP-Adressen, Benutzernamen, Gerätepfade, Journalzeilen und SMART-Attribute des betroffenen Geräts gehören. Ob diese Daten den Host verlassen, hängt vom Anbieter ab:", + "headerProvider": "Anbieter", + "headerDestination": "Datenziel", + "rows": [ + { + "provider": "Ollama", + "destination": "Lokale Modelle laufen auf dem konfigurierten Ollama-Host. Ist dies der Proxmox-Knoten selbst, bleiben ihre Anfragen dort. Ollama-Cloud-Modelle senden Anfragen nach außen, auch über einen lokalen Ollama-Server." + }, + { + "provider": "OpenAI", + "destination": "Standardmäßig api.openai.com oder die konfigurierte eigene Basis-URL. Es gelten die Datenverarbeitungsregeln des tatsächlichen Endpunktbetreibers." + }, + { + "provider": "Anthropic", + "destination": "api.anthropic.com." + }, + { + "provider": "Google Gemini", + "destination": "generativelanguage.googleapis.com." + }, + { + "provider": "Groq", + "destination": "api.groq.com." + }, + { + "provider": "OpenRouter", + "destination": "openrouter.ai leitet an den im Feld model gewählten Modellanbieter weiter. Zwei Verarbeitungsstationen statt einer." + } + ], + "calloutTitle": "Wenn Ereignisinhalte das Netzwerk nicht verlassen können", + "calloutBody": "Nutzen Sie einen lokal gehosteten Endpunkt mit lokalem Modell, etwa Ollama oder einen OpenAI-kompatiblen Server, oder deaktivieren Sie die KI. Ollama-Cloud-Modelle verarbeiten Daten nicht lokal. Der Dispatcher anonymisiert keine Hostnamen oder IP-Adressen; er nutzt den tatsächlichen Ereignisinhalt." + }, + "whereNext": { + "heading": "Wohin als nächstes", + "items": [ + { + "label": "Benachrichtigungen", + "href": "/docs/monitor/notifications", + "tail": "— die Versandpipeline, Kanäle, Per-Event-Toggles und die PVE webhook-Integration, die diese Schicht umgibt." + }, + { + "label": "Gesundheitsmonitor", + "href": "/docs/monitor/health-monitor", + "tail": "— der größte Einzelproduzent von Ereignissen, den die KI am Ende umschreibt, mit eigenen Unterdrückungsdauern pro Kategorie." + }, + { + "label": "Architektur", + "href": "/docs/monitor/architecture", + "tail": "- wo der AI Enhancer in den breiteren Monitor-Prozess passt (es ist ein Modul, kein separater Dienst)." + } + ], + "communityLabel": "Community prompts auf GitHub", + "communityTail": "- durchsuchen, teilen, fragen." + } +} diff --git a/web/messages/de/docs/monitor/api-reference.json b/web/messages/de/docs/monitor/api-reference.json new file mode 100644 index 00000000..03b616d5 --- /dev/null +++ b/web/messages/de/docs/monitor/api-reference.json @@ -0,0 +1,760 @@ +{ + "meta": { + "title": "Proxmox-Monitor-API — Integrationsreferenz | ProxMenux", + "description": "HTTP-Endpunkte von ProxMenux Monitor für Home Assistant, Homepage, Grafana, Prometheus, n8n und eigene Dashboards. Zustand abfragen und dokumentierte Änderungen anstoßen: VM-Steuerung, Sicherungen, Benachrichtigungen und Warnungsbestätigung.", + "ogTitle": "Proxmox-Monitor-API — Integrationsreferenz", + "ogDescription": "ProxMenux-Monitor-Endpunkte für Home Assistant, Homepage, Grafana, Prometheus, n8n und eigene Dashboards.", + "twitterTitle": "Proxmox-Monitor-API | ProxMenux", + "twitterDescription": "Endpunkte für Home Assistant, Homepage, Grafana, Prometheus, n8n und eigene Dashboards." + }, + "header": { + "title": "API-Referenz", + "description": "HTTP-Endpunkte zum Lesen des Zustands und Aufrufen dokumentierter Aktionen: Home-Assistant-Sensoren, Homepage-Karten, Grafana-Dashboards, Prometheus-Erfassung, n8n-Abläufe und eigene Skripte. Mit Kategorien, exportierten Metriken und curl-Beispielen.", + "section": "ProxMenux Monitor" + }, + "intro": { + "title": "Wofür diese Seite ist", + "body": "Diese Seite enthält Endpunkte für externe Integrationen: Datenabruf und Aktionen wie Sicherungen, eigene Meldungen und Warnungsbestätigung. Die API läuft im Flask-Prozess des Dashboards auf TCP 8008. Bindeadresse und TLS beschreibt Zugriff und Authentifizierung." + }, + "headerEndpoint": "Endpunkt", + "headerMethod": "Methode", + "headerUse": "Verwendung", + "auth": { + "heading": "Authentifizierung", + "intro": "Bei aktiver Authentifizierung erwarten geschützte Endpunkte ein JWT-Bearer-Token im Anfrageheader:", + "tokensIntro": "Zwei Möglichkeiten, das Token zu erhalten:", + "items": [ + "API-Token, für Integrationen empfohlen. Sie gelten 365 Tage und entstehen unter Sicherheit → API-Token. Sie haben Namen und sind einzeln widerrufbar. read_only dient dem Datenabruf; full_admin wählen Sie nur für benötigte Verwaltungsaktionen.", + "Anmeldung, JWT für 24 Stunden. POST /api/auth/login mit Benutzername, Passwort und TOTP, falls 2FA dies verlangt. Das JWT läuft nach 24 Stunden ab; Skripte müssen sich danach erneut anmelden." + ], + "flowLink": "Anmeldung, Passwörter, 2FA, Auditprotokoll und TLS erklärt Zugriff und Authentifizierung.", + "rows": [ + { + "endpoint": "/api/auth/login", + "method": "POST", + "use": "Anfragefelder (Schema): '{'\"username\",\"password\",\"totp_token?\"'}'. Liefert ein JWT für 24 Stunden." + }, + { + "endpoint": "/api/auth/api-tokens", + "method": "GET", + "use": "Listen Sie API-Token auf (nur Metadaten - Namen, Präfixe, Daten; niemals das eigentliche Geheimnis)." + }, + { + "endpoint": "/api/auth/generate-api-token", + "method": "POST", + "use": "Erstellt mit einer angemeldeten Sitzung ein API-Token für 365 Tage. Felder: password, token_name?, totp_token?, scope?. Passwort und erforderliches TOTP werden erneut geprüft. scope ist standardmäßig read_only; full_admin muss ausdrücklich gewählt werden. Der geheime Wert erscheint nur einmal." + }, + { + "endpoint": "/api/auth/api-tokens/", + "method": "DELETE", + "use": "Widerruf eines bestimmten API-Tokens durch seine ID." + } + ] + }, + "conventions": { + "heading": "Konventionen", + "items": [ + "Die meisten Endpunkte verwenden JSON. Downloads können Klartext liefern; /api/prometheus liefert das Prometheus-Textformat 0.0.4 statt OpenMetrics. Prüfen Sie den Antworttyp der jeweiligen Route.", + "Viele Schreiboperationen liefern '{'\"success\": true, ...'}'. Fehlerformate variieren; häufig ist '{'\"success\": false, \"error\": \"'<'reason'>'\"'}'. Prüfen Sie HTTP-Status und Felder: manche Authentifizierungsanforderungen liefern HTTP 200 mit success false.", + "Abfrageparameter hängen vom Endpunkt ab. Verwenden Sie limit, offset, since und Kategoriefilter nur, wenn die Route sie unterstützt.", + "Zeitformate variieren: Unix-Zeitstempel, ISO-8601-Zeichenfolgen und systemd-Datumsformate kommen vor. Nicht jedes Feld hat dieselbe Einheit oder eine ausdrückliche Zeitzone." + ] + }, + "system": { + "heading": "System und Hardware", + "rows": [ + { + "endpoint": "/api/system", + "method": "GET", + "use": "Aktuelle Werte für CPU, RAM, Swap, Betriebszeit und Last." + }, + { + "endpoint": "/api/info", + "method": "GET", + "use": "Statische Host-Infos: Hostname, Kernel, PVE-Version, CPU-Modell, Distribution." + }, + { + "endpoint": "/api/system-info", + "method": "GET", + "use": "Erweiterte Systemdaten der Dashboard-Kopfzeile: Gesamtmetriken und Startzeitpunkt." + }, + { + "endpoint": "/api/hardware", + "method": "GET", + "use": "Detaillierter Hardwarebestand: PCI-Geräte, GPUs und Sensorzuordnung." + }, + { + "endpoint": "/api/hardware/live", + "method": "GET", + "use": "Aktuelle Werte schnell veränderlicher Sensoren." + }, + { + "endpoint": "/api/temperature/history", + "method": "GET", + "use": "Zeitreihen der CPU- und Package-Temperaturen." + }, + { + "endpoint": "/api/gpu//realtime", + "method": "GET", + "use": "Aktuelle GPU-Metriken von NVIDIA, Intel und AMD je PCI-Slot." + } + ] + }, + "actions": { + "heading": "Systemaktionen", + "intro": "Diese asynchronen Systemaktionen laufen in temporären systemd-Units. Bei aktiver Authentifizierung verlangen ihre Schreibzugriffe full_admin; read_only darf .../status abfragen. Angenommene Starts liefern HTTP 202 mit Zustand; .../status zeigt den Fortschritt. Gaststeuerung und Sicherungen haben andere Antworten, siehe unten.", + "shapeTitle": "Gemeinsames Antwortformat", + "shapeIntro": "Asynchrone Systemaktionen teilen das folgende JSON-Zustandsobjekt. Gaststeuerung und Sicherungen antworten in anderen Formaten:", + "shapeCode": "{\n \"unit\": \"proxmenux-action-pve-update.service\",\n \"state\": \"idle | running | success | failed | cancelled\",\n \"started_at\": \"Sat 2026-08-01 11:01:32 CEST\",\n \"finished_at\": null,\n \"exit_code\": null,\n \"result\": null\n}", + "concurrencyTitle": "Parallele Ausführung und Abbruch", + "concurrencyBody": "Ein zweiter Start derselben laufenden Aktion liefert HTTP 409. Abbruch gibt es nur mit dokumentierter DELETE-Route, etwa beim PVE-Update. Der Zustand wird cancelled, Zeitstempel bleiben erhalten. Endzustände liegen im Prozessspeicher und können beim Monitor-Neustart verloren gehen.", + "rows": [ + { + "endpoint": "/api/system/power/reboot", + "method": "POST", + "use": "Startet den Neustart des Proxmox-Hosts. Die HTTP-Verbindung kann beim Beginn der Abschaltung durch systemd abbrechen." + }, + { + "endpoint": "/api/system/power/reboot/status", + "method": "GET", + "use": "Zustand des aktuellen oder letzten Neustarts." + }, + { + "endpoint": "/api/system/power/shutdown", + "method": "POST", + "use": "Schaltet den Proxmox-Host aus, etwa als Reaktion auf ein USV-Abschaltsignal." + }, + { + "endpoint": "/api/system/power/shutdown/status", + "method": "GET", + "use": "Zustand der aktuellen oder letzten Abschaltung." + }, + { + "endpoint": "/api/system/pve-update/run", + "method": "POST", + "use": "Startet denselben PVE-Updateablauf wie Jetzt aktualisieren im Health Monitor und das Shell-Menü; delegiert an update-pve-safe.sh." + }, + { + "endpoint": "/api/system/pve-update/status", + "method": "GET", + "use": "Zustand des aktuellen oder letzten PVE-Updates." + }, + { + "endpoint": "/api/system/pve-update", + "method": "DELETE", + "use": "Bricht ein laufendes PVE-Update mit SIGTERM ab." + }, + { + "endpoint": "/api/proxmenux/self-update/run", + "method": "POST", + "use": "Aktualisiert ProxMenux mit dem Installer des eingestellten Stable- oder Beta-Kanals. Eine eigene systemd-Unit lässt den Auftrag den vom Installer ausgelösten proxmenux-monitor-Neustart überstehen." + }, + { + "endpoint": "/api/proxmenux/self-update/status", + "method": "GET", + "use": "Zustand der aktuellen oder letzten ProxMenux-Selbstaktualisierung." + }, + { + "endpoint": "/api/vms//control", + "method": "POST", + "use": "Übermittelt die Steuerung einer VM oder eines LXC. action erlaubt start, stop, shutdown oder reboot. Eine erfolgreiche Antwort enthält einen bestätigten PVE-Task und bedeutet nicht dessen Abschluss. Fragen Sie den control-task-Endpunkt des Gastes für das Ergebnis ab." + }, + { + "endpoint": "/api/vms//backup", + "method": "POST", + "use": "Erstellt eine vzdump-Sicherung einer VM oder eines LXC. Optionale, an den Speicher anzupassende Felder: storage (PVE-Ziel), mode (snapshot, suspend oder stop), compress (zstd, lzo, gzip oder none), protected (true oder false), notes, notification (auto, always, failure oder never) und pbs_change_detection (default, legacy oder data). Liefert die UPID des PVE-Tasks." + }, + { + "endpoint": "/api/vms//backups", + "method": "GET", + "use": "Listet bisherige Sicherungen einer VM oder eines LXC auf allen erreichbaren Speichern auf." + } + ], + "syncVsAsyncTitle": "Zwei Arten von Aktionen", + "syncVsAsyncBody": "Host-Stromsteuerung und Updates laufen in temporären systemd-Units mit .../status. Nur das PVE-Update hat hier eine DELETE-Abbruchroute. VM/LXC-Steuerung liefert einen abzufragenden Task, Sicherung eine UPID für einen Hintergrundauftrag. Annahme bedeutet nicht Abschluss. Authentifizierung und Rechte hängen von der Route ab.", + "curlTitle": "curl-Beispiel", + "curlBody": "Startet ein PVE-Update und fragt bis zum Abschluss ab, wie eine Home-Assistant-Automation oder ein Ansible-Playbook.", + "curlCode": "TOKEN=\n\ncurl -sSf -X POST \\\n -H \"Authorization: Bearer $TOKEN\" \\\n https://:8008/api/system/pve-update/run\n\nwhile true; do\n state=$(curl -sSf -H \"Authorization: Bearer $TOKEN\" \\\n https://:8008/api/system/pve-update/status | jq -r .state)\n [ \"$state\" != \"running\" ] && break\n sleep 30\ndone\necho \"final state: $state\"", + "haTitle": "Home-Assistant-Beispiel", + "haBody": "Ein rest-Sensor fragt den Zustand ab; rest_command startet das Update. Binden Sie beide in Dashboard-Schaltflächen und Automationen ein:", + "haCode": "# configuration.yaml\nsensor:\n - platform: rest\n resource: https://pve.local:8008/api/system/pve-update/status\n name: pve_update_state\n value_template: \"{{ value_json.state }}\"\n scan_interval: 60\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\nrest_command:\n pve_update:\n url: https://pve.local:8008/api/system/pve-update/run\n method: POST\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\n # Start VM 100 (works for LXC too — same endpoint)\n vm_100_start:\n url: https://pve.local:8008/api/vms/100/control\n method: POST\n content_type: 'application/json'\n payload: '{\"action\": \"start\"}'\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\n # Backup VM 100 to the 'pbs-main' storage\n vm_100_backup:\n url: https://pve.local:8008/api/vms/100/backup\n method: POST\n content_type: 'application/json'\n payload: '{\"storage\": \"pbs-main\", \"mode\": \"snapshot\", \"compress\": \"zstd\"}'\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"" + }, + "health": { + "heading": "Gesundheitsmonitor", + "rows": [ + { + "endpoint": "/api/health", + "method": "GET", + "use": "Kleine Zustandsprüfung mit JSON-Feldern status, timestamp und version. Für Uptime-Kuma-Schlüsselwortprüfungen geeignet; bei aktiver Authentifizierung muss der Client den Bearer-Header senden." + }, + { + "endpoint": "/api/health/status", + "method": "GET", + "use": "Gesamtzustand: ein Schweregrad und eine Zusammenfassung." + }, + { + "endpoint": "/api/health/details", + "method": "GET", + "use": "Alle zehn Kategorien mit Zustand und strukturierten Daten der jeweiligen Prüfung." + }, + { + "endpoint": "/api/health/full", + "method": "GET", + "use": "Vollständige Daten: Kategorien, aktive Fehler, unterdrückte Warnungen und Einstellungen. Hintergrunddaten werden genutzt, wenn sie jünger als sechs Minuten sind; sonst oder bei erzwungener Aktualisierung läuft eine neue Prüfung." + }, + { + "endpoint": "/api/health/active-errors", + "method": "GET", + "use": "Aktive Liste, filterbar durch ?category=<name>." + }, + { + "endpoint": "/api/health/dismissed", + "method": "GET", + "use": "Unterdrückte Warnungen mit verbleibenden Stunden." + }, + { + "endpoint": "/api/health/settings", + "method": "GET", + "use": "Eingestellte Unterdrückungsdauer je Kategorie." + }, + { + "endpoint": "/api/health/remote-storages", + "method": "GET", + "use": "Inventar von Proxmox-definierten Fernspeichern mit Online-Status." + }, + { + "endpoint": "/api/health/interfaces", + "method": "GET", + "use": "Netzwerkschnittstellen mit Typ (Bridge / Bond / physisch), IP und Verbindungsgeschwindigkeit." + }, + { + "endpoint": "/api/health/acknowledge", + "method": "POST", + "use": "Anfrageinhalt: '{'\"error_key\":\"smart_sdh\"'}'. Unterdrückt eine Warnung für die eingestellte Dauer ihrer Kategorie." + }, + { + "endpoint": "/api/health/cleanup-orphans", + "method": "POST", + "use": "Manuelle Bereinigung von Fehlern, deren zugrunde liegendes Gerät oder VM verschwunden ist. Idempotent." + } + ], + "outro": "Antwortformate und Kategorien erklärt Health Monitor." + }, + "storage": { + "heading": "Speicher", + "rows": [ + { + "endpoint": "/api/storage", + "method": "GET", + "use": "Für den Host sichtbare Datenträger: Blockgeräte, ZFS-Pools und LVM." + }, + { + "endpoint": "/api/storage/summary", + "method": "GET", + "use": "Kompakte Zusammenfassung, die von Dashboardkarten verwendet wird." + }, + { + "endpoint": "/api/proxmox-storage", + "method": "GET", + "use": "Proxmox-definierte Speicher von /etc/pve/storage.cfg mit Online-Zustand und freiem Speicherplatz." + }, + { + "endpoint": "/api/storage/observations", + "method": "GET", + "use": "Dauerhaft gespeicherte Beobachtungen: SMART-Warnungen, E/A-Fehler und ZFS-Ereignisse. Bleiben nach automatischer Fehlerauflösung erhalten." + }, + { + "endpoint": "/api/storage/smart/", + "method": "GET", + "use": "Aktuelle SMART Attribute für eine Festplatte." + }, + { + "endpoint": "/api/storage/smart//latest", + "method": "GET", + "use": "Aktueller SMART Selbsttest für die Festplatte." + }, + { + "endpoint": "/api/storage/smart//history", + "method": "GET", + "use": "Liste der gespeicherten SMART-Berichte für die Festplatte." + }, + { + "endpoint": "/api/storage/smart//history/", + "method": "GET", + "use": "Lesen Sie einen spezifischen gespeicherten SMART-Bericht." + }, + { + "endpoint": "/api/storage/smart//test", + "method": "POST", + "use": "Startet einen SMART-Selbsttest. Anfrageschema: '{'\"type\":\"short\"|\"long\"'}'." + }, + { + "endpoint": "/api/storage/smart/schedules", + "method": "GET", + "use": "Listen Sie die derzeit geplanten SMART-Tests auf." + }, + { + "endpoint": "/api/storage/smart/tools", + "method": "GET", + "use": "Prüft, ob smartctl und zugehörige Werkzeuge installiert sind." + } + ] + }, + "network": { + "heading": "Netzwerk", + "rows": [ + { + "endpoint": "/api/network", + "method": "GET", + "use": "Alle Schnittstellen mit Linkzustand und Adressen." + }, + { + "endpoint": "/api/network/summary", + "method": "GET", + "use": "Kompakte Ansicht, die vom Dashboard verwendet wird." + }, + { + "endpoint": "/api/network//metrics", + "method": "GET", + "use": "RX/TX je Schnittstelle, Fehlerzähler und RRD-Zeitreihen." + }, + { + "endpoint": "/api/network/latency/current", + "method": "GET", + "use": "Letzte Latenzmessung zum Gateway." + }, + { + "endpoint": "/api/network/latency/history", + "method": "GET", + "use": "Zeitreihe der Gateway-Latenz." + } + ] + }, + "vms": { + "heading": "VMs und Container", + "rows": [ + { + "endpoint": "/api/vms", + "method": "GET", + "use": "VMs und CTs des lokalen Knotens mit Zustand, vmid und Name." + }, + { + "endpoint": "/api/vms/", + "method": "GET", + "use": "Vollständige Details für einen Gast (Konfiguration, Netzwerk, Festplatten)." + }, + { + "endpoint": "/api/vms//metrics", + "method": "GET", + "use": "CPU / Speicher / Festplatte I/O Zeitreihe für einen Gast (RRD)." + }, + { + "endpoint": "/api/vms//logs", + "method": "GET", + "use": "Aktuelle Task-Protokolle dieses Gastes." + }, + { + "endpoint": "/api/vms//backups", + "method": "GET", + "use": "Für diesen Gast gespeicherte Sicherungen." + }, + { + "endpoint": "/api/vms//control", + "method": "POST", + "use": "Wählen Sie eine Aktion aus dem Schema: '{'\"action\":\"start|stop|reboot|shutdown\"'}'. Steuert den Betriebszustand des Gastes." + }, + { + "endpoint": "/api/vms//backup", + "method": "POST", + "use": "Startet vzdump für den Gast. Die Anfrage legt Speicher und Modus fest (snapshot / suspend / stop)." + }, + { + "endpoint": "/api/vms//config", + "method": "PUT", + "use": "Aktualisieren Sie das Beschreibungsfeld (Notizen) eines VM / CT. Andere Konfigurationsschlüssel sind von diesem Endpunkt aus nicht veränderbar." + }, + { + "endpoint": "/api/node/metrics", + "method": "GET", + "use": "Zusammengefasste Knotenmetriken als RRD-Zeitreihen." + } + ] + }, + "backups": { + "heading": "Sicherungen", + "rows": [ + { + "endpoint": "/api/backups", + "method": "GET", + "use": "Sicherungen auf dir-, NFS-, CIFS- und PBS-Speichern, die über den lokalen Knoten abgefragt werden. Keine vollständige Prüfung aller Clusterknoten." + }, + { + "endpoint": "/api/backup-storages", + "method": "GET", + "use": "Als Sicherungsziele gekennzeichnete Speicher mit freiem Platz." + } + ] + }, + "logs": { + "heading": "Protokolle, Aufgaben, Ereignisse", + "rows": [ + { + "endpoint": "/api/logs", + "method": "GET", + "use": "Gefilterte Journaleinträge. Anfrage: ?level=&service=&limit=." + }, + { + "endpoint": "/api/logs/download", + "method": "GET", + "use": "Exportiert den gefilterten Bereich als Klartext." + }, + { + "endpoint": "/api/events", + "method": "GET", + "use": "Interner Ereignisstrom - derselbe, der Benachrichtigungen füttert." + }, + { + "endpoint": "/api/task-log/", + "method": "GET", + "use": "Vollständiges Klartextprotokoll eines Proxmox-Tasks anhand seiner UPID." + } + ] + }, + "notifications": { + "heading": "Benachrichtigungen und KI", + "intro": "Versand, Kanaleinrichtung und KI-Umformulierung erklären Benachrichtigungen und KI-Assistent.", + "rows": [ + { + "endpoint": "/api/notifications", + "method": "GET", + "use": "Im Dashboard angezeigte aktuelle Benachrichtigungen." + }, + { + "endpoint": "/api/notifications/download", + "method": "GET", + "use": "Exportiert Benachrichtigungen als Text." + }, + { + "endpoint": "/api/notifications/status", + "method": "GET", + "use": "Versandzustand: aktiver Hintergrundprozess, Warteschlangenlänge und letzter Versand." + }, + { + "endpoint": "/api/notifications/settings", + "method": "GET", + "use": "Liest die Benachrichtigungseinstellungen: Kanäle, Ereignisschalter, KI-Umformulierung und Anzeigename." + }, + { + "endpoint": "/api/notifications/history", + "method": "GET", + "use": "Versandverlauf. Parameter: ?limit=&offset=&severity=&channel=." + }, + { + "endpoint": "/api/notifications/history", + "method": "DELETE", + "use": "Leert die Tabelle des Versandverlaufs." + }, + { + "endpoint": "/api/notifications/test", + "method": "POST", + "use": "Sendet eine Testnachricht an einen Kanal. Anfrageinhalt: '{'\"channel\":\"telegram\"'}'." + }, + { + "endpoint": "/api/notifications/send", + "method": "POST", + "use": "Erzeugt ein eigenes Ereignis. Anfrageinhalt: '{'\"event_type\":\"custom\",\"severity\":\"WARNING\",\"title\":\"...\",\"body\":\"...\",\"data\":'{''}''}'." + }, + { + "endpoint": "/api/notifications/test-ai", + "method": "POST", + "use": "Prüft die Verbindung zum KI-Anbieter. Anfragefelder (Schema): '{'\"provider\",\"api_key\",\"model\",\"ollama_url?\"'}'." + }, + { + "endpoint": "/api/notifications/provider-models", + "method": "POST", + "use": "Listen Sie verfügbare Modelle für den ausgewählten AI-Anbieter auf." + }, + { + "endpoint": "/api/notifications/proxmox/setup-webhook", + "method": "POST", + "use": "Registrieren Sie den Monitor als webhook-Ziel in /etc/pve/notifications.cfg." + }, + { + "endpoint": "/api/notifications/proxmox/cleanup-webhook", + "method": "POST", + "use": "Entfernen Sie das Monitor-Ziel aus der Benachrichtigungskonfiguration von PVE." + }, + { + "endpoint": "/api/notifications/proxmox/read-cfg", + "method": "GET", + "use": "Lesen Sie den aktuellen notifications.cfg von PVE, wie PVE ihn sieht." + } + ] + }, + "security": { + "heading": "Sicherheit (lesen)", + "rows": [ + { + "endpoint": "/api/security/firewall/status", + "method": "GET", + "use": "PVE Firewall Status und aktive Regeln." + }, + { + "endpoint": "/api/security/fail2ban/details", + "method": "GET", + "use": "Zustand des Fail2Ban-Jails; setzt diese optionale Installation voraus." + }, + { + "endpoint": "/api/security/fail2ban/activity", + "method": "GET", + "use": "Aktuelle Fail2Ban-Ereignisse: Sperren, Entsperren und Jail-Starts." + }, + { + "endpoint": "/api/security/lynis/status", + "method": "GET", + "use": "Lynis-Zustand: Installation und Zeitpunkt der letzten Prüfung." + }, + { + "endpoint": "/api/security/lynis/report", + "method": "GET", + "use": "Letzter Lynis-Auditbericht: Warnungen, Vorschläge und Hardening-Index." + }, + { + "endpoint": "/api/security/tools", + "method": "GET", + "use": "Erkennen Sie, welche optionalen Sicherheitstools (Fail2Ban, Lynis) installiert sind." + } + ] + }, + "proxmenuxIntegration": { + "heading": "ProxMenux Integration", + "rows": [ + { + "endpoint": "/api/proxmenux/update-status", + "method": "GET", + "use": "Verfügbarkeit eines ProxMenux-Monitor-Updates sowie installierte und neueste Version." + }, + { + "endpoint": "/api/proxmenux/installed-tools", + "method": "GET", + "use": "Liste jeder ProxMenux-Postinstallationsoptimierung, die derzeit auf dem Host registriert ist (ab /usr/local/share/proxmenux/installed_tools.json)." + }, + { + "endpoint": "/api/proxmenux/tool-source/", + "method": "GET", + "use": "Quellcode der zugeordneten Nachinstallationsfunktion aus aktuellen Host-Skripten oder erhaltenem älterem Code. Kein garantiertes Abbild des ursprünglich ausgeführten Codes." + } + ] + }, + "prometheus": { + "heading": "Prometheus-Metriken", + "intro": "Der authentifizierte Endpunkt GET /api/prometheus liefert das Prometheus-Textformat 0.0.4. Jede Metrik enthält node=\"<hostname>\" und einen Zeitstempel. Erfassen Sie sie mit Prometheus oder einer kompatiblen Zeitreihendatenbank.", + "exportedTitle": "Exportierte Metriken", + "headerGroup": "Gruppe", + "headerMetric": "Metrik", + "headerDesc": "Beschreibung", + "groups": [ + { + "group": "System", + "metrics": [ + { + "metric": "proxmox_cpu_usage", + "desc": "CPU-Auslastung in Prozent, Typ Gauge." + }, + { + "metric": "proxmox_memory_total_bytes", + "desc": "Physikalischer Gesamtspeicher in Bytes." + }, + { + "metric": "proxmox_memory_used_bytes", + "desc": "Belegter Arbeitsspeicher in Bytes." + }, + { + "metric": "proxmox_memory_usage_percent", + "desc": "Prozentsatz des Speicherverbrauchs." + }, + { + "metric": "proxmox_load_average", + "desc": "Systemlastdurchschnitt. Kennzeichnung period=\"1m\" | \"5m\" | \"15m\"." + } + ] + }, + { + "group": "Betriebszeit", + "metrics": [ + { + "metric": "proxmox_uptime_seconds", + "desc": "Sekunden seit dem letzten Systemstart." + } + ] + }, + { + "group": "Hardware", + "metrics": [ + { + "metric": "proxmox_cpu_temperature_celsius", + "desc": "CPU-Package-Temperatur." + }, + { + "metric": "proxmox_disk_temperature_celsius", + "desc": "Temperatur je Datenträger. Label disk." + }, + { + "metric": "proxmox_fan_speed_rpm", + "desc": "Lüfterdrehzahlen. Label fan." + } + ] + }, + { + "group": "Speicherplatz", + "metrics": [ + { + "metric": "proxmox_disk_total_bytes", + "desc": "Gesamtkapazität je exportiertem Datenträgereintrag. Label disk." + }, + { + "metric": "proxmox_disk_used_bytes", + "desc": "Belegte Kapazität je exportiertem Datenträgereintrag." + }, + { + "metric": "proxmox_disk_usage_percent", + "desc": "Prozentual belegte Kapazität je exportiertem Datenträgereintrag." + } + ] + }, + { + "group": "Netzwerk", + "metrics": [ + { + "metric": "proxmox_network_bytes_sent_total", + "desc": "Gesendete Bytes insgesamt, Typ Counter." + }, + { + "metric": "proxmox_network_bytes_received_total", + "desc": "Empfangene Bytes insgesamt, Typ Counter." + }, + { + "metric": "proxmox_interface_bytes_sent_total", + "desc": "Gesendete Bytes je Schnittstelle. Label interface." + }, + { + "metric": "proxmox_interface_bytes_received_total", + "desc": "Empfangene Bytes je Schnittstelle." + } + ] + }, + { + "group": "VMs / CTs", + "metrics": [ + { + "metric": "proxmox_vms_total", + "desc": "Gesamtzahl VMs und LXCs." + }, + { + "metric": "proxmox_vms_running", + "desc": "Anzahl laufender Gäste." + }, + { + "metric": "proxmox_vms_stopped", + "desc": "Anzahl der gestoppten Gäste." + }, + { + "metric": "proxmox_vm_status", + "desc": "Zustand je VM/CT: 1 läuft, 0 sonst. Labels node, vmid und name." + }, + { + "metric": "proxmox_vm_cpu_usage", + "desc": "CPU-Auslastung je VM/CT mit denselben Labels." + }, + { + "metric": "proxmox_vm_memory_used_bytes / _max_bytes", + "desc": "Belegter RAM und konfiguriertes Maximum je VM/CT." + } + ] + }, + { + "group": "GPU", + "metrics": [ + { + "metric": "proxmox_gpu_temperature_celsius", + "desc": "GPU-Temperatur. Labels slot und vendor; gpu enthält zusätzlich den GPU-Namen." + }, + { + "metric": "proxmox_gpu_utilization_percent", + "desc": "GPU-Auslastung in Prozent." + }, + { + "metric": "proxmox_gpu_memory_total_bytes", + "desc": "Gesamter GPU-Speicher." + }, + { + "metric": "proxmox_gpu_power_draw_watts", + "desc": "GPU-Leistungsaufnahme in Watt." + }, + { + "metric": "proxmox_gpu_clock_speed_mhz", + "desc": "GPU-Kerntakt." + }, + { + "metric": "proxmox_gpu_memory_clock_mhz", + "desc": "GPU-Speichertakt." + } + ] + }, + { + "group": "UPS", + "metrics": [ + { + "metric": "proxmox_ups_battery_charge_percent", + "desc": "Batterieladung in Prozent." + }, + { + "metric": "proxmox_ups_load_percent", + "desc": "Aktuelle Belastung der USV." + }, + { + "metric": "proxmox_ups_runtime_seconds", + "desc": "Geschätzte Laufzeit im Batteriebetrieb." + }, + { + "metric": "proxmox_ups_input_voltage_volts", + "desc": "Eingangsspannung." + } + ] + } + ], + "scrapeTitle": "Prometheus-Scrape-Konfiguration", + "scrapeIntro": "Bei aktiver Authentifizierung tragen Sie ein API-Token als Bearer-Header in die Prometheus-Erfassungskonfiguration ein:", + "perHostTitle": "Erfassung je Host", + "perHostBody": "Jede Instanz exportiert Metriken ihres eigenen Hosts. Lassen Sie Prometheus im Cluster jeden Knoten abfragen. Das Label node unterscheidet die Reihen in Grafana (proxmox_vms_running'{'node=\"pve01\"'}')." + }, + "puttingItTogether": { + "heading": "Integrationen zusammenführen", + "body": "Integrationen erklärt die Anbindung an Home-Assistant-Sensoren, Homepage-Karten, Grafana-Dashboards, n8n-Abläufe und weitere Werkzeuge. Dort finden Sie typische Konfigurationen zum Kopieren. Diese Seite enthält den Endpunktkatalog." + }, + "whereNext": { + "heading": "Weitere Schritte", + "items": [ + { + "label": "Zugriff und Authentifizierung", + "href": "/docs/monitor/access-auth", + "tail": " — Token-Erstellung, Auditprotokoll, optionales Fail2Ban-Jail und TLS." + }, + { + "label": "Benachrichtigungen", + "href": "/docs/monitor/notifications", + "tailRich": " — Inhalt von data je Ereignistyp beim Aufruf von /api/notifications/send." + }, + { + "label": "KI-Assistent", + "href": "/docs/monitor/ai-assistant", + "tailRich": " — Funktionsweise von /api/notifications/test-ai und /api/notifications/provider-models." + }, + { + "label": "Gesundheitsmonitor", + "href": "/docs/monitor/health-monitor", + "tailRich": " — Antwortformat von /api/health/* und Bedeutung der zehn Kategorien." + } + ] + } +} diff --git a/web/messages/de/docs/monitor/architecture.json b/web/messages/de/docs/monitor/architecture.json new file mode 100644 index 00000000..385a3e2a --- /dev/null +++ b/web/messages/de/docs/monitor/architecture.json @@ -0,0 +1,303 @@ +{ + "meta": { + "title": "Architektur von ProxMenux Monitor — AppImage, Flask, SQLite, WebSocket | ProxMenux", + "description": "Aufbau von ProxMenux Monitor: AppImage-Struktur, Flask-Blueprints, Hintergrundaufgaben, Daten aus psutil, pvesh, smartctl und journalctl, SQLite-Speicherung, WebSocket-Terminal, KI-Anbieter, Benachrichtigungskanäle, Reverse-Proxy und optionales Fail2Ban.", + "ogTitle": "ProxMenux Monitor Architektur", + "ogDescription": "ProxMenux Monitor intern: AppImage, Flask-Blueprints, Hintergrundaufgaben, SQLite, WebSocket, KI-Anbieter und Benachrichtigungskanäle.", + "twitterTitle": "ProxMenux Monitor Architektur", + "twitterDescription": "AppImage, Flask, SQLite, WebSocket, KI-Anbieter und Benachrichtigungskanäle — innerhalb des Monitors." + }, + "header": { + "title": "Architektur", + "description": "Wie ProxMenux Monitor ausgeliefert wird, was das AppImage enthält und wie Browseranfragen über Flask zu Host-Werkzeugen und SQLite gelangen.", + "section": "ProxMenux Monitor" + }, + "intro": { + "title": "Ein Prozess, viele Verantwortlichkeiten", + "body": "Ein Python-Prozess lauscht auf TCP 8008. Er liefert den statischen Next.js-Build aus, stellt die REST-API bereit, verwaltet das WebSocket-Terminal, führt den Health Monitor aus und versendet Meldungen. Ein separater Webserver, Nachrichtenbroker oder externer Datenbankserver ist nicht erforderlich." + }, + "requestFlow": { + "heading": "Ablauf einer Anfrage", + "intro": "Eine typische Datenanfrage folgt diesem Weg; reine Browsereinstellungen können lokal bleiben:", + "diagramCaption": "Geschützte Routen prüfen JWT bei aktiver Authentifizierung. Kernrouten und Blueprints liefern zwischengespeicherte oder neu erfasste Host-Daten. Der optionale Fail2Ban-Hook prüft seine zwischengespeicherte Sperrliste. Weitergeleitete IP-Header gelten nur mit PROXMENUX_TRUST_PROXY=1; sonst zählt die Gegenstellenadresse. Dauerhafter Zustand liegt in SQLite und JSON-Dateien wie auth.json.", + "diagramArrowLabel": "HTTP / WS", + "nodes": { + "clientLabel": "Client", + "clientDetail": "Browser oder PWA\n+ optionaler Proxy\nNginx / Caddy /\nTraefik", + "flaskLabel": "Flask :8008", + "flaskDetail": "Blueprints\nJWT-Middleware\nFail2Ban-Hook\n(falls installiert)", + "hostLabel": "Host-Tools", + "hostDetail": "psutil\npvesh\nsmartctl\njournalctl", + "stateLabel": "Lokaler Zustand", + "stateDetail": "SQLite DB\n+ auth.json" + }, + "threadsIntro": "Der Prozess führt auch Hintergrundthreads aus. Diese Beispiele erfassen Daten, aktualisieren Caches und SQLite und versenden Meldungen. Weitere Aufgaben existieren; der Versand hängt von seiner Aktivierung ab:", + "headerThread": "Thread", + "headerCadence": "Intervall", + "headerJob": "Auftrag", + "rows": [ + { + "thread": "_temperature_collector_loop", + "cadence": "60 s", + "job": "Speichert CPU-Temperatur und Latenzproben in der Verlaufsdatenbank, damit Diagramme auch ohne verbundenen Browser Daten haben." + }, + { + "thread": "_health_collector_loop", + "cadence": "5 min", + "job": "Führt den Health-Monitor-Zyklus mit zehn Kategorien aus, speichert Fehler und Datenträgerbeobachtungen, berücksichtigt Unterdrückungen und übergibt neue Ereignisse an den Benachrichtigungsdienst." + }, + { + "thread": "_vital_signs_sampler", + "cadence": "CPU 5 s; Temperatur 15 s; RAM 30 s", + "job": "Erfasst CPU-Auslastung, RAM und CPU-Temperatur für aktuelle Anzeigen und anhaltende Zustände, unabhängig von der fünfminütigen Gesamtprüfung." + }, + { + "thread": "notification_manager.start()", + "cadence": "Ereignisgesteuert", + "job": "Startet Beobachter für Journal, Tasks und Hooks (JournalWatcher, TaskWatcher, ProxmoxHookWatcher) und sendet an eingerichtete Kanäle, optional mit KI-Umformulierung." + } + ] + }, + "systemd": { + "heading": "systemd-Einheit", + "intro": "Der Installer erstellt die Unit /etc/systemd/system/proxmenux-monitor.service. Standardkonfiguration:", + "items": [ + "User=root: Der Dienst verwendet Root-Rechte für Host-Operationen wie SMART, pvesh und ZFS-Verwaltung. Die Webterminal-Prozesse erben diese Rechte.", + "Restart=on-failure mit zehn Sekunden Wartezeit: Nach fehlerhaftem Ende startet der Dienst automatisch neu.", + "After=network.target: ordnet den Start nach diesem Ziel ein; garantiert keine IP-Adresse, DNS oder externe Verbindung." + ], + "inspectTitle": "Aktuelle Unit prüfen" + }, + "appimage": { + "heading": "Was das AppImage enthält", + "intro": "Das AppImage enthält ein beim Start eingehängtes Dateisystem. AppRun im Wurzelverzeichnis bereitet die Umgebung vor und startet flask_server.py:", + "consequencesIntro": "Zwei Konsequenzen dieses Layouts:", + "consequences": [ + "Mitgelieferte Python-Umgebung. Interpreter und Pakete liegen im AppImage; eine Installation in das System-Python entfällt. Die Anwendung nutzt weiterhin Kernel-Schnittstellen und externe Host-Werkzeuge.", + "Hardware-Clients sind enthalten. Mitgeliefert werden ipmitool, lm-sensors und upsc. Messwerte erfordern unterstützte Hardware, Sensorzugriff und für USV-Daten einen eingerichteten NUT-Server." + ] + }, + "flask": { + "heading": "Struktur der Flask-Anwendung", + "intro": "flask_server.py erstellt eine Flask(__name__)-Instanz mit begrenztem CORS, registriert neun Blueprints direkt und initialisiert Terminalrouten. Die Tabelle zeigt Hauptmodule; Audit, VM-Sicherung und PBS sind ebenfalls registriert. PVE-Vorwärmer laufen nur auf PVE-Hosts.", + "headerBlueprint": "Blueprint / Modul", + "headerPrefix": "Routenpräfix", + "headerOwns": "Zuständigkeit", + "rows": [ + { + "blueprint": "flask_server.py", + "prefix": [ + "/api/system", + "/api/storage", + "/api/network", + "/api/vms", + "/api/hardware", + "/api/logs", + "/api/prometheus" + ], + "owns": "Kernendpunkte, statische Weboberfläche und optionale Fail2Ban-Prüfung bei vorhandenem Jail proxmenux auf dem Host." + }, + { + "blueprint": "flask_auth_routes.py", + "prefix": [ + "/api/auth/*" + ], + "owns": "Anmeldung, JWT-Ausgabe, TOTP-Einrichtung und -Prüfung, Passwortänderung und API-Token." + }, + { + "blueprint": "flask_health_routes.py", + "prefix": [ + "/api/health/*" + ], + "owns": "Zustandsprüfungen, Detailstatus, aktive und unterdrückte Fehler sowie Unterdrückungseinstellungen. Geschützte Routen verlangen Authentifizierung, wenn aktiviert." + }, + { + "blueprint": "flask_terminal_routes.py", + "prefix": [ + "/api/terminal/* + WS" + ], + "owns": "Stellt je Sitzung ein PTY bereit und verbindet es über WebSocket mit xterm.js im Browser." + }, + { + "blueprint": "flask_notification_routes.py", + "prefix": [ + "/api/notifications/*" + ], + "owns": "Kanäle anlegen, lesen, ändern und löschen; Testversand, KI, Verlauf und manuelle Meldungen." + }, + { + "blueprint": "flask_security_routes.py", + "prefix": [ + "/api/security/*" + ], + "owns": "Anmeldefehler und bei installiertem Fail2Ban Jail-Zustand, Sperrereignisse und manuelles Entsperren." + }, + { + "blueprint": "flask_proxmenux_routes.py", + "prefix": [ + "/api/proxmenux/*" + ], + "owns": "Liest die im Host-Bestand registrierten ProxMenux-Optimierungen." + }, + { + "blueprint": "flask_oci_routes.py", + "prefix": [ + "/api/oci/*" + ], + "owns": "Hilfen zur Bereitstellung von OCI- und Container-Apps auf Proxmox VE 9.1+." + } + ], + "endpointsLink": "Integrationsendpunkte und ihre Formate erklärt API-Referenz." + }, + "dataSources": { + "heading": "Datenquellen", + "intro": "Host-Daten stammen überwiegend aus Standardbibliotheken, Dateien und Verwaltungsbefehlen. Einige Gastdaten benötigen zusätzlich den QEMU Guest Agent oder Befehle innerhalb eines CT:", + "headerSource": "Quelle", + "headerUsedFor": "Verwendet für", + "rows": [ + { + "source": "psutil", + "usedFor": "CPU-Last, RAM, Swap, Belegung von Einhängepunkten, Netzwerkzähler und Prozesse." + }, + { + "source": "pvesh / qm / pct", + "usedFor": "Proxmox-Knoteninformationen, VM-/CT-Bestand und Konfiguration, Speicher sowie Task-Verlauf." + }, + { + "source": "smartctl", + "usedFor": "SATA-/NVMe-Attribute, SMART-Zustand, Verschleiß, Lebensdauer, Modell und Seriennummer." + }, + { + "source": "zpool / zfs", + "usedFor": "Poolzustand (ONLINE / DEGRADED / FAULTED / UNAVAIL), Scrub-Fortschritt und Dataset-Belegung." + }, + { + "source": "journalctl", + "usedFor": "Systemprotokolle, OOM-Abbrüche, ATA-/NVMe-/dm-Fehler, Sicherheitsereignisse und eigene Service-Units." + }, + { + "source": "ip / iproute2", + "usedFor": "Schnittstellen, Adressen, Bridges, Bonds und OVS-verwaltete Geräte." + }, + { + "source": "nvidia-smi · intel_gpu_top", + "usedFor": "Verfügbare GPU-Daten zu Auslastung, VRAM, Temperatur und Encoder/Decoder. Felder hängen von Hersteller, Werkzeug und Treiber ab." + }, + { + "source": "lspci · lscpu · dmidecode", + "usedFor": "PCIe-Topologie, CPU-Modell und -Topologie sowie Mainboard- und BIOS-Daten." + }, + { + "source": "ipmitool · sensors", + "usedFor": "Out-of-Band-Sensoren, Lüfterdrehzahlen und Mainboard-Temperaturen bei unterstützter Hardware." + }, + { + "source": "upsc (NUT)", + "usedFor": "Batteriezustand, Last und Restlaufzeit der USV bei eingerichtetem NUT-Server." + } + ], + "cacheTitle": "Caches reduzieren Host-Abfragen", + "cacheBody": "Aufwendige Ergebnisse von smartctl -a und pvesh get werden im Flask-Prozess zeitweise gespeichert, um Datenträger und Cluster-API seltener abzufragen. Die Dauer hängt von der Quelle ab: Sekunden für aktuelle Metriken, Minuten für SMART." + }, + "persistence": { + "heading": "Persistenz", + "intro": "Mehrere Zustandsdateien haben unterschiedliche Inhalte und Zugriffsanforderungen:", + "headerPath": "Path", + "headerOwner": "Eigentümer", + "headerContents": "Inhalt", + "rows": [ + { + "path": "/usr/local/share/proxmenux/health_monitor.db", + "owner": "root:root", + "contents": "SQLite-Datenbank. Tabellen: errors, events, disk_registry, disk_observations, user_settings, notification_history, excluded_storages, excluded_interfaces. WAL-Journalmodus." + }, + { + "path": "/usr/local/share/proxmenux/.notification_key", + "owner": "root 0600", + "contents": "32-Byte-Hauptschlüssel für Benachrichtigungsgeheimnisse im ENC2-Format. Verwendet zufälliges Salt je Wert, abgeleitete Schlüssel und MAC. Alte XOR-Werte werden zur Migration unterstützt." + }, + { + "path": "/root/.config/proxmenux-monitor/auth.json", + "owner": "root:root", + "contents": "Authentifizierungskonfiguration: Aktivierung, Benutzername, gesalzener PBKDF2-HMAC-SHA256-Passworthash, TOTP-Geheimnis, Wiederherstellungscodes, installationsbezogener JWT-Schlüssel, API-Token-Metadaten und Widerrufshashes. Alte SHA-256-Hashes werden nach erfolgreicher Anmeldung migriert." + }, + { + "path": "/var/log/proxmenux-auth.log", + "owner": "root:root", + "contents": "Klartextprotokoll der Authentifizierung, unabhängig von Fail2Ban. Ist das Jail [proxmenux] installiert und aktiv, liest es das Protokoll zur Erkennung wiederholter Anmeldefehler. Ohne Jail bleibt das Protokoll zur Prüfung verfügbar." + } + ], + "backupTitle": "auth.json vor der Neuinstallation sichern", + "backupBody": "Ein AppImage-Austausch bewahrt normalerweise /root/.config/proxmenux-monitor/auth.json und /usr/local/share/proxmenux/health_monitor.db. Bewahren Sie auth.json samt jwt_secret für gültige Token und Metadaten. Die Datenbank enthält unabhängig Zustands- und Meldungsdaten. Sichern Sie .notification_key mit ihr für verschlüsselte Kanaleinstellungen; die Datenbank allein stellt API-Authentifizierung nicht wieder her." + }, + "health": { + "heading": "Health-Monitor-Zyklus", + "intro": "Etwa alle fünf Minuten ruft der Hintergrundkollektor health_monitor.py für die Prüfungen der zehn Dashboard-Kategorien auf:", + "items": [ + "Kritische PVE-Dienste (pveproxy, pvedaemon, pvestatd, pve-cluster).", + "Proxmox-Speicher: pvesh get /storage und Verfügbarkeit je Speicher.", + "Datenträger und Dateisysteme: SMART, E/A-Fehler in dmesg, ZFS-Zustand und Belegung von Einhängepunkten.", + "VMs und CTs: Startfehler, Abstürze, QMP-Fehler und Probleme beim Herunterfahren.", + "Netzwerk: Bridge- und Bond-Zustand, Verbindungsstatus und Gateway-Latenz.", + "Updates: ausstehende Paketaktualisierungen und Sicherheitspatches.", + "Protokolle: anhaltende Muster, Spitzen und Kaskaden im Systemjournal.", + "Arbeitsspeicher: OOM-Killer-Aktivität und anhaltender Speicherdruck.", + "Temperatur: CPU- und Datenträgerwerte im Vergleich zu Überwachungsschwellen; verfügbare Sensoren hängen von der Hardware ab.", + "Sicherheit: Anmeldefehler, Sperrereignisse und Fail2Ban-Jail-Zustand." + ], + "afterIntro": "Befunde verwenden stabile error_key, Kategorie und Schweregrad. Vorhandene Zeilen in errors erhalten last_seen und Zähleraktualisierungen statt Duplikaten. Der Benachrichtigungsversand hat eigene Fingerabdrücke und Wartezeiten.", + "cycleEnd": "Die Bereinigung kann alte Fehler anhand der Unterdrückungsdauer je Kategorie und Zustandsregeln auflösen, verwaiste Einträge entfernter Ressourcen entfernen und events über 30 Tage löschen. Kategorien erklärt Dashboard → Health Monitor." + }, + "notifications": { + "heading": "Benachrichtigungsmotor", + "intro": "notification_manager.py koordiniert den Versand: lädt Kanäle, verwaltet die Warteschlange und bietet eine Python-API für Flask und Health Monitor sowie einen CLI-Einstieg für ProxMenux-Hooks in .sh.", + "items": [ + "Beobachter erzeugen Ereignisse: JournalWatcher verfolgt das Journal, TaskWatcher fragt Proxmox-Tasks ab, ProxmoxHookWatcher empfängt Sicherungs-, Replikations- und Snapshot-Hooks und PollingCollector verarbeitet langsame Quellen.", + "Vorlagen erzeugen Titel und Nachricht aus Ereignissen. Der konfigurierte KI-Anbieter (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter) kann sie verständlich umformulieren. Beide Fassungen werden in notification_history gespeichert.", + "Kanäle versenden über Dienste wie Telegram, Discord, E-Mail, Gotify, Pushover und Apprise. Implementierungen in notification_channels.py teilen die Schnittstelle create_channel() / send().", + "Verschlüsselung. Vertrauliche Einstellungen (telegram.bot_token, discord.webhook_url, pushover.user_key, pushover.api_token, ai_api_key_*, email.password) werden vor dem Speichern mit dem Schlüssel aus .notification_key verschlüsselt und in der Oberfläche maskiert." + ], + "linksFooter": "Ereignisschalter, kanalspezifische Einstellungen und KI erklären Einstellungen → Benachrichtigungen und Einstellungen → KI-Assistent." + }, + "websocket": { + "heading": "WebSocket Terminal", + "intro": "Die Registerkarte Terminal verbindet einen schlanken xterm.js-Client über WebSocket mit einem serverseitigen PTY. Es gibt zwei Betriebsarten:", + "items": [ + "HTTP-Modus, Standard: Der integrierte Flask-Server verarbeitet mit flask-sock WebSocket-Upgrade-Anfragen.", + "HTTPS-/WSS-Modus: Verwendet gevent.pywsgi.WSGIServer mit geventwebsocket.handler.WebSocketHandler für WebSocket über TLS." + ], + "outro": "Terminalprozesse erben User=root. Bei aktiver Authentifizierung braucht WebSocket ein kurzlebiges Einmalticket vom authentifizierten Ticket-Endpunkt mit Verwaltungsrechten. Ist Authentifizierung deaktiviert oder abgelehnt, folgt der Verbindungsaufbau diesem unauthentifizierten Modus.", + "proxyNote": "Beim Reverse-Proxy muss WebSocket-Weiterleitung mit den Headern Upgrade und Connection funktionieren. Das Terminal benötigt diese Weiterleitung." + }, + "proxy": { + "heading": "Reverse-Proxy und Fail2Ban", + "intro": "Client-IP-Auswahl und optionale Sperrung in der Anwendung hängen von diesen Einstellungen und Komponenten ab:", + "items": [ + "Client-IP-Auswahl. Die Sperrprüfung in before_request und das Auth-Protokoll vertrauen X-Forwarded-For, danach X-Real-IP, nur mit PROXMENUX_TRUST_PROXY=1. Sonst gilt request.remote_addr. Weitergeleitete Header werden nicht automatisch akzeptiert.", + "Optionales Fail2Ban in der Anwendung. Bei Proxyverbindungen kann die Proxy-IP als TCP-Gegenstelle erscheinen. Sind die vertrauenswürdige Client-IP und das aktive Jail proxmenux verfügbar, weist Flask gesperrte IPs mit HTTP 403 zurück. Die Liste wird 30 Sekunden gespeichert und bei späteren Anfragen erneuert, nicht durch einen eigenen Timer." + ], + "calloutTitle": "Fail2Ban ist nicht enthalten", + "calloutBody": "Fail2Ban ist nicht enthalten und wird nicht automatisch installiert. Die Installation ist über Monitor-Sicherheit oder Sicherheit → Fail2Ban in ProxMenux Scripts möglich. Fehlen fail2ban-client oder das Jail proxmenux, blockiert dieser Hook keine Anfragen. Die eingestellte Authentifizierung gilt weiter.", + "outro": "Beispiele für Nginx, Caddy und Traefik sowie die Jail-Anleitung stehen unter Zugriff und Authentifizierung und Sicherheit → Fail2Ban." + }, + "whereNext": { + "heading": "Weitere Schritte", + "items": [ + { + "label": "Zugriff und Authentifizierung", + "href": "/docs/monitor/access-auth", + "tail": " — Ersteinrichtung, Passwort und TOTP-2FA, Reverse-Proxy-Beispiele und Fail2Ban-Jail." + }, + { + "label": "API-Referenz", + "href": "/docs/monitor/api", + "tail": " — Integrationsendpunkte, Token-Verwaltung und Authentifizierungskonventionen." + }, + { + "label": "Einstellungen → ProxMenux Monitor", + "href": "/docs/settings/proxmenux-monitor", + "tail": " — Dienststeuerung und Zustandsprüfung im ProxMenux-Textmenü." + } + ] + } +} diff --git a/web/messages/de/docs/monitor/audit-report/assessment.json b/web/messages/de/docs/monitor/audit-report/assessment.json new file mode 100644 index 00000000..5df9d512 --- /dev/null +++ b/web/messages/de/docs/monitor/audit-report/assessment.json @@ -0,0 +1,218 @@ +{ + "meta": { + "title": "Bewertung und Bestandsaufnahme | Prüfung und Bericht", + "description": "Bewertung in Prüfung und Bericht: Berichtsprofile, Einstufung der Ergebnisse, akzeptierte Risiken, nicht lesbare Quellen, Lynis und Bestandsaufnahme des Knotens." + }, + "header": { + "title": "Bewertung und Bestandsaufnahme", + "description": "Die Bewertung überprüft den Knoten, behält seine Ergebnisse und beantwortet je nach Berichtsprofil verschiedene Fragen.", + "section": "Prüfung und Bericht" + }, + "sections": [ + { + "id": "read-only", + "blocks": [ + { + "calloutInfo": { + "title": "Eine Bewertung prüft; sie ändert keine Konfiguration", + "body": "Es liest die Konfiguration und den Zustand des Hosts. Es schreibt seine Ergebnisse, Berichte und Protokolle, und die Boot-Checks können EFI-Systempartitionen für einen Moment montieren. Die von ihm bewertete Konfiguration wird nicht geändert." + } + }, + { + "p": "Bewertung ausführen startet einen Durchlauf mit dem unter Bericht gewählten Profil. Die Ansicht zeigt das Datum des letzten Durchlaufs und die seitdem vergangene Zeit." + } + ] + }, + { + "id": "profiles", + "title": "Berichtsprofile", + "intro": "Jedes Profil beantwortet eine andere Frage. Die Prüfungen und Abschnitte werden ausgewählt, bevor das Dokument erstellt wird.", + "blocks": [ + { + "table": { + "headers": [ + "Profil", + "Was es abdeckt" + ], + "rows": [ + [ + "Vollständiges Audit", + "Alle Prüfungen und die gesamte verfügbare Struktur." + ], + [ + "Schnelldiagnose", + "Jede Überprüfung; das Ergebnis beginnt mit den kritischen Ergebnissen, den Warnungen und den Messwerten, die nicht verifiziert werden konnten." + ], + [ + "Inventar", + "Eine Beschreibung des Knotens, ohne Überprüfungen und ohne Klassifizierung." + ], + [ + "Sicherheitsüberprüfung", + "Exposition, Zugriff, Privilegien, Zertifikate, Updates, Repositories und Lynis." + ], + [ + "Überprüfung der Sicherungen", + "Abdeckung, Alter, Ergebnisse, Verifizierung, Aufbewahrung und Wiederherstellung der Backups." + ], + [ + "Kapazität und Verschleiß", + "Wachstumsmarge, Speicher, Platzverbrauch und Lebensdauer der Festplatten." + ] + ] + } + }, + { + "p": "Der Inhalt jedes Dokuments wird unter Berichte und Vergleiche beschrieben." + } + ] + }, + { + "id": "results", + "title": "Wie die Ergebnisse klassifiziert werden", + "blocks": [ + { + "table": { + "headers": [ + "Einstufung", + "Bedeutung" + ], + "rows": [ + [ + "Kritisch", + "Ein gescheiterter Zustand, der Priorität hat." + ], + [ + "Warnung", + "Eine Bedingung, die anhand der Nachweise oder der Richtlinie überprüft werden muss." + ], + [ + "Beobachtung", + "Informationen über den Knoten, der nicht als Fehler gemeldet wird." + ], + [ + "Nicht verifiziert", + "Die für die Prüfung benötigte Quelle konnte nicht gelesen werden. Das bedeutet nicht, dass kein Problem vorliegt." + ], + [ + "Konform", + "Die Bedingung erfüllt das angewandte Kriterium." + ], + [ + "Nicht zutreffend", + "Es gilt nichts im Rahmen der Prüfung." + ], + [ + "Akzeptiertes Risiko", + "Der Befund existiert und eine Entscheidung darüber wurde aufgezeichnet." + ], + [ + "Per Richtlinie ausgenommen", + "Die Richtlinie legt fest, dass dieses Element nicht mitgezählt wird." + ] + ] + } + }, + { + "p": "Befunde lassen sich nach Bereich filtern: System, Speicher, Netzwerk, Sicherheit, Sicherung, Gastsysteme und Hardware. Jeder Befund enthält seine Nachweise und deren Quelle." + } + ] + }, + { + "id": "unverified", + "title": "Wenn eine Quelle nicht gelesen werden kann", + "blocks": [ + { + "table": { + "headers": [ + "Fall", + "Verhalten" + ], + "rows": [ + [ + "Nicht verifiziert", + "Die Prüfung behält ihre Kennung bei, nennt in den Nachweisen die fehlerhafte Quelle und bewertet fehlende Daten nicht als konformes Ergebnis." + ], + [ + "Unvollständige Nachweise", + "Der Bericht nennt Quelle und Erfassungszeitpunkt, um ein tatsächliches Problem von einer unzureichenden Erfassung zu unterscheiden." + ], + [ + "Ein neuer Durchlauf", + "Sobald der Zugriff, das Paket oder der Dienst korrigiert wurde, läuft das gleiche Profil erneut und der Vergleich zeigt, ob das Ergebnis verifiziert werden konnte." + ] + ] + } + } + ] + }, + { + "id": "lynis", + "title": "Lynis", + "blocks": [ + { + "p": "Die Sicherheitsprüfung nutzt den Lynis-Bericht des Hosts. Wurde Lynis noch nicht ausgeführt oder ist der Bericht älter als die Richtlinie erlaubt, bietet ein Dialog Mit Lynis ausführen, was einige Minuten länger dauert, oder Ohne Lynis ausführen, das den vorhandenen Bericht nutzt." + }, + { + "figure": { + "src": "/monitor/audit/lynis-dialog.png", + "alt": "Dialog, der anbietet, das Assessment mit oder ohne Lynis durchzuführen", + "caption": "Der Lynis-Dialog vor einer Sicherheitsüberprüfung." + } + } + ] + }, + { + "id": "accept", + "title": "Annahme eines Risikos", + "blocks": [ + { + "p": "Risiko akzeptieren erfasst eine Entscheidung zu einem Befund. Eine Begründung ist erforderlich und wird mit Autor und Datum gespeichert." + }, + { + "table": { + "headers": [ + "Feld", + "Optionen" + ], + "rows": [ + [ + "Grund", + "Freitext, erforderlich." + ], + [ + "Gilt nicht mehr nach", + "90 Tage, 180 Tage, 1 Jahr oder läuft nicht ab. Wenn der Zeitraum endet, wird der Befund wieder aktiv." + ], + [ + "An Überprüfung erinnern", + "Eine Erinnerung, die die Entscheidung wieder auf sich aufmerksam macht, während sie in Kraft bleibt." + ] + ] + } + }, + { + "p": "Ein akzeptierter Befund bleibt mit der Entscheidung sichtbar; Wieder aktiv setzen widerruft die Akzeptanz. Ein akzeptiertes Risiko ist keine Behebung: Der Vergleich meldet es als akzeptiert und nicht als gelöst." + } + ] + }, + { + "id": "inventory", + "title": "Inventar", + "blocks": [ + { + "list": { + "items": [ + "Identität, Proxmox VE-Version, Kernel, Subscription und Cluster.", + "CPU, Speicher, Board, BIOS, Controller und IOMMU.", + "Festplatten, SMART, Power-On-Stunden und aufgezeichnete Ereignisse.", + "Adapter, Bonds, Bridges, Latenz und Verbindungen.", + "Speicher, Gäste mit ihren Festplatten und Schnittstellen und Backups.", + "PCI Passthrough und die Software ProxMenux verwaltet." + ] + } + } + ] + } + ] +} diff --git a/web/messages/de/docs/monitor/audit-report/changes.json b/web/messages/de/docs/monitor/audit-report/changes.json new file mode 100644 index 00000000..799627a0 --- /dev/null +++ b/web/messages/de/docs/monitor/audit-report/changes.json @@ -0,0 +1,208 @@ +{ + "meta": { + "title": "Änderungen | Prüfung und Bericht", + "description": "Änderungsprotokoll von Prüfung und Bericht: ProxMenux-Änderungen am Host, vorheriger Zustand, Unterschiede und Möglichkeiten zum Rückgängigmachen." + }, + "header": { + "title": "Änderungen", + "description": "Protokoll der von ProxMenux am Host ausgeführten Operationen und, soweit erfasst, des jeweiligen Zustands davor und danach.", + "section": "Prüfung und Bericht" + }, + "sections": [ + { + "id": "purpose", + "blocks": [ + { + "calloutInfo": { + "title": "Vom ausgeführten Skript zur bewirkten Änderung", + "body": "Eine lange Funktion ändert möglicherweise nur zwei Zeilen. Das Protokoll erfasst jede konkrete Operation mit verantwortlichem Skript, Funktion und Version, betroffener Ressource, Unterschied und Möglichkeit zum Rückgängigmachen." + } + }, + { + "flow": { + "nodes": [ + { + "label": "Skript", + "detail": "Funktion + Version" + }, + { + "label": "Erfassung", + "detail": "Inhalt vor" + }, + { + "label": "Operation", + "detail": "Datei · Paket · Service" + }, + { + "label": "Änderungsprotokoll", + "detail": "Attribution + Differenz" + } + ], + "caption": "Die Erfassung erfolgt bei Ausführung der Operation und wird zusammengeführt, wenn Monitor das Protokoll liest." + } + }, + { + "figure": { + "src": "/monitor/audit/changes-view.png", + "alt": "Ansicht Änderungen von Prüfung und Bericht mit Einträgen nach Nachinstallationsoption und Skript gruppiert", + "caption": "Die Ansicht Änderungen mit dem Unterschied einer von ProxMenux bearbeiteten Datei." + } + } + ] + }, + { + "id": "types", + "title": "Arten von Einträgen", + "intro": "Der Filter oben trennt die Einträge nach Art.", + "blocks": [ + { + "table": { + "headers": [ + "Art", + "Was es aufzeichnet" + ], + "rows": [ + [ + "Konfiguration", + "ProxMenux hat eine Datei geschrieben, bearbeitet oder entfernt, eine Einstellung geändert oder einen Dienst geändert." + ], + [ + "Installationen", + "ProxMenux hat ein Paket oder eine Komponente hinzugefügt, und die tatsächlich erschienenen Pakete werden aufgezeichnet." + ], + [ + "Ausführungen", + "ProxMenux hat einen Befehl ausgeführt; seine Auswirkungen hängen vom Befehl selbst ab." + ], + [ + "Angewandt", + "Eine Funktion wurde angewendet, bevor das Protokoll existierte; ihr vorheriger Zustand wurde nicht erfasst." + ] + ] + } + } + ] + }, + { + "id": "groups", + "title": "Wie die Ansicht organisiert ist", + "blocks": [ + { + "table": { + "headers": [ + "Abschnitt", + "Inhalt" + ], + "rows": [ + [ + "Post-Install-Optimierungen", + "Gruppiert nach der Option nach der Installation, die der Benutzer ausgewählt hat." + ], + [ + "ProxMenux-Skripte", + "GPU, Coral, Netzwerk, Speicher, Sicherheit, Werkzeuge und weitere instrumentierte Skripte, einschließlich ProxMenux-Installer und ProxMenux Monitor." + ], + [ + "Installierte Pakete und Werkzeuge", + "Von ProxMenux auf dem Host installierte Software." + ] + ] + } + }, + { + "p": "Nach Funktion gruppiert die Einträge jedes Abschnitts nach der Funktion, die sie erzeugt hat." + } + ] + }, + { + "id": "entry", + "title": "Was jeder Eintrag zeigt", + "blocks": [ + { + "list": { + "items": [ + "Das verantwortliche Skript mit Funktion und Version.", + "Datum und betroffene Ressource.", + "Der bekannte Zustand vor und nach der Änderung.", + "Die hinzugefügten und entfernten Zeilen.", + "Die Pakete, die tatsächlich hinzugefügt wurden.", + "Der Zustandswechsel eines Dienstes.", + "Rückgängigmachen: Stellt exakt den vorherigen Zustand wieder her, Löscht die Datei (vorher existierte keine), Das Paket kann deinstalliert werden, teilweises Rückgängigmachen oder Kann nicht aus dem Protokoll rückgängig gemacht werden." + ] + } + } + ] + }, + { + "id": "before", + "title": "Was der vorherige Zustand bedeutet", + "blocks": [ + { + "p": "Der vorherige Zustand kann erfasster Inhalt, eine erstmals erstellte Datei oder ein unbekannter Zustand sein. Änderungen vor Einführung des Protokolls lassen sich nicht rekonstruieren; eine erneute Ausführung erfasst zunächst den dann vorgefundenen Zustand." + } + ] + }, + { + "id": "limits", + "title": "Umfang des Änderungsprotokolls", + "blocks": [ + { + "list": { + "items": [ + "Manuelle Änderungen und Änderungen durch andere Software werden nicht aufgezeichnet.", + "Nur Operationen, die die ProxMenux-Auditprimitiven durchlaufen, werden abgedeckt.", + "Die Protokollierung blockiert nie die beschriebene Operation: Kann ein Eintrag nicht geschrieben werden, läuft die Operation weiter.", + "Aufeinanderfolgende Änderungen an einer Ressource werden als bekannter Ursprung gegen den aktuellen Zustand angezeigt." + ] + } + } + ] + }, + { + "id": "retention", + "title": "Gespeicherte Nachweise", + "blocks": [ + { + "table": { + "headers": [ + "Element", + "Verhalten" + ], + "rows": [ + [ + "Einträge", + "Sie werden auf dem Host aufbewahrt; nichts wird automatisch aus dem Journal entfernt." + ], + [ + "Erfasster Inhalt", + "Ein erfasstes Objekt wird beibehalten, während sich ein Eintrag darauf bezieht." + ], + [ + "Größe einer Erfassung", + "Inhalt über 1 MiB wird nicht als Ganzes gespeichert; der Eintrag zeichnet auf, dass die Aufnahme wegen seiner Größe übersprungen wurde." + ], + [ + "Lesen", + "Der Monitor lädt keine gespeicherten Objekte über 2 MiB." + ], + [ + "Unterschied", + "Es werden höchstens 400 Zeilen angezeigt; längere Unterschiede werden als gekürzt markiert." + ], + [ + "Liste", + "Die API liefert standardmäßig 200 Einträge je Anfrage, maximal 1000." + ] + ] + } + }, + { + "calloutWarning": { + "title": "Gespeicherter Inhalt bedeutet kein automatisches Rückgängigmachen", + "body": "Der vorherige Inhalt kann geprüft und manuell wiederhergestellt werden; die Ansicht Änderungen macht jedoch keine Operationen rückgängig. Ein Ausführungseintrag erfasst den Befehl, ohne alle Auswirkungen des ausgeführten Werkzeugs zu kennen." + } + } + ] + } + ] +} diff --git a/web/messages/de/docs/monitor/audit-report/index.json b/web/messages/de/docs/monitor/audit-report/index.json new file mode 100644 index 00000000..5d8a392c --- /dev/null +++ b/web/messages/de/docs/monitor/audit-report/index.json @@ -0,0 +1,136 @@ +{ + "meta": { + "title": "Prüfung und Bericht | ProxMenux Monitor", + "description": "Bewerten Sie einen Proxmox-VE-Knoten, dokumentieren Sie ProxMenux-Änderungen und legen Sie Erwartungen an Gastsysteme und Speicher fest, mit druckbaren Berichten." + }, + "header": { + "title": "Prüfung und Bericht", + "description": "Bewertung des Knotens, Protokoll der ProxMenux-Änderungen und festgelegte Erwartungen, mit Dokumenten zum Drucken oder Speichern als PDF.", + "section": "ProxMenux Monitor" + }, + "sections": [ + { + "id": "views", + "blocks": [ + { + "calloutInfo": { + "title": "Drei Ansichten, drei Fragen", + "body": "Prüfung und Bericht trennt Fakten zum Knoten, Eingriffe von ProxMenux und festgelegte Erwartungen. Lässt sich eine Konfiguration keinem erklärten Zweck gegenüberstellen, wird sie beschrieben und nicht als Fehler gemeldet." + } + }, + { + "cards": { + "items": [ + { + "icon": "shield", + "title": "Bewertung - wie ist der Knoten?", + "body": "Führt die Überprüfungen des gewählten Profils aus, erstellt das Inventar und klassifiziert, was Aufmerksamkeit benötigt, mit dem Nachweis jedes Ergebnisses." + }, + { + "icon": "refresh", + "title": "Änderungen - was hat ProxMenux getan?", + "body": "Listet Dateien, Pakete, Dienste und Befehle auf, die durch instrumentierte ProxMenux-Skripte geändert wurden, samt vorherigem Zustand, sofern er erfasst wurde." + }, + { + "icon": "fileText", + "title": "Richtlinie — was wird erwartet?", + "body": "Legt fest, welche Gastsysteme eine Sicherung benötigen oder mit dem Host starten müssen, welcher Speicher wesentlich ist und welche Prüfschwellen gelten." + } + ] + } + }, + { + "flow": { + "nodes": [ + { + "label": "Bewertung", + "detail": "Fakten" + }, + { + "label": "Richtlinie", + "detail": "Kontext" + }, + { + "label": "Änderungen", + "detail": "Interventionen" + } + ], + "caption": "Die Bewertung liefert die Fakten, die Richtlinie gibt ihnen Kontext und das Änderungsprotokoll erfasst die Eingriffe von ProxMenux." + } + }, + { + "figure": { + "src": "/monitor/audit/assessment-view.png", + "alt": "Prüfung und Bericht in ProxMenux Monitor mit den Ansichten Bewertung, Änderungen und Richtlinie", + "caption": "Prüfung und Bericht mit geöffneter Ansicht Bewertung." + } + } + ] + }, + { + "id": "boundaries", + "title": "Drei verschiedene Funktionen", + "blocks": [ + { + "table": { + "headers": [ + "Funktion", + "Was es tut" + ], + "rows": [ + [ + "Zustandsüberwachung", + "Beobachtet Metriken und Ereignisse kontinuierlich und kann Benachrichtigungen auslösen." + ], + [ + "Prüfung und Bericht", + "Führt auf Anforderung eine Bewertung aus, dokumentiert den Knoten und vergleicht Durchläufe miteinander." + ], + [ + "Änderungsprotokoll", + "Erfasst die von ProxMenux über seine Audit-Grundfunktionen ausgeführten Operationen." + ] + ] + } + } + ] + }, + { + "id": "pages", + "title": "Seiten dieses Abschnitts", + "blocks": [ + { + "next": { + "items": [ + { + "label": "Bewertung und Bestandsaufnahme", + "href": "/docs/monitor/audit-report/assessment", + "tail": "Profile, Ergebnisse, akzeptierte Risiken und Bestandsaufnahme." + }, + { + "label": "Änderungen", + "href": "/docs/monitor/audit-report/changes", + "tail": "das Journal, was ProxMenux auf dem Host geändert hat." + }, + { + "label": "Richtlinie", + "href": "/docs/monitor/audit-report/policy", + "tail": "Gäste, Speicher und Schwellenwerte." + }, + { + "label": "Berichte und Vergleiche", + "href": "/docs/monitor/audit-report/reports", + "tail": "die sechs Dokumente und den Referenzlauf." + }, + { + "label": "Anwendungsbereich und Garantien", + "href": "/docs/monitor/audit-report/scope", + "tail": "Quellen, Grenzen und gespeicherte Daten." + } + ] + } + } + ] + } + ] +} diff --git a/web/messages/de/docs/monitor/audit-report/policy.json b/web/messages/de/docs/monitor/audit-report/policy.json new file mode 100644 index 00000000..6fe9ddda --- /dev/null +++ b/web/messages/de/docs/monitor/audit-report/policy.json @@ -0,0 +1,111 @@ +{ + "meta": { + "title": "Richtlinie | Prüfung und Bericht", + "description": "Knotenrichtlinie von Prüfung und Bericht: Sicherung, Autostart und Wiederherstellungsziel jedes Gastsystems, Rolle jedes Speichers und Prüfschwellenwerte." + }, + "header": { + "title": "Richtlinie", + "description": "Die Richtlinie legt fest, was keine Prüfung ableiten kann: Zweck jedes Gastsystems und Speichers sowie die Schwellenwerte der Prüfungen.", + "section": "Prüfung und Bericht" + }, + "sections": [ + { + "id": "principle", + "blocks": [ + { + "calloutInfo": { + "title": "Ohne Festlegung beschreibt der Bericht; mit ihr bewertet er", + "body": "Eine Bewertung sieht, was der Host tut, nicht, wozu er dient. Ein Gast ohne Backup, dessen Verwendungszweck nicht angegeben ist, wird als Beobachtung gemeldet. Wenn dessen Sicherung als erforderlich erklärt wird, wird die gleiche Abwesenheit als Warnung gemeldet. Es muss nichts deklariert werden." + } + }, + { + "figure": { + "src": "/monitor/audit/policy-view.png", + "alt": "Richtlinienansicht mit Gastsystemen, Speicher und Schwellenwerten des Knotens", + "caption": "Die Richtlinienansicht." + } + } + ] + }, + { + "id": "guests", + "title": "Gäste", + "intro": "Jede VM und jeder LXC des Knotens hat drei Felder. Ein auf Standard belassenes Feld übernimmt den daneben angezeigten allgemeinen Wert.", + "blocks": [ + { + "table": { + "headers": [ + "Feld", + "Werte", + "Auswirkungen auf die Bewertung" + ], + "rows": [ + [ + "Sicherung", + "Erforderlich, Nicht erforderlich, Nicht angegeben", + "Ein fehlendes Backup ist eine Warnung, wenn es erforderlich ist, eine Beobachtung, wenn es nicht angegeben ist, und es wird aus der Zählung ausgelassen, wenn es nicht erforderlich ist." + ], + [ + "Autostart", + "Erforderlich, Nicht erforderlich, Nicht angegeben", + "Ob das Gastsystem mit dem Host starten muss." + ], + [ + "Wiederherstellungsziel", + "Std", + "Das maximal akzeptable Alter des letzten Backups." + ] + ] + } + } + ] + }, + { + "id": "storage", + "title": "Speicher", + "blocks": [ + { + "p": "Ein nicht erreichbarer Speicher wird als kritisch gemeldet, wenn er für wesentlich erklärt wird oder einem laufenden Gast dient, als Warnung, wenn seine Rolle nicht angegeben wird, und als Beobachtung, wenn er für optional erklärt wird." + } + ], + "intro": "Jeder Speicher des Knotens wird als wesentlich, optional oder nicht angegeben deklariert." + }, + { + "id": "thresholds", + "title": "Schwellenwerte", + "intro": "Ein leeres Schwellenwertfeld verwendet den mitgelieferten Standardwert, der als Platzhalter angezeigt wird.", + "blocks": [ + { + "list": { + "items": [ + "Prüfung von Speicherkapazität (%) und Thin-Pool-Füllstand (%).", + "Verhältnis der Thin-Überprovisionierung und der Speicherüberbelegung.", + "ZFS-Scrub-Intervall (Tage).", + "Ersatzgrenze für das Sicherungsalter (Tage) und Toleranz des Zeitplans (Verhältnis).", + "Hinweis vor Zertifikatsablauf (Tage).", + "Festplattendienstdauer (Stunden) und letztes Festplattenfehlerfenster (Tage).", + "Alter des Lynis-Berichts (Tage) und der Paketindizes (Tage).", + "Journal-Belegung im Verhältnis zur Obergrenze (%).", + "Prüfung des Dateisystem-Speicherplatzes (%) und der Inodes (%)." + ] + } + } + ] + }, + { + "id": "save", + "title": "Wie die Richtlinie gespeichert wird", + "blocks": [ + { + "p": "Die Festlegung wird geprüft und atomar in /usr/local/share/proxmenux/audit_policy.json gespeichert. Jeder Speichervorgang enthält eine Revision: Hat eine andere Sitzung die Festlegung geändert, wird der Entwurf nicht gespeichert und die Ansicht bietet an, die gespeicherte Fassung neu zu laden." + }, + { + "calloutWarning": { + "title": "Die Richtlinie wird nie automatisch abgeleitet", + "body": "ProxMenux fügt keine eigenen Anforderungen hinzu. Ein leeres Feld behält den mitgelieferten Standardwert oder bleibt nicht angegeben; eine teilweise Festlegung betrifft nur die benannten Elemente." + } + } + ] + } + ] +} diff --git a/web/messages/de/docs/monitor/audit-report/reports.json b/web/messages/de/docs/monitor/audit-report/reports.json new file mode 100644 index 00000000..c002e53b --- /dev/null +++ b/web/messages/de/docs/monitor/audit-report/reports.json @@ -0,0 +1,247 @@ +{ + "meta": { + "title": "Berichte und Vergleiche | Prüfung und Bericht", + "description": "Die sechs Dokumente von Prüfung und Bericht, ihr Druck oder Speichern als PDF und der Vergleich von Durchläufen mit einem Referenzlauf." + }, + "header": { + "title": "Berichte und Vergleiche", + "description": "Sechs Dokumente für unterschiedliche Fragen und der Vergleich jedes Durchlaufs mit einem Referenzlauf.", + "section": "Prüfung und Bericht" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "Sechs Dokumente, nicht sechs Stile", + "body": "Die Engine wählt Prüfungen und Abschnitte aus, bevor sie das Dokument erstellt. Eine schnelle Diagnose ist kein vollständiges Audit mit weniger Seiten, und ein Inventar zeigt keine Bewertungsergebnisse. Die folgenden Beispieldokumente verwenden fiktive Daten." + } + } + ] + }, + { + "id": "documents", + "title": "Die sechs Dokumente", + "blocks": [ + { + "downloads": { + "items": [ + { + "title": "Vollständiges Audit", + "body": "Dokumentiert den gesamten Knoten als technische Bestandsaufnahme.", + "href": "/monitor/audit/sample-audit-full-report.pdf", + "facts": [ + { + "label": "Kontrollen", + "value": "Alle verfügbaren Prüfungen." + }, + { + "label": "Inhalt", + "value": "Ergebnisübersicht; Identität und Cluster; Hardware; Netzwerk und Latenz; Speicher; Gastsysteme; Passthrough; Anwendungen; Befunde mit Nachweisen; Quellen und Umfang." + } + ] + }, + { + "title": "Schnelldiagnose", + "body": "Zeigt, was Aufmerksamkeit braucht, ohne das komplette Inventar.", + "href": "/monitor/audit/sample-audit-diagnostic-report.pdf", + "facts": [ + { + "label": "Kontrollen", + "value": "Die gleichen Prüfungen wie das vollständige Audit." + }, + { + "label": "Inhalt", + "value": "Minimale Identität; kritische Befunde; Warnungen; relevante Beobachtungen; nicht verifizierte Messwerte und prioritäre Maßnahmen. Diagramme, Inventar und lange Anhänge werden ausgelassen." + } + ] + }, + { + "title": "Inventar", + "body": "Beschreibt, was auf dem Knoten existiert, ohne es zu bewerten.", + "href": "/monitor/audit/sample-audit-inventory-report.pdf", + "facts": [ + { + "label": "Kontrollen", + "value": "Keine; kein Befund ist klassifiziert." + }, + { + "label": "Inhalt", + "value": "Identität; Cluster; CPU und Speicher; Board, BIOS und Controller; Netzwerk; Storage; VMs und LXCs; Passthrough; Anwendungen und Elemente, die von ProxMenux verwaltet werden." + } + ] + }, + { + "title": "Sicherheitsüberprüfung", + "body": "Umfasst die Exposition und die Kontrollen über den Zugang zum Knoten.", + "href": "/monitor/audit/sample-audit-security-report.pdf", + "facts": [ + { + "label": "Kontrollen", + "value": "Der Sicherheitsbereich sowie Containerprivilegien, Updates, Repositories und die APT-Kette." + }, + { + "label": "Inhalt", + "value": "Identität und Cluster; Netzwerk und Latenz; Zugriff; Firewall; 2FA; Zertifikate; Privilegien; Updates; Repositories; Zustand und Alter von Lynis." + } + ] + }, + { + "title": "Überprüfung der Sicherungen", + "body": "Prüft, ob der deklarierte Schutz vorhanden ist und ob seine Backups verwendbar sind.", + "href": "/monitor/audit/sample-audit-backup-report.pdf", + "facts": [ + { + "label": "Kontrollen", + "value": "Der Backup-Bereich plus Storage-Konnektivität und Benachrichtigungszustellung." + }, + { + "label": "Inhalt", + "value": "Abdeckung pro Gast; erklärtes Wiederherstellungsziel; Alter und Ergebnis; Ziel; Aufbewahrung; Überprüfung; gescheiterte Jobs; Wiederherstellung und unvollständige Quellen." + } + ] + }, + { + "title": "Kapazität und Verschleiß", + "body": "Misst Wachstumsspielraum und Anzeichen von Erschöpfung oder Alterung.", + "href": "/monitor/audit/sample-audit-capacity-report.pdf", + "facts": [ + { + "label": "Kontrollen", + "value": "Die Speicher- und Hardwarebereiche sowie Speicher, Swap, Journal und das Host-Dateisystem." + }, + { + "label": "Inhalt", + "value": "Belegung und Schwellenwerte; Thin Pools; Überprovisionierung; Arbeitsspeicher; Inodes; ZFS; Temperaturen; Betriebsstunden; SMART-Fehler und NVMe/SSD-Lebensdauer." + } + ] + } + ] + } + }, + { + "figure": { + "src": "/monitor/audit/audit-report-preview.png", + "alt": "Erste Seite eines vollständigen Auditberichts", + "caption": "Jedes Dokument teilt die Berichtskennung, die nummerierten Abschnitte, das Datum, den Knoten, das Profil und die Fußzeile." + } + }, + { + "p": "Je nach Profil enthält das Dokument Knotenidentität und Bewertungsdatum, Ergebnisübersicht, Zusammenfassung nach Bereichen, Hardware-, Netzwerk- und Speicherstruktur, Schutz der Gastsysteme, Befunde mit Nachweisen, nicht lesbare Quellen sowie angewandten Umfang und Richtlinie." + } + ] + }, + { + "id": "print", + "title": "Drucken oder Speichern als PDF", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Starten", + "body": "Die Bewertung nutzt das unter Bericht ausgewählte Profil." + }, + { + "title": "Überprüfung", + "body": "Der abgeschlossene Durchlauf zeigt Befunde, nicht lesbare Quellen und die angewandte Richtlinie." + }, + { + "title": "Bericht erzeugen", + "body": "Bericht erzeugen öffnet die als Dokument aufbereitete Ansicht." + }, + { + "title": "Druck", + "body": "Drucken oder als PDF speichern öffnet den Druckdialog des Browsers zur Auswahl eines Druckers oder von Als PDF speichern." + } + ] + } + }, + { + "calloutTip": { + "title": "Der Ausdruck ist ein Dokument, kein Screenshot", + "body": "Die Aktionsleiste ist ausgeblendet, eine Tabelle, die auf der nächsten Seite fortgesetzt wird, wiederholt ihre Kopfzeile, Blöcke vermeiden unnötige Pausen und jede Seite behält die Identifikation und Nummerierung." + } + } + ] + }, + { + "id": "compare", + "title": "Vergleich mit einem Referenzlauf", + "intro": "Als Referenz verwenden markiert einen abgeschlossenen Durchlauf. Spätere Durchläufe werden damit verglichen und ihre Befunde aufgeteilt in :", + "blocks": [ + { + "table": { + "headers": [ + "Gruppe", + "Bedeutung" + ], + "rows": [ + [ + "Neu", + "Jetzt berichtet und nicht vorher." + ], + [ + "Verschlechtert", + "Weiterhin gemeldet, aber schwerwiegender oder umfassender als zuvor." + ], + [ + "Verbessert", + "Weiterhin gemeldet, aber weniger schwerwiegend oder umfassend als zuvor." + ], + [ + "gelöst", + "Nicht mehr gemeldet und von niemandem als Risiko akzeptiert." + ], + [ + "Akzeptiert", + "Wird nicht mehr gezählt, weil ein Risiko akzeptiert wurde, nicht weil sich der Host geändert hat." + ], + [ + "Nicht mehr bewertet", + "Zuvor vorhanden, in diesem Durchlauf nicht enthalten; ihr Wegfall wurde nicht verifiziert." + ] + ] + } + }, + { + "table": { + "headers": [ + "Bezugslauf", + "Verhalten" + ], + "rows": [ + [ + "Setzen Sie es", + "Jeder fertige Lauf kann markiert werden; keiner wird automatisch markiert." + ], + [ + "Es ändern", + "Ein anderer markierter Durchlauf ersetzt die Referenz, ohne den Verlauf zu löschen." + ], + [ + "Vergleichen", + "Wenn keine zwei Durchläufe ausgewählt sind, verwendet der Vergleich die Referenz und den ausgewählten oder letzten Durchlauf." + ], + [ + "Durchläufe aufbewahren", + "Die 30 neuesten Durchläufe werden aufbewahrt; der Referenzlauf wird nie entfernt." + ], + [ + "Ohne Referenz", + "Die Ansicht zeigt, dass noch kein Referenzlauf gewählt wurde und somit keine Vergleichsgrundlage vorhanden ist." + ] + ] + } + }, + { + "calloutWarning": { + "title": "Ein Bericht beschreibt einen Moment", + "body": "Eine Bewertung bestätigt keinen ganzen Zeitraum. Ältere Ergebnisse beschreiben den aktuellen Zustand nicht mehr; die Ansicht zeigt das Alter des letzten Durchlaufs und jede Quelle behält ihren Erfassungszeitpunkt." + } + } + ] + } + ] +} diff --git a/web/messages/de/docs/monitor/audit-report/scope.json b/web/messages/de/docs/monitor/audit-report/scope.json new file mode 100644 index 00000000..09918d00 --- /dev/null +++ b/web/messages/de/docs/monitor/audit-report/scope.json @@ -0,0 +1,115 @@ +{ + "meta": { + "title": "Umfang und Garantien | Prüfung und Bericht", + "description": "Herkunft der Daten von Prüfung und Bericht, Grenzen des Prüfbereichs, Entwurfsgarantien und Speicherorte." + }, + "header": { + "title": "Umfang und Garantien", + "description": "Woher Bewertungsdaten stammen, was außerhalb des Prüfbereichs liegt und wo Prüfung und Bericht seine Daten speichert.", + "section": "Prüfung und Bericht" + }, + "sections": [ + { + "id": "sees", + "title": "Was er beobachtet", + "blocks": [ + { + "list": { + "items": [ + "Konfiguration und Zustand des lokalen Knotens.", + "Die deklarierte Konfiguration der VMs und LXCs.", + "Der Speicherzustand, wie ihn Proxmox VE erfasst.", + "Die verfügbare Historie von Backups und Verifizierungen.", + "SMART-Daten und die Ereignisse, die der Monitor gesammelt hat.", + "Der Zustand von Diensten, Cluster, HA und lokalen Quellen." + ] + } + } + ] + }, + { + "id": "outside", + "title": "Was außerhalb seiner Sicht ist", + "blocks": [ + { + "list": { + "items": [ + "Das Innere der Gäste, über das hinaus, was sie Proxmox VE erklären.", + "Netzwerkausrüstung außerhalb des Hosts.", + "Fernabhängigkeiten, die der Knoten nicht beobachten kann.", + "Physischer Zustand, den die Hardware nicht bereitstellt.", + "Das Änderungsprotokoll erfasst keine manuellen Aktionen oder Aktionen anderer Software." + ] + } + }, + { + "calloutWarning": { + "title": "Fehlende Beweise sind keine Beweise für Abwesenheit", + "body": "Eine Quelle, die nicht gelesen werden kann, liefert ein nicht verifiziertes oder unvollständiges Ergebnis, niemals ein konformes. Der Bericht listet die Quellen auf, die nicht verfügbar waren." + } + } + ] + }, + { + "id": "guarantees", + "title": "Garantien für das Design", + "blocks": [ + { + "list": { + "items": [ + "Stabile Kennzeichen für die Kontrollen.", + "Verlauf der Durchläufe und Befunde.", + "Eine validierte, atomar gespeicherte Richtlinie.", + "Akzeptierte Risiken mit einem Grund, sichtbar.", + "Zuweisung von Änderungen an Skript und Funktion.", + "Erfassung des Zustands vor und nach der Änderung, soweit verfügbar.", + "Ein explizites Ergebnis, wenn etwas nicht gemessen oder erfasst werden kann." + ] + } + } + ] + }, + { + "id": "storage", + "title": "Wo die Daten gespeichert werden", + "blocks": [ + { + "table": { + "headers": [ + "Daten", + "Ort" + ], + "rows": [ + [ + "Richtlinie", + "/usr/local/share/proxmenux/audit_policy.json" + ], + [ + "Bewertungen", + "Die Prüfdatenbank des Monitors" + ], + [ + "Erfasste Objekte", + "/usr/local/share/proxmenux/changes/objects/" + ], + [ + "Ausstehende Einträge", + "/usr/local/share/proxmenux/changes/spool/" + ], + [ + "Zusammengeführtes Änderungsprotokoll", + "/usr/local/share/proxmenux/changes.db" + ] + ] + } + }, + { + "calloutInfo": { + "title": "Ein Tool zur Überprüfung, keine Zertifizierung", + "body": "Prüfung und Bericht prüft, vergleicht und dokumentiert den Knoten. Die Ergebnisse werden im Kontext des Systemzwecks, der festgelegten Richtlinie und der verfügbaren Quellen bewertet." + } + } + ] + } + ] +} diff --git a/web/messages/de/docs/monitor/dashboard/apps.json b/web/messages/de/docs/monitor/dashboard/apps.json new file mode 100644 index 00000000..89e2519d --- /dev/null +++ b/web/messages/de/docs/monitor/dashboard/apps.json @@ -0,0 +1,174 @@ +{ + "meta": { + "title": "Apps-Dashboard: ein Starter für alle Weblinks | ProxMenux", + "description": "Verwenden Sie das Apps-Dashboard, um registrierte LXC-Weblinks und benutzerdefinierte Links zu öffnen, sie nach Kategorie zu ordnen und zu dem Gast zurückzukehren, der jeden Dienst besitzt." + }, + "header": { + "title": "Dashboard: Apps Tab", + "description": "Ein einzelner Launcher für die Web-Schnittstellen, die Sie über den Knoten verwenden, unabhängig davon, ob sie von einer registrierten LXC-Anwendung oder einem benutzerdefinierten Weblink stammen.", + "section": "ProxMenux Monitor · Übersicht" + }, + "intro": { + "title": "Ein Launcher, kein Application Installer", + "body": "Der Reiter Apps installiert keine Software und sucht nicht selbst nach Diensten. Er zeigt gespeicherte Weblinks in einem durchsuchbaren Raster. LXC-Links werden im App-Reiter des Gastsystems konfiguriert; eigene Links ergänzen VM-Dienste, Reverse Proxys und externe Dashboards." + }, + "sources": { + "heading": "Was in Apps erscheint", + "intro": "Jede startbare URL wird zu einer eigenen Karte. Die Quelle bestimmt, wo diese Karte bearbeitet wird, aber nicht, wie sie während des normalen Gebrauchs aussieht.", + "colSource": "Quelle", + "colAppears": "Was erscheint", + "colManagedFrom": "Wo es verwaltet wird", + "rows": [ + { + "source": "Registrierte LXC-Anwendung", + "appears": "Eine Karte für jeden Weblink, der im Anwendungsprotokoll gespeichert ist.", + "managedFrom": "VMs und LXCs → LXC-Dialog → App" + }, + { + "source": "Benutzerdefinierter Link an einen Gast gebunden", + "appears": "Eine Service-URL, die mit einem bestimmten VM oder LXC verknüpft ist.", + "managedFrom": "Apps → Bearbeiten" + }, + { + "source": "Eigener Link ohne Gastzuordnung", + "appears": "Beliebiges HTTP(S)-Ziel, einschließlich externer Dienste und Dienste hinter einem Reverse Proxy.", + "managedFrom": "Apps → Bearbeiten" + } + ], + "relationshipTitle": "Apps und der LXC App-Tab haben unterschiedliche Jobs", + "relationshipBody": "Der App-Reiter des LXC verwaltet Anwendungsidentität, Weblinks und optionales Versionstracking. Apps verwendet diese Links als Schnellzugriff. Die Bearbeitung einer LXC-Karte öffnet daher den Gastdatensatz, ohne die Konfiguration zu duplizieren." + }, + "cards": { + "heading": "Wie man eine Karte benutzt", + "intro": "Die gesamte Karte ist das Startziel, während ihre kleineren Kontrollen einen Kontext bieten, ohne den Dienst zu öffnen.", + "items": [ + "Klicken Sie auf die Karte, um ihre URL in einem neuen Browser-Tab zu öffnen.", + "Das Logo verwendet zuerst das Web Link-Logo und fällt gegebenenfalls auf das Anwendungslogo zurück.", + "Der Kategoriechip verwendet die gleiche Farbe und Beschriftung wie der entsprechende Weblink im LXC App-Tab.", + "Die Gastanzeige nennt die zugeordnete VM oder den LXC. Ein Klick öffnet dessen Dialog: LXC-Links öffnen App, VM-Links Status.", + "Ein violetter Aufwärtspfeil kennzeichnet ein verfügbares Update der betreffenden Anwendung oder des Docker-Images. Er ist keine Gesamtzahl aller Updates des Gastsystems." + ] + }, + "toolbar": { + "heading": "Suche, Filter und Sortierung", + "intro": "Die Symbolleiste verengt eine große Anwendungssammlung, ohne die gespeicherten Datensätze zu ändern.", + "items": [ + "Die Suche entspricht dem Anwendungsnamen, dem Gastnamen, dem VMID und der Kategorie.", + "Der Kategoriefilter zeigt jeweils eine Kategorie oder alle Anwendungen an.", + "Sortieren Sie nach Name, ID oder Kategorie. Die Kategoriesortierung fügt Überschriften zwischen Kartengruppen ein.", + "Die Sortierung wird in diesem Browser gespeichert. Suchtext und Kategoriefilter werden beim erneuten Seitenaufruf zurückgesetzt.", + "Die Registerkarte Apps bleibt verfügbar, wenn das Raster leer ist, so dass der erste benutzerdefinierte Link hinzugefügt werden kann, ohne zuerst eine LXC-Anwendung zu registrieren." + ] + }, + "customLinks": { + "heading": "Hinzufügen und Bearbeiten von benutzerdefinierten Weblinks", + "intro": "Verwenden Sie einen benutzerdefinierten Link, wenn der Dienst nicht durch eine registrierte LXC-Anwendung dargestellt wird.", + "steps": [ + "Wählen Sie Link hinzufügen in der Werkzeugleiste oder der leeren Ansicht.", + "Geben Sie einen Namen und eine vollständige http:// oder https:// URL ein.", + "Optional ein Logo hinzufügen, eine Kategorie auswählen oder erstellen und den Link an einen VM oder LXC binden.", + "Speichern Sie den Link. Seine Karte erscheint sofort im Raster.", + "Zum Ändern oder Entfernen eines eigenen Links wählen Sie Bearbeiten und den Stift auf seiner Karte." + ], + "colField": "Feld", + "colRequired": "Erforderlich", + "colPurpose": "Zweck", + "fields": [ + { + "field": "Name", + "required": "Ja", + "purpose": "Der kartentitel und der suchbegriff." + }, + { + "field": "URL", + "required": "Ja", + "purpose": "Das vollständige HTTP(S) Ziel, das von der Karte geöffnet wird." + }, + { + "field": "Logo-URL", + "required": "Nein", + "purpose": "Ein Fernbild, das auf der Karte angezeigt wird." + }, + { + "field": "Kategorie", + "required": "Nein", + "purpose": "Fügt ein gemeinsames Badge hinzu und ermöglicht die Kategoriefilterung." + }, + { + "field": "Gastzuordnung", + "required": "Nein", + "purpose": "Verbindet den Link mit einem VM oder LXC und aktiviert die Gastverknüpfung." + } + ], + "editTitle": "Bearbeiten der Quelle der Wahrheit", + "editBody": "Stifte erscheinen im Bearbeitungsmodus nur bei eigenen Links. Für eine LXC-Anwendungskarte öffnen Sie den App-Reiter des Gastsystems und ändern dort den gespeicherten Weblink." + }, + "categories": { + "heading": "Kategorien und Aktualisierungssignale", + "intro": "Kategorien organisieren Links; Updatesignale melden den Softwarezustand. Sie sind absichtlich getrennt.", + "items": [ + "Kataloggestützte LXC-Registrierung kann eine Kategorie vorfüllen, bleibt aber editierbar.", + "Benutzerdefinierte Kategorienamen können aus dem gleichen Selektor erstellt und dann vom Filter wiederverwendet werden.", + "Kategoriefarben sind deterministisch und passen sich dem hellen oder dunklen Thema an. Lila und rote Bereiche sind für Update- und Gefahrenzustände reserviert.", + "Bei Docker-Weblinks ordnet ProxMenux die Karte einem Container oder Image zu und zeigt dessen Image-Updatezustand. Docker-Engine-Updates bleiben im Reiter Aktualisierungen des LXC." + ] + }, + "persistence": { + "heading": "Persistenz und Cache-Verhalten", + "intro": "Das Dashboard ist so konzipiert, dass es sich von bereits verfügbaren Monitordaten öffnet, anstatt jeden Gast neu zu scannen.", + "items": [ + "Eigene Links werden atomar in /etc/proxmenux/custom_links.json gespeichert und beim Start von Monitor in den Arbeitsspeicher geladen.", + "Registrierte LXC-Links bleiben Teil des gespeicherten Monitor-Datensatzes ihrer Anwendung; das Apps-Dashboard dupliziert sie nicht in die benutzerdefinierte Link-Datei.", + "Das Erstellen, Bearbeiten oder Löschen eines benutzerdefinierten Links aktualisiert die In-Memory-Liste sofort.", + "Die Sortierpräferenz gilt nur für diesen Browser und wird nicht zwischen Geräten oder Benutzern synchronisiert.", + "Die Position von Apps in der Hauptnavigation wird unter Einstellungen → Navigationsreihenfolge festgelegt." + ] + }, + "troubleshooting": { + "heading": "Häufige Situationen", + "colProblem": "Lage", + "colResolution": "Lösung", + "rows": [ + { + "problem": "Eine LXC-Anwendung ist registriert, aber keine Karte erscheint", + "resolution": "Öffnen Sie den Tab App und fügen Sie mindestens einen Weblink hinzu. Versions-Tracking allein erstellt keine Launcher-Karte." + }, + { + "problem": "URL oder Logo ist falsch", + "resolution": "Bearbeiten Sie den benutzerdefinierten Link in Apps oder bearbeiten Sie den Weblink im LXC App-Tab." + }, + { + "problem": "Ein Docker-Service fehlt", + "resolution": "Bearbeiten Sie die registrierte Docker-Anwendung und speichern Sie den veröffentlichten Webport des Dienstes als Weblink." + }, + { + "problem": "Der lila Pfeil bezieht sich auf das falsche Docker Update", + "resolution": "Überprüfen Sie den Weblink-Namen und die Beschreibung, damit sie mit dem beabsichtigten Container oder Image übereinstimmen können." + }, + { + "problem": "Apps öffnen sich zuerst statt Systemübersicht", + "resolution": "Der erste gespeicherte Eintrag unter Einstellungen → Navigationsreihenfolge wird zum Startreiter. Stellen Sie die Standardreihenfolge wieder her oder verschieben Sie Übersicht an die erste Stelle." + } + ] + }, + "whereNext": { + "heading": "Wohin als nächstes", + "items": [ + { + "label": "LXC App Tab", + "href": "/docs/monitor/dashboard/vms-lxcs/app", + "tail": "— Anwendungen registrieren, Weblinks und optionales Versions-Tracking." + }, + { + "label": "LXC Updates Tab", + "href": "/docs/monitor/dashboard/vms-lxcs/updates", + "tail": " — Aktualisierungen für Anwendungen, Docker Engine und Images konfigurieren und ausführen." + }, + { + "label": "Tab Einstellungen", + "href": "/docs/monitor/dashboard/settings#navigation-order", + "tail": " — Navigationsreihenfolge und Startreiter ändern." + } + ] + } +} diff --git a/web/messages/de/docs/monitor/dashboard/hardware.json b/web/messages/de/docs/monitor/dashboard/hardware.json new file mode 100644 index 00000000..f45c1bd6 --- /dev/null +++ b/web/messages/de/docs/monitor/dashboard/hardware.json @@ -0,0 +1,248 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Dashboard: Hardware | ProxMenux-Dokumentation", + "description": "Die Hardware-Registerkarte inventarisiert die physische Maschine: CPU und Motherboard, Speichermodule, thermische Sensoren, GPUs (mit Echtzeitüberwachung pro Slot und Ein-Klick-Treiber-Installation), Coral TPU-Beschleuniger, Speicherzusammenfassung mit Link-Geschwindigkeitsprüfungen, vollständige PCI- und USB-Gerätelisten, Stromverbrauch, PSUs, Lüfter und USV-Zustand." + }, + "header": { + "title": "Dashboard: Hardware", + "description": "Die physische Maschine in einem Bildschirm - CPU und Motherboard-Identität, jedes Speichermodul, thermische Sensoren über alle Subsysteme hinweg, GPUs mit Live-Auslastung und ein eingebautes Treiber-Installationsprogramm, Coral-TPUs, jedes PCI- und USB-Gerät mit seinem Kernel-Treiber, das vollständige Festplatteninventar mit ausgehandelten Verbindungsgeschwindigkeiten sowie Strom, Kühlung und USV.", + "section": "ProxMenux Monitor · Übersicht" + }, + "intro": { + "title": "Gebaut aus Standardwerkzeugen", + "body": "Der größte Teil dieser Registerkarte wird aus lscpu, dmidecode, lspci, lsusb, lsblk, smartctl, nvme, sensors, nvidia-smi, intel_gpu_top, amdgpu_top, ipmitool und upsc analysiert. Abschnitte werden nur dann dargestellt, wenn das betreffende Tool Daten zurückgibt, so dass ein Host ohne USV die USV-Karte nicht zeigt und ein Host ohne IPMI keine Out-of-Band-Leistungszahlen anzeigt." + }, + "thresholds": { + "title": "Hier angewendete Statusfarben und -schwellen", + "intro": "Alle Temperaturanzeigen verwenden dieselbe Einteilung: grün unter der Warnschwelle, bernsteinfarben zwischen Warn- und kritischer Schwelle, rot ab der kritischen Schwelle. Empfohlene Standardwerte von ProxMenux :", + "items": [ + "CPU-Temperatur — Warnung 80 °C, kritisch 90 °C.", + "Disk Temperatur — HDD 60/65 °C · SSD 70/75 °C · NVMe 80/85 °C · SAS 55/65 °C (Warnung/kritisch)." + ], + "outro": "Alle Werte sind pro Host konfigurierbar. Einstellungen → Grenzwerte der Zustandsüberwachung ist die zentrale Referenz und erklärt ihre Anpassung." + }, + "sections": { + "heading": "Abschnitte", + "intro": "Die Abschnitte erscheinen von oben nach unten in dieser Reihenfolge. Manche benötigen die passende Hardware oder ein installiertes Werkzeug und sind unten als (bedingt) markiert.", + "systemInfoTitle": "Systeminformationen", + "systemInfoIntro": "Zwei nebeneinander liegende Blöcke, immer vorhanden:", + "systemInfoItems": [ + "CPU — Modell, Mikroarchitektur, Sockel/Kerne/Threads, Basis-/Boost-Takt, Virtualisierungsmerkmale (VT-x / AMD-V) und Cache-Topologie.", + "Mainboard — Hersteller, Modell, BIOS-Version und -Datum sowie SMBIOS-UUID. Hilft beim Finden der passenden Hersteller-Downloadseite für Firmware-Updates." + ], + "memoryTitle": "Speichermodule", + "memoryBody": "Eine Zeile je belegtem Steckplatz aus dmidecode: Steckplatzbezeichnung, Modulgröße, Typ (DDR4/DDR5/ECC), konfigurierter und spezifizierter Takt, Hersteller, Teile- und Seriennummer. Leere Steckplätze sind ausgegraut, damit das Erweiterungspotenzial sichtbar bleibt.", + "thermalTitle": "Thermische Überwachung", + "thermalIntro": "Sieben Bereiche mit Daten aus lm-sensors, sysfs und werkzeugspezifischen Auswertungen. Speicher-hwmon-Sensoren werden dem physischen Blockgerät zugeordnet, sodass jedes Laufwerk mit Modell und /dev/...-Pfad erscheint. Ohne Sensoren einer Kategorie bleibt deren Bereich verborgen.", + "thermalItems": [ + "CPU — Temperatur des CPU-Packages und der einzelnen Kerne.", + "GPU — Sensoren dedizierter GPUs über nvidia-smi/amdgpu_top sowie Intel-iGPU. Hotspot- und Speicher-Junction-Temperatur, sofern der Treiber sie bereitstellt.", + "NVME — zusammengesetzte Controllertemperatur, dem genauen NVMe-Namespace zugeordnet.", + "HDD — drivetemp-Messwerte für Rotationsblockgeräte.", + "SSD — drivetemp-Messwerte für nicht rotierende SATA/SAS-Blockgeräte.", + "PCI — Sensoren, die als PCI-befestigte Geräte auftauchen (HBAs, Netzwerkkarten mit internen Sensoren).", + "OTHER - Chipsatz, VRM, Umgebungssensoren, die anderswo nicht passen." + ] + }, + "graphics": { + "heading": "Grafikkarten", + "intro": "Jeder Videocontroller erscheint als Karte mit Hersteller, Modell, Typ (Integriert/PCI/BMC), PCI-Adresse (BDF), Kerneltreiber und Modulen. Modus wechseln schaltet zwischen LXC-Freigabe mit nativem Treiber und VM-Passthrough (vfio-pci) um. GPU-Modus wechseln (VM ↔ LXC) beschreibt die Änderungen auf dem Host.", + "vfioImageAlt": "Grafikkarten-Abschnitt mit einer an mgag200 gebundenen Matrox G200EH integrierten GPU (Ready for LXC) und einer an vfio-pci gebundenen NVIDIA Quadro P400 (Ready for VM passthrough)", + "vfioImageCaption": "Zwei GPUs erkannt: Der Matrox BMC Chip ist auf dem nativen Treiber und bereit für LXC; der NVIDIA Quadro P400 ist an vfio-pci gebunden, bereit für VM Passthrough.", + "lxcImageAlt": "Grafikkarten: Intel UHD Graphics iGPU mit i915 und NVIDIA Quadro P1000 mit nvidia, beide bereit für LXC-Container", + "lxcImageCaption": "Der gleiche Knoten nach dem Umschalten der NVIDIA-Karte zurück zum nativen Treiber - beide GPUs sind jetzt bereit für LXC-Container.", + "realtimeTitle": "Dialog zur Echtzeitüberwachung", + "realtimeBody": "Ein Klick auf eine GPU öffnet die Überwachung dieses Steckplatzes. Alle drei Sekunden wird das passende Herstellerwerkzeug abgefragt. Sichtbar sind Hersteller, Typ, PCI-Steckplatz, Treiber, Kernelmodule, Engine-Auslastung (Render/3D, Video, Blitter, VideoEnhance), Grafik- und Speichertakt, Temperatur, gemeldete Leistungsaufnahme, VRAM und aktive Prozesse mit jeweiliger Engine-Last. Daten aus /api/gpu/<slot>/realtime.", + "toolsIntro": "Das je GPU verwendete Herstellerwerkzeug :", + "headerVendor": "Hersteller", + "headerTool": "Werkzeug", + "headerProject": "Projekt", + "tools": [ + { + "vendor": "NVIDIA", + "tool": "nvidia-smi", + "projectLabel": "developer.nvidia.com", + "projectHref": "https://developer.nvidia.com/nvidia-system-management-interface" + }, + { + "vendor": "Intel iGPU", + "tool": "intel_gpu_top (igt-gpu-tools)", + "projectLabel": "gitlab.freedesktop.org", + "projectHref": "https://gitlab.freedesktop.org/drm/igt-gpu-tools" + }, + { + "vendor": "AMD", + "tool": "amdgpu_top", + "projectLabel": "github.com/Umio-Yasuno/amdgpu_top", + "projectHref": "https://github.com/Umio-Yasuno/amdgpu_top" + }, + { + "vendor": "Matrox / ASPEED (BMC)", + "tool": "— (nur Anzeige)", + "projectLabel": "Als BMC erkannt und gekennzeichnet; keine Echtzeitüberwachung." + } + ], + "nvidiaImageAlt": "Überwachung einer NVIDIA Quadro P1000: Hersteller NVIDIA, Treiber nvidia geladen, Grafiktakt 1.26 GHz, Speichertakt 2.50 GHz, Temperatur 50 °C, alle Engines bei 0 %, keine aktiven Prozesse, 4096 MiB Gesamtspeicher", + "nvidiaImageCaption": "NVIDIA Quadro P1000 mit proprietärem Treiber: Taktfrequenzen, Temperatur, Engine-Auslastungsbalken und aktive Prozesse.", + "intelImageAlt": "Überwachung einer Intel UHD Graphics iGPU mit i915: 11.31 W Leistungsaufnahme, 1 % Video-Engine-Last und ein ffmpeg-Prozess mit 8 MB", + "intelImageCaption": "Intel iGPU mit i915 aktiv. Die Tabelle Aktive Prozesse nimmt einen ffmpeg-Job mit der Video-Engine auf.", + "amdImageAlt": "Überwachung der integrierten AMD Lucienne GPU mit amdgpu: Engine-Auslastung bei 0 % und amdgpu_top als aktiver Prozess", + "amdImageCaption": "AMD-iGPU mit amdgpu_top überwacht. Das Werkzeug erscheint selbst als aktiver Prozess, weil es die Live-Daten erfasst.", + "installTitle": "NVIDIA-Treiber aus dem Dialog installieren", + "installBody": "Bei einer NVIDIA-GPU mit nouveau/nvidiafb ohne proprietären Treiber fehlen Takt-, Leistungs- und Prozesslastdaten. Der Dialog zeigt dann NVIDIA-Treiber installieren und startet das unter NVIDIA-Treiber installieren (Host) beschriebene Skript.", + "noDriverAlt": "Überwachung einer NVIDIA Quadro P620 mit nvidiafb und nouveau, Hinweis Erweiterte Überwachung nicht verfügbar und blauer Schaltfläche NVIDIA-Treiber installieren", + "noDriverCaption": "Noch kein proprietärer Treiber installiert — der Dialog bietet einen Ein-Klick-Installer.", + "promptAlt": "NVIDIA GPU-Treiber-Installationsbestätigungsdialog mit erkannten GPUs, LXC-Containern mit NVIDIA-Durchgang und einem Yes/Cancel-Paar", + "promptCaption": "Zusammenfassung vor der Installation: erkannte GPUs, LXC-Container, die bereits NVIDIA-Passthrough haben, und was das Skript tun wird. Nichts wird berührt, bis Sie bestätigen.", + "successAlt": "Terminalausgang mit erfolgreich installiertem NVIDIA-Treiber 580.105.08 und nvidia-smi mit Quadro P620", + "successCaption": "Erfolgreiche Installation - der NVIDIA .run wurde über DKMS gebaut, der Persistenzdienst ist vorhanden, und nvidia-smi meldet den GPU.", + "warningTitle": "Eine von der GPU unterstützte Treiberversion wählen", + "warningBody": "Neuere NVIDIA-Treiberzweige stellen die Unterstützung älterer GPU-Familien wie Maxwell oder Kepler ein. Meldet nvidia-smi nach der Installation \"No devices were found\" oder schlägt DKMS fehl, passt der gewählte Zweig möglicherweise nicht zur GPU. Starten Sie die Installation mit einem älteren Zweig, etwa Legacy 470.x für Kepler. Die Kompatibilität steht auf der offiziellen Treibersuchseite.", + "whereGoIntro": "Wohin gehen von hier aus:", + "whereGoItems": [ + "NVIDIA-Treiber installieren (Host) — vollständige Installationsanleitung, Kernel-Kompatibilitätsmatrix, optionaler NVENC-Patch und Übertragung auf LXCs.", + "GPU-Modus wechseln (VM ↔ LXC) — Funktion des direkten Schalters Modus wechseln.", + "GPU zu VM hinzufügen (Passthrough) und GPU zu LXC hinzufügen — erstmalige Zuweisung einer ungebundenen GPU." + ] + }, + "coral": { + "heading": "Coral TPU / AI-Beschleuniger", + "subHeading": "(bedingt)", + "intro": "Erscheint bei angeschlossenen Google-Coral- oder anderen KI-Beschleunigern. Der Gerätedialog zeigt Verbindung (M.2/Mini-PCIe/USB), PCIe-Breite, Hersteller-/Produkt-ID, Softwareunterstützung (apex im Kernel für PCIe, libedgetpu im Userspace für USB), Module (gasket + apex), Geräteknoten (/dev/apex_*), Edge-TPU-Laufzeitstatus, Live-Temperatur und Firmware-Warnschwellen.", + "imageAlt": "Coral Edge TPU Detail modal: PCIe / M.2 Verbindung, PCIe 5.0 GT/s x1 Link, Anbieter 1ac1:089a, Kernel-Treiber apex, gasket und apex Module geladen, /dev/apex_0 vorhanden, Edge TPU Runtime nicht installiert, Temperatur 53.5 °C mit Hardware-Warnschwellenwerten", + "imageCaption": "M.2 Coral mit den geladenen Host-Kernel-Modulen, dem Geräteknoten und den freigegebenen Firmware-Temperaturwarnungen. Die Laufzeitlinie wird grün, sobald die passende Edge TPU-Laufzeit installiert ist.", + "pathsIntro": "Je nach Formfaktor gibt es zwei Installationspfade:", + "pathsItems": [ + "M.2 / Mini-PCIe - der Host benötigt die Kernelmodule gasket + apex, die über DKMS erstellt wurden, damit der Geräteknoten /dev/apex_0 beim Booten erscheint.", + "USB Accelerator – der Host benötigt nur die Edge TPU User-Space Runtime (libedgetpu1-std) aus dem APT-Repository von Google." + ], + "outro": "Coral TPU auf dem Host installieren erkennt und verwaltet beide Varianten. Hintergrundinformationen und die offizielle Laufzeit finden Sie unter coral.ai/docs. Anschließend weisen Sie das Gerät mit Coral TPU zu LXC hinzufügen einem Container zu." + }, + "storage": { + "heading": "Speicherzusammenfassung", + "intro": "Alle dem Kernel bekannten Blockgeräte nach Typ. Je Datenträger: Kernelname (sda, nvme0n1, zram0…), Typ (SSD, HDD, NVMe SSD), Modell und ausgehandelte Verbindung. Ein Klick öffnet Modell, Seriennummer, Kapazität, Schnittstelle sowie aktuelle und maximale Verbindungsgeschwindigkeit.", + "imageAlt": "Storage Summary-Karte mit elf Blockgeräten (SATA SSDs, SATA HDDs, NVMe SSDs und zram) mit Modellzeichenfolgen und ausgehandelten Verbindungsgeschwindigkeiten; die beiden NVMe-Laufwerke zeigen 3.0 x4 mit der aktuellen Geschwindigkeit hervorgehoben", + "imageCaption": "Elf Geräte auf diesem Knoten. SATA-Verbindungen erscheinen als SATA <version>, <Gb/s> (current: ...), NVMe-Laufwerke als <PCIe gen> x<width>.", + "nvmeBody": "Bei NVMe wird die ausgehandelte Verbindung mit dem Gerätemaximum verglichen. Bei Abweichungen, etwa einer Gen3-x4-SSD mit 3.0 x1 in einem einspurig angebundenen Steckplatz, erscheint der aktuelle Wert bernsteinfarben. Das hilft bei langsamen Laufwerken oder nach einer geänderten Lane-Zuordnung durch ein BIOS-Update.", + "nvmeModalAlt": "NVMe-Detaildialog für nvme0n1: NVMe SSD, 953.9 GB, aktueller Link 3.0 x1 bernsteinfarben, Maximum 3.0 x4, WDC CL SN720, Seriennummer, PCIe/NVMe", + "nvmeModalCaption": "NVMe-Details mit reduzierter Lane-Anzahl: Das Laufwerk unterstützt x4, der Steckplatz ist nur x1 angebunden.", + "outro": "SMART-Daten, Selbsttests, Verlauf und PDF-Bericht stehen unter Dashboard: Speicher. Dieselben Daten nutzt SMART-Datenträgerzustand und Tests. Ein langer Test über das Skript schreibt die JSON-Datei für Speicher → Verlauf in Monitor." + }, + "pci": { + "heading": "PCI-Geräte", + "intro": "PCI-Geräte mit PCI-BDF (Bus:Device.Function, etwa 03:00.0) und Klasse (Speichercontroller, USB-Controller, Grafikkarte, Netzwerkcontroller, Audiocontroller…). Jede Karte zeigt Hersteller, Gerätenamen und aktuell gebundenen Kerneltreiber, hilfreich bei Passthrough-, IOMMU- oder Treiberproblemen.", + "imageAlt": "PCI Devices Abschnitt listet fünfzehn Geräte nach Klasse gruppiert: Speicher-Controller auf ahci / nvme, USB-Controller, Grafikkarten (einer auf vfio-pci, einer auf dem nativen Treiber), Netzwerk-Controller auf igb / tg3, ein Audio-Controller neben einem durchgelassenen GPU", + "imageCaption": "Fünfzehn Geräte auf diesem Knoten. Beachten Sie, dass die GPU und die dazugehörige Audiofunktion beide an vfio-pci gebunden sind - eine Karte, die für den VM-Durchgang vorbereitet ist.", + "bdfTitle": "Lesen des BDF", + "bdfBody": "03:00.0 steht für PCI-Bus 03, Gerät 00, Funktion 0. Dedizierte GPUs verwenden meist .0 für Grafik und .1 für HDMI-Audio. Beide Funktionen werden gemeinsam durchgereicht; deshalb bereinigt GPU-Modus wechseln beim Verlassen des VM-Modus auch verwaiste Audiozuordnungen." + }, + "usb": { + "heading": "USB-Geräte", + "intro": "USB-Geräte mit Hersteller und Produkt, USB-Version, bus:device-Adresse, vendor:product-ID und Kerneltreiber. Die Anzeige ordnet typische Rollen zu: Kommunikation (Z-Wave-/Zigbee-Sticks), USV, Speicher und HID. So lassen sich die Adapter ohne ID-Abgleich unterscheiden.", + "imageAlt": "USB-Gerätekarte mit drei Geräten: einem Aeotec Z-Wave Z-Stick, einem ConBee II Zigbee-Koordinator und einem Ellipse ECO USV mit jeweils USB-Version, Adresse, Vendor:product ID und gebundenem Treiber", + "imageCaption": "Drei USB-Geräte - zwei Heimautomationsradios auf usbfs und ein USV auf usbfs (NUT spricht mit ihm über libusb)." + }, + "power": { + "heading": "Stromverbrauch", + "subHeading": "(bedingt)", + "intro": "Erscheint, wenn der Host Leistungsdaten liefert. Zwei unabhängige Quellen werden angezeigt, sofern verfügbar :", + "items": [ + "Gesamtleistung ACPI/IPMI — Leistungsaufnahme des ganzen Systems über einen Mainboard-Sensor oder BMC. Typisch für Server-Mainboards.", + "CPU-Package-Leistung — aus Intel-RAPL-Zählern oder AMD-Entsprechung. Trennt die CPU-Leistung vom übrigen System auf Consumer-Mainboards ohne Gesamtsensor." + ], + "supplyImageAlt": "Abschnitt Stromverbrauch zeigt die Gesamtentnahme von 198 W über die ACPI-Schnittstelle sowie eine Power Supplies-Karte mit zwei PSUs, die beide OK melden (185 W und 5 W Ausgang)", + "supplyImageCaption": "Serverplatine mit einem einzigen ACPI-Leistungssensor und zwei PSUs, die über IPMI gemeldet werden — die zweite PSU ist die redundante, im Leerlauf bei 5 W.", + "cpuImageAlt": "Abschnitt Stromverbrauch auf einer Verbraucherplatine mit nur CPU Power 8.7 W über Intel RAPL", + "cpuImageCaption": "Verbraucherplatine ohne Ganzsystemsensor - der Abschnitt fällt nur auf RAPL CPU zurück." + }, + "psu": { + "heading": "Netzteile", + "subHeading": "(bedingt)", + "body": "Auf Server-Mainboards mit mehreren Netzteilen zeigt IPMI deren Vorhandensein (PSU 1 / PSU 2 / …), Eingangsspannung, Ausgangsleistung und Zustand OK/Fehler. Nach einer Stromstörung ist dies die erste Prüfung bei redundanten Netzteilen." + }, + "fans": { + "heading": "Systemlüfter", + "subHeading": "(bedingt)", + "body": "Drehzahl jedes Lüfters mit Minidiagramm, sofern unterstützt. Ohne Einzelwerte wird ein einziger Gehäuselüfterwert angezeigt." + }, + "ups": { + "heading": "UPS-Status", + "subHeading": "(bedingt)", + "body": "Erscheint bei konfiguriertem und erreichbarem NUT-Server (Network UPS Tools). Sichtbar sind Status (Netzbetrieb/Batteriebetrieb/Laden/Batterie schwach), Batterieladung, Restlaufzeit, Last, Eingangsspannung, Modell und Firmware. Dieselben Daten fließen in Sicherheit und Zertifikate der Zustandsüberwachung ein; Batteriebetrieb wird sofort gemeldet." + }, + "dataCollected": { + "heading": "Wie die Daten gesammelt werden", + "headerSection": "Abschnitt des Reiters", + "headerEndpoint": "Endpunkt", + "headerSource": "Quelle", + "rows": [ + { + "section": "Statisches Inventar (PCI, CPU, BIOS)", + "endpoint": "/api/hardware", + "source": "lspci -vmm, /proc/cpuinfo, dmidecode; für die Laufzeit des Prozesses zwischengespeichert." + }, + { + "section": "Live-Sensorwerte", + "endpoint": "/api/hardware/live", + "source": "sensors (lm-sensors), /sys/class/hwmon und /sys/block identifizieren Speichergeräte. Temperaturen bleiben live; nur die Zuordnung von hwmon zu Geräten wird 60 Sekunden zwischengespeichert." + }, + { + "section": "CPU Temperaturverlauf", + "endpoint": "/api/temperature/history", + "source": "Zeitreihe, die der Temperatur-Collector alle 60 Sekunden erfasst und in SQLite speichert." + }, + { + "section": "GPU Live-Metriken", + "endpoint": "/api/gpu//realtime", + "source": "NVIDIA: nvidia-smi --query-gpu=.... Intel: intel_gpu_top. AMD: sysfs /sys/class/drm/cardN." + } + ], + "codeComment1": "# Inventar mit der Betriebssystemansicht abgleichen", + "codeComment2": "# Bestätigen Sie die GPU-Karte, die das Dashboard sieht" + }, + "whereNext": { + "heading": "Wohin als nächstes", + "items": [ + { + "label": "Installieren Sie NVIDIA Treiber (Host)", + "href": "/docs/hardware/nvidia-host", + "tail": "— was die Installationsschaltfläche des GPU-Modals ausführt." + }, + { + "label": "GPU-Modus wechseln (VM ↔ LXC)", + "href": "/docs/hardware/switch-gpu-mode", + "tail": "— was der Inline-Modus-Schalter auf jeder GPU-Karte mit dem Host macht." + }, + { + "label": "Installieren Sie Coral TPU auf dem Host", + "href": "/docs/hardware/install-coral-tpu-host", + "tail": " — Installation von Coral-Kernelmodul und -Laufzeit." + }, + { + "label": "SMART-Festplattenstatus und -test", + "href": "/docs/disk-manager/smart-disk-test", + "tail": " — das Skript hinter den SMART-Daten in der Datenträger-Detailansicht unter Speicher." + }, + { + "label": "Dashboard: Speicher-Tab", + "href": "/docs/monitor/dashboard/storage", + "tail": "— vollständige SMART-Attributtabelle, Selbsttestverlauf und PDF-Bericht." + }, + { + "label": "Gesundheitsmonitor", + "href": "/docs/monitor/health-monitor", + "tail": " — die Kategorie CPU und Temperatur, die dieselben Sensoren nutzt." + }, + { + "label": "API-Referenz", + "href": "/docs/monitor/api", + "tail": " — die Endpunkte für Hardware und GPU." + }, + { + "label": "Dashboard-Index", + "href": "/docs/monitor/dashboard", + "tail": " — die anderen Reiter." + } + ] + } +} diff --git a/web/messages/de/docs/monitor/dashboard/index.json b/web/messages/de/docs/monitor/dashboard/index.json new file mode 100644 index 00000000..61d63b51 --- /dev/null +++ b/web/messages/de/docs/monitor/dashboard/index.json @@ -0,0 +1,101 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Dashboard | ProxMenux-Dokumentation", + "description": "Das Dashboard ist die Hauptoberfläche von ProxMenux Monitor: zehn Inhaltsreiter einschließlich Apps-Starter, eine globale Kopfzeile und eine konfigurierbare Navigationsreihenfolge." + }, + "header": { + "title": "Dashboard", + "description": "Die Alltagsansicht von ProxMenux Monitor: zehn Inhaltsreiter einschließlich Apps-Starter, eine globale Kopfzeile und eine konfigurierbare Navigationsreihenfolge.", + "section": "ProxMenux Monitor" + }, + "oneHeader": { + "title": "Ein Header, zehn Tabs", + "body": "Die Kopfzeile mit Logo, Knotenname, Statusanzeige, Laufzeit, Aktualisierung und Designauswahl bleibt sichtbar. Der aktive Reiter wechselt den gesamten Inhalt darunter. Die Statusfarbe entspricht der schwerwiegendsten Kategorie der Zustandsüberwachung; im Dashboard wird derselbe Wert angezeigt." + }, + "tabs": { + "heading": "Die zehn Tabs", + "intro": "Jeder Tab hat eine eigene eigene Seite. Seiten werden schrittweise hinzugefügt, wenn die Dokumentation ausgefüllt wird; unten ist die vollständige Liste und wofür jeder verantwortlich ist.", + "headerTab": "Tab.", + "headerOwns": "Zuständig für", + "rows": [ + { + "name": "Systemübersicht", + "linksTo": "/docs/monitor/dashboard/system-overview", + "owns": "CPU / Speicher / Temperatur-Widgets, aktive VM & LXC Anzahl, historische Metriken Charts, Speicher und Netzwerk-Zusammenfassungen. Standardlanderegisterkarte, bis die Navigationsreihenfolge angepasst ist." + }, + { + "name": "Apps", + "linksTo": "/docs/monitor/dashboard/apps", + "owns": "Gemeinsamer Starter für registrierte LXC-Weblinks und eigene Links, mit Kategorien, Suche, Gastsystem-Verknüpfungen und Aktualisierungshinweisen je Anwendung." + }, + { + "name": "Speicher", + "owns": "Proxmox-Pools, physische Festplatten, SMART-Daten, ZFS-Zustand, Verschleiß & Lebensdauer, Beobachtungshistorie." + }, + { + "name": "Netzwerk", + "owns": "Physische Schnittstellen, Bonds, Bridges und OVS, IP/MAC-Adressen, RX/TX-Diagramme und RRD-Verlauf je Schnittstelle." + }, + { + "name": "VMs und LXCs", + "owns": "Bestandsaufnahme der Gastsysteme, Detailansicht für Konfiguration, Metriken und Protokolle sowie Starten, Stoppen, Neustarten und Herunterfahren." + }, + { + "name": "Hardware", + "owns": "CPU-Modell und Topologie, Speicherlayout, PCIe-Topologie, GPUs mit Echtzeitüberwachung pro Slot." + }, + { + "name": "Systemprotokolle", + "owns": "Live journalctl mit Filtern, Proxmox Task History, Benachrichtigungsprotokoll, herunterladbare Log-Bundles." + }, + { + "name": "Terminal", + "owns": "Shell-Zugriff auf Host oder VM/CT im Browser mit xterm.js über WebSockets." + }, + { + "name": "Sicherheit", + "owns": "Auth-Setup, Passwort / 2FA / API-Token, Audit-Log, optionales Fail2Ban-Panel, Secure Gateway-Bereitstellung." + }, + { + "name": "Einstellungen", + "owns": "Monitor-Sprache, Navigationsreihenfolge, Benachrichtigungskanäle, KI-Anbieter, Zustandsschwellen, Ausschlüsse und Nachinstallationsoptimierungen." + } + ] + }, + "headerAnatomy": { + "heading": "Kopfanatomie", + "items": [ + "Logo + Produktname auf der linken Seite. Das Logo wird zu einer \"update available\"-Variante, wenn eine neuere Monitor-Version erkannt wird.", + "Knotenidentität: Name aus pvesh get /nodes, ersatzweise hostname.", + "Zustandsanzeige: Gesund (grün), Warnung (gelb), Kritisch (rot). Ein Klick öffnet die Zustandsüberwachung. Ein blaues Info-Abzeichen erscheint, wenn ausgeblendete Elemente noch innerhalb ihrer Unterdrückungsfrist liegen.", + "Laufzeit: Betriebszeit des Hosts in gut lesbarem Format.", + "Aktualisieren: wiederholt die Live-API-Aufrufe, ohne die gesamte Seite neu zu laden.", + "Designauswahl: hell, dunkel oder System. In localStorage gespeichert." + ] + }, + "whereNext": { + "heading": "Wohin als nächstes", + "items": [ + { + "label": "Apps Tab", + "href": "/docs/monitor/dashboard/apps", + "tail": " — gemeinsamer Weblink-Starter und seine Beziehung zu registrierten LXC-Anwendungen." + }, + { + "label": "Registerkarte Systemübersicht", + "href": "/docs/monitor/dashboard/system-overview", + "tail": "— die Landekarte, vollständig dokumentiert." + }, + { + "label": "Gesundheitsmonitor", + "href": "/docs/monitor/health-monitor", + "tail": " — Dialog hinter der Zustandsanzeige mit Details zu zehn Kategorien." + }, + { + "label": "Architektur", + "href": "/docs/monitor/architecture", + "tail": "— wie das Dashboard mit dem Flask-Backend spricht." + } + ] + } +} diff --git a/web/messages/de/docs/monitor/dashboard/network.json b/web/messages/de/docs/monitor/dashboard/network.json new file mode 100644 index 00000000..4ddd73fb --- /dev/null +++ b/web/messages/de/docs/monitor/dashboard/network.json @@ -0,0 +1,251 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Dashboard: Registerkarte Netzwerk | ProxMenux-Dokumentation", + "description": "Die Registerkarte Netzwerk erfasst alle Hostschnittstellen: physische Netzwerkkarten, Bridges, Bonds, VLANs und virtuelle VM/LXC-Schnittstellen. Die Detailansicht zeigt IP, MAC, Status, Bond-Mitglieder, Verkehr seit dem Start und ein RRD-Verlaufsdiagramm." + }, + "header": { + "title": "Dashboard: Netzwerk-Tab", + "description": "Alle vom Kernel gemeldeten Schnittstellen — physische Karten, Bridges, Bonds, VLANs und virtuelle VM/LXC-Ports — sind in drei Karten gruppiert. Ein Klick auf eine Zeile öffnet Adressen, Verkehrszähler und RRD-Verlaufsdaten.", + "section": "ProxMenux Monitor · Übersicht" + }, + "intro": { + "title": "Aktuelle Daten und Verlauf", + "body": "Der aktuelle Status stammt aus psutil.net_if_stats() und ip, der Bandbreitenverlauf aus dem Proxmox-RRD-Speicher über /api/network/<interface>/metrics. Zähler werden etwa alle 5 Sekunden aktualisiert, RRD-Daten für das Diagramm bei Bedarf geladen." + }, + "topRow": { + "heading": "Obere Reihe: vier Kennzahlenkarten", + "headerCard": "Karte", + "headerWhat": "Was es zeigt", + "rows": [ + { + "card": "Netzwerkverkehr", + "what": "Aggregierte RX / TX-Rate über alle Schnittstellen hinweg, formatiert in der richtigen Einheit (bps / Kbps / Mbps / Gbps)." + }, + { + "card": "Aktive Schnittstellen", + "what": "Zwei Zähler: Physical X / Y und Bridges X / Y, jeweils aktiv im Verhältnis zur Gesamtzahl. Ein erster Anhaltspunkt, wenn etwas nicht mehr funktioniert." + }, + { + "card": "Netzwerkstatus", + "what": "Schnelle Bewertung: In Ordnung / Warnung / Kritisch anhand von Verbindungsstatus, Gateway-Erreichbarkeit und Bridge-Integrität. Entspricht der Kategorie Netzwerkschnittstellen im Health Monitor." + }, + { + "card": "Netzwerklatenz", + "what": "Paketumlaufzeit zum Gateway mit kleinem Verlaufsdiagramm. Ein Klick öffnet den unten beschriebenen Dialog Netzwerklatenz: Verlauf und Ping-Test bei Bedarf zu Gateway, Cloudflare oder Google mit herunterladbarem PDF-Bericht." + } + ] + }, + "flow": { + "heading": "Netzwerkflussdiagramm", + "intro": "Zwischen oberer Reihe und Gruppenkarten zeigt Network Flow die aktuelle Topologie. Die Paketwege führen von physischen Netzwerkkarten über Bridges zu VMs und Containern. Animierte Impulse stellen den aktuellen rx/tx-Verkehr jeder Verbindung dar.", + "imageAlt": "Netzwerkflussdiagramm — NICs links, Host und Bridges in der Mitte, VMs und LXCs rechts, mit animierten Impulsen auf jeder Verbindung", + "imageCaption": "Network Flow – farbkodierte Knoten sowie animierte Kometen, deren Richtung und Dicke Live-Verkehr widerspiegeln.", + "elementsTitle": "Was das Diagramm zeigt", + "elementsIntro": "Jeder Knoten stellt einen Eintrag aus demselben Inventar wie die Karten darunter dar. Die Anordnung als Topologie macht ihre Beziehungen sofort sichtbar:", + "elements": [ + "Netzwerkkarten (orange) — physische Schnittstellen mit aktiver Verbindung; inaktive erscheinen blass.", + "Host (orange) — der Proxmox-Host zwischen Netzwerkkarten und Bridges. Ein fester Bezugspunkt, nicht anklickbar.", + "Bridges (cyan) — Linux- und OVS-Bridges mit mindestens einem aktiven Gast. Ungenutzte Bridges werden ausgeblendet, damit das Diagramm den tatsächlichen Verkehr zeigt.", + "LXCs (cyan) — laufende Container an einer Bridge.", + "VMs (lila) — laufende virtuelle Maschinen an einer Bridge.", + "Gestoppte VMs und Container werden ausgeblendet." + ], + "pulsesTitle": "Was die Animation kodiert", + "pulsesBody": "Die animierten Kometen, die sich entlang jeder Kante bewegen, repräsentieren Live-Verkehr:", + "pulses": [ + "Richtung — zur Netzwerkkarte bedeutet tx des Gastes, zum Gast bedeutet rx.", + "Die Linienbreite wächst mit der rx+tx-Rate des Gastes. Bei wenig Verkehr bleibt eine schwache animierte Linie sichtbar, bei hohem Verkehr wird sie dick.", + "Leuchten des Kometenkopfs — warm bei etwa 1 MB/s, intensiv ab 30 MB/s. Zeigt auf einen Blick, welcher Gast eine Netzwerkkarte stark auslastet.", + "Klick — alle Knoten außer dem Host öffnen den unten beschriebenen Schnittstellendialog. Ein Klick auf den Host hat keine Wirkung; dafür gibt es hier keinen Dialog." + ], + "useTitle": "Wenn es nützlich ist", + "useBody": "Die Karten zeigen, was vorhanden ist; das Diagramm zeigt, wie es verbunden ist und wo Verkehr fließt. Sichtbar werden Gäste an derselben Bridge, zwei stark ausgelastete Gäste an derselben Netzwerkkarte als möglicher Engpass oder eine VM, die eine Verbindung allein auslastet." + }, + "groups": { + "heading": "Drei Schnittstellengruppen", + "intro": "Drei Karten gruppieren Schnittstellen nach Funktion. Jede Kopfzeile zeigt die Anzahl aktiver Schnittstellen. Eine farbige Kennzeichnung nennt den Typ jeder Schnittstelle:", + "badges": [ + "Blaues Physical — physische Netzwerkkarte.", + "Grünes Bridge — Linux- oder OVS-Bridge (vmbr*).", + "Purple Bond — Bond / LACP / Active-Backup-Aggregator.", + "Cyanfarbenes VLAN — VLAN-Unterschnittstelle (vmbr0.10, eno1.42, …)." + ], + "clickable": "Jede Zeile ist anklickbar: physische und virtuelle Schnittstellen, Bridges und Bonds. Der unten beschriebene Dialog zeigt Basisdaten, IPs, Zähler und den RX/TX-Verlauf aus dem Proxmox-RRD-Speicher.", + "physicalTitle": "Physikalische Schnittstellen", + "physicalBody": "Vom Kernel erkannte physische Schnittstellen: eno1, enp4s0, eth0, wlp3s0 usw. Jedes Gerät hat eine Zeile mit blauem Physical-Label und Verbindungsstatus. Auch Bond-Mitglieder erscheinen hier mit Verweis auf den zugehörigen Bond.", + "bridgeTitle": "Bridge-Schnittstellen", + "bridgeBody": "Von Proxmox verwaltete Linux-Bridges (vmbr0, vmbr1, …) und OVS-Bridges. Jede Zeile zeigt das grüne Bridge-Label, bei nur einem Port die physische Schnittstelle und den Status. Bonds tragen das lila Bond-Label, VLAN-Unterschnittstellen das cyanfarbene VLAN-Label.", + "vmTitle": "VM-/LXC-Schnittstellen", + "vmBody": "Beim Gaststart erzeugte tap*- und veth*-Schnittstellen, eine je virtueller Netzwerkkarte. Die Kopfzeile zeigt X / Y Active; die Zeilen verlinken zur VM/CT auf der Registerkarte VMs & LXCs. Nach dem Stoppen verschwinden inaktive Einträge mit dem nächsten Aktualisierungszyklus." + }, + "drillIn": { + "heading": "Schnittstellendetails", + "intro": "Ein Klick auf eine Zeile öffnet einen Dialog mit fünf Bereichen:", + "headerBlock": "Block", + "headerContents": "Inhalt", + "rows": [ + { + "block": "Grundlegende Informationen", + "contents": "Name, Typ (physisch / Bridge / Bond / VLAN / vm), MAC-Adresse, Status (aktiv / inaktiv), MTU und zugrunde liegende physische Schnittstelle bei virtuellen Typen." + }, + { + "block": "Bond-Mitglieder", + "contents": "Nur für Bonds: jede zugeordnete Netzwerkkarte mit Aktiv-/Fehlerstatus, Bond-Modus (active-backup / 802.3ad / balance-alb / …) und gegebenenfalls primäre Schnittstelle." + }, + { + "block": "IP-Adressen", + "contents": "Jede IPv4/IPv6-Adresse mit der Präfixlänge. Autokonfigurierte link-lokale Adressen werden aufgelistet, aber ausgegraut." + }, + { + "block": "Verlaufsdiagramm", + "contents": "RX/TX-Bandbreite im gewählten Zeitraum (1 Stunde / 24 Stunden / 7 Tage / 30 Tage / 1 Jahr), geladen über /api/network/<interface>/metrics aus Proxmox-RRD." + }, + { + "block": "Verkehr seit dem letzten Start", + "contents": "RX/TX-Bytes und -Pakete seit dem letzten Hoststart sowie Zähler für Fehler und verworfene Pakete." + } + ], + "inactiveTitle": "Auch inaktive Schnittstellen haben eine Detailansicht", + "inactiveBody": "Ist die Schnittstelle inaktiv, zeigt der Dialog den Hinweis „Schnittstelle inaktiv“ ohne aktuelle Zähler. Konfiguration mit Adressen und Bond-Mitgliedern sowie Verlaufsdaten bleiben zur Fehlerdiagnose sichtbar." + }, + "latency": { + "heading": "Dialog Netzwerklatenz", + "intro": "Die Karte Netzwerklatenz in der oberen Reihe öffnet einen eigenen Dialog mit Verlauf, Tests bei Bedarf, drei Zielen und herunterladbarem PDF-Bericht.", + "targetsTitle": "Ziele", + "targetsIntro": "Die Auswahlliste oben bestimmt das Ping-Ziel:", + "targets": [ + "Gateway — Ihr LAN-Router. Prüft nur den lokalen Abschnitt, um Switch- oder Kabelprobleme ohne WAN-Einfluss zu untersuchen.", + "Cloudflare (1.1.1.1) — öffentlicher DNS-Resolver im Anycast-Netz. Prüft den WAN-Abschnitt.", + "Google (8.8.8.8) — alternatives öffentliches Ziel zur Gegenprüfung oder bei regionalen Cloudflare-Störungen." + ], + "mode1Title": "Modus 1 — Historische Ansicht", + "mode1Alt": "Latenzdialog im Verlaufsmodus mit Ziel Gateway, Zeitraum von einer Stunde und eingezeichneten früheren Messwerten", + "mode1Caption": "Gateway-Verlauf der letzten Stunde. Der Temperatur-/Latenz-Sammler schreibt die Messwerte alle 60 Sekunden in die Verlaufsdatenbank.", + "mode1Body1": "Standardmodus beim Öffnen. Eine zweite Auswahl bestimmt den Zeitraum (1 Stunde / 6 Stunden / 24 Stunden / 3 Tage / 7 Tage). Über dem Diagramm stehen Aktuell / Minimum / Mittelwert / Maximum und ein Status Ausgezeichnet / Gut / Mittelmäßig / Schlecht nach den folgenden Schwellen.", + "mode1Body2": "Quelle sind die Messwerte, mit denen Health Monitor anhaltende Netzwerkverzögerungen erkennt. Der Hintergrund-Thread _temperature_collector_loop misst das Gateway alle 60 Sekunden und speichert die Werte lokal in SQLite.", + "mode2Title": "Modus 2 — Echtzeitprüfung", + "mode2Alt": "Latenzdialog mit laufendem Echtzeit-Ping zu Cloudflare, 50 % Fortschritt und fortlaufenden Messwerten im Diagramm", + "mode2Caption": "Zweiminütiger Cloudflare-Test mit einer Messung alle fünf Sekunden, die sofort im Diagramm erscheint. Stoppen beendet vorzeitig; Erneut testen ergänzt denselben Datensatz.", + "mode2Intro": "Die Umstellung des Ziels auf Cloudflare oder Google startet einen On-Demand-Ping-Test. Verhalten:", + "mode2Items": [ + "Dauer — zwei Minuten je Lauf mit Fortschrittsbalken und verbleibenden Sekunden.", + "Intervall — eine Messung alle fünf Sekunden, 24 je Lauf.", + "Methode — ICMP Echo Request (ping), drei aufeinanderfolgende Pings je Messwert mit gemittelter Latenz.", + "Stop — beendet den Test sofort; Teildaten bleiben erhalten.", + "Erneut testen — ergänzt die vorhandenen Daten um weitere Messwerte, sodass über mehrere Läufe ein längerer Verlauf entsteht.", + "Aktuelle Statusanzeige — wird nach jeder Messung anhand derselben Schwellen für Ausgezeichnet / Gut / Mittelmäßig / Schlecht neu bewertet." + ], + "thresholdsTitle": "Leistungsschwellen", + "headerStatus": "Status", + "headerRange": "Bereich", + "headerImpact": "Praktische Auswirkungen", + "thresholdRows": [ + { + "status": "Exzellent", + "range": "< 50 ms", + "impact": "Optimal für Echtzeit-Apps, Spiele und Videoanrufe." + }, + { + "status": "Gut", + "range": "50 – 100 ms", + "impact": "Für die meisten Anwendungen akzeptabel, mit minimalen Auswirkungen." + }, + { + "status": "Mittelmäßig", + "range": "100 – 200 ms", + "impact": "Spürbare Verzögerung. Kann VoIP und interaktive Anwendungen beeinträchtigen." + }, + { + "status": "Schlecht", + "range": "> 200 ms", + "impact": "Erhebliche Latenz. Untersuchung empfohlen." + } + ], + "reportTitle": "Netzwerklatenzbericht (PDF)", + "reportIntro": "Beide Modi haben neben der Zielauswahl eine Schaltfläche Bericht. Sie erzeugt ein PDF der Messungen als möglichen Anhang für eine Störungsmeldung beim Internetanbieter.", + "reportPreviewAlt": "Erste PDF-Seite des Latenzberichts mit Zusammenfassung, Messanzeige, Statistik, Diagramm und Schwellenwerten", + "reportPreviewCaption": "Die erste Seite enthält Zusammenfassung, Messanzeige, Hauptstatistik, Latenzverlauf und Schwellenwerte. Ab Seite 2 folgen die Messwerttabelle und die Methodik.", + "downloadLabel": "Beispiel-Latenzbericht herunterladen (PDF)", + "sectionsIntro": "Der Bericht umfasst sechs Abschnitte:", + "sections": [ + "Zusammenfassung — Messanzeige von 0 bis über 300 ms mit grünen, gelben und roten Zonen; Status Ausgezeichnet / Gut / Mittelmäßig / Schlecht; Ziel, Modus, Messwertanzahl und Paketverlustübersicht.", + "Latenzstatistik — vier Anzeigen für aktuellen Wert, Minimum, Mittelwert und Maximum sowie Messwertanzahl, mittleren Paketverlust und Testzeitraum.", + "Latenzdiagramm — Flächendiagramm der Messwerte im Testzeitraum mit Minimum, Mittelwert und Maximum an der vertikalen Achse.", + "Leistungsschwellen — die oben beschriebene vierstufige Skala mit einem Farbpunkt je Stufe.", + "Detaillierte Ergebnisse — nummerierte Tabelle mit Zeitstempel, Latenz, Paketverlust und Status jeder Messung. Zeigt kurze Spitzen, die Mittelwerte verbergen können.", + "Methodik — ICMP Echo Request, drei aufeinanderfolgende Pings je Messwert, Zielname und IP sowie abschließende Bewertung anhand des Status." + ], + "useCaseTitle": "Anwendungsfall: Support beim Internetanbieter", + "useCaseBody": "Führen Sie bei langsamer Verbindung den zweiminütigen Cloudflare-Test aus, verlängern Sie die Aufzeichnung mit Erneut testen und wählen Sie Bericht. Das PDF enthält alle Messwerte und die Methodik. Sie können es mit den Störungszeiten an eine Supportanfrage anhängen; der Anbieter bestimmt die erforderlichen Nachweise." + }, + "excluding": { + "heading": "Schnittstellen von der Überwachung ausschließen", + "body1": "Schnittstellen lassen sich von der Überwachung ausschließen, etwa absichtlich deaktivierte Bridges, Testschnittstellen oder entfernte Netzwerkkarten mit verbliebener Konfiguration. Die Einstellung liegt in excluded_interfaces: Health Monitor erzeugt dafür weder Warnungen noch Benachrichtigungen und berücksichtigt sie nicht im Gesamtstatus.", + "body2": "Wählen Sie im Kontextmenü Von Überwachung ausschließen. Die Schnittstelle bleibt mit lila Kennzeichnung ausgeschlossen sichtbar. Im selben Menü lässt sich die Überwachung wieder aktivieren." + }, + "dataCollected": { + "heading": "Wie die Daten gesammelt werden", + "headerSection": "Abschnitt des Reiters", + "headerEndpoint": "Endpunkt", + "headerSource": "Quelle", + "rows": [ + { + "section": "Schnittstelleninventar", + "endpoint": "/api/network", + "source": "ip -j addr + ip -j link und Abfragen zu Bonds und Bridges." + }, + { + "section": "Übersichtskarten", + "endpoint": "/api/network/summary", + "source": "Zusammenfassung des Inventars und Anzahl aktiver und inaktiver Schnittstellen." + }, + { + "section": "RX/TX-Verlauf je Schnittstelle", + "endpoint": "/api/network//metrics", + "source": "Aktuelle Zähler verwenden /proc/net/dev; der Diagrammverlauf stammt über pvesh aus Proxmox-RRD. VM/LXC-Schnittstellen nutzen Gastdaten, physische Schnittstellen und Bridges die Daten des Knotens." + }, + { + "section": "Latenz: aktuell", + "endpoint": "/api/network/latency/current", + "source": "Kurze Folge von ping-Anfragen an das konfigurierte Gateway oder Ziel." + }, + { + "section": "Latenz: historisch", + "endpoint": "/api/network/latency/history", + "source": "Messwerte werden etwa alle 60 Sekunden vom Hintergrundsammler für Temperatur und Latenz gespeichert." + } + ], + "codeComment1": "# Den im Dashboard angezeigten Schnittstellenstatus prüfen", + "codeComment2": "# Eine aktuelle Latenzmessung über die gesamte Verbindung prüfen" + }, + "whereNext": { + "heading": "Wohin als nächstes", + "items": [ + { + "label": "Gesundheitsmonitor", + "href": "/docs/monitor/health-monitor", + "tail": " — Netzwerkkategorie und Schwellenwerte des Latenzverlaufs." + }, + { + "label": "API-Referenz", + "href": "/docs/monitor/api", + "tail": " — Netzwerk- und Latenz-Endpunkte." + }, + { + "label": "Integrationen", + "href": "/docs/monitor/integrations", + "tail": " — die Prometheus-Abfrage liefert dieselben Netzwerkmetriken." + }, + { + "label": "Dashboard-Index", + "href": "/docs/monitor/dashboard", + "tail": "Die anderen Tabs." + }, + { + "label": "ProxMenux → Netzwerk", + "href": "/docs/network", + "tail": "— die Aktionsseite: Brückenanalyse, persistente Schnittstellennamen, Backup & Neustart, iperf3." + } + ] + } +} diff --git a/web/messages/de/docs/monitor/dashboard/security.json b/web/messages/de/docs/monitor/dashboard/security.json new file mode 100644 index 00000000..9a626db3 --- /dev/null +++ b/web/messages/de/docs/monitor/dashboard/security.json @@ -0,0 +1,246 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Dashboard: Registerkarte Sicherheit | ProxMenux-Dokumentation", + "description": "Die Registerkarte Sicherheit bündelt die Schutzfunktionen in zwei Spalten: ProxMenux Monitor (Authentifizierung, SSL/HTTPS, API-Tokens, Secure Gateway) und Proxmox VE (Firewall, Fail2Ban, Lynis-Audit). Mit Anleitungen zum Secure-Gateway-Assistenten, zum Lynis-Audit sowie zur Installation und Regelkonfiguration von Fail2Ban." + }, + "header": { + "title": "Dashboard: Sicherheits-Tab", + "description": "Die Sicherheitsfunktionen im Dashboard sind in zwei Bereiche gegliedert: Einstellungen für Monitor selbst (Authentifizierung, SSL, Tokens, Secure Gateway) und für den überwachten Proxmox-Host (Firewall, Fail2Ban, Lynis).", + "section": "ProxMenux Monitor · Übersicht" + }, + "intro": { + "title": "Zwei Bereiche, ein Tab", + "body": "Die Registerkarte Sicherheit hat zwei Bereiche: ProxMenux Monitor (Dashboard-Einstellungen) und Proxmox VE (Host-Einstellungen). Die Karten für Fail2Ban und Lynis bieten bei fehlenden Werkzeugen deren Installation an und zeigen nach der Installation die Bedienelemente." + }, + "monitor": { + "heading": "ProxMenux Monitor", + "intro": "Vier Karten steuern den Zugriff auf das Dashboard und die Authentifizierung." + }, + "auth": { + "heading": "Authentifizierung", + "imageAlt": "Authentifizierungskarte mit Status Aktiviert, Abmelden, Passwort ändern, Informationen zur Zwei-Faktor-Authentifizierung und Schaltflächen zum Aktivieren von 2FA und Deaktivieren der Authentifizierung", + "imageCaption": "Karte bei aktivierter Authentifizierung: Statusanzeige, Passwort ändern, 2FA aktivieren und die destruktive Aktion Authentifizierung deaktivieren.", + "intro": "Die Karte verwaltet die Anmeldung am Dashboard. Ersteinrichtung, Passwortrichtlinie, TOTP-Einrichtung und Wiederherstellung bei verlorenem Authenticator sind unter Zugriff und Authentifizierung beschrieben. Diese Karte bietet die Einstellungen für den täglichen Gebrauch:", + "items": [ + "Authentifizierungsstatus — Anzeige mit Aktiviert / Deaktiviert / Abgelehnt.", + "Passwort ändern — aktuelles Passwort + neues Passwort + Bestätigung.", + "Zwei-Faktor-Authentifizierung aktivieren / deaktivieren — öffnet beim Aktivieren den Einrichtungsdialog mit QR-Code und fragt beim Deaktivieren nach dem aktuellen Passwort.", + "Authentifizierung deaktivieren — destruktive Aktion, die beim nächsten Besuch erneut den Einrichtungsdialog Dashboard schützen? anzeigt." + ] + }, + "ssl": { + "heading": "SSL / HTTPS", + "imageAlt": "SSL/HTTPS-Karte mit Status HTTP ohne SSL, erkanntem Proxmox-Hostzertifikat samt Zertifikatsinhaber, Aussteller und Ablaufdatum sowie Optionen für das Proxmox-Zertifikat oder ein eigenes Zertifikat", + "imageCaption": "SSL/HTTPS-Karte bei deaktiviertem HTTPS. Monitor erkennt das Zertifikat auf dem Proxmox-Host und bietet dessen Verwendung mit einem Klick an. Für eigene Dateien an anderer Stelle gibt es Eigenes Zertifikat verwenden.", + "intro": "Stellt das Dashboard über HTTPS ohne vorgeschalteten Reverse-Proxy bereit. Die Karte erkennt das von Proxmox verwendete Zertifikat unter /etc/pve/local/ und zeigt Zertifikatsinhaber, Aussteller und Ablaufdatum zur Prüfung vor der Aktivierung. HTTPS lässt sich auf zwei Wegen aktivieren:", + "items": [ + "Proxmox-Zertifikat verwenden — Monitor übernimmt das Hostzertifikat mit einem Klick. Geeignet, wenn PVE und Dashboard denselben DNS-Namen verwenden.", + "Eigenes Zertifikat verwenden — absolute Pfade zum .pem-Zertifikat und privaten .key-Schlüssel einfügen. Sie werden vor dem Dienstneustart geprüft. Scheitert das Laden, wechselt das Dashboard automatisch zurück zu HTTP und bleibt erreichbar." + ], + "enabledAlt": "SSL/HTTPS-Karte mit aktiviertem HTTPS, aktivem Zertifikat samt Pfaden zu pve-ssl.pem und pve-ssl.key sowie Schaltfläche HTTPS deaktivieren", + "enabledCaption": "HTTPS aktiv — die Karte zeigt das verwendete Zertifikat, die Dateipfade und die Aktion HTTPS deaktivieren, die auf HTTP am selben Port zurückschaltet.", + "acmeTitle": "ACME / Let's Encrypt über Proxmox", + "acmeBody": "Wenn Let’s Encrypt auf Ihrem Proxmox-Knoten unter Datacenter → Certificates → ACME eingerichtet ist, verwendet das Dashboard mit Proxmox-Zertifikat verwenden dasselbe Zertifikat, das der Host den Browsern bereitstellt. Eine eigene ACME-Einrichtung für Monitor ist nicht nötig.", + "walkthroughLink": "Die Anleitung HTTPS für ProxMenux Monitor beschreibt die automatische Erkennung des ACME-Zertifikats, die auf dem Datenträger gespeicherten Daten und die Verwendung eines eigenen .pem / .key-Paars." + }, + "apiTokens": { + "heading": "API-Zugriffstokens", + "emptyAlt": "Leere Karte für API-Zugriffstokens mit Informationen zu API-Tokens und Schaltfläche Neues API-Token erzeugen", + "emptyCaption": "API-Token-Karte nach einer Neuinstallation. Das Feld Informationen zu API-Tokens erklärt Gültigkeitsdauer, Verwendung und Einbindung in Authorization: Bearer-Header.", + "intro": "Tokens mit einem Jahr Gültigkeit für automatisierte Integrationen: Homepage-Widgets, REST-Sensoren für Home Assistant, Grafana-Datensammler, n8n-Abläufe und eigene Skripte. Die Karte führt durch drei Zustände: leer → Formular → erzeugt.", + "generateBody": "Token erzeugen. Klicken Sie auf Neues API-Token erzeugen. Geben Sie einen aussagekräftigen Tokennamen zur späteren Identifizierung und Ihr Passwort zur zusätzlichen Bestätigung ein. Bei aktiviertem 2FA wird auch der aktuelle TOTP-Code verlangt.", + "generateAlt": "Formular zum Erzeugen eines API-Tokens mit Feldern für Tokenname und Passwort sowie Schaltflächen Token erzeugen und Abbrechen", + "generateCaption": "Formular zum Erzeugen eines API-Tokens: Namen eingeben und mit Passwort sowie bei aktivem 2FA mit TOTP-Code bestätigen.", + "saveBody": "Speichern Sie das Token sofort. Der vollständige Tokenwert wird nach dem Erzeugen nur einmal angezeigt. Die Karte weist mit einem orangefarbenen Hinweis und einer Kopierschaltfläche darauf hin. Später lässt sich der Wert nicht abrufen; die Liste aktiver Tokens zeigt nur das Präfix.", + "generatedAlt": "Erzeugtes API-Token mit maskiertem Wert, Kopierschaltfläche, Anleitung für den Header Authorization: Bearer und Liste aktiver Tokens samt Präfix", + "generatedCaption": "Token erzeugt: Der Wert erscheint einmal mit Kopierschaltfläche und dem genauen Muster Authorization: Bearer. Darunter zeigt die Liste aktiver Tokens Name, Präfix und Erstellungsdatum, damit Sie einzelne Tokens widerrufen können.", + "outro": "Jedes aktive Token hat eine Schaltfläche Widerrufen. Ein Widerruf macht das Token sofort ungültig; Integrationen mit diesem Token funktionieren dann nicht mehr. Anleitungen für Homepage, Home Assistant, n8n und Prometheus finden Sie unter Integrationen." + }, + "gateway": { + "heading": "Secure Gateway", + "cardAlt": "Secure-Gateway-Karte vor der ersten Bereitstellung mit der Schaltfläche Secure Gateway bereitstellen", + "cardCaption": "Secure-Gateway-Karte nach der Ersteinrichtung: Ein Klick startet den Assistenten.", + "intro": "Greifen Sie von überall in Ihrem Tailscale-Tailnet auf Dashboard, Proxmox-Weboberfläche und Gäste zu, ohne Ports im Internet freizugeben. Monitor stellt auf dem Host einen Alpine-LXC-Container mit tailscaled als Subnetz-Router bereit. Nach der Freigabe in der Tailscale-Administrationskonsole erreichen entfernte Geräte die LAN-IP des Hosts.", + "wizardTitle": "Schritt-für-Schritt-Assistent", + "wizardIntro": "Erzeugen Sie vor dem Klick auf Deploy Secure Gateway einen Authentifizierungsschlüssel in der Tailscale-Konsole. Der Assistent fragt ihn in Schritt 2 ab.", + "step0Title": "0. Tailscale-Authentifizierungsschlüssel erzeugen", + "step0Body": "Melden Sie sich bei login.tailscale.com/admin/settings/keys an und klicken Sie auf Generate auth key…. Wählen Sie einen vorab authentifizierten Schlüssel, damit keine interaktive Tailscale-Anmeldung nötig ist. Kopieren Sie den Wert; er wird nur einmal angezeigt.", + "step0Alt": "Seite Settings → Keys der Tailscale-Administrationskonsole mit hervorgehobener Schaltfläche Generate auth key", + "step0Caption": "Tailscale-Admin-Konsole — Settings → Keys → Auth Key generieren.... Verwenden Sie ein kostenloses Tailscale-Konto, wenn Sie noch keins haben (Link innerhalb des Assistenten).", + "step1Title": "1. Assistenten öffnen", + "step1Body": "Klicken Sie auf der Registerkarte Sicherheit auf Deploy Secure Gateway. Der erste Schritt erläutert Funktionen und Voraussetzungen.", + "step1Alt": "Einführung des Secure-Gateway-Assistenten: VPN-Zugriff ohne Portweiterleitung und mit Ende-zu-Ende-Verschlüsselung", + "step1Caption": "Schritt 1 - Überblick über das, was das Secure Gateway bietet und eine Erinnerung daran, dass Sie ein kostenloses Tailscale-Konto benötigen.", + "step2Title": "2. Tailscale-Authentifizierung", + "step2Body": "Fügen Sie den Authentifizierungsschlüssel aus Schritt 0 ein und wählen Sie einen Hostnamen. Unter diesem Namen erscheint das Gateway in der Tailscale-Konsole, üblicherweise proxmox-gateway oder der Knotenname.", + "step2Alt": "Schritt des Secure-Gateway-Assistenten mit Feldern für Tailscale-Authentifizierungsschlüssel und Gerätehostname sowie Link zum Erzeugen des Schlüssels", + "step2Caption": "Schritt 2: Vorab authentifizierten Schlüssel einfügen und Gerätehostnamen wählen. Falls Sie Schritt 0 übersprungen haben, öffnet der Link unter dem Feld die entsprechende Tailscale-Seite.", + "step3Title": "3. Zugangsbereich", + "step3Intro": "Wählen Sie, was Ihr Tailnet durch das Gateway erreichen kann:", + "step3Items": [ + "Proxmox Only — nur die Proxmox-Benutzeroberfläche und der Monitor. kleinste Angriffsfläche.", + "Full Local Network — das gesamte LAN-Subnetz (automatisch von der primären Schnittstelle des Hosts erkannt). Sie erreichen NAS, Drucker, VMs und jedes andere LAN-Gerät.", + "Eigene Subnetze — bestimmte CIDR-Netze angeben. Für Umgebungen mit mehreren VLANs, in denen nur ausgewählte Segmente erreichbar sein sollen." + ], + "step3Alt": "Schritt Zugriffsbereich des Secure-Gateway-Assistenten mit den Optionen Nur Proxmox, Gesamtes lokales Netzwerk und Eigene Subnetze", + "step3Caption": "Schritt 3: Zugriffsbereich wählen. Gesamtes lokales Netzwerk übernimmt automatisch das erkannte LAN-Subnetz.", + "step4Title": "4. Erweiterte Optionen (optional)", + "step4Intro": "Zwei optionale Schalter, beide standardmäßig deaktiviert:", + "step4Items": [ + "Exit Node — nach Aktivierung und Auswahl auf einem entfernten Gerät wird dessen gesamter Internetverkehr über den WAN-Anschluss des Proxmox-Hosts geleitet. Auf Reisen erscheint der Datenverkehr des Telefons so mit der heimischen Internetverbindung.", + "Routen akzeptieren — dieses Gateway erreicht Netze, die von anderen Subnetz-Routern im Tailnet angekündigt werden, etwa bei mehreren Standorten." + ], + "step4Alt": "Schritt Erweiterte Optionen im Secure-Gateway-Assistenten mit den Kontrollkästchen Exit Node und Accept Routes", + "step4Caption": "Schritt 4: Exit Node und Accept Routes. Lassen Sie beide deaktiviert, wenn Sie nur vom Telefon oder Laptop auf das Dashboard zugreifen möchten.", + "step5Title": "5. Prüfen und bereitstellen", + "step5Body": "Letzte Zusammenfassung vor der Bereitstellung. Der Assistent erinnert an einen anschließenden manuellen Schritt in der Tailscale-Konsole: die Subnetzroute genehmigen.", + "step5Alt": "Schritt Prüfen und bereitstellen im Secure-Gateway-Assistenten mit Zusammenfassung von Hostname, Zugriffsmodus, Netzen, Exit Node und Accept Routes sowie Schaltfläche Gateway bereitstellen", + "step5Caption": "Schritt 5 — Überprüfen Sie die Konfiguration und Bereitstellung. Der blaue Hinweis unten markiert die ausstehende Routengenehmigung.", + "approvalTitle": "Ein letzter manueller Schritt im Tailscale-Admin", + "approvalBody": "Öffnen Sie nach der Bereitstellung login.tailscale.com/admin/machines und genehmigen Sie die vom Gateway angekündigte Subnetzroute. Erst dann können entfernte Geräte im Tailnet über das Gateway auf LAN-IPs zugreifen. Tailscale markiert ausstehende Routen mit einer gelben Warnung in der Gerätezeile. Klicken Sie auf Edit route settings und aktivieren Sie die Route." + }, + "pve": { + "heading": "Proxmox VE", + "intro": "Die Schutzfunktionen des Hosts: Firewall, Angriffserkennung und Sicherheitsprüfung. Die Karten für Fail2Ban und Lynis bieten bei Bedarf die Installation an und zeigen danach die Verwaltungsfunktionen." + }, + "firewall": { + "heading": "Proxmox Firewall", + "imageAlt": "Proxmox-Firewall-Karte mit Cluster- und Hoststatus, Schnellzugriffsregeln für Monitor und die Proxmox-Weboberfläche, Zählern, Regelliste und Schaltfläche Regel hinzufügen", + "imageCaption": "Proxmox-Firewall-Karte: Schalter für Cluster und Host, häufige Ports unter Schnellzugriffsregeln, Zähler unter Regelübersicht und vollständige Liste mit + Regel hinzufügen.", + "intro": "Die Karte verwaltet die Firewall-Konfiguration von Proxmox VE. Das klassische Backend verwendet iptables, das alternative nftables. Beliebige außerhalb von Proxmox erstellte Regeln werden nicht verwaltet. Drei Bereiche:", + "items": [ + "Cluster-Firewall + Host-Firewall — globale Schalter. Die Cluster-Firewall muss aktiv sein, damit die Hostregeln greifen. Die Karte zeigt diese Abhängigkeit direkt an der Einstellung.", + "Schnellzugriffsregeln — vorbereitete Zeilen für 8008/TCP (Monitor) und 8006/TCP (Proxmox-Weboberfläche) mit Status erlaubt, gesperrt oder ungeschützt. Die Proxmox-Oberfläche wird über ein integriertes Firewall-Makro erlaubt, das sich nicht versehentlich löschen lässt.", + "Regelübersicht — Zähler für alle Regeln, accept-Regeln, drop/reject-Regeln und verschiedene geschützte Ports. Die Werte stammen aus /etc/pve/firewall/cluster.fw und /etc/pve/nodes/<node>/host.fw.", + "Firewall-Regeln — Liste mit Aktion, Protokoll, Port, Quelle und Ebene. + Regel hinzufügen öffnet den Editor in der Karte, das Papierkorbsymbol löscht die jeweilige Regel. Änderungen werden in den Proxmox-Dateien gespeichert und erscheinen auch in dessen Oberfläche (Datacenter / Node → Firewall)." + ] + }, + "fail2ban": { + "heading": "Fail2Ban", + "subHeading": "(abhängig vom Status)", + "whatIs": "Was ist das? Fail2Ban ist ein quelloffener Dienst, der wiederholte fehlgeschlagene Anmeldungen in Protokollen erkennt und die IP-Adresse per Firewall sperrt. Er schützt SSH und Webanmeldungen vor fortlaufenden Brute-Force-Angriffen. ProxMenux richtet drei Jails ein: SSH, Proxmox-Webanmeldung (Port 8006) und ProxMenux-Monitor-Anmeldung (Port 8008).", + "notBundled": "Fail2Ban ist nicht im Lieferumfang enthalten. Die Karte passt sich daran an, ob es installiert ist: Fehlt es, lässt es sich mit einem Klick installieren. Danach zeigt sie den aktuellen Jail-Status und gesperrte IP-Adressen und ermöglicht es, die Anzahl der Versuche sowie die Sperrdauer pro Jail anzupassen.", + "notInstalledAlt": "Fail2Ban-Karte im Zustand Nicht installiert mit Beschreibung des Schutzes für SSH, Proxmox-Weboberfläche und Monitor über nftables sowie Schaltfläche Fail2Ban installieren und konfigurieren", + "notInstalledCaption": "Fail2Ban-Karte vor der Installation - die blaue Box zeigt an, was die Installation konfigurieren würde.", + "clickBody": "Klicken Sie auf Fail2Ban installieren und konfigurieren. Ein Bestätigungsdialog listet alle Änderungen auf, die das Skript am Host vornehmen wird:", + "confirmAlt": "Fail2Ban-Bestätigung mit aggressivem SSH-Modus, Schutz für Proxmox auf Port 8006 und Monitor auf Port 8008, nftables-Erkennung, journald-Protokollanpassung und SSH-Härtung über MaxAuthTries", + "confirmCaption": "Installationsbestätigung: Jail-Liste, angepasste journald-Protokollstufe zum Lesen von SSH-Ereignissen und zusätzliche SSH-Härtung (MaxAuthTries=3).", + "confirmIntro": "Nach der Bestätigung zeigt ein Panel die Installation live an: apt, Jail-Konfiguration und Prüfungen. Es verwendet denselben Mechanismus wie der ProxMenux-CLI-Installer.", + "progressAlt": "Panel mit Fail2Ban-Installationsprotokoll: Paket, journald MaxLevelStore für Anmeldungen, Jails, nftables-Erkennung, MaxAuthTries-Härtung, Kommunikationstest mit fail2ban-client und Abschlussmeldung", + "progressCaption": "Installation läuft: Jeder Schritt wird im Panel protokolliert. Connection closed am Ende kennzeichnet das Ende der Übertragung.", + "afterInstall": "Nach der Installation zeigt die Karte den aktuellen Status: konfigurierte Jails, gesperrte IPs und jüngste Sperrereignisse. Die Registerkarten trennen Jails und gesperrte IPs von Letzte Aktivitäten mit den letzten N Fail2Ban-Protokolleinträgen.", + "activeAlt": "Aktive Fail2Ban-Karte mit drei Jails (proxmenux, proxmox, sshd), Zählern für gesperrte IPs, alle Sperren und fehlgeschlagene Versuche sowie Zeilen mit Versuchen, Sperrdauer, Zeitraum und Zahnradsymbol", + "activeCaption": "Fail2Ban aktiv: die drei Standard-Jails (proxmenux, proxmox, sshd) mit Einstellungen für Versuche, Sperrdauer und Erkennungszeitraum.", + "tuneBody": "Jail-Regeln anpassen. Über das Zahnradsymbol ändern Sie Max Retries, Ban Time und Find Time, den gleitenden Zeitraum zum Zählen der Versuche. Eine dauerhafte Sperre bleibt bis zur manuellen Aufhebung bestehen. Das Formular erklärt übliche Werte.", + "configAlt": "Konfigurationsformular für das Jail sshd mit Max Retries, Ban Time in Sekunden, Permanent Ban, Find Time, Hinweisen zu üblichen Werten und Schaltfläche Konfiguration speichern", + "configCaption": "Jail sshd bearbeiten: Wählen Sie einen niedrigeren Wert für Max Retries, wenn SSH nur aus Ihrem Subnetz genutzt wird, oder verlängern Sie Ban Time für ein öffentlich erreichbares Dashboard.", + "outro": "Die Anleitung Installation, Konfiguration und Deinstallation behandelt auch die manuelle Installation, die Änderung von SSH MaxAuthTries und das Protokoll proxmenux-auth.log. Sie finden sie unter ProxMenux → Sicherheit → Fail2Ban.", + "calloutTitle": "Ohne Fail2Ban sperrt dieser Mechanismus keine IPs", + "calloutBody": "ProxMenux Monitor prüft die von Fail2Ban gesperrten IPs auf Anwendungsebene, bevor Flask-Anfragen verarbeitet werden. Es fragt fail2ban-client ab und speichert das Ergebnis 30 Sekunden zwischen; eine SQL-Sperrtabelle wird nicht gelesen. Ohne Fail2Ban werden fehlgeschlagene Anmeldungen in proxmenux-auth.log protokolliert, dieser Mechanismus sperrt dann aber keine IPs." + }, + "lynis": { + "heading": "Lynis-Sicherheitsprüfung", + "subHeading": "(abhängig vom Status)", + "whatIs": "Was ist das? Lynis ist ein quelloffenes Sicherheitsprüfwerkzeug mit rund 280 Hostprüfungen, etwa zu Dateirechten, Kernel-Härtung, SSH, Paketschwachstellen, Kryptografie, geplanten Aufgaben und Dienstkennungen. Es liefert einen Härtungsindex von 0 bis 100, Warnungen und Vorschläge. Es dient als verbreitete Ausgangsbasis zur Bewertung von Debian-Servern.", + "whyUseful": "Warum ist es nützlich? Die Sicherheit anhand einzelner Konfigurationsdateien zu bewerten ist schwierig. Lynis erkennt häufig übersehene Punkte: fehlende Kernel-Schutzoptionen, schwache SSH-Verfahren, nicht dauerhafte Protokolle oder NOPASSWD in sudoers für Standardkonten. Ein erneuter Lauf nach ProxMenux-Anpassungen macht die Veränderung als Punktwert vergleichbar.", + "notInstalledAlt": "Lynis-Karte im Zustand Nicht installiert mit Schaltfläche Lynis installieren und Funktionen: Härtungsindex, Schwachstellenerkennung, Konformitätsprüfung und GitHub-Quellcode", + "notInstalledCaption": "Lynis-Karte vor der Installation - die blaue Box fasst zusammen, was das Tool tut.", + "notBundled": "Lynis ist ebenfalls nicht enthalten. ProxMenux installiert es direkt aus dem offiziellen GitHub-Quellcode statt aus dem Debian-Paket.", + "confirmAlt": "Bestätigungsdialog für Lynis mit seinen Funktionen: Härtungsindex, Schwachstellenerkennung, Konfigurationsanalyse, Konformitätsprüfung und Bezug aus dem offiziellen GitHub-Repository", + "confirmCaption": "Installationsbestätigung mit ausdrücklichem Hinweis auf die GitHub-Quelle.", + "progressAlt": "Live-Installationspanel für Lynis mit Installation der aktuellen Version, Bestätigung von Version 3.1.6 und Abschlussmeldung", + "progressCaption": "Installation läuft: Das Panel zeigt den Verlauf wie bei Fail2Ban live an.", + "afterInstall": "Nach der Installation zeigt die Karte die Version und einen leeren Prüfverlauf. Klicken Sie auf Sicherheitsprüfung starten, um den ersten Scan auszuführen.", + "installedAlt": "Lynis-Karte nach der Installation mit Versionsanzeige 3.1.6, Zeitpunkt der letzten Prüfung, Härtungsindex 0, Warnungen 0, Vorschläge 0, leerem Bericht und Schaltfläche Sicherheitsprüfung starten", + "installedCaption": "Lynis ist installiert, es gibt noch keine Prüfung. Die Kennzahlen zeigen zunächst null.", + "runningAlt": "Lynis-Karte während der Prüfung mit Fortschrittsmeldung, geschätzter Dauer von 2 bis 5 Minuten und deaktivierter Schaltfläche Prüfung läuft", + "runningCaption": "Prüfung läuft: Die Schaltfläche zeigt eine Ladeanimation und die Karte weist auf eine Dauer von 2 bis 5 Minuten hin.", + "finishedBody": "Nach Abschluss zeigt die Karte die Ergebnisse: Härtungsindex, Warnungen, Vorschläge und die Liste Prüfberichte mit früheren Scans.", + "resultsAlt": "Lynis-Karte mit Index 71, Aufschlüsselung Lynis 66 und PVE 71, 3 Warnungen, 40 Vorschlägen, für Proxmox angepasstem Wert 71 von 100 im Bereich Gut, Berichten mit PDF-Download und Schaltfläche Sicherheitsprüfung starten", + "resultsCaption": "Beispielergebnis: Härtungsindex 71/100 (Gut). Die Karte zeigt den Lynis-Rohwert (66) und den für Proxmox angepassten Wert (71). Die Anpassung hängt vom Rohwert und vom Anteil der als erwartetes Proxmox-VE-Verhalten eingestuften Befunde ab; es werden keine festen 11 Punkte addiert.", + "scoreTitle": "Lynis-Rohwert und an Proxmox angepasster Wert", + "scoreIntro": "Lynis-Regeln sind auf allgemeine Debian-Systeme ausgelegt. Proxmox weicht aus berechtigten Gründen teilweise davon ab, etwa durch Cluster-Dienste als root oder eigene journald-Einstellungen. Die Karte zeigt beide Werte, damit Sie:", + "scoreItems": [ + "Ihren Lynis-Rohwert wie externe Prüfer verfolgen.", + "Den für Proxmox angepassten Wert verfolgen, eine passendere Vergleichsbasis für Knoten desselben Clusters." + ], + "reportBody": "Vollständiger Bericht. Die Schaltfläche PDF jeder Prüfung lädt einen mehrseitigen Bericht herunter: Zusammenfassung, Systeminformationen, Sicherheitslage, erläuterte Warnungen, nach Auswirkung geordnete Vorschläge und Paketinventar. Er eignet sich als Anhang für eine Sicherheitsprüfung.", + "reportAlt": "Beispiel der ersten PDF-Berichtsseite mit Zusammenfassung, Index 71 von 100, Anzahl der Warnungen und Vorschläge, Hostname, Kernel, Lynis-Version, Datum und Übersicht der Sicherheitslage", + "reportCaption": "Erste Seite des Berichts mit Zusammenfassung, Systeminformationen und Sicherheitslage. Es folgen ausführliche Warnungen, Vorschläge und die Liste installierter Pakete. Ein Beispiel-PDF ist als Referenz beigefügt.", + "runPeriodically": "Führen Sie das Audit regelmäßig durch (nach größeren Proxmox-Upgrades, nach der Anwendung von Nachinstallationsoptimierungen, bevor Sie einen Fernzugriffspfad öffnen) und bewahren Sie die Berichte auf - der Trend ist wichtiger als jede einzelne Zahl.", + "outro": "Die Anleitung zu Installation, Konfiguration und Deinstallation sowie die Erläuterung eines Beispielberichts finden Sie unter ProxMenux → Sicherheit → Lynis." + }, + "dataCollected": { + "heading": "Wie die Daten gesammelt werden", + "headerCard": "Karte", + "headerEndpoint": "Endpunkt", + "headerSource": "Quelle", + "rows": [ + { + "card": "Authentifizierung, 2FA, Passwortänderung", + "endpoint": "/api/auth/*", + "source": "Lokale Authentifizierungskonfiguration in ~/.config/proxmenux-monitor/auth.json; JWTs werden von Monitor ausgestellt." + }, + { + "card": "SSL / HTTPS", + "endpoint": "/api/auth/ssl/*", + "source": "openssl x509 auf /etc/pve/local/pve-ssl.pem + /etc/proxmenux/ssl_config.json." + }, + { + "card": "API-Tokens auflisten, erzeugen und widerrufen", + "endpoint": "/api/auth/api-tokens", + "source": "Token-Zeilen lokal gehalten; nichts verlässt den Host." + }, + { + "card": "Secure Gateway (Bereitstellung + Status)", + "endpoint": "/api/oci/*", + "source": "Erstellt einen Alpine-LXC-Container mit tailscaled über pct create / pct exec." + }, + { + "card": "Firewall Status & Regeln", + "endpoint": "/api/security/firewall/*", + "source": "pve-firewall + /etc/pve/firewall/<cluster|host>.fw." + }, + { + "card": "Fail2Ban (nur wenn installiert)", + "endpoint": "/api/security/fail2ban/*", + "source": "fail2ban-client status, /var/log/fail2ban.log, /etc/fail2ban/jail.local." + }, + { + "card": "Lynis Audit (nur wenn installiert)", + "endpoint": "/api/security/lynis/*", + "source": "Führt lynis audit system im Hintergrund aus und liest den Bericht aus /var/log/lynis-report.dat." + } + ] + }, + "whereNext": { + "heading": "Wohin als nächstes", + "items": [ + { + "label": "Zugriff und Authentifizierung", + "href": "/docs/monitor/access-auth", + "tail": " — vollständige Ersteinrichtung, Auswahl einer 2FA-App, Wiederherstellung bei verlorenem Authenticator und Reverse-Proxy-Beispiele." + }, + { + "label": "Integrationen", + "href": "/docs/monitor/integrations", + "tail": " — Anleitungen für API-Tokens mit Homepage, Home Assistant, Prometheus und n8n sowie die vollständige Secure-Gateway-Einrichtung." + }, + { + "label": "API-Referenz", + "href": "/docs/monitor/api", + "tailRich": " — alle Endpunkte unter /api/auth, /api/security und /api/oci mit Methode, Anfrageinhalt und curl-Beispielen." + }, + { + "label": "ProxMenux → Sicherheit → Fail2Ban", + "href": "/docs/security/fail2ban", + "tail": " — Installationsanleitung, eingerichtete Jails und manuelle Installation." + }, + { + "label": "ProxMenux → Sicherheit → Lynis", + "href": "/docs/security/lynis", + "tail": " — Beispielbericht, Einordnung des Ergebnisses und Zeitpunkt für eine erneute Prüfung." + } + ] + } +} diff --git a/web/messages/de/docs/monitor/dashboard/settings.json b/web/messages/de/docs/monitor/dashboard/settings.json new file mode 100644 index 00000000..77cefc51 --- /dev/null +++ b/web/messages/de/docs/monitor/dashboard/settings.json @@ -0,0 +1,367 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Dashboard: Registerkarte Einstellungen | ProxMenux-Dokumentation", + "description": "Die Registerkarte Einstellungen verwaltet Sprache, Navigationsreihenfolge, Dashboard-Präferenzen, Überwachungsschwellen und Ausschlüsse, Benachrichtigungen, KI und das Inventar der Nachinstallationsoptimierungen." + }, + "header": { + "title": "Dashboard: Tab Einstellungen", + "description": "Monitor-Sprache, Navigationsreihenfolge, Dashboard-Präferenzen, Überwachungsausschlüsse, Benachrichtigungen, KI-Konfiguration und aktuelles ProxMenux-Optimierungsinventar.", + "section": "ProxMenux Monitor · Übersicht" + }, + "intro": { + "title": "Wo jede Einstellung gespeichert wird", + "body": "Einstellungen bündelt Dashboard-Darstellung, Health-Monitor-Überwachung, Alarmversand und bereits von ProxMenux vorgenommene Hoständerungen. Karten mit ausführlicher Dokumentation verlinken darauf; hier finden Sie den Einstieg." + }, + "interfaceLanguage": { + "heading": "Schnittstellensprache", + "intro": "Wählen Sie die Sprache der Weboberfläche des Monitors. Die Änderung gilt sofort, ohne Dienstneustart und ohne die Sprache der ProxMenux-Shellmenüs zu ändern.", + "items": [ + "ProxMenux Monitor bietet derzeit Englisch, Deutsch, Spanisch, Französisch, Italienisch, Portugiesisch, Slowakisch und Schwedisch an.", + "Beim ersten Besuch wird die Browsersprache verwendet, sofern unterstützt; andernfalls Englisch.", + "Die Auswahl ändert die Seitensprache und synchronisiert weitere offene Registerkarten desselben Browserprofils.", + "Fehlt eine Übersetzung, erscheint nur dieser Text auf Englisch statt als fehlerhafter Schlüssel oder Platzhalter." + ], + "scopeTitle": "Lokale Browsereinstellung", + "scopeBody": "Die Auswahl liegt in localStorage unter proxmenux-ui-language. Sie gilt für das aktuelle Browserprofil und Gerät, nicht für den ganzen Knoten. Jeder Benutzer kann seine Sprache wählen." + }, + "navigationOrder": { + "heading": "Navigationsreihenfolge", + "intro": "Ordnen Sie die sieben Haupteinträge: Übersicht, Apps, VMs & LXCs, Knoten, Sicherung, Terminal und Verwaltung. Klicken Sie auf Bearbeiten, ziehen Sie die Zeilen und speichern Sie.", + "items": [ + "Mit der Maus beginnt das Ziehen beim Drücken. Auf Touchscreens ist ein 250-ms-Langdruck nötig, um es vom Scrollen zu unterscheiden.", + "Die Gruppen Knoten und Verwaltung werden als Ganzes verschoben; ihre Unterseiten behalten die festgelegte Reihenfolge.", + "Das Mobilmenü verwendet dieselbe gespeicherte Reihenfolge.", + "Standard wiederherstellen setzt den bearbeiteten Reihenfolgeentwurf zurück. Speichern übernimmt die Änderung.", + "Neue Hauptregisterkarten künftiger Versionen werden an die eigene Reihenfolge angehängt; Ihre Anordnung bleibt erhalten." + ], + "landingTitle": "Der erste Eintrag ist die Startansicht", + "landingBody": "Monitor öffnet den ersten gespeicherten Eintrag. Bei Knoten ist das Speicher, bei Verwaltung Systemprotokolle. Die Reihenfolge liegt in diesem Browser unter proxmenux-nav-order; jedes Gerät kann eine eigene Anordnung verwenden." + }, + "networkUnits": { + "heading": "Netzwerkeinheiten", + "imageAlt": "Karte Netzwerkeinheiten mit der Anzeigeauswahl Bytes", + "imageCaption": "Wählen Sie zwischen Bits pro Sekunde und Bytes pro Sekunde für jede im Dashboard angezeigte Netzwerkrate.", + "body": "Zeigt den Netzwerkdurchsatz in Bits pro Sekunde (Mbps/Gbps) oder Bytes pro Sekunde (MB/s/GB/s). Standard sind Bits wie bei Netzwerkkarten und Internetanbietern; Dateiübertragungen verwenden oft Bytes. Diagramme, Labels und Hinweise ändern sich sofort ohne Neuladen." + }, + "health": { + "heading": "Gesundheitsmonitor", + "intro": "Die Karte legt die Unterdrückungsdauer fest: wie lange die Prüfung wartet, bevor eine verworfene Warnung erneut erscheinen darf. CPU, Speicher, Datenspeicher, Laufwerke, Netzwerk, VMs, PVE-Dienste, Protokolle, Updates und Sicherheit haben jeweils eine Auswahl:", + "items": [ + "24 h — Standard für die meisten transienten Kategorien.", + "72 h — für Ereignisse, die Sie einige Tage stummschalten möchten.", + "168 h (1 Woche) und 720 h (1 Monat) — regelmäßige Kontrollen.", + "8760 h (1 Jahr) — Unterdrückung für einen langen Zeitraum.", + "-1 — permanente Stille, bis Sie es manuell wieder aktivieren.", + "Eigene Stundenanzahl — eine ganze Zahl für einen Zwischenwert." + ], + "imageAlt": "Einstellungen, Health-Monitor-Karte mit Dauer je Kategorie und aktiven Unterdrückungen", + "imageCaption": "Die Auswahllisten bestimmen die Dauer künftiger Unterdrückungen. Der Bereich darunter zeigt stummgeschaltete Warnungen und ermöglicht ihre Reaktivierung.", + "editTitle": "Bearbeitungsmodus", + "editBody": "Die Karte ist zunächst schreibgeschützt. Bearbeiten oben rechts aktiviert Auswahllisten und Reaktivierungsschaltflächen. Speichern übernimmt geänderte Dauern und vorgemerkte Reaktivierungen gemeinsam; Abbrechen verwirft sie. Speichern wird erst bei Änderungen aktiv.", + "activeTitle": "Aktive Unterdrückungen", + "activeIntro": "Unter den Dauerangaben listet Aktive Unterdrückungen zeitlich begrenzte —24 Stunden, 7 Tage oder eigener Zeitraum— und dauerhafte Unterdrückungen auf. Jede Zeile zeigt:", + "activeItems": [ + "Ein farbiges Abzeichen: Dauerhaft in Orange oder eine Restzeit wie noch 24 h / noch 7 Tage in Blau.", + "Die Warnungskennung in lesbarer Form (z. B. pve_storage_full_PBS-Cloud → PVE-Speicher voll: PBS-Cloud).", + "Kategorie, Schweregrad und Zeitpunkt, zu dem die Warnung verworfen wurde.", + "Eine Schaltfläche Reaktivieren im Bearbeitungsmodus merkt die Aufhebung der Unterdrückung beim Speichern vor." + ], + "activeReenableTitle": "Warnung reaktivieren", + "activeReenableBody": "Reaktivieren markiert die Zeile beim Bearbeiten grün und streicht die Kennung durch; noch ist nichts übernommen. Erneuter Klick bedeutet Rückgängig. Speichern sendet je Reaktivierung parallel POST /api/health/un-acknowledge und entfernt die Zeilen. Besteht das Problem weiter und unterstützt die Kategorie erneute Meldungen, erscheint es beim nächsten Scan wieder unter Aktiv.", + "activePermanentNote": "Dauerhafte Unterdrückungen über Dauerhaft oder den Standardwert -1 werden nur hier aufgehoben. Der allgemeine Dialog bietet dafür keinen Knopf; dieser Bereich vereint Übersicht und Reaktivierung.", + "activeAutoRefreshTitle": "Automatische Aktualisierung", + "activeAutoRefreshBody": "Die Liste aktualisiert sich beim Verwerfen oder Reaktivieren einer Warnung im Health Monitor, bei erneutem Tabfokus und bei Sichtbarkeitswechseln. Ein Neuladen ist nicht nötig.", + "calloutTitle": "Details auf der Health-Monitor-Seite", + "calloutBody": "Eskalation, automatische Auflösung bei verschwundenen Geräten und der Unterschied zwischen Verwerfen und Beheben stehen unter Health Monitor → Warnungen verwerfen und Unterdrückungsdauer. Diese Karte bietet die Auswahllisten und aktiven Unterdrückungen." + }, + "thresholds": { + "heading": "Health-Monitor-Schwellenwerte", + "intro": "Die vorige Karte regelt die Ruhezeit nach einer Unterdrückung; diese bestimmt den Auslösewert einer Warnung. Die meisten Schwellenprüfungen bieten anpassbare Werte für Warnung und Kritisch. Die Tabelle erklärt Ausnahmen wie die kombinierte Swap-Regel und den aktuellen RAM-Detektor.", + "whatForTitle": "Wozu es dient", + "whatForIntro": "Die Standardwerte sind ein Ausgangspunkt, aber jede Umgebung hat eigene Betriebsbedingungen:", + "whatForItems": [ + "Ein Homelab mit einer SSD kann früher bei 75/90 % Belegung warnen, um Platz für Snapshots zu lassen.", + "Speicherschwellen sollten Messwerte und Last des Hosts berücksichtigen. Ceph-Redundanz allein rechtfertigt keine lockereren Warnungen; hohe ZFS-ARC-Nutzung ist nicht mit nicht rückgewinnbarem Arbeitsspeicher gleichzusetzen.", + "Wählen Sie Temperaturschwellen anhand der Laufwerksspezifikationen und tatsächlichen Bedingungen. Passive oder aktive Kühlung allein bestimmt keine allgemein niedrigere oder höhere sichere Grenze.", + "Ein stark virtualisierter Host kann bei Builds CPU-Spitzen erreichen, ohne für jeden 80-%-Peak zu warnen; anhaltende Überlast muss weiter gemeldet werden." + ], + "whatForOutro": "Unterstützte Änderungen gelten bei der nächsten Prüfung. Der Health Monitor liest /usr/local/share/proxmenux/health_thresholds.json in jedem Zyklus ohne Neustart. Einige Anzeigen wie die Datenträgertemperatur verwenden diese Werte; manche Kapazitätsbalken haben eigene Grenzen. Die RAM-Zeile beschreibt eine aktuelle Ausnahme.", + "coloursTitle": "Statusfarben für Warnung und Kritisch", + "coloursIntro": "Widgets mit dem konfigurierten Paar Warnung/Kritisch verwenden die drei folgenden Zustände. Andere Anzeigen, etwa PVE-Kapazitätsbalken, haben eigene Grenzen; ihre Farbe allein belegt keine Health-Monitor-Warnung.", + "headerColour": "Farbe", + "headerRange": "Bereich", + "headerMeaning": "Bedeutung", + "colourRows": [ + { + "colour": "Grün", + "range": "Wert < Warnung", + "meaning": "Normaler Betriebsbereich. Keine Warnung wird erzeugt." + }, + { + "colour": "Orange", + "range": "Warnung ≤ Wert < Kritisch", + "meaning": "Warnzustand. Health Monitor erzeugt ein WARNING-Ereignis; Benachrichtigungen beachten Kanalfilter und Ruhezeiten." + }, + { + "colour": "rot", + "range": "Wert ≥ kritisch", + "meaning": "Kritischer Zustand. Health Monitor erzeugt ein CRITICAL-Ereignis, das Ruhezeiten umgeht. Kategorie- und Ereigniseinstellungen des Kanals gelten weiter; die Zustellung hängt auch von seiner Verfügbarkeit ab." + } + ], + "sectionsTitle": "Abschnitte und empfohlene Standardwerte", + "sectionsIntro": "Dies sind die ProxMenux-Standardwerte, bis Sie sie ändern. Die Abschnitte folgen Rechenlast, Temperatur und Speicherkapazität, von aktueller Last bis belegtem Platz.", + "headerSection": "Abschnitt", + "headerWarning": "Warnung", + "headerCritical": "Kritisch", + "headerGates": "Gesteuerte Prüfung", + "thresholdRows": [ + { + "section": "CPU-Auslastung", + "warning": "85 %", + "critical": "95 %", + "gates": "Dauerlastwarnung, wenn die mittlere CPU-Auslastung im Prüfzeitraum über der Schwelle liegt." + }, + { + "section": "Arbeitsspeicher", + "warning": "85 %", + "critical": "95 %", + "gates": "RAM-Druck des Hosts. Der konfigurierbare Standard zeigt Kritisch bei 95 %, doch der aktuelle Detektor verwendet fest 90 % über längere Zeit; diese Einstellung ändert diesen Laufzeitzweig derzeit nicht." + }, + { + "section": "Swap (nur kritischer Schwellenwert)", + "warning": "—", + "critical": "80 %", + "gates": "Swap-CRITICAL erfordert zugleich mehr als 80 % Swap und weniger als 15 % verfügbaren RAM über mehrere Messungen. Belegter Swap allein löst die Regel nicht aus." + }, + { + "section": "CPU-Temperatur", + "warning": "80 °C", + "critical": "90 °C", + "gates": "CPU-Package- oder Kerntemperatur aus lm-sensors." + }, + { + "section": "Festplattentemperatur — HDD", + "warning": "60 °C", + "critical": "65 °C", + "gates": "HDD-Temperatur. Standard: Warnung bei 60 °C, Kritisch bei 65 °C. Das sind Überwachungswerte, keine universelle Herstellergrenze; prüfen Sie die Modellspezifikation." + }, + { + "section": "Datenträgertemperatur — SSD", + "warning": "70 °C", + "critical": "75 °C", + "gates": "SATA-SSDs in 2,5-Zoll- oder M.2-Bauform. Diese Klasse verwendet 70/75 °C als Standard; tatsächliche Grenzen hängen vom Modell ab." + }, + { + "section": "Datenträgertemperatur — NVMe", + "warning": "80 °C", + "critical": "85 °C", + "gates": "NVMe-Temperatur. Standardwerte dieser Klasse sind 80/85 °C. Die Drosseltemperatur des Controllers hängt vom Modell ab und beträgt nicht immer 85 °C." + }, + { + "section": "Datenträgertemperatur — SAS", + "warning": "55 °C", + "critical": "65 °C", + "gates": "SAS-Temperatur. Diese Klasse verwendet Warnung bei 55 °C und Kritisch bei 65 °C. Das sind Überwachungsstandards, kein Beweis eines Kühlfehlers bei 55 °C oder eine allgemeine Herstellergrenze." + }, + { + "section": "Datenträgerplatz — Host", + "warning": "85 %", + "critical": "95 %", + "gates": "Kapazität von / und jedem Einhängepunkt des Hosts (/var/lib/vz, /mnt/*…)." + }, + { + "section": "Plattenraum — LXC Rootfs", + "warning": "85 %", + "critical": "95 %", + "gates": "Root-Laufwerk pro Container, bewertet anhand der Rootfs-Größe von PVE." + }, + { + "section": "LXC-Einhängepunkte", + "warning": "85 %", + "critical": "95 %", + "gates": "Kapazität von Einhängepunkten laufender CTs: mp0, mp1, NFS und Bind-Mounts. Ohne rootfs." + }, + { + "section": "PVE-Speicher", + "warning": "85 %", + "critical": "95 %", + "gates": "Von PVE verwaltete Speicher: LVM, LVM-thin, ZFS-pool, RBD/Ceph und PBS. Nicht alle sind Blockspeicher." + }, + { + "section": "ZFS-Pool", + "warning": "85 %", + "critical": "95 %", + "gates": "ZFS-Pools auf dem Host, unabhängig von ihrer Registrierung in PVE." + } + ], + "defaultsTitle": "Standardwerte, Anpassungen und Zurücksetzen", + "defaultsBody": "Jeder Abschnitt beginnt mit Standardwerten; Sie speichern nur gewünschte Änderungen. Die Karte zeigt den wirksamen Wert: Ihre Änderung oder den Standard. Zurücksetzen entfernt alle Änderungen in sämtlichen Abschnitten.", + "validationTitle": "Validierung", + "validationBody": "Beim Speichern werden erlaubte Bereiche geprüft und Kritisch unter Warnung abgelehnt. Die Oberfläche zeigt Fehler; der Server validiert API-Anfragen vor dem Speichern erneut." + }, + "lxcDetection": { + "heading": "LXC-Update-Erkennung", + "imageAlt": "LXC-Update-Erkennung mit Schalter zur Suche nach Paketupdates in laufenden Debian-, Ubuntu- und Alpine-Containern", + "imageCaption": "Schalter für regelmäßige Prüfungen mit apt list --upgradable / apk list -u in laufenden CTs. Standardmäßig aktiviert. Der zugehörige Schalter unter Benachrichtigungen → Dienste erscheint bei aktiver Erkennung.", + "intro": "Der Schalter zwischen Schwellen und Benachrichtigungen steuert den LXC-Scan. Aktiv fragt er Paketmanager laufender CTs ab; Hardware zeigt Ergebnisse und lxc_updates_available erhält sie. Deaktiviert stoppt er seine pct exec-Aufrufe und entfernt LXC-Einträge aus managed_installs.json; /api/managed-installs meldet den Status dann ohne 24-Stunden-Wartezeit nicht mehr.", + "whatRunsTitle": "Was die Prüfung ausführt", + "whatRunsIntro": "Für jeden CT im Zustand running mit unterstütztem Paketmanager:", + "whatRunsItems": [ + "Metadatenaktualität. Ist der apt/apk-Cache älter als 24 Stunden, wird eine Aktualisierung mit apt-get update -qq auf Debian/Ubuntu oder apk update auf Alpine versucht, mit 60 s Zeitlimit. Bei Fehlern verwendet die Liste den vorhandenen, eventuell veralteten Cache.", + "Auflistung. Führt apt list --upgradable / apk list -u aus und ermittelt Paketanzahl und einige Paketnamen.", + "Duplikate je CT vermeiden. Ein Fingerabdruck aus Gesamtzahl, Sicherheitsupdates und sortierten Namen verhindert tägliche Wiederholungen desselben Bestands. Wesentliche Änderungen melden erneut." + ], + "selfUpdateTitle": "CTs mit Updates außerhalb von apt können 0 melden", + "selfUpdateBody": "Die Erkennung umfasst nur den Paketmanager im CT. Außerhalb von apt aktualisierte Software, etwa ein eingerichteter plexupdate-Job oder Images aus docker pull, zählt nicht dazu. Null apt-Updates beweisen nicht, dass alle Anwendungen aktuell sind. Ausstehende Basissystempakete werden weiter erkannt.", + "refreshTitle": "Warum Metadaten nach 24 Stunden erneuert werden", + "refreshBody": "Lange laufende CTs können alte apt-Metadaten haben, wenn niemand apt update ausführt. apt list --upgradable kann dann neue Updates übersehen. ProxMenux versucht eine Erneuerung nach mehr als 24 Stunden und überspringt sie bei neuerem Cache.", + "toggleTitle": "Benachrichtigungsschalter bei aktiver Erkennung", + "toggleBody": "Der Schalter lxc_updates_available je Kanal unter Benachrichtigungen → Dienste erscheint nur bei aktiver Erkennung. Beim Abschalten verschwindet die Zeile in allen Kanälen. Die Datenbank bewahrt die Einstellung; beim Einschalten kehrt der bisherige Wert zurück.", + "purgeTitle": "Was beim Abschalten der Erkennung gelöscht wird", + "purgeBody": "Das Abschalten entfernt sofort alle type=lxc-Einträge aus /usr/local/share/proxmenux/managed_installs.json. Hardware zeigt beim nächsten Neuladen keine LXC-Updatezähler mehr. Nach dem Einschalten füllt der nächste Erkennungszyklus den Bestand erneut; ein manueller API-Aufruf kann dies vorziehen." + }, + "storageExclusions": { + "heading": "Ausschlüsse von Remote-Speicher", + "imageAlt": "Karte für entfernte Speicherausschlüsse mit PBS-Cloud, PBS und PBS2 sowie Schaltern für Zustand und Warnungen je Zeile", + "imageCaption": "Schalter für Zustand und Warnungen je Speicher. Sind beide aus, zählt der Speicher nicht mehr im Health Monitor und sendet keine Meldungen. Unter Speicher bleibt er als ausgeschlossen sichtbar.", + "intro": "Von Proxmox verwaltete Speicher (NFS / CIFS / PBS / Ceph / iSCSI usw.) lassen sich mit zwei unabhängigen Schaltern ausschließen:", + "items": [ + "Zustand — wird dieser Schalter deaktiviert, zählt der Speicher nicht mehr zur Speicherkategorie des Health Monitor. Hilfreich für meist abgeschaltete Archiv-Volumes oder entfernte Sicherungsziele, die nur nach Zeitplan eingeschaltet werden.", + "Warnungen — ausgeschaltet verhindert dieser Schalter Meldungen für den Speicher über eingerichtete Kanäle, auch bei aktiven Zustandsprüfungen. Hilfreich, wenn Sie den Zustand im Dashboard sehen möchten, ohne Meldungen zu erhalten." + ], + "outro": "Ausgeschlossene Speicher bleiben auf der Registerkarte Speicher mit dem violetten Abzeichen ausgeschlossen sichtbar. Der Zustand wird in der SQLite-Tabelle excluded_storages gespeichert." + }, + "interfaceExclusions": { + "heading": "Ausschlüsse von Netzwerkschnittstellen", + "imageAlt": "Karte für Schnittstellenausschlüsse mit vmbr0, vmbr1, vmbr2, bond0 und eno1 sowie Zustands- und Warnungsschaltern je Schnittstelle", + "imageCaption": "Wie bei Speicherausschlüssen gibt es Zustand und Warnungen je Schnittstelle. Jede Zeile zeigt Namen, Typ (Bridge / Bond / physisch), IP und Verbindungsgeschwindigkeit.", + "intro": "Dasselbe Prinzip gilt für Netzwerkschnittstellen: Jede lässt sich von Zustandsprüfungen, Benachrichtigungen oder beiden ausschließen. Typische Beispiele:", + "items": [ + "Eine bewusst deaktivierte Reserve-Bridge.", + "Eine physisch entfernte Netzwerkkarte, die noch in /etc/network/interfaces steht.", + "Eine VLAN-Unterschnittstelle, die nur bei Wartungsarbeiten genutzt wird.", + "Eine Verwaltungs-Bridge mit bekannten, wiederholten Verbindungswechseln während der Wartung." + ], + "outro": "Der Zustand wird in der SQLite-Tabelle excluded_interfaces gespeichert. Das violette Abzeichen ausgeschlossen auf der Registerkarte Netzwerk hält ausgeschlossene Schnittstellen sichtbar." + }, + "notifications": { + "heading": "Benachrichtigungen und KI", + "body1": "Hier aktivieren Sie ProxMenux-Monitor-Benachrichtigungen und die KI-Umformulierung. Benachrichtigungen aktivieren startet den Hintergrundversand, registriert ein Proxmox-VE-Webhook-Ziel für dessen Ereignisse und öffnet die Kanaleinstellungen für Telegram, Discord, E-Mail, Gotify und weitere Dienste. Die KI-Umformulierung liegt im selben Bereich unter aufklappbaren erweiterten Einstellungen.", + "body2": "Eigene Seiten erklären die Optionen: Kanäle, Ereignisschalter, formatierte Nachrichten, Anzeigename, Versand mit Duplikatfilter, Wartezeiten, Bündelung und Ruhezeiten, PVE-Webhook, KI-Anbieter und Prompt-Modi:", + "items": [ + "Benachrichtigungen: Kanaleinrichtung (Telegram, Discord, Gotify, E-Mail mit Gmail-/Microsoft-App-Passwörtern, ntfy, Slack, Teams und allgemeiner Webhook), Ereigniskategorien, formatierte Nachrichten, Anzeigename, Versand, PVE-Webhook, Verlauf und API.", + "KI-Assistent: Anbieter (OpenAI, Anthropic, Gemini, Groq, OpenRouter, Ollama), Modelle, Standard- oder eigene Prompts, Ausgabesprache, Detailgrad je Kanal und KI-Vorschläge." + ] + }, + "optimizations": { + "heading": "ProxMenux-Optimierungen", + "intro": "Bestand der von ProxMenux auf dem Host registrierten Nachinstallationsoptimierungen. Optionen aus Automatisierte Nachinstallation und Anpassbare Nachinstallation tragen ihre Anwendung in /usr/local/share/proxmenux/installed_tools.json ein. Der Monitor liest diesen Bestand. Ein Eintrag prüft nicht erneut, ob alle Einstellungen unverändert sind.", + "imageAlt": "ProxMenux-Optimierungskarte mit 14 Einträgen aus Farbpunkt, Name und Version: APT IPv4 Force, Bashrc Customization, Fastfetch, Log2ram SSD Protection, Memory Settings Optimization, Setting persistent network interfaces, System Limits Increase, APT Language Skip, Entropy Generation haveged mit Legacy, Kernel Panic Configuration, Logrotate Optimization, Network Optimizations, Subscription Banner Removal und VFIO IOMMU Passthrough.", + "imageCaption": "Jede Optimierung erscheint mit Name, Version und Farbpunkt. Oben rechts steht der orange Zähler 14 aktiv. Werkzeuge mit verfügbarem Quellcode lassen sich öffnen.", + "dotsTitle": "Was die Punkte bedeuten", + "dotsItems": [ + " Grüner Punkt: registrierte Optimierung ohne Legacy-Markierung und ohne angezeigtes Update. Öffnen Sie die Zeile, wenn Quellcode verfügbar ist.", + " Oranger Punkt und legacy-Abzeichen: registrierte Optimierung, deren Skript umbenannt oder ersetzt wurde. Der erhaltene Quellcode öffnet sich im Legacy-Modus mit oranger Hervorhebung. Die aktuelle Host-Konfiguration wird dabei nicht erneut geprüft." + ], + "clickTitle": "Quellcode öffnen", + "clickBody": "Ein Klick zeigt die zugeordnete Bash-Funktion und den Skriptnamen (auto_post_install.sh oder customizable_post_install.sh). Aktuelle Werkzeuge stammen aus Host-Dateien, ältere können erhaltenen Quellcode nutzen. Syntaxhervorhebung und Kopieren erleichtern die Prüfung. Dies ist kein garantiertes Abbild des bei der Installation ausgeführten Codes.", + "detailAlt": "Quellcodefenster für APT IPv4 Force mit der Bash-Funktion force_apt_ipv4 aus customizable_post_install.sh Version 1.0. Der hervorgehobene Code konfiguriert /etc/apt/apt.conf.d/99-force-ipv4 mit Acquire ForceIPv4 true, registriert das Werkzeug und zeigt eine übersetzte Abschlussmeldung zur APT-IPv4-Konfiguration.", + "detailCaption": "Quellcode von APT IPv4 Force: Funktion force_apt_ipv4() aus customizable_post_install.sh v1.0, mit Syntaxhervorhebung und Kopieren per Klick.", + "whyTitle": "Warum das wichtig ist", + "whyBody": "ProxMenux kann Kernel-Parameter, Paketquellen, Netzwerk, Logrotation und GPU-Durchreichung ändern. Prüfen Sie die registrierten Optimierungen vor manuellen Änderungen, besonders wenn jemand anderes den Host eingerichtet hat. Die Karte zeigt Bestand und verfügbaren Quellcode; sie prüft nicht jede aktuelle Einstellung und bewahrt keinen exakten Ausführungsverlauf.", + "updatesTitle": "Hinweis auf verfügbare Updates", + "updatesBody": "Ist die Optimierung auf dem Datenträger neuer als die auf dem Host registrierte Version, erscheint ein Hinweis mit Anzahl und Anwenden. Anwenden öffnet die Auswahl der Optimierungen, wie Verfügbare Updates anwenden im Nachinstallationsmenü. Wählen Sie die Updates; ProxMenux führt ihre Funktionen erneut aus und aktualisiert den Bestand. Sind alle aktuell, verschwindet der Hinweis.", + "updatesAlt": "ProxMenux-Optimierungskarte mit Hinweis auf verfügbare Updates, deren Anzahl und Anwenden-Schaltfläche für die Auswahl", + "updatesCaption": "Der Hinweis erscheint, wenn mindestens eine Optimierung auf dem Datenträger neuer ist. Verfügbare Updates anwenden erklärt den Ablauf und die entsprechende Path-A-Option im Shell-Menü.", + "revertTitle": "Eine Optimierung rückgängig machen", + "revertBody": "Um eine Optimierung rückgängig zu machen, wählen Sie die passende Option unter Optimierungen deinstallieren im ProxMenux-Scripts-Menü. Dies entfernt den Eintrag aus installed_tools.json; nach dem Neuladen erscheint er nicht mehr." + }, + "dataCollected": { + "heading": "Wie die Daten gesammelt werden", + "headerCard": "Karte", + "headerEndpoint": "Endpunkt", + "headerSource": "Quelle", + "rows": [ + { + "card": "Schnittstellensprache", + "endpoint": "localStorage", + "source": "Browser-Einstellung proxmenux-ui-language; ohne gespeicherte Wahl wird zunächst die Browsersprache verwendet." + }, + { + "card": "Navigationsreihenfolge", + "endpoint": "localStorage", + "source": "Browser-Einstellung proxmenux-nav-order; sie legt auch die Startregisterkarte fest." + }, + { + "card": "Netzwerkeinheiten", + "endpoint": "/api/settings", + "source": "In der SQLite-Einstellungstabelle des Dashboards gespeichert." + }, + { + "card": "Health-Monitor-Zeitdauern", + "endpoint": "/api/health/settings", + "source": "Unterdrückungsdauer je Kategorie in der Health-Monitor-Datenbank." + }, + { + "card": "Speicher-/Schnittstellenausschlüsse", + "endpoint": "/api/storage/exclusions, /api/network/exclusions", + "source": "SQLite Tabellen excluded_storages und excluded_interfaces." + }, + { + "card": "Bereich Benachrichtigungen und KI", + "endpoint": "/api/notifications/*", + "source": "Siehe Benachrichtigungen und KI-Assistent." + }, + { + "card": "ProxMenux-Optimierungsliste", + "endpoint": "/api/proxmenux/installed-tools", + "source": "Liest /usr/local/share/proxmenux/installed_tools.json, geschrieben durch register_tool-Aufrufe der Nachinstallationsskripte." + }, + { + "card": "Quellcodefenster einer Optimierung", + "endpoint": "/api/proxmenux/tool-source", + "source": "Extrahiert die zugeordnete Bash-Funktion aus auto_post_install.sh oder customizable_post_install.sh auf dem Host; ältere Werkzeuge können erhaltenen Quellcode nutzen." + } + ] + }, + "whereNext": { + "heading": "Weitere Schritte", + "items": [ + { + "label": "Registerkarte Apps", + "href": "/docs/monitor/dashboard/apps", + "tail": " — der App-Starter, dessen Position die Navigationsreihenfolge bestimmt." + }, + { + "label": "Benachrichtigungen", + "href": "/docs/monitor/notifications", + "tail": " — Kanäle, Ereignisschalter, kanalbezogene Anpassungen, Verlauf und Testversand." + }, + { + "label": "KI-Assistent", + "href": "/docs/monitor/ai-assistant", + "tail": " — Anbieter, Modelle, Prompt-Modi, Sprachen und Detailgrad je Kanal." + }, + { + "label": "Health Monitor → Warnungen unterdrücken und Unterdrückungsdauer", + "href": "/docs/monitor/health-monitor#dismissing-alerts-and-the-suppression-duration", + "tail": " — wie die obigen Auswahllisten je Kategorie funktionieren." + }, + { + "label": "ProxMenux Scripts → Automatisierte Nachinstallation", + "href": "/docs/post-install/automated", + "tailRich": " und Anpassbare Nachinstallation — die Skripte, die Einträge in der obigen Optimierungsliste registrieren." + }, + { + "label": "Optimierungen deinstallieren", + "href": "/docs/post-install/uninstall", + "tail": " — wie Sie eine oben registrierte Optimierung rückgängig machen." + }, + { + "label": "Dashboard-Index", + "href": "/docs/monitor/dashboard", + "tail": " — zurück zur Übersicht der Registerkarten." + } + ] + } +} diff --git a/web/messages/de/docs/monitor/dashboard/storage.json b/web/messages/de/docs/monitor/dashboard/storage.json new file mode 100644 index 00000000..e3f1c1a1 --- /dev/null +++ b/web/messages/de/docs/monitor/dashboard/storage.json @@ -0,0 +1,268 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Dashboard: Registerkarte Speicher | ProxMenux-Dokumentation", + "description": "Die Registerkarte Speicher vereint vier Ansichten: Proxmox-Speicher mit Status, ZFS-Pools, interne Laufwerke mit SMART und externe USB-Laufwerke. Die Laufwerksdetails zeigen SMART-Attribute, Verschleiß, Lebensdauer und dauerhaft gespeicherte Beobachtungen." + }, + "header": { + "title": "Dashboard: Registerkarte Speicher", + "description": "Der gesamte Hostspeicher auf einer Seite: Proxmox-Speicher NFS / CIFS / LVM / ZFS / dir, ZFS-Poolzustand, interne SATA/NVMe-Laufwerke mit SMART und externe USB-Laufwerke. Ein Klick auf ein Laufwerk öffnet SMART-Attribute und Beobachtungsverlauf.", + "section": "ProxMenux Monitor · Übersicht" + }, + "intro": { + "title": "Unterstützt durch drei Quellen", + "body": "Proxmox-Speicher stammen aus pvesm status, ZFS aus zpool status, physische Laufwerke aus lsblk + smartctl und NVMe-Felder aus nvme. Die Seite aktualisiert sich etwa alle 60 Sekunden; die Detailansicht fordert eine SMART-Abfrage an." + }, + "thresholds": { + "title": "Hier angewendete Statusfarben und -schwellen", + "intro": "Health Monitor bewertet den Status als grün unter Warnung, orange zwischen Warnung und Kritisch und rot ab Kritisch. Die Standardwerte folgen. Einzelne Dashboard-Balken können andere, unten beschriebene Farbgrenzen verwenden.", + "items": [ + "Kapazität (Hostlaufwerke, PVE-Speicher, ZFS-Pools, LXC-Einhängepunkte) — Warnung 85 %, Kritisch 95 %.", + "Laufwerkstemperatur — HDD 60/65 °C · SSD 70/75 °C · NVMe 80/85 °C · SAS 55/65 °C (Warnung / Kritisch)." + ], + "outro": "Alle Werte lassen sich je Host konfigurieren. Einstellungen → Health-Monitor-Schwellen nennt die maßgeblichen Werte und erklärt ihre Anpassung." + }, + "topRow": { + "heading": "Obere Reihe: Speicherübersicht", + "intro": "Vier Karten fassen beim Öffnen Gesamtkapazität, lokale Nutzung, entfernte Nutzung und physische Laufwerke zusammen. Sie geben schnelle Antworten; die Karten darunter enthalten die Details.", + "imageAlt": "Registerkarte Speicher mit vier Karten: Gesamtspeicher, lokale Nutzung, entfernte Nutzung und physische Laufwerke", + "imageCaption": "Obere Reihe: Gesamtkapazität und Laufwerksanzahl, lokal und entfernt belegte Bytes sowie physische Laufwerke nach Typ mit Zustandsübersicht.", + "headerCard": "Karte", + "headerWhat": "Was es zeigt", + "totalLabel": "Gesamtspeicher", + "totalWhat": "Gesamte Rohkapazität aller physischen Laufwerke. Die Fußzeile nennt die Anzahl erkannter Laufwerke.", + "localLabel": "Lokale Nutzung", + "localWhat": "Belegte Bytes auf lokalem Speicher: LVM / LVM-thin / ZFS / dir auf den Hostlaufwerken. Der Hauptwert zeigt belegte Bytes, die Fußzeile X.XX % von Y TB zusätzlich den Belegungsgrad.", + "remoteLabel": "Entfernte Nutzung", + "remoteWhat": "Dasselbe Format wie Lokale Nutzung für entfernte Speicher NFS / CIFS / PBS / Ceph / iSCSI. Sie werden getrennt gezählt, da lokale und entfernte Ausfälle unterschiedlich wirken und die Ressourcen anders geplant und überwacht werden.", + "disksLabel": "Physische Laufwerke", + "disksIntro": "Zwei Aufschlüsselungslinien für das Inventar:", + "disksItems": [ + "Nach Typ — Anzahl der NVMe-Laufwerke in Lila, SSDs und HDDs in Blau. Angezeigt werden erkannte Typen; ein reiner NVMe-Host zeigt nur diesen Zähler.", + "Nach Zustand — Anzahl normaler Laufwerke in Grün, mit Warnung in Gelb und kritischer in Rot. Ohne Probleme erscheint nur „X normal“; die anderen Zustände werden erst bei entsprechenden Befunden angezeigt." + ] + }, + "pveStorage": { + "heading": "Proxmox Speicherkarte", + "intro": "Je Speicher aus /etc/pve/storage.cfg eine Zeile mit Typ (nfs / cifs / zfspool / lvm / lvmthin / dir / pbs), Name, Status aktiv/Fehler/nicht überwacht, Belegungsgrad und Farbbalken:", + "items": [ + "Bis 75 % — blauer Balken und Wert.", + "Über 75 % bis 90 % — gelber Balken und Wert. Diese Farbgrenzen sind von den Health-Monitor-Schwellen getrennt.", + "> 90 % — roter Balken und Wert. Diese Farbgrenze ist von der Eskalation im Health Monitor getrennt.", + "Fehler — roter Rahmen um die Zeile bei konfiguriertem, aber unerreichbarem Speicher, etwa ausgefallenem NFS-Server oder abgelaufenen CIFS-Zugangsdaten.", + "Ausgeschlossen — lila Rahmen und Kennzeichnung „nicht überwacht“. Vom Benutzer ausgeschlossene Speicher, etwa absichtlich getrennte Archivvolumes." + ], + "calloutTitle": "Speicher von der Überwachung ausschließen", + "calloutBody": "Im Speichermenü lässt sich der Speicher als von Überwachung ausgeschlossen markieren. Die Einstellung liegt in excluded_storages und gilt für Dashboard und Health Monitor: keine Benachrichtigungen und kein Einfluss auf den Gesamtstatus." + }, + "zfs": { + "heading": "ZFS Poolkarte", + "intro": "Erscheint nur bei installiertem ZFS und mindestens einem Pool. Jede Zeile zeigt einen Pool mit Status, Größe, belegtem und freiem Platz sowie Statussymbol:", + "items": [ + "ONLINE — grün. Alles gesund.", + "DEGRADED — gelb. Der Pool liefert Daten, aber mindestens ein Gerät ist nicht verfügbar; ein Austausch muss geprüft werden.", + "FAULTED / UNAVAIL / SUSPENDED — rot. Der Pool liefert keine Daten und erfordert sofortiges Eingreifen." + ], + "outro": "ZFS-Zustand und SMART-Status jedes Laufwerks fließen in die Kategorie Laufwerke und E/A im Health Monitor ein." + }, + "physical": { + "heading": "Physische Laufwerke und SMART-Status", + "intro": "Interne Festplatten (SATA / NVMe). Jede Zeile kondensiert die nützlichsten Felder auf einen Blick:", + "items": [ + "Gerätepfad — /dev/sda, /dev/nvme0n1.", + "Typkennzeichnung — SATA / NVMe und passendes Symbol.", + "Systemkennzeichnung — orange Markierung für erkannte Betriebssystemlaufwerke. Die Erkennung verwendet die Einhängepunkte / und /boot; zugehörige Laufwerke erhalten System. Eine fehlende Markierung beweist nicht, dass das Laufwerk gefahrlos gelöscht oder anders verwendet werden kann.", + "Modell — Hersteller und Modell aus smartctl -i.", + "Kapazität — in gut lesbaren Einheiten.", + "Temperatur — aktueller Wert in °C, eingefärbt nach Laufwerkstyp; NVMe verwendet höhere Schwellen als SATA.", + "SMART-Status — bestanden / fehlgeschlagen / unbekannt.", + "Beobachtungsanzeige — enthält der dauerhafte Verlauf disk_observations Einträge für das Laufwerk, erscheint eine blaue Kennzeichnung mit der Anzahl, etwa 3 obs.. Ein Klick öffnet die Beobachtungen.", + "Zustandsanzeige — In Ordnung / Warnung / Kritisch anhand von SMART und jüngsten Beobachtungen." + ], + "clickHint": "Die gesamte Zeile öffnet per Klick die unten beschriebenen Laufwerksdetails.", + "warningTitle": "Systemlaufwerke mit Bedacht behandeln", + "warningBody": "Laufwerke mit orangefarbenem System enthalten das laufende Betriebssystem. Die Kennzeichnung hilft bei der Erkennung; ProxMenux → Laufwerksverwaltung → Formatieren / Löschen verweigert destruktive Aktionen darauf. Verwenden Sie zur Umnutzung einer Startplatte eine Rettungsumgebung außerhalb des laufenden Proxmox." + }, + "external": { + "heading": "Externer Speicher (USB)", + "body": "USB-Laufwerke haben eine eigene Karte, die nur bei angeschlossenen Geräten erscheint. Sie zeigt dieselben Felder wie interne Laufwerke und ein orangefarbenes USB-Label. Da sie oft nur für Sicherungen oder gelegentliche Übertragungen verbunden sind, bleiben Beobachtungen erhalten, während E/A-Fehler getrennter USB-Laufwerke nicht eskalieren." + }, + "drillIn": { + "heading": "Dialog mit Laufwerksdetails", + "intro": "Ein Klick auf ein Laufwerk öffnet vier Registerkarten: Übersicht · SMART · Verlauf · Zeitplan. Die Kopfzeile zeigt Gerätepfad, Modell, Kapazität und gegebenenfalls das orangefarbene System-Label.", + "overviewTitle": "Registerkarte 1 — Übersicht", + "overviewImageAlt": "Laufwerksdetails mit Übersicht, Zustand, Ringanzeige für Verschleiß und Lebensdauer sowie wichtigen SMART-Attributen", + "overviewImageCaption": "Übersicht: Identifikation, Zustand, Restlebensdauer mit aktuellem Verschleiß und geschriebenen Daten sowie wichtige SMART-Attribute.", + "overviewIntro": "Standardansicht zum Prüfen des Laufwerkszustands ohne Testlauf. Drei Bereiche:", + "overviewItems": [ + "Identifikation — Modell, Seriennummer, Kapazität und Zustand In Ordnung / Warnung / Kritisch.", + "Verschleiß und Lebensdauer — Ring für Restlebensdauer (97 %, 50 %, …) mit Quellattribut (Media Wearout Indicator, Percentage Used, …), Verschleißbalken, Prognose Geschätzte Lebensdauer in Jahren und geschriebenen Gesamtdaten. NVMe zeigt auch Available Spare.", + "SMART-Attribute: Die wichtigsten Werte erscheinen in einem Raster mit zwei Spalten: Temperatur, Betriebsstunden mit lesbarer Dauer wie 3 Jahre und 116 Tage, Drehzahl oder SSD, Einschaltzyklen, SMART-Status, neu zugewiesene Sektoren, ausstehende Sektoren und CRC-Fehler. Die vollständige Attributtabelle befindet sich auf der Registerkarte SMART." + ], + "smartTitle": "Tab. 2 — SMART", + "smartImageAlt": "Laufwerksdetails, SMART-Registerkarte mit kurzem und erweitertem Test, letztem Ergebnis und vollständiger Attributtabelle", + "smartImageCaption": "SMART-Registerkarte: kurzen oder erweiterten Test starten, letztes Ergebnis und alle Attribute prüfen sowie den vollständigen Bericht zum Drucken oder Speichern als PDF öffnen.", + "smartIntro": "Verfügbare Aktionen in drei Bereichen:", + "smartItems": [ + "SMART-Test starten — zwei Schaltflächen. Kurzer Test (~2 Min.) wartet auf das Ergebnis und zeigt es im Dialog. Erweiterter Test (Hintergrund) kann bei großen Laufwerken Stunden dauern, läuft auf dem Server weiter und benachrichtigt bei Abschluss.", + "Letzter Test — Typ, Status (bestanden / fehlgeschlagen) und Zeitstempel des letzten Laufs.", + "SMART-Attribute — vollständige Tabelle mit ID, Name, Wert, schlechtestem Wert und Status In Ordnung, Warnung oder Kritisch. SATA/SAS zeigt die nummerierte Liste. NVMe verwendet nvme smart-log: Temperatur, verfügbare Reserve, verbrauchter Anteil, gelesene/geschriebene Einheiten, Hostzugriffe, Controller-Auslastungszeit, Einschaltzyklen, unsichere Abschaltungen, Medienfehler, Fehlerprotokolleinträge und Zeit im Warn-/Kritischbereich der Gesamttemperatur." + ], + "pdfTitle": "Vollständigen SMART-Bericht anzeigen (PDF)", + "pdfIntro": "Unten auf SMART öffnet Vollständigen SMART-Bericht anzeigen einen druckbaren Bericht. Speichern Sie ihn über den Browser-Druckdialog als PDF zum Archivieren oder für den Herstellersupport bei einer RMA.", + "pdfPreviewAlt": "Erste Seite des SMART-Berichts mit Zusammenfassung, PASSED-Ring und Laufwerksinformationen", + "pdfPreviewCaption": "Erste Seite: Zusammenfassung, PASSED-Ring und vollständige Laufwerksinformationen. Das Beispiel-PDF enthält SSD-Verschleiß, alle SMART-Attribute und den Testverlauf.", + "pdfDownloadLabel": "Beispiel-SMART-Bericht herunterladen (PDF)", + "pdfSectionsIntro": "Der Bericht hat sechs Hauptabschnitte:", + "pdfSections": [ + "Zusammenfassung — PASSED/FAILED, verständliche Zustandsbewertung — in Ordnung, Verschleiß oder Ausfall — und vier Angaben: Berichtszeit, letzter Testtyp, Ergebnis und geprüfte Attribute.", + "Laufwerksinformationen — Modell, Seriennummer, Kapazität, Typ HDD/SSD/NVMe, Familie, Bauform, Schnittstelle (SATA 3.3 · 6.0 Gb/s, …), TRIM, Temperatur und optimale Schwelle, Betriebsstunden, Einschaltzyklen, SMART, ausstehende/neu zugewiesene Sektoren und CRC-Fehler.", + "SSD-Verschleiß und Lebensdauer (nur SSD/NVMe) — Restlebensdauer, Quellattribut, aktueller Verschleiß, geschriebene Daten und Betriebsstunden.", + "Vollständige SMART-Attribute — ID, Name, Wert, schlechtester Wert, Schwelle, Rohwert und Status jedes Attributs. Wichtige Attribute wie Reallocated Sector Ct, Power On Hours, Reported Uncorrect, UDMA CRC Error Count und Media Wearout Indicator werden unter der Zeile kurz erklärt.", + "Letzter Selbsttest und vollständiger Verlauf — letzter Test mit Typ, Ergebnis, Abschlussmeldung und damaligen Betriebsstunden sowie nummerierte Tabelle aller aufbewahrten Tests.", + "Empfehlungen — Maßnahmen anhand des Ergebnisses. Für gesunde Laufwerke: Laufwerk in Ordnung / regelmäßige Tests / Sicherungsstrategie. Bei auffälligen Attributen folgen Hinweise zum Austausch." + ], + "pdfOutro": "Der Browser erstellt den druckbaren Bericht; Drucken und Als PDF speichern öffnen beide den Druckdialog. Wählen Sie einen Namen wie SMART-<short-id>.pdf. Bewahren Sie datierte Berichte zum Vergleich oder für den Herstellersupport auf.", + "historyTitle": "Registerkarte 3 — Verlauf", + "historyImageAlt": "Laufwerksdetails, Verlauf mit früheren SMART-Tests sowie Download und Löschen", + "historyImageCaption": "SMART-Testverlauf des Laufwerks. Jede Zeile zeigt Typ, Zeit, Alter, Markierung des neuesten Tests sowie Download der smartctl-Ausgabe und Löschen.", + "historyIntro": "Aufbewahrte abgeschlossene kurze und erweiterte Tests des Laufwerks. Jeder Eintrag enthält die ursprüngliche smartctl-Ausgabe und die von Monitor für das Dashboard ausgewerteten Felder. Aktionen je Zeile:", + "historyItems": [ + "Herunterladen — speichert den JSON-Snapshot mit den vom Bericht verwendeten smartctl -a-Daten. Hilfreich, wenn der Herstellersupport die ursprünglichen Diagnosefelder benötigt.", + "Löschen — entfernt einen Test manuell aus dem Verlauf. Die Aufbewahrung im Zeitplan (letzte 5 / 10 / 20) löscht automatisch die ältesten." + ], + "scheduleTitle": "Registerkarte 4 — Zeitplan", + "scheduleImageAlt": "Laufwerksdetails, Zeitplan-Registerkarte mit Schalter für automatische SMART-Tests, Zeitplanliste und Schaltfläche Zeitplan hinzufügen", + "scheduleImageCaption": "Zeitplan: Testtyp, Intervall und Aufbewahrung wählen; Monitor richtet cron für automatische Tests ein.", + "scheduleIntro": "Automatische SMART-Tests über cron ohne Terminal. Drei Bereiche:", + "scheduleItems": [ + "Automatische SMART-Tests — gemeinsamer Schalter für alle Zeitpläne des Laufwerks. Er pausiert sie während der Wartung, ohne ihre Konfiguration zu löschen.", + "Konfigurierte Zeitpläne — je Zeitplan eine Zeile mit Typ (kurz / lang), lesbarem Cron-Ausdruck („Am 1. des Monats um 03:00“, „Jeden Sonntag um 02:00“), betroffenen Laufwerken und Aufbewahrung.", + "Zeitplan hinzufügen / bearbeiten — Typ (kurz ~2 Min. / lang 1–4 Std.), Intervall (täglich / wöchentlich / monatlich), Monats- oder Wochentag, Uhrzeit und Ergebnisse aufbewahren (letzte 5 / 10 / 20)." + ], + "scheduleOutro": "Der Zeitplan erzeugt einen Cron-Eintrag auf dem Host, der Monitor aufruft. Ergebnisse landen im SMART-Verlauf auf Registerkarte 3; die Aufbewahrung entfernt nach neuen Tests automatisch die ältesten Ergebnisse.", + "tempTitle": "Dialog mit Temperaturverlauf", + "tempIntro": "Monitor erfasst regelmäßig Messwerte von Laufwerken mit Temperatursensor und speichert sie lokal als Verlauf. Der aktuelle Wert steht in der Übersicht; ein Klick öffnet den Temperaturverlauf.", + "tempImageAlt": "Temperaturverlauf mit Gerätepfad und Modell, Zeiträumen von 1 Stunde, 24 Stunden, 7 oder 30 Tagen, Anzeigen für Aktuell/Minimum/Mittelwert/Maximum und Liniendiagramm nach den Schwellen des Laufwerkstyps", + "tempImageCaption": "Der Temperaturdialog öffnet sich aus der Übersicht bei einem Sensorwert ungleich null. Das Diagramm verwendet die Schwellen für HDD / SSD / NVMe / SAS.", + "tempShowsTitle": "Inhalt des Dialogs", + "tempShowsItems": [ + "Zeitraumauswahl: 1 Stunde, standardmäßig 24 Stunden, 7 Tage oder 30 Tage. Die Auflösung wird je Anfrage für ein lesbares Diagramm angepasst.", + "Vier Kennzahlen: Aktuell, Minimum, Mittelwert und Maximum im Zeitraum. Aktuell verwendet dieselben Schwellen wie Speicheransicht und Benachrichtigungen für normale, erhöhte oder hohe Temperatur.", + "Liniendiagramm der Temperatur im Zeitverlauf, dessen Linie und Fläche nach Laufwerkstyp eingefärbt sind:" + ], + "tempDiskTypes": [ + "HDD - typischerweise kühlere Schwellenwerte.", + "SSD — moderate Schwellenwerte.", + "NVMe — höhere Schwellenwerte (NVMe läuft vom Design her heißer).", + "SAS — Warnung bei 55 °C und Kritisch bei 65 °C; die Warnschwelle unterscheidet sich von HDD." + ], + "tempConfigurable": "Alle vier Typen werden unter Einstellungen → Health-Monitor-Schwellen konfiguriert.", + "tempWhyTitle": "Warum der Verlauf wichtig ist", + "tempWhyItems": [ + "Trends erkennen. Ein einzelner Wert zeigt nicht, dass ein Laufwerk seit Wochen wärmer wird, etwa durch Lüfterprobleme, Staub oder benachbarte Wärmequellen. Die Ansichten für 7 und 30 Tage zeigen den Verlauf.", + "Spitzen zuordnen. Hat eine Sicherung oder Wiederherstellung die Temperatur kurz über die Schwelle erhöht, zeigen die Ansichten für 1 und 24 Stunden, ob es einmalig oder wiederkehrend war.", + "Schwellen anpassen. Prüfen Sie vor Änderungen unter Einstellungen → Health-Monitor-Schwellen im 30-Tage-Diagramm den tatsächlichen Betriebsbereich des Laufwerks." + ], + "obsTitle": "Beobachtungsverlauf über Registerkarten hinweg", + "obsIntro": "Laufwerksfehler können sich allmählich entwickeln. Ein Laufwerk kann SMART PASSED melden und dennoch Lesefehler in dmesg, SATA-Verbindungsabbrüche oder zeitweise ausstehende Sektoren zeigen. ProxMenux speichert diese Signale und zeigt sie im Dialog neben dem aktuellen SMART-Status.", + "obsImageAlt": "Übersicht eines Laufwerks mit bestandenem SMART und null neu zugewiesenen/ausstehenden Sektoren und CRC-Fehlern, aber einer E/A-Beobachtung mit ursprünglicher Kernelmeldung, ATA-Erklärung, erstem und letztem Zeitpunkt und Zähler", + "obsImageCaption": "Ein Laufwerk mit bestandenem SMART kann frühere Beobachtungen haben. Die Karte ergänzt den aktuellen Status um den Signalverlauf.", + "obsWhatTitle": "Was ist eine Beobachtung?", + "obsWhatIntro": "ProxMenux speichert erkannte Laufwerksereignisse aus Kernelprotokoll, dmesg oder SMART als Beobachtung, wenn sie einzeln zu detailliert für eine Benachrichtigung wären. Jede Zeile zeigt:", + "obsWhatItems": [ + "Typ — E/A-, SMART-, Dateisystem-, ZFS-Pool- oder Verbindungsfehler.", + "Ursprüngliche Kernelmeldung aus dmesg zum Kopieren in eine Suchmaschine oder Supportanfrage.", + "Kurze Erklärung bekannter ATA-Codes: IDNF, Sektoradresse nicht gefunden, möglicher Sektor- oder Kabelfehler; UNC, nicht korrigierbarer Lesefehler, defekter Sektor; und weitere Standardcodes.", + "Erster und letzter Zeitpunkt sowie Anzahl der Vorkommen, gruppiert nach Fehlersignatur." + ], + "obsWhyTitle": "Warum ProxMenux sie speichert und anzeigt", + "obsWhyItems": [ + "Fehler können sich entwickeln. ATA-Busfehler, UNC-Sektoren oder Medienfehler können auftreten, bevor SMART FAILED meldet. Der dmesg-Puffer bewahrt sie nicht über Neustarts hinweg; der Beobachtungsverlauf schon.", + "SMART schließt nicht jeden Fehler aus. Ein Laufwerk kann grüne Attribute und trotzdem Probleme haben. Beobachtungen bewahren zusätzliche Symptome wie ICRC, IDNF, SATA-Verbindungsresets oder Geschwindigkeitsreduzierungen.", + "Trennt aktuell von kürzlich. Health Monitor löst vorübergehende Fehler automatisch, wenn sie nicht mehr auftreten. Der Verlauf zeigt noch Tage später beispielsweise drei E/A-Fehler einer Nacht.", + "Grundlage abgestufter Benachrichtigungen. disk_io verwendet die Beobachtungsrate der Tabelle für still, WARNING oder CRITICAL über das seit 1.2.1.2 gleitende 24-Stunden-Fenster." + ], + "obsDedupTitle": "Duplikate und erneute Benachrichtigungen", + "obsDedupBody1": "Beobachtungen werden nach Signatur gruppiert, einem stabilen Fingerabdruck aus Fehlertyp, Gerät und wichtigen Meldungsfeldern. Wiederholungen erhöhen occurrence_count der vorhandenen Zeile. Eine andere Signatur erzeugt eine weitere Beobachtung und gilt für Benachrichtigungen als neues Ereignis.", + "obsDedupBody2": "Gegen Benachrichtigungskaskaden meldet die erste Kombination aus Laufwerk, Signatur und Schweregrad den Befund. Dieselbe Kombination meldet sich trotz steigender Anzahl erst nach 24 Stunden erneut. Ein Wechsel von WARNING zu CRITICAL unterbricht diese Wartezeit.", + "obsDismissTitle": "Dauerhafter Verlauf und aktive Fehler", + "obsDismissBody1": "Beobachtungen lassen sich nicht verwerfen, ausblenden oder löschen. Jede Signatur hat eine Karte; Wiederholungen erhöhen die Anzahl und aktualisieren den letzten Zeitpunkt. Der Verlauf folgt der Seriennummer: Ein anderes Laufwerk beginnt leer, auch am selben Port; eine Kernel-Umbenennung bewahrt seinen Verlauf.", + "obsDismissBody2": "Das Beheben oder Verwerfen eines aktiven Fehlers im Health Monitor verändert die Beobachtungen nicht. Sie bleiben nach automatischer Auflösung erhalten, sodass eine vorübergehende Warnung von letzter Woche heute sichtbar bleibt. Aktive Fehler verwalten Sie unter Health Monitor." + }, + "dataCollected": { + "heading": "Wie die Daten gesammelt werden", + "headerSection": "Abschnitt des Reiters", + "headerEndpoint": "Endpunkt", + "headerSource": "Quelle", + "rows": [ + { + "section": "Obere Übersichtskarten", + "endpoint": "/api/storage/summary", + "source": "Aggregiert aus lsblk, zpool list, vgs / lvs." + }, + { + "section": "Inventar je Laufwerk", + "endpoint": "/api/storage", + "source": "lsblk -O + smartctl -i je Gerät mit Identitätscache, der bei Hotplug-Ereignissen geleert wird." + }, + { + "section": "Proxmox-Speicher", + "endpoint": "/api/proxmox-storage", + "source": "pvesh get /nodes/<node>/storage mit dem aktiven / Online-Zustand von jedem." + }, + { + "section": "Aktuelle SMART-Werte", + "endpoint": "/api/storage/smart/", + "source": "smartctl -A <dev> ist eine mögliche Abfrage; der Detail-Endpunkt verwendet auch vollständige SMART-JSON-Daten und NVMe-spezifische Werte." + }, + { + "section": "SMART-Selbsttestverlauf", + "endpoint": "/api/storage/smart//history", + "source": "Als JSON-Snapshots unter /usr/local/share/proxmenux/smart/<disk>/ gespeichert." + }, + { + "section": "Dauerhafte Beobachtungen", + "endpoint": "/api/storage/observations", + "source": "SQLite-Tabelle, die Health Monitor in jedem Zyklus aktualisiert und nach Auflösung aktiver Fehler beibehält." + } + ], + "outro": "Überprüfung der Sammelkette auf dem Host:", + "codeComment1": "# Aktuellen Stand aus einem Skript abrufen", + "codeComment2": "# Dashboard-Daten mit der direkten Betriebssystemansicht vergleichen" + }, + "whereNext": { + "heading": "Wohin als nächstes", + "items": [ + { + "label": "Gesundheitsmonitor", + "href": "/docs/monitor/health-monitor", + "tail": " — Kategorie Laufwerke und E/A sowie Unterdrückungsregeln." + }, + { + "label": "API-Referenz", + "href": "/docs/monitor/api", + "tail": " — Speicher- und SMART-Endpunkte." + }, + { + "label": "Benachrichtigungen", + "href": "/docs/monitor/notifications", + "tailRich": " — welche Folgeaktionen disk_io_error, storage_unavailable und smart_test_failed auslösen." + }, + { + "label": "Dashboard-Index", + "href": "/docs/monitor/dashboard", + "tail": "Die anderen Tabs." + }, + { + "label": "ProxMenux → Datenträgerverwaltung", + "href": "/docs/disk-manager", + "tail": " — TUI-Aktionen: Formatieren, Löschen, SMART-Tests und Laufwerke in VMs oder Container importieren." + }, + { + "label": "ProxMenux → SMART-Laufwerkszustand und Tests", + "href": "/docs/disk-manager/smart-disk-test", + "tail": " — CLI-Entsprechung: SMART-Tests planen, das angezeigte JSON exportieren und Testtypen sowie Ergebnisinterpretation nachschlagen." + } + ] + } +} diff --git a/web/messages/de/docs/monitor/dashboard/system-logs.json b/web/messages/de/docs/monitor/dashboard/system-logs.json new file mode 100644 index 00000000..71083e95 --- /dev/null +++ b/web/messages/de/docs/monitor/dashboard/system-logs.json @@ -0,0 +1,120 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Dashboard: Systemprotokolle | ProxMenux-Dokumentation", + "description": "Die Registerkarte Systemprotokolle konsolidiert drei Quellen in einem Bildschirm: journalctl mit Filtern und Download, Proxmox Task History (UPIDs) und Benachrichtigungsprotokoll - alle durchsuchbar, nach Schweregrad / Zeitbereich filterbar und als Textbündel herunterladbar." + }, + "header": { + "title": "Dashboard: Systemprotokolle", + "description": "Drei Unterreiter in einer Ansicht: das Systemjournal (journalctl mit Filtern), der Proxmox-Aufgabenverlauf und das Benachrichtigungsprotokoll. Alle drei lassen sich durchsuchen, filtern und als Textpakete herunterladen.", + "section": "ProxMenux Monitor · Übersicht" + }, + "readOnly": { + "title": "Read-only nach Design", + "body": "Dieser Reiter verändert keine Protokolldateien. Die Filter werden in der URL bzw. im Ansichtsstatus gehalten; Downloads werden auf dem Server erstellt. Das Dashboard löscht keine Einträge. Zur Protokollpflege verwenden Sie auf dem Host journalctl --vacuum-time=<N> oder logrotate." + }, + "topRow": { + "heading": "Obere Reihe: vier Zähler", + "items": [ + "Einträge insgesamt — Anzahl der Protokolleinträge im aktiven Filterzeitraum.", + "Fehler — Anzahl der Einträge mit Schweregrad ≤ 3 (err / crit / alert / emerg).", + "Warnungen — Anzahl der Einträge mit Schweregrad 4 (warning).", + "Sicherungen — Anzahl der vzdump-/PBS-Aufgabeneinträge im selben Zeitraum." + ] + }, + "subtabs": { + "heading": "Drei Unterreiter", + "logsTitle": "Protokolle", + "logsIntro": "Das Systemjournal wird auf dem Server mit journalctl abgerufen. Die Werkzeugleiste bietet folgende Filter :", + "logsFilters": [ + "Schweregrad — emerg / alert / crit / err / warning / notice / info / debug oder eine beliebige Kombination.", + "Zeitbereich — zuletzt 5 min. / 15 min. / 1 h / 6 h / 24 h / 7 d / Custom.", + "Freitextsuche — Teilzeichenfolge oder regulärer Ausdruck (journalctl --grep).", + "Unit-Filter — auf eine bestimmte systemd-Unit beschränken (pveproxy.service, nginx.service, …)." + ], + "logsRowsAfter": "Jede Zeile zeigt Zeitstempel, Schweregradabzeichen, Quelleinheit und die Nachricht. Lange Nachrichten brechen mit einem \"mehr anzeigen\"-Schalter zusammen. Die Aktion Download bündelt den aktuellen Filter über GET /api/logs/download in einer einzigen .txt-Datei – nützlich, wenn Sie ein Stück Journal mit jemandem teilen möchten.", + "logDetailsModalTitle": "Dialog Protokolldetails", + "logDetailsBody": "Ein Klick auf eine Zeile öffnet Protokolldetails mit allen strukturierten Feldern, die journald für diesen Eintrag erfasst hat — wie bei journalctl --output=verbose auf dem Host.", + "logDetailsImageAlt": "Dialog Protokolldetails — einzelner Journaleintrag mit Stufe, Dienst, Zeitstempel, Quelle, systemd-Unit, Prozess-ID, Hostname und vollständiger Nachricht", + "logDetailsImageCaption": "Protokolldetails — alle strukturierten journald-Felder dieses Eintrags mit der vollständigen, ungekürzten Nachricht am Ende. Hilfreich bei cron- und Dienstprotokollen, wenn die ausgeführte Befehlszeile wichtig ist.", + "fieldsIntro": "Gezeigte Felder:", + "fields": [ + "Level — farbiges Schweregradabzeichen (INFO / WARNUNG / ERROR / KRITIKAL).", + "Service — Kurzname der Einheit / des Prozesses, der den Eintrag ausgegeben hat.", + "Timestamp — vollständiges Datum und Uhrzeit der Logzeile.", + "Source — Ursprung des Eintrags (Journal, Kernel, Audit, ...).", + "Systemd Unit — die tatsächliche .service/.timer/.socket-Einheit, wenn der Eintrag mit einer Einheit verknüpft war.", + "Process ID — PID des Sendevorgangs.", + "Hostname — nützlich, wenn Zeitschriften über Clusterknoten weitergeleitet werden.", + "Nachricht — vollständige, ungekürzte Nachricht in einem Monospace-Block zum Kopieren." + ], + "maxLevelStoreTitle": "Journald MaxLevelStore", + "maxLevelStoreBody": "Bei einer neuen Proxmox-Installation verwendet journald standardmäßig MaxLevelStore=warning und verwirft dadurch Info-Meldungen. Monitor erkennt dies beim Start und ergänzt eine Drop-in-Datei (/etc/systemd/journald.conf.d/proxmenux-loglevel.conf) mit dem Grenzwert info. So werden Informationsmeldungen und schwerwiegendere Meldungen gespeichert; debug ist darin nicht enthalten.", + "backupsTitle": "Sicherungen", + "backupsBody": "Proxmox-Taskhistorie gefiltert auf Backup-bezogene Einträge. Eine Zeile pro Aufgabe (vzdump, PBS-Transfers, Garbage Collect, Verify) mit dem Status (OK / WARNINGS / ERROR), beteiligter Gast, Quellspeicher, Dauer und UPID. Klicken Sie auf eine Zeile, um das vollständige Aufgabenprotokoll über GET /api/task-log/<upid> zu laden - die gleichen Daten, die Proxmox über Datacenter → Tasks, die auf Backups beschränkt sind, freigibt.", + "notificationsTitle": "Benachrichtigungen", + "notificationsBody1": "Alle von Monitor versendeten Benachrichtigungen: Telegram, Discord, E-Mail, Gotify, ntfy, Slack, Teams und Webhook. Jede Zeile zeigt Zeitstempel, Kanal, Ereignistyp, Schweregrad, erzeugten Titel und Nachrichtentext sowie bei aktivierter KI einen Schalter zum Vergleich der KI-Fassung mit dem Original.", + "notificationsBody2": "Hier prüfen Sie, ob ein Kanal tatsächlich Nachrichten zustellt, und vergleichen die KI-Fassung mit der ursprünglichen Vorlage. Die Kanäle konfigurieren Sie auf der Detailseite Benachrichtigungen." + }, + "dataCollected": { + "heading": "Wie die Daten gesammelt werden", + "headerSubtab": "Unterregisterkarte", + "headerEndpoint": "Endpunkt", + "headerSource": "Quelle", + "rows": [ + { + "subtab": "Protokolle (Live-Filter)", + "endpoint": "/api/logs", + "source": "journalctl --output json --since <range> mit serverseitigen Filtern für Schweregrad, Unit und Suche." + }, + { + "subtab": "Herunterladen", + "endpoint": "/api/logs/download", + "source": "Dieselbe Abfrage als Klartext für grep / less." + }, + { + "subtab": "Sicherungen", + "endpoint": "/api/backups", + "source": "PVE-Taskhistorie gefiltert nach vzdump, PBS-Transfers, Garbage Collect, Verify." + }, + { + "subtab": "Details einer Sicherungsaufgabe", + "endpoint": "/api/task-log/<upid>", + "source": "Vollständiges Aufgabenprotokoll im Klartext aus /var/log/pve/tasks/<index>/<upid>." + }, + { + "subtab": "Meldeverlauf", + "endpoint": "/api/notifications/history", + "source": "Die SQLite-Tabelle notification_history wird von der Versandschleife gefüllt." + } + ], + "apiIntro": "Live-Filter und Downloads sind auch über die API erreichbar:", + "codeComment1": "# Fehler und schwerwiegendere Meldungen der letzten Stunde mit einem Suchwort", + "codeComment2": "# Laden Sie das vollständige Journal der letzten 6 Stunden als Klartext herunter", + "codeComment3": "# Vollständige Ausgabe einer bestimmten Aufgabe anhand ihrer UPID abrufen" + }, + "whereNext": { + "heading": "Wohin als nächstes", + "items": [ + { + "label": "Gesundheitsmonitor", + "href": "/docs/monitor/health-monitor", + "tail": " — die Kategorie Systemprotokolle zur Erkennung dauerhafter, sprunghafter oder kaskadierender Muster." + }, + { + "label": "Benachrichtigungen", + "href": "/docs/monitor/notifications", + "tail": " — die Journalüberwachung liest dieselbe Quelle und erzeugt bei Treffern Benachrichtigungen." + }, + { + "label": "API-Referenz", + "href": "/docs/monitor/api", + "tail": " — die Endpunkte logs und task-log mit ihren Abfrageparametern." + }, + { + "label": "Dashboard-Index", + "href": "/docs/monitor/dashboard", + "tail": " — die anderen Reiter." + } + ] + } +} diff --git a/web/messages/de/docs/monitor/dashboard/system-overview.json b/web/messages/de/docs/monitor/dashboard/system-overview.json new file mode 100644 index 00000000..cfc6c595 --- /dev/null +++ b/web/messages/de/docs/monitor/dashboard/system-overview.json @@ -0,0 +1,177 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Dashboard: Systemübersicht | ProxMenux-Dokumentation", + "description": "Der Standardstartreiter von ProxMenux Monitor: vier Kennzahlenkarten (CPU, Arbeitsspeicher, aktive VMs und LXCs, Temperatur) mit Live-Aktualisierung und Minidiagramm, ein Verlaufsdiagramm und kompakte Speicher- und Netzwerkübersichten mit Links zu ihren Detailreitern." + }, + "header": { + "title": "Dashboard: Registerkarte Systemübersicht", + "description": "Der Reiter, den das Dashboard standardmäßig öffnet: vier Live-Kennzahlenkarten oben, ein Verlaufsdiagramm in der Mitte und kompakte Speicher- und Netzwerkübersichten unten. Sie verwenden dieselben APIs wie die jeweiligen Detailreiter.", + "section": "ProxMenux Monitor · Übersicht" + }, + "readOnly": { + "title": "Eine schreibgeschützte Momentaufnahme", + "body": "Alle Bereiche dieses Reiters dienen der Information. Aktionen finden Sie in den verlinkten Detailreitern: Speicher zur Datenträgerverwaltung, VMs und LXCs zum Starten und Stoppen von Gästen sowie Sicherheit zur Authentifizierung." + }, + "captureAlt": "Registerkarte Systemübersicht — vier metrische Karten (CPU, Speicher, aktive VMs, Temperatur), Knotenmetrikdiagramm und Speicher- / Netzwerkzusammenfassungskarten", + "captureCaption": "Systemübersicht, der Standardstartreiter. Die vier Karten zeigen Live-Werte, das Diagramm zeigt den Verlauf und die beiden unteren Karten fassen Speicher und Netzwerk zusammen.", + "topRow": { + "heading": "Obere Reihe: Live-Kennzahlenkarten", + "intro": "Vier Karten im 2×2-Raster auf Mobilgeräten und in einer Reihe auf dem Desktop. Jede wird alle paar Sekunden über /api/system aktualisiert.", + "headerCard": "Karte", + "headerWhat": "Was es zeigt", + "headerSource": "Quelle", + "rows": [ + { + "card": "CPU-Auslastung", + "what": "Aktueller Prozentsatz mit Fortschrittsbalken. Der Vitaldaten-Sampler aktualisiert ihn etwa jede Sekunde.", + "source": "psutil.cpu_percent()" + }, + { + "card": "Arbeitsspeichernutzung", + "what": "Belegte GB, Prozentsatz und Gesamt-GB. Der Balken zeigt den Prozentsatz.", + "source": "psutil.virtual_memory()" + }, + { + "card": "Aktive VM und LXC", + "what": "Anzahl laufender Gäste mit Aufschlüsselung nach Laufend/Gestoppt und Gesamtzahlen der VMs und LXCs in der Fußzeile.", + "source": "/api/vms (konsolidiert)" + }, + { + "card": "Temperatur", + "what": "CPU-Temperatur in °C mit Statusanzeige (kühl/warm/heiß) und einem Minidiagramm der letzten 5 Minuten im Hintergrund. Ohne Sensor erscheint N/A. Ein Klick öffnet die Temperaturdetails.", + "source": "sensors / coretemp" + } + ], + "thresholdsTitle": "Hier angewendete Statusfarben und -schwellen", + "thresholdsIntro": "Ringe, Balken und Minidiagramme verwenden dieselbe Einteilung: grün unter der Warnschwelle, bernsteinfarben zwischen Warn- und kritischer Schwelle, rot ab der kritischen Schwelle. Empfohlene Standardwerte von ProxMenux :", + "thresholdsItems": [ + "CPU-Auslastung — Warnung 85 %, kritisch 95 %.", + "Arbeitsspeicher — Warnung 85 %, kritisch 95 %. Swap löst ebenfalls ab 5 % Nutzung den kritischen Zustand aus; ein gesunder Proxmox-Host sollte Swap nur selten verwenden.", + "CPU-Temperatur — Warnung 80 °C, kritisch 90 °C." + ], + "thresholdsOutro": "Alle Werte sind pro Host konfigurierbar. Einstellungen → Grenzwerte der Zustandsüberwachung ist die zentrale Referenz und erklärt ihre Anpassung.", + "sparklineTitle": "Das Minidiagramm zeigt den Verlauf", + "sparklineBody": "Die Temperaturkarte zeichnet eine 5-Minuten-Spur unter dem Wert, wobei die Linie und die Farbverlaufsfarbe dem gleichen Warning/Critical-Paar folgen, das oben dokumentiert ist. Es ist der schnellste Weg, um zu sehen, ob der Host in einem thermischen Aufstieg ist, ohne das Detail Modal zu öffnen." + }, + "processes": { + "heading": "Prozesse mit der höchsten CPU- und Arbeitsspeichernutzung", + "intro": "Die Karten CPU-Auslastung und Arbeitsspeicher öffnen eine sortierbare Liste der 25 führenden Prozesse: nach CPU-Auslastung beim Öffnen über CPU, nach residentem Speicher beim Öffnen über Arbeitsspeicher.", + "listTitle": "Der Listendialog", + "listItems": [ + "Automatische Aktualisierung — die Liste wird bei geöffnetem Dialog alle 5 Sekunden aktualisiert. Beim Schließen enden die Abfragen.", + "Filter — das Suchfeld grenzt die Liste nach Befehl, Benutzer oder PID ein.", + "Inline bar — die primäre metrische Spalte zeichnet einen kleinen Balken, der auf den höchsten Wert in der gefilterten Liste skaliert ist, so dass das Ranking auch dann sichtbar bleibt, wenn kein Prozess in der Nähe von 100 % liegt.", + "Mobiles Layout — unter 640 px werden PID und Benutzer ausgeblendet. Befehl, CPU % und Arbeitsspeicher passen so ohne horizontales Scrollen auf den Telefonbildschirm." + ], + "captureListAlt": "Dialog Prozesse nach Arbeitsspeichernutzung — nach RSS sortierte Tabelle mit PID, Benutzer, Befehl, CPU % und Arbeitsspeicher", + "captureListCaption": "Die Speicherkarte öffnet die nach RSS (indigo accent) sortierte Liste. Die CPU-Karte öffnet die gleiche Liste, sortiert nach CPU-Nutzung (blauer Akzent).", + "detailTitle": "Angaben zu den einzelnen Prozessen", + "detailIntro": "Ein Klick auf eine Zeile öffnet einen zweiten Dialog mit Live-Daten dieses Prozesses in vier Abschnitten :", + "detailItems": [ + "Übersicht — Zustand, Elternprozess, Threadanzahl, offene Dateideskriptoren, Benutzer und Gruppe.", + "Ressourcen — CPU %, Arbeitsspeicher %, residenter Speicher (RSS), virtuelle Größe, Swap und gesamte gelesene/geschriebene I/O-Daten.", + "Befehl — Kurzname, vollständige Befehlszeile, Pfad der ausführbaren Datei und Arbeitsverzeichnis.", + "Laufzeit — Startzeitpunkt und bisherige Laufzeit." + ], + "detailRefresh": "Der Detaildialog wird alle 3 Sekunden aktualisiert. Endet der Prozess, stoppen die Abfragen und der bernsteinfarbene Hinweis Dieser Prozess wurde beendet erscheint. Die letzte erfasste Ansicht bleibt abgeblendet sichtbar und zeigt den Zustand vor dem Ende.", + "captureDetailAlt": "Prozessdetaildialog — Übersicht, Ressourcen, Befehl und Laufzeit für eine PID", + "captureDetailCaption": "Pro-Prozess-Detaildialog geöffnet von einer Listenzeile. Die Akzentfarbe stimmt mit der Karte überein, die sie geöffnet hat (blau für CPU, indigo für Memory)." + }, + "middle": { + "heading": "Mitte: Knotenmetrikdiagramme", + "body1": "Unter den Karten zeigt NodeMetricsCharts CPU-, Arbeitsspeicher- und Datenträger-I/O-Verläufe aus dem RRD-Speicher von Proxmox über /api/node/metrics. Wählbar sind 1 Stunde / 24 Stunden / 7 Tage / 30 Tage / 1 Jahr. Bei größeren Zeiträumen sinkt die Datenauflösung, damit die Anzeige flüssig bleibt.", + "body2": "Dies sind die gleichen Graphen, die die Proxmox-Web-Benutzeroberfläche für einen Knoten darstellt, nur in das dunkle Thema des Monitors konsolidiert und mit den anderen Panels ausgerichtet." + }, + "bottom": { + "heading": "Untere Reihe: Speicher- und Netzwerkübersichten", + "storageTitle": "Speicherübersichtskarte", + "storageIntro": "Eine verdichtete Ansicht des Speicherzustands des Hosts, unterteilt in drei Blöcke:", + "storageItems": [ + "Gesamtkapazität des Knotens — Summe aller VM-/LXC-Speicher und des lokalen Systemspeichers mit einem Verlaufsbalken für belegten und freien Platz.", + "Gesamtkapazität / Physische Datenträger — Rohkapazität und Anzahl der erkannten physischen Datenträger.", + "VM-/LXC-Speicher — belegter und freier Platz sowie Prozentsatz der Gastspeicher, ergänzt um deren Anzahl bei mehreren Speichern.", + "Lokaler Speicher (System) — Root-/Systemeinhängepunkt des Hosts, getrennt vom Gastpool." + ], + "storageDrillIn": "Details finden Sie im Reiter Speicher: SMART pro Datenträger, ZFS-Pools, Beobachtungsverlauf usw.", + "networkTitle": "Netzwerkübersichtskarte", + "networkBody1": "Die obere Zeile zeigt die Anzahl der aktiven Schnittstellen (physisch + Brücken kombiniert). Darunter befinden sich zwei Reihen farbiger Abzeichen für die Schnittstellen up — physische NICs in blau, Brücken in einer Sekundärfarbe. Ein Zeitrahmen-Selektor oben rechts (1 Stunde / 24 Stunden / 7 Tage / 30 Tage / 1 Jahr) steuert ein kleines RX / TX-Verkehrsdiagramm.", + "networkBody2": "Details pro Schnittstelle (IP/MAC, RRD-Diagramm, Bridge-Mitglieder, Bond-Modus usw.) stehen im Reiter Netzwerk." + }, + "refresh": { + "heading": "Aktualisierungsmodell", + "intro": "Jeder Bereich verwaltet seinen Ladezustand (loadingStates.cpu, loadingStates.storage, …), damit eine langsame Quelle die anderen nicht blockiert. Beim Laden erscheint ein pulsierender Platzhalter. Fehler werden abgefangen; ohne Temperatursensor zeigt die Karte etwa N/A statt eines Fehlers.", + "items": [ + "Obere Kennzahlenkarten — Aktualisierung etwa alle 5 Sekunden. CPU und Temperatur erhalten zusätzlich jede Sekunde Daten vom Vitaldaten-Sampler.", + "Knotenmetrikdiagramm — lädt beim Öffnen sowie bei Änderung von Zeitraum oder Sprache. Erforderliche Wiederholungsversuche erfolgen nach 60 Sekunden.", + "Speicherkarte — Aktualisierung etwa alle 60 Sekunden. SMART-Daten bleiben länger im Cache; der Speicherreiter fordert bei Bedarf eine neue Abfrage an.", + "Netzwerkkarte — Zusammenfassung alle 59 Sekunden und Verkehrsdiagramm alle 60 Sekunden für den gewählten Zeitraum.", + "Manuell aktualisieren — die Schaltfläche Aktualisieren im Kopf lädt alle Bereiche sofort neu." + ] + }, + "dataCollected": { + "heading": "Wie die Daten gesammelt werden", + "headerCard": "Karte", + "headerEndpoint": "Endpunkt", + "headerSource": "Quelle", + "rows": [ + { + "card": "Statusanzeige im Kopf", + "endpoint": "/api/health", + "source": "Der zwischengespeicherte Gesamtstatus, der vom Health Monitor in jedem Zyklus erzeugt wird." + }, + { + "card": "CPU / RAM / Swap / Betriebszeit", + "endpoint": "/api/system", + "source": "/proc/stat, /proc/meminfo, /proc/uptime mit Kurzfenster-CPU-Probenahme." + }, + { + "card": "Host-Info (Kernel, BIOS, Distro)", + "endpoint": "/api/info", + "source": "uname -a, dmidecode, PVE-Version. Pro Prozess zwischengespeichert." + }, + { + "card": "Speicher / Netzwerk / VMs Karten", + "endpoint": "/api/storage/summary, /api/network/summary, /api/vms", + "source": "Siehe die dedizierten Tabs für jeden. Die Kopfkarten zeigen eine verdichtete Ansicht von den gleichen Endpunkten." + }, + { + "card": "Aktualisierungsintervall", + "endpoint": "—", + "source": "Systemdaten alle 5 Sekunden; Speicher, VMs und Netzwerkzusammenfassung alle 59 Sekunden. Aktualisieren im Kopf lädt alle Bereiche sofort neu." + } + ], + "codeComment1": "# Aufruf für die Statusanzeige im Kopf", + "codeComment2": "# öffentlich, kein Token", + "codeComment3": "# Authentifizierter Snapshot, der von den Karten verwendet wird" + }, + "whereNext": { + "heading": "Wohin als nächstes", + "items": [ + { + "label": "Gesundheitsmonitor", + "href": "/docs/monitor/health-monitor", + "tail": " — der Dialog hinter der Statusanzeige im Kopf: zehn Kategorien sowie Ausblenden und Unterdrücken von Meldungen." + }, + { + "label": "API-Referenz", + "href": "/docs/monitor/api", + "tail": " — die Endpunkte system, info und health." + }, + { + "label": "Benachrichtigungen", + "href": "/docs/monitor/notifications", + "tail": "— wie sich die gleichen Status in Telegram / Discord / E-Mail-Nachrichten verwandeln." + }, + { + "label": "Dashboard-Index", + "href": "/docs/monitor/dashboard", + "tail": " — die übrigen Dashboard-Reiter auf einen Blick." + }, + { + "label": "Architektur", + "href": "/docs/monitor/architecture", + "tail": " — die Hintergrundthreads und APIs hinter dieser Ansicht." + } + ] + } +} diff --git a/web/messages/de/docs/monitor/dashboard/terminal.json b/web/messages/de/docs/monitor/dashboard/terminal.json new file mode 100644 index 00000000..44e7a68f --- /dev/null +++ b/web/messages/de/docs/monitor/dashboard/terminal.json @@ -0,0 +1,174 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Dashboard: Terminal | ProxMenux-Dokumentation", + "description": "Browser-Shell auf dem Proxmox-Host: bis zu 4 Terminals in Rasteransicht, Tastaturhilfen für Mobilgeräte (ESC, TAB, Pfeile, Ctrl-Kombinationen), integrierte Befehlsübersicht mit cheat.sh und JWT-Schutz." + }, + "header": { + "title": "Dashboard: Terminal Tab", + "description": "Eine echte Shell-Sitzung auf dem Proxmox-Host im Browser: bis zu vier Terminals gleichzeitig, Tastaturhilfen für Mobilgeräte und eine integrierte Befehlsübersicht im selben Design wie das übrige Dashboard.", + "section": "ProxMenux Monitor · Übersicht" + }, + "intro": { + "title": "Ein echter PTY im Browser", + "body": "Das Terminal legt über flask_terminal_routes eine serverseitige PTY an, verbindet sie per WebSocket mit xterm.js im Browser und läuft als root, dem Benutzer der systemd-Unit. Wie bei ssh root@<host> stehen vim, tmux, ncurses-Werkzeuge und die Proxmox-CLIs (qm, pct, pvesh, pvecm) zur Verfügung. Jede PTY exportiert PROXMENUX_TERMINAL=monitor. Alle untergeordneten bash-Prozesse, auch ein späterer Start von menu, erben die Variable, damit ProxMenux den Browserterminal-Kontext erkennt." + }, + "singleAlt": "ProxMenux Monitor Terminal Registerkarte — Einzelterminalsitzung mit Fastfetch-Systemzusammenfassung beim Login", + "singleCaption": "Ein Host-Terminal offen — die obige Symbolleiste zeigt die Anzahl (1 / 4 Terminals), + New, Search, Clear und Close. Die mobilen Tastaturhelfer erscheinen unter dem Terminal auf Touch-Geräten.", + "target": { + "heading": "Verbindungsziel", + "body1": "Die Registerkarte Terminal öffnet eine Shell auf dem Proxmox-Host selbst - die gleiche Anmeldung, die Sie über SSH erhalten würden. Jeder Tab öffnet ein brandneues Host-Terminal.", + "body2": "Um einen LXC-Container aus dem Browser zu erreichen, verwenden Sie die dedizierte Console-Taste auf jeder laufenden CT-Karte in der VMs & LXCs tab. Es öffnet ein Modal, auf dem pct enter <vmid> ausgeführt wird, und verwendet die gleiche mobilfreundliche Symbolleiste, die unten beschrieben wird." + }, + "menuGuard": { + "heading": "Schutz bei der Selbstaktualisierung von menu in diesem Terminal", + "body1": "Bei der Selbstaktualisierung ersetzt menu nach Bestätigung seinen Skriptbaum und lädt sich neu. Über SSH oder die Proxmox-Konsole funktioniert das, im Browser würde dabei jedoch die PTY der Shell beendet und der WebSocket getrennt. Deshalb lesen check_updates_stable, check_updates_beta und apply_release_channel die Variable PROXMENUX_TERMINAL und erkennen den Monitor-Kontext.", + "body2": "Dann wird der Ja/Nein-Dialog durch einen Hinweis mit dem offiziellen Installationsbefehl ersetzt: bash -c \"$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)\" für Stable bzw. die entsprechende URL mit install_proxmenux_beta.sh für Beta. Die Aktualisierung wird über SSH oder die Proxmox-Hostkonsole ausgeführt; im Browserterminal lesen und bestätigen Sie nur den Hinweis." + }, + "fourTerminals": { + "heading": "Bis zu vier Terminals gleichzeitig", + "intro": "Mit der Registerkarte können Sie bis zu vier Host-Terminals gleichzeitig öffnen. Jeder bekommt seinen eigenen PTY und seinen eigenen WebSocket - es sind völlig unabhängige Sitzungen. Zwei Layouts wechseln mit den Icons neben der Schaltfläche \"Neu\":", + "items": [ + "Reiteransicht — ein sichtbares Terminal, die übrigen als benannte Reiter oben (Terminal 1, Terminal 2…). Gut für eine Aufgabe, während die anderen im Hintergrund laufen.", + "Rasteransicht — alle offenen Terminals gleichzeitig in einem 2×2-Raster. So können Sie htop und iftop beobachten und im dritten Terminal bearbeiten, ohne die Ansicht zu wechseln." + ], + "outro": "Die Werkzeugleiste zeigt die Anzahl (1/4 Terminals, 4/4 Terminals). + Neu öffnet einen Reiter, das kleine × in dessen Kopf schließt ihn. Die große rote Schaltfläche Schließen oben beendet alle Terminals." + }, + "gridAlt": "ProxMenux Monitor Terminal Registerkarte — Rasteransicht mit vier Host-Terminals mit ls, Netzwerkkonfiguration, iftop und ProxMenux Hauptmenü nebeneinander", + "gridCaption": "Rasteransicht (4 / 4 Terminals) — vier unabhängige Host-PTYs parallel mit Verzeichnisliste, /etc/network/interfaces, iftop und ProxMenux-Hauptmenü. Der Layout-Schalter in der Werkzeugleiste wechselt zwischen Raster und Reitern.", + "keyboard": { + "heading": "Tastaturhilfen für Mobilgeräte", + "intro": "Telefon- und Tablet-Tastaturen bieten meist kein ESC, TAB, keine Pfeiltasten oder Tastenkombinationen mit Modifikatoren. Diese werden für vim, nano, htop und TUI-Menüs benötigt. Der Terminalreiter zeigt daher auf kleinen oder berührungsempfindlichen Geräten eine Reihe von Touch-Schaltflächen darunter an :", + "headerButton": "Schaltfläche", + "headerSends": "Sendet", + "headerUse": "Typische Verwendung", + "rows": [ + { + "button": "ESC", + "sends": "\\x1b", + "use": "Einfügemodus in vim verlassen, einen TUI-Dialog abbrechen, eine Suche beenden." + }, + { + "button": "TAB", + "sends": "\\t", + "use": "Pfadvervollständigung und Feldnavigation in dialog/whiptail." + }, + { + "button": "↑ ↓ ← →", + "sends": "\\x1bO[ABCD]", + "use": "Shell-Historie, Cursorbewegung, Menünavigation." + }, + { + "button": "↵ Eingabetaste", + "sends": "\\r", + "use": "Bestätigen. Manche Bildschirmtastaturen ersetzen Enter durch Los/Fertig; diese Schaltfläche ist eindeutig." + }, + { + "button": "Ctrl ▾", + "sends": "Auswahlliste", + "useRich": true + } + ], + "ctrlIntro": "Drei Kontrollsequenzen:", + "ctrlItems": [ + "Ctrl+C — laufenden Befehl abbrechen oder unterbrechen (\\x03).", + "Ctrl+X — nano beenden (\\x18).", + "Ctrl+R — Rückwärtssuche im bash-Verlauf (\\x12)." + ], + "modalTitle": "Dieselbe Werkzeugleiste im LXC-Konsolendialog", + "modalBody": "Die über VMs und LXCs → Konsole gestartete Containerkonsole zeigt dieselben Tastaturhilfen unter dem Dialog. Beim Verbinden gibt sie automatisch pct enter <vmid> ein, sodass Sie direkt im Container landen." + }, + "lxcAlt": "ProxMenux Monitor — LXC-Konsolendialog, Terminal: ubuntu (ID: 103), mit derselben mobilen Werkzeugleiste (ESC, TAB, Pfeile, Enter, Ctrl) darunter", + "lxcCaption": "LXC-Konsolendialog, geöffnet über VMs und LXCs → Konsole. Der Kopf zeigt den Zielcontainer (Terminal: ubuntu (ID: 103)), darunter erscheint dieselbe Touch-Werkzeugleiste.", + "search": { + "heading": "Befehle suchen — integrierte Kurzübersicht", + "intro": "Die blaue Schaltfläche Suchen öffnet eine fehlertolerante Befehlssuche. Geben Sie einige Buchstaben eines Linux- oder Proxmox-Befehls (ls, tar, qm, pct, zpool, systemctl…) ein. Der Dialog zeigt Beispiele mit An aktives Terminal senden. So müssen Sie zur Suche nach einer Option keinen anderen Browserreiter öffnen.", + "modalAlt": "ProxMenux Monitor — Dialog Befehle suchen mit fehlertoleranter Suche nach Linux- und Proxmox-Befehlen über cheat.sh und mehreren ls-Beispielen", + "modalCaption": "Befehlssuche nach ls — jedes Ergebnis zeigt Befehl, Beschreibung und einen kleinen Sendepfeil zum aktiven Terminal. Unten rechts steht die Datenquelle (Bereitgestellt von cheat.sh).", + "aboutLabel": "Über cheat.sh:", + "aboutBody": "ist eine quelloffene, von der Community gepflegte Kurzübersicht mit kurzen Praxisbeispielen für Hunderte von Linux-Befehlen, Administrationswerkzeugen und Programmiersprachen. Ursprünglich für curl cheat.sh/<command> im Terminal entwickelt, ist sie auch im Browser erreichbar. ProxMenux Monitor leitet die Abfragen serverseitig weiter, damit der Dialog denselben Ursprung wie das Dashboard verwendet.", + "headerSource": "Quelle", + "headerWhen": "Wenn es verwendet wird", + "headerWhat": "Was du siehst", + "onlineLabel": "(online)", + "onlineWhen": "Wenn der Host einen Internetzugang hat und der cheat.sh-Proxy antwortet.", + "onlineWhat": "Mehrere Praxisbeispiele pro Befehl mit einer Beschreibung darüber. Der Statuspunkt im Dialogkopf ist grün.", + "fallbackLabel": "Lokale Ersatzliste", + "fallbackWhen": "Wenn cheat.sh nicht erreichbar ist (Offline-Host, restriktive Firewall, cheat.sh-Ausfall).", + "fallbackWhat": "Eine mitgelieferte Liste gängiger Linux- und Proxmox-Befehle. Kleinerer Katalog, aber immer verfügbar. Der Statuspunkt ist rot.", + "sendingNote": "So funktioniert das Senden: Der kleine Pfeil neben dem Ergebnis sendet den Befehlstext an das aktive Terminal: den gewählten Reiter oder das zuletzt angeklickte Terminal im Raster. Der Dialog schließt sich automatisch, sodass Sie direkt Enter drücken können." + }, + "auth": { + "heading": "Authentifizierung", + "items": [ + "Der Browser fordert zunächst über POST /api/terminal/ticket mit JWT im Authorization-Header ein Einmalticket an. Dieses wird beim Öffnen des WebSockets übergeben und läuft nach 5 Sekunden ab. Bei aktivierter Authentifizierung wird eine Verbindung ohne gültiges Ticket geschlossen, bevor eine PTY angelegt wird.", + "Bei einem Reverse Proxy muss dieser WebSocket-Upgrades weiterleiten. Beispiele für Nginx / Caddy / Traefik stehen unter Zugriff und Authentifizierung." + ] + }, + "clipboard": { + "heading": "Zwischenablage, Scrollback und Größenänderung", + "items": [ + "Kopieren und Einfügen — über die Zwischenablage des Browsers. Text mit Maus oder Trackpad auswählen und das Systemtastenkürzel verwenden (Cmd+C unter macOS, Ctrl+Shift+C unter Linux/Windows). Linux-Desktops unterstützen auch Einfügen per Mittelklick.", + "Scrollback — mit Mausrad oder Zwei-Finger-Geste blättern. xterm.js hält die letzten mehreren Tausend Zeilen im Speicher.", + "Größe ändern — bei einer Größenänderung des Dashboardbereichs wird die PTY-Fenstergröße angepasst, damit htop und vim korrekt dargestellt werden.", + "Wiederverbinden beim Zurückkehren — ein App-Wechsel auf Telefon oder Tablet, etwa dem iPad, kann den WebSocket trennen. Der Terminalreiter erkennt die Sichtbarkeitsänderung und verbindet sich beim Zurückkehren automatisch neu, mit 15 Sekunden Zeitlimit für langsame VPN-Verbindungen." + ] + }, + "disconnect": { + "heading": "Ursachen für Verbindungsabbrüche", + "intro": "Die häufigsten Gründe, warum eine Sitzung endet und was mit jedem zu tun ist:", + "headerCause": "Ursache", + "headerFix": "Lösung", + "rows": [ + { + "cause": "Sitzungs-JWT beim Öffnen oder Wiederverbinden abgelaufen (24 Stunden).", + "fix": "Aktualisieren Sie die Seite und melden Sie sich erneut an. Das Terminal ist nicht für unbeaufsichtigte Sitzungen konzipiert, so dass die JWT-Lebensdauer dem regulären Dashboard-Login entspricht." + }, + { + "cause": "Inaktivitätszeitlimit des Reverse Proxys.", + "fix": "Erhöhen Sie proxy_read_timeout in Nginx oder den entsprechenden Wert in Caddy / Traefik (Beispiele unter Zugriff und Authentifizierung)." + }, + { + "cause": "Telefon oder Tablet im Ruhezustand.", + "fix": "Beim Aufwecken des Geräts verbindet sich der Reiter automatisch neu (15 Sekunden Zeitlimit für VPN-Verbindungen). Falls nicht, laden Sie ihn neu." + }, + { + "cause": "Service-Neustart auf dem Host.", + "fix": "Jeder Neustart von proxmenux-monitor.service beendet alle PTYs. Öffnen Sie neue Terminals, sobald das Dashboard fertig geladen ist." + } + ] + }, + "warning": { + "title": "Das Terminal ist eine Root-Shell auf dem Host", + "body": "Das Terminal übernimmt den Benutzer der systemd-Unit (root) und hat volle Rechte auf dem Proxmox-Host. Konfigurieren Sie Benutzername, Passwort und 2FA unter Zugriff und Authentifizierung, bevor Sie Zugriffe außerhalb des lokalen Netzes erlauben. Bei deaktivierter Authentifizierung kann jeder mit Zugriff auf Port 8008 ohne weitere Rückfragen oder SSH-Zugangsdaten eine Root-Shell öffnen. Nutzen Sie extern Secure Gateway (Tailscale) oder einen HTTPS-Reverse-Proxy, statt den Port im Internet freizugeben." + }, + "whereNext": { + "heading": "Wohin als nächstes", + "items": [ + { + "label": "Zugriff und Authentifizierung", + "href": "/docs/monitor/access-auth", + "tail": " — Reverse-Proxy-Beispiele mit den für das Terminal erforderlichen WebSocket-Upgrade-Zeilen." + }, + { + "label": "Architektur", + "href": "/docs/monitor/architecture", + "tail": " — WebSocket-Transport (HTTP über flask-sock bzw. HTTPS / WSS über gevent)." + }, + { + "label": "API-Referenz", + "href": "/docs/monitor/api", + "tail": " — die WebSocket-Endpunkte /ws/terminal und /ws/script/ neben der übrigen API." + }, + { + "label": "Integrationen → Secure Gateway", + "href": "/docs/monitor/integrations", + "tail": "- wenn Sie einen Terminalzugriff von außerhalb des LAN wünschen, ohne den Port 8008 freizulegen." + }, + { + "label": "Dashboard-Index", + "href": "/docs/monitor/dashboard", + "tail": " — die anderen Reiter." + } + ] + } +} diff --git a/web/messages/de/docs/monitor/dashboard/vms-lxcs-app.json b/web/messages/de/docs/monitor/dashboard/vms-lxcs-app.json new file mode 100644 index 00000000..a3477170 --- /dev/null +++ b/web/messages/de/docs/monitor/dashboard/vms-lxcs-app.json @@ -0,0 +1,245 @@ +{ + "meta": { + "title": "LXC-App-Reiter: Erkennung, Links und Versionsverfolgung | ProxMenux", + "description": "Entdecken und registrieren Sie LXC-Anwendungen, erstellen Sie Weblinks und verfolgen Sie optional installierte und verfügbare Versionen." + }, + "header": { + "title": "LXC-App-Reiter: Erkennung, Links und Versionsverfolgung", + "description": "Geben Sie jeder LXC-Anwendung eine dauerhafte Identität, einen Webzugang und einen optionalen Versionsnachweis, ohne die Registrierung an Updates zu koppeln." + }, + "intro": { + "p1": "Die Registerkarte App zeichnet auf, welche Anwendungen zu einer LXC gehören. Eine Registrierung kann nur einen Namen und einen Weblink enthalten oder auch einen Detektor für installierte Versionen und eine Upstream-Quelle enthalten.", + "p2": "Das Verfahren zur Softwareänderung wird separat im Reiter Aktualisierungen konfiguriert. Das Speichern einer App startet niemals einen Installer oder Updater.", + "callout": "Registrierung, Versionsverfolgung und Aktualisierung sind drei unabhängige Funktionen. Jeder kann verwendet werden, ohne die anderen beiden zu benötigen.", + "dashboardTitle": "Von der Registrierung bis zum Apps Launcher", + "dashboard": "Jeder hier gespeicherte Weblink erscheint auch als Karte im übergeordneten Apps-Reiter. Diese LXC-Seite bleibt die maßgebliche Stelle für Name, Logo, Links und Versionsverfolgung." + }, + "overview": { + "heading": "Was ein Anwendungsdatensatz bietet", + "lead": "Ein einzelner gespeicherter Datensatz kann Folgendes umfassen:", + "items": [ + "Anzeigename und ein an das Farbschema angepasstes Logo.", + "Ein oder mehrere anklickbare Weblinks, die aus der LXC-Adresse, dem Schema und dem gespeicherten Port erstellt wurden.", + "Ein optionaler Detektor für die derzeit im LXC installierte Version.", + "Eine optionale GitHub, HTTP JSON oder Docker Hub-Quelle für die neueste verfügbare Version.", + "Benachrichtigungen über neue Versionen und Einstellungen zur Aufnahme in den Aktualisierungszähler pro App.", + "Ein entsprechender Abschnitt auf der Registerkarte Updates, auch wenn die Versionsverfolgung deaktiviert ist." + ] + }, + "discovery": { + "heading": "Zwischengespeicherte Erkennung und Anwendungen suchen", + "lead": "Anwendungsvorschläge sind Teil des per-LXC modalen Cache. Der Start-Scan bereitet sie im Hintergrund vor, so dass das Öffnen des App-Tabs zwischengespeicherte Ergebnisse sofort anzeigen kann.", + "items": [ + "Das Öffnen des App-Reiters startet keinen neuen Katalogscan und fragt den LXC nicht wiederholt ab.", + "Anwendungen suchen startet ausdrücklich eine neue Erkennung für diesen LXC. Verwenden Sie dies nach einer Softwareinstallation bei bereits laufendem ProxMenux.", + "Die vorherige Liste bleibt sichtbar, während der explizite Scan ausgeführt wird. Neue Übereinstimmungen werden hinzugefügt, wenn sie beendet sind.", + "Wird keine neue Übereinstimmung gefunden, steht das Ergebnis neben den Aktionen. Anwendung registrieren bleibt für manuelle Einträge verfügbar.", + "Das Speichern, Entfernen oder Wiederherstellen einer App aktualisiert den gleichen Cache sofort. Das Starten oder Wiederherstellen eines LXC aktualisiert nur diesen Gast durch sein bestehendes Lebenszyklusereignis." + ], + "callout": "Ein Vorschlag ist keine Registrierung. Er bleibt schreibgeschützt, bis Registrieren gewählt und das Formular gespeichert wird." + }, + "registration": { + "heading": "Eine Anwendung registrieren", + "lead": "Ein erkannter Vorschlag und eine manuelle Aufzeichnung verwenden denselben Editor:", + "steps": [ + "Klicken Sie bei einem Vorschlag auf Registrieren oder auf Anwendung registrieren, um im Katalog zu wählen oder einen eigenen Namen einzugeben.", + "Überprüfen Sie den Namen und das Logo, die im Katalog vorgeschlagen werden.", + "Ergänzen Sie die benötigten Weblinks. Erkannte lauschende Ports werden als Vorschläge angeboten, aber nicht automatisch gespeichert.", + "Lassen Sie Upstream-Version verfolgen für reine Link-Datensätze deaktiviert oder aktivieren Sie es und prüfen Sie den Detektor für die installierte Version sowie die Upstream-Quelle.", + "Bei aktivierter Versionsverfolgung Detektor testen verwenden und danach speichern.", + "Nach der Bearbeitung Fertig wählen. App und Aktualisierungen verwenden denselben aktualisierten Cache-Datensatz." + ] + }, + "catalog": { + "heading": "Kataloggestützte Registrierung", + "lead": "Der Katalog liefert Standardwerte, aber der gespeicherte Datensatz bleibt editierbar.", + "items": [ + "Suchergebnisse können den kanonischen Namen, das Logo und die gemeinsamen Web-Ports vorfüllen.", + "Bekannte Versionsdetektoren basieren auf echten Paketnamen, Binärdateien, Dateien, Python-Distributionen, OCI-Beschriftungen oder Befehlen und nicht auf einer universellen /root/.app-Annahme.", + "Verifizierte Laufzeitüberschreibungen haben Vorrang, wenn eine Installation einen Pfad verwendet, der sich von den Metadaten des Installationsprogramms unterscheidet.", + "Proxmox VE Helper-Scripts-Marker wie /root/.slug bleiben ein Kompatibilitätssignal für neuere Helferinstallationen, nicht der einzige Detektor.", + "Alle vorgeschlagenen Werte sind vor dem Speichern bearbeitbar, um offizielle Installationsprogramme und manuelle Installationen abzudecken." + ] + }, + "docker": { + "heading": "Wie Docker LXCs dargestellt sind", + "lead": "Für einen LXC, dessen primäre Plattform Docker ist, ist Docker die auf LXC registrierte Anwendung.", + "items": [ + "Eine containerisierte Arbeitslast wie Portainer, Frigate oder Vaultwarden wird nicht als unabhängige native LXC-Anwendung vorgeschlagen.", + "Docker-Dienste mit veröffentlichten TCP-Ports werden im Docker-Editor als optionale Weblinks angeboten.", + "Jeder vorgeschlagene Link zeigt den Service, Host-Port und Container-Port an. Nur Links, die ein Webinterface bereitstellen, sollten gespeichert werden.", + "Das globale Docker-Logo wird verwendet, wenn ein Link kein bestimmtes Logo hat. Ein Per-Link-Logo überschreibt es, wenn eines konfiguriert ist.", + "Nachdem Docker registriert wurde, werden Docker Engine und Bildaktualisierungen zusammen im Abschnitt auf der Registerkarte Updates angezeigt." + ], + "callout": "Diese Struktur verhindert, dass ein Docker-Workload wie eine direkt im LXC installierte Software aussieht, während gleichzeitig schnelle Verbindungen zu seinen Schnittstellen erhalten bleiben." + }, + "webLinks": { + "heading": "Weblinks und Logos", + "lead": "Weblinks funktionieren mit oder ohne Versionsverfolgung.", + "items": [ + "Jeder Link speichert ein Schema, einen Port, eine optionale Beschreibung und eine optionale Logo-URL.", + "Die angezeigte URL verwendet die aktuelle Adresse, die bereits für den LXC erkannt wurde; die Adresse wird nicht in jedem App-Record dupliziert.", + "Ein Link ohne eigenes Logo fällt auf das App-Level-Logo zurück.", + "Mehrere Links können eine Admin-Schnittstelle, API, eine sekundäre Benutzeroberfläche oder einen anderen Endpunkt derselben App darstellen.", + "Eine nur gespeicherte Link-App wird auch in Updates angezeigt, wo ein benutzerdefinierter Updater später konfiguriert werden kann." + ] + }, + "tracking": { + "heading": "Optionale Versionsverfolgung", + "lead": "Die Versionsverfolgung kombiniert einen Detektor für die installierte Version mit einer optionalen Upstream-Quelle. Beide Seiten werden unabhängig geprüft.", + "colMethod": "Methode zur Ermittlung der installierten Version", + "colUse": "Verwendung", + "detectorRows": [ + { + "method": "dpkg / apk", + "use": "Lies die installierte Paketversion aus Debian, Ubuntu oder Alpine Paket-Metadaten." + }, + { + "method": "binary", + "use": "Führt einen absoluten binären Pfad oder einen Befehlsnamen mit Versionsargumenten aus." + }, + { + "method": "file + regex", + "use": "Lies eine echte Datei und extrahiert die Version mit einer Capture-Gruppe." + }, + { + "method": "docker label / docker exec", + "use": "Lesen Sie ein OCI-Versionslabel oder führen Sie einen Versionsbefehl in einem Docker-Container aus." + }, + { + "method": "python distribution", + "use": "Verwendet importlib.metadata über den ausgewählten Python-Interpreter." + }, + { + "method": "command", + "use": "Führt einen fortgeschrittenen Befehl im argv-Format ohne Shell aus und extrahiert die Version aus seiner Ausgabe." + }, + { + "method": "manual", + "use": "Speichert eine manuell eingegebene Version; sie muss nach dem Upgrade der App geändert werden." + }, + { + "method": "OCI image", + "use": "Für Container aus OCI manager Apps. Liest App- und Image-Versionen aus dem Installationsdatensatz und vergleicht den installierten Digest mit dem veröffentlichten Registry-Digest. Keine Konfiguration erforderlich." + } + ], + "sourcesHeading": "Quellen für die verfügbare Version", + "sources": [ + "GitHub-Repository: neueste Version oder Tag aus einem öffentlichen owner/name-Repository.", + "HTTP JSON: ein öffentlicher Endpunkt plus ein gepunkteter Pfad wie data.version oder releases[0].tag_name.", + "Docker Hub: versionierte Tags, die durch einen regulären Ausdruck gefiltert werden. Eine Live-Vorschau zeigt echte übereinstimmende Tags, bevor der Datensatz gespeichert wird.", + "Veränderliche Tags wie latest, stable oder lts enthalten keine Version. Verfolgen Sie solche Images anhand ihres Digests über die Docker-Image-Aktualisierungen." + ], + "regexHeading": "Schreiben des Capture-Ausdrucks", + "regexLead": "Der reguläre Ausdruck muss die Version in seiner ersten Erfassungsgruppe zurückgeben.", + "regexRules": [ + "Passen Sie den Text an, der von der ausgewählten Binär-, Datei-, Befehls- oder Tag-Quelle ausgegeben wird; raten Sie keinen generischen Pfad.", + "Schreiben Sie literale Punkte als \\., damit sie nicht für beliebige Zeichen stehen.", + "Lassen Sie einen führenden v nur zu, wenn die Quelle ihn enthalten kann.", + "Fügen Sie Suffixe wie Pre-Release oder Distro-Revisionen nur dann hinzu, wenn sie für den Vergleich aussagekräftig sind.", + "Vor dem Speichern Detektor testen verwenden und prüfen, ob die angezeigte installierte Version zum LXC passt." + ], + "regexExampleLead": "Gemeinsame semantische Versionserfassung:", + "regexExample": "v?(\\d+\\.\\d+\\.\\d+)", + "regexCallout": "Ein erfolgreiches Regex-Match ist kein Beweis dafür, dass der Detektorpfad korrekt ist. Der Pfad oder das Paket muss auch in der registrierten realen Anlage vorhanden sein." + }, + "updater": { + "heading": "Versionsverfolgung und -aktualisierung sind unabhängig", + "lead": "Der Reiter Aktualisierungen legt einen App-Abschnitt an, sobald ein Anwendungsdatensatz gespeichert wird.", + "items": [ + "Ein Link-only-Record zeigt an, dass die Versionsverfolgung nicht konfiguriert ist, aber dennoch einen benutzerdefinierten Update-Befehl erhalten kann.", + "Eine App mit Tracking, aber ohne ausführbare Methode zeigt eine neutrale Nachricht an, in der ein benutzerdefinierter Befehl angefordert wird.", + "Eine App mit einem verifizierten Proxmox VE Helper-Scripts-Wrapper kann diesen integrierten Updater auch dann verwenden, wenn die Registrierung über einen Weblink begann.", + "Durch Hinzufügen oder Bearbeiten eines Updaters wird der Detektor oder die Upstream-Quelle, die auf der Registerkarte App gespeichert ist, nicht geändert." + ] + }, + "states": { + "heading": "Versionsangaben auf der App-Karte", + "colState": "Zustand", + "colDisplay": "Anzeige", + "colMeaning": "Bedeutung", + "rows": [ + { + "state": "Update verfügbar", + "display": "Verfügbare Version in lila mit einem nach oben gerichteten Symbol", + "meaning": "Die installierten und Upstream-Versionen unterscheiden sich." + }, + { + "state": "Aktuell", + "display": "Installierte und neueste Versionen ohne den lila Alarm", + "meaning": "Der letzte Check fand keine neuere Upstream-Version." + }, + { + "state": "Versionsprüfung ausstehend", + "display": "Prüfung läuft oder steht aus", + "meaning": "Der Datensatz ist konfiguriert, hat aber noch nicht beide Prüfungen abgeschlossen." + }, + { + "state": "Tracking deaktiviert", + "display": "Nur Weblinks; kein Versionsvergleichsblock", + "meaning": "Der Datensatz bleibt gültig und kann immer noch einen Updater haben." + }, + { + "state": "Prüffehler", + "display": "Bernstein Erklärung im Inneren der Karte", + "meaning": "Der zuvor gespeicherte Zustand bleibt sichtbar, während der Detektor oder Upstream-Fehler gemeldet wird." + } + ] + }, + "management": { + "heading": "Verwalten von gespeicherten und vorgeschlagenen Apps", + "lead": "Die Aktionen am unteren Rand des Tabs haben unterschiedliche Rollen:", + "items": [ + "Anwendungen suchen aktualisiert die Erkennung nur für diesen LXC.", + "Registrieren Sie eine andere Anwendung öffnet den Katalog und den manuellen Editor, ohne den LXC neu zu scannen.", + "Bearbeiten zeigt je Karte Entfernen, Prüfen, Benachrichtigungen und Felder bearbeiten.", + "Ausblenden entfernt einen unerwünschten Vorschlag. Ausgeblendete Erkennungen lassen sich in der Registrierungsübersicht wiederherstellen.", + "Prüfen aktualisiert die Versionsdaten der gewählten gespeicherten App und sucht keine neuen Apps." + ] + }, + "troubleshooting": { + "heading": "Häufige Situationen", + "colProblem": "Situation", + "colResolution": "Lösung", + "rows": [ + { + "problem": "Software wurde installiert, nachdem ProxMenux gestartet wurde", + "resolution": "Wählen Sie Anwendungen suchen. Der explizite Scan aktualisiert die zwischengespeicherten Vorschläge dieses LXC." + }, + { + "problem": "Keine Anwendung festgestellt", + "resolution": "Registrieren Sie es manuell. Ein Name und ein Weblink sind ausreichend; Tracking kann später hinzugefügt werden." + }, + { + "problem": "Der vorgeschlagene Detektor gibt die falsche Version zurück", + "resolution": "Öffnen Sie Felder bearbeiten, wählen Sie den realen Paket-, Binär- oder Dateipfad aus und testen Sie den Detektor vor dem Speichern." + }, + { + "problem": "Ein Docker Workload wird nicht als LXC App angeboten", + "resolution": "Registrieren Sie Docker und fügen Sie die veröffentlichte Benutzeroberfläche des Workloads als Docker-Weblink hinzu. Image-Updates bleiben im Docker Abschnitt." + }, + { + "problem": "Eine gespeicherte App hat keinen Update-Button", + "resolution": "Öffnen Sie die Registerkarte Updates und konfigurieren Sie die Aktualisierungsmethode. Versions-Tracking allein definiert nicht, wie ein Update installiert wird." + } + ] + }, + "figures": { + "catalog": { + "alt": "Anwendungsregistrierungskatalog mit Suchergebnissen, Logos, Ports und Detektorfeldern", + "caption": "Katalog-Metadaten beschleunigen die Registrierung, während jeder vorgeschlagene Wert editierbar bleibt." + }, + "webLinks": { + "alt": "Gespeicherte LXC-Anwendungskarte mit einem anklickbaren Weblink", + "caption": "Ein Link-Only-Record ist gültig: Das Versions-Tracking kann deaktiviert bleiben und ein Updater kann unabhängig hinzugefügt werden." + }, + "tracking": { + "alt": "Optionale Felder für den Detektor der installierten Version und die Upstream-Quelle", + "caption": "Die Installationsversionserkennung und die Upstream-Quelle werden separat konfiguriert und getestet." + }, + "card": { + "alt": "Gespeicherte Anwendungskarte mit installierten und verfügbaren Versionen sowie einem Weblink", + "caption": "Die Karte kombiniert Identität, Versionsnachweis und Webzugriff, ohne Update-Aktionen von diesem Tab aus auszuführen." + } + } +} diff --git a/web/messages/de/docs/monitor/dashboard/vms-lxcs-updates.json b/web/messages/de/docs/monitor/dashboard/vms-lxcs-updates.json new file mode 100644 index 00000000..05878360 --- /dev/null +++ b/web/messages/de/docs/monitor/dashboard/vms-lxcs-updates.json @@ -0,0 +1,203 @@ +{ + "meta": { + "title": "LXC-Aktualisierungen: Betriebssystem, Apps und Docker | ProxMenux", + "description": "Konfigurieren und Ausführen von Betriebssystem-, Anwendungs-, Docker Engine- und Docker-Image-Updates aus einem LXC-Container." + }, + "header": { + "title": "LXC-Aktualisierungen: Betriebssystem, Apps und Docker", + "description": "Überprüfen Sie jedes Update-Ziel an einem Ort, führen Sie es unabhängig aus oder kombinieren Sie ausgewählte Ziele in einer kontrollierten Massenaktion." + }, + "intro": { + "p1": "Der Reiter Aktualisierungen trennt Versionserkennung und Installation. Registrierung und optionale Versionsverfolgung erfolgen im App-Reiter; ausführbare Aktualisierungsmethoden werden hier verwaltet.", + "p2": "Eine gespeicherte Anwendung wird in Updates angezeigt, auch wenn sie nur einen Weblink enthält. Die Versionsverfolgung ist optional und ein Updater kann unabhängig konfiguriert werden.", + "callout": "Die Registrierung wählt keinen Updater aus. Wird ein passender Helper-Scripts-Updater erkannt, wählen und speichern Sie Helper-Scripts oder Eigener Befehl. Die Erkennung garantiert keine Kompatibilität. Die Wahl gilt pro App, auch wenn mehrere denselben LXC nutzen." + }, + "overview": { + "heading": "Was der Tab enthält", + "lead": "Jedes verfügbare Ziel hat seinen eigenen Abschnitt und seine eigene Aktion:", + "items": [ + "Betriebssystempakete für Debian-, Ubuntu- und Alpine-Container.", + "Ein Abschnitt je registrierter Anwendung, auch für Datensätze mit nur einem Link.", + "Ein Docker-Abschnitt, wenn Docker registriert ist, wobei Docker Engine und getaggte Images gruppiert sind.", + "Ein konfigurierbarer Abschnitt Sammelaktualisierung mit anschließenden Sicherungs-, Neustart- und Zeitplanoptionen." + ] + }, + "mechanisms": { + "heading": "Wie eine Aktualisierungsmethode ausgewählt wird", + "lead": "Der integrierte Weg für Proxmox VE Helper-Scripts verwendet den offiziellen update-apps-Mechanismus. Andere Installationen verwenden die passende Paket-, Docker- oder eigene Methode.", + "officialReference": "Offizielle Referenz: Die Proxmox VE Helper-Scripts-Update-Apps-Dokumentation umfasst interaktive und unbeaufsichtigte Modi, Backups, Trockenläufe, temporäre Build-Ressourcen, Protokolle und Exit-Codes.", + "colSource": "Quelle", + "colAction": "Gezeigte Aktion", + "colNotes": "Was läuft", + "rows": [ + { + "source": "APT- oder APK-Pakete", + "action": "OS Updates anwenden", + "notes": "Aktualisiert die Containerpakete. Als dpkg- oder apk-Pakete installierte registrierte Apps werden im selben Lauf berücksichtigt." + }, + { + "source": "Proxmox VE Helper-Scripts", + "action": "Update anwenden", + "notes": "Nachdem Helper-Scripts explizit ausgewählt wurde, wird das offizielle Anwendungsskript ausgeführt, das durch den validierten /usr/bin/update-Wrapper identifiziert wurde. Eine Marker- oder Katalogübereinstimmung allein ermöglicht niemals die Ausführung." + }, + { + "source": "Eigener Befehl", + "action": "Führen Sie den Updater aus", + "notes": "Führt den gespeicherten Befehl im LXC aus und ersetzt jeden integrierten App-Updater für diesen Datensatz." + }, + { + "source": "Docker Engine", + "action": "Docker Engine aktualisieren", + "notes": "Aktualisiert nur installierte Docker-Pakete und deren erforderliche Abhängigkeiten. Andere Betriebssystempakete und Container bleiben unverändert." + }, + { + "source": "Docker-Image", + "action": "Image aktualisieren", + "notes": "Zieht das ausgewählte Image und erstellt die Compose-Servicegruppe oder den geschützten eigenständigen Container neu." + } + ], + "callout": "Ein eigener Befehl ersetzt Helper-Scripts für diese Anwendung. Manuelle, Sammel- und geplante Läufe beachten die gespeicherte Wahl. Vorhandene eigene Befehle und ausdrücklich gespeicherte ältere Sammel- bzw. aktivierte Zeitplanauswahlen bleiben erhalten. Neu registrierte Apps werden nie durch einen alten Zeitplan aufgenommen." + }, + "docker": { + "heading": "Docker Engine und Docker Images", + "lead": "Nach der Docker-Registrierung im App-Reiter erscheinen Docker Engine und Image-Inventar im selben Abschnitt Docker.", + "items": [ + "Die Docker Engine-Versionsverfolgung ist vom OS-Paketzähler getrennt und verfügt über einen eigenen Update-Button.", + "Lokale Images mit Tags werden anhand unveränderlicher Digests mit ihrer Registry verglichen. Jetzt prüfen aktualisiert das Inventar, ohne Images herunterzuladen oder Container neu zu starten.", + "Compose-Dienste werden von ihrem deklarierten Projekt aktualisiert. Images, die zur gleichen Servicegruppe gehören, werden zusammen bearbeitet, damit das Projekt nicht wiederholt neu erstellt wird.", + "Ein eigenständiger Container wird anhand seiner aktuellen Konfiguration neu erstellt. Der geschützte Ablauf bewahrt Rücksetzungsdaten auf und stellt bei einem Fehler den vorherigen Container wieder her.", + "Jedes Image kann separat in manuellen, massenhaften und geplanten Updates ausgewählt werden, mit Ausnahme deklarierter Compose-Abhängigkeiten, die dem übergeordneten Service folgen müssen." + ], + "callout": "Container, die innerhalb von Docker laufen, werden nicht als unabhängige LXC-Anwendungen angezeigt. Ihre veröffentlichten Webports können als Links unter der Docker-Registrierung gespeichert werden, während Bildaktualisierungen im Docker-Bereich verbleiben." + }, + "actions": { + "heading": "Individuelle Aktionen und Statusfarben", + "lead": "Jeder Abschnitt bleibt unabhängig voneinander umsetzbar, unabhängig davon, ob ein Bulk-Update konfiguriert ist oder nicht.", + "items": [ + "Configure öffnet den Updater-Selektor, wenn keine Methode ausgewählt ist; Edit ändert eine gespeicherte Auswahl. Die Informationsschaltflächen erklären jede Option, verlinken auf die offizielle Dokumentation und zeigen ein benutzerdefiniertes Skriptbeispiel an. Die Auswahl einer Option führt sie nicht aus.", + "Wenn die Versionsverfolgung deaktiviert ist, aber ein Updater vorhanden ist, wird die neutrale Aktion Run updater angezeigt. ProxMenux behauptet nicht, dass ein Update anhängig ist.", + "Konfigurieren Sie ohne einen verfügbaren Helper-Scripts-Updater einen benutzerdefinierten Befehl. Das Deaktivieren einer Methode wählt nicht stillschweigend eine andere aus; bestehende Plan-/Zeitplanauswahlen bleiben gespeichert und nicht verfügbare Ziele werden gemeldet.", + "Die Aktion Update image gilt nur für die ausgewählte Docker-Einheit; sie aktualisiert weder Docker Engine noch nicht verwandte Images." + ], + "statusColState": "Bekannter Zustand", + "statusColAppearance": "Aussehen", + "statusColMeaning": "Bedeutung", + "statusRows": [ + { + "state": "Verifiziertes Update verfügbar", + "appearance": "Lila Text, nach oben gerichtetes Symbol und lila Aktion", + "meaning": "Installierte und verfügbare Versionen bzw. Image-Digests unterscheiden sich." + }, + { + "state": "Nachweislich aktuell", + "appearance": "Grünes Häkchen und grüne Aktion Aktualisiert", + "meaning": "Die letzte abgeschlossene Überprüfung bestätigt, dass das Ziel aktuell ist." + }, + { + "state": "Version unbekannt", + "appearance": "Neutraler Text und neutrale Handlung", + "meaning": "Ein Updater kann ausgeführt werden, aber es gibt keinen Versionsnachweis, um ihn als anhängig oder aktuell zu kennzeichnen." + } + ] + }, + "custom": { + "heading": "Benutzerdefinierte Aktualisierungsbefehle", + "lead": "Verwenden Sie einen benutzerdefinierten Befehl, wenn die Installation keinen verifizierten integrierten Updater hat oder wenn die normale Prozedur ersetzt werden muss.", + "items": [ + "Öffnen Sie Configure, wenn das Feld leer ist, oder Edit, wenn bereits eine Methode vorhanden ist.", + "Bei einer integrierten App oder Docker Engine zeigt der Editor den aktuell verwendeten Befehl an. Das Speichern verschiedener Inhalte macht es zum expliziten Override für diesen Datensatz.", + "Testen Sie zuerst die komplette Prozedur im LXC Terminal. Es muss nicht interaktiv sein, das korrekte Arbeitsverzeichnis verwenden und beim Ausfall einen Nicht-Null-Ausgangsstatus zurückgeben.", + "pct exec nicht einschließen; ProxMenux betritt bereits den Container und führt den Befehl als root aus." + ], + "exampleLead": "Beispiel eines vollständigen Containerverfahrens:", + "example": "cd /opt/my-app && ./update.sh", + "callout": "Ein Versionsbefehl wie myapp --version liest nur eine Version; es ist kein Updater. Befehle laufen mit administrativen Privilegien, so dass gespeicherte Inhalte mit der gleichen Sorgfalt wie ein Root-Shell-Befehl überprüft werden müssen." + }, + "bulk": { + "heading": "Sammelaktualisierung", + "lead": "Die Sammelaktualisierung erstellt eine wiederverwendbare Aktion für eine genau festgelegte Zielauswahl im LXC. Sie steht nach den App- und Docker-Abschnitten und vor Optionen.", + "items": [ + "Betriebssystempakete sind Pflicht. Zusätzlich muss mindestens eine App, Docker Engine oder eine Docker-Image-Einheit ausgewählt werden.", + "Apps und Docker-Einheiten werden einzeln ausgewählt. Der übergeordnete Compose-Dienst zeigt die mit ihm zu aktualisierenden Abhängigkeiten.", + "Nicht verfügbare oder entfernte Ziele werden als veraltet markiert und müssen entfernt werden, bevor die Konfiguration gespeichert werden kann.", + "Aktualisierungen anwenden ist lila, wenn ein gewähltes Ziel ein nachgewiesenes Update hat, grün, wenn alle nachweislich aktuell sind, und neutral bei unbekanntem Ergebnis.", + "Durch das Entfernen der Bulk-Konfiguration werden keine einzelnen Aktualisierungsmethoden oder Einstellungen für geplante Aktualisierungen entfernt." + ], + "callout": "Bulk Update ersetzt nicht die einzelnen Buttons. Es ist eine optionale Abkürzung für eine Auswahl, die zusammen laufen sollte." + }, + "options": { + "heading": "Backup- und Neustartoptionen", + "lead": "Die gleichen Optionen gelten für manuelle, Massen- und geplante Durchläufe:", + "items": [ + "Sicherung vor dem Anwenden erstellt ein vzdump-Backup auf dem gewählten Speicher. Schlägt die erforderliche Sicherung fehl, startet die Aktualisierung nicht.", + "Neustart nach dem Anwenden startet den LXC nur nach einem erfolgreichen Lauf neu.", + "Die Auswahlen werden pro LXC gespeichert und bleiben unabhängig von der Zielliste." + ] + }, + "scheduled": { + "heading": "Geplante Updates", + "lead": "Geplante Updates verwenden die gleichen ausführbaren Ziele und Sicherheitsoptionen wie manuelle Aktionen.", + "items": [ + "Wählen Sie einen voreingestellten oder cron-Ausdruck und wählen Sie dann genaue Ziele aus: Betriebssystempakete, einzelne Apps, Docker Engine, eigenständige Docker-Einheiten oder Compose-Dienstgruppen.", + "Ein Release Hold gilt nur für ausgewählte Anwendungen mit Versionstracking. Apps ohne Tracking führen ihren Updater immer dann aus, wenn ihr Zeitplan fällig ist.", + "Der Zustand des letzten Laufs unterscheidet Erfolg, Teilerfolg, Fehler, Sicherheitsaufschub und keine ausstehenden Updates. Nach dem ersten geplanten Lauf öffnet Aktualisierungen → Geplante Aktualisierungen → Protokoll anzeigen die vollständige Ausgabe des Updaters und seiner aufgerufenen Unterskripte.", + "Nach jedem Durchlauf überprüft ProxMenux den standardmäßigen Debian-Reboot-erforderlichen Marker. Wenn ein Neustart erforderlich ist, wird dies auf der Registerkarte Updates und der Abschlussbenachrichtigung angezeigt; die Warnung wird gelöscht, wenn der LXC gestartet oder neu gestartet wird.", + "Protokolle geplanter Läufe liegen auf dem Proxmox-Host in /usr/local/share/proxmenux/logs/lxc-updates/ mit dem Namen <VMID>-scheduled-<run-id>.log. Pro LXC bleiben die letzten zehn Protokolle erhalten; ältere Dateien werden automatisch gelöscht.", + "Diese beibehaltene Historie gilt für geplante Updates. Ein manuelles Update zeigt seine Ausgabe live im Monitor-Ausführungsfenster an und erstellt kein geplantes Protokoll in diesem Verzeichnis.", + "Externe Host-Zeitpläne, die von Proxmox VE Helper-Scripts erkannt wurden, werden separat angezeigt, so dass eine überlappende Automatisierung sichtbar ist." + ], + "callout": "Führen Sie jede ausgewählte Methode manuell aus, bevor Sie einen Zeitplan aktivieren. Geplante Befehle können keine Eingabeaufforderungen beantworten." + }, + "completion": { + "heading": "Was passiert nach einem Update", + "lead": "Das Update gilt nicht als abgeschlossen, wenn der Terminalbefehl lediglich beendet wird.", + "items": [ + "Derselbe Lauf zeichnet sein Endergebnis auf und aktualisiert den OS-Paketzustand, die registrierten App-Versionen und das Docker-Inventar.", + "Geplante Durchläufe behalten ihre Terminalausgabe bei und melden, ob ein Neustart noch erforderlich ist, um die Anwendung von Paketänderungen abzuschließen.", + "Der LXC-Cache wird durch den verifizierten Post-Update-Zustand ersetzt, so dass Badges und Buttons das vorherige Ergebnis nicht beibehalten.", + "Wenn ein angehaltener oder wiederhergestellter LXC startet, aktualisiert das vorhandene Lebenszyklusereignis diesen LXC erneut. Docker-Inventar wartet, bis der Daemon fertig ist, anstatt ein leeres Startergebnis als endgültig zwischenzuspeichern.", + "Aktivierte Benachrichtigungen werden vom finalisierten Durchlauf ausgegeben, einschließlich Teilfehlern und gruppierten Docker-Bildergebnissen." + ] + }, + "troubleshooting": { + "heading": "Häufige Situationen", + "colProblem": "Situation", + "colResolution": "Lösung", + "rows": [ + { + "problem": "Es wurde keine Aktualisierungsmethode identifiziert", + "resolution": "Öffnen Sie die Konfiguration, fügen Sie die offizielle nicht-interaktive Prozedur hinzu und testen Sie sie manuell, bevor Sie sie planen." + }, + { + "problem": "Eine Proxmox VE Helper-Scripts-Identität wird angezeigt, aber es gibt keine Aktion", + "resolution": "Der LXC hat Legacy-Identifikationsdaten, aber keinen verifizierten /usr/bin/update-Wrapper. Fügen Sie eine benutzerdefinierte Methode erst hinzu, nachdem Sie das korrekte Verfahren bestätigt haben." + }, + { + "problem": "Docker-Bilder sind nach dem Start oder der Wiederherstellung vorübergehend leer", + "resolution": "Warten Sie, bis Docker fertig ist, oder drücken Sie jetzt Überprüfen. Das Inventar wiederholt den Start und behandelt ein vorübergehendes leeres Ergebnis nicht als endgültig." + }, + { + "problem": "Ein gespeichertes Bulk-Ziel ist nicht mehr verfügbar", + "resolution": "Bearbeiten Sie die Bulk-Konfiguration, entfernen Sie das veraltete Ziel und wählen Sie den aktuellen Ersatz aus, wenn eines vorhanden ist." + }, + { + "problem": "Ein benutzerdefinierter Befehl scheitert", + "resolution": "Führen Sie es im LXC-Terminal aus und überprüfen Sie dessen Pfad, Abhängigkeiten, nicht-interaktive Flags und Exit-Code." + }, + { + "problem": "Ein geplantes Update sagt, dass ein Neustart erforderlich ist", + "resolution": "Öffnen Sie Protokoll anzeigen, prüfen Sie den abgeschlossenen Lauf und starten Sie den LXC neu. ProxMenux löscht die Warnung, sobald das Lebenszyklusereignis den erneuten Start meldet." + } + ] + }, + "figures": { + "osPending": { + "alt": "Abschnitt Betriebssystempakete mit ausstehenden und Sicherheitsupdates", + "caption": "Der Betriebssystembereich hält Paketaktualisierungen unabhängig von Anwendungs- und Docker-Aktionen." + }, + "options": { + "alt": "LXC Update-Optionen mit Pre-Update-Backup und Post-Update-Neustart", + "caption": "Backup- und Neustarteinstellungen gelten für manuelle, Massen- und geplante Ausführung." + } + } +} diff --git a/web/messages/de/docs/monitor/dashboard/vms-lxcs.json b/web/messages/de/docs/monitor/dashboard/vms-lxcs.json new file mode 100644 index 00000000..70551ce1 --- /dev/null +++ b/web/messages/de/docs/monitor/dashboard/vms-lxcs.json @@ -0,0 +1,244 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Dashboard: VMs und LXCs | ProxMenux-Dokumentation", + "description": "Inventar aller Gäste mit CPU, Arbeitsspeicher und Datenträgern in Echtzeit. Die Details zeigen Konfiguration, Ressourcen, Sicherungen, aktuelle Proxmox-Protokollergebnisse, Notizen und Starten / Herunterfahren / Neustart / Stopp." + }, + "header": { + "title": "Dashboard: VMs und LXCs", + "description": "Vollständiges Gastinventar des Knotens: vier Kennzahlen oben, eine sortierbare VM-/LXC-Liste darunter und Gastdetails mit Konfiguration, Ressourcen, Sicherungen, Protokollen sowie Starten/Herunterfahren/Neustart/Stopp.", + "section": "ProxMenux Monitor · Übersicht" + }, + "intro": { + "title": "Steuerung der Gäste", + "body": "Hier steuern Sie den Lebenszyklus der Gäste. Aktionen laufen nach ausdrücklicher Bestätigung über POST /api/vms/<vmid>/control und aktualisieren die Gastzeile. Erzwungenes Ausschalten erfordert die eigene Schaltfläche Stopp erzwingen." + }, + "topRow": { + "heading": "Obere Reihe: vier Stat-Karten", + "intro": "Vier Karten fassen den Gastzustand zusammen: Gesamtzahl, CPU-Auslastung, zugewiesener Arbeitsspeicher im Verhältnis zur Hostkapazität und Datenträgerzuweisung.", + "imageAlt": "Registerkarte VMs & LXCs — oberste Reihe von vier Statistikkarten: Total VMs & LXCs, Total CPU, Total Memory, Total Disk", + "imageCaption": "Obere Reihe: Gesamtzahlen und Laufend/Gestoppt, aktuelle CPU-Auslastung, belegter Speicher / laufenden Gästen zugewiesener Speicher / insgesamt zugewiesener Speicher mit Grenzwertanzeige sowie zugewiesener Datenträgerplatz.", + "headerCard": "Karte", + "headerWhat": "Was es zeigt", + "totalLabel": "Gesamtzahl der VMs und LXCs", + "totalWhat": "Gesamtzahl mit zwei Abzeichen — X Running (grün) und Y Stopped (rot, nur wenn > 0). Die Nummer, die Sie sehen, wenn etwas nach einem Neustart nicht wieder auftaucht.", + "cpuLabel": "CPU gesamt", + "cpuWhat": "Gesamte aktuelle CPU-Auslastung aller Gäste als Anteil der physischen Host-CPU mit der Fußzeile „Zugewiesene CPU-Auslastung“.", + "memoryLabel": "Gesamtspeicher", + "memoryIntro": "Drei Messwerte vertikal gestapelt:", + "memoryItems": [ + "Aktuell belegt — großer Wert, etwa 15.4 GB, und X.X % von Y GB des Host-RAMs. Der blaue Balken zeigt den Prozentsatz.", + "Laufenden Gästen zugewiesen + Insgesamt zugewiesen — Summe von maxmem der laufenden Gäste neben der Summe aller Gäste einschließlich gestoppter. Die erste ist jetzt relevant, die zweite beim gleichzeitigen Start aller Gäste.", + "Innerhalb der Grenzen ist grün und wechselt zu Überbucht, wenn die Gesamtzuweisung den Host-RAM übersteigt. Kontrollierte Überbuchung kann mit KSM funktionieren; die Anzeige warnt früh bei knappem Spielraum." + ], + "diskLabel": "Gesamtes Laufwerk", + "diskWhat": "Summe des Speicherplatzes, der allen Gästen in der entsprechenden Einheit (GB / TB) zugewiesen ist, mit der Fußzeile \"Zugeordneter Speicherplatz\"." + }, + "inventory": { + "heading": "Liste virtueller Maschinen und Container", + "intro": "Eine Reihe pro Gast. Die Liste stammt aus /api/vms, die qm list + pct list + pvesh /cluster/resources auf dem Host konsolidiert.", + "imageAlt": "Liste virtueller Maschinen und Container — eine Zeile pro Gast mit Status, Typabzeichen, Name, ID und Inline-CPU / Speicher / Festplattenprozentsatz", + "imageCaption": "Das mobil optimierte Layout des Inventars - die gleichen Daten, die die Desktop-Ansicht zeigt, werden in einer einzigen Spalte neu gestapelt, wobei die Prozentsätze und Statusindikatoren kompakt gehalten werden.", + "rowsIntro": "Jede Zeile zeigt:", + "rows": [ + "Statussymbol — grünes Wiedergabedreieck für laufend oder rotes Quadrat für gestoppt. Gestoppte Gäste werden abgeblendet und fallen sofort auf.", + "Typanzeige — LXC in Cyan für Container, VM in Lila für virtuelle Maschinen.", + "Name — Hostname oder Anzeigename des Gasts.", + "VMID — die numerische ID von Proxmox unter dem Namen.", + "Inline-Metriken — drei Prozent mit ihrem Symbol (CPU %, Memory %, Disk %). Jedes Symbol wird orange, wenn die Metrik eine Aufmerksamkeitsschwelle überschreitet (z. B. Speicher über 90 %), so dass ein schneller Scan Ihnen sagt, welcher Gast unter Druck steht, ohne ihn zu öffnen." + ], + "clickHint": "Ein Klick auf eine Zeile öffnet den Detaildialog, unabhängig davon, ob der Gast läuft oder gestoppt ist.", + "mobileTitle": "Die Liste ist für Mobilgeräte entworfen", + "mobileBody": "Auf Telefonen und in schmalen Fenstern stehen Typ, Name, ID und die drei Prozentwerte untereinander wie im Bild. Auf breiten Ansichten verteilen sie sich horizontal. In beiden Fällen öffnet ein Tippen auf die gesamte Zeile die Details." + }, + "drillIn": { + "heading": "Gastdetaildialog", + "intro": "Der Detaildialog zeigt Gastname, VMID, Typ, Zustand und Laufzeit. Seine Navigation passt sich dem Gast an: Status, App und Updates für die LXC-Anwendungsverwaltung, Mounts bei vorhandenen LXC-Mountpoints, Logs für durch OCI manager Apps installierte Container sowie Backups und Firewall. Die feste Aktionsleiste hält die Start- und Stoppfunktionen sowie das LXC-Terminal in jeder Registerkarte bereit.", + "statusTitle": "Tab. 1 — Status", + "statusImageAlt": "Gastdetails — Status mit Live-Werten für CPU, Arbeitsspeicher und Datenträger, Datenträger-/Netzwerk-I/O, Betriebssystemlogo und Ressourcen/IP-Adressen", + "statusImageCaption": "Status: oben CPU, Arbeitsspeicher und Datenträger mit Balken; darunter gesamte I/O-Daten (Datenträger gelesen/geschrieben, Netzwerk empfangen/gesendet); anschließend Ressourcen mit Notizen, + Info und IP-Adressliste.", + "statusIntro": "Der Standardreiter zum Prüfen des Gastzustands. Drei Bereiche:", + "liveTitle": "1. Zeile Live-Metriken", + "liveItems": [ + "CPU-Auslastung (X Kerne) — Prozentsatz mit Balken. Die konfigurierte Kernzahl im Kopf erklärt, worauf sich 100 % bezieht.", + "Arbeitsspeicher — belegt / maximal in GB mit Balken.", + "Datenträger — belegt / maximal für das primäre Gast-Image im selben Format." + ], + "ioTitle": "2. I/O-Gesamtwerte + OS-Logo", + "ioItems": [ + "Datenträger-I/O — gelesene (↓) und geschriebene (↑) Daten seit dem Start. Zeigt einen plötzlichen I/O-Anstieg gegenüber dem üblichen Gastverhalten.", + "Netzwerk-I/O — insgesamt empfangene (↓) und gesendete (↑) Daten, entsprechend den Datenträgerwerten.", + "OS-Verteilungslogo - das Debian / Ubuntu / Alpine / Windows / usw.-Symbol, das vom Betriebssystemtyp des Gastes erkannt wird. Ein schneller visueller Hinweis beim Scrollen mehrerer geöffneter Modals." + ], + "resourcesTitle": "3. Ressourcenblock", + "resourcesIntro": "Gastkonfiguration aus Proxmox: CPU-Kerne, Arbeitsspeicher (konfiguriertes maxmem) und Swap. Zwei aufklappbare Bereiche im Kopf:", + "resourcesItems": [ + "Notizen — bearbeitbare Gastbeschreibung. Speichern ruft PUT /api/vms/<vmid>/config auf und schreibt in /etc/pve/qemu-server/<vmid>.conf oder /etc/pve/lxc/<vmid>.conf.", + "+ Info — BIOS-Modus, Maschinentyp, Agentstatus, hostpci-Passthrough-Einträge, CT-Einhängepunkte und Startreihenfolge." + ], + "ipsTitle": "4. IP-Adressen", + "ipsBody": "Jede IPv4-/IPv6-Adresse des Gasts erscheint als grüne Anzeige. Die Liste bleibt bei gestopptem Gast oder einer VM ohne QEMU-Agent leer. LXCs melden ihre Adressen direkt.", + "appTitle": "Tab 2 — App (nur LXC)", + "appIntro": "Registriert Anwendungen, die zum LXC gehören, speichert Weblinks und vergleicht optional installierte und verfügbare Versionen. Vorschläge kommen aus dem Start-Cache; Find-Anwendungen aktualisiert ausdrücklich die Entdeckung für diesen LXC, nachdem neue Software installiert wurde.", + "appLinkLead": "Siehe die", + "appLinkLabel": "dedizierte App-Seite", + "appLinkTail": "für zwischengespeicherte Erkennung, kataloggestützte Registrierung, Docker-Weblinks und Versionsdetektoren.", + "updatesTitle": "Tab 3 — Updates (nur LXC)", + "updatesIntro": "Betriebssystempakete, Apps, Docker Engine und Docker-Images bleiben getrennte Ziele. Jedes lässt sich einzeln starten oder in einer genau festgelegten Sammelaktion bzw. einem Zeitplan auswählen.", + "updatesLinkLead": "Siehe die", + "updatesLinkLabel": "dedizierte Updates Seite", + "updatesLinkTail": "für integrierte und eigene Updater, Neuerstellung von Docker-Containern, Sammelauswahl, Sicherheitsoptionen und Zeitplanung.", + "mountsTitle": "Reiter 4 — Einhängepunkte (nur LXC, falls vorhanden)", + "mountsImageAlt": "LXC-Details, Einhängepunkte: PVE-Volumes, Bind-Mounts vom Host oder PVE-Speicher sowie im CT eingehängte NFS-/CIFS-Freigaben. Je Karte: Typ, Kapazität, belegte/gesamte Bytes, Optionen und Statuspunkt — grün intakt, bernsteinfarben schreibgeschützt/abweichend, rot nicht erreichbar.", + "mountsImageCaption": "Einhängepunkte erscheint nur bei LXCs mit mindestens einem konfigurierten oder nachträglich hinzugefügten Remote-Einhängepunkt. Ohne Einhängepunkte fehlt der Reiter.", + "mountsIntro": "Proxmox zeigt konfigurierte mpX-Einhängepunkte, jedoch keine später im CT über mount.cifs, NFS mit autofs usw. hinzugefügten. Dieser Reiter verbindet beide Ansichten: konfigurierte Einhängepunkte und im Container erkannte Laufzeiteinhängungen, mit Status und abrufbarer Kapazität.", + "mountTypesTitle": "Erkannte Einhängepunkttypen", + "mountTypesItems": [ + "PVE-Volume — liegt auf Proxmox-verwaltetem Speicher, etwa ZFS-Subvolume, Verzeichnis oder Ceph RBD. Die Kapazität stammt aus den PVE-Speicherstatistiken und entspricht der Proxmox-Anzeige.", + "Bind-Mount aus PVE-Speicher — mpX-Eintrag mit einem Pfad auf PVE-bekanntem Speicher.", + "Bind-Mount vom Host — mpX-Eintrag mit beliebigem Hostpfad (/mnt/something). Die Kapazität liefert df für diesen Pfad.", + "Ad-hoc in CT – Mount, der nur im Mount-Namespace des Containers existiert (z. B. eine NFS-Freigabe, die der CT selbstständig mountet). Die Kapazität wird über pct exec <vmid> df gelesen, was die einzige Möglichkeit ist, sie anzuzeigen – /proc/<pid>/root vom Host stellt die tatsächlichen Statistiken des Remote-Mounts nicht offen." + ], + "mountStateTitle": "Statuspunkt und Warnungen je Karte", + "mountStateItems": [ + " Grün — Einhängepunkt intakt und erreichbar.", + " Bernsteinfarben — konfiguriert, aber nicht eingehängt, schreibgeschützt oder Zombie-Bind. Dabei fehlt die Hostquelle, während der CT sie noch als eingehängt sieht, etwa nach Entfernen eines USB-Laufwerks oder umount auf dem Host.", + " Rot — nicht erreichbar: Die Laufzeitprüfung konnte den Einhängepunkt nicht erreichen, etwa eine NFS-Freigabe bei ausgefallenem Server." + ], + "mountsCalloutTitle": "Zusätzliche Informationen gegenüber Proxmox", + "mountsCalloutBody": "Zeigt alle Lese- und Schreibziele des Containers samt Kapazität. Im CT eingehängte NFS-/CIFS-Freigaben, die Proxmox nicht anzeigt, erhalten dieselbe Darstellung und Zustandsprüfung. Nicht erreichbare Remote-Mounts und Zombie-Binds werden vor Problemen bei einer Sicherung markiert.", + "logsTitle": "Tab 5 — Protokolle (nur OCI-Container)", + "logsBody": "Nur für Container aus OCI manager Apps. Zeigt die Hauptprozess-Konsole des Images aus /var/log/proxmenux/oci/VMID.console.log: letzte 100, 500 oder 1000 Zeilen, Live-Verfolgung bei laufendem Container, Filter und Download. Die Datei wird beim Öffnen neu gelesen, auch bei gestopptem Container. Details: OCI-Container in ProxMenux Monitor.", + "backupsTitle": "Tab. 6 — Backups", + "backupsImageAlt": "Pro-Gast-Bohr-in-Modal - Backups-Registerkarte mit der verfügbaren Backup-Liste, Ziel-Tag, Größen und der Create Backup-Schaltfläche", + "backupsImageCaption": "Alle Sicherungen dieses Gasts auf konfigurierten Proxmox-Speichern, neueste zuerst. Die Kopfzeile zeigt ihre Anzahl.", + "backupsIntro": "Listet alle Gastsicherungen auf konfigurierten Proxmox-Speichern, neueste zuerst. Der Zähler im Titel zeigt, ob Sicherungen vorhanden sind. Jede Zeile enthält :", + "backupsItems": [ + "Zeitstempel — Datum und Uhrzeit des Laufs.", + "Zielanzeige — Speicherort (PBS-Cloud, PBS-Local, NFS-Backup, …), nach Zustand eingefärbt.", + "Größe — endgültige Größe der Sicherung auf dem Datenträger." + ], + "backupsOutro": "+ Sicherung erstellen startet eine Sicherung auf dem in Proxmox als „Backup target“ markierten Speicher. Die Wiederherstellung erfolgt in der Proxmox-Weboberfläche; Monitor zeigt aktuelle Sicherungen des Gasts und erstellt neue.", + "firewallTitle": "Tab. 7 — Firewall", + "firewallIntro": "Liest das Proxmox-Firewallprotokoll des Gasts direkt vom Host, ohne Zusatzdienst oder regelmäßige Abfragen. Der Reiter ist immer sichtbar; der Inhalt hängt davon ab, ob die Firewall aktiv ist und Regeln tatsächlich protokollieren.", + "firewallItems": [ + "Firewall deaktiviert — eine bernsteinfarbene Mitteilung erklärt genau, wo sie in der Proxmox-Benutzeroberfläche aktiviert werden soll (<Container|VM> → Firewall → Options) und erinnert Sie daran, dass mindestens eine Regel log: info (oder höher) benötigt, bevor Pakete angezeigt werden.", + "Firewall aktiv, noch keine Ereignisse — Hinweis im leeren Bereich auf die nötige Protokollierung, hilfreich direkt nach dem Aktivieren.", + "Ereignisse vorhanden — scrollbarer Monospace-Bereich mit Originaleinträgen nach Aktion: ACCEPT grün, REJECT orange, DROP rot. Der Zähler im Kopf nennt die geladenen Einträge." + ], + "firewallRefresh": "Aktualisieren lädt neue Einträge bei Bedarf. Ohne automatische Abfrage bleibt die Ansicht eine Momentaufnahme des Öffnens oder letzten Aktualisierens. Quelle ist /var/log/pve-firewall.log, nach VMID gefiltert über GET /api/vms/<vmid>/firewall/log.", + "firewallCalloutTitle": "Warum haben Sie es hier, wenn die Proxmox-Benutzeroberfläche es bereits zeigt?", + "firewallCalloutBody": "Spart den Wechsel zur Proxmox-Oberfläche und hält die Ansicht auf dieselbe VMID beschränkt: Gast starten, Einhängepunkte und Firewallereignisse prüfen, Gast wieder stoppen. Regeln werden in Proxmox bearbeitet; Monitor verändert sie nicht.", + "actionBarTitle": "Untere Aktionsleiste", + "actionBarIntro": "Immer sichtbar am Fuß des Modals, unabhängig davon, welcher Tab aktiv ist:", + "consoleItem": "Konsole öffnet bei laufenden LXCs pct enter <vmid> im Container. Sie nutzt wie der Terminalreiter xterm.js und WebSocket sowie die mobile Werkzeugleiste mit ESC, TAB, Pfeilen, Enter und Ctrl+C / Ctrl+X / Ctrl+R. Damit ist die Bedienung per Telefon oder Tablet möglich. VMs nutzen hier keine Konsole; verwenden Sie Proxmox noVNC.", + "lifecycleIntro": "Darunter stehen vier Schaltflächen im 2×2-Raster. Jede sendet POST /api/vms/<vmid>/control mit der passenden action. Ihre Verfügbarkeit hängt vom Gastzustand ab.", + "headerButton": "Schaltfläche", + "headerEnabled": "Aktiviert, wenn", + "headerAction": "Aktion an Host gesendet", + "lifecycleRows": [ + { + "button": "Starten", + "color": "green", + "enabled": "Der Gast ist gestoppt.", + "action": "qm start / pct start" + }, + { + "button": "Herunterfahren", + "color": "blue", + "enabled": "Der Gast läuft.", + "action": "qm shutdown / pct shutdown — geordnetes Herunterfahren, ACPI" + }, + { + "button": "Neustart", + "color": "blue", + "enabled": "Der Gast läuft.", + "action": "qm reboot / pct reboot — geordneter Neustart" + }, + { + "button": "Stopp erzwingen", + "color": "red", + "enabled": "Der Gast läuft.", + "action": "qm stop / pct stop — hartes Ausschalten" + } + ], + "forceStopTitle": "Stopp erzwingen schaltet sofort aus", + "forceStopBody": "Stopp erzwingen umgeht das Herunterfahren wie ein Ziehen des Stromkabels. Nutzen Sie Herunterfahren, solange der Gast reagiert. Erzwingen Sie den Stopp nur bei hängendem Herunterfahren und akzeptiertem Datenverlustrisiko. Farbe und Beschriftung warnen vor versehentlichem Auslösen." + }, + "dataCollected": { + "heading": "Wie die Daten gesammelt werden", + "headerSection": "Abschnitt des Reiters", + "headerEndpoint": "Endpunkt", + "headerSource": "Quelle", + "rows": [ + { + "section": "Bestandsverzeichnis", + "endpoint": "/api/vms", + "source": "pvesh get /cluster/resources --type vm für VM und CT." + }, + { + "section": "Detail-Panel (Konfiguration, Netzwerk, Festplatten)", + "endpoint": "/api/vms/", + "source": "qm config <id> für VMs / pct config <id> für CTs." + }, + { + "section": "Kennzahlendiagramm pro Gast", + "endpoint": "/api/vms//metrics", + "source": "PVE RRD-Daten (pvesh get /nodes/<node>/qemu/<id>/rrddata) werden zu einer chartfreundlichen Form verdichtet." + }, + { + "section": "Aktuelle Proxmox-Protokollergebnisse", + "endpoint": "/api/vms//logs", + "source": "pvesh get /nodes/<node>/<qemu|lxc>/<vmid>/log --start 0 --limit 1000. Bei Befehlsfehlern wird eine leere Liste zurückgegeben; dies sind keine vollständigen Systemprotokolle aus dem Gast." + }, + { + "section": "Backups für Gäste verfügbar", + "endpoint": "/api/vms//backups", + "source": "pvesm list <storage> durch VMID gefiltert." + }, + { + "section": "Pro-Gast-Firewall-Log (Firewall-Tab)", + "endpoint": "/api/vms//firewall/log", + "source": "/var/log/pve-firewall.log durch VMID gefiltert." + }, + { + "section": "Einschalttasten (Start / Stop / Reboot / Shutdown)", + "endpoint": "/api/vms//control", + "source": "qm start|stop|reboot|shutdown oder pct-Äquivalente." + } + ], + "codeComment1": "# Dashboard-Daten mit PVE abgleichen", + "codeComment2": "# Gastkonfiguration genau wie im Detaildialog prüfen", + "codeComment3": "# VM", + "codeComment4": "# CT" + }, + "whereNext": { + "heading": "Wohin als nächstes", + "items": [ + { + "label": "Gesundheitsmonitor", + "href": "/docs/monitor/health-monitor", + "tailRich": " — Kategorie VMs und Container: Startfehler, QMP-Zeitüberschreitungen und CT-Herunterfahrfehler." + }, + { + "label": "Benachrichtigungen", + "href": "/docs/monitor/notifications", + "tailRich": "— was die vm_*, ct_*, migration_* und backup_* Ereignisse nachgeschaltet auslösen." + }, + { + "label": "API-Referenz", + "href": "/docs/monitor/api", + "tailRich": " — die Endpunkte für VMs und Sicherungen." + }, + { + "label": "Dashboard-Index", + "href": "/docs/monitor/dashboard", + "tailRich": " — die anderen Reiter." + }, + { + "label": "ProxMenux: VM erstellen", + "href": "/docs/create-vm", + "tailRich": " — Bereitstellung: NAS-Systemvorlagen (Synology und andere), Linux-/Windows-VMs und für Proxmox angepasste Standardwerte." + } + ] + } +} diff --git a/web/messages/de/docs/monitor/health-monitor.json b/web/messages/de/docs/monitor/health-monitor.json new file mode 100644 index 00000000..f3ddf6d6 --- /dev/null +++ b/web/messages/de/docs/monitor/health-monitor.json @@ -0,0 +1,372 @@ +{ + "meta": { + "title": "Proxmox-Zustandsüberwachung — CPU, Arbeitsspeicher, Datenspeicher, SMART, ZFS, Protokolle | ProxMenux", + "description": "Proaktive Zustandsüberwachung für Proxmox VE: zehn Kategorien alle fünf Minuten (CPU und Temperatur, Arbeitsspeicher und Swap, Datenspeicher, Laufwerke/SMART, Netzwerk, VMs, Dienste, Protokolle, Updates und Sicherheit), vier Schweregrade, Unterdrückungsdauer je Kategorie, automatische Bereinigung behobener Fehler, dauerhafter Laufwerksverlauf und Meldungen über Telegram, Discord, Gotify oder E-Mail.", + "ogTitle": "Proxmox-Zustandsüberwachung — CPU, Arbeitsspeicher, Datenspeicher, SMART, ZFS, Protokolle", + "ogDescription": "Proaktive Zustandsüberwachung für Proxmox VE in zehn Kategorien, mit Schweregraden, Unterdrückungsdauer und ereignisbasierten Benachrichtigungen.", + "twitterTitle": "Proxmox Gesundheitsmonitor | ProxMenux", + "twitterDescription": "Proaktive Zustandsüberwachung für Proxmox VE in zehn Kategorien mit Schweregraden und Benachrichtigungen." + }, + "header": { + "title": "Gesundheitsmonitor", + "description": "Die fortlaufende Selbstprüfung untersucht zehn Kategorien des Hostzustands im Fünfminutentakt. Dazwischen erfasst sie Messwerte, fasst doppelte Befunde zu strukturierten Ereignissen zusammen und versorgt Dashboard, Benachrichtigungen und optionale KI-Überarbeitung aus derselben Datenquelle.", + "section": "ProxMenux-Monitor" + }, + "intro": { + "title": "Ein Scanner, drei Verbraucher", + "body": "Ein Hintergrundthread führt alle fünf Minuten die vollständige Prüfung aus und speichert jeden Befund unter einem stabilen error_key in SQLite. Damit kann (1) das Dashboard den aktuellen Zustand anzeigen, (2) das Benachrichtigungssystem neue Ereignisse an die eingerichteten Kanäle verteilen und (3) der optionale KI-Assistent Warnungen verständlich umformulieren. Eine Konfiguration versorgt alle nachfolgenden Komponenten." + }, + "howItWorks": { + "heading": "Wie es funktioniert", + "intro": "Die Zustandsüberwachung nutzt zwei parallele Threads. Ein leichter Messwertsammler füllt Verlaufspuffer für CPU, Arbeitsspeicher und Temperatur. Der vollständige Prüfzyklus liest die Puffer, bewertet anhaltende Zustände und führt etwa alle fünf Minuten die übrigen Prüfungen aus. Anschließend speichert er Befunde für Dashboard und Benachrichtigungen in SQLite.", + "scannerTitle": "Von der Probe zum gespeicherten Befund", + "scannerCaption": "Der Sammler füllt zwischen den Prüfzyklen Verlaufspuffer: CPU alle 5 s, Arbeitsspeicher alle 30 s und Temperatur alle 15 s. Er wertet selbst keine Warnungen aus. Der vollständige Zyklus bewertet die Puffer und führt aufwendigere Prüfungen für SMART, ZFS, Protokolle und Dienste aus, bevor er Befunde in SQLite speichert.", + "scannerArrowLabel": "Schritt", + "scannerNodes": { + "samplerLabel": "Messwertsammler", + "samplerDetail": "CPU-Auslastung 5 s\nArbeitsspeicher 30 s\nTemperatur 15 s\n→ Verlaufspuffer", + "cycleLabel": "Vollständiger Gesundheitszyklus", + "cycleDetail": "Alle 5 min\nLiest Puffer\n+ aktuelle Prüfungen\n(SMART, ZFS,\nDienste, Journal …)", + "checksLabel": "Prüfungen nach Kategorien", + "checksDetail": "Zehn Kategorien\n(CPU, Arbeitsspeicher,\nDatenspeicher, Laufwerke,\nNetzwerk, VMs,\nDienste, Protokolle,\nUpdates, Sicherheit)", + "sqliteLabel": "SQLite", + "sqliteDetail": "Tabelle errors\n(aktiv +\nunterdrückt)\n+ disk_observations\n(dauerhafter Verlauf\nje Laufwerk)" + }, + "notifTitle": "Vom gespeicherten Befund zum Benutzer", + "notifCaption": "Der Meldepfad. Die gleiche Fehlertabelle steuert auch die Dashboard-Ansicht (Active / Dismissed-Listen live gerendert) und wird von der Bereinigungsroutine am Ende jedes Zyklus verbraucht, um veraltete Einträge automatisch aufzulösen - beide laufen aus den gleichen Daten, ohne den Dispatcher zu durchlaufen.", + "notifArrowLabel": "Ereignis", + "notifNodes": { + "errorsLabel": "Fehlertabelle", + "errorsDetail": "Aktive +\nunterdrückte Zeilen\nmit Schlüssel\nerror_key", + "dispatcherLabel": "Benachrichtigungsversender", + "dispatcherDetail": "Neue + verschärfte\nEreignisse einreihen\nNach Schaltern\n+ Sperrzeit", + "templatesLabel": "Vorlagen + KI-Überarbeitung", + "templatesDetail": "Vorlage\nje Ereignis\n→ optionale KI-\nÜberarbeitung in\nverständliche Sprache", + "channelsLabel": "Kanäle", + "channelsDetail": "Telegram\nDiscord\nGotify\nE-Mail (SMTP)" + } + }, + "categories": { + "heading": "Die zehn Kategorien", + "imageAlt": "Zustandsüberwachung mit zehn Kategorien und aktuellem Status: CPU, Arbeitsspeicher, Datenspeicher, Laufwerke, Netzwerk, VMs, Dienste, Protokolle, Updates und Sicherheit", + "imageCaption": "Health Monitor Ansicht - die zehn Kategorien mit ihrem aktuellen Status. Kategorien auf einem gesunden Host zeigen alle OK; Warnungen und kritische Ereignisse erscheinen inline mit den Zeilen, die sie erzeugt haben.", + "intro": "Jeder Zyklus führt zehn unabhängige Prüfungen aus. Jede liefert einen von vier Zuständen (OK, INFO, WARNING, CRITICAL) und strukturierte Daten wie Gerätenamen, Protokollauszüge und genaue Schwellenwerte. Diese erscheinen im Dashboard und im Benachrichtigungstext.", + "headerCategory": "Kategorie", + "headerChecks": "Sub-Kontrollen", + "headerEvents": "Typische Ereignisse", + "rows": [ + { + "category": "CPU & Temperatur", + "checks": "CPU Nutzung mit Hysterese, Sensortemperatur", + "events": "Anhaltend hohe CPU-Auslastung; Temperaturwarnungen anhand gesammelter Sensormesswerte." + }, + { + "category": "Arbeitsspeicher & Swap", + "checks": "RAM Nutzung, Swap Nutzung", + "events": "Anhaltender Speicherdruck; Aktivität des OOM-Killers; ausgeschöpfter Swap." + }, + { + "category": "Speicher", + "checks": "Proxmox-Speicher, Root-Dateisystem", + "events": "Konfigurierte Belegungsschwellen auf Root oder anderen überwachten Dateisystemen überschritten (standardmäßig 85% Warnung / 95% kritisch); NFS-Freigabe offline; CIFS-Anmeldung fehlgeschlagen; LVM-thin-Pool voll." + }, + { + "category": "Platten und SMART", + "checks": "SMART, dmesg I/O-Fehler, ZFS Pools, LVM, Dateisystemfehler", + "events": "SMART-Gesundheit fehlgeschlagen; neu zugewiesene / ausstehende Sektoren; ATA-I / O-Fehler; ZFS-Pool DEGRADED / FAULTED; ext4-Read-only-Remount." + }, + { + "category": "Netzwerk", + "checks": "Konnektivität, Verbindungszustand, Gateway-Latenz", + "events": "Brücken- oder Bond-Down; Gateway nicht erreichbar; persistente Latenzspitzen." + }, + { + "category": "VMs und Container", + "checks": "QMP Kommunikation, VM Startup, Container Startup", + "events": "Fehlgeschlagener VM-Boot; CT-Abschaltungsfehler; QMP-Sockel-Timeout; fehlende Konfiguration / Festplatte nach einem Klon." + }, + { + "category": "PVE-Dienste", + "checks": "pveproxy, pvedaemon, pvestatd, pve-cluster, Cluster-Modus", + "events": "Dienst abgestürzt; Cluster-Quorum verloren; pmxcfs hängt." + }, + { + "category": "Systemprotokolle", + "checks": "Persistente Fehler, Fehlerspitzen, Fehlerkaskaden, kritische Kernelmeldungen", + "events": "Wiederholte identische Fehler; plötzliches Warnsignal (Kaskadenmuster); BUG: / OOPS: / oom-killer in dmesg." + }, + { + "category": "Systemaktualisierungen", + "checks": "Ausstehende Updates, Sicherheitsupdates, Kernel / PVE-Version, Systemalter", + "events": "Ausstehende Sicherheits- oder Kernelupdates; lange nicht aktualisiertes System. Bei verfügbaren Updates erscheint in der Übersicht Jetzt aktualisieren. Die Schaltfläche startet den vollständigen ProxMenux-Updateablauf. Beim Schließen wird der Zustand mit ?refresh=1 neu abgefragt, damit die Anzeige ohne Warten auf den nächsten Zyklus aktualisiert wird." + }, + { + "category": "Sicherheit & Zertifikate", + "checks": "Anmeldeversuche, Zertifikate laufen ab, optionaler Fail2Ban jail Status", + "events": "Wiederholte fehlgeschlagene SSH- oder Webanmeldungen; PVE-Zertifikat läuft in weniger als 30 Tagen ab; aktive Fail2Ban-Sperren." + } + ] + }, + "severity": { + "heading": "Schweregradmodell", + "headerStatus": "Status", + "headerColour": "Farbe", + "headerMeaning": "Bedeutung", + "headerNotification": "Benachrichtigung", + "rows": [ + { + "status": "OK", + "colour": "Grün", + "meaning": "Gesund. Keine Befunde in dieser Kategorie.", + "notification": "Keine Benachrichtigung." + }, + { + "status": "INFO", + "colour": "Blau", + "meaning": "Vorübergehender oder bereits behobener Zustand, der es wert ist, einmal notiert zu werden. Wird auch für Kategorien verwendet, die nur noch verworfene Elemente übrig haben.", + "notification": "Fakultativ. Jeder Ereignistyp kann pro Kanal ein- oder ausgeschaltet werden." + }, + { + "status": "WARNING", + "colour": "Gelb", + "meaning": "Aufmerksamkeit ist erforderlich, aber der Host ist immer noch funktionsfähig. Ursache ist nicht trivial - lesen Sie die Details.", + "notification": "Wird gesendet, wenn der Ereignisschalter für diesen Kanal aktiv ist." + }, + { + "status": "CRITICAL", + "colour": "rot", + "meaning": "Funktionalität gebrochen oder Datenverlust möglich. Erforderliche Maßnahmen.", + "notification": "Wird gesendet, wenn der Ereignisschalter für den Kanal aktiv ist. Eine CPU-Temperaturmeldung mit CRITICAL löst als Sicherheitswarnung auch nach vorheriger Bestätigung erneut aus." + } + ], + "infoNote": "Eine Kategorie mit OK, die noch unterdrückte Ereignisse mit laufender Frist enthält, erscheint als INFO. So bleibt sichtbar, dass Meldungen unterdrückt werden.", + "unknownTitle": "UNKNOWN, wenn eine Prüfung nicht abgeschlossen werden kann", + "unknownBody": "Eine nicht verfügbare Prüfung liefert UNKNOWN. Nach drei aufeinanderfolgenden Zyklen wird ein dauerhafter Befund gespeichert. Das Dashboard zeigt die Prüfung gelb an. Im Gesamtzustand ist UNKNOWN auf WARNING begrenzt; eine fehlende Prüfung allein macht den Host nicht kritisch." + }, + "dashboardView": { + "heading": "Die Dashboard-Ansicht", + "intro": "Die Zustandsüberwachung befindet sich auf der Registerkarte Übersicht. Die Statusanzeige im Kopfbereich (Gesund / Warnung / Kritisch) öffnet ein Dialogfenster mit zwei Listen:", + "items": [ + "Aktiv — Kategorien mit ungelösten Befunden. Aufgeklappte Zeilen zeigen die auslösenden Einzelprüfungen, den ursprünglichen Text in reason, die Geräte- oder VM-ID und gegebenenfalls einen Link zu Datenspeicher, Netzwerk, VMs, Protokollen oder Hardware.", + "Unterdrückt — vom Benutzer bestätigte Einträge mit noch laufender Unterdrückungsfrist. Jede Zeile zeigt Restzeit und eingestellte Dauer. Nach Ablauf verschwindet sie aus dieser Liste. Besteht die Ursache weiter und unterstützt die Kategorie erneutes Auslösen, erscheint der Eintrag wieder unter Aktiv." + ], + "pillTitle": "Die Statusanzeige folgt der schwerwiegendsten Kategorie", + "pillBody": "Die Farbe im Dashboard-Kopf folgt dem höchsten Schweregrad: CRITICAL → rot, sonst WARNING → gelb, sonst INFO → blau, sonst grün. Dieselbe Logik steuert den Punkt im Favicon und das PWA-Symbol.", + "updateNowTitle": "Schaltfläche Jetzt Aktualisieren im Overview-Header", + "updateNowBody1": "Meldet Systemupdates ausstehende Updates, erscheint neben der Statusanzeige Jetzt aktualisieren. Der Dialog startet denselben Hostablauf wie ProxMenux → Settings post-install Proxmox → Proxmox System Update: Repository-Bereinigung, apt full-upgrade über update-pve-safe.sh, DKMS-Neubau verwalteter Treiber bei neuem Kernel, autoremove/autoclean und gegebenenfalls eine Neustartabfrage. Der Fortschritt wird laufend angezeigt.", + "updateNowBody2": "Nach Abschluss ruft das Schließen des Dialogs GET /api/health/details?refresh=1 auf und verwirft damit den Cache dieses Endpunkts. Ausstehende Updates und Statusanzeige werden anhand des neuen Paketstands neu berechnet. Der Hinweis verschwindet ohne Warten auf den nächsten Zyklus. Auf einem aktuellen Host bleibt die Schaltfläche verborgen." + }, + "dismiss": { + "heading": "Warnungen bestätigen und die Unterdrückungsdauer", + "intro": "Manche Ereignisse bleiben lange bestehen: Systemupdates: Updates verfügbar gilt bis zur Aktualisierung des Hosts. Dafür ist nicht alle fünf Minuten eine neue Nachricht nötig. Jetzt aktualisieren in der Übersicht behebt diesen Fall direkt. Für andere Fälle oder aufgeschobene Updates bietet die Zustandsüberwachung zwei verbundene Möglichkeiten zum Unterdrücken von Meldungen:", + "step1": "Einzelnes Ereignis bestätigen im Dialog. Das Menü bietet 24 Stunden, 7 Tage oder Dauerhaft, unabhängig vom Kategoriestandard. Die Auswahl sendet POST /api/health/acknowledge mit error_key und gewählten suppression_hours (-1 für dauerhaft). Das Ereignis wechselt mit Zeitstempel acknowledged_at in die unterdrückte Liste.", + "dropdownImageAlt": "Menü zum Unterdrücken einer Warnung: 24 Stunden, 7 Tage oder dauerhaft", + "dropdownImageCaption": "Die gewählte Dauer gilt nur für diese Warnung; ohne Einzelauswahl greift der Kategoriestandard. Dauerhafte Bestätigungen erhalten die bernsteinfarbene Markierung Dauerhaft und lösen normalerweise nicht erneut aus. Eine Ausnahme ist die unten beschriebene kritische CPU-Temperatur.", + "step2": "Unterdrückungsdauer je Kategorie. Unter Einstellungen → Zustandsüberwachung oder über POST /api/health/settings lässt sich für jede der zehn Kategorien die Standarddauer ohne Einzelauswahl festlegen:", + "imageAlt": "Einstellung der Unterdrückungsdauer je Kategorie unter Einstellungen → Zustandsüberwachung", + "imageCaption": "Ein Auswahlmenü je Kategorie. Für häufige Meldungen wie ausstehende Updates eignet sich eine längere Dauer, für schnell neu zu bewertende Ereignisse eine kürzere. Darunter stehen die aktiven Unterdrückungen.", + "outro": "Während der Unterdrückung läuft die Prüfung weiter und aktualisiert last_seen, ohne neue Meldung. Nach Ablauf bewertet der nächste Zyklus die Ursache erneut: Er löst gegebenenfalls wieder aus oder entfernt den Eintrag, wenn der Zustand behoben ist.", + "activeSuppressionsTitle": "Bestätigungen prüfen und aufheben — Aktive Unterdrückungen", + "activeSuppressionsBody": "Alle zeitweise oder dauerhaft unterdrückten Warnungen stehen unter Einstellungen → Zustandsüberwachung → Aktive Unterdrückungen. Jede Zeile zeigt Kennung, Kategorie, Schweregrad, Bestätigungszeit und Restzeit. Wieder aktivieren hebt die Bestätigung für den nächsten Scan auf. Dauerhafte Bestätigungen lassen sich hier zurücknehmen, zeitlich begrenzte vorzeitig beenden. Aktivieren Sie Bearbeiten, wählen Sie die gewünschten Zeilen (grüner Rand und durchgestrichen) und speichern Sie. Abbrechen verwirft die Auswahl.", + "autoTitle": "Automatische Unterdrückung nach Änderung der Dauer", + "autoBody": "Ein anderer Wert als die standardmäßigen 24 Stunden hat eine zweite Wirkung: Neue Befunde der Kategorie werden bereits bestätigt gespeichert. Eine eingestellte Woche für Laufwerksmeldungen gilt damit auch für neue Meldungen, ohne jede einzeln zu bestätigen. Sie erscheinen direkt unter Unterdrückt mit der gewählten Restzeit. Kategorien mit 24 Stunden behalten das normale Verhalten: Neue Befunde bleiben aktiv, bis Sie handeln.", + "tempTitle": "Ausnahme für CPU-Temperatur CRITICAL", + "tempBody": "Die Persistenzschicht besitzt eine Sonderregel für CPU-Temperatur CRITICAL: Ein solcher Datensatz umgeht frühere Bestätigung und automatische Unterdrückung. Daraus folgt nicht, dass jede Temperaturprüfung beim Überschreiten eines konfigurierten kritischen Werts einen kritischen Datensatz erzeugt.", + "nonDismissableTitle": "Welche Befunde lassen sich bestätigen?", + "nonDismissableBody": "Der Dialog zeigt Bestätigen nur, wenn die Einzelprüfung ausdrücklich dismissable = true liefert. Bei false oder fehlendem Feld bleibt die Schaltfläche verborgen. Der Schweregrad bestimmt diese Erlaubnis nicht: Mehrere kritische Prüfungen erlauben eine Bestätigung. Die Beispiele beschreiben aktuelle Daten; Unterdrücken behebt keine Ursache.", + "headerFinding": "Feststellung", + "headerWhy": "Verhalten beim Bestätigen", + "rows": [ + { + "finding": "CPU-Temperatur: Warnung / kritisch", + "why": "Die aus Messwerten ermittelte Temperaturwarnung erlaubt ausdrücklich die Bestätigung. Eine separate Persistenzregel umgeht sie, wenn ein CPU-Temperaturdatensatz mit CRITICAL eintrifft." + }, + { + "finding": "Kritische Belegung des Root-Dateisystems", + "why": "Die Belegungsprüfungen erlauben ausdrücklich die Bestätigung, auch bei kritischer Auslastung. Sie schafft weder Platz noch beseitigt sie das Risiko fehlgeschlagener Schreibzugriffe." + }, + { + "finding": "ZFS pool DEGRADED / FAULTED", + "why": "ZFS-Poolbelegungsprüfungen erlauben ausdrücklich die Bestätigung. Andere Poolbefunde folgen ihrem eigenen Kennzeichen. Bestätigen repariert keinen beeinträchtigten oder ausgefallenen Pool." + }, + { + "finding": "Festplatten-I/O-Fehler mit SMART FAILED", + "why": "Gespeicherte Laufwerksbefunde aus dem Journal können eine Bestätigung erlauben. SMART FAILED muss trotzdem untersucht werden; die Schaltfläche hängt vom Kennzeichen der Einzelprüfung ab, nicht nur vom Warntext." + }, + { + "finding": "Netzschnittstelle DOWN", + "why": "Gespeicherte Schnittstellenprüfungen mit DOWN erlauben ausdrücklich die Bestätigung. Das stellt weder Bridge, Bond noch physische Verbindung oder Fernzugriff wieder her." + }, + { + "finding": "I/O-Ereignisse auf gesunden Festplatten (INFO)", + "why": "Vorübergehende ATA- oder dmesg-Ereignisse bei gesundem SMART können rein informativ sein und sich selbst auflösen. Solche Zeilen brauchen keine Bestätigungsschaltfläche; die Prüfung bestimmt, wann der Zustand behoben ist." + } + ], + "principle": "Nutzen Sie die beim tatsächlichen Befund angebotene Schaltfläche, statt ihre Verfügbarkeit aus Kategorie oder Schweregrad abzuleiten. Die Bestätigung steuert Anzeige und Meldungen. Wiederherstellungsprüfungen und Laufwerksverlauf bleiben davon getrennt." + }, + "autoresolve": { + "heading": "Autoauflösung und Reinigung", + "intro": "Viele Warnungen sollen verschwinden, wenn die Ursache entfällt: eine VM startet wieder, ein Laufwerk wurde entfernt oder die Temperatur ist wieder normal. Die Bereinigung am Ende jedes Fünfminutenzyklus wendet diese Regeln an:", + "headerTrigger": "Trigger", + "headerAction": "Aktion", + "rows": [ + { + "trigger": "CPU-Auslastung / Temperatur wieder normal.", + "action": "Als behoben markiert; verschwindet aus der aktiven Liste." + }, + { + "trigger": "Speicherdruck wieder unterhalb der Warnschwelle nach einer OOM / Memory Warnung.", + "action": "Als behoben markiert." + }, + { + "trigger": "VM / CT, auf den der Fehler verweist, existiert nicht mehr (qm status / pct status ungleich Null).", + "action": "Aufgelöst als entfernte Ressource markiert." + }, + { + "trigger": "Disk, auf den der Fehler verwiesen wird, ist in /dev/ nicht mehr vorhanden.", + "action": "Markiert aufgelöst als entferntes Gerät. Die permanente Beobachtungsgeschichte bleibt erhalten (siehe nächster Abschnitt)." + }, + { + "trigger": "Befunde aus dem Systemjournal (Kategorie logs, SMART-Einträge, ATA-/I/O-Fehler), deren Unterdrückungsfrist abläuft.", + "action": "Werden entfernt. Jeder Scan prüft ab diesem Zeitpunkt neue Journaleinträge; dieselbe historische Zeile wird nicht erneut ausgegeben." + }, + { + "trigger": "Seit mehr als sieben Tagen behobene Fehler.", + "action": "Aus der Datenbank gelöscht, um die Tabelle klein zu halten. Die Benachrichtigungshistorie ist unabhängig und wird länger aufbewahrt." + } + ], + "permanentTitle": "Dauerhaft unterdrückt bedeutet nicht behoben", + "permanentBody": "Die Kategoriedauer -1 (dauerhaft) unterdrückt weitere Warnungen für bestätigte Einträge, überspringt aber nicht die automatische Prüfung. Entfällt die Ursache, etwa nach Löschen der Ressource oder Unterschreiten des Schwellenwerts, wird der Eintrag weiterhin automatisch bereinigt." + }, + "observations": { + "heading": "Laufwerksbeobachtungen — der dauerhafte Verlauf", + "intro": "Laufwerksereignisse sollen erhalten bleiben. Eine SMART-Warnung auf /dev/sdh um 02:14 Uhr bleibt wichtig, auch wenn die I/O-Störung vorbei und der Fehler automatisch behoben ist. Das Laufwerk hat nun eine Vorgeschichte. Dafür führt die Zustandsüberwachung eine separate dauerhafte Tabelle: disk_observations.", + "headerProperty": "Eigenschaft", + "headerErrors": "Tabelle errors (Aktiv)", + "headerObs": "Tabelle disk_observations", + "rows": [ + { + "property": "Zweck", + "errors": "Versorgt die aktuelle Zustandsansicht und den Benachrichtigungsversand.", + "obs": "Dauerhaftes Prüfprotokoll je Laufwerk." + }, + { + "property": "Automatische Auflösung", + "errors": "Ja — Zeilen werden gelöscht, wenn die Bedingung verschwindet.", + "obs": "Nein - Einträge bleiben für immer bestehen, es sei denn, der Benutzer weist sie ausdrücklich ab." + }, + { + "property": "Deduplizierungsschlüssel", + "errors": "error_key (z.B. smart_sdh).", + "obs": "(disk_registry_id, error_type, error_signature) mit stabilen Signaturen, die von flüchtigen Daten befreit sind." + }, + { + "property": "Wo gezeigt", + "errors": "Dialog der Zustandsüberwachung (Listen Aktiv / Unterdrückt).", + "obs": "Laufwerksdetailkarte auf der Registerkarte Datenspeicher, mit „X obs.“ je Laufwerk." + }, + { + "property": "Was es aufzeichnet", + "errors": "Was auch immer derzeit scheitert.", + "obs": "SMART-Warnungen (Sektorprobleme / Temperatur / CRC / fehlgeschlagene Selbsttests), I/O-Fehler (ATA / NVMe/dm), Dateisystemfehler, ZFS-Poolereignisse." + } + ], + "outro": "Eine Warnung kann aus dem Dashboard verschwinden, während der Vorfall im Laufwerksverlauf bleibt. Die Detailkarte unter Datenspeicher zeigt die Anzahl offener Beobachtungen sowie Zeitstempel, Schweregrad und ursprünglichen Rohtext. Das hilft bei der Entscheidung über einen Austausch.", + "renameTitle": "Geänderte Gerätenamen werden automatisch zusammengeführt", + "renameBody": "Laufwerke können zunächst unter vorläufigen Namen wie ata8 oder nvme0n1p3 erscheinen. Die Beobachtungsschicht ordnet Einträge anhand bekannter Seriennummern zu: Wird derselbe Datenträger später als sdh erkannt, werden frühere Beobachtungen zu ata8 im nächsten Zyklus an sdh angehängt. Der Verlauf bleibt zusammenhängend." + }, + "notification": { + "heading": "Vom Befund zur Benachrichtigung", + "intro": "Jeder aktive Fehler ist auch ein Kandidat für die Benachrichtigungsmaschine. Der Fluss:", + "items": [ + "Der Scanner zeichnet den Befund mit Kategorie + Schweregrad + strukturierten Details auf.", + "Ist der Ereignistyp in den globalen Benachrichtigungen aktiviert und hat der Kanal die Kategorie nicht stummgeschaltet, wird ein Ereignis eingereiht.", + "Die Vorlagenlogik erzeugt aus den strukturierten Daten Titel und Text. Bei aktivierter KI-Überarbeitung erhält der eingerichtete Anbieter dieses Paar für eine verständliche Fassung.", + "Die Kanalimplementierung versendet es: Telegram Nachricht, Discord Einbettung, Gotify Push oder E-Mail. Das Versandergebnis wird in notification_history gespeichert.", + "Bestätigen startet die Unterdrückungsfrist. Weitere Erkennungen desselben error_key erzeugen währenddessen normalerweise keine Meldung und werden nicht automatisch für das Fristende eingereiht. Die Ausnahme für kritische CPU-Temperatur bleibt bestehen." + ], + "outro": "Die Kanalkonfiguration mit Telegram-Bot-Token, Webhook-URLs, KI-Schlüsseln, Ereignisschaltern und Kanalanpassungen ist unter Benachrichtigungen und KI-Assistent beschrieben." + }, + "rest": { + "heading": "REST-Endpunkte", + "intro": "Die Dialogaktionen sind per API für Skripte, Dashboards und Chatbots verfügbar. Bei aktiver Monitor-Authentifizierung benötigen Aufrufe ein gültiges Bearer-Token aus Anmeldung oder API-Tokenverwaltung. Änderungen wie Bestätigen, Speichern oder Bereinigen verwaister Fehler erfordern full_admin; read_only erhält 403. Bei deaktivierter oder abgelehnter Authentifizierung erlauben diese Prüfungen Zugriff ohne Token.", + "headerEndpoint": "Endpunkt", + "headerMethod": "Methode", + "headerUse": "Verwendung", + "rows": [ + { + "endpoint": "/api/health", + "method": "GET", + "use": "Leichte Zustandsabfrage mit JSON-Feldern status, timestamp und version. Für Schlüsselwortprüfungen in Uptime Kuma geeignet; bei aktiver Monitor-Authentifizierung muss der Client einen Bearer-Header senden." + }, + { + "endpoint": "/api/health/status", + "method": "GET", + "use": "Gesamtzustand mit einem Schweregrad und einer Zusammenfassung. Authentifiziert." + }, + { + "endpoint": "/api/health/details", + "method": "GET", + "use": "Alle zehn Kategorien mit jeweiligem Status und den zugrunde liegenden strukturierten Daten." + }, + { + "endpoint": "/api/health/full", + "method": "GET", + "use": "Vollständige Momentaufnahme: Kategorien, aktive und unterdrückte Fehler sowie eigene Unterdrückungsdauer. Versorgt den Dialog mit einer Anfrage und nutzt für schnelle Antworten einen sechs Minuten gültigen Hintergrundcache." + }, + { + "endpoint": "/api/health/active-errors", + "method": "GET", + "use": "Nur die aktive Liste. Filterbar durch ?category=<name>." + }, + { + "endpoint": "/api/health/dismissed", + "method": "GET", + "use": "Nur die unterdrückten Einträge mit verbleibenden Stunden." + }, + { + "endpoint": "/api/health/acknowledge", + "method": "POST", + "use": "Körper: '{'\"error_key\":\"smart_sdh\"'}'. Deaktivieren Sie eine Warnung mit dem konfigurierten Fenster der Kategorie." + }, + { + "endpoint": "/api/health/settings", + "method": "GET / POST", + "use": "Lesen oder schreiben Sie die Werte für die Unterdrückungsdauer pro Kategorie." + }, + { + "endpoint": "/api/health/cleanup-orphans", + "method": "POST", + "use": "Manuelle Bereinigung von Fehlern, deren zugrunde liegendes Gerät / VM verschwunden ist. Idempotent." + } + ], + "codeComment1": "# Aktuellen Zustand für ein Skript abrufen", + "codeComment2": "# Verwerfen Sie einen bestimmten Fehler", + "codeComment3": "# Setzen Sie die Unterdrückung der Festplatten-Kategorie auf eine Woche" + }, + "whereNext": { + "heading": "Wohin als nächstes", + "items": [ + { + "label": "Dashboard", + "href": "/docs/monitor/dashboard", + "tail": " — hier lässt sich der Dialog der Zustandsüberwachung öffnen." + }, + { + "label": "Benachrichtigungen", + "href": "/docs/monitor/notifications", + "tail": " — Kanäle, Ereignisschalter, KI-Überarbeitung und Verlauf." + }, + { + "label": "KI-Assistent", + "href": "/docs/monitor/ai-assistant", + "tail": " — Anbieter (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter), Promptmodus, Detailgrad je Kanal und Sprache." + }, + { + "label": "Architektur", + "href": "/docs/monitor/architecture", + "tailRich": "— das SQLite-Schema (errors, disk_observations, events) und die Hintergrund-Thread-Kadenz." + } + ] + } +} diff --git a/web/messages/de/docs/monitor/index.json b/web/messages/de/docs/monitor/index.json new file mode 100644 index 00000000..883aa0c9 --- /dev/null +++ b/web/messages/de/docs/monitor/index.json @@ -0,0 +1,151 @@ +{ + "meta": { + "title": "ProxMenux Monitor – Selbstgehostetes Web-Dashboard für Proxmox VE | ProxMenux", + "description": "ProxMenux Monitor ist ein selbst gehostetes Web-Dashboard für Proxmox VE: Echtzeit-Hostmetriken, Speicher und SMART Daten, Netzwerk, VMs und Container, Hardware, Protokolle, ein integriertes Web-Terminal, ein proaktiver Health Monitor, Benachrichtigungen an Telegram / Discord / E-Mail, ein optionaler KI-Assistent, ein REST API und Integrationen mit Tools wie Homepage und Home Assistant.", + "ogTitle": "ProxMenux Monitor – Selbstgehostetes Web-Dashboard für Proxmox VE", + "ogDescription": "Echtzeit-Dashboard Proxmox VE: Hostmetriken, Speicher SMART, Netzwerk, VMs und Container, Hardware, Protokolle, Webterminal, Gesundheitsmonitor, Benachrichtigungen, KI-Assistent, REST API.", + "twitterTitle": "ProxMenux Monitor | ProxMenux", + "twitterDescription": "Selbst gehostetes Proxmox VE Dashboard mit Health Monitor, Benachrichtigungen, KI-Assistent und REST API." + }, + "header": { + "title": "ProxMenux Monitor", + "description": "Ein selbst gehostetes Proxmox-VE-Web-Dashboard als AppImage. Es läuft als einzelner systemd-Dienst auf dem Host, lauscht auf TCP-Port 8008 und stellt API und Oberfläche aus einem Prozess bereit.", + "section": "ProxMenux Monitor" + }, + "atGlance": { + "title": "Auf einen Blick", + "body": "Einzelner AppImage auf dem Proxmox-Host → Flask Backend (Port 8008), der Live-Daten über psutil, pvesh, smartctl, journalctl sammelt → Next.js-Dashboard, das vom selben Prozess bereitgestellt wird. Optionale Authentifizierung (Passwort + 2FA), optionaler KI-Assistent, optionale Benachrichtigungen, REST API für Integrationen." + }, + "hero": { + "alt": "ProxMenux Monitor Dashboard – Systemübersichtsbildschirm mit CPU, Speicher-, Temperatur- und Betriebszeit-Widgets", + "caption": "Standard-Startbildschirm – Metriken und Gesundheitszustand auf Hostebene auf einen Blick." + }, + "coverage": { + "heading": "Was das Dashboard abdeckt", + "intro": "Acht erstklassige Abschnitte, jeder unterstützt durch seine eigenen API Endpunkte:", + "tableSection": "Abschnitt", + "tableWhat": "Was angezeigt wird", + "sections": [ + { + "name": "Gesundheitsmonitor", + "description": "Aktive und verworfene Warnungen für CPU, Arbeitsspeicher, Speicher, Festplatten, Netzwerk, Dienste, Protokolle, VMs, Updates und Sicherheit. Steuert die Benachrichtigungs-Engine." + }, + { + "name": "Speicher", + "description": "Proxmox-Speicher pools, physische Festplatten (SATA / NVMe / USB), SMART Attribute, ZFS pool Status, Verschleiß und Lebensdauer, I/O-Aktivität." + }, + { + "name": "Netzwerk", + "description": "Alle Schnittstellen (physisch, Bonds, Bridges, OVS), IP/MAC/Status, Echtzeit-RX/TX-Diagramme, historische RRD-Daten pro Schnittstelle." + }, + { + "name": "VMs und Container", + "description": "VM-/LXC-Inventar mit Status, Ressourcen und Betriebszeit. Die Detailansicht zeigt Konfiguration, historische Metriken, Proxmox-Logdownloads und Start-/Stopp-/Neustart-/Herunterfahraktionen. Die Logs hängen vom Proxmox-Endpunkt ab; es ist kein vollständiges Gastbetriebssystem-Logarchiv." + }, + { + "name": "Hardware", + "description": "CPU Modell und Topologie, Speicherlayout, PCIe-Geräte, GPU Liste mit Treiber und Echtzeitüberwachung pro Steckplatz (NVIDIA / Intel iGPU)." + }, + { + "name": "Protokolle und Ereignisse", + "description": "Live journalctl mit Schweregrad-/Zeitbereichs-/Schlüsselwortfiltern, Proxmox-Aufgabenverlauf, Benachrichtigungsprotokoll, herunterladbaren Protokollpaketen." + }, + { + "name": "Terminal", + "description": "Browser-Shell für den Host und unterstützte VM-/CT-Konsolen über xterm.js und WebSockets. Es gilt der konfigurierte Authentifizierungsmodus: Bei deaktivierter oder abgelehnter Anmeldung können erreichbare Clients Sitzungen ohne Login öffnen. Das bedeutet keine Protokollierung jedes Befehls." + }, + { + "name": "Sicherheit", + "description": "Fehlgeschlagene Anmeldungen, Status der Fail2Ban-Jails, kürzlich gesperrte IP-Adressen und Integration mit dem Jail [proxmenux] des Hosts." + } + ], + "footer": "Jeder Abschnitt verfügt über eine eigene Dokumentationsseite unter Dashboard in der Seitenleiste." + }, + "howItRuns": { + "heading": "Wie es läuft", + "intro": "ProxMenux Monitor wird als eigenständige AppImage bereitgestellt. Eine einzelne systemd-Unit (proxmenux-monitor.service) startet einen Flask-Prozess, der:", + "bullets": [ + "Hört auf TCP 8008 auf dem Host (HTTP).", + "Stellt das Next.js-Dashboard als statische Dateien unter / und die API unter /api/* aus demselben Prozess bereit.", + "Zieht Live-Daten mit Standard-Host-Tools ab: psutil, pvesh, smartctl, journalctl, zpool, ip, nvidia-smi usw.", + "Behält seinen eigenen Status in einer lokalen SQLite-Datenbank bei (/usr/local/share/proxmenux/health_monitor.db): verworfene Warnungen, Festplattenbeobachtungen, Benachrichtigungskonfiguration, AI-Konfiguration. Der Authentifizierungsstatus befindet sich separat in /root/.config/proxmenux-monitor/auth.json." + ], + "footer": "Der vollständige Anfrageablauf, das Dateilayout und die systemd-Integration werden in Architektur beschrieben." + }, + "noAgent": { + "title": "Kein Agent für die Gäste", + "body": "Der Monitor liest alle Daten auf dem Host aus. Auf VMs und CTs muss kein Agent installiert werden: Die Gastdaten stammen aus der Proxmox-API und aus den Informationen, die der Kernel des Hosts über die laufenden Gastsysteme bereitstellt." + }, + "access": { + "heading": "Zugriff auf das Dashboard", + "intro": "Zwei Zugriffsmuster werden unterstützt und die Anwendung erkennt, welches verwendet wird:", + "codeComment1": "# 1) Direkter Zugriff auf dem Host", + "codeComment2": "# 2) Über Reverse Proxy (Nginx / Caddy / Traefik)", + "afterCode": "Der Reverse-Proxy sollte X-Forwarded-For, X-Forwarded-Proto und X-Forwarded-Host korrekt setzen und WebSocket-Upgrades weiterleiten. Bei Standardports nutzt der Browser seinen aktuellen Ursprung. Für Client-IPs vertraut das Backend weitergeleiteten Adressen nur mit explizitem PROXMENUX_TRUST_PROXY=1; beschränken Sie dabei direkten Backendzugriff.", + "footer": "Einrichtung beim ersten Start, Passwort + TOTP 2FA und Reverse-Proxy-Snippets werden unter Zugriff und Authentifizierung behandelt." + }, + "mobile": { + "heading": "Mobile Nutzung und Installation auf dem Startbildschirm", + "intro": "Das Dashboard passt sich der Bildschirmgröße an und wird als Progressive Web App geliefert. public/manifest.json deklariert display: standalone, App-Namen, Symbol und Designfarbe. Das Hinzufügen zum Startbildschirm ermöglicht einen eigenständigen Start ohne Adressleiste, mit angepasstem Startbildschirm und dunklem Dashboard-Design.", + "phoneAlt": "ProxMenux Monitor läuft auf einem Telefon – Haupt-Dashboard-Ansicht", + "phoneCaption": "Haupt-Dashboard auf einem Telefon – das Layout wird für kleine Ansichtsfenster neu gestaltet.", + "addHeading": "Zum Startbildschirm hinzufügen", + "iosLabel": "iOS Safari:", + "iosBody": "Teilen-Schaltfläche → Zum Startbildschirm hinzufügen. Das Symbol stammt von /apple-touch-icon.png, das im AppImage ausgeliefert wird.", + "androidLabel": "Android Chrome / Edge:", + "androidBody": "Menü mit drei Punkten → App installieren (oder Zum Startbildschirm hinzufügen bei älteren Versionen).", + "afterInstall": "Nach der Installation wird durch Öffnen des Symbols das Dashboard im Standalone-Modus mit einem eigenen Task-Switcher-Eintrag gestartet.", + "onlineOnlyTitle": "Nur online nutzbar", + "onlineOnlyBody": "Die PWA lässt sich installieren, ist aber nicht offlinefähig: Es gibt keinen Service Worker. Die Verknüpfung verhält sich wie eine native App. Zum Laden des Dashboards muss das Gerät den Host jedoch weiterhin über TCP 8008 erreichen können, etwa über LAN, VPN oder HTTPS mit einem Reverse-Proxy." + }, + "health": { + "heading": "Der Gesundheitsmonitor und Benachrichtigungen", + "alt": "Health Monitor-Bildschirm mit den verfolgten 10-Kategorien (CPU, Arbeitsspeicher, Speicher, Festplatten, Netzwerk, Dienste, Protokolle, VMs, Updates, Sicherheit) mit aktuellem Status", + "caption": "Health Monitor-Ansicht – die verfolgten 10-Kategorien mit ihrem aktuellen Status. Aktive und verworfene Warnungen werden hier angezeigt, wenn das System welche auslöst.", + "body1": "Im Dashboard läuft der Health Monitor im Hintergrund und erzeugt strukturierte Ereignisse: hohe CPU-Temperatur, SMART-Warnungen, verschlechterte ZFS-Pools, OOM-Prozessabbrüche, VM-/CT-Ausfälle und Sicherheitsvorfälle. Jedes Ereignis hat Kategorie, Schweregrad (INFO / WARNING / CRITICAL) und einen stabilen error_key, der Duplikate zusammenfasst.", + "feedsIntro": "Ereignisse versorgen drei Dinge gleichzeitig:", + "feedsHealth": "Die Health Monitor-Ansicht im Dashboard (aktive + verworfene Listen).", + "feedsChannels": "Die Benachrichtigungs-Engine – Telegram, Discord, E-Mail, Gotify, Pushover und Apprise (Mehrkanal). Jeder Kanal wird unabhängig konfiguriert und die Kategorien pro Ereignis können stummgeschaltet werden.", + "feedsAI": "Der optionale KI-Assistent erklärt mit dem gewählten Anbieter (OpenAI, Anthropic, Gemini, Groq, Ollama oder OpenRouter) eingehende Ereignisse verständlich und schlägt bei Aktivierung in den KI-Einstellungen weitere Schritte vor.", + "suppressionTitle": "Einzelne Warnungen unterdrücken statt alles stummschalten", + "suppressionBody": "Jede Kategorie hat eine eigene Unterdrückungsdauer. Nach Verwerfen wird dieselbe Warnung für diesen Zeitraum stummgeschaltet (standardmäßig 24 Stunden, je Kategorie bis dauerhaft einstellbar). Echte Verschärfungen, etwa CPU-Temperatur über der kritischen Schwelle, lösen unabhängig davon erneut aus." + }, + "api": { + "heading": "REST API und Integrationen", + "intro": "REST-Endpunkte liefern Überwachungsdaten als JSON über HTTP/HTTPS für Homepage, Home Assistant, Uptime Kuma und eigene Skripte. Grafana kann den separaten Prometheus-Textexporter unter /api/prometheus nutzen. Anfragen sind mit curl möglich.", + "tokens": "Langlebige API-Tokens (365 Tage) werden aus Einstellungen → API Zugriffstokens oder über POST /api/auth/generate-api-token generiert.", + "bearer": "Token werden als Authorization: Bearer … gesendet. Der öffentliche Endpunkt /api/health eignet sich für Verfügbarkeitsprüfungen ohne Zugangsdaten. Unter /api/auth/* liegen öffentliche Setup-/Login-/Statusrouten und geschützte Konto-/Tokenverwaltung; nicht alle sind anonym.", + "catalog": "Der vollständige Endpunktkatalog, Anleitungen zur Token-Rotation und Best Practices für die Sicherheit finden Sie in der API-Referenz; Vorgefertigte Beispiele für Homepage, Home Assistant, Grafana, Uptime Kuma und ein generisches cURL-Muster finden Sie in Integrationen." + }, + "serviceControl": { + "heading": "Dienststeuerung", + "intro": "Der Monitor wird wie jeder systemd-Dienst verwaltet. Zusätzlich gibt es zwei Einträge in der ProxMenux-Textoberfläche unter Einstellungen:", + "codeComment": "# Manuelle Steuerung", + "footer": "Siehe Einstellungen → ProxMenux Monitor für die Umschaltung im Menü und den Statusüberprüfungsablauf." + }, + "nextSteps": { + "heading": "Wo geht es weiter?", + "items": [ + { + "label": "Architektur", + "description": "– Flask Backend, systemd Einheit, SQLite Schema, KI-Anbieter, Benachrichtigungskanäle." + }, + { + "label": "Zugriff und Authentifizierung", + "description": "– erster Start, Passwort-Einrichtung, TOTP 2FA, Reverse-Proxy-Konfiguration, Fail2Ban-Integration." + }, + { + "label": "Dashboard", + "description": "— jede Sektion der Oberfläche auf einer eigenen Seite." + }, + { + "label": "API-Referenz", + "description": "– alle Endpunkte, Anforderungs-/Antwortformen und Token-Verwaltung." + }, + { + "label": "Integrationen", + "description": "– Homepage, Home Assistant, Grafana / Prometheus, Uptime Kuma, generisches cURL Muster." + } + ] + } +} diff --git a/web/messages/de/docs/monitor/integrations.json b/web/messages/de/docs/monitor/integrations.json new file mode 100644 index 00000000..526758fd --- /dev/null +++ b/web/messages/de/docs/monitor/integrations.json @@ -0,0 +1,255 @@ +{ + "meta": { + "title": "Proxmox-Integrationen — Homepage, Home Assistant, Grafana, Prometheus | ProxMenux Monitor", + "description": "Konfigurationsbeispiele zum Kopieren für Homepage, Home Assistant, Grafana über Prometheus und Uptime Kuma. Jedes Beispiel zeigt die benötigte Konfiguration, die Monitor-API-Endpunkte und den Authentifizierungsheader.", + "ogTitle": "Proxmox-Integrationen — Homepage, Home Assistant, Grafana, Prometheus", + "ogDescription": "Anleitungen zur Verbindung von ProxMenux Monitor mit Homepage, Home Assistant, Grafana, Prometheus und Uptime Kuma.", + "twitterTitle": "Proxmox Integrationen | ProxMenux Monitor", + "twitterDescription": "Rezepte für Homepage, Home Assistant, Grafana, Prometheus und Uptime Kuma." + }, + "header": { + "title": "Integrationen", + "description": "Beispiele zum Kopieren für die Werkzeuge Ihres Homelabs: Homepage, Home Assistant, Grafana über Prometheus und Uptime Kuma. Jedes Beispiel zeigt die vom Zielwerkzeug erwartete Konfiguration, den verwendeten Monitor-Endpunkt und den nötigen Authentifizierungsheader.", + "section": "ProxMenux-Monitor" + }, + "intro": { + "title": "Was Sie von dieser Seite aus erstellen können", + "body": "Kopieren Sie das jeweilige Beispiel in Ihr Werkzeug. Die Endpunkte sind in der API-Referenz beschrieben; diese Seite zeigt ihre Verwendung in Homepage, Home Assistant und Grafana. Die Screenshots zeigen die Ausgabe der Beispiele." + }, + "auth": { + "heading": "Authentifizierung: Das Einzige, was jedes Rezept braucht", + "intro": "Die meisten von diesen Integrationen verwendeten Endpunkte werden authentifiziert. Sie haben zwei Möglichkeiten, diese Anforderung zu erfüllen.", + "optAtitle": "Option A — API-Token (für Integrationen empfohlen)", + "optAbody1": "Öffnen Sie Einstellungen → Sicherheit → API-Token. Wählen Sie Token erzeugen, vergeben Sie einen Namen wie homepage, home-assistant oder prometheus und kopieren Sie das Token: Es erscheint nur einmal. Es läuft standardmäßig nach einem Jahr ab und ist einzeln widerrufbar. Nutzen Sie es für Clients außerhalb des Browsers.", + "optAbody2": "Ab diesem Zeitpunkt ist jede Anfrage nur noch:", + "optBtitle": "Option B — Login-Flow (Benutzername + Passwort)", + "optBbody": "Nützlich für Skripte, die sich als menschlicher Benutzer authentifizieren. Das zurückgegebene Token ist kurzlebig; die meisten Integrationen sollten Option A bevorzugen.", + "outro": "Das TOTP-Feld ist nur bei aktivierter Zwei-Faktor-Authentifizierung nötig. Tokenwechsel, Widerruf, Passwortrichtlinien und Prüfprotokoll sind unter Zugriff und Authentifizierung beschrieben.", + "httpsTitle": "Verwendung von HTTPS anstelle von HTTP", + "httpsIntro": "Jedes Rezept unten verwendet http:// in den URLs, um die Beispiele kurz zu halten. Wenn Sie TLS auf dem Monitor aktiviert haben (Settings → Security → SSL/HTTPS), tauschen Sie http:// in jeder URL gegen https:// aus – das ist die einzige Änderung. Zwei spezielle Anmerkungen zu bestimmten Werkzeugen:", + "httpsItems": [ + "Selbstsignierte Zertifikate. Die Home-Assistant-Integration rest: prüft TLS standardmäßig. Für ein selbstsigniertes Monitor-Zertifikat setzen Sie verify_ssl: false in jeden REST-Block neben scan_interval: oder nehmen die Monitor-CA in den Vertrauensspeicher auf. Entsprechendes gilt für andere Werkzeuge mit Zertifikatsprüfung.", + "Prometheus enthält unten bereits scheme: https. Aktivieren oder behalten Sie https, wenn TLS im Monitor aktiv ist." + ] + }, + "homepage": { + "heading": "Homepage", + "headingHref": "https://gethomepage.dev", + "intro": "Homepage ist ein vollständig statisches, anpassbares Anwendungs-Dashboard. ProxMenux Monitor wird über das eingebaute customapi-Widget angeschlossen - fügen Sie einen Diensteintrag in services.yaml ein, starten Sie die Homepage neu und die Karte erscheint mit Live-Nummern.", + "iconCalloutTitle": "Das offizielle ProxMenux-Logo ist auf dashboardicons.com", + "iconCalloutBody": "Die Beispiele nutzen icon: proxmenux.png. Homepage sucht einfache Dateinamen automatisch bei dashboardicons.com, einer Symbolsammlung für selbst gehostete Dashboards. Der ProxMenux-Eintrag steht unter dashboardicons.com/icons/external/proxmenux und wird beim ersten Anzeigen geladen. Dasselbe funktioniert für Tausende anderer Werkzeuge wie Telegram, Discord, Grafana oder Tailscale: icon: <name>.png genügt im Diensteintrag.", + "imageAlt": "Homepage Dashboard mit drei ProxMenux Monitor Karten (EDGE, VOID, DREAM) mit Uptime, CPU, RAM und Temperatur für jeden Proxmox Host", + "imageCaption": "Drei ProxMenux Monitor-Instanzen, die als Homepage-Karten gerendert wurden – Uptime, CPU, RAM und CPU Temperatur live von /api/system auf jedem Host alle 10 s gelesen.", + "basicTitle": "Grundlegendes Widget — keine Authentifizierung", + "basicIntro": "Verwenden Sie dies, wenn sich ProxMenux Monitor in einem vertrauenswürdigen Netzwerk befindet und Sie die Authentifizierung auf der Monitorseite noch nicht aktiviert haben. Der einfachste mögliche services.yaml-Eintrag:", + "authedTitle": "Authentifiziertes Widget", + "authedIntro": "Generieren Sie ein API-Token in Settings → Security → API Tokens auf dem Monitor, kopieren Sie es und fügen Sie es in den Authorization-Header unten ein - ersetzen Sie das Beispiel-Token, das nach Bearer angezeigt wird, durch das, das Sie gerade kopiert haben:", + "authedOutro": "Starten Sie die Homepage neu und die Karte leuchtet mit Live-Werten auf. Verwenden Sie das gleiche Token für alle Homepage-Widgets, die auf denselben ProxMenux Monitor-Host zeigen.", + "multiTitle": "Einrichtung von Multiwidgets — System, Speicher, Netzwerk", + "multiIntro": "Für mehr Details nutzen Sie drei Karten mit unterschiedlichen Endpunkten: Systemmetriken, Datenspeicher und Netzwerk. Für dieselbe Monitor-Instanz verwenden alle dasselbe Token.", + "multiCalloutTitle": "Mehrere Proxmox Hosts", + "multiCalloutBody": "Wiederholen Sie den Block je Host für die gezeigten Karten. Jeder Eintrag nutzt http://<host>:8008 seiner Monitor-Instanz. Erzeugen und speichern Sie ein Token je Host: Getrennte Installationen besitzen eigene Signierschlüssel, daher gilt ein fremdes Token nicht automatisch." + }, + "homeAssistant": { + "heading": "Home Assistant", + "headingHref": "https://www.home-assistant.io", + "intro": "Die Beispiele nutzen Home Assistants integrierte rest-Integration; eine eigene HACS-Komponente ist nicht nötig. Sie liest Monitor-Endpunkte aus der API-Referenz und erzeugt Sensoren und Attribute für Automatisierungen. Die Konfiguration liefert ungefähr 25 Sensoren für Ressourcen, Zustand, VMs/CTs, Datenspeicher, Netzwerk und Updates. Fügen Sie sie in configuration.yaml ein und laden oder starten Sie HA neu.", + "imageAlt": "Home-Assistant-Übersicht mit ProxMenux-Entitäten: Zustandsanzeige, CPU-/RAM-/Temperaturanzeigen, VM-Anzahl, Datenspeicherbelegung und aktive Fehler", + "imageCaption": "ProxMenux Monitor als erstklassige Home Assistant-Integration - Sensoren, die aus dem untenstehenden YAML-Rezept aufgebaut sind.", + "step1Title": "1 · Speichern Sie den API-Token", + "step1Body": "Speichern Sie das Token getrennt von der Hauptkonfiguration in secrets.yaml. Bearer-Präfix und Token stehen in einem Wert, der als Header referenziert wird. Die Datei ist nicht verschlüsselt und muss ebenfalls privat bleiben. Ihr Ort hängt von der Installation ab, meist /config/secrets.yaml unter HA OS oder Container.", + "step2Title": "2 · REST-Konfiguration einfügen", + "step2Body": "Sechs REST-Blöcke decken die Hauptbereiche ab. Ihr scan_interval passt zur Änderungsrate: Systemressourcen alle 30 s, Zustand alle 60 s, langsam veränderliche Bestände alle 5–10 Minuten. In configuration.yaml einfügen:", + "step3Title": "3 · Hinzufügen von binären Sensoren und Vorlagenhelfern", + "step3Body": "Zwei binäre Sensoren und zwei Vorlagensensoren ergänzen die Integration. Damit werden Automatisierungen und bedingte Lovelace-Karten übersichtlicher, ohne überall Jinja-Ausdrücke zu wiederholen.", + "step4Title": "4 · Neu laden und prüfen", + "step4Body": "Prüfen Sie zuerst die Syntax unter Entwicklerwerkzeuge → YAML → Konfiguration prüfen. Laden Sie dann Gesamte YAML-Konfiguration neu oder starten Sie HA neu. Filtern Sie unter Einstellungen → Geräte & Dienste → Entitäten nach proxmenux. Die ungefähr 25 Entitäten sollten sich innerhalb eines Abfrageintervalls füllen.", + "replaceTitle": "Ersetzen einer früheren Version dieses Rezepts?", + "replaceBody": "Falls Sie eine ältere Version dieser YAML-Blöcke verwendet haben, kann die Entitätsregistrierung von Home Assistant noch alte Entitäts-IDs enthalten. Veraltete Entitäten erscheinen dann weiterhin; Lovelace-Karten melden beispielsweise Entität nicht gefunden. Bereinigen Sie die Konfiguration in zwei Schritten: Entfernen Sie zunächst die bisherigen Blöcke rest: und template: aus configuration.yaml und laden Sie die Konfiguration neu. Filtern Sie anschließend unter Einstellungen → Geräte & Dienste → Entitäten nach proxmenux und entfernen Sie Einträge, die als „Wiederhergestellt“ oder nicht verfügbar angezeigt werden. Fügen Sie danach das aktuelle YAML ein und laden Sie die Konfiguration erneut. Die neuen Entitäten werden dann ohne die alten Einträge registriert.", + "step5Title": "5 · Lovelace-Dashboard", + "step5Body": "Das YAML bildet eine vertical-stack-Karte mit Logo, Kennzahlen, System, VMs, Datenspeicher, Netzwerk und einer bedingten Problemkarte. Öffnen Sie Ihr Dashboard, wählen Sie den Stift, dann Karte hinzufügen und unten Manuell. Fügen Sie Folgendes ein:", + "viewTipTitle": "Möchten Sie es als vollständige Dashboard-Ansicht anstelle einer einzelnen Karte?", + "viewTipBody": "Öffnen Sie das Dreipunktmenü → Rohkonfigurationseditor und ergänzen Sie eine Ansicht mit diesem Kopf über der cards:-Liste:", + "viewTipOutro": "Das gibt Ihnen eine dedizierte Registerkarte / Ansicht in Ihrem Dashboard mit einem eigenen Symbol und Titel anstelle einer langen Karte in einer vorhandenen Ansicht.", + "altViewTitle": "Alternative — eine dedizierte Dashboard-Ansicht", + "altViewIntro": "Für eine eigene Registerkarte innerhalb eines bestehenden Dashboards fügen Sie eine Ansicht mit dem folgenden YAML hinzu. Eine Ansicht ist ein Dashboard-Tab und kein neuer Eintrag in der Seitenleiste. Schritte:", + "altViewSteps": [ + "Öffnen Sie das Dashboard, wo Sie den neuen Tab möchten.", + "Klicken Sie oben rechts auf den Bleistift (Dashboard bearbeiten).", + "Klicken Sie auf die Registerkarte + am Ende der vorhandenen Registerkarten, um eine neue Ansicht zu erstellen.", + "Wechseln Sie im Dialog oben rechts zu Code-Editor, um zwischen visueller Ansicht und YAML umzuschalten.", + "Fügen Sie die YAML unten ein.", + "Speichern Sie. Die Ansicht ProxMenux Monitor erscheint als Registerkarte im Dashboard mit ihren Karten." + ], + "twoEditorsTitle": "Zwei YAML-Editoren in HA - wählen Sie den richtigen", + "twoEditorsIntro": "Home Assistant hat zwei YAML-Editoren, die ähnlich aussehen, aber unterschiedliche Formate erwarten:", + "twoEditorsItems": [ + "Editor für eine Ansicht — über + oder Ansicht bearbeiten → Code-Editor. Erwartet eine einzelne Ansicht mit title:, path: und cards: auf oberster Ebene, ohne führenden Bindestrich.", + "Rohkonfigurationseditor für das ganze Dashboard — über das Dreipunktmenü. Erwartet die vollständige views:-Liste mit jeder Ansicht als Listeneintrag, beginnend mit -." + ], + "twoEditorsOutro": "Das falsche Format kann eine Unbenannte Ansicht und cards: [] erzeugen. Das folgende YAML ist für den Editor einer einzelnen Ansicht; kopieren Sie es unverändert.", + "viewImageAlt": "Eigene Home-Assistant-Ansicht für ProxMenux Monitor: picture-entity-Kopf, glance-Kennzahlen und Entitätskarten für System, VMs, Datenspeicher und Netzwerk in mehreren Spalten", + "viewImageCaption": "Die Ansicht ProxMenux Monitor auf einem breiten Bildschirm. Masonry ordnet Karten automatisch in Spalten an; das Layout hängt vom eingestellten Ansichtstyp ab.", + "twoColTipTitle": "Möchten Sie ein festes zweispaltiges Layout anstelle des Autolayouts?", + "twoColTipBody": "Ersetzen Sie ein Kartenpaar, etwa System + VMs oder Datenspeicher + Netzwerk, durch einen gemeinsamen horizontal-stack. So stehen die Karten unabhängig von der Bildschirmbreite nebeneinander:", + "twoColTipOutro": "Auf Mobilgeräten bleibt die Zeile zusammengedrückt. Das automatische HA-Layout ohne horizontal-stack passt sich schmalen Bildschirmen besser an.", + "step6Title": "6 · Automatisierungen", + "step6Body": "Drei Automatisierungen, die die häufigsten reaktiven Szenarien abdecken - ersetzen Sie notify.mobile_app_<your_phone> durch den von Ihnen verwendeten Benachrichtigungsdienst:", + "logoTitle": "Über das ProxMenux Logo", + "logoBody": "Die picture-entity-Karte lädt das offizielle Logo von dashboardicons.com, einer kostenlosen Symbolsammlung für selbst gehostete Dashboards. Der Eintrag steht unter dashboardicons.com/icons/external/proxmenux. Home Assistant lädt die SVG beim ersten Anzeigen per HTTPS und speichert sie im Cache.", + "logoBrokenTitle": "Wenn die Logokarte ein defektes Bild zeigt", + "logoBrokenIntro": "Einige HA-Installationen (Firewalled-Netzwerke, Inhaltsblocker, Hosts ohne öffentliches Internet) können jsdelivr.net zum Renderzeitpunkt nicht erreichen. Der Fix ist eine lokale Kopie:", + "logoBrokenSteps": [ + "Laden Sie die SVG von cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/proxmenux.svg.", + "Speichern Sie es in /config/www/icons/proxmenux.svg auf Ihrem HA-Host.", + "Ersetzen Sie im Lovelace YAML die image: URL durch /local/icons/proxmenux.svg. Speichern und neu laden - das Bild rendert aus der lokalen Datei, kein Internet erforderlich." + ], + "scanTipTitle": "scan_interval Faustregel", + "scanTipBody": "Für /api/system sind 30 s ein sinnvoller Startwert. /api/health/full liest normalerweise bis zu sechs Minuten gültige Hintergrunddaten; Abfragen alle 60 s umgehen diesen Cache nicht. Versuchen Sie fünf Minuten für /api/storage/summary und eine Stunde für /api/proxmenux/update-status. Passen Sie die Zeiten an Hardware und Hostanzahl an." + }, + "grafana": { + "heading": "Prometheus + Grafana", + "promHref": "https://prometheus.io", + "grafanaHref": "https://grafana.com", + "intro": "ProxMenux Monitor stellt GET /api/prometheus im Prometheus-Textformat 0.0.4 bereit. Bei aktiver Authentifizierung ist ein Bearer-Token nötig. Lassen Sie Prometheus die Metriken sammeln und Grafana die Zeitreihendatenbank visualisieren.", + "imageAlt": "Grafana-Dashboard mit ProxMenux-Metriken: CPU-Anzeige, Arbeitsspeicherverlauf, Anzahl laufender VMs und Netzwerkdurchsatz", + "imageCaption": "Ein einfaches Grafana-Dashboard aus den von Prometheus gesammelten ProxMenux-Daten: CPU, Arbeitsspeicher, laufende VMs und Netzwerkdurchsatz. Den vollständigen Katalog finden Sie unter API-Referenz → Prometheus-Metriken.", + "step1Title": "1 · Fügen Sie den Scrape Job zu Prometheus hinzu", + "step1Body": "Geben Sie den API-Token über den nativen authorization-Block von Prometheus weiter (sauberer als benutzerdefinierte Header und funktioniert mit Secret Stores):", + "step1After": "Laden Sie Prometheus mit kill -HUP <PID> neu (PID durch seine Prozess-ID ersetzen), mit systemctl reload prometheus, sofern unterstützt, oder im Container mit docker compose restart prometheus. Unter Status → Targets sollte proxmenux innerhalb eines Intervalls UP zeigen. Das Label node=\"<hostname>\" unterscheidet Hosts.", + "tokenTipTitle": "Token in einer separaten Datei speichern", + "tokenTipBody": "Speichern Sie das Token im Produktivbetrieb getrennt von der Konfiguration. Mit credentials_file: /etc/prometheus/secrets/proxmenux.token liest Prometheus es aus einer Datei mit Berechtigung 0600.", + "step2Title": "2 · Überprüfen Sie den Scrape mit ein paar Abfragen", + "step2Body": "Prüfen Sie vor Grafana, ob Prometheus Daten enthält. Öffnen Sie http://<prometheus-host>:9090, wählen Sie Query und führen Sie eine der folgenden Abfragen aus. Sie sollten aktuelle Werte des Proxmox-Hosts erhalten:", + "headerQuery": "Abfrage", + "headerConfirms": "Was es bestätigt", + "verifyRows": [ + { + "query": "up{job=\"proxmenux\"}", + "confirms": "Liefert 1, wenn Prometheus erfolgreich Daten abruft, sonst 0. Die schnellste erste Prüfung." + }, + { + "query": "proxmox_cpu_usage", + "confirms": "Aktuelle CPU-Auslastung des Proxmox-Hosts in Prozent. Der Wert sollte sich bei Abfragen im Abstand einiger Sekunden ändern." + }, + { + "query": "proxmox_vms_running", + "confirms": "Anzahl der laufenden Gäste. Vergleichen Sie mit dem, was Sie in der Proxmox UI sehen." + }, + { + "query": "proxmox_uptime_seconds / 86400", + "confirms": "Host Uptime in Tagen. Sollte dem Wert entsprechen, den Sie in uptime auf der Proxmox-Shell sehen würden." + } + ], + "calloutTitle": "Die 401, die Sie beim Klicken auf die Endpunkt-URL sehen können, ist in Ordnung", + "calloutBody": "Bei aktiver Authentifizierung ruft der Browser über Status → Targets den Endpunkt /api/prometheus ohne Prometheus-Bearer-Header ab. Die Antwort kann '{'\"error\":\"Authentication required\"'}' enthalten. Prüfen Sie den tatsächlichen State: UP, um den erfolgreichen Abruf durch Prometheus zu bestätigen.", + "step3Title": "3 · Hinzufügen von Prometheus als Grafana-Datenquelle", + "step3Body": "Öffnen Sie in Grafana Connections → Data sources → Add new → Prometheus. Tragen Sie die Prometheus-URL ein, etwa http://prometheus.lan:9090, speichern und testen Sie. Eine vom Prometheus-Server verlangte Anmeldung wird hier separat eingerichtet. Das Monitor-Token gehört in den Prometheus-Abrufauftrag.", + "step4Title": "4 · Erstellen Sie Panels mit diesen PromQL-Abfragen", + "step4Body": "Ein Einstieg mit den typischen Kennzahlen eines Proxmox-Hosts:", + "headerPanel": "Panel-Idee", + "headerPromql": "PromQL-Abfrage", + "panelRows": [ + { + "panel": "CPU-Auslastungsanzeige je Host", + "promql": "proxmox_cpu_usage" + }, + { + "panel": "Speichernutzungsmessgerät pro Host", + "promql": "proxmox_memory_usage_percent" + }, + { + "panel": "Genutzter und gesamter Arbeitsspeicher (Zeitreihen)", + "promql": "proxmox_memory_used_bytes / 1024 / 1024 / 1024" + }, + { + "panel": "Laufende VMs / CTs pro Host", + "promql": "proxmox_vms_running" + }, + { + "panel": "CPU-Temperatur", + "promql": "proxmox_cpu_temperature_celsius" + }, + { + "panel": "Netzdurchsatz RX (Bytes/s)", + "promql": "rate(proxmox_interface_bytes_received_total[5m])" + }, + { + "panel": "Netzdurchsatz TX (Bytes/s)", + "promql": "rate(proxmox_interface_bytes_sent_total[5m])" + }, + { + "panel": "Lastmittelwert (1 m)", + "promql": "proxmox_load_average{period=\"1m\"}" + }, + { + "panel": "Belegter Speicherplatz je Einhängepunkt in Prozent", + "promql": "proxmox_disk_usage_percent" + }, + { + "panel": "UPS Batterieladung", + "promql": "proxmox_ups_battery_charge_percent" + }, + { + "panel": "GPU Temperatur pro Slot", + "promql": "proxmox_gpu_temperature_celsius" + } + ], + "outro": "Fügen Sie jede Abfrage als Grafana-Panel hinzu, legen Sie die richtige Visualisierung fest (Stat für Messgeräte, Time series für Trends) und gruppieren Sie Panels in Zeilen nach Kategorie. Verwenden Sie das node-Label als Dashboard-Variable (Settings → Variables → New → Query → label_values(proxmox_cpu_usage, node)), um alle Panels nach Host zu filtern." + }, + "uptimeKuma": { + "heading": "Uptime Kuma und andere Statuschecker", + "href": "https://github.com/louislam/uptime-kuma", + "intro": "Für Schlüsselwortprüfungen nutzen Sie GET /api/system-info. Diese Route verlangt kein Token und liefert Hostname, Laufzeit und Zustand als healthy, warning oder critical. Sie ist öffentlich, anders als die geschützten detaillierten Zustandsendpunkte.", + "kumaTitle": "Uptime Kuma — HTTP Keyword Monitor", + "kumaSteps": [ + "Klicken Sie in Uptime Kuma auf + Neuen Monitor hinzufügen.", + "Monitortyp: HTTP(s) - Keyword.", + "Freundlicher Name: ProxMenux Monitor — pve01.", + "URL: http://pve01.lan:8008/api/system-info.", + "Schlüsselwort: healthy (der Wert von health.status, wenn der Host in Ordnung ist).", + "Heartbeat Intervall: 60 Sekunden sind genug.", + "Speichern Sie. Die Route system-info benötigt keinen Bearer-Header." + ], + "healthchecksTitle": "healthchecks.io / Pings nach Cron-Zeitplan", + "healthchecksBody": "Ein Cronjob kann /api/system-info abfragen und .health.status == \"healthy\" prüfen. Erst nach erfolgreicher Prüfung sendet er einen Erfolgsping an seine Healthchecks.io-URL. Der Dienst empfängt Job-Pings und fragt den Monitor nicht selbst ab. HTTP 2xx allein beweist keinen gesunden Host.", + "richTitle": "Möchten Sie reichhaltige Gesundheitsdaten", + "richBody": "Für den vollständigen Zustand mit zehn Kategorien, aktiven und unterdrückten Fehlern nutzen Sie GET /api/health/full. Die Antwort enthält die Daten des Dashboard-Dialogs. Bei aktiver Authentifizierung ist ein Bearer-Token nötig." + }, + "workflows": { + "heading": "n8n, Zapier und eigene Skripte", + "intro": "Workflow-Werkzeuge und Skripte können mit POST an /api/notifications/send Meldungen senden, etwa bei CI-Fehlern oder langen Cronjobs. Der direkte Versand umgeht Ereigniswarteschlange und Fingerprint-Sperrzeit. Kanalformatierung, optionale KI und Versand bleiben erhalten. Erforderliche Duplikatkontrolle übernimmt der Aufrufer.", + "n8nBody": "Nutzen Sie in n8n einen HTTP Request-Knoten mit POST, obiger URL und demselben JSON wie curl. Wählen Sie generische Header-Auth-Zugangsdaten mit Authorization und Bearer YOUR_API_TOKEN; ersetzen Sie den Platzhalter. Ein Zeitplan, Webhook oder vorheriger Knoten löst die Anfrage aus.", + "severityBody": "Schweregrade sind INFO, WARNING oder CRITICAL in Großbuchstaben. data liefert Kontext. Die KI nutzt gerenderten Titel und Text sowie unterstützte Ergänzungen; beliebige Felder erscheinen nicht garantiert in Prompt oder Ausgabe. Siehe Benachrichtigungen → Ereigniskatalog." + }, + "pveWebhook": { + "heading": "Nativer Proxmox-VE-Webhook (eingehend)", + "intro1": "PVE erhielt sein Benachrichtigungssystem mit 8.1; native Webhook-Ziele erfordern Proxmox VE 8.3 oder neuer. Benachrichtigungen aktivieren in Einstellungen versucht, den Monitor als Ziel einzutragen. Dorthin geleitete PVE-Meldungen wie Sicherungs- oder Replikationsberichte gelangen in seinen Versandablauf. Die Einrichtung benötigt eine verfügbare, beschreibbare Konfiguration.", + "intro2": "Ablauf, PVE-Nachrichtenvorlage, Einträge in /etc/pve/notifications.cfg und Clusterverhalten beschreibt Benachrichtigungen → PVE-Webhook-Integration." + }, + "whereNext": { + "heading": "Wohin als nächstes", + "items": [ + { + "label": "API-Referenz", + "href": "/docs/monitor/api", + "tail": " — alle Endpunkte mit Methode, Pfad und vollständigem Prometheus-Metrikkatalog." + }, + { + "label": "Benachrichtigungen", + "href": "/docs/monitor/notifications", + "tail": " — Ereignisquellen, Kanäle, Versandablauf und PVE-Webhook-Integration im Detail." + }, + { + "label": "KI-Assistent", + "href": "/docs/monitor/ai-assistant", + "tail": " — optionale Überarbeitung von Vorlagentexten in verständliche Sprache vor dem Versand an Telegram, Discord, E-Mail oder Gotify." + }, + { + "label": "Zugriff und Authentifizierung", + "href": "/docs/monitor/access-auth", + "tail": " — Erzeugen und Widerrufen der API-Token für diese Beispiele, Prüfprotokoll und TLS-Konfiguration." + } + ] + } +} diff --git a/web/messages/de/docs/monitor/notifications.json b/web/messages/de/docs/monitor/notifications.json new file mode 100644 index 00000000..27b9f274 --- /dev/null +++ b/web/messages/de/docs/monitor/notifications.json @@ -0,0 +1,535 @@ +{ + "meta": { + "title": "Proxmox-Benachrichtigungen — Telegram, Discord, E-Mail, Gotify, Pushover, Apprise | ProxMenux Monitor", + "description": "Senden Sie Proxmox VE-Benachrichtigungen an Telegram, Discord, E-Mail, Gotify, Pushover und ~80 zusätzliche Dienste über Apprise. ProxMenux Monitor verwandelt Ereignisse aus dem Health Monitor, dem Journal Watcher und dem Proxmox VE webhook in reichhaltige Nachrichten mit Deduplizierung, Cooldown, Burst-Aggregation, einer optionalen KI-Umschreibung und einer vollständigen Historie.", + "ogTitle": "Proxmox-Benachrichtigungen — Telegram, Discord, E-Mail, Gotify, Pushover, Apprise", + "ogDescription": "Senden Sie Proxmox VE-Benachrichtigungen an Telegram, Discord, E-Mail, Gotify, Pushover und ~80 zusätzliche Dienste über Apprise - mit Deduplizierung, Cooldown, Burst-Aggregation und einer optionalen KI-Umschreibung.", + "twitterTitle": "Proxmox Benachrichtigungen | ProxMenux Monitor", + "twitterDescription": "Senden Sie Proxmox VE-Benachrichtigungen an Telegram, Discord, E-Mail, Gotify, Pushover und ~80 zusätzliche Dienste über Apprise." + }, + "header": { + "title": "Benachrichtigungen", + "description": "Verteilt Ereignisse der Monitor-Datensammler an Telegram, Discord, E-Mail, Gotify, Pushover und etwa 80 Dienste über Apprise. Mit Deduplizierung, Wartezeiten für Wiederholungen, Zusammenfassung von Ereignisspitzen, Ereignis-/Kanalfiltern, optionaler KI und abrufbarem Verlauf.", + "section": "ProxMenux-Monitor" + }, + "intro": { + "title": "Woher die Nachrichten kommen", + "body": "Benachrichtigungen verteilen die Ereignisse bestehender Monitor-Quellen: Health Monitor, Systemjournal- und Aufgabenüberwachung, PVE-Webhook, regelmäßige Abfragen und direkte Aufrufe der ProxMenux-Skripte. Jedes Ereignis durchläuft denselben Versandprozess." + }, + "howItWorks": { + "heading": "Wie es funktioniert", + "intro": "Jede Benachrichtigung folgt dem gleichen Pfad durch den Monitor-Prozess. Ereignisse werden von einer Handvoll unabhängiger Sammler produziert, in eine strukturierte Nutzlast normalisiert, durch eine Versandpipeline geleitet, die entscheidet, ob und in welcher Form gesendet werden soll, optional von einem LLM umgeschrieben und schließlich auf die Kanäle aufgefächert, die der Benutzer konfiguriert hat.", + "arrowLabel": "Ereignis", + "caption": "Übersicht des Ablaufs. Tatsächliche Versandversuche werden bei Erfolg, Zusammenfassung oder Fehler im SQLite-Verlauf gespeichert. Durch Wartezeiten unterdrückte Ereignisse werden nicht protokolliert.", + "nodes": { + "sourcesLabel": "Quellen", + "sourcesDetail": "Health Monitor\nSystemjournal-Überwachung\nAufgabenüberwachung\nPVE-Webhook\nRegelmäßige Abfragen\nDirekte Ereignisquellen", + "dispatchLabel": "Versandablauf", + "dispatchDetail": "Ereignisspitzen zusammenfassen\nFingerabdruck / Wartezeit prüfen\nGruppenlimits\nKanalsteuerung", + "aiLabel": "KI-Überarbeitung (optional)", + "aiDetail": "OpenAI / Anthropic\nGemini / Groq\nOpenRouter / Ollama\n(standardmäßig deaktiviert)", + "channelsLabel": "Kanäle", + "channelsDetail": "Telegram\nDiscord\nE-Mail (SMTP)\nGotify\nPushover\nApprise (~80 Dienste)" + } + }, + "enabling": { + "heading": "Benachrichtigungen aktivieren", + "intro": "Nach einer Neuinstallation zeigt die Karte unter Einstellungen Deaktiviert und die Schaltfläche Benachrichtigungen aktivieren. Zuvor wird nichts versendet und keine PVE-Konfiguration geändert.", + "disabledAlt": "Benachrichtigungskarte nach Neuinstallation mit Status Deaktiviert und Schaltfläche zum Aktivieren", + "disabledCaption": "Der erste Zustand - ein Klick zum Aktivieren.", + "stepsIntro": "Das Drücken des Knopfes macht drei Dinge in der Reihenfolge:", + "steps": [ + "Wechselt zu Aktiv und zeigt das Kanalformular an.", + "Registriert ein Proxmox-Webhook-Ziel in /etc/pve/notifications.cfg. Ohne HTTPS verwendet es POST http://127.0.0.1:8008/api/notifications/webhook, mit HTTPS den lokalen HTTP-Empfänger auf Port 8009. PVE-Meldungen gelangen in den Versandprozess des Monitors. Siehe PVE-Webhook-Integration.", + "Startet den Versandthread, der die Ereigniswarteschlange abfragt und jedes Ereignis verarbeitet." + ], + "activeAlt": "Aktivierte Benachrichtigungskarte mit Kanälen, Anzeigename und aufklappbaren erweiterten KI-Einstellungen", + "activeCaption": "Aktiv: Kanalregister oben (Telegram / Gotify / Discord / E-Mail / Pushover / Apprise), Anzeigename, Kanal-Kategorien und aufklappbarer Abschnitt Erweitert: KI-Verbesserung." + }, + "sources": { + "heading": "Ereignisquellen", + "intro": "Sechs Quelltypen liefern Ereignisse: Hintergrundsammler, Webhook-Empfänger und direkte Quellen im Prozess. Sie erzeugen strukturierte NotificationEvent-Objekte.", + "headerCollector": "Sammler", + "headerWatches": "Überwacht", + "headerEvents": "Typische Ereignisse", + "rows": [ + { + "collector": "Gesundheitsmonitor", + "watches": "Zehn Kategorien, alle 5 Minuten", + "events": "new_error, error_resolved, error_escalated, health_degraded, health_persistent." + }, + { + "collector": "Journal-Überwachung", + "watches": "journalctl --follow mit Mustern für SSH-/Web-Anmeldefehler, Fail2Ban-Sperren bei installierter Jail, Kernel-E/A-Fehler, OOM und smartd-Ereignisse.", + "events": "auth_fail, ip_block, oom_kill, disk_io_error, service_fail." + }, + { + "collector": "Aufgabenüberwachung", + "watches": "Prüft /var/log/pve/tasks/index auf neue Aufgaben-UPIDs und verfolgt deren Protokolldateien.", + "events": "backup_start, backup_complete, backup_warning, backup_fail, migration_*, snapshot_complete." + }, + { + "collector": "Proxmox-Webhook-Empfänger", + "watches": "Empfängt POST /api/notifications/webhook. PVE-Versionen mit Webhook-Zielen können nach der Einrichtung Meldungen hierher senden; siehe unten.", + "events": "Alles, was PVE aussendet - einschließlich Ereignisse, die der Monitor sonst verpassen würde (HA, Replikation, vzdump von der GUI)." + }, + { + "collector": "Regelmäßige Abfragen", + "watches": "Regelmäßige Vergleiche von Cluster-Erreichbarkeit, Zertifikatsablauf, GPU-Passthrough und verfügbaren PVE-/ProxMenux-Updates.", + "events": "node_disconnect, node_reconnect, pve_update, proxmenux_update, gpu_mode_switch, pci_passthrough_conflict." + }, + { + "collector": "In-Prozess-Emittenten", + "watches": "Direkte Aufrufe aus ProxMenux-Skripten und dem Monitor selbst (notification_manager.emit_event(...)).", + "events": "system_startup, system_shutdown, system_reboot, ai_model_migrated, benutzerdefinierte Testereignisse." + } + ], + "after1": "Jedes Ereignis trägt eine stabile event_type (der Katalog ist unten), eine severity (INFO, WARNING, CRITICAL), eine category (für Emoji-Anreicherung und Pro-Gruppen-Filter verwendet) und eine data Nutzlast mit allem, was die Vorlage benötigt (vmid, device, source_ip, reason...).", + "after2": "Für jeden event_type erzeugt eine Vorlage in notification_templates.py den Nachrichtentext. Dieser durchläuft den Versand und kann bei aktivierter KI umgeschrieben werden. Die Seite zum KI-Assistenten beschreibt das Zusammenspiel." + }, + "channels": { + "heading": "Kanäle einrichten", + "intro": "Derzeit werden sechs Kanäle unterstützt: Telegram, Discord, Gotify, Email (SMTP), Pushover und Apprise. Die ersten fünf sind native Integrationen mit eigenen Konfigurationsfeldern. Apprise ist ein allgemeiner Hub, der 80 zusätzliche Dienste (ntfy, Matrix, Slack, Teams, Pushbullet, AWS SNS, Mattermost ...) über ein einziges URL-Feld hinzufügt. Sie sind alle Schritt für Schritt unten dokumentiert.", + "credsTitle": "Speicherort der Zugangsdaten", + "credsBody": "Tokens, Schlüssel, webhook-URLs und SMTP-Passwörter werden lokal in der SQLite-Datenbank des Monitors unter /usr/local/share/proxmenux/ gespeichert. Sensible Werte werden in der Schnittstelle geschützt und maskiert. Sie verlassen den Gastgeber nie, außer um ihre jeweiligen Dienste zu erreichen. Eine Sicherung dieses Verzeichnisses reicht aus, um die konfigurierten Kanäle wiederherzustellen." + }, + "telegram": { + "heading": "Telegram", + "intro": "Benötigt werden ein Bot-Token, das für mehrere Chats nutzbar ist, und eine Chat-ID für den Zielchat, eine Gruppe oder ein Supergruppen-Thema. Die integrierte Anleitung führt durch die Einrichtung; unten werden auch die ID-Formate erklärt.", + "guideAlt": "Telegram-Einrichtung mit vier Schritten: BotFather, Bot-Token, Chat-ID und Gruppen oder Kanäle", + "guideCaption": "Der Link + Einrichtungsanleitung öffnet vier Schritte, mit denen der Bot und der Kanal in etwa zwei Minuten eingerichtet werden.", + "step1Title": "1 · Erstellen Sie einen Bot mit BotFather", + "step1Items": [ + "Öffnen Sie Telegram und starten Sie einen Chat mit @BotFather (derjenige mit dem blauen Verifizierungshaken - Kopien sind üblich).", + "/newbot senden.", + "Anzeigenamen wählen, etwa ProxMenux Lab. Später änderbar.", + "Einen eindeutigen Telegram-Benutzernamen wählen, der mit bot endet, etwa proxmenux_lab_bot.", + "BotFather antwortet mit einem Token wie 123456789:ABCdef…. Dies ist das Bot-Token; wie ein Passwort behandeln." + ], + "step2Title": "2 · Erhalten Sie die Chat-ID", + "step2Intro": "Die Chat-ID bestimmt, wohin der Bot sendet. Je nach Ziel gibt es zwei Formen.", + "privateLabel": "Privater Chat (Sie erhalten die Benachrichtigungen auf Ihrem eigenen Konto):", + "privateItems": [ + "Dem neuen Bot eine Nachricht wie /start senden.", + "Mit @userinfobot oder @myidbot chatten und /start senden. Die Antwort enthält Ihre numerische Benutzer-ID, zugleich die positive Chat-ID." + ], + "privateAlt": "Telegram-Kanalformular gefüllt mit Bot Token (maskiert), positiver Chat-ID für einen privaten Chat und einem leeren optionalen Themen-ID-Feld", + "privateCaption": "Privater Bot-Chat: Chat-ID ist die positive persönliche Benutzer-ID.", + "groupLabel": "Gruppe oder Supergruppe mit Themen:", + "groupItems": [ + "Bot als Mitglied hinzufügen; bei Bedarf Schreibrechte als Administrator erteilen.", + "Senden Sie eine Nachricht in der Gruppe.", + "Öffnen Sie https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates in einem Browser. Suchen Sie nach chat.id in der JSON-Antwort - für Gruppen ist es eine negative Zahl, für Supergruppen beginnt es mit -100.", + "Bei Supergruppen mit Themen die gewünschte message_thread_id im optionalen Feld Themen-ID eintragen." + ], + "groupAlt": "Telegram-Formular mit maskiertem Bot-Token, negativer Supergruppen-ID beginnend mit -100 und Themen-ID 3", + "groupCaption": "Die Chat ID beginnt mit -100… und die optionale Topic ID zielt auf einen bestimmten Thread ab.", + "step3Title": "3 · Speichern und Testen", + "step3Body": "Bot-Token und Chat-ID eintragen, speichern und Test senden wählen. Die Nachricht sollte binnen einer Sekunde eintreffen. Bei Fehlern zeigt der Verlauf den Grund, etwa ungültiges Token, fehlende Gruppenmitgliedschaft oder Blockierung durch den Benutzer." + }, + "discord": { + "heading": "Discord", + "intro": "Discord-Kanäle akzeptieren eingehende Nachrichten über einen Webhook URL, der an einen einzelnen Kanal gebunden ist. Der Monitor benötigt diese URL und nichts anderes.", + "items": [ + "In Discord den Server öffnen und Servereinstellungen → Integrationen → Webhooks wählen.", + "Neuer Webhook wählen, einen Namen wie ProxMenux vergeben und den Zielkanal wählen. Avatar optional.", + "Webhook-URL kopieren wählen. Format: https://discord.com/api/webhooks/<id>/<token>.", + "Fügen Sie es in das Webhook URL-Feld des Discord-Tabs im Benachrichtigungsfeld ein und speichern Sie es." + ], + "imageAlt": "Discord Kanalformular mit Webhook URL Feld beginnend mit https://discord.com/api/webhooks/", + "imageCaption": "Discord — Fügen Sie die Webhook-URL aus Server-Einstellungen → Integrationen → Webhooks ein." + }, + "gotify": { + "heading": "Gotify", + "intro": "Gotify ist ein selbst betriebener Push-Server. Benötigt werden seine Basis-URL und ein in der Verwaltung erzeugtes Anwendungstoken.", + "items": [ + "Falls Gotify noch nicht läuft, folgen Sie der offiziellen Installationsanleitung.", + "Als Administrator in Gotify Apps → Anwendung erstellen öffnen, einen Namen wie ProxMenux vergeben und das Token kopieren.", + "Im Gotify-Kanal Server-URL auf die Basis-URL setzen, etwa https://gotify.example.com, und das Anwendungstoken einfügen.", + "Speichern und Test senden wählen." + ], + "imageAlt": "Gotify-Kanalformular mit Server-URL-Feld auf https://gotify.example.com und ein App-Token-Feld mit Platzhalter A_valid_gotify_token", + "imageCaption": "Gotify - Server-URL Ihrer selbst gehosteten Instanz sowie das App-Token von der Gotify-Admin-Benutzeroberfläche." + }, + "email": { + "heading": "E-Mail (SMTP)", + "intro": "E-Mail ist der flexibelste Kanal - und der mit den meisten Feldern. Sie benötigen einen SMTP-Server, einen Port, einen TLS-Modus, optional einen Benutzernamen und ein Passwort, eine Absenderadresse und mindestens einen Empfänger.", + "imageAlt": "SMTP-Formular mit Host, Port, TLS-Modus, Benutzername, Passwort, Absender, durch Kommas getrennten Empfängern und Betreffpräfix", + "imageCaption": "SMTP-Host, Port, TLS-Modus, optional Benutzername und Passwort, Absender, Empfänger und Betreffpräfix zum Filtern im Posteingang.", + "appNote": "Der Monitor nutzt SMTP mit Passwort. Gmail kann ein App-Passwort verlangen. Bei Microsoft hängt die Unterstützung vom Dienst und den Mandantenrichtlinien ab; ein App-Passwort umgeht keine Sperre der Basisauthentifizierung. Zulässigkeit vorab prüfen.", + "gmailTitle": "Gmail App Passwort", + "gmailIntro": "Gmail-App-Passwörter benötigen aktive Bestätigung in zwei Schritten. Andernfalls ist App-Passwörter nicht verfügbar.", + "gmailItems": [ + "Öffnen Sie myaccount.google.com/security und aktivieren Sie 2-Schritt-Verifizierung, wenn es nicht bereits eingeschaltet ist.", + "Gehen Sie zu myaccount.google.com/apppasswords.", + "Einen Namen wie ProxMenux eingeben und Erstellen wählen. Das 16-stellige Passwort kopieren.", + "Eintragen: Host smtp.gmail.com, Port 587, TLS-Modus STARTTLS, Benutzername Ihre Gmail-Adresse, Passwort das 16-stellige App-Passwort." + ], + "outlookTitle": "Microsoft / Outlook App Passwort", + "outlookIntro": "Microsoft-App-Passwörter erfordern zweistufige Überprüfung, gewährleisten aber keine SMTP-Kompatibilität. Verlangt der Dienst oder Mandant OAuth2, kann sich der Passwort-SMTP-Client des Monitors nicht anmelden. Nutzen Sie ein Relay mit passender Authentifizierung zum Anbieter.", + "outlookItems": [ + "Öffnen Sie account.microsoft.com/security und ermöglichen Sie eine zweistufige Verifizierung.", + "Falls angeboten, unter Erweiterte Sicherheitsoptionen → App-Passwörter die Option Neues App-Passwort erstellen wählen. Das garantiert keine Unterstützung für SMTP mit Passwort.", + "Falls ein App-Passwort erzeugt wird, kopieren und die SMTP-Zulässigkeit prüfen.", + "Nur bei erlaubtem Passwort-SMTP die genehmigten Werte eintragen: Host smtp.office365.com für Exchange Online, Port 587, TLS-Modus STARTTLS, Benutzername die Mailadresse und Passwort die erlaubte SMTP-Zugangsinformation. Persönliches Outlook.com hat andere Einstellungen und Anforderungen." + ], + "relayTitle": "Selbst gehostetes SMTP-Relay", + "relayBody": "Den Monitor auf ein eigenes SMTP-Relay wie Postfix richten. Das Relay authentifiziert sich beim Anbieter. Authentifizierung und TLS des Monitors müssen zum Relay passen; ein lokales Relay deaktiviert die Verschlüsselung nicht automatisch." + }, + "pushover": { + "heading": "Pushover", + "intro": "Pushover ist ein mobiler Push-Service mit offiziellen Apps für iOS, Android und Desktop-Browser. Der dedizierte ProxMenux-Kanal spricht direkt mit dem Pushover API, so dass keine Apprise-URL erforderlich ist.", + "stepsTitle": "Einrichtung", + "steps": [ + "Ein Pushover-Konto erstellen, die App auf den gewünschten Empfängergeräten installieren und anmelden.", + "Kopieren Sie den User Key, der auf Ihrem Pushover-Dashboard angezeigt wird. Ein Gruppenschlüssel kann stattdessen verwendet werden, wenn mehrere Personen oder Geräte die gleiche Warnung erhalten müssen.", + "Anwendung/API-Token erstellen öffnen, eine Anwendung namens ProxMenux erstellen und ihr 30-stelliges API-Token kopieren.", + "Unter Einstellungen → Benachrichtigungen → Pushover Benutzer- oder Gruppenschlüssel und API-Token eintragen. Gerät und Ton sind optional.", + "Speichern und Test senden wählen. Die App sollte die Nachricht sofort empfangen." + ], + "priorityTitle": "Prioritäre Zuordnung", + "priorityBody": "Normale Meldungen verwenden Pushover-Priorität 0. Mit Hohe Priorität für kritische Warnungen verwenden CRITICAL-Ereignisse Priorität 1 und umgehen Pushover-Ruhezeiten. Notfallpriorität 2 mit wiederholten Meldungen und Bestätigung wird nicht verwendet.", + "secretTitle": "Schützen Sie beide Werte", + "secretBody": "Der Benutzer- oder Gruppenschlüssel und das Anwendungstoken API autorisieren beide die Nachrichtenzustellung. ProxMenux speichert sie als geschützte Benachrichtigungsgeheimnisse und maskiert sie in der Schnittstelle; Veröffentlichen Sie keinen Wert in Screenshots oder Support-Protokollen." + }, + "apprise": { + "heading": "Apprise (generischer Hub für ~ 80-Dienste)", + "intro": "Apprise unterstützt etwa 80 Dienste über URLs. So erreichen Sie ntfy, Matrix, Slack, Microsoft Teams, Mattermost, Pushbullet, AWS SNS, Pushsafer, Rocket.Chat, Signal API und weitere Dienste ohne eigene Monitor-Integration. Auch Pushover ist möglich; für ein einzelnes Pushover-Ziel ist dessen eigener Kanal einfacher.", + "listIntro": "Die vollständige Liste der unterstützten Dienste und das genaue URL-Format für jeden einzelnen finden Sie in der offiziellen Apprise-Dokumentation:", + "listItems": [ + "Apprise-Dokumentation der Dienste — vollständige Liste.", + "URL-Grundlagen — Aufbau der Apprise-URLs." + ], + "stepsTitle": "Schritte", + "steps": [ + "Wählen Sie den Zieldienst im Apprise wiki und kopieren Sie die URL-Vorlage dafür. Jede Serviceseite zeigt das genaue zu verwendende Schema (ntfy://, matrix://, pover://, slack://...) sowie alle erforderlichen Token, Kanäle oder Hostnamen.", + "Füllen Sie die Platzhalter mit Ihren eigenen Anmeldeinformationen aus. Zum Beispiel sieht ein ntfy.sh-Thema aus wie ntfy://ntfy.sh/my-topic; eine Pushover-URL sieht aus wie pover://user@token; eine Matrix-URL sieht aus wie matrix://user:pass@host:port/#room.", + "Fügen Sie die endgültige URL in das Feld Apprise URL im Apprise-Tab des Benachrichtigungsfelds ein und speichern Sie es.", + "Drücken Sie Send Test, um zu überprüfen, ob die URL erreichbar ist und die Anmeldeinformationen akzeptiert werden." + ], + "deliveredTitle": "Was geliefert wird", + "deliveredBody": "Apprise erhält die gleiche Nutzlast wie die anderen Kanäle - Titel, Körper und Schweregrad (Info / Erfolg / Warnung / Misserfolg). Der Schweregrad wird dem zugeordnet, was der Zieldienst ausstellt (Icon, Priorität, Farbe). Rich-Message-Formatierung und die AI-Rewrite-Ebene laufen alle, bevor die URL aufgerufen wird, genau wie bei Telegram oder E-Mail.", + "fanoutTitle": "Eine URL pro Apprise Kanal", + "fanoutBody": "Der Monitor bietet ein URL-Feld pro Apprise-Kanal. Für mehrere Dienste, etwa ntfy.sh und Matrix, einen Apprise-API-Server mit markierter Konfiguration verwenden. Er verteilt den Monitor-Aufruf an alle URLs des gewählten Tags." + }, + "rich": { + "heading": "Formatierte Meldungen, Kategorien und Kanalfilter", + "intro": "Jeder Kanal hat drei Steuerelemente: Formatierte Meldungen oben, elf aufklappbare Benachrichtigungskategorien mit Ereignisschaltern und Test senden unten.", + "imageAlt": "Benachrichtigungskategorien-Panel mit Rich-Nachrichten-Master-Schalter oben hervorgehoben, zusammenklappbare Abschnitte für VM/CT, Backups, Ressourcen, Speicher, Netzwerk, Sicherheit, Cluster, Dienste, Gesundheitsmonitor, Updates jeweils mit Umschalt- und Ereignisanzahl und eine Send-Test-Schaltfläche", + "imageCaption": "Der Pfeil markiert Formatierte Meldungen. Darunter liegen elf Kategorien mit Ereignisschaltern; Test senden steht unten.", + "richTitle": "Formatierte Meldungen", + "richIntro": "Mit Formatierten Meldungen erscheint ein Kategorie-Emoji und das native Kanalformat, etwa Telegram-HTML oder farbige Discord-Einbettungen. Ohne diese Option wird derselbe Inhalt als einfacher Text gesendet:", + "plainHeader": "Einfacher Text — Formatierung aus", + "richHeader": "Formatierter Text — Formatierung ein", + "richOutro": "Jeder Kanal entscheidet separat. E-Mail kann einfach bleiben, während Telegram und Discord formatiert werden. Kanäle ohne unterstützte Formatierung wie einfache E-Mail oder Gotify erhalten Text.", + "togglesTitle": "Per-Event Kategorien", + "togglesIntro": "Jeder Kanal steuert Kategorien und Ereignisse unabhängig. Eine deaktivierte Kategorie unterdrückt ihre Ereignisse für diesen Kanal. Einzelne Schalter wirken innerhalb aktivierter Kategorien; im Dispatcher gibt es keinen globalen Ereignis-Hauptschalter.", + "togglesItems": [ + "Kategorieschalter je Kanal. Eine deaktivierte VM/CT-Kategorie unterdrückt vm_start und verwandte Ereignisse. Gespeichert als <channel>.events.<group>.", + "Ereignisschalter je Kanal. In einer aktiven Kategorie etwa backup_complete an Discord, aber nicht an Telegram senden. Gespeichert als <channel>.event.<event_type>." + ], + "togglesOutro": "Jede Kategorie zeigt aktivierte Ereignisse / Gesamtzahl und einen Schalter für die ganze Gruppe, etwa info-Sicherungen oder Update-Meldungen, ohne Aufklappen." + }, + "quiet": { + "heading": "Ruhezeiten", + "intro": "Während der Ruhezeit eines Kanals passieren nur CRITICAL-Ereignisse. INFO, WARNING und Aktionen werden auf Datenträger gespeichert und nach Ende des Fensters zusammengefasst gesendet.", + "imageAlt": "Kanaleinstellungen: Ruhezeit 22:00–07:00 mit Vorschau, darunter tägliche Zusammenfassung um 09:00 und Hinweis, dass diese CRITICAL und WARNING nicht verzögert", + "imageCaption": "Zwei unabhängige Einstellungen je Kanal: Ruhezeiten oben, tägliche Zusammenfassung darunter.", + "purposeTitle": "Wofür es ist", + "purposeItems": [ + "Keine Update-Meldung um 03:00. Sicherungen, App-Updates, Optimierungen und andere INFO-Ereignisse wecken Sie nachts nicht.", + "Kritische Ereignisse kommen weiterhin an. Nur als CRITICAL eingestufte Ereignisse umgehen Ruhezeiten. Der Name bestimmt den Schweregrad nicht: Die Journal-Überwachung meldet Fail2Ban-Sperren sowie Host-Abschaltung/Neustart als INFO; sie können daher gepuffert werden.", + "Zurückgestellte Meldungen behalten. Sie werden bis zum Ende des Fensters in SQLite gepuffert." + ], + "howTitle": "Wie es funktioniert", + "howItems": [ + "Pro Kanal. Telegram kann von 22:00 bis 07:00 ruhen, während E-Mail rund um die Uhr empfängt.", + "Beginn und Ende in lokaler Zeitzone: Beginn eingeschlossen, Ende ausgeschlossen. Das Fenster kann Mitternacht überschreiten, etwa 22:00–07:00.", + "Aktuelle Vorschau. Unter den Feldern werden der aktive Zustand und der nächste Wechsel angezeigt.", + "Während des Fensters: CRITICAL wird normal versendet. INFO und WARNING bleiben in der SQLite-Tabelle quiet_pending.", + "Wenn sich das Fenster schließt: wird eine einzige gruppierte Benachrichtigung mit allem, was sich angesammelt hat, gesendet - eine Zeile pro gepuffertem Ereignis in chronologischer Reihenfolge. Der Puffer wird erst gelöscht, nachdem der Kanal die Lieferung bestätigt hat, so dass ein vorübergehender Telegram / SMTP-Ausfall den Nachtkontext nicht verliert.", + "Über Neustarts hinweg. Der Puffer bleibt auf Datenträger. Nach einem Neustart erkennt der nächste Zyklus ausstehende Zeilen und versendet sie gegebenenfalls als Wiederherstellungszusammenfassung." + ], + "criticalTitle": "Welche Ereignisse CRITICAL sind", + "criticalBody": "Der Erzeuger legt den Schweregrad fest. Festplatten-, Abschalt- oder Sicherheitsereignisse sind nicht allein wegen ihres Namens CRITICAL. Die Journal-Überwachung erzeugt ip_block, system_shutdown und system_reboot als INFO. Der Ereigniskatalog nennt die Typen; den tatsächlichen Schweregrad bestimmen Erzeuger und empfangenes Ereignis." + }, + "digest": { + "heading": "Tägliche Zusammenfassung der INFO-Ereignisse", + "intro1": "Die tägliche Zusammenfassung ist freiwillig aktivierbar. Geeignete INFO-Meldungen, etwa verfügbare Updates, werden um 09:00 oder zur gewählten Zeit gebündelt. Sicherungs-/Replikationsergebnisse und direkte Aktionen sind ausgenommen. Ruhezeiten verzögern nicht kritische Meldungen innerhalb eines Fensters.", + "intro2": "Die Einstellung steht unter den Ruhezeiten in derselben Karte, siehe Ruhezeiten. Beide sind unabhängig aktivierbar.", + "purposeTitle": "Wofür es ist", + "purposeItems": [ + "Morgendlicher Überblick. Eine Zusammenfassung um 09:00 ersetzt etwa 20 einzelne Meldungen vom Vortag, ohne 20 Telegram-Nachrichten lesen zu müssen.", + "Aktivität und Dringlichkeit unterscheiden. INFO beschreibt Geschehenes; CRITICAL und WARNING zeigen Handlungsbedarf. Geeignete INFO-Ereignisse werden gebündelt, andere behalten die direkte Zustellung." + ], + "howTitle": "Wie es funktioniert", + "howItems": [ + "Je Kanal aktivieren. Standardmäßig aus. Nur gewünschte Kanäle zusammenfassen; andere weiter direkt beliefern.", + "Zustellzeit in lokaler Zeitzone, standardmäßig 09:00. Der Versand erfolgt etwa innerhalb von 60 s um diese Minute.", + "Enthalten: geeignete allgemeine Ereignisse mit Schwere INFO, etwa App-Update verfügbar, Tailscale-Update verfügbar, ProxMenux-Optimierungsupdate verfügbar, APT-Sicherheitsupdates ausstehend oder Meldung zur Versandbegrenzung. Sicherungsergebnisse und ausgenommene Aktionen bleiben direkt.", + "Was ist nie verzögert:", + "Dauerhafte Speicherung. Ausstehende Ereignisse bleiben bis zur Zustellzeit in digest_pending in SQLite und überstehen Neustarts.", + "Leere Tage sind still. Wenn nichts INFO-Level passiert ist, wird kein Digest gesendet - der Kanal bleibt ruhig, anstatt eine Nachricht \"keine Ereignisse zu melden\" zu erhalten." + ], + "neverDelayedSub": [ + "CRITICAL-Ereignisse gehen immer sofort durch.", + "WARNING-Ereignisse gehen immer sofort durch.", + "VM/CT-Aktionen und Fehler, Sicherungsbeginn und -ergebnisse, Replikationsergebnisse sowie Host-Abschaltung/Neustart umgehen die tägliche Zusammenfassung auch als INFO. Ruhezeiten können nicht kritische Ereignisse weiterhin verzögern." + ], + "comboTitle": "Kombinieren von ruhigen Stunden und täglichem Digest", + "comboBody": "Ein Kanal kann beides verwenden: Ruhezeit 22:00–07:00 und Zusammenfassung um 09:00. Nicht kritische Ereignisse des Fensters werden um07:00 freigegeben; geeignete INFO-Ereignisse außerhalb gelangen in die Tageszusammenfassung. CRITICAL umgeht beides; WARNING nur die Tageszusammenfassung, nicht die Ruhezeit. Wählen Sie ein Ruhefenster, eine Zusammenfassung zur festen Zeit oder beides." + }, + "displayName": { + "heading": "Anzeigename", + "intro": "Jede Meldung trägt einen Anzeigenamen für den Host, etwa 🏠 home-lab, im Fuß der formatierten Meldung und im E-Mail-Betreffpräfix.", + "imageAlt": "Anzeigename mit Beispiel amd; eigener Name möglich, leeres Feld verwendet Systemhostnamen", + "imageCaption": "Anzeigename leer lassen, um den Systemhostnamen zu verwenden, oder einen eigenen Namen eintragen.", + "outro": "Wenn das Feld leer ist, greift der Monitor auf den Systemhostnamen zurück. Der Override ist vor allem nützlich, wenn Sie mehrere ProxMenux-Hosts ausführen, die an denselben Telegram-Chat oder Posteingang senden - ein freundlicheres Label (home-lab, office-pve) ist einfacher zu lesen als pve01.lan oder pmx-prod-01." + }, + "dispatch": { + "heading": "Versandablauf", + "intro": "Die Tabelle beschreibt drei Mechanismen. Tatsächlich folgen auf die Zusammenfassung von Ereignisspitzen Zustellreservierung, Wiederholungsprüfung und Gruppenlimit; danach Textaufbereitung und Kanalsteuerung:", + "headerStage": "Phase", + "headerWhat": "Was es tut", + "headerTunable": "Anpassbar?", + "rows": [ + { + "stage": "Deduplizierung per Fingerabdruck", + "what": "Jedes Ereignis wird in einen Fingerabdruck gehasht (event_type + key fields from data). Identische Fingerabdrücke innerhalb eines kurzen Fensters gelten als Duplikate des ersten.", + "tunable": "Nein — interne Dispatcherlogik." + }, + { + "stage": "Wartezeit für Wiederholungen", + "what": "Nach erfolgreichem Versand werden Wiederholungen unterdrückt; der Zustand steht in notification_last_sent. Basiswerte für CRITICAL, WARNING, INFO, resources und updates: 86400 s. Ausnahmen: 5 s für VM/CT-Aktionen und Host-Neustart/Abschaltung, 10 s für Sicherungs-/Replikationsergebnisse, 1800–3600 s für mehrere Gesundheitskategorien. Explizite Ereignis-/Gruppeneinstellungen haben Vorrang.", + "tunable": "Ja — ausdrückliche Konfigurationswerte je Ereignis oder Gruppe überschreiben die Vorgaben." + }, + { + "stage": "Zusammenfassung von Ereignisspitzen", + "what": "Wenn N-Ereignisse in einem kurzen Fenster ankommen (z. B. eine Brute-Force-Flut von SSH), werden sie zu einer einzigen burst_*-Nachricht mit einer Zählung und einer Stichprobe zusammengefasst.", + "tunable": "Nein — Fenster und Schwellenwert sind pro Ereignistyp fest codiert." + } + ], + "calloutTitle": "Versand im Hintergrundthread", + "calloutBody": "Die Dispatchschleife läuft in einem eigenen Thread. Die HTTP-Anforderung, die ein Ereignis aussendet, kehrt zurück, sobald das Ereignis in der Warteschlange steht – sie wartet nicht auf Telegram, SMTP oder webhook RTT. Jedes Sendeergebnis wird zur retrospektiven Überprüfung in der Historientabelle erfasst." + }, + "aiRewrite": { + "heading": "Optionales AI-Rewrite", + "body1": "Geeignete Ereignisse können vor dem Versand durch ein LLM umgeschrieben werden. backup_complete und backup_fail sind ausgenommen. KI ist standardmäßig aus und läuft im Versandthread. Bei Fehler oder Zeitüberschreitung wird der Vorlagentext verwendet.", + "body2": "Unterstützt OpenAI, Anthropic, Google Gemini, Groq, OpenRouter und lokales Ollama. Pro Kanal: Detailgrad (brief, standard, detailed), Sprache, Anweisungsmodus (default oder custom) und eigene Anweisung. Anleitung und Beispiele unter KI-Assistent.", + "privacyTitle": "Datenschutzerklärung", + "privacyBody": "KI-Anfragen können Titel, Schweregrad, Text, System-/Benutzeranweisungen und Kontext mit Hostnamen, IPs, Benutzernamen, Fehlern und Journalzeilen enthalten. Sie gehen an den gewählten Endpunkt. Ollama bleibt nur mit lokalem Server und lokalem Modell lokal; entfernte Server oder Cloudmodelle übertragen Daten nach außen. Bei lokalen Anforderungen KI deaktivieren oder kontrollierten lokalen Server und Modell nutzen." + }, + "pveWebhook": { + "heading": "PVE webhook Integration", + "intro1": "Proxmox verwendet Benachrichtigungsziele: sendmail, Gotify, SMTP und auf unterstützten Versionen Webhook. Der Monitor registriert ein webhook-Ziel. PVE-Meldungen zu HA, Replikation und GUI-Sicherungen gelangen damit in denselben Versandprozess.", + "intro2": "Das Ziel ist von der Proxmox GUI unter Datacenter → Benachrichtigungen → Benachrichtigungsziele sichtbar:", + "imageAlt": "Proxmox VE Webhook-Dialog bearbeiten, der das automatisch erstellte proxmenux-webhook-Ziel mit der Methode POST, URL http://127.0.0.1:8008/api/notifications/webhook und einer JSON-Körpervorlage mit Escape-Titel, Escape-Nachricht, Escape-Schweregrad, Escape-Zeitstempel und json-Feldern zeigt", + "imageCaption": "Das PVE-seitige webhook-Ziel, wie Proxmox es sieht (die GUI befindet sich im konfigurierten Gebietsschema des Hosts - Spanisch in diesem Beispiel). Gleiche Felder gelten in jeder Sprache.", + "registeredIntro": "Was registriert wird:", + "registeredItems": [ + "Methode und URL. POST http://127.0.0.1:8008/api/notifications/webhook ohne Monitor-HTTPS; mit HTTPS der gesonderte lokale HTTP-Port 8009. Beide bleiben auf demselben Host.", + "Nachrichtenvorlage. JSON mit nativen Handlebars-Helfern von PVE, in der Konfiguration als Base64 gespeichert. Dekodiert ergibt es:", + "Matcher. Ein Begleiter matcher: proxmenux-matcher Block mit mode all, so dass jede PVE-Benachrichtigung das Ziel erreicht.", + "Private Konfiguration. Einrichtung schreibt webhook: proxmenux-webhook in /etc/pve/priv/notifications.cfg, einschließlich Base64-kodiertem gemeinsamem Geheimnis. Das öffentliche Ziel nutzt es für X-Webhook-Secret. Der Block ist nicht leer." + ], + "securityTitle": "Wie der Empfänger gesichert ist", + "securityIntro": "Der webhook-Empfänger bei POST /api/notifications/webhook verwendet verschiedene Sicherheitsschichten, je nachdem, woher die Anforderung stammt:", + "securityItems": [ + "Lokale Quellen (127.0.0.1 / ::1). Mengenbegrenzung gilt; entfernte Geheimnis-, Zeitstempel- und Wiederholungsprüfungen entfallen. Auch Adressen lokaler Host-Schnittstellen gelten als lokal. Das automatische PVE-Ziel verwendet Loopback.", + "Entfernte Aufrufer. Zusätzlich zum Mengenlimit werden Geheimnis in X-Webhook-Secret, Zeitstempel in X-ProxMenux-Timestamp oder JSON, Wiederholungen und eine optionale IP-Liste geprüft. Das Geheimnis steht in SQLite und als Base64-Kopie in /etc/pve/priv/notifications.cfg, damit PVE den Header sendet." + ], + "practiceTitle": "In der Praxis", + "practiceBody": "PVE verwendet http://127.0.0.1:8008 ohne HTTPS, sonst HTTP-Port 8009. Externe Integrationen an https://<monitor-host>:<port>/api/notifications/webhook müssen X-Webhook-Secret und aktuellen Zeitstempel liefern sowie Wiederholungs-/IP-Prüfungen bestehen. Nur der Geheimnis-Header reicht nicht.", + "actionsIntro": "Der Monitor verwaltet dieses Ziel durch drei Aktionen auf der Registerkarte Einstellungen:", + "actionsItems": [ + "Einrichten legt beim Aktivieren den Eintrag in /etc/pve/notifications.cfg an. Nur Änderungen werden geschrieben; die drei jüngsten Sicherungen bleiben unter /usr/local/share/proxmenux/backups/pve-notifications/. Solange /etc/pve nicht eingehängt ist, wird gewartet, bis pve-cluster wieder verfügbar ist.", + "Bereinigen entfernt den Eintrag und behält die vorherige Sicherung.", + "Konfiguration lesen zeigt Ziele und Zuordnungsregeln zur Kontrolle mehrerer PVE-Versandrouten." + ], + "clusterTitle": "Clusterknoten", + "clusterBody": "/etc/pve/ samt Ziel-URL und Geheimnis wird im Cluster geteilt. Jeder Knoten ruft seinen eigenen Empfänger auf: 127.0.0.1:8008 ohne HTTPS, sonst HTTP 8009. Monitor auf jedem relevanten Knoten betreiben und das gemeinsame Ziel an alle Empfänger anpassen." + }, + "catalogue": { + "heading": "Ereigniskatalog", + "intro": "Rund siebzig Ereignistypen sind in elf UI-Kategorien unterteilt. Das Benachrichtigungsfeld macht einen zusammenklappbaren Abschnitt pro Gruppe mit einem Umschalter für jedes Ereignis darin. Jedes Ereignis ist standardmäßig aktiviert, sofern nicht ausdrücklich anders gekennzeichnet.", + "headerGroup": "Gruppe", + "headerEvents": "Ereignisse", + "rows": [ + { + "group": "VM / CT", + "events": "vm_start, vm_start_warning, vm_stop, vm_shutdown, vm_fail, vm_restart, plus die ct_* Äquivalente, migration_start, migration_complete, migration_warning, migration_fail, replication_complete, replication_fail." + }, + { + "group": "Sicherungen", + "events": "backup_start, backup_complete, backup_warning, backup_fail, snapshot_complete, snapshot_fail." + }, + { + "group": "Ressourcen", + "events": "cpu_high, ram_high, temp_high, load_high." + }, + { + "group": "Speicher", + "events": "disk_space_low, disk_io_error, storage_unavailable, smart_test_complete, smart_test_failed." + }, + { + "group": "Netzwerk", + "events": "network_down, network_latency." + }, + { + "group": "Sicherheit", + "events": "auth_fail, ip_block, firewall_issue, user_permission_change." + }, + { + "group": "Cluster", + "events": "split_brain, node_disconnect, node_reconnect." + }, + { + "group": "Dienste", + "events": "system_startup, system_shutdown, system_reboot, system_problem, service_fail, oom_kill, system_mail." + }, + { + "group": "Gesundheitsmonitor", + "events": "new_error, error_resolved, error_escalated, health_degraded, health_persistent, health_issue_new, health_issue_resolved." + }, + { + "group": "Aktualisierungen", + "events": "update_summary, update_available, pve_update, update_complete, proxmenux_update." + }, + { + "group": "Hardware / GPU", + "events": "gpu_mode_switch, gpu_passthrough_blocked, pci_passthrough_conflict, ai_model_migrated." + } + ], + "burstNote": "Eine Handvoll burst_*-Aggregationstypen (burst_auth_fail, burst_ip_block, burst_disk_io usw.) gibt es nur im Dispatcher — sie ersetzen einzelne Ereignisse durch eine einzige Zusammenfassungsnachricht und werden nicht als Umschaltungen in der Benutzeroberfläche angezeigt. Sie erben den Ein/Aus-Zustand ihres übergeordneten Ereignistyps.", + "backupResults": { + "heading": "Backup Ergebnisse", + "intro": "Eine Benachrichtigung über einen Proxmox Backup-Job gibt an, wie der Job beendet wurde. Das Ergebnis wird aus dem Bericht gelesen, den Proxmox sendet, und setzt den Titel, das Symbol, das mit Rich-Nachrichten angezeigt wird, und die Statuszeile der E-Mail.", + "headerIcon": "Icon", + "headerResult": "Ergebnis", + "headerWhen": "Wann", + "rows": [ + { + "icon": "💾✅", + "result": "Backup vollständig", + "when": "Alle Gäste wurden gesichert; der Bericht enthält keine Warnungen." + }, + { + "icon": "💾⚠️", + "result": "Backup mit Warnungen abgeschlossen", + "when": "Alle Gäste wurden gesichert; der Bericht enthält mindestens eine Warnung." + }, + { + "icon": "💾❌", + "result": "Backup-Fehler gemeldet", + "when": "Ein Gast scheiterte oder der Job endete mit einem Fehler." + }, + { + "icon": "💾❔", + "result": "Backup-Ergebnis nicht bestätigt", + "when": "Der Bericht ist unvollständig oder gibt kein Ergebnis für jeden Gast an." + } + ], + "items": [ + "Der Titel identifiziert den Auftrag. Er nennt Speicher sowie bei einem Gast dessen Typ, Name und ID. Bei einem Fehler wird der betroffene Gast genannt.", + "Der Text listet jeden Gast mit Ergebnis, Größe, Dauer und Archiv sowie anschließend die Gesamtwerte auf.", + "Warnungen und Fehler werden einmal aufgelistet. Wiederholte Zeilen werden ein einziges Mal mit der Hauptursache zuerst angezeigt; Nach acht Zeilen wird der Rest in einer Schlusszeile gezählt und bleibt im Proxmox-Taskprotokoll.", + "Ein Fehler vor dem ersten Gast zeigt die Proxmox-Ursache, etwa einen nicht vorhandenen Speicher.", + "Zusammenfassungen behalten das Ergebnis. Sicherungen in der Ruhezeit-Zusammenfassung behalten ihr Ergebnissymbol. Sicherungsergebnisse umgehen die Tageszusammenfassung." + ] + } + }, + "history": { + "heading": "Verlauf", + "body1": "Jeder tatsächliche Versandversuch steht in notification_history: Zeit sent_at, Kanal, Ereignis, Schwere, Titel, Text, success und bei Fehler error_message. Spitzen erscheinen als Typ burst_*. Durch Wartezeiten unterdrückte Ereignisse werden nicht protokolliert.", + "body2": "Einstellungen → Benachrichtigungen enthält den standardmäßig geschlossenen Benachrichtigungsverlauf mit den letzten 20 Einträgen: Ergebnis, Kanal, Datum, Fehler und Status jedes Tageszusammenfassungslaufs. Die Seite bietet kein Löschen; Audit & Report prüft dieselben Zustelldaten.", + "body3": "Die gleichen Daten werden bei GET /api/notifications/history mit optionalen limit, offset, severity und channel Abfrageparametern ausgesetzt und können mit DELETE /api/notifications/history gelöscht werden." + }, + "api": { + "heading": "API-Endpunkte", + "headerEndpoint": "Endpunkt", + "headerMethod": "Methode", + "headerUse": "Verwenden", + "rows": [ + { + "endpoint": "/api/notifications/settings", + "method": "GET / POST", + "use": "Lesen oder schreiben Sie die vollständige Konfiguration (Kanäle, Per-Event-Toggles, AI-Rewriter, Display Name)." + }, + { + "endpoint": "/api/notifications/test", + "method": "POST", + "use": "Sende eine Testbenachrichtigung an einen Kanal: '{'\"channel\":\"telegram\"'}'." + }, + { + "endpoint": "/api/notifications/test-ai", + "method": "POST", + "use": "Rendern und schreiben Sie ein Beispielereignis um, ohne es zu versenden." + }, + { + "endpoint": "/api/notifications/provider-models", + "method": "POST", + "use": "Listen Sie verfügbare Modelle für den ausgewählten AI-Anbieter auf." + }, + { + "endpoint": "/api/notifications/send", + "method": "POST", + "use": "Emittieren Sie ein Ereignis von außen (benutzerdefinierte Integrationen)." + }, + { + "endpoint": "/api/notifications/history", + "method": "GET / DELETE", + "use": "Lesen Sie Geschichte mit Filtern; löschen Sie es." + }, + { + "endpoint": "/api/notifications/webhook", + "method": "POST", + "use": "Empfängt Proxmox-Meldungen. Lokale Quellen umgehen entfernte Authentifizierungsprüfungen, bleiben aber mengenbegrenzt. Entfernte Anfragen werden anhand X-Webhook-Secret, Zeitstempel in X-ProxMenux-Timestamp oder JSON, Wiederholungen und konfigurierter IP-Liste geprüft." + }, + { + "endpoint": "/api/notifications/proxmox/setup-webhook", + "method": "POST", + "use": "Registrieren Sie den Monitor als Ziel in /etc/pve/notifications.cfg." + }, + { + "endpoint": "/api/notifications/proxmox/cleanup-webhook", + "method": "POST", + "use": "Entfernen Sie das Monitor-Ziel aus der Benachrichtigungskonfiguration von PVE." + }, + { + "endpoint": "/api/notifications/proxmox/read-cfg", + "method": "GET", + "use": "Zeigen Sie die aktuelle PVE-Benachrichtigungskonfiguration so an, wie PVE sie sieht." + } + ] + }, + "whereNext": { + "heading": "Wohin als nächstes", + "items": [ + { + "label": "KI-Assistent", + "href": "/docs/monitor/ai-assistant", + "tail": " — Anbieter, Modelle, Anweisungsmodi, Sprachen und Kanal-Detailgrad." + }, + { + "label": "Gesundheitsmonitor", + "href": "/docs/monitor/health-monitor", + "tail": " — wichtigste einzelne Ereignisquelle mit eigenen Wartezeiten je Kategorie." + }, + { + "label": "Architektur", + "href": "/docs/monitor/architecture", + "tailRich": " — Rolle der SQLite-Tabellen notification_last_sent, notification_history und des Versandthreads im Monitor." + }, + { + "label": "Zugriff und Authentifizierung", + "href": "/docs/monitor/access-auth", + "tailRich": " — API-Tokens für Skripte erstellen, die /api/notifications/send aufrufen." + }, + { + "label": "Dashboard → Systemprotokolle", + "href": "/docs/monitor/dashboard/system-logs", + "tail": " — Live-Ansicht des Systemjournals, das die Journal-Überwachung auswertet." + } + ] + } +} diff --git a/web/messages/en/docs/monitor/access-auth.json b/web/messages/en/docs/monitor/access-auth.json index 8a495091..8cef948e 100644 --- a/web/messages/en/docs/monitor/access-auth.json +++ b/web/messages/en/docs/monitor/access-auth.json @@ -19,7 +19,7 @@ "reaching": { "heading": "Reaching the dashboard", "intro": "ProxMenux Monitor binds to 0.0.0.0:8008. There are three common ways to reach it:", - "outro": "Direct access matches what the systemd unit ships out of the box. The reverse-proxy and Secure Gateway sections below cover the other two. The Monitor honours X-Forwarded-For, X-Forwarded-Proto and X-Forwarded-Host so URLs and CORS work behind any of them without manual configuration." + "outro": "Direct access matches the default systemd unit. Reverse-proxy and Secure Gateway access are described below. Trust for client IPs in X-Forwarded-For requires PROXMENUX_TRUST_PROXY=1 and a proxy you control. The presence of X-Forwarded-Proto or X-Forwarded-Host alone does not enable proxy trust; the frontend builds API URLs from the browser’s origin." }, "firstLaunch": { "heading": "First-launch flow", @@ -32,7 +32,7 @@ "rows": [ { "button": "Yes, Setup Password", - "what": "Opens a form with the mandatory username + password and an optional display name + avatar image. Stores them in auth.json with enabled: true. Returns a JWT so you're logged in immediately. The form is documented in detail below.", + "what": "Opens a form requiring a username and password, with optional display name and avatar image. Enables authentication in auth.json with enabled: true and returns a JWT to log you in. Optional profile fields are saved by subsequent calls, as documented below.", "api": "POST /api/auth/setup" }, { @@ -103,12 +103,12 @@ "what": "Removes the avatar. The header falls back to the initial-on-coloured-circle placeholder." } ], - "reversibleTitle": "Continuing without protection is reversible — but only from the host", + "reversibleTitle": "Continuing without protection is reversible", "reversibleBody": "Once you click No, Continue Without Protection, the welcome dialog never appears again. You can re-enable authentication from the Security tab inside the dashboard, or by editing /root/.config/proxmenux-monitor/auth.json and removing the declined flag, then restarting the service." }, "password": { "heading": "Password authentication", - "intro": "After Set up, every API call (except the few public endpoints listed below) requires a JWT in Authorization: Bearer <token>:", + "intro": "After setup, protected API calls require a JWT in Authorization: Bearer <token>:", "items": [ "Session token (login): 24-hour expiration. Issued by POST /api/auth/login.", "API token (integrations): 365-day expiration. Issued by POST /api/auth/generate-api-token. Documented separately in the next section." @@ -117,11 +117,11 @@ "loginImageCaption": "Once authentication is configured, every visit to the dashboard starts here. With 2FA enabled, the screen asks for the 6-digit code in a second step after the password is accepted.", "loginFlowTitle": "Login flow", "twofaIntro": "With 2FA enabled, the same call returns requires_totp: true first. Re-issue with the 6-digit code:", - "publicTitle": "Public endpoints (no token)", - "publicIntro": "These are the only endpoints that work without authentication, even when auth is enabled:", + "publicTitle": "Public access and protected probes", + "publicIntro": "Login and authentication status are public. Initial setup is available while no username and password are stored, including after declining protection. System-data probes require authentication when protection is enabled:", "publicItems": [ - "/api/auth/login, /api/auth/status, /api/auth/setup — the auth flow itself, by necessity.", - "/api/system-info — lightweight system snapshot (hostname, uptime, health.status). The right endpoint for external probes (Uptime Kuma, load-balancer health checks, status pages)." + "/api/auth/login and /api/auth/status are public. /api/auth/setup creates the initial account and rejects attempts to overwrite existing credentials.", + "/api/system-info is a public lightweight system-information endpoint, including health.status. It is not decorated with the token requirement. /api/auth/status is another public endpoint suitable for a reachability check." ], "cryptoTitle": "Cryptography and storage", "cryptoIntro": "ProxMenux Monitor is open source — none of this is secret. Documenting the stack here explicitly is a deliberate choice: operators who store credentials on their host deserve to know how those credentials are protected before they decide to trust them. The algorithms below are the same ones the code in scripts/auth_manager.py uses; this section is a contract, not a marketing promise.", @@ -146,7 +146,7 @@ }, { "asset": "2FA TOTP secret", - "algorithm": "Standard TOTP (RFC 6238) base32-encoded. Backup codes are pre-generated, single-use, hashed with the same PBKDF2 scheme as the password.", + "algorithm": "Standard TOTP (RFC 6238), with a base32-encoded secret. The eight recovery codes are single-use and stored as SHA-256 hashes.", "where": "auth.json → totp_secret + backup_codes[]" }, { @@ -170,7 +170,7 @@ "heading": "Two-Factor Authentication (TOTP)", "intro": "2FA adds a second factor on top of your password: a 6-digit code that rotates every 30 seconds, generated on a phone or password manager you control. Even if someone obtains the password, they still can't log in without the code from your device. ProxMenux Monitor implements the standard TOTP protocol (RFC 6238), so any authenticator app works.", "pickTitle": "Pick an authenticator app", - "pickIntro": "If you already use one for Google / GitHub / your bank, that one will work — skip to the setup walkthrough. If not, here's a survey of common options. All of them are free; the differences are mainly about which platforms they run on and how (or whether) they back up your secrets.", + "pickIntro": "If you already have a TOTP app, you can use it here. Common choices are listed below. Some are free and others require a subscription; supported platforms and backup methods also differ.", "headerApp": "App", "headerPlatforms": "Platforms", "headerAppNotes": "Notes", @@ -190,8 +190,8 @@ { "name": "Authy", "href": "https://authy.com/", - "platforms": "iOS, Android, desktop", - "notes": "Multi-device encrypted sync (the desktop app is being phased out — check the latest status)." + "platforms": "iOS, Android", + "notes": "Encrypted sync across devices. The desktop app reached end of life on 19 March 2024 and is no longer supported." }, { "name": "Apple Passwords", @@ -203,7 +203,7 @@ "name": "Bitwarden", "href": "https://bitwarden.com/", "platforms": "iOS, Android, desktop, browser", - "notes": "Open source. TOTP lives next to the password it protects (handy if you also use BW for passwords; defeats \"separate device\" if you don't)." + "notes": "Open source. TOTP can be stored alongside passwords in the vault. Keeping both in the same vault is convenient, but does not provide separation onto a second device." }, { "name": "1Password", @@ -238,21 +238,21 @@ { "name": "FreeOTP+", "href": "https://github.com/helloworld1/FreeOTPPlus", - "platforms": "Android, iOS", - "notes": "Open source (Red Hat-led). Minimal — no cloud, no account." + "platforms": "Android", + "notes": "Open-source fork of FreeOTP for Android, with import/export features. No account required." } ], "backupTitle": "What \"backup\" really matters for", - "backupBody": "If you lose the device that has the authenticator on it, the only ways back in are (1) a backup code saved when you enabled 2FA, or (2) a backup of the authenticator's vault. Apps with cloud sync (Google Auth, Microsoft Auth, Authy, Apple Passwords, Ente, 2FAS, Bitwarden, 1Password) can restore on a new device. Apps without cloud (Aegis, Raivo, FreeOTP+) need an encrypted export file you've copied somewhere safe. Either approach works — the bad case is \"no backup at all\".", + "backupBody": "If you lose the authenticator device, use a saved recovery code or restore the app from a backup you configured beforehand. Cloud sync and local exports differ by app; check that your chosen method actually restores the TOTP secrets. Root access to the host also allows recovery, as explained below. Keep a separate, secure backup.", "setupTitle": "Step-by-step setup from the dashboard", "setupImageAlt": "2FA setup screen with QR code and backup codes", - "setupImageCaption": "The 2FA setup dialog — QR code, Base32 secret (for manual entry), and the ten one-time backup codes. The codes are only displayed here; if you close the dialog without copying them, they're gone.", + "setupImageCaption": "The 2FA setup dialog shows a QR code, a Base32 secret for manual entry, and eight one-time recovery codes. Copy the codes before closing the dialog; they are not displayed again.", "setupSteps": [ "Install the authenticator app on your phone (or open your password manager). One of the apps from the table above. You only need to do this once — the same app will hold codes for every service you protect.", "Log into the dashboard with your username and password.", - "Open the Security tab in the dashboard sidebar, then click Enable 2FA. A dialog opens with a QR code, a long string in Base32 format and ten short codes labelled \"backup codes\".", + "Open the Security tab in the dashboard sidebar, then click Enable 2FA. A dialog shows a QR code, the Base32 secret and eight recovery codes.", "Add the entry to the authenticator app:", - "Save the backup codes. Copy the ten codes somewhere safe — a password manager, an encrypted note, a printed copy in a drawer. Treat them like spare keys: each works exactly once and gets you in if your phone is gone or broken.", + "Save the recovery codes. Store all eight safely in a password manager, encrypted note or secure printed copy. Each works once if your authenticator is unavailable.", "Confirm by typing the current 6-digit code from the app into the \"Verification code\" field of the setup dialog and submit. Codes refresh every 30 seconds, so if it expires while you're typing, just enter the next one.", "Done. 2FA is now active. Next time you log in, the dashboard asks for the password first; once it's accepted it asks for the current 6-digit code." ], @@ -261,17 +261,17 @@ "Manual fallback (when scanning isn't possible — e.g. setting up on the same phone you opened the dashboard with): tap Add account → Enter setup key. Type any name (e.g. Proxmox Monitor), paste the Base32 string from the dialog, leave Type as Time-based, save." ], "testTitle": "Test before logging out", - "testBody": "Once you click Save, log out and log back in immediately, while the setup dialog is still fresh in your mind. If the code is rejected (clock-skew between server and phone is the most common cause), you can still fix it from the open session. Logging out without testing first means a one-trip-no-return — at that point only a backup code or editing auth.json on the host gets you back in.", + "testBody": "Keep your current session open and test a new login in a private window immediately after setup. If the code is rejected, check the server and phone clocks before logging out of the working session. If access is already lost, use a recovery code or edit auth.json from the host shell.", "lostTitle": "Lost authenticator", "lostIntro": "Three escape hatches, in order of how disruptive they are:", "lostItems": [ - "Use a backup code. At the login screen, in the TOTP field, type one of the ten codes you saved at setup time. Each works once and is then consumed; the remaining codes still work. Once you're in, regenerate 2FA from Settings to get a fresh ten.", + "Use a recovery code. Enter one of the eight saved codes in the TOTP field. It works once; unused codes remain valid. After logging in, set up 2FA again from Settings to obtain eight new codes.", "Restore the authenticator from cloud / backup. If your app has a cloud sync (Google, Microsoft, Authy, Apple Passwords via iCloud Keychain, Ente, 2FAS) install it on a new device, sign in, and the entries reappear. If your app uses an encrypted export file (Aegis, Raivo, FreeOTP+), install the app on the new device and import the file.", "Disable 2FA from the host shell. When the previous options aren't available, edit /root/.config/proxmenux-monitor/auth.json on the Proxmox host (you need root SSH or console access), set totp_enabled to false, save, and restart the service:" ], "lostShellOutro": "You can log in with username + password only, then re-enable 2FA from Settings.", "disableTitle": "Disable 2FA", - "disableBody": "From the dashboard, open the Security tab and click Disable 2FA. The endpoint POST /api/auth/totp/disable requires the current password as confirmation, then deletes the TOTP secret and clears the backup codes. Remember to also remove the entry in the authenticator app — the app doesn't know the server side is gone, so the dead entry will sit there forever otherwise.", + "disableBody": "Open Security and choose Disable 2FA. POST /api/auth/totp/disable requires the current password and a valid TOTP or recovery code. It removes the TOTP secret and recovery codes. Remove the old entry from your authenticator app too.", "rejectedTitle": "The 6-digit code is always rejected", "rejectedIntro": "TOTP is time-based — server clock and phone clock must agree to within ~30 s. Two checks:", "rejectedItems": [ @@ -310,31 +310,31 @@ "intro": "Two paths to TLS:", "items": [ "Reverse proxy (recommended). Terminate TLS on Nginx / Caddy / Traefik and forward HTTP on port 8008 to the Flask process. Snippets below.", - "Direct HTTPS in the AppImage. Configure a certificate via POST /api/ssl/configure (UI: Settings → SSL). When SSL is configured the process switches from Flask's dev server to gevent.pywsgi with the gevent-websocket handler so WebSocket terminal also works over WSS. The cert files live wherever you point them; the paths are stored in the SSL config." + "Direct HTTPS in the AppImage. Configure a certificate with POST /api/ssl/configure (UI: Settings → SSL). The HTTPS path uses gevent.pywsgi with its standard handler; flask-sock handles WebSocket upgrades for WSS. Certificate paths are stored in the SSL configuration." ], "calloutTitle": "Direct HTTPS limitations", - "calloutBody": "The bundled gevent path is suitable for self-signed or LAN-only certificates. For Let's Encrypt / ACME and automatic renewal, run a real reverse proxy in front — Caddy auto-renews and Traefik / Nginx have well-known patterns. The Monitor doesn't implement ACME on its own." + "calloutBody": "The Monitor can use a Proxmox-managed certificate or custom certificate files. It does not issue ACME certificates itself. For automatic issuance and renewal, use Proxmox ACME or a reverse proxy such as Caddy, Traefik or Nginx, and ensure renewed certificates are loaded." }, "gateway": { "heading": "Secure Gateway (Tailscale)", - "intro": "Reverse proxies are the classic answer to \"reach the dashboard from outside\" but they require a public domain, certificate, and an open port on the edge. Secure Gateway is the zero-port alternative shipped inside the Monitor itself — a pre-built deployable app that spins up an Alpine LXC running Tailscale as a subnet router. Once joined to your tailnet, every device on it can hit the Monitor at the host's own LAN IP — from a laptop on holiday, a phone on 5G, or another node — without exposing TCP 8008 to the internet.", + "intro": "A reverse proxy is one way to provide remote access. Secure Gateway offers access without exposing TCP 8008: it deploys an Alpine LXC running Tailscale as a subnet router. Access to the host’s LAN IP depends on approved subnet routes and tailnet access rules.", "calloutTitle": "Why this is convenient", - "calloutBody": "The URL stays the same as on the LAN — http://<proxmox-lan-ip>:8008 works everywhere Tailscale works. No certificates, no DNS, no port forwarding. The Monitor itself sees the request as coming from a tailnet IP (typically 100.x.y.z), so the auth log and the Fail2Ban hook still function as on the LAN.", + "calloutBody": "Use the LAN URL http://<proxmox-lan-ip>:8008 through the approved subnet route. Tailscale subnet routers use SNAT by default, so the Monitor normally sees the gateway’s LAN address, not the client’s 100.x.y.z address. Logs and Fail2Ban therefore identify the source address the host actually receives.", "deployBody": "The deploy flow is one screen — pick the host LXC storage, paste a Tailscale auth-key (generated at login.tailscale.com/admin/settings/keys), choose which subnets to advertise, click Deploy. The LXC takes ~30 seconds to bootstrap and registers in the tailnet automatically.", "outro": "Step-by-step deployment, subnet-routes configuration, Tailscale ACLs and Exit Node mode are documented separately in Dashboard → Security → Secure Gateway — that's where the deploy wizard lives in the dashboard UI. This page only covers the access pattern." }, "proxy": { "heading": "Reverse proxy snippets", - "intro": "The simplest layout is a dedicated host name for the Monitor (e.g. monitor.example.com) pointing at port 8008 on the Proxmox host. Snippets below use that pattern. Sub-path mounts (example.com/proxmenux-monitor/) are possible but require extra rewriting and are not the default — see the callout at the end.", + "intro": "Use a dedicated host name such as monitor.example.com forwarding to port 8008 on the Proxmox host. The examples follow this pattern. A sub-path such as example.com/proxmenux-monitor/ needs additional frontend and proxy work; it is not supported by prefix stripping alone.", "nginxTitle": "Nginx", "caddyTitle": "Caddy", "traefikTitle": "Traefik (labels — Docker / Kubernetes)", "subPathTitle": "Advanced: sub-path mounts under an existing domain", - "subPathBody": "If you don't want a dedicated host name, you can mount the Monitor under a path on an existing domain — for example example.com/proxmenux-monitor/. The Next.js build uses relative asset paths so static files resolve, but the proxy must strip the prefix before forwarding so the Monitor still receives plain /api/* URLs. On Nginx that's a location /proxmenux-monitor/ } proxy_pass http://127.0.0.1:8008/; { (the trailing slash on proxy_pass does the strip). On Caddy, use handle_path /proxmenux-monitor/*. A dedicated host name is simpler." + "subPathBody": "The current frontend has no configured sub-path base and builds API calls from root-relative /api/* URLs. Merely stripping a prefix such as example.com/proxmenux-monitor/ does not handle those API calls or all frontend assets. Use a dedicated host name. A sub-path deployment requires coordinated frontend and proxy changes and separate testing." }, "audit": { "heading": "Audit log", - "intro": "Every authentication event (success and failure) is appended to /var/log/proxmenux-auth.log in a single line, syslog-style format:", + "intro": "Login failures and rate-limit warnings are written to /var/log/proxmenux-auth.log in a single-line format. Successful logins are not recorded by this logger:", "outro": "Tail it the usual way: tail -F /var/log/proxmenux-auth.log. The file is rotated by logrotate if a config drop-in is added; the Monitor itself does not rotate it." }, "fail2ban": { @@ -346,7 +346,7 @@ "Reads /var/log/proxmenux-auth.log.", "Matches the authentication failure; rhost=<ip> pattern with a dedicated filter.", "Bans the offending IP at the kernel firewall level by default.", - "Is queried by the Flask before_request hook every 30 s — so even when the firewall can't block (because the connection comes from the reverse proxy), the application returns HTTP 403 to banned IPs based on what Fail2Ban knows." + "The Flask before_request hook checks requests against the ban list, cached for 30 s. Behind a reverse proxy, client-IP blocking also requires PROXMENUX_TRUST_PROXY=1 and a controlled proxy that sets trustworthy forwarding headers." ], "outro": "Configuration, ban time tuning and unban procedures are in Security → Fail2Ban." }, diff --git a/web/messages/en/docs/monitor/ai-assistant.json b/web/messages/en/docs/monitor/ai-assistant.json index 9a012649..f0dcbe59 100644 --- a/web/messages/en/docs/monitor/ai-assistant.json +++ b/web/messages/en/docs/monitor/ai-assistant.json @@ -1,7 +1,7 @@ { "meta": { "title": "Proxmox AI Assistant — OpenAI, Claude, Gemini, Groq, Ollama | ProxMenux Monitor", - "description": "ProxMenux Monitor's optional AI Assistant rewrites Proxmox VE notification bodies in plain language. Six providers supported: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter and local Ollama. Twelve languages, three detail levels per channel, custom prompt mode with a community library, and a context-enrichment layer that adds uptime, recurrence and SMART data to disk events.", + "description": "The optional AI Assistant rewrites Proxmox VE notifications in plain language. Six providers: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter and Ollama. The UI offers thirteen languages, three detail levels per channel, custom prompts with a community library, and event context including uptime, recurrence and SMART data.", "ogTitle": "Proxmox AI Assistant — OpenAI, Claude, Gemini, Groq, Ollama", "ogDescription": "Rewrite Proxmox VE notifications in plain language with OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter or local Ollama.", "twitterTitle": "Proxmox AI Assistant | ProxMenux Monitor", @@ -9,12 +9,12 @@ }, "header": { "title": "AI Assistant", - "description": "The opt-in rewriter that runs every outbound notification through an LLM before fan-out — turning structured templates into plain-language messages, with per-channel detail levels, twelve languages, a custom prompt mode with a public community library, and a context-enrichment layer that adds uptime, recurrence, SMART data and known-error matches to the prompt.", + "description": "Optional AI rewriting turns eligible notification templates into plain-language messages, with per-channel detail levels, thirteen UI languages, custom prompts, a public community library and context enrichment. Backup reports backup_complete and backup_fail bypass AI entirely.", "section": "ProxMenux Monitor" }, "intro": { "title": "Off by default, single switch to enable", - "body": "AI rewrite is opt-in. Until you flip the master toggle inside Settings → Notifications → Advanced: AI Enhancement, every event is dispatched with the original templated body. When the toggle is on and a provider call fails or times out, the dispatcher falls back to the templated body silently — your notifications never block on the LLM." + "body": "AI rewriting is off by default. Enable it in Settings → Notifications → Advanced: AI Enhancement. If enrichment or rewriting fails, the dispatcher sends the original template. Each rewrite has a 25-second dispatch timeout; reaching it falls back to the template instead of waiting indefinitely." }, "howItWorks": { "heading": "How it works", @@ -83,7 +83,7 @@ "intro1": "Every commercial provider charges per token, so it's worth understanding what a token is before picking a plan. A token is roughly four characters of English text or about three quarters of a word. The phrase \"Backup completed on storage local-bak\" is around eight tokens. A short journal excerpt of ten lines can be 200-400 tokens depending on the technical density.", "intro2": "Two things are billed on every call:", "items": [ - "Input tokens — the system prompt plus the user message (severity, title, body, enriched context). For ProxMenux the system prompt alone is on the order of 1.5-2 KB (≈ 400-500 tokens) and the user message varies from 50 tokens (a clean backup-complete) to ~1500 tokens (a disk error with 30 lines of journal context).", + "Input tokens cover the system prompt and user message: severity, title, rendered body and enriched context. Their number depends on the actual prompt and event content. Each rewritten channel can incur its own input-token usage; backup-complete and backup-fail reports bypass AI.", "Output tokens — what the model writes back. The Monitor caps this with max_tokens (see the table below). The cap is a limit, not a charge: if the model produces 250 tokens with a cap of 1500, you pay for 250." ], "capsIntro": "These are the actual caps the dispatcher applies, taken straight from AI_DETAIL_TOKENS in notification_templates.py:", @@ -109,7 +109,7 @@ ], "customNote": "Custom prompt mode uses a fixed cap of 500 output tokens regardless of detail level — the custom prompt is in your control and the cap protects against runaway responses.", "sizingTitle": "Practical sizing", - "sizingBody": "A homelab with 50-100 events per day on standard typically consumes a few thousand tokens per day. With the free tiers offered by Groq and Gemini, that fits without touching a paid plan. With OpenAI or Anthropic, billed per-token, the cost lands in the cents-per-month range for that volume. If your event count is much higher, the Detail level per channel section explains how to keep chat channels on brief while letting Email take the full report." + "sizingBody": "Estimate usage as rewritten events × AI-enabled channels × input-plus-output tokens per call. For example, 50 events × one channel × (500 input + 300 output tokens) is 40,000 tokens per day, not a few thousand. Actual usage and charges depend on model, context, caching and provider limits. The Detail level per channel section shows how to use brief for chat instead of standard, while keeping detailed email reports." }, "providers": { "heading": "AI providers", @@ -121,8 +121,8 @@ "tagline": "Very fast, generous free tier (30 req/min). Ideal to start.", "items": [ "API key: console.groq.com/keys", - "Verified models: llama-3.3-70b-versatile, llama-3.1-70b-versatile, llama-3.1-8b-instant, llama3-70b-8192, llama3-8b-8192, mixtral-8x7b-32768, gemma2-9b-it.", - "Recommended: llama-3.3-70b-versatile — best quality at full Groq inference speed." + "Examples from the bundled model list: allam-2-7b, qwen/qwen3.8-27b, openai/gpt-oss-20b, groq/compound-mini.", + "Bundled recommendation: openai/gpt-oss-20b. Use the provider selector and connection test to check availability for your account." ] }, "openai": { @@ -130,8 +130,8 @@ "tagline": "Industry standard. Very accurate and widely used.", "items": [ "API key: platform.openai.com/api-keys", - "Verified models: gpt-4.1-nano, gpt-4.1-mini, gpt-4o-mini, gpt-4.1, gpt-4o, gpt-5-chat-latest, gpt-5.4-nano, gpt-5.4-mini.", - "Recommended: gpt-4.1-nano — the cheapest member of the chat family, sufficient quality for translation and re-formatting. Reasoning models (o-series, gpt-5 non-chat) are supported by the provider plumbing but kept off the verified list: higher latency without measurable quality gain on this workload." + "Examples from the bundled model list: gpt-4.1-nano, gpt-4.1-mini, gpt-4o-mini, gpt-4.1, gpt-4o, gpt-5-nano.", + "Bundled recommendation: gpt-4.1-nano. The adapter also handles model-specific requirements for reasoning models; the bundled list includes gpt-5-nano, so reasoning models are not universally excluded." ], "baseUrlTitle": "OpenAI-compatible base URL", "baseUrlBody": "The OpenAI provider also accepts a custom Base URL, which lets you point the Monitor at any OpenAI-compatible endpoint. Confirmed to work with BytePlus / ByteDance (Kimi K2.5), LocalAI, LM Studio, vLLM, Together AI, Fireworks AI, and any other service that speaks the OpenAI /v1/chat/completions dialect. Set the URL in the OpenAI tab next to the API key field." @@ -141,8 +141,8 @@ "tagline": "Excellent for writing and translation. Fast and economical.", "items": [ "API key: console.anthropic.com/settings/keys", - "Verified models: claude-3-5-haiku-latest, claude-3-5-sonnet-latest, claude-3-opus-latest.", - "Recommended: claude-3-5-haiku-latest — Claude's smallest, fastest model with strong language quality for the translation workload." + "Examples from the bundled model list: claude-haiku-4-5-20251001, claude-sonnet-4-6, claude-opus-4-6.", + "Bundled recommendation: claude-haiku-4-5-20251001. This exact snapshot is the configured recommendation; the older Claude 3.5 entries shown in earlier documentation are no longer in the bundled list." ] }, "gemini": { @@ -150,7 +150,7 @@ "tagline": "Free tier available, great quality/price ratio.", "items": [ "API key: aistudio.google.com/app/apikey", - "Verified models: gemini-2.5-flash-lite, gemini-2.5-flash, gemini-3-flash-preview.", + "Examples from the bundled model list: gemini-2.5-flash-lite, gemini-2.5-flash, gemini-3-flash-preview.", "Recommended: gemini-2.5-flash-lite — flash and flash-lite pass the verifier consistently. The pro variants reject the thinkingBudget=0 setting the Monitor uses and are overkill for this workload." ] }, @@ -159,13 +159,13 @@ "tagline": "Aggregator with access to 100+ models using a single API key. Maximum flexibility.", "items": [ "API key: openrouter.ai/keys", - "Verified models: meta-llama/llama-3.3-70b-instruct, meta-llama/llama-3.1-70b-instruct, meta-llama/llama-3.1-8b-instruct, anthropic/claude-3.5-haiku, anthropic/claude-3.5-sonnet, google/gemini-flash-1.5, openai/gpt-4o-mini, mistralai/mistral-7b-instruct, mistralai/mixtral-8x7b-instruct.", + "Examples from the bundled model list: meta-llama/llama-3.3-70b-instruct, meta-llama/llama-3.1-70b-instruct, meta-llama/llama-3.1-8b-instruct, anthropic/claude-haiku-4.5, google/gemini-2.5-flash-lite, openai/gpt-4o-mini, mistralai/mistral-medium-3.", "Recommended: meta-llama/llama-3.3-70b-instruct — same model as the Groq entry but routed through OpenRouter, which means a single key for all the listed models." ] }, "ollama": { "heading": "Ollama (Local)", - "tagline": "Uses models available on your Ollama server. 100% local, no costs, total privacy.", + "tagline": "Uses models exposed by your configured Ollama server. Local models execute there; Ollama cloud models forward requests to a cloud provider. Local execution avoids a hosted API charge but still uses your hardware and electricity.", "items": [ "No API key. Set the Ollama URL field to your server (default http://localhost:11434 or whatever host runs your Ollama instance).", "Models: not filtered. The Monitor reads whichever models you have pulled on the Ollama side via ollama pull <model>. The dropdown is populated from GET /api/tags on your Ollama server.", @@ -175,14 +175,14 @@ }, "models": { "heading": "Why these specific models", - "intro": "The model dropdown for each commercial provider is populated from a curated list shipped with the Monitor (verified_ai_models.json). Models on this list have been tested end-to-end with the chat / completions API format the Monitor uses, with the exact system_prompt + user_message + max_tokens shape the AI Enhancer sends. The list is refreshed before each ProxMenux release with a private verifier tool that probes every candidate model and prunes the ones that misbehave.", + "intro": "Commercial-provider model choices come from the bundled compatibility catalogue verified_ai_models.json, combined with the provider adapter’s availability checks. Adapters map the internal system_prompt + user_message + max_tokens request to each provider’s API. The catalogue contains tested entries and manual additions; it is a snapshot, not a guarantee of current account access or a promise that every entry passed the same verifier.", "consequencesIntro": "Two consequences worth being aware of:", "consequences": [ - "The recommended model for each provider is the one that has the best balance of quality, latency and cost for notification translation specifically — not the most capable model the provider sells. Notification rewrites don't need frontier-model reasoning; they need fast and cheap.", - "You can still pick another verified model from the dropdown — sometimes you have a free-tier quota you want to spend on a particular model, or you have a strong preference. Pick any of the listed entries; they've all passed the verifier." + "The bundled recommendation is a starting point selected for notification formatting. Assess language quality, latency and cost for your own event content and provider account rather than treating it as a universal model ranking.", + "You can choose another listed model from the dropdown to suit your quota or preferences. Check its availability with the connection test; being listed does not guarantee current access for your account." ], "ollamaTitle": "Ollama is the exception", - "ollamaBody": "Ollama models are local and the Monitor doesn't filter them — the dropdown reflects whatever you have pulled. Pick a model in the 7B-13B range with at least an 8K context window for the AI rewrite to behave reasonably with the journal context blocks." + "ollamaBody": "The Ollama dropdown is not filtered by the commercial-provider catalogue; it reflects models exposed by your Ollama server. For local execution choose a local model that fits your RAM and has enough context for the journal blocks. Cloud-tagged models are remote even when accessed through a local Ollama server." }, "defaultPrompt": { "heading": "Default prompt", @@ -205,8 +205,8 @@ "changes": [ "The default prompt is replaced entirely. The Proxmox mappings, the context-handling rules and the emoji instructions are all gone. If you want to keep any of them, paste them into your prompt — the bundled EXAMPLE_CUSTOM_PROMPT shown below is a starting point.", "The Language selector is ignored. The default prompt has a '{'language'}' placeholder; the custom prompt does not. If you want output in a specific language, declare it inside your prompt (\"Translate to Spanish\", \"Output everything in French\").", - "Detail level still applies in the sense that it's available as a setting per channel, but the cap on output tokens becomes a fixed 500 in custom mode (vs the 500 / 1500 / 3000 ramp of the default prompt). If your custom prompt asks for a long report, raise the cap by editing the prompt or split the request.", - "The Output Format markers are still mandatory. The Monitor parses the response by looking for [TITLE] and [BODY] on their own lines. A custom prompt that doesn't emit those markers will break the parser and fall back to the original templated body.", + "The custom-mode output cap is fixed at 500 tokens, independent of the stored per-channel detail setting. Default mode uses the 500 / 1500 / 3000 limits. Editing the custom prompt cannot raise the cap; request a shorter answer or use an appropriate Default detail level.", + "The output markers remain mandatory. Include [TITLE] and [BODY] in the response format. The parser extracts their content; if either marker is missing, it returns the original template instead.", "Rich messages emoji rules are not auto-injected. If you want emojis, tell the prompt to use them. If you want plain text, tell it not to. The toggle only gates the bundled blocks of the default prompt, not your custom string." ], "starterTitle": "Starter prompt", @@ -224,10 +224,10 @@ "rulesIntro": "The rules baked into the addon (visible in the collapsible block under the Default prompt section above):", "rules": [ "The tip is included only if the journal context or the Known Errors database clearly points to a specific fix.", - "The tip is capped at 100 characters.", - "It must be specific (concrete command or path) — generic advice is rejected by the prompt itself.", + "The prompt requests a tip under 100 characters; the parser does not independently enforce that length.", + "The prompt requires a specific command or path and instructs the model to avoid generic advice.", "If a Known Error provides a solution, the LLM must use that solution, not invent a new one.", - "If nothing in the input gives the LLM enough certainty to suggest a concrete fix, the tip is skipped — no guessing." + "The prompt instructs the model to omit the tip if the input does not support a concrete fix." ], "betaTitle": "Why BETA", "betaBody": "Tip quality depends on two things outside of ProxMenux: the model picked, and how rich the journal context for the event was. With a strong model (Claude 3.5 Haiku, GPT-4.1 Mini, Llama 3.3 70B) and a disk error that comes with smartctl + journal lines, the tip is consistently useful. With a tiny local Ollama model and a one-line event, the tip can fall flat or get skipped entirely. Disable the toggle if you find the tips noisy and re-enable it when you want it back." @@ -265,12 +265,12 @@ "Email — detailed. Email is the channel where you typically want the full picture for archival." ], "emailTitle": "Email detail level appends the original", - "emailBody": "When Email is on detailed and the original templated body has substantial content (more than 50 characters), the dispatcher appends the original message at the bottom of the AI rewrite, separated by a 40-dash divider and an Original message: label. This means a detailed email always carries both the AI-friendly version and the machine-friendly raw template — useful when you want to grep an old alert later." + "emailBody": "When the AI formatter returns a result for Email on detailed and the original body is longer than 50 characters, the formatter appends that original text after a 40-dash divider and the label Original message:. This retains the source details for later searches. AI bypasses and failures can instead deliver the original template alone." }, "language": { "heading": "Language", - "intro": "Twelve languages are wired in. The dropdown sets ai_language in the config and the value is interpolated into the system prompt at the place where the prompt says \"translate alerts into '{'language'}'\". The full list:", - "list": "English (en), Spanish (es), French (fr), German (de), Portuguese (pt), Italian (it), Russian (ru), Swedish (sv), Norwegian (no), Japanese (ja), Chinese (zh), Dutch (nl).", + "intro": "The UI selector offers thirteen languages. It stores ai_language, which the default system prompt uses in \"translate alerts into '{'language'}'\". The UI list is:", + "list": "English (en), Slovak (sk), Spanish (es), French (fr), German (de), Portuguese (pt), Italian (it), Russian (ru), Swedish (sv), Norwegian (no), Japanese (ja), Chinese (zh), Dutch (nl).", "rulesIntro": "Two important rules taken straight from the prompt:", "rules": [ "Translate: labels, descriptions, status words, units (e.g. GB → Go in French).", @@ -280,7 +280,7 @@ }, "templates": { "heading": "A note on templates", - "body1": "The body the AI receives is not raw event data — it's a pre-rendered template. Each event type (backup_complete, vm_start, auth_fail, health_degraded, etc.) has a template in notification_templates.py that knows how to format that specific event into a structured plain-text body. The AI rewrites that body, it doesn't replace the templating step.", + "body1": "The AI receives a rendered template rather than raw event data. Types such as vm_start, auth_fail and health_degraded have templates in notification_templates.py. The AI rewrites eligible template output; backup_complete and backup_fail retain their deterministic reports and bypass AI.", "body2": "Two practical implications: the AI never sees a hostname or VMID it has to invent — those fields are placed by the template before the rewrite. And if AI is disabled, the templated body is what gets dispatched directly. The Notifications page documents the dispatch pipeline in full and is the right cross-reference for everything that happens to an event before it reaches this layer." }, "privacy": { @@ -291,11 +291,11 @@ "rows": [ { "provider": "Ollama", - "destination": "Stays on the Ollama host. If Ollama runs on the same Proxmox node, nothing leaves the network at all." + "destination": "Local models run on the configured Ollama host. Their requests stay on that host when it is the Proxmox node itself. Ollama cloud models forward requests outside the host, even through a local Ollama server." }, { "provider": "OpenAI", - "destination": "api.openai.com (or your custom Base URL endpoint). Subject to OpenAI's data-handling policy at the time of the call." + "destination": "api.openai.com by default, or the configured custom Base URL. The data-handling policy of the actual endpoint operator applies." }, { "provider": "Anthropic", @@ -315,7 +315,7 @@ } ], "calloutTitle": "If event content cannot leave the network", - "calloutBody": "Use Ollama, or disable the AI rewriter. There is no middle ground — the dispatcher does not try to redact hostnames or IPs before sending; the prompt is built from the actual event payload as the Monitor sees it." + "calloutBody": "Use a locally hosted endpoint with a local model, such as local Ollama or an OpenAI-compatible server, or disable AI rewriting. Ollama cloud models do not keep processing local. The dispatcher does not redact hostnames or IPs; it builds the prompt from the actual event content." }, "whereNext": { "heading": "Where to next", diff --git a/web/messages/en/docs/monitor/api-reference.json b/web/messages/en/docs/monitor/api-reference.json index 5663b739..bad1193f 100644 --- a/web/messages/en/docs/monitor/api-reference.json +++ b/web/messages/en/docs/monitor/api-reference.json @@ -1,7 +1,7 @@ { "meta": { "title": "Proxmox Monitor API — Integration Reference | ProxMenux", - "description": "HTTP endpoints exposed by ProxMenux Monitor for integrations: Home Assistant, Homepage, Grafana, Prometheus, n8n and custom dashboards. Read-only data export plus the safe write operations needed by automations — VM control, backup trigger, notification dispatch, alert acknowledgement.", + "description": "HTTP endpoints exposed by ProxMenux Monitor for Home Assistant, Homepage, Grafana, Prometheus, n8n and custom dashboards. Read state and invoke documented write operations such as VM control, backup submission, notification dispatch and alert acknowledgement.", "ogTitle": "Proxmox Monitor API — Integration Reference", "ogDescription": "Endpoints exposed by ProxMenux Monitor for Home Assistant, Homepage, Grafana, Prometheus, n8n and custom dashboards.", "twitterTitle": "Proxmox Monitor API | ProxMenux", @@ -9,7 +9,7 @@ }, "header": { "title": "API Reference", - "description": "The HTTP endpoints integrators use to read state and trigger safe actions on ProxMenux Monitor — Home Assistant sensors, Homepage cards, Grafana dashboards, Prometheus scrapes, n8n flows and custom scripts. Every category, plus a complete list of Prometheus metrics, with curl examples.", + "description": "HTTP endpoints for reading state and invoking documented actions on ProxMenux Monitor: Home Assistant sensors, Homepage cards, Grafana dashboards, Prometheus collection, n8n flows and custom scripts. Includes endpoint categories, exported metrics and curl examples.", "section": "ProxMenux Monitor" }, "intro": { @@ -21,18 +21,18 @@ "headerUse": "Use", "auth": { "heading": "Authentication", - "intro": "Every endpoint marked \"authenticated\" expects a JWT bearer token in the request header:", + "intro": "When authentication is enabled, protected endpoints expect a JWT bearer token in the request header:", "tokensIntro": "Two ways to obtain the token:", "items": [ - "API tokens (recommended for integrations). Long-lived tokens minted from Settings → Security → API Tokens in the dashboard. Each token is named, can be revoked individually, and is what you should hand to Home Assistant / Homepage / Grafana / n8n.", - "Login flow (short-lived JWT). POST /api/auth/login with a username, password and TOTP token if 2FA is enabled. The returned JWT is short-lived and refreshed by the dashboard automatically; useful for ad-hoc scripts that authenticate as a human user." + "API tokens (recommended for integrations). Tokens valid for 365 days, created under Security → API Tokens. Each has a name and can be revoked individually. Use read_only for data collection and select full_admin only for integrations that need administrative actions.", + "Login flow (24-hour JWT). POST /api/auth/login with a username, password and TOTP token when required by 2FA. The returned session JWT expires after 24 hours; scripts must authenticate again when it expires." ], "flowLink": "The auth flow, password policy, 2FA setup, audit log and TLS configuration all live in Access & Authentication.", "rows": [ { "endpoint": "/api/auth/login", "method": "POST", - "use": "Body: '{'\"username\",\"password\",\"totp_token?\"'}'. Returns a short-lived JWT." + "use": "Body fields (schematic): '{'\"username\",\"password\",\"totp_token?\"'}'. Returns a 24-hour session JWT." }, { "endpoint": "/api/auth/api-tokens", @@ -40,9 +40,9 @@ "use": "List API tokens (metadata only — names, prefixes, dates; never the actual secret)." }, { - "endpoint": "/api/auth/api-tokens", + "endpoint": "/api/auth/generate-api-token", "method": "POST", - "use": "Mint a new long-lived API token. Body: '{'\"name\":\"'<'label'>'\"'}'. The token value is returned once and cannot be retrieved again." + "use": "Create a 365-day API token using an authenticated session. Body fields: password, token_name?, totp_token?, scope?. Password and any required TOTP are checked again. Scope defaults to read_only; full_admin must be selected explicitly. The secret is returned only once." }, { "endpoint": "/api/auth/api-tokens/", @@ -54,10 +54,10 @@ "conventions": { "heading": "Conventions", "items": [ - "All requests and responses are JSON unless explicitly noted (log download is plain text, /api/prometheus is text/plain in the OpenMetrics format, task log is plain text).", - "Successful mutating endpoints return '{'\"success\": true, ...'}'. Error responses use a non-2xx HTTP status with '{'\"success\": false, \"error\": \"'<'reason'>'\"'}'.", - "List endpoints accept optional limit, offset, since and category-specific filters via query string.", - "Time fields are returned as Unix epoch seconds or ISO-8601 with explicit timezone, never as locale strings." + "Most endpoints use JSON. Downloads can return plain text, and /api/prometheus returns Prometheus text exposition format version 0.0.4 rather than OpenMetrics. Check the response type of the specific route.", + "Many write endpoints return '{'\"success\": true, ...'}'. Error formats vary; a common form is '{'\"success\": false, \"error\": \"'<'reason'>'\"'}'. Check both HTTP status and response fields: some authentication challenges return HTTP 200 with success false.", + "Query parameters vary by endpoint. Use limit, offset, since and category-specific filters only where the route supports them.", + "Time formats vary by endpoint: Unix timestamps, ISO-8601 strings and systemd-formatted dates all occur. Do not assume every time field has the same unit or an explicit timezone." ] }, "system": { @@ -102,12 +102,12 @@ }, "actions": { "heading": "System actions", - "intro": "Fire-and-forget endpoints that trigger the same operations the operator would run from the Monitor UI or the shell menu — designed for Home Assistant, Homepage, Ansible, custom dashboards and any other automation that needs to reach into the host over HTTP. Every mutating route requires a token with full_admin scope; read-only read_only tokens can still poll the .../status endpoints without triggering anything. Each action returns 202 with a state snapshot; poll the matching .../status to observe progress.", + "intro": "The asynchronous system actions below start operations in transient systemd units. With authentication enabled, their write routes require full_admin; read_only tokens can poll .../status. Accepted starts return HTTP 202 with a state snapshot; poll the matching .../status for progress. Guest control and backup use different response contracts, described below.", "shapeTitle": "Common response shape", - "shapeIntro": "All action endpoints return the same JSON object — one shape to parse from any client:", + "shapeIntro": "Asynchronous system actions share the JSON state object below. Guest-control and backup responses have different shapes:", "shapeCode": "{\n \"unit\": \"proxmenux-action-pve-update.service\",\n \"state\": \"idle | running | success | failed | cancelled\",\n \"started_at\": \"Sat 2026-08-01 11:01:32 CEST\",\n \"finished_at\": null,\n \"exit_code\": null,\n \"result\": null\n}", "concurrencyTitle": "Concurrency and cancellation", - "concurrencyBody": "A second POST while a run is in flight returns 409 with the current running state. Cancel an in-flight run with a DELETE to the action's base URL; the state moves to cancelled and timestamps are preserved so the caller can still see when it was triggered and stopped. The last terminal state (success / failed / cancelled) is remembered until the next run replaces it.", + "concurrencyBody": "Starting a second run of the same system action returns HTTP 409 while it is active. Cancellation is available only for actions with a documented DELETE route, such as PVE update. Their state becomes cancelled and preserves timestamps. Terminal snapshots are kept in process memory and can be lost when the Monitor restarts.", "rows": [ { "endpoint": "/api/system/power/reboot", @@ -147,7 +147,7 @@ { "endpoint": "/api/proxmenux/self-update/run", "method": "POST", - "use": "Update ProxMenux itself by piping the canonical stable installer. Runs in its own systemd unit so the update completes across the proxmenux-monitor restart the installer performs." + "use": "Update ProxMenux using the installer for the configured stable or beta channel. It runs in its own systemd unit so the job can survive the proxmenux-monitor service restart performed by the installer." }, { "endpoint": "/api/proxmenux/self-update/status", @@ -157,12 +157,12 @@ { "endpoint": "/api/vms//control", "method": "POST", - "use": "Start / stop / shutdown / reboot a VM or LXC container (the same operations the Monitor's VM & LXC modal exposes). The body carries action: start, stop, shutdown or reboot. Synchronous — returns the outcome directly with no polling needed." + "use": "Submit VM or LXC power control. Body field action accepts start, stop, shutdown or reboot. A successful response returns a confirmed PVE task; it does not mean the operation has completed. Poll the guest control-task endpoint for its outcome." }, { "endpoint": "/api/vms//backup", "method": "POST", - "use": "Create a vzdump backup of a VM or LXC. Body fields, all optional unless the defaults do not match the storage layout: storage (a PVE storage), mode (snapshot, suspend or stop), compress (zstd, lzo, gz or none), protected (true or false), notes, notification (auto, always, failure or never) and pbs_change_detection (default, legacy or data). Returns the PVE task UPID." + "use": "Create a vzdump backup of a VM or LXC. Body fields, all optional unless the defaults do not match the storage layout: storage (a PVE storage), mode (snapshot, suspend or stop), compress (zstd, lzo, gzip or none), protected (true or false), notes, notification (auto, always, failure or never) and pbs_change_detection (default, legacy or data). Returns the PVE task UPID." }, { "endpoint": "/api/vms//backups", @@ -171,7 +171,7 @@ } ], "syncVsAsyncTitle": "Two flavours of action", - "syncVsAsyncBody": "System-level actions (host power, PVE update, ProxMenux self-update) can take minutes — they run in their own transient systemd unit and expose a .../status endpoint plus a DELETE to cancel. VM / LXC actions (start, stop, shutdown, reboot, backup) are fast and use the fire-and-return style the Monitor's UI already exposes: the POST returns the outcome directly. Both flavours share the same authentication model (JWT or long-lived API token).", + "syncVsAsyncBody": "Host power, PVE update and ProxMenux self-update run in transient systemd units with a .../status endpoint. Only PVE update has the DELETE cancellation route listed here. VM/LXC control returns a PVE task that must be polled; backup returns a UPID for a background job. An accepted request is not completion. Authentication and scope requirements depend on the route.", "curlTitle": "curl example", "curlBody": "Fire a PVE update and poll for completion — the exact same sequence a Home Assistant automation or an Ansible playbook would run:", "curlCode": "TOKEN=\n\ncurl -sSf -X POST \\\n -H \"Authorization: Bearer $TOKEN\" \\\n https://:8008/api/system/pve-update/run\n\nwhile true; do\n state=$(curl -sSf -H \"Authorization: Bearer $TOKEN\" \\\n https://:8008/api/system/pve-update/status | jq -r .state)\n [ \"$state\" != \"running\" ] && break\n sleep 30\ndone\necho \"final state: $state\"", @@ -185,7 +185,7 @@ { "endpoint": "/api/health", "method": "GET", - "use": "Small health probe — returns JSON with status, timestamp, version. Suitable for Uptime Kuma keyword checks; the receiver must send the bearer header." + "use": "Small health probe returning JSON with status, timestamp and version. Suitable for Uptime Kuma keyword checks; when authentication is enabled, the client must send the bearer header." }, { "endpoint": "/api/health/status", @@ -200,7 +200,7 @@ { "endpoint": "/api/health/full", "method": "GET", - "use": "Full snapshot — categories + active errors + dismissed list + custom suppression settings. Backs the modal in one round-trip; uses a 6-min background cache for instant response." + "use": "Full snapshot: categories, active errors, dismissed alerts and custom suppression settings. It uses background check results when less than six minutes old; otherwise, or on a forced refresh, it runs a fresh check." }, { "endpoint": "/api/health/active-errors", @@ -286,7 +286,7 @@ { "endpoint": "/api/storage/smart//test", "method": "POST", - "use": "Trigger a SMART self-test. Body: '{'\"type\":\"short\"|\"long\"'}'." + "use": "Start a SMART self-test. Body schema: '{'\"type\":\"short\"|\"long\"'}'." }, { "endpoint": "/api/storage/smart/schedules", @@ -336,7 +336,7 @@ { "endpoint": "/api/vms", "method": "GET", - "use": "List of all VMs and CTs with status, vmid, name." + "use": "VMs and CTs on the local node, with status, vmid and name." }, { "endpoint": "/api/vms/", @@ -361,7 +361,7 @@ { "endpoint": "/api/vms//control", "method": "POST", - "use": "Body: '{'\"action\":\"start|stop|reboot|shutdown\"'}'. Power-cycle a guest." + "use": "Choose one action from the body schema: '{'\"action\":\"start|stop|reboot|shutdown\"'}'. Controls guest power state." }, { "endpoint": "/api/vms//backup", @@ -386,7 +386,7 @@ { "endpoint": "/api/backups", "method": "GET", - "use": "Cluster-wide list of backups." + "use": "Backups found in dir, NFS, CIFS and PBS storages queried through the local node. This is not an exhaustive scan of every cluster node." }, { "endpoint": "/api/backup-storages", @@ -467,7 +467,7 @@ { "endpoint": "/api/notifications/test-ai", "method": "POST", - "use": "Test the AI provider connection. Body: '{'\"provider\",\"api_key\",\"model\",\"ollama_url?\"'}'." + "use": "Test the AI provider connection. Body fields (schematic): '{'\"provider\",\"api_key\",\"model\",\"ollama_url?\"'}'." }, { "endpoint": "/api/notifications/provider-models", @@ -542,13 +542,13 @@ { "endpoint": "/api/proxmenux/tool-source/", "method": "GET", - "use": "Source code of a specific post-install function — the exact bash that was applied." + "use": "Source of the mapped post-install function, extracted from current host scripts or preserved legacy code. This is not a guaranteed snapshot of the exact code originally executed." } ] }, "prometheus": { "heading": "Prometheus metrics", - "intro": "ProxMenux Monitor exposes a Prometheus-format scrape endpoint at GET /api/prometheus (authenticated) returning OpenMetrics-format text. Every metric is labelled with node=\"<hostname>\" and carries an explicit timestamp so it ingests cleanly into Prometheus, VictoriaMetrics, Mimir or any compatible TSDB.", + "intro": "The authenticated GET /api/prometheus endpoint returns Prometheus text exposition format version 0.0.4. Every metric includes node=\"<hostname>\" and an explicit timestamp. Collect it with Prometheus or another compatible time-series database.", "exportedTitle": "Exported metrics", "headerGroup": "Group", "headerMetric": "Metric", @@ -597,7 +597,7 @@ }, { "metric": "proxmox_disk_temperature_celsius", - "desc": "Per-disk temperature. Label device." + "desc": "Temperature per disk. Label disk." }, { "metric": "proxmox_fan_speed_rpm", @@ -610,15 +610,15 @@ "metrics": [ { "metric": "proxmox_disk_total_bytes", - "desc": "Total disk space per mount. Label mountpoint." + "desc": "Total capacity per exported disk entry. Label disk." }, { "metric": "proxmox_disk_used_bytes", - "desc": "Used disk space per mount." + "desc": "Used capacity per exported disk entry." }, { "metric": "proxmox_disk_usage_percent", - "desc": "Disk usage percentage per mount." + "desc": "Used capacity percentage per exported disk entry." } ] }, @@ -660,7 +660,7 @@ }, { "metric": "proxmox_vm_status", - "desc": "Per-VM/CT status (1 = running, 0 = stopped). Labels vmid, name, type." + "desc": "Status per VM/CT (1 = running, 0 = otherwise). Labels node, vmid, name." }, { "metric": "proxmox_vm_cpu_usage", @@ -677,7 +677,7 @@ "metrics": [ { "metric": "proxmox_gpu_temperature_celsius", - "desc": "GPU temperature. Labels slot, vendor." + "desc": "GPU temperature. Labels slot, vendor; also includes the gpu name label." }, { "metric": "proxmox_gpu_utilization_percent", @@ -724,7 +724,7 @@ } ], "scrapeTitle": "Prometheus scrape config", - "scrapeIntro": "The endpoint requires authentication. Pass the API token as a bearer header in your Prometheus scrape config:", + "scrapeIntro": "When authentication is enabled, pass an API token in the bearer header of your Prometheus collection configuration:", "perHostTitle": "Per-host scrape", "perHostBody": "Each ProxMenux Monitor instance exports metrics for the host it runs on. In a cluster, point Prometheus at every node — the node label on every series lets you distinguish them in Grafana queries (proxmox_vms_running'{'node=\"pve01\"'}')." }, diff --git a/web/messages/en/docs/monitor/architecture.json b/web/messages/en/docs/monitor/architecture.json index 9b4c1f59..8cf9181d 100644 --- a/web/messages/en/docs/monitor/architecture.json +++ b/web/messages/en/docs/monitor/architecture.json @@ -18,8 +18,8 @@ }, "requestFlow": { "heading": "Request flow", - "intro": "From the browser to the kernel, every dashboard view follows the same path:", - "diagramCaption": "Each request is authenticated by JWT (when auth is enabled), dispatched to a blueprint, and answered with data collected on demand from host tooling. If Fail2Ban is installed and the proxmenux jail is active, the middleware also checks the request against the jail's banned IP list. The optional reverse proxy is transparent to Flask — it forwards X-Forwarded-* headers and the app recovers the real client IP from them. State that needs to outlive a request lives in SQLite.", + "intro": "A typical dashboard data request follows this path; browser-only preferences can be handled locally:", + "diagramCaption": "Protected routes validate JWT when authentication is enabled. Core routes and blueprints return cached or newly collected host data. The optional Fail2Ban hook checks its cached jail ban list. Forwarded client-IP headers are trusted only with PROXMENUX_TRUST_PROXY=1; otherwise the peer address is used. Persistent state includes SQLite databases and JSON files, including auth.json.", "diagramArrowLabel": "HTTP / WS", "nodes": { "clientLabel": "Client", @@ -31,7 +31,7 @@ "stateLabel": "Local state", "stateDetail": "SQLite DB\n+ auth.json" }, - "threadsIntro": "The same process also runs four background threads started at boot — they don't serve HTTP, they push state into SQLite or into the notification queue while the host is up:", + "threadsIntro": "The process also runs background threads. The examples below sample host data, update caches and SQLite, and dispatch notifications. Other workers also exist, and notification delivery depends on its enabled setting:", "headerThread": "Thread", "headerCadence": "Cadence", "headerJob": "Job", @@ -48,8 +48,8 @@ }, { "thread": "_vital_signs_sampler", - "cadence": "~1 s", - "job": "High-frequency CPU + temperature sampler used for live widgets in the Overview panel." + "cadence": "CPU 5 s; temperature 15 s; memory 30 s", + "job": "Samples CPU usage, memory and CPU temperature for live metrics and sustained-condition detection, independently of the five-minute health collector." }, { "thread": "notification_manager.start()", @@ -62,9 +62,9 @@ "heading": "systemd unit", "intro": "The installer drops a unit at /etc/systemd/system/proxmenux-monitor.service. Default content:", "items": [ - "User=root — required: SMART, pvesh, journal scopes, ZFS commands and the web terminal all need root.", + "User=root — the supported service runs with root privileges for host operations such as SMART access, pvesh and ZFS management. Its web-terminal processes inherit those privileges.", "Restart=on-failure with a 10-second back-off — non-zero exits relaunch automatically.", - "After=network.target — waits for the host network stack to be online." + "After=network.target — orders startup after that target; it does not guarantee an assigned IP, DNS or external connectivity." ], "inspectTitle": "Inspect the live unit" }, @@ -73,13 +73,13 @@ "intro": "The AppImage is a self-mounting filesystem. AppRun at the root sets up the environment and execs flask_server.py:", "consequencesIntro": "Two consequences of this layout:", "consequences": [ - "No host Python pollution. The vendored interpreter and packages are isolated inside the AppImage — upgrading the host's system Python doesn't affect the Monitor and vice-versa.", - "Hardware tools are bundled too. ipmitool, lm-sensors and upsc ship inside the AppImage so the dashboard can read out-of-band sensors and UPS state without forcing the user to install Debian packages." + "Bundled Python environment. The interpreter and Python packages are shipped inside the AppImage, avoiding installation into the host’s system Python environment. The application still uses host kernel interfaces and external host tools.", + "Hardware clients are bundled too. ipmitool, lm-sensors and upsc are included. Readings still depend on supported hardware, access to sensors and, for UPS data, a configured NUT server." ] }, "flask": { "heading": "Flask app structure", - "intro": "flask_server.py creates a single Flask(__name__) instance, enables CORS, and registers six blueprints plus a WebSocket initializer:", + "intro": "flask_server.py creates one Flask(__name__) instance with restricted CORS origins, registers nine blueprints directly and initializes terminal routes. The table highlights the main modules; audit, VM-backup and PBS blueprints are also registered. PVE-specific prewarmers run only on PVE hosts.", "headerBlueprint": "Blueprint / module", "headerPrefix": "Routes prefix", "headerOwns": "Owns", @@ -109,7 +109,7 @@ "prefix": [ "/api/health/*" ], - "owns": "Public health probe, detailed status, active / dismissed errors, suppression settings." + "owns": "Health probes, detailed status, active and dismissed errors, and suppression settings. Protected routes require authentication when it is enabled." }, { "blueprint": "flask_terminal_routes.py", @@ -137,7 +137,7 @@ "prefix": [ "/api/proxmenux/*" ], - "owns": "Reads which ProxMenux post-install optimizations are installed on the host." + "owns": "Reads the ProxMenux post-install optimizations recorded in the host registry." }, { "blueprint": "flask_oci_routes.py", @@ -147,11 +147,11 @@ "owns": "OCI / container app deployment helpers (Proxmox VE 9.1+)." } ], - "endpointsLink": "The full endpoint list with request / response shapes is in API Reference." + "endpointsLink": "Integration endpoints and their request/response formats are described in API Reference." }, "dataSources": { "heading": "Data sources", - "intro": "Nothing is collected from a custom agent — the Monitor reads the same files and runs the same commands a human admin would:", + "intro": "Host data comes mainly from standard libraries, files and administrative commands. Some guest information also depends on the QEMU Guest Agent or commands executed inside a CT:", "headerSource": "Source", "headerUsedFor": "Used for", "rows": [ @@ -181,7 +181,7 @@ }, { "source": "nvidia-smi · intel_gpu_top", - "usedFor": "GPU utilisation, VRAM, temperature, encoder / decoder load." + "usedFor": "Available GPU utilisation, VRAM, temperature and encoder/decoder measurements; fields depend on the vendor, tool and driver." }, { "source": "lspci · lscpu · dmidecode", @@ -201,7 +201,7 @@ }, "persistence": { "heading": "Persistence", - "intro": "Two filesystem locations split state by sensitivity:", + "intro": "Several state files have different contents and access requirements:", "headerPath": "Path", "headerOwner": "Owner", "headerContents": "Contents", @@ -214,25 +214,25 @@ { "path": "/usr/local/share/proxmenux/.notification_key", "owner": "root 0600", - "contents": "32-byte XOR key used to encrypt sensitive notification settings before storing them in the DB (Telegram tokens, AI API keys, etc.)." + "contents": "32-byte master key for the ENC2 notification-secret format. The implementation uses a per-value random salt, derived keys and a MAC; old fixed-key XOR values are supported for migration." }, { "path": "/root/.config/proxmenux-monitor/auth.json", "owner": "root:root", - "contents": "Authentication state: enabled flag, username, SHA-256 password hash, TOTP secret, backup codes, list of issued API tokens, list of revoked token hashes." + "contents": "Authentication configuration: enabled flag, username, salted PBKDF2-HMAC-SHA256 password hash, TOTP secret, backup codes, per-install JWT signing secret, API-token metadata and revocation hashes. Legacy SHA-256 password hashes are migrated on successful login." }, { "path": "/var/log/proxmenux-auth.log", "owner": "root:root", - "contents": "Plain-text auth event log. Always written. If Fail2Ban is installed with the [proxmenux] jail, the jail reads this file to ban brute-force attempts; if not, the file simply accumulates the log entries." + "contents": "Plain-text authentication event log, written independently of Fail2Ban. When the [proxmenux] jail is installed and enabled, it reads this log to detect repeated failed logins. Without that jail, the log remains available for inspection." } ], "backupTitle": "Back up auth.json before reinstalling", - "backupBody": "Reinstalling the AppImage replaces the binary but leaves /root/.config/proxmenux-monitor/auth.json and /usr/local/share/proxmenux/health_monitor.db intact. If you restore from a host backup, keep both files together — the API tokens stored in auth.json are validated against JWT_SECRET; if the DB and auth.json get out of sync, dismissed errors and stored tokens may misbehave." + "backupBody": "Replacing the AppImage normally preserves /root/.config/proxmenux-monitor/auth.json and /usr/local/share/proxmenux/health_monitor.db. Preserve auth.json with its per-install jwt_secret to retain token validity and metadata. The database stores health and notification state independently. Back up .notification_key with the database to restore encrypted channel settings; restoring the DB alone does not restore API authentication." }, "health": { "heading": "Health Monitor cycle", - "intro": "Every 5 minutes health_monitor.py runs a deterministic cycle across the ten categories shown on the dashboard:", + "intro": "About every five minutes, the background collector invokes health_monitor.py to run the checks behind the dashboard’s ten categories:", "items": [ "Critical PVE services (pveproxy, pvedaemon, pvestatd, pve-cluster).", "Proxmox storage pools (pvesh get /storage + per-storage availability).", @@ -242,11 +242,11 @@ "Updates: pending package upgrades and security patches.", "Logs: persistent / spike / cascade pattern detection in the system journal.", "Memory: OOM killer activity, sustained high pressure.", - "Temperature: CPU / chassis sensors against vendor thresholds.", + "Temperature: CPU and disk readings checked against monitoring thresholds; available sensors depend on the hardware.", "Security: authentication failures, ban events, fail2ban jail status." ], - "afterIntro": "Each finding is normalised into a stable error_key + category + severity. The persistence layer deduplicates against the existing errors table — repeated events update last_seen and the occurrence counter without spamming notifications.", - "cycleEnd": "The cycle also auto-resolves stale errors using the per-category Suppression Duration setting, cleans up errors for resources that no longer exist (deleted VMs / removed disks / unmounted storages), and prunes the events log older than 30 days. The full catalogue of categories and the dashboard view that surfaces them is documented in Dashboard → Health Monitor." + "afterIntro": "Findings use a stable error_key, category and severity. Existing records in errors are updated with last_seen and occurrence counts rather than duplicated. Notification delivery also has its own fingerprint and cooldown rules.", + "cycleEnd": "Cleanup can auto-resolve stale errors using category Suppression Duration values and state-based rules, remove orphan records for resources that were removed, and prune events older than 30 days. The categories and dashboard are described in Dashboard → Health Monitor." }, "notifications": { "heading": "Notification engine", @@ -254,7 +254,7 @@ "items": [ "Watchers push events: JournalWatcher tails the system journal, TaskWatcher polls the Proxmox task list, ProxmoxHookWatcher reacts to backup / replication / snapshot hooks, and PollingCollector handles slow data sources.", "Templates turn an event into a (title, body) pair. The same template can run through the configured AI provider (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter) to produce a plain-language rewrite; both versions are stored in notification_history.", - "Channels deliver messages: Telegram, Discord, Email, Gotify, Pushover and Apprise (multi-channel). Each is implemented in notification_channels.py behind the same create_channel() / send() interface, so adding a new channel is a single class.", + "Channels deliver messages through services including Telegram, Discord, Email, Gotify, Pushover and Apprise. Implementations in notification_channels.py use the shared create_channel() / send() interface.", "Encryption. Sensitive settings (telegram.bot_token, discord.webhook_url, pushover.user_key, pushover.api_token, ai_api_key_*, email.password) are encrypted with the key in .notification_key before being written to the DB and are masked in the interface." ], "linksFooter": "Per-event toggles, channel overrides and AI configuration are surfaced in Settings → Notifications and Settings → AI Assistant." @@ -263,21 +263,21 @@ "heading": "WebSocket terminal", "intro": "The Terminal tab in the dashboard is a thin xterm.js client wired to a server-side PTY through a WebSocket. Two transport modes:", "items": [ - "HTTP mode (default): Flask's development server with flask-sock handles upgrade requests. Good enough for LAN / direct access.", - "HTTPS / WSS mode: when an SSL certificate is configured, the process switches to gevent.pywsgi.WSGIServer with geventwebsocket.handler.WebSocketHandler, so WebSockets work over TLS without polyfills." + "HTTP mode (default): the built-in Flask server with flask-sock handles WebSocket upgrade requests.", + "HTTPS / WSS mode: the TLS server uses gevent.pywsgi.WSGIServer with geventwebsocket.handler.WebSocketHandler for WebSocket connections over TLS." ], - "outro": "The PTY is a child of the Flask process, so it inherits User=root from the unit. Every terminal request goes through JWT auth; the user must already be logged in to the dashboard before a PTY is allocated.", + "outro": "Terminal child processes inherit User=root from the service. With authentication enabled, opening a WebSocket requires a short-lived, single-use ticket obtained from the authenticated terminal-ticket endpoint with administrative scope. When authentication is disabled or declined, the handshake follows that unauthenticated mode.", "proxyNote": "If you access the Monitor through a reverse proxy, make sure WebSocket forwarding is enabled (the Upgrade and Connection headers). Without it the terminal won't work." }, "proxy": { "heading": "Reverse proxy & Fail2Ban", - "intro": "Two safeguards make sure security works the same way whether the dashboard is hit directly or through a reverse proxy:", + "intro": "Client-IP selection and optional application-level blocking depend on these settings and components:", "items": [ - "Real client IP recovery. A before_request hook reads X-Forwarded-For and X-Real-IP in that order, falling back to request.remote_addr. The recovered address is what auth logging and rate limiting see. This is always on.", - "Application-level Fail2Ban check (optional). When the dashboard sits behind a proxy, the kernel firewall can't block the real attacker IP — the connection always comes from the proxy. To plug that gap, the same hook above queries the proxmenux Fail2Ban jail every 30 seconds, caches the banned IP set, and short-circuits requests from those IPs with HTTP 403 inside Flask." + "Client IP selection. The before_request ban check and auth logging trust X-Forwarded-For, then X-Real-IP, only when PROXMENUX_TRUST_PROXY=1. Otherwise they use request.remote_addr. Forwarded headers are not accepted automatically.", + "Optional application-level Fail2Ban. A proxy connection can present the proxy as the TCP peer. When the trusted client address is available and the proxmenux jail is active, Flask rejects listed IPs with HTTP 403. The ban list is cached for 30 seconds and refreshed by request processing after expiry, rather than polled by a dedicated timer." ], "calloutTitle": "Fail2Ban is not bundled", - "calloutBody": "Fail2Ban is not installed by ProxMenux Monitor itself. The application-level check is a no-op until you install Fail2Ban on the host (e.g. via Security → Fail2Ban in the ProxMenux menu). When the fail2ban-client binary or the proxmenux jail is absent, the call fails silently and requests are not gated — auth still applies, but no IP-level banning.", + "calloutBody": "Fail2Ban is not bundled or installed automatically. It can be installed through the optional Monitor Security workflow or Security → Fail2Ban in ProxMenux Scripts. If fail2ban-client or the proxmenux jail is absent, this application hook does not block requests. The configured authentication policy still applies.", "outro": "Reverse-proxy snippets (Nginx / Caddy / Traefik) and the Fail2Ban jail walkthrough are in Access & Authentication and Security → Fail2Ban." }, "whereNext": { @@ -291,7 +291,7 @@ { "label": "API Reference", "href": "/docs/monitor/api", - "tail": " — every endpoint, token management, security best-practices." + "tail": " — integration endpoints, token management and authentication conventions." }, { "label": "Settings → ProxMenux Monitor", diff --git a/web/messages/en/docs/monitor/dashboard/hardware.json b/web/messages/en/docs/monitor/dashboard/hardware.json index 52009e57..e47b2bb7 100644 --- a/web/messages/en/docs/monitor/dashboard/hardware.json +++ b/web/messages/en/docs/monitor/dashboard/hardware.json @@ -108,7 +108,7 @@ "coral": { "heading": "Coral TPU / AI Accelerators", "subHeading": "(conditional)", - "intro": "Renders when the host has Google Coral or other AI-accelerator devices wired up. Each device opens a modal with its connection type (M.2 / mini-PCIe / USB), PCIe link width, vendor / product ID, kernel driver (apex for PCIe, libedgetpu for USB), kernel modules (gasket + apex), device nodes (/dev/apex_*), Edge TPU runtime status, live temperature and the firmware hardware-warning thresholds.", + "intro": "Renders when the host has Google Coral or other AI-accelerator devices wired up. Each device opens a modal with its connection type (M.2 / mini-PCIe / USB), PCIe link width, vendor / product ID, software support (the apex kernel driver for PCIe, the libedgetpu user-space library for USB), kernel modules (gasket + apex), device nodes (/dev/apex_*), Edge TPU runtime status, live temperature and the firmware hardware-warning thresholds.", "imageAlt": "Coral Edge TPU detail modal: PCIe / M.2 connection, PCIe 5.0 GT/s x1 link, vendor 1ac1:089a, kernel driver apex, gasket and apex modules loaded, /dev/apex_0 present, Edge TPU Runtime not installed, temperature 53.5 °C with hardware warning thresholds", "imageCaption": "M.2 Coral with the host kernel modules loaded, the device node up and the firmware temperature warnings exposed. The runtime line goes green once the matching Edge TPU runtime is installed.", "pathsIntro": "Two install paths exist depending on the form factor:", @@ -189,7 +189,7 @@ { "section": "CPU temperature history", "endpoint": "/api/temperature/history", - "source": "Time series sampled by the Health Monitor every 5 min and persisted to SQLite." + "source": "Time series recorded by the temperature collector every 60 seconds and persisted to SQLite." }, { "section": "GPU live metrics", diff --git a/web/messages/en/docs/monitor/dashboard/network.json b/web/messages/en/docs/monitor/dashboard/network.json index 887a3b7f..24757003 100644 --- a/web/messages/en/docs/monitor/dashboard/network.json +++ b/web/messages/en/docs/monitor/dashboard/network.json @@ -59,7 +59,7 @@ "Click — every node except the host is clickable and opens the same per-interface drill-in modal documented below. Tapping the host is intentionally a no-op — there is no host-level modal in this view." ], "useTitle": "When it's useful", - "useBody": "The group cards below tell you what exists; the diagram tells you how it's connected and where the traffic is flowing right now. Patterns easy to spot at a glance: a bridge with no active guest attached, two heavy guests going through the same NIC (bottleneck candidate), or a single VM saturating a link while everything else is quiet." + "useBody": "The group cards show what exists; the diagram shows how it is connected and where traffic is flowing. You can spot guests sharing a bridge, two busy guests sharing a NIC (a possible bottleneck), or one VM saturating a link while others are quiet." }, "groups": { "heading": "Three interface groups", @@ -121,7 +121,7 @@ "mode1Title": "Mode 1 — Historical view", "mode1Alt": "Network Latency modal in historical mode — Gateway target with a 1-hour timeframe and the past samples plotted", "mode1Caption": "Historical view — Gateway target over the last hour, fed from the latency-history database written every 60 seconds by the temperature/latency collector thread.", - "mode1Body1": "The default mode when the modal opens. A second dropdown picks the timeframe (1 Hour / 24 Hours / 7 Days / 30 Days / 1 Year); data resolution drops with the window so the chart stays readable. Headline stats — Current / Min / Avg / Max — render above the chart, with a status pill (Excellent / Good / Fair / Poor) reflecting the current value against the thresholds below.", + "mode1Body1": "The default mode when the dialog opens. A second dropdown selects the timeframe (1 Hour / 6 Hours / 24 Hours / 3 Days / 7 Days). Current / Min / Avg / Max appear above the chart, with an Excellent / Good / Fair / Poor status indicator based on the thresholds below.", "mode1Body2": "Source: the same latency samples the Health Monitor uses to detect persistent network slowdowns — sampled every 60 seconds against the gateway by the background _temperature_collector_loop thread, written to a local SQLite history.", "mode2Title": "Mode 2 — Real-time test", "mode2Alt": "Network Latency modal running a real-time ping test against Cloudflare — progress bar at 50%, live samples accumulating on the chart", @@ -162,9 +162,9 @@ } ], "reportTitle": "Network Latency Report (PDF)", - "reportIntro": "Both modes have a Report button next to the target selector. Clicking it generates a PDF with everything you'd send to your ISP if you wanted to make a case for poor service.", + "reportIntro": "Both modes have a Report button beside the target selector. It generates a PDF of the measurements that you can attach to a troubleshooting request to your ISP.", "reportPreviewAlt": "First page of the Network Latency Report PDF — Executive Summary with the gauge, latency statistics, the latency graph and the threshold guide", - "reportPreviewCaption": "First page of the Network Latency Report — Executive Summary with the gauge dial and headline stats, the per-second latency graph, and the threshold guide. Page 2 onwards has the per-sample table and methodology.", + "reportPreviewCaption": "The first page of the Network Latency Report contains the executive summary, gauge, main statistics, time-series latency graph and threshold guide. Page 2 onwards contains the per-sample table and methodology.", "downloadLabel": "Download sample Network Latency report (PDF)", "sectionsIntro": "The report has six sections:", "sections": [ @@ -173,10 +173,10 @@ "Latency Graph — area chart of every sample over the test window with a min/avg/max y-axis grid.", "Performance Thresholds — the same four-tier scale documented above, with a coloured dot per tier.", "Detailed Test Results — numbered table with timestamp, latency, packet loss and status for every sample. Useful for spotting micro-bursts that the headline averages hide.", - "Methodology — test method (ICMP Echo Request), samples per test (3 consecutive pings), target name, target IP and a final \"Performance Assessment\" paragraph derived from the verdict." + "Methodology — ICMP Echo Request, 3 consecutive pings per sample, target name and IP, and a final performance assessment derived from the status." ], - "useCaseTitle": "Use case: claims to your ISP", - "useCaseBody": "Run the real-time test against Cloudflare for 2 minutes during a moment of perceived slowness, then click Test Again a few times to extend the dataset, and finally Report. The PDF carries the full per-sample table plus the methodology block — ISPs typically accept this as evidence, especially when correlated with timestamps from a separate complaint." + "useCaseTitle": "Use case: support from your ISP", + "useCaseBody": "Run the real-time Cloudflare test for 2 minutes while the connection feels slow, use Test Again to extend the record, then select Report. The PDF includes all samples and the methodology. You can attach it to a support request with the incident timestamps; your ISP decides what evidence it requires." }, "excluding": { "heading": "Excluding noisy interfaces", @@ -202,7 +202,7 @@ { "section": "Per-interface RX/TX time series", "endpoint": "/api/network//metrics", - "source": "/proc/net/dev sampled by the Health Monitor with byte-rate calculation." + "source": "Live counters use /proc/net/dev; chart history comes from Proxmox RRD through pvesh. VM/LXC interfaces use guest RRD data; physical and bridge interfaces use node-level RRD data." }, { "section": "Latency: current", @@ -212,7 +212,7 @@ { "section": "Latency: historical", "endpoint": "/api/network/latency/history", - "source": "Persisted samples — every 5 min by the Health Monitor cycle." + "source": "Samples persisted about every 60 seconds by the background temperature/latency collector." } ], "codeComment1": "# Cross-check the interface state seen by the dashboard", diff --git a/web/messages/en/docs/monitor/dashboard/security.json b/web/messages/en/docs/monitor/dashboard/security.json index 211f82f3..1cedc7f2 100644 --- a/web/messages/en/docs/monitor/dashboard/security.json +++ b/web/messages/en/docs/monitor/dashboard/security.json @@ -10,7 +10,7 @@ }, "intro": { "title": "Two scopes, one tab", - "body": "The Security tab is divided into two clearly separated sections: ProxMenux Monitor (settings for the dashboard itself) and Proxmox VE (settings for the host underneath). Cards render conditionally — Fail2Ban and Lynis only appear once installed." + "body": "The Security tab has two sections: ProxMenux Monitor (dashboard settings) and Proxmox VE (host settings). The Fail2Ban and Lynis cards offer installation when those tools are missing, then show their controls once installed." }, "monitor": { "heading": "ProxMenux Monitor", @@ -101,13 +101,13 @@ }, "pve": { "heading": "Proxmox VE", - "intro": "The host's own protections — firewall, intrusion prevention and security audit. Last two only render when their respective tools are installed." + "intro": "The host’s protections: firewall, intrusion prevention and security audit. The Fail2Ban and Lynis cards offer installation if the tools are missing, then expose their management controls." }, "firewall": { "heading": "Proxmox Firewall", "imageAlt": "Proxmox Firewall card showing Cluster Firewall and Host Firewall status, Quick Access Rules for ProxMenux Monitor and Proxmox Web UI, Rules Overview counters and a list of Firewall Rules with Add Rule button", "imageCaption": "Proxmox Firewall card — cluster-level and host-level enable / disable toggles, common ports as Quick Access Rules, totals across Rules Overview, and the full rule list with + Add Rule.", - "intro": "The card surfaces the Proxmox VE built-in firewall (which is independent from any host-level iptables / nftables you may run alongside). Three blocks:", + "intro": "The card manages the Proxmox VE firewall configuration. The classic backend uses iptables; the alternative backend uses nftables. It does not manage arbitrary rules created outside Proxmox. Three blocks:", "items": [ "Cluster Firewall + Host Firewall — global toggles. The cluster firewall must be active for any host-level rule to take effect; the card flags this dependency inline.", "Quick Access Rules — pre-defined rows for ports that matter to ProxMenux itself: 8008/TCP (Monitor), 8006/TCP (Proxmox Web UI). Each row shows the current allow / deny / unprotected state. The Proxmox Web UI is allowed via the built-in Proxmox firewall macro and can't be removed accidentally.", @@ -135,8 +135,8 @@ "configAlt": "Configure sshd jail form with Max Retries, Ban Time in seconds with Permanent Ban option, Find Time, common values reminder, and Save Configuration button", "configCaption": "Editing the sshd jail — pick a stricter Max Retries for SSH if you only ever log in from your own subnet, or extend Ban Time for the public-facing dashboard.", "outro": "The full What it installs / how it's configured / how to uninstall walkthrough — including the manual install path, the SSH MaxAuthTries side effect, and the relationship with the proxmenux-auth.log journal — is in ProxMenux → Security → Fail2Ban.", - "calloutTitle": "Without Fail2Ban, brute-force protection is best-effort", - "calloutBody": "ProxMenux Monitor has its own application-level ban hook in the Flask request pipeline — but it only takes effect if Fail2Ban is installed and writes to the bans table. Without Fail2Ban, the Monitor logs failed logins to proxmenux-auth.log for future inspection but doesn't actively block IPs." + "calloutTitle": "Without Fail2Ban, this mechanism does not block IPs", + "calloutBody": "ProxMenux Monitor checks Fail2Ban’s banned IPs at the application level before handling Flask requests. It queries fail2ban-client and caches the result for 30 seconds; it does not read a SQL bans table. Without Fail2Ban, failed logins are recorded in proxmenux-auth.log, but this mechanism does not actively block IPs." }, "lynis": { "heading": "Lynis Security Audit", @@ -145,7 +145,7 @@ "whyUseful": "Why it's useful. Knowing the security posture of your server is hard to do by reading config files one by one. Lynis catches the things that are routinely overlooked: kernel hardening flags missing, weak SSH ciphers enabled, journal not persistent, sudoers NOPASSWD on default accounts, and many more. Re-running it after applying ProxMenux post-install tweaks gives you an objective number for the improvement.", "notInstalledAlt": "Lynis Security Audit card with Not Installed state and Install Lynis button, listing features: hardening scoring, vulnerability detection, compliance checking and GitHub source", "notInstalledCaption": "Lynis card before install — the blue box summarises what the tool does.", - "notBundled": "Lynis is also not bundled. ProxMenux installs the latest release directly from the official GitHub source (not the Debian package, which lags several minor versions).", + "notBundled": "Lynis is also not bundled. ProxMenux installs it directly from the official GitHub source rather than the Debian package.", "confirmAlt": "Install Lynis confirmation modal listing what Lynis does: hardening scoring, vulnerability detection, configuration analysis, compliance checking, source from official GitHub repository", "confirmCaption": "Install confirmation — explicit about the GitHub source.", "progressAlt": "Lynis Installation streaming panel: installing latest scan tool, version 3.1.6 confirmed, installation completed message", @@ -157,7 +157,7 @@ "runningCaption": "Audit in progress — the action button shows a spinner and the card explicitly warns that the scan can take 2–5 minutes.", "finishedBody": "When it finishes, the card flips to the results view: hardening index, warnings, suggestions and an Audit Reports list with each historical scan.", "resultsAlt": "Lynis Security Audit card with results: Hardening Index 71 with Lynis 66 PVE 71 breakdown, 3 warnings, 40 suggestions, Security Hardening Score progress bar Proxmox Adjusted 71 of 100 in the Good range, audit reports list with PDF download and Run Security Audit button", - "resultsCaption": "Audit results — Hardening Index 71/100 (Good) on a sample run. The card also shows the \"Lynis raw score\" (66) versus the Proxmox-adjusted score (71) which adds back 11 points for findings the Lynis test corpus flags but are expected behaviour on Proxmox VE.", + "resultsCaption": "Audit results — Hardening Index 71/100 (Good) in a sample run. The card shows the Lynis raw score (66) and the Proxmox-adjusted score (71). The adjustment depends on the raw score and the share of findings classified as expected on Proxmox VE; it is not a fixed 11-point addition.", "scoreTitle": "Lynis raw score vs Proxmox-adjusted score", "scoreIntro": "Lynis ships rules tuned for general-purpose Debian. Proxmox legitimately diverges from some of them (services running as root for cluster reasons, custom journald tuning, etc.). The card shows both numbers so you can:", "scoreItems": [ @@ -179,7 +179,7 @@ { "card": "Authentication, 2FA, password change", "endpoint": "/api/auth/*", - "source": "Local SQLite + JWT issued by the Monitor." + "source": "Local auth configuration in ~/.config/proxmenux-monitor/auth.json; JWTs issued by the Monitor." }, { "card": "SSL / HTTPS", diff --git a/web/messages/en/docs/monitor/dashboard/settings.json b/web/messages/en/docs/monitor/dashboard/settings.json index 5f602367..d05425ec 100644 --- a/web/messages/en/docs/monitor/dashboard/settings.json +++ b/web/messages/en/docs/monitor/dashboard/settings.json @@ -76,18 +76,18 @@ }, "thresholds": { "heading": "Health Monitor Thresholds", - "intro": "Where the previous card decides how long to stay quiet after a dismiss, this one decides at what value an alert fires in the first place. Every check the Health Monitor runs is parameterised by a pair of numbers — a Warning threshold and a Critical threshold — and both are exposed here for the operator to tune.", + "intro": "The previous card sets how long to stay quiet after a dismiss; this one sets the value at which an alert is raised. Most threshold-based checks have adjustable Warning and Critical values. The table below explains exceptions such as the combined swap rule and the current RAM detector.", "whatForTitle": "What it is for", "whatForIntro": "Defaults that ship with ProxMenux are sane for the average Proxmox host, but every environment has its own envelope:", "whatForItems": [ "A small homelab with a single-disk SSD may want to page earlier on capacity (75 / 90 %) to leave room for snapshots.", - "A datacenter host with redundant Ceph nodes can be more relaxed on memory warnings (a 90 % working set is normal under ZFS ARC).", - "A passively-cooled mini-PC needs lower temperature thresholds than a server with forced-air cooling — same drive class, different physical envelope.", + "Memory thresholds should reflect the host’s memory measurements and workload. Ceph redundancy alone does not justify relaxing memory warnings, and high ZFS ARC usage must not be confused with an unreclaimable working set.", + "Choose drive-temperature thresholds using the drive’s specifications and observed operating conditions. Passive versus forced-air cooling alone does not determine a universally lower or higher safe limit.", "A heavily-virtualized host that pegs CPU during builds should not page on every 80 % spike, but must still alert on sustained pressure." ], - "whatForOutro": "Editing a threshold takes effect on the next scan — the Health Monitor re-reads the values from /usr/local/share/proxmenux/health_thresholds.json on every cycle, no service restart needed. The same numbers also feed the colour ranges of the dashboard widgets (the temperature line in the disk-temperature modal, the bars on the storage cards) so the visual classification matches what triggers the alert.", + "whatForOutro": "Supported threshold changes take effect on the next scan. The Health Monitor reads /usr/local/share/proxmenux/health_thresholds.json each cycle without a restart. Selected widgets, including disk temperature, use these values; some capacity bars retain separate visual cutoffs. See the RAM row below for a current runtime exception.", "coloursTitle": "Status colours: how Warning and Critical render in the dashboard", - "coloursIntro": "Every threshold below produces the same three-state classification across the dashboard — same colours for storage bars, CPU/memory rings, temperature chips, and the dot on the disk modal. Reading a colour anywhere in the Monitor maps to a definite range relative to the configured pair:", + "coloursIntro": "Widgets that use the configured Warning/Critical pair follow the three-state classification below. Some visual indicators, including the PVE storage capacity bars, use their own cutoffs; do not infer a Health Monitor alert solely from their colour.", "headerColour": "Colour", "headerRange": "Range", "headerMeaning": "Meaning", @@ -105,7 +105,7 @@ { "colour": "Red", "range": "value ≥ Critical", - "meaning": "Critical state. The Health Monitor fires a CRITICAL event; CRITICAL bypasses Quiet Hours and always reaches the channel." + "meaning": "Critical state. The Health Monitor raises a CRITICAL event, which bypasses Quiet Hours. Channel category/event settings still apply; delivery also depends on the channel being available." } ], "sectionsTitle": "Sections and recommended defaults", @@ -125,13 +125,13 @@ "section": "Memory", "warning": "85 %", "critical": "95 %", - "gates": "RAM pressure on the host." + "gates": "Host RAM pressure. The configurable Critical default shown here is 95 %, but the current detector uses a hard-coded 90 % sustained RAM rule; changing that setting does not currently change this runtime branch." }, { "section": "Swap (critical only)", "warning": "—", - "critical": "5 %", - "gates": "Swap actually being used. The number is intentionally low: a healthy Proxmox host should rarely touch swap, so even 5 % is a meaningful signal of RAM pressure." + "critical": "80 %", + "gates": "Swap CRITICAL requires both swap usage above 80 % and available RAM below 15 %, sustained across the detector’s samples. Used swap alone does not trigger this rule." }, { "section": "CPU temperature", @@ -143,25 +143,25 @@ "section": "Disk temp — HDD", "warning": "60 °C", "critical": "65 °C", - "gates": "Standard spinning drives. Manufacturer envelope tops out around 60–65 °C, so Critical is set right at the hard limit." + "gates": "HDD temperature. The defaults are 60 °C Warning and 65 °C Critical; these are monitoring defaults, not a universal manufacturer limit. Check the specific drive model’s specifications." }, { "section": "Disk temp — SSD", "warning": "70 °C", "critical": "75 °C", - "gates": "2.5'' / M.2 SATA SSDs — run cooler than NVMe but warmer than HDDs." + "gates": "SATA SSDs in 2.5-inch or M.2 formats. This class uses 70/75 °C monitoring defaults; actual temperature limits depend on the drive model." }, { "section": "Disk temp — NVMe", "warning": "80 °C", "critical": "85 °C", - "gates": "NVMe drives run hotter by design; controllers self-throttle above ~85 °C, so Warning catches the climb before throttling kicks in." + "gates": "NVMe temperature. The class uses 80/85 °C monitoring defaults. Controller throttling temperatures vary by model and are not universally 85 °C." }, { "section": "Disk temp — SAS", "warning": "55 °C", "critical": "65 °C", - "gates": "Enterprise SAS drives share the same ~65 °C manufacturer limit as HDDs, but are normally deployed in rack chassis with active cooling. A reading at 55 °C already signals a cooling problem (failed fan, HVAC issue) before the drive itself is at risk — hence a lower Warning than HDD, not because SAS is less heat-tolerant." + "gates": "SAS temperature. This class uses 55 °C Warning and 65 °C Critical. These are monitoring defaults, not proof of a cooling fault at 55 °C or a universal manufacturer limit." }, { "section": "Disk space — host", @@ -185,7 +185,7 @@ "section": "PVE storage", "warning": "85 %", "critical": "95 %", - "gates": "Block-style PVE storages (LVM, LVM-thin, ZFS-pool, RBD/Ceph, PBS)." + "gates": "PVE-managed storages, including LVM, LVM-thin, ZFS-pool, RBD/Ceph and PBS. These are not all block-storage backends." }, { "section": "ZFS pool", @@ -197,7 +197,7 @@ "defaultsTitle": "Defaults, overrides and reset", "defaultsBody": "The backend exposes a merged view: every section starts from the ProxMenux defaults (the values you see when the host is fresh) and you override only the knobs you care about. The card shows the effective value — the override if you set one, otherwise the default. A Reset button wipes every override and goes back to defaults across all sections at once.", "validationTitle": "Validation", - "validationBody": "Saving rejects values that don't make sense (percentages outside 0–100, critical below warning, negative temperatures). The frontend shows the inline error; the backend validates again before persisting, so the API can't be tricked into a broken threshold by a hand-crafted PUT." + "validationBody": "Saving validates values against each field’s allowed range and rejects Critical below Warning. The interface shows validation errors, and the backend validates API requests again before persisting changes." }, "lxcDetection": { "heading": "LXC Update Detection", @@ -207,18 +207,18 @@ "whatRunsTitle": "What the scan actually runs", "whatRunsIntro": "For each CT in running state with a supported package manager:", "whatRunsItems": [ - "Cache freshness gate. If the in-container apt/apk metadata cache is older than 24 hours, a best-effort refresh runs first (apt-get update -qq on Debian/Ubuntu, apk update on Alpine) with a 60 s timeout. Any failure (no network, broken repo, timeout) is swallowed silently — the listing below still runs against whatever cache exists, so a transient repo issue can never make detection worse than before.", + "Metadata freshness. If the in-container apt/apk metadata cache is older than 24 hours, a refresh is attempted first (apt-get update -qq on Debian/Ubuntu, apk update on Alpine), with a 60 s timeout. If it fails, listing still uses the available cache; results may therefore be stale.", "Listing. Then ProxMenux runs apt list --upgradable / apk list -u and parses the output into a structured count plus a sample of the top package names.", "Per-CT dedup. A fingerprint built from count, security-count and the sorted top names is stored so a stable set of pending updates doesn't re-notify daily, while a meaningfully different set does." ], "selfUpdateTitle": "CTs that self-update outside apt may legitimately report 0", - "selfUpdateBody": "Detection only sees what the in-container package manager knows about. A CT whose key software updates itself outside apt (Plex's plexupdate cron, Docker containers updated via docker pull, Frigate's built-in updater, etc.) will keep reporting low or zero apt updates even when the appliance is actively staying current — that's correct, not a bug. The apt-level base system on the same CT may still have its own pending updates, which the scan does surface.", + "selfUpdateBody": "Detection only covers the in-container package manager. Software updated outside apt, such as a configured plexupdate job or Docker images fetched with docker pull, is outside that count. Zero apt updates does not prove that every application is current. The same CT’s base system can still have package updates detected by the scan.", "refreshTitle": "Why the 24 h auto-refresh", - "refreshBody": "Long-running appliance CTs frequently end up with apt caches months out of date because nobody routinely runs apt update inside them. Without the refresh, apt list --upgradable reports 0 updates from a frozen snapshot and the operator never sees the backlog. The threshold matches the rest of the check cycle — if the CT was refreshed within the last 24 h, ProxMenux trusts that signal and skips the refresh.", + "refreshBody": "Long-running CTs can have stale apt metadata if nobody runs apt update. Then apt list --upgradable can miss newer updates. ProxMenux attempts a refresh when the metadata is older than 24 hours and skips it when the cache was refreshed more recently.", "toggleTitle": "Conditional notification toggle", "toggleBody": "The lxc_updates_available per-channel notification toggle in Notifications → Services only renders while detection is enabled. When you turn detection OFF, that row disappears from every channel's category list — but its stored preference is preserved in the DB, so re-enabling detection brings the toggle back at the value it had before.", "purgeTitle": "What gets purged when you disable detection", - "purgeBody": "Turning the switch OFF immediately removes every type=lxc entry from /usr/local/share/proxmenux/managed_installs.json. The Hardware tab badges drop to zero on the next dashboard refresh. Turning it back ON repopulates the registry on the next detection cycle (or sooner if you trigger a manual refresh from the API)." + "purgeBody": "Turning the switch OFF immediately removes every type=lxc entry from /usr/local/share/proxmenux/managed_installs.json. LXC update counts on the Hardware tab clear on the next dashboard refresh. Turning it back ON repopulates the registry on the next detection cycle, or sooner with a manual API refresh." }, "storageExclusions": { "heading": "Remote Storage Exclusions", @@ -238,9 +238,9 @@ "intro": "Same shape as Storage Exclusions but for network interfaces. Per interface: exclude from Health checks and / or exclude from notifications. Typical use cases:", "items": [ "An intentionally-down spare bridge.", - "A NIC that was physically removed but still references in /etc/network/interfaces.", + "A NIC that was physically removed but is still referenced in /etc/network/interfaces.", "A VLAN sub-interface used only during maintenance windows.", - "A management bridge that is up but doesn't carry traffic — flapping noisily on every cycle." + "A management bridge with known, repeated link-state changes during maintenance." ], "outro": "State is persisted in the excluded_interfaces SQLite table. Same purple excluded badge on the Network tab so excluded interfaces stay visible." }, @@ -255,26 +255,26 @@ }, "optimizations": { "heading": "ProxMenux Optimizations", - "intro": "A live, transparent inventory of every ProxMenux post-install optimization currently active on the host. Every time you apply a post-install option from the Scripts side — either via the Automated post-install or via the à-la-carte Customizable post-install — the corresponding script registers itself in /usr/local/share/proxmenux/installed_tools.json. The Monitor reads that file and renders this card so you can see, at a glance, what's been changed on your server.", + "intro": "An inventory of post-install optimizations recorded by ProxMenux on the host. Options from Automated post-install and Customizable post-install register their application in /usr/local/share/proxmenux/installed_tools.json. The Monitor reads that registry for this card. A recorded entry is not a fresh check that every underlying setting remains unchanged.", "imageAlt": "ProxMenux Optimizations card with grid of installed tools, each row showing a green dot, tool name and version. Examples include APT IPv4 Force, Bashrc Customization, Fastfetch, Log2ram SSD Protection, Memory Settings Optimization, Setting persistent network interfaces, System Limits Increase, APT Language Skip, Entropy Generation haveged with Legacy badge, Kernel Panic Configuration, Logrotate Optimization, Network Optimizations, Subscription Banner Removal, VFIO IOMMU Passthrough — 14 active total", "imageCaption": "The card lists every active optimization with its name, version, a coloured dot and an orange 14 active counter at the top right. Tools whose source is reachable are clickable.", "dotsTitle": "What the dots mean", "dotsItems": [ - " Green dot — current optimization, registered by the active version of ProxMenux. Source code is reachable: click the row to open it.", - " Amber dot + legacy badge — applied by an older ProxMenux version whose script has since been renamed or replaced. Still active on the host; the source opens in \"legacy\" mode (with an amber accent) so you can audit what was actually run." + " Green dot — a registered optimization that is not marked legacy and has no available update indicated. Click the row when source code is available.", + " Amber dot + legacy badge — a registered optimization whose script was renamed or replaced. Its preserved source opens in legacy mode with an amber accent. This does not revalidate the current host configuration." ], "clickTitle": "Click-through to source code", - "clickBody": "Clicking a tool opens a modal with the exact bash function that applied the change, plus the script file path it lives in (auto_post_install.sh for the Automated bundle, customizable_post_install.sh for the à-la-carte side). Comments and shell constructs are syntax-highlighted; a Copy button puts the source on your clipboard. This is the \"show your work\" surface — verify what ProxMenux did to your host before any manual change you make on top.", + "clickBody": "Clicking a tool opens a modal with its mapped bash function and script name (auto_post_install.sh or customizable_post_install.sh). Current tools are extracted from files on the host; legacy tools can use preserved source. Syntax highlighting and Copy help inspect the code. This is not a guaranteed snapshot of the exact code that ran at installation time.", "detailAlt": "Tool source code modal for APT IPv4 Force showing the bash function force_apt_ipv4 from customizable_post_install.sh version 1.0 with syntax-highlighted code that configures /etc/apt/apt.conf.d/99-force-ipv4 with Acquire ForceIPv4 true, registers the tool and emits a translate APT IPv4 configuration completed message", "detailCaption": "Source modal for APT IPv4 Force — exact force_apt_ipv4() function from customizable_post_install.sh v1.0, with syntax highlighting and a one-click Copy.", "whyTitle": "Why this matters", - "whyBody": "ProxMenux changes things on your host: kernel parameters, repository configuration, network bits, log rotation, GPU passthrough, etc. Knowing exactly what's active is essential before you start adding manual customisation on top — and even more so if a different admin runs the host than the one who set it up. This card is the auditable record of every optimisation currently in effect, with the exact code that produced it.", + "whyBody": "ProxMenux can change kernel parameters, repository settings, networking, log rotation and GPU passthrough. Review the recorded optimizations before adding manual changes, especially when another administrator set up the host. The card shows registry entries and available source; it does not audit every live setting or preserve an exact execution history.", "updatesTitle": "Updates available banner", "updatesBody": "When a post-install optimization gets a newer version on disk than the one currently registered on the host, the card shows an \"Updates available\" banner at the top with the count and an Apply button. Clicking Apply opens a per-optimization picker (the same one available from the Post-Install menu's Apply available updates entry). Pick which optimizations to lift; ProxMenux re-runs the corresponding function and refreshes the version in the registry. When everything is current the banner disappears.", "updatesAlt": "ProxMenux Optimizations card with an Updates available banner at the top — count of pending updates plus an Apply button that opens the per-optimization picker", "updatesCaption": "The banner only renders when at least one optimization has a newer version on disk. See Apply Available Updates for the full update flow and the Path-A equivalent in the shell menu.", "revertTitle": "Reverting an optimization", - "revertBody": "The card is read-only — to undo an optimization, run the corresponding Uninstall Optimizations option from the ProxMenux Scripts menu. The uninstall step removes the entry from installed_tools.json, so it disappears from this card on the next refresh." + "revertBody": "To undo an optimization, use the corresponding Uninstall Optimizations option in the ProxMenux Scripts menu. Uninstalling removes its entry from installed_tools.json, so the card stops listing it on the next refresh." }, "dataCollected": { "heading": "How the data is collected", @@ -320,7 +320,7 @@ { "card": "Optimization source-code modal", "endpoint": "/api/proxmenux/tool-source", - "source": "Extracts the matching bash function from auto_post_install.sh or customizable_post_install.sh on the host." + "source": "Extracts the mapped bash function from auto_post_install.sh or customizable_post_install.sh on the host; legacy tools can use preserved source." } ] }, diff --git a/web/messages/en/docs/monitor/dashboard/storage.json b/web/messages/en/docs/monitor/dashboard/storage.json index f3aa6629..29faff4a 100644 --- a/web/messages/en/docs/monitor/dashboard/storage.json +++ b/web/messages/en/docs/monitor/dashboard/storage.json @@ -14,7 +14,7 @@ }, "thresholds": { "title": "Status colours and thresholds applied here", - "intro": "Every bar, chip, and dot on this tab follows the same three-state classification — green below Warning, amber from Warning to Critical, red at Critical and above. Recommended defaults shipped with ProxMenux:", + "intro": "Health Monitor classifies status as green below Warning, amber from Warning to Critical, and red at Critical and above. Its recommended defaults follow. Individual dashboard bars can use different visual cutoffs, described below.", "items": [ "Capacity (host disks, PVE storages, ZFS pools, LXC mounts) — Warning 85 %, Critical 95 %.", "Disk temperature — HDD 60/65 °C · SSD 70/75 °C · NVMe 80/85 °C · SAS 55/65 °C (warning / critical)." @@ -33,7 +33,7 @@ "localLabel": "Local Used", "localWhat": "Bytes used on local storages (LVM / LVM-thin / ZFS / dir on the host's own disks). Shows the used bytes prominently, with a footer line of X.XX % of Y TB so you see the fill-percentage at the same time.", "remoteLabel": "Remote Used", - "remoteWhat": "Same shape as Local Used but for remote storages (NFS / CIFS / PBS / Ceph / iSCSI). Counted separately because remote outages don't affect local data and you typically size and monitor them differently.", + "remoteWhat": "Same format as Local Used, for remote storages (NFS / CIFS / PBS / Ceph / iSCSI). Counted separately because local and remote failures have different scopes and these resources are typically sized and monitored differently.", "disksLabel": "Physical Disks", "disksIntro": "Two lines of breakdown for the inventory:", "disksItems": [ @@ -45,9 +45,9 @@ "heading": "Proxmox Storage card", "intro": "One row per storage configured in /etc/pve/storage.cfg. Each row shows the type badge (nfs / cifs / zfspool / lvm / lvmthin / dir / pbs), the storage name, an active / error / not-monitored badge, the usage percentage and a coloured progress bar:", "items": [ - "< 75 % — blue progress bar, value in blue.", - "75 – 90 % — yellow progress bar, value in yellow (Health Monitor warns at this point).", - "> 90 % — red progress bar, value in red (Health Monitor escalates).", + "Up to 75 % — blue progress bar and value.", + "Above 75 % through 90 % — yellow progress bar and value. These are visual cutoffs, separate from Health Monitor thresholds.", + "> 90 % — red progress bar and value; this visual cutoff is separate from Health Monitor escalation.", "error — full row outlined in red, used when the storage is configured but unreachable (NFS server down, CIFS creds expired).", "excluded — purple outline + the badge \"not monitored\". Storages explicitly excluded by the user from health checks (handy for manual / archive volumes that are intentionally offline)." ], @@ -70,7 +70,7 @@ "items": [ "Device path — /dev/sda, /dev/nvme0n1.", "Type badge — SATA / NVMe (and the relevant icon).", - "System badge — orange tag that marks disks the host's OS is running from. The dashboard derives this from the mountpoints of / and /boot: any physical disk hosting them gets the System tag so you don't accidentally wipe or repurpose it. Disks without the tag are pure data drives.", + "System badge — orange tag for disks identified as hosting the OS. Detection uses the mountpoints of / and /boot; physical disks hosting them receive the System tag. A missing tag does not prove a disk is safe to erase or repurpose.", "Model — vendor + model string from smartctl -i.", "Capacity — formatted human-readable.", "Temperature — current °C, coloured by the disk-type threshold (NVMe runs warmer than SATA).", @@ -96,7 +96,7 @@ "overviewItems": [ "Identity — model, serial, capacity, Health badge (Healthy / Warning / Critical).", "Wear & Lifetime — large life-remaining ring (97 %, 50 %, …) with the source attribute spelled out (Media Wearout Indicator, Percentage Used, …), a wear bar (current consumption %), an Est. Life projection in years and the total Data Written. NVMe drives also show Available Spare.", - "SMART Attributes — six headline fields on a 2-column grid: Temperature, Power On Hours (with humanised duration like 3y 116d), Rotation Rate (or SSD), Power Cycles, SMART Status, Reallocated Sectors, Pending Sectors, CRC Errors. The full attribute table lives in the SMART tab." + "SMART Attributes — key fields on a 2-column grid: Temperature, Power On Hours (with humanised duration like 3y 116d), Rotation Rate (or SSD), Power Cycles, SMART Status, Reallocated Sectors, Pending Sectors, CRC Errors. The full attribute table lives in the SMART tab." ], "smartTitle": "Tab 2 — SMART", "smartImageAlt": "Disk drill-in modal — SMART tab with Run SMART Test buttons (Short / Extended), last-test result and the full SMART attribute table", @@ -108,11 +108,11 @@ "SMART Attributes — the full attribute table (ID / name / value / worst / status with OK / warning / critical icons). For SATA / SAS, the classical numbered list. For NVMe, the structured fields from nvme smart-log (temperature, available spare, percentage used, data units written / read, host reads / writes, controller busy time, power cycles, unsafe shutdowns, media errors, error-log entries, warning / critical composite temperature time)." ], "pdfTitle": "View Full SMART Report (PDF)", - "pdfIntro": "At the bottom of the SMART tab, the View Full SMART Report button generates a printable, archive-ready PDF — the same structured report you'd send to a vendor for an RMA.", + "pdfIntro": "At the bottom of the SMART tab, View Full SMART Report opens a printable report. Use the browser’s print dialog to save it as PDF for archiving or to share with vendor support for an RMA.", "pdfPreviewAlt": "First page of the generated SMART Health Report PDF — Executive Summary with the PASSED ring + Disk Information block", "pdfPreviewCaption": "First page of the SMART Health Report — Executive Summary with the PASSED ring and the full Disk Information block. The full PDF below has the SSD wear ring, every SMART attribute and the test history.", "pdfDownloadLabel": "Download sample SMART report (PDF)", - "pdfSectionsIntro": "The report has five top-level sections:", + "pdfSectionsIntro": "The report has six main sections:", "pdfSections": [ "Executive Summary — large PASSED / FAILED verdict, plain-language disk health assessment paragraph (\"your disk is healthy / showing signs of wear / failing\"), and four quick stats (report timestamp, last-test type, test result, attributes checked).", "Disk Information — model, serial, capacity, type (HDD / SSD / NVMe), family, form factor, interface (SATA 3.3 · 6.0 Gb/s, …), TRIM support, current temperature with the optimal threshold, power-on time, power cycles, SMART status, plus the headline counters (pending sectors, CRC errors, reallocated sectors).", @@ -121,13 +121,13 @@ "Last Self-Test Result + Full Self-Test History — the latest test (type, result, completion message, at which power-on-hours mark) plus a numbered table of every retained test.", "Recommendations — action items based on the verdict: Disk is Healthy / Schedule periodic tests / Backup strategy for healthy drives, escalating language with replacement guidance when attributes are out of range." ], - "pdfOutro": "The PDF is produced server-side and downloaded with a stable filename pattern (SMART-<short-id>.pdf) so multiple snapshots over time can sit side-by-side in your archive. Useful when you're tracking degradation across months or sending evidence to vendor support.", + "pdfOutro": "The browser builds the printable report; Print and Save as PDF both open its print dialog. Choose a filename such as SMART-<short-id>.pdf when saving. Keep dated snapshots to compare changes over time or share them with vendor support.", "historyTitle": "Tab 3 — History", "historyImageAlt": "Disk drill-in modal — History tab listing past SMART tests with download and delete actions", "historyImageCaption": "History tab — every retained SMART test for this disk. Per row: type, timestamp, \"X days ago\" tag, latest marker, download (raw smartctl output) and delete actions.", "historyIntro": "The retained pool of SMART tests for this disk — both short and extended runs that completed. Each entry is the raw smartctl output captured at run time, plus the structured fields the Monitor parsed out for the dashboard. Per-row actions:", "historyItems": [ - "Download — saves the raw smartctl -a output as a text file. Identical to what the PDF report parses, useful when you need the exact line a vendor asks for.", + "Download — saves the retained JSON snapshot with the smartctl -a data used by the report. Useful when vendor support needs the original diagnostic fields.", "Delete — removes the test from history. The retention limit set in the Schedule tab (Last 5 / 10 / 20) deletes oldest-first automatically; this action is the manual override." ], "scheduleTitle": "Tab 4 — Schedule", @@ -154,7 +154,7 @@ "HDD — typically cooler thresholds.", "SSD — moderate thresholds.", "NVMe — higher thresholds (NVMe runs hotter by design).", - "SAS — same defaults as HDD." + "SAS — defaults of 55 °C warning and 65 °C critical, distinct from HDD’s warning threshold." ], "tempConfigurable": "All four are configurable from Settings → Health Monitor Thresholds.", "tempWhyTitle": "Why a history matters here", @@ -164,7 +164,7 @@ "Threshold tuning. Before raising or lowering a threshold in Settings → Health Monitor Thresholds, the 30-day chart shows the disk's actual operating range so the new value lines up with what the hardware really does rather than a guess." ], "obsTitle": "Observation history (across tabs)", - "obsIntro": "Modern disks fail gradually. A disk can report SMART PASSED and still log occasional read errors in dmesg, drop SATA links, or expose pending sectors that come and go. The standard Proxmox UI shows you the current SMART verdict — it does not keep a history of those signals. ProxMenux does, and surfaces them right inside the disk modal.", + "obsIntro": "Disk faults can develop gradually. A disk may report SMART PASSED while logging read errors in dmesg, losing SATA links or reporting intermittent pending sectors. ProxMenux keeps a history of these signals and shows it inside the disk dialog alongside the current SMART verdict.", "obsImageAlt": "Disk Details modal Overview tab showing a healthy disk with SMART status Passed, 0 reallocated/pending/CRC errors, and an Observations section listing one recorded I/O Error event with the raw kernel message, a human translation of the ATA error code, first and last occurrence timestamps and an occurrence count", "obsImageCaption": "A disk that SMART says is fine can still have an observation history. The card is the historical signal layer underneath the SMART verdict.", "obsWhatTitle": "What an observation is", @@ -177,8 +177,8 @@ ], "obsWhyTitle": "Why ProxMenux records and shows them", "obsWhyItems": [ - "Disk failure is rarely a single event. It usually starts with sporadic ATA bus errors, the odd UNC sector, or a couple of medium errors weeks before SMART flips to FAILED. Without persistence those early warnings disappear from dmesg on the next boot.", - "SMART can lie. A drive can show all attributes green and still be on the way out — the observation layer catches the symptoms SMART doesn't expose (especially ICRC, IDNF, link resets at lower SATA speeds).", + "Faults can develop over time. Sporadic ATA bus errors, UNC sectors or media errors may appear before SMART reports FAILED. A dmesg buffer alone does not preserve them across a reboot; the observation history does.", + "SMART does not rule out every fault. A drive can show green attributes while experiencing problems. Observations retain additional symptoms, including ICRC, IDNF and SATA link resets or speed reductions.", "It separates \"is happening now\" from \"happened recently\". The Health Monitor auto-resolves transient errors as soon as they stop firing, which is great for keeping the active alert list clean — but you still want to see, days later, that this disk had three I/O errors that night. The observation table is the answer.", "It feeds the tiered notification model. The disk_io detector reads observation rate from this table to decide silent / WARNING / CRITICAL (the sliding 24h window introduced in 1.2.1.2). The history is what makes that classification possible." ], @@ -213,12 +213,12 @@ { "section": "SMART current values", "endpoint": "/api/storage/smart/", - "source": "smartctl -A <dev> — refreshed on demand, not cached." + "source": "smartctl -A <dev> is one available probe; the detail endpoint also uses full SMART JSON and NVMe-specific data." }, { "section": "SMART self-test history", "endpoint": "/api/storage/smart//history", - "source": "Stored under /var/lib/proxmenux-monitor/smart/<disk>/ as JSON snapshots." + "source": "Stored under /usr/local/share/proxmenux/smart/<disk>/ as JSON snapshots." }, { "section": "Permanent observations", diff --git a/web/messages/en/docs/monitor/dashboard/system-logs.json b/web/messages/en/docs/monitor/dashboard/system-logs.json index 86557d4d..98b15096 100644 --- a/web/messages/en/docs/monitor/dashboard/system-logs.json +++ b/web/messages/en/docs/monitor/dashboard/system-logs.json @@ -48,7 +48,7 @@ "Message — the full untruncated message in a monospace block, ready to copy." ], "maxLevelStoreTitle": "Journald MaxLevelStore", - "maxLevelStoreBody": "On a fresh Proxmox install, journald defaults to MaxLevelStore=warning, which silently drops info-level messages. The Monitor detects this on startup and adds a drop-in (/etc/systemd/journald.conf.d/proxmenux-loglevel.conf) raising the threshold to info so the Logs tab actually has something to show across all severities.", + "maxLevelStoreBody": "On a fresh Proxmox install, journald defaults to MaxLevelStore=warning, which silently drops info-level messages. The Monitor detects this on startup and adds a drop-in (/etc/systemd/journald.conf.d/proxmenux-loglevel.conf) raising the threshold to info so informational and more severe messages are stored. This does not include debug messages.", "backupsTitle": "Backups", "backupsBody": "Proxmox task history filtered to backup-related entries. One row per task (vzdump, PBS transfers, Garbage Collect, Verify) with the status (OK / WARNINGS / ERROR), guest involved, source storage, duration and the UPID. Click a row to load the full task log via GET /api/task-log/<upid> — the same data Proxmox exposes through Datacenter → Tasks, scoped to backups.", "notificationsTitle": "Notifications", diff --git a/web/messages/en/docs/monitor/dashboard/system-overview.json b/web/messages/en/docs/monitor/dashboard/system-overview.json index d7267b5e..98fc5884 100644 --- a/web/messages/en/docs/monitor/dashboard/system-overview.json +++ b/web/messages/en/docs/monitor/dashboard/system-overview.json @@ -5,7 +5,7 @@ }, "header": { "title": "Dashboard: System Overview tab", - "description": "The first tab the dashboard opens on. Four live metric cards across the top, the historical-metrics chart in the middle, and condensed storage / network panels at the bottom — all derived from the same APIs that drive the dedicated tabs.", + "description": "The tab the dashboard opens on by default. Four live metric cards across the top, the historical-metrics chart in the middle, and condensed storage / network panels at the bottom — all derived from the same APIs that drive the dedicated tabs.", "section": "ProxMenux Monitor · Dashboard" }, "readOnly": { @@ -13,7 +13,7 @@ "body": "Nothing on this tab is a control surface — every panel is informational. Actions live in the dedicated tabs they link to: drill into Storage to manage disks, into VMs & LXCs to start / stop guests, into the Security tab to configure auth, and so on." }, "captureAlt": "System Overview tab — four metric cards (CPU, Memory, Active VMs, Temperature), node metrics chart, and Storage / Network summary cards", - "captureCaption": "The System Overview tab — what the dashboard opens on. The four cards are live, the chart below is historical, and the two cards at the bottom summarise Storage and Network.", + "captureCaption": "The System Overview tab — the default landing tab. The four cards are live, the chart below is historical, and the two cards at the bottom summarise Storage and Network.", "topRow": { "heading": "Top row: live metric cards", "intro": "Four cards in a 2×2 grid on mobile, single row on desktop. Each updates from /api/system every few seconds.", @@ -102,9 +102,9 @@ "intro": "Each panel manages its own loading state (loadingStates.cpu, loadingStates.storage, …) so a slow source doesn't block the rest. While a panel is fetching, it shows a pulse-animated skeleton; failed fetches degrade gracefully — for example, a missing temperature sensor renders the card as N/A instead of an error.", "items": [ "Top metric cards — refresh every ~5 s. The CPU and temperature panels also receive a 1 s push from the vital-signs sampler.", - "Node metrics chart — refresh every 30 s, or on timeframe change.", + "Node metrics chart — loads when opened and when the timeframe or language changes. When a retry is needed, it waits 60 s.", "Storage card — refresh every 60 s. SMART data is cached longer (the Storage tab triggers a fresh read on demand).", - "Network card — refresh every 5 s on the active timeframe.", + "Network card — summary refreshes every 59 s and the traffic chart every 60 s on the active timeframe.", "Manual refresh — the Refresh button in the header forces all panels to re-fetch immediately." ] }, @@ -137,7 +137,7 @@ { "card": "Refresh cadence", "endpoint": "—", - "source": "CPU / network 5 s; storage / VMs 30 s; static info every 5 min. The Refresh button in the header forces an immediate re-fetch on every panel." + "source": "System data every 5 s; storage, VMs and network summary every 59 s. The Refresh button in the header forces an immediate re-fetch on every panel." } ], "codeComment1": "# Single call that backs the header pill", @@ -165,7 +165,7 @@ { "label": "Dashboard index", "href": "/docs/monitor/dashboard", - "tail": " — the other eight tabs at a glance." + "tail": " — the other dashboard tabs at a glance." }, { "label": "Architecture", diff --git a/web/messages/en/docs/monitor/dashboard/terminal.json b/web/messages/en/docs/monitor/dashboard/terminal.json index fa380971..36e42183 100644 --- a/web/messages/en/docs/monitor/dashboard/terminal.json +++ b/web/messages/en/docs/monitor/dashboard/terminal.json @@ -100,7 +100,7 @@ "auth": { "heading": "Authentication", "items": [ - "The WebSocket upgrade carries the JWT in the Authorization header. If auth is enabled and the token is missing or expired, the connection is rejected with HTTP 401 before a PTY is allocated.", + "The browser first requests a single-use ticket through POST /api/terminal/ticket, authenticated with a JWT in the Authorization header. It then passes that ticket when opening the WebSocket. The ticket expires after 5 seconds; with authentication enabled, a missing or invalid ticket closes the connection before a PTY is allocated.", "If the Monitor sits behind a reverse proxy, the proxy must forward WebSocket upgrades. See the Access & Authentication page for Nginx / Caddy / Traefik snippets." ] }, @@ -120,7 +120,7 @@ "headerFix": "Fix", "rows": [ { - "cause": "Session JWT expired (24 h window).", + "cause": "Session JWT expired when opening or reconnecting a terminal (24 h window).", "fix": "Refresh the page and log in again. The terminal isn't designed for unattended sessions, so the JWT lifetime matches the regular dashboard login." }, { diff --git a/web/messages/en/docs/monitor/dashboard/vms-lxcs.json b/web/messages/en/docs/monitor/dashboard/vms-lxcs.json index 71efdf0d..e7ce2c34 100644 --- a/web/messages/en/docs/monitor/dashboard/vms-lxcs.json +++ b/web/messages/en/docs/monitor/dashboard/vms-lxcs.json @@ -1,7 +1,7 @@ { "meta": { "title": "ProxMenux Monitor — Dashboard: VMs & LXCs tab | ProxMenux Documentation", - "description": "The VMs & LXCs tab inventories every guest on the host with live CPU / memory / disk usage. Per-guest drill-in shows configuration, resources, backups, full guest logs, notes, and Start / Shutdown / Reboot / Stop controls." + "description": "The VMs & LXCs tab inventories every guest on the host with live CPU / memory / disk usage. Per-guest details show configuration, resources, backups, recent Proxmox log results, notes, and Start / Shutdown / Reboot / Stop controls." }, "header": { "title": "Dashboard: VMs & LXCs tab", @@ -10,7 +10,7 @@ }, "intro": { "title": "The control surface for guests", - "body": "Other tabs are read-only; this is the one you act from. Anything that changes guest state goes through POST /api/vms/<vmid>/control with an explicit confirmation and the response is reflected back in the guest's row. There is no force-shutdown without going through the dedicated Stop button." + "body": "Use this tab to control guest lifecycles. Lifecycle actions go through POST /api/vms/<vmid>/control with an explicit confirmation and the response is reflected back in the guest’s row. Force shutdown requires the dedicated Force Stop button." }, "topRow": { "heading": "Top row: four stat cards", @@ -186,9 +186,9 @@ "source": "PVE RRD data (pvesh get /nodes/<node>/qemu/<id>/rrddata) condensed to a chart-friendly shape." }, { - "section": "Recent task logs (modal)", + "section": "Recent Proxmox log results", "endpoint": "/api/vms//logs", - "source": "Tasks for that vmid from /var/log/pve/tasks/index." + "source": "pvesh get /nodes/<node>/<qemu|lxc>/<vmid>/log --start 0 --limit 1000. A command failure returns an empty list; this does not provide complete in-guest system logs." }, { "section": "Backups available for guest", diff --git a/web/messages/en/docs/monitor/health-monitor.json b/web/messages/en/docs/monitor/health-monitor.json index b37dde79..732e0290 100644 --- a/web/messages/en/docs/monitor/health-monitor.json +++ b/web/messages/en/docs/monitor/health-monitor.json @@ -18,13 +18,13 @@ }, "howItWorks": { "heading": "How it works", - "intro": "The Health Monitor runs on two parallel lanes inside the Monitor process. A lightweight vital signs sampler reads CPU, memory and temperature every few seconds so that sustained-threshold conditions are detected fast; in parallel, the full health cycle runs every five minutes and exercises every category from end to end. Both lanes converge into the same SQLite tables — and from there, three consumers read the state independently.", + "intro": "The Health Monitor uses two parallel threads inside the Monitor process. A lightweight vital signs sampler fills CPU, memory and temperature history buffers. The full health cycle reads those buffers, evaluates sustained conditions and runs the other checks approximately every five minutes, then writes findings to SQLite for the dashboard and notification flow.", "scannerTitle": "From sample to stored finding", - "scannerCaption": "The scanner. Vital signs are sampled fast so sustained-CPU / sustained-memory pressure can be detected before the next 5-min cycle. The full cycle reads those buffers and runs the heavier checks (SMART, ZFS pool state, journal scanning, service health, etc.) before writing the structured findings to SQLite.", + "scannerCaption": "The sampler fills history buffers between health cycles: CPU usage every 5 s, memory every 30 s and temperature every 15 s. It does not evaluate alerts itself. The full cycle evaluates those buffers and runs heavier checks (SMART, ZFS pool state, journal scanning and service health) before writing findings to SQLite.", "scannerArrowLabel": "step", "scannerNodes": { "samplerLabel": "Vital signs sampler", - "samplerDetail": "CPU usage 30 s\nMemory 30 s\nTemperature 15 s\n→ history buffers", + "samplerDetail": "CPU usage 5 s\nMemory 30 s\nTemperature 15 s\n→ history buffers", "cycleLabel": "Full health cycle", "cycleDetail": "Every 5 min\nReads buffers\n+ live probes\n(SMART, ZFS,\nservices, journal…)", "checksLabel": "Per-category checks", @@ -58,7 +58,7 @@ { "category": "CPU & Temperature", "checks": "CPU usage with hysteresis, sensor temperature", - "events": "High sustained load; CPU temperature crossing the vendor warning / critical thresholds." + "events": "Sustained high CPU usage; sensor-temperature warnings based on sampled readings." }, { "category": "Memory & Swap", @@ -68,7 +68,7 @@ { "category": "Storage", "checks": "Proxmox storages, root filesystem", - "events": "Storage offline (NFS server unreachable, CIFS expired creds); root mount > 90 %; LVM thin pool nearing full." + "events": "Root or other monitored filesystems crossing configured space thresholds (85% warning / 95% critical by default); offline NFS export; CIFS authentication failure; full LVM-thin pool." }, { "category": "Disks & SMART", @@ -98,7 +98,7 @@ { "category": "System Updates", "checks": "Pending updates, security updates, kernel / PVE version, system age", - "events": "Security updates available; pinned kernel several minor versions behind; host uptime > 90 days. When updates are pending, the Overview header shows an Update Now button that runs the full ProxMenux update flow inline; on close it re-hits the health endpoint with ?refresh=1 so the badge count reflects the new state without waiting for the next 5-min cycle." + "events": "Pending security or running-kernel updates; a system not updated for a long time. The Overview header shows an Update Now button when updates are pending. It runs the full ProxMenux update flow inline; closing it refreshes health with ?refresh=1 so the badge reflects the new state without waiting for the next cycle." }, { "category": "Security & Certificates", @@ -141,7 +141,7 @@ ], "infoNote": "A category that is OK but has dismissed events still inside their suppression window is rendered as INFO — to remind you that something is being silenced rather than that nothing was ever wrong.", "unknownTitle": "UNKNOWN, when a check can't complete", - "unknownBody": "A check that fails to produce a verdict for three cycles in a row (a probe that times out, a sensor that disappeared, a tool that exits with an error) is recorded internally as UNKNOWN. The dashboard surfaces this as a yellow status — the overall view caps UNKNOWN at WARNING so it never escalates a healthy host to CRITICAL on its own." + "unknownBody": "An unavailable check returns UNKNOWN; after three consecutive such cycles, a persistent finding is recorded. The dashboard shows an unavailable check in yellow. The overall view caps UNKNOWN at WARNING, so an unavailable check alone does not make the host CRITICAL." }, "dashboardView": { "heading": "The dashboard view", @@ -161,7 +161,7 @@ "intro": "Some events are noisy by nature — a System Updates: pending updates available stays true until you patch the host, and you don't want a notification every five minutes for a week. The Update Now button in the Overview header is the direct shortcut to resolve that specific case in place; for everything else, or when patching is deferred, the Health Monitor also offers two coupled silencing mechanisms:", "step1": "Per-event Dismiss action in the modal. The Dismiss button opens a small dropdown with three options — 24 hours, 7 days or Permanently — letting you choose how long this specific alert stays silenced regardless of the category's default. Picking one calls POST /api/health/acknowledge with the error_key and the chosen suppression_hours (-1 for permanent). The event moves to the Dismissed list with a timestamped acknowledged_at.", "dropdownImageAlt": "Dismiss dropdown on a Health Monitor alert — 24 hours, 7 days or Permanently", - "dropdownImageCaption": "Per-event Dismiss dropdown. The chosen window applies to this single alert; if no per-event window is selected the category's default is used. Permanent dismisses are tagged with a distinct amber Permanent badge in the Dismissed list and never re-fire.", + "dropdownImageCaption": "Per-event Dismiss dropdown. The chosen window applies to this single alert; without a per-event choice the category default is used. Permanent dismissals have an amber Permanent badge and normally do not re-fire. The critical CPU-temperature override described below is an exception.", "step2": "Per-category Suppression Duration setting. From the Settings → Health Monitor card (or POST /api/health/settings), each of the ten categories has its own default window applied when a Dismiss is fired without a per-event choice:", "imageAlt": "Per-category Suppression Duration settings card in Settings → Health Monitor", "imageCaption": "Suppression Duration card — one dropdown per category. Pick a longer window for noisy events (e.g. pending updates) and shorter for ones you want to re-evaluate quickly. Active Suppressions are listed underneath (see below).", @@ -171,38 +171,38 @@ "autoTitle": "Auto-suppression when you change the Duration", "autoBody": "Setting a category's Suppression Duration to anything other than the default 24 h has a second effect beyond user-initiated dismissals: future findings in that category enter the table already acknowledged with that duration. This is by design — if you've told the Monitor that you want disk-related events silenced for a week, brand-new disk findings honour that intent without you having to dismiss each one by hand. They appear directly in the Dismissed list with the configured remaining time. Categories left at 24 h are unaffected and behave the classic way (new findings land in Active until you act).", "tempTitle": "CPU temperature CRITICAL is the safety override", - "tempBody": "One specific finding bypasses the suppression entirely: CPU temperature CRITICAL. If the sensor crosses the critical threshold, the alert re-fires regardless of any prior dismissal — a cooked CPU is a cooked CPU. This is the only built-in override of the dismiss model.", - "nonDismissableTitle": "Findings that cannot be dismissed", - "nonDismissableBody": "A handful of findings are flagged non-dismissable on purpose — they signal a condition where silencing the alert could cost data, hardware or connectivity. The Dismiss button is hidden for these rows; the alert clears only when the underlying condition recovers and the auto-resolve cleanup picks it up. Other findings (transient I/O events on a healthy disk, recovered states) are also marked non-dismissable but for the opposite reason: there's nothing to silence because the row is already informational and self-clearing.", + "tempBody": "The persistence layer has a special guard for a record marked CPU temperature CRITICAL: if such a record is received, it bypasses prior acknowledgment and auto-suppression. This guard does not mean that every temperature checker emits a critical record whenever a configured critical threshold is crossed.", + "nonDismissableTitle": "Which findings can be dismissed?", + "nonDismissableBody": "The modal shows Dismiss only when an individual check explicitly returns dismissable = true. A false or missing flag hides that button. Severity alone does not determine this permission: several critical checks allow acknowledgment. The examples below describe the current payloads; silencing an alert does not repair its cause.", "headerFinding": "Finding", - "headerWhy": "Why it can't be dismissed", + "headerWhy": "Dismiss behavior", "rows": [ { "finding": "CPU temperature warning / critical", - "why": "Hardware risk — sustained over-temperature damages silicon. Silencing would let a cooking CPU run unnoticed." + "why": "The sampled sensor-temperature warning explicitly allows dismissal. A separate persistence guard bypasses acknowledgment if a CPU-temperature record arrives with CRITICAL severity." }, { "finding": "Filesystem space critical (root mount)", - "why": "Data loss risk — a full root prevents writes and corrupts state. The alert must remain visible until you free space." + "why": "Filesystem-space checks explicitly allow dismissal, including critical usage. Acknowledging the alert does not free space or remove the risk of failed writes." }, { "finding": "ZFS pool DEGRADED / FAULTED", - "why": "Data integrity risk — pool failure threatens every dataset on it. Silencing while the pool is unhealthy is never the right answer." + "why": "ZFS pool-capacity checks explicitly allow dismissal. Other pool findings follow their own flag. Acknowledgment does not repair a degraded or faulted pool." }, { "finding": "Disk I/O errors with SMART FAILED", - "why": "Drive failure confirmed by SMART — masking hides real hardware dying. The alert stays until the device is replaced (or removed from the host)." + "why": "Persisted journal-derived disk findings can allow dismissal. SMART FAILED still needs investigation; whether the button appears depends on the individual check flag, not on the alert text alone." }, { "finding": "Network interface DOWN", - "why": "Connectivity loss — bridges, bonds and physical interfaces with active traffic must stay visible. Silencing them would mask a remote-management outage." + "why": "Persisted interface-DOWN checks explicitly allow dismissal. This does not restore a bridge, bond or physical link, or recover remote access." }, { "finding": "I/O events on healthy disks (INFO)", - "why": "Transient ATA / dmesg events on a disk whose SMART says OK — flagged INFO and self-clearing. Nothing to dismiss because the next cycle already removes them." + "why": "Transient ATA or dmesg events with healthy SMART can be informational and self-clearing. Informational rows need not expose a Dismiss button; the checker determines when the condition is resolved." } ], - "principle": "Everything else can be dismissed. The principle is: alerts that indicate \"real damage in progress\" or that have already self-resolved are kept off the dismiss path; alerts about sustained conditions you may want to acknowledge and re-check later (high CPU usage, pending updates, certificate near expiry, log warnings, VM startup hiccups, etc.) all expose the Dismiss button." + "principle": "Use the button shown for the actual finding, rather than inferring availability from its category or severity. Acknowledgment controls alert presentation and notifications; recovery checks and disk history remain separate." }, "autoresolve": { "heading": "Auto-resolution and cleanup", @@ -283,13 +283,13 @@ "If the event type is enabled in the global notification settings, and the channel hasn't silenced this category, an event is queued.", "The template engine renders a (title, body) pair from the structured details. If the AI rewriter is enabled, the same pair is also passed through the configured provider for a plain-language version.", "The channel implementation ships it: Telegram message, Discord embed, Gotify push or email. The dispatch outcome is stored in notification_history.", - "If a dismiss arrives later, the suppression window kicks in and any further re-fires of the same error_key stay queue-side until the window closes." + "Dismissing an alert starts its suppression window. Further detections of the same error_key normally produce no new notification during that window; they are not automatically queued for delivery when it ends. The critical CPU-temperature override remains an exception." ], "outro": "Channel configuration (Telegram bot token, webhook URLs, AI provider keys, per-event toggles, channel overrides) is documented in Notifications and AI Assistant." }, "rest": { "heading": "REST endpoints", - "intro": "Everything the modal does is callable from the API — handy for scripts, custom dashboards or your own chat-bot integration. Every call needs an API token; calls that change something — dismissing an alert, saving the suppression settings, cleaning up orphans — require one with full_admin scope, and a read_only token receives 403.", + "intro": "The modal actions are also available through the API for scripts, custom dashboards or chatbots. When Monitor authentication is enabled, calls need a valid bearer token, either from login or the API-token screen. Changes such as acknowledging alerts, saving suppression settings or cleaning orphan errors require full_admin scope; read_only receives 403. When authentication is disabled or declined, these decorators allow access without a token.", "headerEndpoint": "Endpoint", "headerMethod": "Method", "headerUse": "Use", @@ -297,7 +297,7 @@ { "endpoint": "/api/health", "method": "GET", - "use": "Small health probe — returns JSON with status, timestamp and version. Suitable for Uptime Kuma keyword checks; the receiver must send the bearer header." + "use": "Lightweight health probe returning JSON with status, timestamp and version. Suitable for Uptime Kuma keyword checks; when Monitor authentication is enabled, the client must send a bearer header." }, { "endpoint": "/api/health/status", diff --git a/web/messages/en/docs/monitor/index.json b/web/messages/en/docs/monitor/index.json index 889f95cb..1b2408ed 100644 --- a/web/messages/en/docs/monitor/index.json +++ b/web/messages/en/docs/monitor/index.json @@ -40,7 +40,7 @@ }, { "name": "VMs & Containers", - "description": "Inventory of all VMs and LXCs with status, resources and uptime. Drill-in shows config, historical metrics, full guest logs and start/stop/reboot/shutdown actions." + "description": "Inventory of VMs and LXCs with status, resources and uptime. The detail view shows configuration, historical metrics, Proxmox log downloads and start/stop/reboot/shutdown actions. Log availability is limited by the Proxmox endpoint; this is not a complete guest OS log archive." }, { "name": "Hardware", @@ -52,7 +52,7 @@ }, { "name": "Terminal", - "description": "Browser shell to the host or to any VM/CT, powered by xterm.js over WebSockets. Authenticated and audited like the rest of the API." + "description": "Browser shell for the host and supported VM/CT console access, powered by xterm.js over WebSockets. It follows the configured authentication mode: when authentication is disabled or declined, reachable clients can open a session without login. This description does not imply per-command auditing." }, { "name": "Security", @@ -81,7 +81,7 @@ "intro": "Two access patterns are supported and the application detects which one is in use:", "codeComment1": "# 1) Direct access on the host", "codeComment2": "# 2) Via reverse proxy (Nginx / Caddy / Traefik)", - "afterCode": "When fronted by a reverse proxy, the Monitor honours X-Forwarded-For, X-Forwarded-Proto and X-Forwarded-Host so URLs and CORS behave correctly without manual configuration.", + "afterCode": "A reverse proxy should set X-Forwarded-For, X-Forwarded-Proto and X-Forwarded-Host appropriately and forward WebSocket upgrades. The browser uses its current origin for standard proxy ports. For backend client-IP handling, forwarded addresses are trusted only when PROXMENUX_TRUST_PROXY=1 is explicitly set; restrict direct access to the backend when enabling that trust.", "footer": "First-launch setup, password + TOTP 2FA, and reverse-proxy snippets are covered in Access & Authentication." }, "mobile": { @@ -112,9 +112,9 @@ }, "api": { "heading": "REST API and integrations", - "intro": "Everything the UI shows is available as JSON over HTTP/HTTPS. The same endpoints power Homepage widgets, Home Assistant sensors, Grafana dashboards (via the Prometheus exporter at /api/prometheus), Uptime Kuma probes and any custom script that speaks curl.", + "intro": "The dashboard’s REST endpoints expose monitoring data as JSON over HTTP/HTTPS for Homepage widgets, Home Assistant sensors, Uptime Kuma probes and custom scripts. Grafana can use the separate Prometheus text exporter at /api/prometheus. Requests can be made with curl.", "tokens": "Long-lived API tokens (365 days) are generated from Settings → API Access Tokens or via POST /api/auth/generate-api-token.", - "bearer": "Tokens travel as Authorization: Bearer …. Public endpoints (/api/health, /api/auth/*) work without a token so external uptime probes can hit the host without handing out credentials.", + "bearer": "Send tokens as Authorization: Bearer …. The public /api/health endpoint is suitable for external uptime probes without credentials. Routes under /api/auth/* include both public setup/login/status routes and protected account/token management routes; they are not all anonymous.", "catalog": "The full endpoint catalog, token rotation guidance and security best-practices live in API Reference; ready-made examples for Homepage, Home Assistant, Grafana, Uptime Kuma and a generic cURL pattern are in Integrations." }, "serviceControl": { diff --git a/web/messages/en/docs/monitor/integrations.json b/web/messages/en/docs/monitor/integrations.json index 381b4890..415a2088 100644 --- a/web/messages/en/docs/monitor/integrations.json +++ b/web/messages/en/docs/monitor/integrations.json @@ -48,16 +48,16 @@ "multiTitle": "Multi-widget setup — system, storage, network", "multiIntro": "For a richer view, render three separate cards backed by different endpoints — one for system metrics, one for storage, one for network. Use the same token in every card; it's the same Monitor instance.", "multiCalloutTitle": "Multiple Proxmox hosts", - "multiCalloutBody": "Repeat the entry block per host to get the multi-card layout in the screenshot above — each entry points at the http://<host>:8008 URL of its own ProxMenux Monitor instance. The token can be different per host (one secret entry per host) or shared, depending on how you generate them." + "multiCalloutBody": "Repeat the entry block for each host to get the multi-card layout shown above. Each entry uses the URL http://<host>:8008 of that host’s Monitor instance. Generate and store a token for each host; separate installations have their own signing secrets, so a token from one host should not be assumed to work on another." }, "homeAssistant": { "heading": "Home Assistant", "headingHref": "https://www.home-assistant.io", - "intro": "There is no native HACS integration for ProxMenux Monitor (yet) — but you don't need one. The built-in rest integration in Home Assistant can pull every endpoint documented in the API Reference and turn the responses into sensors, attributes and triggers. The complete reference build below exposes ~25 sensors covering system resources, the Health Monitor, VMs / CTs, storage, network, gateway latency and ProxMenux update status — drop the YAML into configuration.yaml, restart, and you have a full Proxmox observability layer inside HA.", + "intro": "These examples use Home Assistant’s built-in rest integration, so a custom HACS component is not required. It reads Monitor endpoints described in the API Reference and turns their responses into sensors and attributes for automations. The reference configuration below provides roughly 25 sensors for system resources, health, VMs/CTs, storage, network and ProxMenux updates. Add it to configuration.yaml and reload or restart HA.", "imageAlt": "Home Assistant dashboard showing ProxMenux Monitor entities — health status badge, CPU / RAM / Temp gauges, VM count, storage usage and active errors counter", "imageCaption": "ProxMenux Monitor as a first-class Home Assistant integration — sensors built from the YAML recipe below.", "step1Title": "1 · Store the API token", - "step1Body": "Drop the token into Home Assistant's secrets.yaml so it never leaks into a config dump. The whole bearer prefix goes in one line — that lets the YAML reference it directly as a header value. Filename and location depend on your HA install (typically /config/secrets.yaml for HA OS / Container).", + "step1Body": "Store the token in Home Assistant’s secrets.yaml to keep it separate from the main configuration. Include the full Bearer prefix and token in one value so YAML can reference it as a header. This file is not encrypted and must also be kept private. Its location depends on the installation, typically /config/secrets.yaml on HA OS or Container.", "step2Title": "2 · Drop in the REST configuration", "step2Body": "Six REST blocks cover the full surface — one per major Monitor area. Each block has a sensible scan_interval tuned to how often the underlying data changes (system resources every 30 s, health every 60 s, slowly-changing inventories every 5-10 min). Paste into configuration.yaml:", "step3Title": "3 · Add binary sensors and template helpers", @@ -72,14 +72,14 @@ "viewTipBody": "Open the dashboard's 3-dot menu → Raw configuration editor and add a new view with this header (above the cards: list from the YAML above):", "viewTipOutro": "That gives you a dedicated tab/view in your dashboard with its own icon and title, instead of one long card on an existing view.", "altViewTitle": "Alternative — a dedicated dashboard view", - "altViewIntro": "If you'd rather have a full dedicated page (its own tab in the dashboard sidebar) than a single card inside an existing view, Home Assistant lets you create a new view directly with YAML. Steps:", + "altViewIntro": "To create a dedicated view tab inside an existing dashboard, rather than one card within another view, add a view with the YAML below. A view is a tab within a dashboard; it does not create a new sidebar dashboard entry. Steps:", "altViewSteps": [ "Open the dashboard where you want the new tab.", "Click the pencil (edit dashboard) at the top right.", "Click the + tab at the end of the existing tabs to create a new view.", "In the dialog that opens, switch to the Code editor tab (top right of the dialog — toggles between visual editor and YAML).", "Paste the YAML below.", - "Save. The new ProxMenux Monitor tab appears in the sidebar with all cards rendered." + "Save. The new ProxMenux Monitor view appears as a tab inside the dashboard with its cards." ], "twoEditorsTitle": "Two YAML editors in HA — pick the right one", "twoEditorsIntro": "Home Assistant has two YAML editors that look similar but expect different formats:", @@ -89,7 +89,7 @@ ], "twoEditorsOutro": "Pasting view-body YAML into the whole-dashboard editor (or vice versa) leaves you with a Vista sin nombre and cards: []. The YAML below is for the single-view editor — paste exactly as shown.", "viewImageAlt": "Home Assistant dedicated view rendering ProxMenux Monitor — picture-entity header, glance KPIs, and System / VMs / Storage / Network entity cards laid out automatically by HA across multiple columns", - "viewImageCaption": "The dedicated ProxMenux Monitor view as Home Assistant renders it on a wide screen — HA's default layout splits the cards into multiple columns automatically.", + "viewImageCaption": "The dedicated ProxMenux Monitor view on a wide screen. A Masonry layout arranges the cards into columns automatically; the layout depends on the configured view type.", "twoColTipTitle": "Want a fixed two-column layout instead of the auto layout?", "twoColTipBody": "Replace any pair of cards (e.g. System + VMs, or Storage + Network) with a single horizontal-stack wrapping both, so they always render side by side regardless of screen width:", "twoColTipOutro": "On mobile the row stays compressed; HA's auto layout (no horizontal-stack) reflows better at narrow widths.", @@ -105,19 +105,19 @@ "In the Lovelace YAML, replace the image: URL with /local/icons/proxmenux.svg. Save and reload — the image renders from the local file, no internet needed." ], "scanTipTitle": "scan_interval rule of thumb", - "scanTipBody": "/api/system is cheap to call — 30 s is fine. /api/health/full uses an internal 6-min cache, so polling it more often than ~60 s gains you nothing. /api/storage/summary changes slowly — every 5 min is plenty. /api/proxmenux/update-status only matters once an hour. Tune to your hardware budget if you have many sensors across many hosts." + "scanTipBody": "Polling /api/system every 30 s is a reasonable starting point. /api/health/full normally reads a background result valid for up to 6 min; polling every 60 s does not bypass that cache. Try 5 min for /api/storage/summary and an hour for /api/proxmenux/update-status. Adjust intervals for your hardware and number of hosts." }, "grafana": { "heading": "Prometheus + Grafana", "promHref": "https://prometheus.io", "grafanaHref": "https://grafana.com", - "intro": "ProxMenux Monitor exposes a Prometheus-format scrape endpoint at GET /api/prometheus (authenticated) returning OpenMetrics text. Wire it into Prometheus, then build a Grafana dashboard on top — same data the dashboard UI shows, in the format your TSDB expects.", + "intro": "ProxMenux Monitor exposes GET /api/prometheus, returning Prometheus text exposition format 0.0.4. It requires a bearer token when Monitor authentication is enabled. Configure Prometheus to collect it, then use Grafana to visualize the metrics in your time-series database.", "imageAlt": "Grafana dashboard rendering ProxMenux Monitor metrics — CPU usage gauge, memory usage timeseries, running VMs count, network throughput", "imageCaption": "A basic Grafana dashboard built from the ProxMenux Prometheus scrape — CPU, memory, running VMs, network throughput. The full metric catalogue lives in the API Reference → Prometheus metrics.", "step1Title": "1 · Add the scrape job to Prometheus", "step1Body": "Pass the API token via Prometheus' native authorization block (cleaner than custom headers and works with secret stores):", - "step1After": "Reload Prometheus (kill -HUP or systemctl reload prometheus, or docker compose restart prometheus if you run it as a container) and check Status → Targets — the proxmenux job should turn green within one scrape interval. Each metric carries a node=\"<hostname>\" label so you can distinguish hosts in queries.", - "tokenTipTitle": "Token via file or env, not inline", + "step1After": "Reload Prometheus with kill -HUP <PID> (replace PID with the Prometheus process ID), systemctl reload prometheus if supported by your service, or docker compose restart prometheus for a container. Check Status → Targets: the proxmenux job should become UP within one collection interval. Monitor metrics carry a node=\"<hostname>\" label to distinguish hosts.", + "tokenTipTitle": "Keep the token in a separate file", "tokenTipBody": "For production deployments avoid inlining the token. Prometheus supports credentials_file: /etc/prometheus/secrets/proxmenux.token as an alternative — keep the token in a 0600 file and let Prometheus read it.", "step2Title": "2 · Verify the scrape with a couple of queries", "step2Body": "Before configuring Grafana, confirm Prometheus actually has the data. Open Prometheus' own UI at http://<prometheus-host>:9090, click Query and run any of these — you should get back live numbers from your Proxmox host:", @@ -142,9 +142,9 @@ } ], "calloutTitle": "The 401 you may see when clicking the endpoint URL is fine", - "calloutBody": "On the Status → Targets page, clicking the endpoint link (/api/prometheus) makes your browser fetch it directly — without the bearer header that Prometheus uses for its own scrapes. So you'll see '{'\"error\":\"Authentication required\"'}'. That confirms the API is properly protected; Prometheus itself authenticates correctly because it has the token from the scrape config. Trust the green State: UP, not the click-through.", + "calloutBody": "With Monitor authentication enabled, clicking the endpoint link on Status → Targets fetches /api/prometheus in the browser without Prometheus’s bearer header. The response can contain '{'\"error\":\"Authentication required\"'}'. Check the target’s actual State: UP to confirm that Prometheus itself is collecting successfully with its configured token.", "step3Title": "3 · Add Prometheus as a Grafana data source", - "step3Body": "In Grafana: Connections → Data sources → Add new → Prometheus. Set the URL to your Prometheus instance (e.g. http://prometheus.lan:9090), save and test. No extra auth needed at this layer — Prometheus has already authenticated to ProxMenux.", + "step3Body": "In Grafana, open Connections → Data sources → Add new → Prometheus. Set the Prometheus URL, for example http://prometheus.lan:9090, then save and test. If your Prometheus server requires authentication, configure that separately here. The Monitor API token belongs in the Prometheus collection job.", "step4Title": "4 · Build panels with these PromQL queries", "step4Body": "A starter set that maps directly to what users typically watch on a Proxmox host:", "headerPanel": "Panel idea", @@ -200,7 +200,7 @@ "uptimeKuma": { "heading": "Uptime Kuma and other status checkers", "href": "https://github.com/louislam/uptime-kuma", - "intro": "For external probes, use GET /api/system-info — it is the one endpoint that works without a token, returning a small JSON payload with hostname, uptime and the overall health status (mapped to healthy / warning / critical). That's exactly what a keyword-based monitor needs.", + "intro": "For a keyword-based check, use GET /api/system-info. This route has no token decorator and returns hostname, uptime and a health status mapped to healthy, warning or critical. It is a public probe, unlike the authenticated detailed health endpoints.", "kumaTitle": "Uptime Kuma — HTTP keyword monitor", "kumaSteps": [ "In Uptime Kuma, click + Add New Monitor.", @@ -209,22 +209,22 @@ "URL: http://pve01.lan:8008/api/system-info.", "Keyword: healthy (the value of health.status when the host is OK).", "Heartbeat Interval: 60 seconds is enough.", - "Save. No headers needed — the endpoint is public." + "Save. This system-info route does not require a bearer header." ], "healthchecksTitle": "healthchecks.io / cron-style pings", - "healthchecksBody": "Same endpoint, same shape — point your cron-style ping at /api/system-info and assert .health.status == \"healthy\". Most of these services accept a 2xx HTTP status as the \"up\" signal too, in which case even a curl without parsing is enough.", + "healthchecksBody": "A cron job can query /api/system-info and test .health.status == \"healthy\". Only after a successful health test should it send a success ping to the check’s unique Healthchecks.io URL. Healthchecks.io receives pings from jobs; it does not poll the Monitor URL. An HTTP 2xx response alone does not prove that the reported host health is good.", "richTitle": "Want richer health data", - "richBody": "For the full state (the ten Health Monitor categories + active errors + dismissed list), use GET /api/health/full instead — that one needs an API token but gives you everything the dashboard modal renders in a single response." + "richBody": "For the full state — ten health categories, active errors and dismissed items — use GET /api/health/full. It returns the dashboard modal’s data in one response and needs a bearer token when Monitor authentication is enabled." }, "workflows": { "heading": "n8n, Zapier and custom scripts", - "intro": "For workflow tools and ad-hoc scripts that need to raise notifications through the Monitor (a CI failure, a smart-home sensor, a cron job that ran too long), the recipe is one POST to /api/notifications/send. The event flows through the same dispatch pipeline as anything emitted internally — dedup, cooldown, optional AI rewrite, fan-out to the configured channels.", - "n8nBody": "In n8n, the equivalent is an HTTP Request node with method POST, the URL above, an Authorization header set to Bearer '{''{'$credentials.proxmenux.token'}''}' (using n8n credentials), and a JSON body matching the curl payload. Wire any preceding node as the trigger (cron, webhook, condition).", - "severityBody": "Severity values are INFO, WARNING or CRITICAL (uppercase). The data payload is free-form JSON — the AI rewriter, when enabled, will pull anything useful from it for the rendered body. Full event-type semantics live in Notifications → Event catalogue." + "intro": "Workflow tools and scripts can send notifications through a POST to /api/notifications/send, for example after a CI failure or an overlong cron job. This is a direct send: it bypasses the event queue and fingerprint cooldown. It still uses channel formatting, optional AI rewriting and delivery to configured channels. Apply any required duplicate control in the caller.", + "n8nBody": "In n8n, use an HTTP Request node with POST, the URL above and the same JSON body as curl. Choose generic Header Auth credentials: set the header name to Authorization and its value to Bearer YOUR_API_TOKEN, replacing the placeholder. Connect a schedule, webhook or other preceding node to trigger the request.", + "severityBody": "Severity values are INFO, WARNING or CRITICAL in uppercase. The data object supplies event context. AI rewriting uses the rendered title and message plus supported enrichment; arbitrary fields are not guaranteed to appear in its prompt or output. See Notifications → Event catalogue for event semantics." }, "pveWebhook": { "heading": "Native Proxmox VE webhook (inbound)", - "intro1": "Proxmox VE 8.1+ has its own notification system. ProxMenux Monitor registers itself as a webhook target so that everything PVE emits on its own (HA fencing, replication, vzdump from the GUI, certificate renewal) lands in the same dispatch pipeline as the Monitor's own events. This happens automatically when you press Enable Notifications on the Settings tab — no integration work required on the user side.", + "intro1": "The PVE notification system was introduced in 8.1; native webhook targets require Proxmox VE 8.3 or later. Enabling notifications with Enable Notifications in Settings attempts to register the Monitor as a target. PVE notifications routed to that target, such as backup or replication reports, then enter the Monitor’s dispatch flow. Setup depends on the notification configuration being writable and available.", "intro2": "Mechanics, the body template PVE sends, the entries written to /etc/pve/notifications.cfg, and behaviour in clusters are documented in Notifications → PVE webhook integration." }, "whereNext": { diff --git a/web/messages/en/docs/monitor/notifications.json b/web/messages/en/docs/monitor/notifications.json index b6758553..8112cd6c 100644 --- a/web/messages/en/docs/monitor/notifications.json +++ b/web/messages/en/docs/monitor/notifications.json @@ -25,7 +25,7 @@ "sourcesLabel": "Sources", "sourcesDetail": "Health Monitor\nJournal watcher\nTask watcher\nPVE webhook hook\nPolling collector\nIn-process emitters", "dispatchLabel": "Dispatch pipeline", - "dispatchDetail": "Per-event toggle\nFingerprint dedup\nCooldown\nBurst aggregation", + "dispatchDetail": "Burst aggregation\nFingerprint / cooldown checks\nGroup rate limits\nPer-channel controls", "aiLabel": "AI rewrite (opt.)", "aiDetail": "OpenAI / Anthropic\nGemini / Groq\nOpenRouter / Ollama\n(off by default)", "channelsLabel": "Channels", @@ -40,7 +40,7 @@ "stepsIntro": "Pressing the button does three things in sequence:", "steps": [ "Flips the panel to its Active state and unfolds the channel form below.", - "Registers a Proxmox VE webhook target in /etc/pve/notifications.cfg pointing at POST http://127.0.0.1:8008/api/notifications/webhook. From this moment on, anything Proxmox VE emits on its own (HA, replication, vzdump from the GUI) flows into the same pipeline as the Monitor's own events. See PVE webhook integration below for the full mechanics.", + "Registers a Proxmox webhook target in /etc/pve/notifications.cfg. Without Monitor HTTPS, it uses POST http://127.0.0.1:8008/api/notifications/webhook; with HTTPS enabled, it uses the HTTP loopback listener on port 8009. PVE notifications then enter the Monitor’s dispatch process. See PVE webhook integration below.", "Starts the dispatch background thread. The thread polls the event queue and walks every event through the pipeline diagrammed above." ], "activeAlt": "Notifications card after enabling — Active badge, channel tabs, Display Name field and Advanced AI Enhancement collapsible section", @@ -48,7 +48,7 @@ }, "sources": { "heading": "Event sources", - "intro": "Six independent collectors feed the notification engine. They run as background threads inside the Monitor process and emit a structured NotificationEvent every time something happens.", + "intro": "Six source types feed the notification engine: background collectors, the webhook receiver and direct emitters inside the process. They produce structured NotificationEvent objects.", "headerCollector": "Collector", "headerWatches": "Watches", "headerEvents": "Typical events", @@ -70,7 +70,7 @@ }, { "collector": "Proxmox webhook hook", - "watches": "Listens on POST /api/notifications/webhook. Proxmox VE 8.1+ pushes its own notifications here once the integration is set up (see below).", + "watches": "Receives POST /api/notifications/webhook. PVE versions with webhook notification targets can forward their notifications here after setup (see below).", "events": "Anything PVE emits — including events the Monitor would otherwise miss (HA, replication, vzdump from the GUI)." }, { @@ -156,7 +156,7 @@ "intro": "Email is the most flexible channel — and the one with the most fields. You need an SMTP server, a port, a TLS mode, optionally a username and password, a sender address and at least one recipient.", "imageAlt": "Email channel form with SMTP Host, Port, TLS Mode dropdown, Username, Password, From Address, To Addresses comma-separated and Subject Prefix fields", "imageCaption": "Email — SMTP host / port / TLS mode, optional username + password, sender address, comma-separated recipients and a subject prefix to make alerts easy to filter inbox-side.", - "appNote": "If you use a personal Gmail or Microsoft 365 account, the password field cannot be your normal account password — both providers require an app password generated specifically for third-party clients. The two flows are below.", + "appNote": "The Monitor uses password-based SMTP authentication. Gmail may require an app password. Microsoft support depends on the service and tenant policy; an app password does not override a ban on Basic authentication. Verify that your SMTP service permits this method.", "gmailTitle": "Gmail app password", "gmailIntro": "Gmail app passwords require 2-Step Verification to be active on the Google account. If it isn't, the App passwords page won't exist.", "gmailItems": [ @@ -166,15 +166,15 @@ "Fill the Email tab with: Host smtp.gmail.com, Port 587, TLS Mode STARTTLS, Username your Gmail address, Password the 16-character app password." ], "outlookTitle": "Microsoft / Outlook app password", - "outlookIntro": "Microsoft now requires two-step verification on the personal account before an app password can be created. Enterprise tenants where the admin has disabled SMTP basic auth need a different path (OAuth2) which is not currently supported by the Monitor — point those at an SMTP relay you control instead.", + "outlookIntro": "Microsoft app passwords require two-step verification, but their availability does not guarantee SMTP compatibility. Where the service or tenant requires OAuth2, the Monitor’s password-based SMTP client cannot authenticate. Use an SMTP relay that supports the required upstream authentication.", "outlookItems": [ "Open account.microsoft.com/security and enable two-step verification.", - "Open Advanced security options, scroll to App passwords and click Create a new app password.", - "Microsoft shows a long random password — copy it.", - "Fill the Email tab with: Host smtp-mail.outlook.com, Port 587, TLS Mode STARTTLS, Username your Outlook / Microsoft 365 address, Password the generated app password." + "If your account offers Advanced security options → App passwords, choose Create a new app password. This option alone does not establish that your mail service accepts password-based SMTP.", + "If Microsoft generates an app password, copy it and verify that your SMTP service accepts it.", + "Only if your provider permits password-based SMTP, fill in its approved settings: Host smtp.office365.com for Exchange Online, Port 587, TLS Mode STARTTLS, Username your mailbox address, and Password the permitted SMTP credential. Personal Outlook.com settings and authentication requirements are different; do not assume these credentials will work." ], "relayTitle": "Self-hosted SMTP relay", - "relayBody": "If you run your own SMTP relay (Postfix, msmtp, etc.) on the LAN, point the Monitor at it and skip the app-password dance entirely. The relay handles auth upstream and the Monitor sends in cleartext on a trusted network." + "relayBody": "Point the Monitor at an SMTP relay you control, such as Postfix. The relay handles upstream authentication. Configure the Monitor’s authentication and TLS mode to match the relay; using a local relay does not itself disable encryption." }, "pushover": { "heading": "Pushover", @@ -223,10 +223,10 @@ "richHeader": "Rich — Rich messages on", "richOutro": "The toggle is per-channel: leave Email plain for inbox-rule readability while letting Telegram and Discord render the rich version. Channels that don't support inline formatting (plain-text email, Gotify) ignore the formatting and fall back to text either way.", "togglesTitle": "Per-event categories", - "togglesIntro": "Around seventy event types are grouped into eleven UI categories. Each event has a master toggle and a per-channel override — two layers that decide whether a given event reaches a given channel:", + "togglesIntro": "Each channel independently controls categories and individual event types. Turning a category off suppresses its events for that channel. Individual event toggles apply within enabled categories; there is no global master-event filter in the dispatcher.", "togglesItems": [ - "Per-event master toggle. If vm_start is off everywhere, no channel ever sees a vm_start. Toggles persist as event_toggles[event_type] = true | false.", - "Per-channel overrides. An event type can also be muted for a specific channel (\"send backup_complete to Discord but not to Telegram\"). These live in channel_overrides[channel_name][event_type] and only apply if the event passed the master toggle." + "Per-channel category toggle. For example, disabling the VM/CT category suppresses vm_start and its peers for that channel. Category preferences are stored as <channel>.events.<group>.", + "Per-channel event toggle. Within an enabled category, you can choose send backup_complete to Discord but not Telegram. Individual preferences are stored as <channel>.event.<event_type>." ], "togglesOutro": "Each category header in the screenshot also shows the count of events currently enabled / total for that group, and a category-level toggle that flips every event inside it on or off in one click — the shortcut for muting a whole group (e.g. all info backups, all update-related events) without expanding the section." }, @@ -238,7 +238,7 @@ "purposeTitle": "What it is for", "purposeItems": [ "Don't wake me at 03:00 for an update notice. Backups, app updates, post-install optimisations and other INFO-level events stop pinging your phone at night.", - "But still wake me for a fire. Disk failures, OOM kills, host shutdowns, fail2ban bans — anything classified as CRITICAL — bypass the window and arrive immediately.", + "Critical events still arrive. Events actually classified as CRITICAL bypass Quiet Hours. The event name alone does not make it critical: the journal watcher emits Fail2Ban blocks and host shutdown/reboot notices as INFO, so those can be buffered.", "Don't miss anything either. The events suppressed during the window aren't silently dropped — they sit in a SQLite buffer until you're back on the clock." ], "howTitle": "How it works", @@ -251,11 +251,11 @@ "Across restarts. If the Monitor restarts mid-window, the buffer is intact on disk. If the restart happens just after the window closed, the next dispatch cycle detects the pending rows and flushes them with a single \"recovery\" summary — no notifications are lost to a deploy or a reboot." ], "criticalTitle": "What counts as CRITICAL", - "criticalBody": "Severity is set at event creation, not at dispatch time. Disk failures, OOM kills, cluster split-brain, host shutdowns and the \"hard\" tier of disk I/O errors ship as CRITICAL by design. Everything else (backups OK, updates available, INFO logs, rate-limit hits) defaults to INFO or WARNING and is therefore quietable. You can verify a given event's default severity in the Event catalogue further down this page." + "criticalBody": "The producer sets the severity when creating each event. A disk, shutdown or security event is not automatically CRITICAL because of its name. For example, the journal watcher emits ip_block, system_shutdown and system_reboot as INFO. The Event catalogue lists the event types; inspect the producer and the received event for its actual severity." }, "digest": { "heading": "Daily digest of INFO events", - "intro1": "The Daily Digest is the opposite knob: an opt-in setting that says \"don't send me every successful backup or update notice as it happens — collect them and send me one summary per day at 09:00 (or whatever hour I choose)\". Same goal as Quiet Hours (less noise) but a different mechanism (time-based summary instead of a daily window).", + "intro1": "The Daily Digest is an opt-in setting that collects eligible INFO notices, such as available updates, into one summary at 09:00 or another chosen time. Backup and replication results and live-action events are exempt. Quiet Hours instead delays non-critical messages during a daily window.", "intro2": "It lives in the same channel-settings card as Quiet Hours (see the figure under Quiet Hours), right underneath. You enable each one independently.", "purposeTitle": "What it is for", "purposeItems": [ @@ -266,7 +266,7 @@ "howItems": [ "Per-channel opt-in. Off by default — Telegram doesn't silently batch your alerts. You enable it on the channels where you want a digest, leaving others on live delivery.", "Delivery time in your local timezone. Defaults to 09:00 but you can pick any time; the dispatcher fires the digest within ~60 s of that minute.", - "What goes into the digest: any event the channel would have received live whose severity is INFO. Examples — vzdump complete, Tailscale update available, ProxMenux optimisation update available, APT security updates pending, rate-limit hit.", + "Included in the digest: eligible generic events with severity INFO. Examples include application update available, Tailscale update available, ProxMenux optimisation update available, APT security updates pending and rate-limit notice. Backup results and other exempt action events remain live.", "What is never delayed:", "Persistence. Pending events sit in a SQLite table (digest_pending) until the configured hour. The Monitor can restart freely without losing what the digest will eventually contain.", "Empty days are silent. If nothing INFO-level happened, no digest is sent — the channel stays quiet rather than receiving a \"no events to report\" message." @@ -274,10 +274,10 @@ "neverDelayedSub": [ "CRITICAL events always go through immediately.", "WARNING events always go through immediately.", - "Live-action events (VM/CT start / stop / shutdown / restart, vm_fail / ct_fail, backup start / fail, replication start / fail, host shutdown / reboot) bypass the digest even at INFO severity — you opted in to see those live, the digest would defeat that opt-in." + "Live-action events — VM/CT start, stop, shutdown, restart and failure; backup start and results; replication results; host shutdown and reboot — bypass the digest even at INFO severity. Quiet Hours can still delay non-critical events." ], "comboTitle": "Combining Quiet Hours and Daily Digest", - "comboBody": "The two work together. A channel can have both active — Quiet Hours from 22:00 to 07:00 plus a Daily Digest at 09:00. INFO events during the quiet window go to the quiet buffer and arrive at 07:00 as the close-of-window summary; INFO events during the day go to the digest buffer and arrive at 09:00 the next morning. CRITICAL and WARNING always cut through both. Choose Quiet Hours when the goal is a window of silence, the Daily Digest when the goal is a fixed-time summary; many setups want both." + "comboBody": "A channel can have both enabled: Quiet Hours from 22:00 to 07:00 and a Daily Digest at 09:00. Non-critical events during Quiet Hours enter its buffer and are released in the 07:00 summary. Eligible INFO events outside that window enter the digest. CRITICAL bypasses both; WARNING bypasses the digest but still waits during Quiet Hours. Choose a window of silence, a fixed-time summary, or both." }, "displayName": { "heading": "Display Name", @@ -288,23 +288,23 @@ }, "dispatch": { "heading": "Dispatch pipeline", - "intro": "Between an event being raised and a message leaving the host, three stages run in this order:", + "intro": "The table describes three related mechanisms. The actual flow begins with burst aggregation, then delivery-claim/cooldown checks and group rate limiting, followed by rendering and per-channel delivery controls:", "headerStage": "Stage", "headerWhat": "What it does", "headerTunable": "Tunable?", "rows": [ { - "stage": "1. Fingerprint dedup", + "stage": "Fingerprint deduplication", "what": "Each event is hashed into a fingerprint (event_type + key fields from data). Identical fingerprints inside a short window are considered duplicates of the first one.", "tunable": "No — internal dispatcher logic." }, { - "stage": "2. Cooldown", - "what": "After a fingerprint is sent, the same fingerprint is suppressed for the per-severity cooldown duration. Stored in the notification_last_sent SQLite table so it survives restarts. Defaults: CRITICAL 60 s, WARNING 300 s, INFO 900 s, plus a per-category override on top (e.g. resources 900 s, updates 86 400 s).", - "tunable": "No — defaults baked into the dispatcher." + "stage": "Cooldown", + "what": "After successful delivery, repeated fingerprints are suppressed and the state is saved in notification_last_sent. Base defaults for CRITICAL, WARNING and INFO are 86 400 s, as are resources and updates. Exceptions include 5 s for VM/CT actions and host shutdown/reboot, 10 s for backup/replication results, and 1 800–3 600 s for several health-state categories. Explicit event/group settings can override these values.", + "tunable": "Yes — explicit cooldown settings for an event type or group override the defaults; these are dispatcher configuration values." }, { - "stage": "3. Burst aggregation", + "stage": "Burst aggregation", "what": "When N events of a kind arrive inside a short window (e.g. an SSH brute-force flood), they are merged into a single burst_* message with a count and a sample.", "tunable": "No — window and threshold are hard-coded per event type." } @@ -314,32 +314,32 @@ }, "aiRewrite": { "heading": "Optional AI rewrite", - "body1": "Any event can be passed through an LLM that rewrites its body in plain language and (optionally) in the target user's language before fan-out. The AI rewriter is off by default. When enabled it runs in the dispatch thread; if the provider call fails or times out, the original templated body is used instead.", + "body1": "Eligible events can be rewritten by an LLM before delivery. Backup results (backup_complete and backup_fail) bypass this rewrite. AI is off by default and runs in the dispatch thread when enabled. If the call fails or times out, the original template text is used.", "body2": "Six providers are supported (OpenAI, Anthropic, Google Gemini, Groq, OpenRouter and local Ollama), with per-channel detail level (brief, standard, detailed), output language, prompt mode (default or custom) and an optional custom prompt. Full configuration walk-through, captures and prompt examples live in the dedicated AI Assistant page.", "privacyTitle": "Privacy note", - "privacyBody": "AI rewrite sends the event body — which can include hostnames, IP addresses, usernames, error messages and journal lines — to the configured provider. Ollama keeps everything on-host; the other five providers transmit data to their respective endpoints. Disable the rewriter, or use Ollama, if the host runs in an environment where event content cannot leave the network." + "privacyBody": "AI requests can include the title, severity, rendered body, system/custom prompt and collected context, including hostnames, IPs, usernames, errors and journal lines. They go to the selected endpoint. Ollama keeps processing local only with both a local server and a local model; a remote server or cloud model sends data outside the host. Disable rewriting or use a controlled local endpoint and model when event content must stay on the network." }, "pveWebhook": { "heading": "PVE webhook integration", - "intro1": "Proxmox VE 8.1+ has its own notification system with built-in endpoints (sendmail, gotify, SMTP, webhook). When you enable Notifications on the Monitor, it registers itself as one of those endpoints — a webhook target that points back at the Monitor's own API. From that moment on, anything Proxmox itself emits (HA fencing, replication, vzdump from the GUI, certificate renewal, etc.) flows through the same dispatch pipeline as the Monitor's own events.", + "intro1": "Proxmox’s notification system uses targets, including sendmail, Gotify, SMTP and, on versions supporting it, webhook. Enabling Monitor notifications registers a webhook target. PVE-emitted notifications such as HA, replication and GUI backup reports can then enter the same dispatch process.", "intro2": "The target is visible from the Proxmox GUI at Datacenter → Notifications → Notification Targets:", "imageAlt": "Proxmox VE Edit Webhook dialog showing the auto-created proxmenux-webhook target with method POST, URL http://127.0.0.1:8008/api/notifications/webhook and a JSON body template using escape title, escape message, escape severity, escape timestamp and json fields", "imageCaption": "The PVE-side webhook target as Proxmox sees it (the GUI is in the host's configured locale — Spanish in this example). Same fields apply in any language.", "registeredIntro": "What gets registered:", "registeredItems": [ - "Method & URL. POST http://127.0.0.1:8008/api/notifications/webhook. Loopback only — PVE talks to the Monitor process running on the same host.", + "Method and URL. POST http://127.0.0.1:8008/api/notifications/webhook when Monitor HTTPS is off. With HTTPS enabled, the target uses the separate HTTP loopback listener on port 8009. Both stay on the same host.", "Body template. A JSON body using PVE's native Handlebars helpers — stored base64-encoded in the config file by PVE, but it expands to:", "Matcher. A companion matcher: proxmenux-matcher block with mode all so every PVE notification reaches the target.", - "Companion priv block. An empty webhook: proxmenux-webhook entry is appended to /etc/pve/priv/notifications.cfg. PVE refuses to instantiate any webhook endpoint without a matching private block, even when no secrets are needed — so the Monitor writes a header-only stub there. No tokens, headers or HMAC are configured on the PVE side." + "Private configuration. Setup writes the matching webhook: proxmenux-webhook block in /etc/pve/priv/notifications.cfg, including the shared secret encoded in base64. The public target references that secret to send X-Webhook-Secret. The block is not an empty stub." ], "securityTitle": "How the receiver is secured", "securityIntro": "The webhook receiver at POST /api/notifications/webhook applies different security layers depending on where the request comes from:", "securityItems": [ - "Loopback (127.0.0.1 / ::1). Rate-limit only. The endpoint trusts the loopback interface — only processes running on the host can reach it, and PVE itself cannot send custom auth headers in the body it generates. This is the path every PVE-emitted notification travels.", - "Remote callers. Five layers stack on top of rate-limiting: a shared secret in the X-Webhook-Secret header, a freshness timestamp in X-ProxMenux-Timestamp (rejected if it drifts more than the configured window), a replay-cache lookup, and an optional IP allowlist. The shared secret lives in the Monitor's SQLite settings table — not in /etc/pve/priv/notifications.cfg — and is generated at first setup. This path exists for custom integrations posting from outside the host; the PVE-configured target never exercises it." + "Local sources (127.0.0.1 / ::1). Rate limiting applies, but the remote secret/timestamp/replay checks are skipped. The receiver also treats addresses assigned to the host’s own interfaces as local. The automatically configured PVE target uses loopback.", + "Remote callers. In addition to rate limiting, the receiver checks the configured secret in X-Webhook-Secret, a timestamp from X-ProxMenux-Timestamp or the JSON body, replay detection and an optional IP allowlist. The secret is stored in SQLite; setup also writes a base64-encoded copy to /etc/pve/priv/notifications.cfg so PVE can send the header." ], "practiceTitle": "In practice", - "practiceBody": "The PVE setup writes the target as http://127.0.0.1:8008, so PVE-emitted notifications always go through the loopback path with rate-limit-only security. The remote-caller path with the shared secret is opt-in for custom integrations — point an external service at https://<monitor-host>:<port>/api/notifications/webhook and supply the X-Webhook-Secret header to use it.", + "practiceBody": "The PVE target uses http://127.0.0.1:8008 without HTTPS, or HTTP port 8009 with Monitor HTTPS. For external integrations at https://<monitor-host>:<port>/api/notifications/webhook, send the configured X-Webhook-Secret and a current timestamp, and satisfy replay and IP checks. A secret header alone is not sufficient.", "actionsIntro": "The Monitor manages this target through three actions on the Settings tab:", "actionsItems": [ "Setup — runs automatically when you enable Notifications. Creates the entry in /etc/pve/notifications.cfg. The file is written only when its content has to change, and a copy of the previous one is kept in /usr/local/share/proxmenux/backups/pve-notifications/ (the three newest). Nothing is written while /etc/pve is not mounted: a Monitor that starts during a restart of pve-cluster registers the entry once it is back.", @@ -347,7 +347,7 @@ "Read config — shows the current targets and matchers as PVE sees them. This is how you confirm the Monitor's entry is the one firing when PVE has multiple notification routes configured." ], "clusterTitle": "Cluster nodes", - "clusterBody": "/etc/pve/ is replicated across cluster members, so the webhook target is visible on every node. Each node, however, posts to its own 127.0.0.1:8008 — meaning the Monitor running on that node receives the events that PVE generated locally. Run the Monitor on every node you want to see in the Notifications history." + "clusterBody": "/etc/pve/ is shared across cluster nodes, including the target URL and secret. Each node calls its own loopback listener: 127.0.0.1:8008 without HTTPS, or HTTP port 8009 with HTTPS. Run Monitor on each relevant node and keep the shared target consistent with every node’s listener configuration." }, "catalogue": { "heading": "Event catalogue", @@ -434,7 +434,7 @@ "The body lists each guest with its own result, size, duration and archive, followed by a line with the totals of the job.", "Warnings and errors are listed once. Repeated lines are shown a single time with the main cause first; past eight lines, the rest is counted in a closing line and stays in the Proxmox task log.", "A job that fails before its first guest shows the cause Proxmox gave, for example a storage that does not exist.", - "Summaries keep the result. A backup listed in the Quiet Hours summary or the Daily Digest carries the icon of its own result." + "Summaries preserve the result. A backup in the Quiet Hours summary keeps its own result icon. Backup result events bypass the Daily Digest." ] } }, @@ -483,7 +483,7 @@ { "endpoint": "/api/notifications/webhook", "method": "POST", - "use": "Receives Proxmox VE's own notifications. Loopback callers are rate-limited only; remote callers must additionally pass the X-Webhook-Secret header, X-ProxMenux-Timestamp freshness check, replay cache and optional IP allowlist." + "use": "Receives Proxmox notifications. Local source addresses skip remote authentication checks but remain rate-limited. Remote requests are checked against X-Webhook-Secret, a timestamp in X-ProxMenux-Timestamp or the JSON body, replay detection and any configured IP allowlist." }, { "endpoint": "/api/notifications/proxmox/setup-webhook", diff --git a/web/messages/es/docs/monitor/access-auth.json b/web/messages/es/docs/monitor/access-auth.json index 82207bf9..36f245e1 100644 --- a/web/messages/es/docs/monitor/access-auth.json +++ b/web/messages/es/docs/monitor/access-auth.json @@ -1,8 +1,8 @@ { "meta": { - "title": "Autenticación del panel de Proxmox — 2FA, API Tokens, perfil de usuario, reverse proxy | ProxMenux Monitor", + "title": "Autenticación del panel de Proxmox — 2FA, tokens API, perfil de usuario, proxy inverso | ProxMenux Monitor", "description": "Acceder y asegurar ProxMenux Monitor: flujo de proteger-tu-panel en el primer arranque, autenticación con contraseña con nombre visible + avatar, página de perfil, alta de TOTP 2FA, API tokens de larga duración para scripts, configuración HTTPS, snippets de reverse proxy para Nginx, Caddy y Traefik, el log de auditoría y el jail Fail2Ban opcional.", - "ogTitle": "Autenticación del panel de Proxmox — 2FA, API Tokens, reverse proxy", + "ogTitle": "Autenticación del panel de Proxmox — 2FA, tokens API, proxy inverso", "ogDescription": "Asegura ProxMenux Monitor con contraseña + TOTP 2FA, API tokens de larga duración, HTTPS, snippets de reverse proxy y un jail Fail2Ban opcional.", "twitterTitle": "Autenticación del panel de Proxmox | ProxMenux Monitor", "twitterDescription": "Contraseña + TOTP 2FA, API tokens, HTTPS, snippets de Nginx/Caddy/Traefik y log de auditoría." @@ -10,16 +10,16 @@ "header": { "title": "Acceso y autenticación", "description": "Cómo llegar al panel, el flujo de seguridad de primer arranque y cada capa que puede situarse entre un atacante y el host: contraseña + TOTP, sesiones JWT, API tokens de larga duración, HTTPS, reverse proxies, Secure Gateway y el jail Fail2Ban opcional.", - "section": "ProxMenux Monitor" + "section": "Monitor de ProxMenux" }, "intro": { "title": "La autenticación es opt-in", - "body": "En el primer arranque el panel muestra un único diálogo — \"¿Proteger tu panel?\" — con dos botones: Sí, configurar contraseña y No, continuar sin protección. Decir que no deja todos los endpoints de la API abiertos en el puerto TCP 8008 — aceptable en una LAN de laboratorio aislada, peligroso en cualquier otro escenario. La autenticación de dos factores (2FA) no forma parte de esta elección inicial; se configura más tarde desde la pestaña Security una vez que hay una contraseña." + "body": "Al abrir el panel por primera vez aparece un diálogo: «¿Proteger el panel?», con los botones Sí, configurar contraseña y No, continuar sin protección. Al elegir que no, los endpoints de la API quedan abiertos en TCP 8008: puede servir en una LAN de laboratorio aislada, pero resulta peligroso en otros entornos. La autenticación de dos factores (2FA) no forma parte de esta primera elección; se configura después desde la pestaña Seguridad, una vez establecida la contraseña." }, "reaching": { "heading": "Cómo llegar al panel", "intro": "ProxMenux Monitor escucha en 0.0.0.0:8008. Hay tres formas habituales de llegar a él:", - "outro": "El acceso directo coincide con lo que la unidad systemd trae por defecto. Las secciones de reverse proxy y Secure Gateway a continuación cubren las otras dos. El Monitor respeta X-Forwarded-For, X-Forwarded-Proto y X-Forwarded-Host para que las URLs y CORS funcionen detrás de cualquiera de ellos sin configuración manual." + "outro": "El acceso directo corresponde a la unidad systemd predeterminada. El proxy inverso y Secure Gateway se describen más abajo. Para confiar en la IP de X-Forwarded-For se requiere PROXMENUX_TRUST_PROXY=1 y un proxy que controles. La presencia de X-Forwarded-Proto o X-Forwarded-Host no activa esa confianza; el frontend construye las URL de la API a partir del origen del navegador." }, "firstLaunch": { "heading": "Flujo de primer arranque", @@ -32,27 +32,27 @@ "rows": [ { "button": "Sí, configurar contraseña", - "what": "Abre un formulario con el usuario + contraseña obligatorios y un nombre visible + imagen de avatar opcionales. Los guarda en auth.json con enabled: true. Devuelve un JWT así que quedas logueado inmediatamente. El formulario se documenta en detalle más abajo.", + "what": "Abre un formulario con nombre de usuario y contraseña obligatorios, más nombre visible e imagen de avatar opcionales. Activa la autenticación en auth.json con enabled: true y devuelve un JWT para iniciar sesión. Los campos opcionales del perfil se guardan mediante llamadas posteriores, como se explica abajo.", "api": "POST /api/auth/setup" }, { "button": "No, continuar sin protección", - "what": "Marca declined: true en auth.json. Todos los endpoints de la API son accesibles públicamente hasta que cambies de idea desde Settings.", + "what": "Marca declined: true en auth.json. Los endpoints de la API permanecen abiertos hasta que actives la protección desde Ajustes.", "api": "POST /api/auth/skip" } ], "twofaCalloutTitle": "El 2FA se configura después, no aquí", - "twofaCalloutBody": "El diálogo de primer arranque solo cubre la decisión de la contraseña. La autenticación de dos factores (TOTP) se configura después desde la pestaña Security una vez logueado con una contraseña. El walkthrough completo de TOTP está más abajo en esta página.", + "twofaCalloutBody": "El diálogo inicial solo decide la protección con contraseña. La autenticación de dos factores (TOTP) se configura después desde la pestaña Seguridad, una vez iniciada la sesión con contraseña. El procedimiento completo de TOTP se explica más abajo.", "createTitle": "Crear el primer usuario", - "createIntro": "Pulsar Sí, configurar contraseña abre un único formulario que crea la cuenta y, opcionalmente, siembra el perfil del usuario de una sola vez para que el avatar aparezca en la cabecera nada más guardar. Los campos son:", + "createIntro": "Al pulsar Sí, configurar contraseña, un formulario crea la cuenta y permite completar el perfil para que el avatar aparezca en la cabecera al guardar. Los campos son:", "headerField": "Campo", "headerRequired": "Requerido", "headerNotes": "Notas", "fieldRows": [ { - "field": "Username", + "field": "Nombre de usuario", "required": "Sí", - "notes": "El identificador de login. No se puede cambiar después desde la UI; editarlo requiere tocar auth.json directamente." + "notes": "Identificador de inicio de sesión. No se puede cambiar desde la interfaz; hay que editar auth.json directamente." }, { "field": "Contraseña", @@ -62,7 +62,7 @@ { "field": "Nombre visible", "required": "No", - "notes": "Etiqueta amistosa que se muestra en el dropdown de la cabecera y en la página de perfil. Cae al username cuando está vacío. Se puede cambiar después desde Avatar → Ver perfil." + "notes": "Nombre que aparece en el menú de la cabecera y en el perfil. Si está vacío se usa el nombre de usuario. Puedes cambiarlo desde Avatar → Ver perfil." }, { "field": "Imagen de avatar", @@ -71,11 +71,11 @@ } ], "createImageAlt": "Formulario de creación de usuario con campos obligatorios Username + Contraseña y la sección opcional Nombre visible + subida de Avatar", - "createImageCaption": "El formulario de creación de usuario del primer arranque. El nombre visible y el avatar son opcionales — dejarlos vacíos crea la cuenta y cae a un círculo con una sola letra en la cabecera.", + "createImageCaption": "Formulario inicial de creación de usuario. El nombre visible y el avatar son opcionales; si los dejas vacíos, la cuenta se crea y la cabecera muestra un círculo con una letra.", "saveCalloutTitle": "Un único guardado, tres llamadas a la API por dentro", "saveCalloutBody": "El formulario envía primero POST /api/auth/setup (username + contraseña). Si tiene éxito usa el JWT recién emitido para hacer a continuación PUT /api/auth/profile (nombre visible) y POST /api/auth/profile/avatar (bytes del avatar) si esos campos se rellenaron. Los fallos en las llamadas de perfil no son fatales — la cuenta ya está creada y puedes terminar el perfil después desde la página dedicada.", "avatarTitle": "Menú del avatar y página de perfil", - "avatarBody1": "Una vez configurada la autenticación, aparece un círculo de avatar en la parte superior derecha de cada página del panel junto al toggle de tema. Pulsarlo abre un pequeño dropdown con accesos directos a la página de perfil y a la pestaña Security, además de una acción Sign out — cerrar la sesión se puede hacer desde aquí o desde la pestaña Security, lo que esté más cerca de donde te encuentres.", + "avatarBody1": "Tras configurar la autenticación, aparece el avatar arriba a la derecha, junto al selector de tema. Su menú contiene accesos al perfil, a Seguridad y la acción Cerrar sesión. También puedes cerrar la sesión desde Seguridad.", "avatarBody2": "La página de perfil en sí es una pequeña tarjeta con una vista previa del avatar, el username (solo lectura) y el nombre visible con un botón de edición en línea. Las subidas, reemplazos y eliminaciones de avatar son atómicas — el avatar de la cabecera se refresca automáticamente cuando cualquiera tiene éxito, así que no hay necesidad de recargar la página. El mismo conjunto de endpoints documentado en la siguiente sección lo usan tanto el formulario de creación de usuario como la página de perfil.", "profileImageAlt": "Página de perfil con círculo de vista previa del avatar, botones Subir / Reemplazar / Eliminar, username de solo lectura y campo de nombre visible editable", "profileImageCaption": "La página de perfil dedicada. El username es solo lectura; el nombre visible y el avatar se pueden editar desde aquí sin tocar la pestaña Security.", @@ -88,7 +88,7 @@ }, { "endpoint": "PUT /api/auth/profile", - "what": "Actualiza el nombre visible. Body: '{' \"display_name\": \"...\" '}'." + "what": "Actualiza el nombre visible. Cuerpo de la petición: '{' \"display_name\": \"...\" '}'." }, { "endpoint": "GET /api/auth/profile/avatar", @@ -100,15 +100,15 @@ }, { "endpoint": "DELETE /api/auth/profile/avatar", - "what": "Elimina el avatar. La cabecera cae al placeholder de inicial-sobre-círculo-coloreado." + "what": "Elimina el avatar. La cabecera vuelve a mostrar una inicial en un círculo de color." } ], - "reversibleTitle": "Continuar sin protección es reversible — pero solo desde el host", - "reversibleBody": "Una vez que pulsas No, continuar sin protección, el diálogo de bienvenida ya no vuelve a aparecer. Puedes reactivar la autenticación desde la pestaña Security dentro del panel, o editando /root/.config/proxmenux-monitor/auth.json y quitando el flag declined, luego reiniciando el servicio." + "reversibleTitle": "Puedes activar la protección más adelante", + "reversibleBody": "Tras pulsar No, continuar sin protección, el diálogo inicial no vuelve a aparecer. Puedes activar la autenticación desde la pestaña Seguridad o editar /root/.config/proxmenux-monitor/auth.json, quitar el indicador declined y reiniciar el servicio." }, "password": { "heading": "Autenticación con contraseña", - "intro": "Tras Setup, cada llamada a la API (excepto los pocos endpoints públicos listados abajo) requiere un JWT en Authorization: Bearer <token>:", + "intro": "Tras configurar la protección, las llamadas protegidas requieren un JWT en Authorization: Bearer <token>:", "items": [ "Token de sesión (login): expiración de 24 horas. Emitido por POST /api/auth/login.", "API token (integraciones): expiración de 365 días. Emitido por POST /api/auth/generate-api-token. Documentado por separado en la siguiente sección." @@ -117,17 +117,17 @@ "loginImageCaption": "Una vez configurada la autenticación, cada visita al panel empieza aquí. Con 2FA activado, la pantalla pide el código de 6 dígitos en un segundo paso tras aceptar la contraseña.", "loginFlowTitle": "Flujo de login", "twofaIntro": "Con 2FA activado, la misma llamada devuelve primero requires_totp: true. Reemite con el código de 6 dígitos:", - "publicTitle": "Endpoints públicos (sin token)", - "publicIntro": "Estos son los únicos endpoints que funcionan sin autenticación, incluso cuando auth está activado:", + "publicTitle": "Acceso público y sondas protegidas", + "publicIntro": "El inicio de sesión y su estado son públicos. Puedes crear la cuenta mientras no haya usuario y contraseña guardados, incluso tras rechazar la protección. Las sondas de datos del sistema requieren autenticación cuando la protección está activa:", "publicItems": [ - "/api/auth/login, /api/auth/status, /api/auth/setup — el propio flujo de auth, por necesidad.", - "/api/system-info — snapshot ligero del sistema (hostname, uptime, health.status). El endpoint adecuado para probes externos (Uptime Kuma, health checks de balanceador, páginas de estado)." + "/api/auth/login y /api/auth/status son públicos. /api/auth/setup crea la cuenta inicial y rechaza sobrescribir credenciales existentes.", + "/api/system-info es un endpoint público de información básica del sistema, incluido health.status. No lleva el requisito de token. /api/auth/status también es público y sirve para comprobar disponibilidad." ], "cryptoTitle": "Criptografía y almacenamiento", "cryptoIntro": "ProxMenux Monitor es código abierto — nada de esto es secreto. Documentar el stack aquí de forma explícita es una decisión deliberada: los operadores que guardan credenciales en su host merecen saber cómo se protegen esas credenciales antes de decidir confiar en ellas. Los algoritmos de abajo son los mismos que usa el código en scripts/auth_manager.py; esta sección es un contrato, no una promesa de marketing.", - "headerAsset": "Activo", + "headerAsset": "Elemento", "headerAlgo": "Algoritmo", - "headerWhere": "Dónde vive", + "headerWhere": "Ubicación", "cryptoRows": [ { "asset": "Contraseña", @@ -146,7 +146,7 @@ }, { "asset": "Secret TOTP de 2FA", - "algorithm": "TOTP estándar (RFC 6238) codificado en base32. Los códigos de backup se pregeneran, son de un solo uso, hasheados con el mismo esquema PBKDF2 que la contraseña.", + "algorithm": "TOTP estándar (RFC 6238), con secreto codificado en base32. Los ocho códigos de recuperación son de un solo uso y se almacenan como hashes SHA-256.", "where": "auth.json → totp_secret + backup_codes[]" }, { @@ -170,8 +170,8 @@ "heading": "Autenticación de dos factores (TOTP)", "intro": "El 2FA añade un segundo factor encima de tu contraseña: un código de 6 dígitos que rota cada 30 segundos, generado en un móvil o gestor de contraseñas que controlas. Aunque alguien obtenga la contraseña, sigue sin poder entrar sin el código de tu dispositivo. ProxMenux Monitor implementa el protocolo estándar TOTP (RFC 6238), así que cualquier app autenticadora funciona.", "pickTitle": "Elige una app autenticadora", - "pickIntro": "Si ya usas una para Google / GitHub / tu banco, esa funcionará — salta al walkthrough de setup. Si no, aquí tienes un repaso de opciones habituales. Todas son gratis; las diferencias son sobre todo en qué plataformas corren y cómo (o si) hacen backup de tus secrets.", - "headerApp": "App", + "pickIntro": "Si ya tienes una aplicación TOTP, puedes usarla aquí. La tabla recoge opciones habituales: algunas son gratuitas y otras requieren suscripción. También cambian las plataformas y los métodos de copia de seguridad.", + "headerApp": "Aplicación", "headerPlatforms": "Plataformas", "headerAppNotes": "Notas", "apps": [ @@ -190,8 +190,8 @@ { "name": "Authy", "href": "https://authy.com/", - "platforms": "iOS, Android, escritorio", - "notes": "Sync cifrado multi-dispositivo (la app de escritorio se está retirando — comprueba el estado más reciente)." + "platforms": "iOS, Android", + "notes": "Sincronización cifrada entre dispositivos. La aplicación de escritorio dejó de recibir soporte el 19 de marzo de 2024." }, { "name": "Apple Passwords", @@ -203,7 +203,7 @@ "name": "Bitwarden", "href": "https://bitwarden.com/", "platforms": "iOS, Android, escritorio, navegador", - "notes": "Código abierto. El TOTP vive junto a la contraseña que protege (cómodo si también usas BW para contraseñas; rompe el \"dispositivo separado\" si no)." + "notes": "Código abierto. Permite guardar TOTP junto a las contraseñas en la bóveda. Resulta cómodo, pero guardar ambos en ella no los separa en un segundo dispositivo." }, { "name": "1Password", @@ -238,40 +238,40 @@ { "name": "FreeOTP+", "href": "https://github.com/helloworld1/FreeOTPPlus", - "platforms": "Android, iOS", - "notes": "Código abierto (impulsado por Red Hat). Mínimo — sin nube, sin cuenta." + "platforms": "Android", + "notes": "Bifurcación de código abierto de FreeOTP para Android, con importación y exportación. No requiere cuenta." } ], "backupTitle": "Para qué importa realmente el \"backup\"", - "backupBody": "Si pierdes el dispositivo que tiene el autenticador, las únicas formas de volver a entrar son (1) un código de backup guardado cuando activaste el 2FA, o (2) un backup de la bóveda del autenticador. Las apps con sync en la nube (Google Auth, Microsoft Auth, Authy, Apple Passwords, Ente, 2FAS, Bitwarden, 1Password) pueden restaurar en un dispositivo nuevo. Las apps sin nube (Aegis, Raivo, FreeOTP+) necesitan un archivo de exportación cifrado que hayas copiado a un sitio seguro. Cualquier enfoque funciona — el caso malo es \"sin backup en absoluto\".", + "backupBody": "Si pierdes el dispositivo autenticador, usa un código de recuperación guardado o restaura una copia que hubieras configurado previamente. La sincronización en la nube y las exportaciones varían según la aplicación; comprueba que restauren los secretos TOTP. El acceso root al host también permite recuperar el acceso, como se explica abajo. Conserva una copia separada y segura.", "setupTitle": "Configuración paso a paso desde el panel", "setupImageAlt": "Pantalla de configuración de 2FA con código QR y códigos de backup", - "setupImageCaption": "El diálogo de configuración de 2FA — código QR, secret en Base32 (para entrada manual) y los diez códigos de backup de un solo uso. Los códigos solo se muestran aquí; si cierras el diálogo sin copiarlos, se pierden.", + "setupImageCaption": "El diálogo de 2FA muestra un código QR, el secreto Base32 para introducirlo manualmente y ocho códigos de recuperación de un solo uso. Cópialos antes de cerrar; no volverán a mostrarse.", "setupSteps": [ "Instala la app autenticadora en tu móvil (o abre tu gestor de contraseñas). Una de las apps de la tabla de arriba. Solo necesitas hacerlo una vez — la misma app guardará códigos para cada servicio que protejas.", "Loguéate en el panel con tu usuario y contraseña.", - "Abre la pestaña Security en la barra lateral del panel, luego pulsa Enable 2FA. Se abre un diálogo con un código QR, una cadena larga en formato Base32 y diez códigos cortos etiquetados como \"códigos de backup\".", + "Abre la pestaña Seguridad en la barra lateral y pulsa Activar 2FA. El diálogo muestra un QR, el secreto Base32 y ocho códigos de recuperación.", "Añade la entrada a la app autenticadora:", - "Guarda los códigos de backup. Copia los diez códigos a un sitio seguro — un gestor de contraseñas, una nota cifrada, una copia impresa en un cajón. Trátalos como llaves de repuesto: cada uno funciona exactamente una vez y te deja entrar si tu móvil se pierde o rompe.", + "Guarda los códigos de recuperación. Conserva los ocho en un gestor de contraseñas, nota cifrada o copia impresa segura. Cada uno funciona una vez si no tienes el autenticador.", "Confirma escribiendo el código actual de 6 dígitos de la app en el campo \"Código de verificación\" del diálogo de setup y envía. Los códigos se refrescan cada 30 segundos, así que si caduca mientras escribes, simplemente introduce el siguiente.", "Hecho. El 2FA está ahora activo. La próxima vez que te logues, el panel pide primero la contraseña; una vez aceptada pide el código actual de 6 dígitos." ], "setupStep4Sub": [ - "Camino fácil: en la app, pulsa Añadir cuenta → Escanear código QR, apunta la cámara al QR en la pantalla. La app nombra la entrada automáticamente (algo como ProxMenux Monitor (tu-usuario)) y empieza a mostrar un código de 6 dígitos que se refresca cada 30 segundos.", + "Camino fácil: en la app, pulsa Añadir cuenta → Escanear código QR, apunta la cámara al QR en la pantalla. La app nombra la entrada automáticamente (algo como ProxMenux Monitor (your-username)) y empieza a mostrar un código de 6 dígitos que se refresca cada 30 segundos.", "Plan B manual (cuando escanear no es posible — p. ej. configurando en el mismo móvil con el que abriste el panel): pulsa Añadir cuenta → Introducir clave de setup. Escribe cualquier nombre (p. ej. Proxmox Monitor), pega la cadena Base32 del diálogo, deja Tipo como Basado en tiempo, guarda." ], - "testTitle": "Prueba antes de hacer logout", - "testBody": "Una vez que pulses Guardar, haz logout y vuelve a entrar inmediatamente, mientras el diálogo de setup esté todavía fresco en tu memoria. Si el código se rechaza (la causa más común es el desfase de reloj entre servidor y móvil), aún puedes arreglarlo desde la sesión abierta. Hacer logout sin probar primero significa un viaje de ida sin retorno — en ese punto solo un código de backup o editar auth.json en el host te deja volver a entrar.", + "testTitle": "Prueba antes de cerrar sesión", + "testBody": "Mantén la sesión actual abierta y prueba un nuevo acceso en una ventana privada inmediatamente después de configurar 2FA. Si el código falla, comprueba los relojes del servidor y del móvil antes de cerrar la sesión válida. Si ya perdiste el acceso, usa un código de recuperación o edita auth.json desde la consola del host.", "lostTitle": "Autenticador perdido", "lostIntro": "Tres salidas de emergencia, en orden de cuán disruptivas son:", "lostItems": [ - "Usa un código de backup. En la pantalla de login, en el campo TOTP, escribe uno de los diez códigos que guardaste durante el setup. Cada uno funciona una vez y luego se consume; los códigos restantes siguen funcionando. Una vez dentro, regenera el 2FA desde Settings para conseguir diez nuevos.", + "Usa un código de recuperación. Introduce uno de los ocho códigos guardados en el campo TOTP. Funciona una vez; los no usados siguen siendo válidos. Tras entrar, configura 2FA de nuevo desde Ajustes para obtener ocho códigos nuevos.", "Restaura el autenticador desde la nube / backup. Si tu app tiene sync en la nube (Google, Microsoft, Authy, Apple Passwords vía iCloud Keychain, Ente, 2FAS) instálala en un dispositivo nuevo, loguéate y las entradas reaparecen. Si tu app usa un archivo de exportación cifrado (Aegis, Raivo, FreeOTP+), instala la app en el dispositivo nuevo e importa el archivo.", "Desactiva el 2FA desde la shell del host. Cuando las opciones anteriores no están disponibles, edita /root/.config/proxmenux-monitor/auth.json en el host Proxmox (necesitas SSH root o acceso por consola), pon totp_enabled a false, guarda y reinicia el servicio:" ], "lostShellOutro": "Puedes loguearte con usuario + contraseña solo, luego reactivar el 2FA desde Settings.", "disableTitle": "Desactivar el 2FA", - "disableBody": "Desde el panel, abre la pestaña Security y pulsa Disable 2FA. El endpoint POST /api/auth/totp/disable requiere la contraseña actual como confirmación, luego elimina el secret TOTP y limpia los códigos de backup. Recuerda también quitar la entrada en la app autenticadora — la app no sabe que el lado del servidor ha desaparecido, así que la entrada muerta se quedaría ahí para siempre si no.", + "disableBody": "Abre Seguridad y elige Desactivar 2FA. POST /api/auth/totp/disable exige la contraseña actual y un código TOTP o de recuperación válido. Elimina el secreto TOTP y los códigos de recuperación. Borra también la entrada antigua en la aplicación autenticadora.", "rejectedTitle": "El código de 6 dígitos se rechaza siempre", "rejectedIntro": "El TOTP está basado en tiempo — el reloj del servidor y el del móvil deben coincidir dentro de unos ~30 s. Dos comprobaciones:", "rejectedItems": [ @@ -288,57 +288,57 @@ "generateTitle": "Generar un token", "generateIntro": "Desde el panel:", "generateSteps": [ - "Navega a la sección pestaña Security → API Access Tokens.", + "Abre Seguridad → Tokens de acceso API.", "Escribe un nombre descriptivo (p. ej. \"Home Assistant\").", "Vuelve a introducir tu contraseña. Si el 2FA está activado, también el código actual de 6 dígitos.", - "Pulsa Generate Token. El token aparece una vez — cópialo inmediatamente." + "Pulsa Generar token. Se muestra una sola vez: cópialo al momento." ], "generateCli": "Desde la línea de comandos:", "useTitle": "Usar un token", "revokeTitle": "Revocar un token", - "revokeBody": "Desde el panel de arriba: cada fila tiene una acción Revoke que añade el hash del token a revoked_tokens en auth.json. Los tokens revocados fallan la validación inmediatamente en la siguiente petición.", + "revokeBody": "Cada fila ofrece Revocar, que añade el hash del token a revoked_tokens en auth.json. El token revocado falla la validación en la siguiente petición.", "cheatTitle": "Chuleta de seguridad de tokens", "cheatItems": [ "Guarda los tokens en el almacén de secrets nativo de tu integración — Homepage secrets.yaml, Home Assistant !secret, variables de entorno, etc. Nunca los subas a git.", "Un token por integración, nombrado por el consumidor. Revoca individualmente al retirar una integración.", "Rota cada 6-12 meses. La expiración es un límite duro, no una recomendación." ], - "outro": "Las mejores prácticas completas de almacenamiento y recetas de integración viven en API Reference → Token Management e Integrations." + "outro": "Consulta las recomendaciones de almacenamiento y los ejemplos en Referencia de la API → Gestión de tokens e Integraciones." }, "https": { "heading": "HTTPS", "intro": "Dos rutas hacia TLS:", "items": [ "Reverse proxy (recomendado). Termina TLS en Nginx / Caddy / Traefik y reenvía HTTP en el puerto 8008 al proceso Flask. Snippets más abajo.", - "HTTPS directo en el AppImage. Configura un certificado vía POST /api/ssl/configure (UI: Settings → SSL). Cuando SSL está configurado el proceso cambia del servidor dev de Flask a gevent.pywsgi con el handler gevent-websocket para que el terminal WebSocket también funcione sobre WSS. Los archivos del cert viven donde tú los pongas; las rutas se guardan en la configuración SSL." + "HTTPS directo en AppImage. Configura un certificado con POST /api/ssl/configure (interfaz: Ajustes → SSL). HTTPS usa gevent.pywsgi con su manejador estándar; flask-sock gestiona la conexión WebSocket para WSS. Las rutas de los certificados se guardan en la configuración SSL." ], "calloutTitle": "Limitaciones del HTTPS directo", - "calloutBody": "La ruta gevent empaquetada es adecuada para certificados autofirmados o solo-LAN. Para Let's Encrypt / ACME y renovación automática, pon un reverse proxy real delante — Caddy autorrenueva y Traefik / Nginx tienen patrones bien conocidos. El Monitor no implementa ACME por sí mismo." + "calloutBody": "Monitor puede usar un certificado gestionado por Proxmox o archivos de certificados propios. No emite certificados ACME. Para emitirlos y renovarlos automáticamente, usa ACME de Proxmox o un proxy inverso como Caddy, Traefik o Nginx y asegúrate de cargar los certificados renovados." }, "gateway": { - "heading": "Secure Gateway (Tailscale)", - "intro": "Los reverse proxies son la respuesta clásica a \"llegar al panel desde fuera\" pero requieren un dominio público, certificado y un puerto abierto en el borde. Secure Gateway es la alternativa cero-puertos que viene dentro del propio Monitor — una app desplegable preconstruida que levanta un LXC Alpine ejecutando Tailscale como subnet router. Una vez unido a tu tailnet, cada dispositivo en él puede llegar al Monitor en la propia IP LAN del host — desde un portátil de vacaciones, un móvil con 5G u otro nodo — sin exponer TCP 8008 a internet.", + "heading": "Pasarela segura (Tailscale)", + "intro": "Un proxy inverso es una opción de acceso remoto. Secure Gateway permite acceder sin exponer TCP 8008: despliega un LXC Alpine con Tailscale como router de subred. El acceso a la IP LAN del host depende de las rutas aprobadas y de las reglas de acceso de la tailnet.", "calloutTitle": "Por qué esto es cómodo", - "calloutBody": "La URL se mantiene igual que en la LAN — http://<ip-lan-proxmox>:8008 funciona donde Tailscale funcione. Sin certificados, sin DNS, sin port forwarding. El propio Monitor ve la petición viniendo de una IP de tailnet (típicamente 100.x.y.z), así que el log de auth y el hook de Fail2Ban siguen funcionando como en la LAN.", + "calloutBody": "Usa la URL LAN http://<proxmox-lan-ip>:8008 mediante la ruta de subred aprobada. Tailscale usa SNAT por defecto, por lo que Monitor suele ver la IP LAN de la pasarela, no la dirección 100.x.y.z del cliente. Los registros y Fail2Ban identifican la dirección de origen que recibe el host.", "deployBody": "El flujo de despliegue es una sola pantalla — elige el storage LXC del host, pega un auth-key de Tailscale (generado en login.tailscale.com/admin/settings/keys), elige qué subnets anunciar, pulsa Deploy. El LXC tarda ~30 segundos en arrancar y se registra en el tailnet automáticamente.", "outro": "El despliegue paso a paso, la configuración de subnet-routes, las ACLs de Tailscale y el modo Exit Node se documentan por separado en Dashboard → Security → Secure Gateway — ahí vive el wizard de despliegue en la UI del panel. Esta página solo cubre el patrón de acceso." }, "proxy": { "heading": "Snippets de reverse proxy", - "intro": "La distribución más simple es un nombre de host dedicado para el Monitor (p. ej. monitor.example.com) apuntando al puerto 8008 del host Proxmox. Los snippets de abajo usan ese patrón. Los montajes en sub-path (example.com/proxmenux-monitor/) son posibles pero requieren reescritura extra y no son el valor por defecto — mira el callout al final.", + "intro": "Usa un nombre de host dedicado, como monitor.example.com, que reenvíe al puerto 8008 del host Proxmox. Los ejemplos siguen ese patrón. Una subruta como example.com/proxmenux-monitor/ requiere cambios adicionales en frontend y proxy; quitar el prefijo no basta.", "nginxTitle": "Nginx", "caddyTitle": "Caddy", - "traefikTitle": "Traefik (labels — Docker / Kubernetes)", + "traefikTitle": "Traefik (etiquetas: Docker / Kubernetes)", "subPathTitle": "Avanzado: montajes en sub-path bajo un dominio existente", - "subPathBody": "Si no quieres un nombre de host dedicado, puedes montar el Monitor bajo un path de un dominio existente — por ejemplo example.com/proxmenux-monitor/. El build de Next.js usa rutas relativas para los assets así que los archivos estáticos resuelven, pero el proxy debe quitar el prefijo antes de reenviar para que el Monitor reciba URLs /api/* sin más. En Nginx eso es un location /proxmenux-monitor/ } proxy_pass http://127.0.0.1:8008/; { (la barra final en proxy_pass hace el strip). En Caddy, usa handle_path /proxmenux-monitor/*. Un nombre de host dedicado es más simple." + "subPathBody": "El frontend actual no tiene una base de subruta configurada y crea llamadas desde la raíz mediante URL /api/*. Quitar un prefijo como example.com/proxmenux-monitor/ no resuelve esas llamadas ni todos los recursos de la interfaz. Usa un nombre de host dedicado. Una subruta exige cambios coordinados en frontend y proxy y pruebas específicas." }, "audit": { "heading": "Log de auditoría", - "intro": "Cada evento de autenticación (éxito y fallo) se añade a /var/log/proxmenux-auth.log en formato de una sola línea, estilo syslog:", + "intro": "Los fallos de inicio de sesión y los avisos del límite de intentos se escriben en /var/log/proxmenux-auth.log, con una línea por evento. Este logger no registra los accesos correctos:", "outro": "Sigue la cola con el método habitual: tail -F /var/log/proxmenux-auth.log. El archivo se rota con logrotate si se añade un drop-in de configuración; el Monitor no lo rota por sí mismo." }, "fail2ban": { - "heading": "Opcional: jail Fail2Ban", + "heading": "Opcional: jail de Fail2Ban", "calloutTitle": "Fail2Ban no viene incluido con el Monitor", "calloutBody": "Fail2Ban no lo instala ProxMenux Monitor por sí mismo. Instálalo vía Seguridad → Fail2Ban en el menú de ProxMenux (o con el paquete estándar de Debian). Sin él, el Monitor sigue escribiendo el log de auditoría de arriba — simplemente no banea automáticamente a los repetidores.", "intro": "Cuando Fail2Ban está instalado, la integración de ProxMenux trae un jail [proxmenux] que:", @@ -346,7 +346,7 @@ "Lee /var/log/proxmenux-auth.log.", "Hace match con el patrón authentication failure; rhost=<ip> con un filtro dedicado.", "Banea la IP infractora a nivel del firewall del kernel por defecto.", - "Se consulta desde el hook before_request de Flask cada 30 s — así que incluso cuando el firewall no puede bloquear (porque la conexión viene del reverse proxy), la aplicación devuelve HTTP 403 a las IPs baneadas según lo que Fail2Ban sabe." + "El hook before_request de Flask contrasta las peticiones con la lista de bloqueos, almacenada en caché durante 30 s. Tras un proxy inverso, el bloqueo por IP requiere también PROXMENUX_TRUST_PROXY=1 y un proxy controlado que establezca cabeceras fiables." ], "outro": "La configuración, el ajuste del tiempo de ban y los procedimientos de desbaneo están en Seguridad → Fail2Ban." }, @@ -367,17 +367,17 @@ "heading": "Por dónde seguir", "items": [ { - "label": "API Reference → Token Management", + "label": "Referencia de la API → Gestión de tokens", "href": "/docs/monitor/api", "tail": " — ciclo de vida completo de API tokens (generar / listar / revocar), mejores prácticas de seguridad, patrones de almacenamiento de secrets." }, { - "label": "Integrations", + "label": "Integraciones", "href": "/docs/monitor/integrations", "tail": " — Homepage, Home Assistant, Grafana / Prometheus, Uptime Kuma, cURL genérico." }, { - "label": "Dashboard → Security → Secure Gateway", + "label": "Dashboard → Seguridad → Secure Gateway", "href": "/docs/monitor/dashboard/security", "tail": " — despliega el LXC gateway Tailscale paso a paso (subnet routes, ACLs, modo Exit Node)." }, @@ -387,7 +387,7 @@ "tail": " — cómo instalar y configurar el jail opcional." }, { - "label": "Settings → ProxMenux Monitor", + "label": "Ajustes → ProxMenux Monitor", "href": "/docs/settings/proxmenux-monitor", "tail": " — arranca / para el servicio systemd desde la TUI de ProxMenux." } diff --git a/web/messages/es/docs/monitor/ai-assistant.json b/web/messages/es/docs/monitor/ai-assistant.json index 83da780d..05492b10 100644 --- a/web/messages/es/docs/monitor/ai-assistant.json +++ b/web/messages/es/docs/monitor/ai-assistant.json @@ -1,7 +1,7 @@ { "meta": { "title": "Asistente de IA de Proxmox — OpenAI, Claude, Gemini, Groq, Ollama | ProxMenux Monitor", - "description": "El Asistente de IA opcional de ProxMenux Monitor reescribe los cuerpos de las notificaciones de Proxmox VE en lenguaje natural. Seis proveedores soportados: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter y Ollama local. Doce idiomas, tres niveles de detalle por canal, modo de prompt personalizado con una biblioteca comunitaria y una capa de enriquecimiento de contexto que añade uptime, recurrencia y datos SMART a los eventos de disco.", + "description": "El asistente de IA opcional reescribe las notificaciones de Proxmox VE en lenguaje claro. Seis proveedores: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter y Ollama. La interfaz ofrece trece idiomas, tres niveles de detalle por canal, prompts personalizados con una biblioteca comunitaria y contexto del evento con tiempo de actividad, recurrencia y datos SMART.", "ogTitle": "Asistente de IA de Proxmox — OpenAI, Claude, Gemini, Groq, Ollama", "ogDescription": "Reescribe las notificaciones de Proxmox VE en lenguaje natural con OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter u Ollama local.", "twitterTitle": "Asistente de IA de Proxmox | ProxMenux Monitor", @@ -9,16 +9,16 @@ }, "header": { "title": "Asistente de IA", - "description": "El reescritor opt-in que pasa cada notificación saliente por un LLM antes del fan-out — convirtiendo templates estructuradas en mensajes en lenguaje natural, con niveles de detalle por canal, doce idiomas, un modo de prompt personalizado con una biblioteca comunitaria pública y una capa de enriquecimiento de contexto que añade uptime, recurrencia, datos SMART y coincidencias con errores conocidos al prompt.", - "section": "ProxMenux Monitor" + "description": "La reescritura opcional con IA convierte las plantillas de notificación admitidas en mensajes claros, con detalle por canal, trece idiomas en la interfaz, prompts personalizados, una biblioteca comunitaria pública y contexto adicional. Los informes backup_complete y backup_fail omiten la IA por completo.", + "section": "Monitor de ProxMenux" }, "intro": { "title": "Desactivado por defecto, un solo interruptor para activarlo", - "body": "La reescritura con IA es opt-in. Hasta que pulses el toggle maestro dentro de Settings → Notifications → Advanced: AI Enhancement, cada evento se despacha con el cuerpo templated original. Cuando el toggle está activado y una llamada al proveedor falla o caduca, el dispatcher cae silenciosamente al cuerpo templated — tus notificaciones nunca se bloquean por el LLM." + "body": "La reescritura con IA viene desactivada. Actívala en Ajustes → Notificaciones → Avanzado: mejora con IA. Si falla el enriquecimiento o la reescritura, se envía la plantilla original. Cada reescritura tiene un tiempo límite de 25 segundos; al alcanzarlo se usa la plantilla en lugar de esperar indefinidamente." }, "howItWorks": { "heading": "Cómo funciona", - "intro": "Cada evento que despacha el Monitor pasa por la misma pipeline. El reescritor de IA es una etapa opcional que se sitúa entre el cuerpo templated y el envío del canal. De principio a fin, un solo evento camina por cuatro pasos:", + "intro": "Los eventos enviados por Monitor siguen el mismo proceso. La reescritura con IA es una etapa opcional entre el texto generado por la plantilla y el envío al canal. Un evento pasa por cuatro pasos:", "steps": [ "Evento + template. Un evento llega desde uno de los seis colectores y se renderiza en un cuerpo estructurado de texto plano por notification_templates.py. Este es el cuerpo que el canal enviaría si la reescritura con IA estuviese desactivada.", "Enriquecimiento de contexto. El dispatcher inspecciona el evento y añade condicionalmente las señales extra relevantes — uptime del sistema (solo para fallos críticos del sistema), frecuencia del evento, datos SMART (solo para eventos de disco), coincidencias con la base de datos de errores conocidos y líneas de log del journal.", @@ -83,7 +83,7 @@ "intro1": "Cada proveedor comercial cobra por token, así que merece la pena entender qué es un token antes de elegir un plan. Un token son aproximadamente cuatro caracteres de texto en inglés o unas tres cuartas partes de una palabra. La frase \"Backup completed on storage local-bak\" son unos ocho tokens. Un extracto corto de journal de diez líneas puede ser 200-400 tokens según la densidad técnica.", "intro2": "Se facturan dos cosas en cada llamada:", "items": [ - "Tokens de entrada — el system prompt más el user message (severidad, título, cuerpo, contexto enriquecido). Para ProxMenux el system prompt solo es del orden de 1.5-2 KB (≈ 400-500 tokens) y el user message varía de 50 tokens (un backup-complete limpio) a ~1500 tokens (un error de disco con 30 líneas de contexto del journal).", + "Tokens de entrada: incluyen las instrucciones del sistema y el mensaje de usuario: severidad, título, texto de la plantilla y contexto adicional. La cantidad depende del prompt y del evento. Cada canal reescrito puede consumir sus propios tokens de entrada; los informes de copia completada y fallida omiten la IA.", "Tokens de salida — lo que el modelo escribe de vuelta. El Monitor lo limita con max_tokens (mira la tabla de abajo). El límite es un tope, no un cargo: si el modelo produce 250 tokens con un tope de 1500, pagas 250." ], "capsIntro": "Estos son los topes reales que aplica el dispatcher, tomados directamente de AI_DETAIL_TOKENS en notification_templates.py:", @@ -92,24 +92,24 @@ "headerConsumption": "Consumo real típico", "capRows": [ { - "level": "brief", + "level": "breve", "cap": "500", "consumption": "50-200 tokens de salida para eventos cortos." }, { - "level": "standard", + "level": "estándar", "cap": "1500", "consumption": "200-700 tokens de salida para eventos típicos con contexto ligero." }, { - "level": "detailed", + "level": "detallado", "cap": "3000", "consumption": "500-2000 tokens de salida para reportes completos de email con logs y tablas SMART." } ], "customNote": "El modo de prompt personalizado usa un tope fijo de 500 tokens de salida independientemente del nivel de detalle — el prompt personalizado está bajo tu control y el tope protege contra respuestas descontroladas.", "sizingTitle": "Dimensionamiento práctico", - "sizingBody": "Un homelab con 50-100 eventos al día en standard consume típicamente unos pocos miles de tokens al día. Con los niveles gratuitos que ofrecen Groq y Gemini, eso encaja sin tocar un plan de pago. Con OpenAI o Anthropic, facturados por token, el coste se queda en el rango de céntimos al mes para ese volumen. Si tu volumen de eventos es mucho mayor, la sección Nivel de detalle por canal explica cómo mantener los canales de chat en brief dejando que Email lleve el reporte completo." + "sizingBody": "Estima el consumo como eventos reescritos × canales con IA × tokens de entrada y salida por llamada. Por ejemplo: 50 eventos × un canal × (500 de entrada + 300 de salida) son 40.000 tokens al día. El consumo y coste reales dependen del modelo, contexto, caché y límites del proveedor. Nivel de detalle por canal explica cómo usar brief para chat en lugar de standard, manteniendo informes detallados por correo." }, "providers": { "heading": "Proveedores de IA", @@ -120,18 +120,18 @@ "heading": "Groq", "tagline": "Muy rápido, nivel gratuito generoso (30 req/min). Ideal para empezar.", "items": [ - "API key: console.groq.com/keys", - "Modelos verificados: llama-3.3-70b-versatile, llama-3.1-70b-versatile, llama-3.1-8b-instant, llama3-70b-8192, llama3-8b-8192, mixtral-8x7b-32768, gemma2-9b-it.", - "Recomendado: llama-3.3-70b-versatile — mejor calidad a la velocidad de inferencia completa de Groq." + "Clave API: console.groq.com/keys", + "Ejemplos de la lista de modelos incluida: allam-2-7b, qwen/qwen3.8-27b, openai/gpt-oss-20b, groq/compound-mini.", + "Recomendación incluida: openai/gpt-oss-20b. Comprueba su disponibilidad para tu cuenta con el selector del proveedor y la prueba de conexión." ] }, "openai": { "heading": "OpenAI", "tagline": "Estándar de la industria. Muy preciso y ampliamente usado.", "items": [ - "API key: platform.openai.com/api-keys", - "Modelos verificados: gpt-4.1-nano, gpt-4.1-mini, gpt-4o-mini, gpt-4.1, gpt-4o, gpt-5-chat-latest, gpt-5.4-nano, gpt-5.4-mini.", - "Recomendado: gpt-4.1-nano — el miembro más barato de la familia chat, calidad suficiente para traducción y reformateo. Los modelos de razonamiento (serie o, gpt-5 non-chat) están soportados por el plumbing del proveedor pero se mantienen fuera de la lista verificada: mayor latencia sin ganancia medible de calidad en esta carga de trabajo." + "Clave API: platform.openai.com/api-keys", + "Ejemplos de la lista de modelos incluida: gpt-4.1-nano, gpt-4.1-mini, gpt-4o-mini, gpt-4.1, gpt-4o, gpt-5-nano.", + "Recomendación incluida: gpt-4.1-nano. El adaptador también gestiona requisitos específicos de los modelos de razonamiento; la lista incluye gpt-5-nano, por lo que no se excluyen todos esos modelos." ], "baseUrlTitle": "Base URL compatible con OpenAI", "baseUrlBody": "El proveedor OpenAI también acepta una Base URL personalizada, que te permite apuntar el Monitor a cualquier endpoint compatible con OpenAI. Confirmado que funciona con BytePlus / ByteDance (Kimi K2.5), LocalAI, LM Studio, vLLM, Together AI, Fireworks AI y cualquier otro servicio que hable el dialecto OpenAI /v1/chat/completions. Configura la URL en la pestaña OpenAI junto al campo de API key." @@ -140,17 +140,17 @@ "heading": "Anthropic (Claude)", "tagline": "Excelente para escritura y traducción. Rápido y económico.", "items": [ - "API key: console.anthropic.com/settings/keys", - "Modelos verificados: claude-3-5-haiku-latest, claude-3-5-sonnet-latest, claude-3-opus-latest.", - "Recomendado: claude-3-5-haiku-latest — el modelo más pequeño y rápido de Claude, con calidad lingüística fuerte para la carga de traducción." + "Clave API: console.anthropic.com/settings/keys", + "Ejemplos de la lista de modelos incluida: claude-haiku-4-5-20251001, claude-sonnet-4-6, claude-opus-4-6.", + "Recomendación incluida: claude-haiku-4-5-20251001. Esta versión exacta figura como recomendada; los modelos Claude 3.5 de la documentación anterior ya no están en la lista incluida." ] }, "gemini": { "heading": "Google Gemini", "tagline": "Nivel gratuito disponible, gran ratio calidad/precio.", "items": [ - "API key: aistudio.google.com/app/apikey", - "Modelos verificados: gemini-2.5-flash-lite, gemini-2.5-flash, gemini-3-flash-preview.", + "Clave API: aistudio.google.com/app/apikey", + "Ejemplos de la lista de modelos incluida: gemini-2.5-flash-lite, gemini-2.5-flash, gemini-3-flash-preview.", "Recomendado: gemini-2.5-flash-lite — flash y flash-lite pasan el verificador consistentemente. Las variantes pro rechazan el ajuste thinkingBudget=0 que usa el Monitor y son excesivas para esta carga." ] }, @@ -158,14 +158,14 @@ "heading": "OpenRouter", "tagline": "Agregador con acceso a más de 100 modelos usando una única API key. Máxima flexibilidad.", "items": [ - "API key: openrouter.ai/keys", - "Modelos verificados: meta-llama/llama-3.3-70b-instruct, meta-llama/llama-3.1-70b-instruct, meta-llama/llama-3.1-8b-instruct, anthropic/claude-3.5-haiku, anthropic/claude-3.5-sonnet, google/gemini-flash-1.5, openai/gpt-4o-mini, mistralai/mistral-7b-instruct, mistralai/mixtral-8x7b-instruct.", + "Clave API: openrouter.ai/keys", + "Ejemplos de la lista de modelos incluida: meta-llama/llama-3.3-70b-instruct, meta-llama/llama-3.1-70b-instruct, meta-llama/llama-3.1-8b-instruct, anthropic/claude-haiku-4.5, google/gemini-2.5-flash-lite, openai/gpt-4o-mini, mistralai/mistral-medium-3.", "Recomendado: meta-llama/llama-3.3-70b-instruct — mismo modelo que la entrada de Groq pero enrutado por OpenRouter, lo que significa una sola key para todos los modelos listados." ] }, "ollama": { - "heading": "Ollama (Local)", - "tagline": "Usa los modelos disponibles en tu servidor Ollama. 100% local, sin costes, privacidad total.", + "heading": "Ollama (local)", + "tagline": "Usa los modelos expuestos por el servidor Ollama configurado. Los modelos locales se ejecutan allí; los modelos cloud de Ollama envían las peticiones a un proveedor externo. La ejecución local evita cargos de API alojada, pero utiliza tu hardware y electricidad.", "items": [ "Sin API key. Configura el campo Ollama URL a tu servidor (por defecto http://localhost:11434 o el host que ejecute tu instancia de Ollama).", "Modelos: no filtrados. El Monitor lee los modelos que hayas descargado en el lado de Ollama vía ollama pull <model>. El dropdown se llena desde GET /api/tags en tu servidor Ollama.", @@ -175,14 +175,14 @@ }, "models": { "heading": "Por qué estos modelos en concreto", - "intro": "El dropdown de modelos para cada proveedor comercial se llena desde una lista curada que viene con el Monitor (verified_ai_models.json). Los modelos en esta lista se han probado de principio a fin con el formato de la API chat / completions que usa el Monitor, con la forma exacta system_prompt + user_message + max_tokens que envía el AI Enhancer. La lista se refresca antes de cada release de ProxMenux con una herramienta verificadora privada que prueba cada modelo candidato y poda los que se comportan mal.", + "intro": "Los modelos comerciales proceden del catálogo de compatibilidad incluido verified_ai_models.json, combinado con las comprobaciones del adaptador de cada proveedor. Los adaptadores convierten la petición interna system_prompt + user_message + max_tokens al formato de su API. El catálogo incluye entradas probadas y añadidos manuales; es una lista fechada, sin garantía de acceso actual ni de que todas las entradas hayan pasado el mismo verificador.", "consequencesIntro": "Dos consecuencias que merece la pena conocer:", "consequences": [ - "El modelo recomendado para cada proveedor es el que tiene el mejor equilibrio de calidad, latencia y coste específicamente para traducción de notificaciones — no el modelo más capaz que vende el proveedor. Las reescrituras de notificaciones no necesitan razonamiento de modelo frontera; necesitan rapidez y bajo coste.", - "Aun así puedes elegir otro modelo verificado del dropdown — a veces tienes una cuota de nivel gratuito que quieres gastar en un modelo concreto, o tienes una preferencia fuerte. Elige cualquiera de las entradas listadas; todas han pasado el verificador." + "La recomendación incluida es un punto de partida para formatear notificaciones. Evalúa calidad lingüística, latencia y coste con tus eventos y tu cuenta; no es una clasificación universal de modelos.", + "Puedes elegir otro modelo de la lista según tu cuota o preferencias. Comprueba su disponibilidad con la prueba de conexión; aparecer en la lista no garantiza acceso actual para tu cuenta." ], "ollamaTitle": "Ollama es la excepción", - "ollamaBody": "Los modelos de Ollama son locales y el Monitor no los filtra — el dropdown refleja lo que hayas descargado. Elige un modelo del rango 7B-13B con al menos una ventana de contexto de 8K para que la reescritura con IA se comporte razonablemente con los bloques de contexto de journal." + "ollamaBody": "La lista de Ollama no se filtra por el catálogo comercial; refleja los modelos del servidor Ollama. Para ejecución local, elige un modelo local que quepa en RAM y tenga contexto suficiente para los logs. Los modelos cloud son remotos aunque se acceda a ellos mediante un servidor Ollama local." }, "defaultPrompt": { "heading": "Prompt por defecto", @@ -205,8 +205,8 @@ "changes": [ "El prompt por defecto se reemplaza por completo. Los mappings de Proxmox, las reglas de manejo de contexto y las instrucciones de emoji desaparecen todas. Si quieres conservar cualquiera de ellas, pégalas en tu prompt — el EXAMPLE_CUSTOM_PROMPT empaquetado mostrado abajo es un punto de partida.", "El selector de Language se ignora. El prompt por defecto tiene un placeholder '{'language'}'; el prompt personalizado no. Si quieres salida en un idioma específico, declárala dentro de tu prompt (\"Translate to Spanish\", \"Output everything in French\").", - "El nivel de detalle sigue aplicando en el sentido de que está disponible como ajuste por canal, pero el tope de tokens de salida pasa a ser fijo de 500 en modo custom (vs la rampa 500 / 1500 / 3000 del prompt por defecto). Si tu prompt personalizado pide un reporte largo, sube el tope editando el prompt o divide la petición.", - "Los marcadores de Output Format siguen siendo obligatorios. El Monitor parsea la respuesta buscando [TITLE] y [BODY] en sus propias líneas. Un prompt personalizado que no emita esos marcadores romperá el parser y caerá al cuerpo templated original.", + "El tope del modo personalizado es fijo: 500 tokens, independientemente del detalle guardado por canal. El modo predeterminado usa 500 / 1500 / 3000. Editar el prompt no eleva el tope; pide una respuesta más breve o usa un nivel predeterminado adecuado.", + "Los marcadores de salida siguen siendo obligatorios. Incluye [TITLE] y [BODY] en el formato de respuesta. El analizador extrae su contenido; si falta uno, devuelve la plantilla original.", "Las reglas de emoji de Rich messages no se autoinyectan. Si quieres emojis, dile al prompt que los use. Si quieres texto plano, dile que no. El toggle solo gatea los bloques empaquetados del prompt por defecto, no tu cadena personalizada." ], "starterTitle": "Prompt inicial", @@ -218,16 +218,16 @@ "shareOutro": "Navega la discusión para ver qué han construido otros operadores — alertas escuetas tipo pager, reportes técnicos verbosos, variantes específicas por idioma. Si tuneas el tuyo y te gusta el resultado, publícalo allí: incluso una descripción de un párrafo de para qué optimiza tu prompt ayuda a la gente a elegir un buen punto de partida. El feedback sobre lo que funciona y lo que no es igualmente bienvenido." }, "suggestions": { - "heading": "AI Suggestions (BETA)", + "heading": "Sugerencias de IA (BETA)", "intro": "AI Suggestions es un addon opt-in que deja al LLM añadir un consejo corto y accionable al final del cuerpo. Solo se activa cuando el modo de prompt es Default, el toggle maestro de IA está activado y el switch AI Suggestions está pulsado — e incluso entonces, el prompt instruye al modelo a saltarse el consejo cuando la causa o solución no esté clara.", "formatIntro": "Cuando se añade un consejo, sigue este formato exacto:", "rulesIntro": "Las reglas integradas en el addon (visibles en el bloque colapsable bajo la sección Default prompt de arriba):", "rules": [ "El consejo se incluye solo si el contexto del journal o la base de datos de errores conocidos apunta claramente a una solución específica.", - "El consejo está limitado a 100 caracteres.", - "Debe ser específico (comando o ruta concretos) — los consejos genéricos los rechaza el propio prompt.", + "El prompt pide un consejo de menos de 100 caracteres; el analizador no comprueba ese límite por separado.", + "El prompt exige un comando o ruta concretos e indica al modelo que evite consejos genéricos.", "Si un error conocido proporciona una solución, el LLM debe usar esa solución, no inventar una nueva.", - "Si nada en la entrada le da al LLM suficiente certeza para sugerir un arreglo concreto, el consejo se omite — sin adivinar." + "El prompt indica al modelo que omita el consejo si los datos no justifican una solución concreta." ], "betaTitle": "Por qué BETA", "betaBody": "La calidad del consejo depende de dos cosas fuera de ProxMenux: el modelo elegido y lo rico que era el contexto del journal para el evento. Con un modelo fuerte (Claude 3.5 Haiku, GPT-4.1 Mini, Llama 3.3 70B) y un error de disco que viene con smartctl + líneas de journal, el consejo es consistentemente útil. Con un modelo Ollama local pequeño y un evento de una línea, el consejo puede quedar pobre o saltarse por completo. Desactiva el toggle si encuentras los consejos ruidosos y reactívalo cuando lo quieras de vuelta." @@ -241,19 +241,19 @@ "headerProduce": "Qué le pide el prompt al LLM que produzca", "rows": [ { - "level": "brief", + "level": "breve", "label": "2-3 líneas, solo esencial", "cap": "500 tokens", "produce": "\"Qué pasó + dónde\". Nada más." }, { - "level": "standard", + "level": "estándar", "label": "Conciso con contexto básico", "cap": "1500 tokens", "produce": "3-6 líneas: qué, dónde, causa, dispositivos afectados." }, { - "level": "detailed", + "level": "detallado", "label": "Detalles técnicos completos", "cap": "3000 tokens", "produce": "Reporte completo: qué, dónde, causa, afectados, logs, datos SMART, historial." @@ -265,12 +265,12 @@ "Email — detailed. Email es el canal donde típicamente quieres la foto completa para archivo." ], "emailTitle": "El nivel de detalle de Email añade el original", - "emailBody": "Cuando Email está en detailed y el cuerpo templated original tiene contenido sustancial (más de 50 caracteres), el dispatcher añade el mensaje original al final de la reescritura con IA, separado por un divisor de 40 guiones y una etiqueta Original message:. Esto significa que un email detallado siempre lleva tanto la versión amigable de IA como el template crudo amigable de máquina — útil cuando quieres hacer grep de una alerta antigua más tarde." + "emailBody": "Si el formateador devuelve un resultado para el correo en detailed y el texto original supera 50 caracteres, añade ese texto tras 40 guiones y la etiqueta Original message:. Así conserva los detalles para búsquedas posteriores. Cuando se omite la IA o falla, puede enviarse solo la plantilla original." }, "language": { "heading": "Idioma", - "intro": "Doce idiomas están cableados. El dropdown configura ai_language en la config y el valor se interpola en el system prompt en el sitio donde el prompt dice \"translate alerts into '{'language'}'\". La lista completa:", - "list": "Inglés (en), Español (es), Francés (fr), Alemán (de), Portugués (pt), Italiano (it), Ruso (ru), Sueco (sv), Noruego (no), Japonés (ja), Chino (zh), Neerlandés (nl).", + "intro": "El selector de la interfaz ofrece trece idiomas. Guarda ai_language, que el prompt predeterminado usa en \"translate alerts into '{'language'}'\". La lista es:", + "list": "Inglés (en), eslovaco (sk), español (es), francés (fr), alemán (de), portugués (pt), italiano (it), ruso (ru), sueco (sv), noruego (no), japonés (ja), chino (zh), neerlandés (nl).", "rulesIntro": "Dos reglas importantes sacadas directamente del prompt:", "rules": [ "Traducir: etiquetas, descripciones, palabras de estado, unidades (p. ej. GB → Go en francés).", @@ -280,7 +280,7 @@ }, "templates": { "heading": "Una nota sobre templates", - "body1": "El cuerpo que recibe la IA no es data cruda de evento — es una template prerrenderizada. Cada tipo de evento (backup_complete, vm_start, auth_fail, health_degraded, etc.) tiene una template en notification_templates.py que sabe cómo formatear ese evento específico en un cuerpo estructurado de texto plano. La IA reescribe ese cuerpo, no reemplaza el paso de templating.", + "body1": "La IA recibe una plantilla ya generada, no datos de evento sin procesar. Tipos como vm_start, auth_fail y health_degraded tienen plantillas en notification_templates.py. La IA reescribe los textos admitidos; backup_complete y backup_fail conservan sus informes deterministas y omiten la IA.", "body2": "Dos implicaciones prácticas: la IA nunca ve un hostname o VMID que tenga que inventar — esos campos los pone la template antes de la reescritura. Y si la IA está desactivada, el cuerpo templated es lo que se despacha directamente. La página de Notifications documenta la pipeline de despacho completa y es la referencia cruzada correcta para todo lo que le pasa a un evento antes de llegar a esta capa." }, "privacy": { @@ -291,11 +291,11 @@ "rows": [ { "provider": "Ollama", - "destination": "Se queda en el host Ollama. Si Ollama corre en el mismo nodo Proxmox, nada sale de la red en absoluto." + "destination": "Los modelos locales se ejecutan en el host Ollama configurado. Si es el propio nodo Proxmox, sus peticiones permanecen allí. Los modelos cloud de Ollama envían las peticiones fuera del host, incluso mediante un servidor Ollama local." }, { "provider": "OpenAI", - "destination": "api.openai.com (o tu endpoint Base URL personalizado). Sujeto a la política de manejo de datos de OpenAI en el momento de la llamada." + "destination": "api.openai.com de forma predeterminada o la URL base personalizada. Se aplica la política de datos del operador real de ese endpoint." }, { "provider": "Anthropic", @@ -315,13 +315,13 @@ } ], "calloutTitle": "Si el contenido del evento no puede salir de la red", - "calloutBody": "Usa Ollama, o desactiva el reescritor de IA. No hay terreno intermedio — el dispatcher no intenta redactar hostnames o IPs antes de enviar; el prompt se construye a partir del payload real del evento tal como lo ve el Monitor." + "calloutBody": "Usa un endpoint alojado en tu red con un modelo local, como Ollama local o un servidor compatible con OpenAI, o desactiva la IA. Los modelos cloud de Ollama no mantienen el procesamiento local. El sistema no anonimiza nombres de host ni IP; crea el prompt con el contenido real del evento." }, "whereNext": { "heading": "Por dónde seguir", "items": [ { - "label": "Notifications", + "label": "Notificaciones", "href": "/docs/monitor/notifications", "tail": " — la pipeline de despacho, canales, toggles por evento y la integración del webhook de PVE que rodea esta capa." }, diff --git a/web/messages/es/docs/monitor/api-reference.json b/web/messages/es/docs/monitor/api-reference.json index b2906347..c95dbcbe 100644 --- a/web/messages/es/docs/monitor/api-reference.json +++ b/web/messages/es/docs/monitor/api-reference.json @@ -1,48 +1,48 @@ { "meta": { "title": "API de Proxmox Monitor — Referencia de integración | ProxMenux", - "description": "Endpoints HTTP expuestos por ProxMenux Monitor para integraciones: Home Assistant, Homepage, Grafana, Prometheus, n8n y paneles propios. Exportación de datos en solo lectura más las operaciones de escritura seguras que necesitan las automatizaciones — control de VMs, disparo de backup, despacho de notificaciones, acknowledgement de alertas.", + "description": "Endpoints HTTP de ProxMenux Monitor para Home Assistant, Homepage, Grafana, Prometheus, n8n y paneles propios. Consulta el estado y ejecuta operaciones documentadas: control de VM, inicio de copias, notificaciones y confirmación de alertas.", "ogTitle": "API de Proxmox Monitor — Referencia de integración", - "ogDescription": "Endpoints expuestos por ProxMenux Monitor para Home Assistant, Homepage, Grafana, Prometheus, n8n y paneles propios.", + "ogDescription": "Endpoints de ProxMenux Monitor para Home Assistant, Homepage, Grafana, Prometheus, n8n y paneles propios.", "twitterTitle": "API de Proxmox Monitor | ProxMenux", "twitterDescription": "Endpoints para Home Assistant, Homepage, Grafana, Prometheus, n8n y paneles propios." }, "header": { - "title": "API Reference", - "description": "Los endpoints HTTP que usan los integradores para leer estado y disparar acciones seguras en ProxMenux Monitor — sensores de Home Assistant, tarjetas de Homepage, paneles de Grafana, scrapes de Prometheus, flujos de n8n y scripts propios. Cada categoría, más una lista completa de métricas Prometheus, con ejemplos en curl.", + "title": "Referencia de la API", + "description": "Endpoints HTTP para consultar el estado y ejecutar acciones documentadas en ProxMenux Monitor: sensores de Home Assistant, tarjetas de Homepage, paneles Grafana, recogida de Prometheus, flujos n8n y scripts propios. Incluye categorías, métricas exportadas y ejemplos curl.", "section": "ProxMenux Monitor" }, "intro": { "title": "Para qué es esta página", - "body": "Esta página lista los endpoints que esperamos que usen las integraciones externas — exportación de datos en solo lectura para cada parte del Monitor, más el pequeño conjunto de operaciones de escritura que las automatizaciones necesitan legítimamente (disparar un backup, enviar una notificación personalizada, dar acknowledgement a una alerta). Toda la API corre desde el mismo proceso Flask que sirve la UI del panel en TCP 8008; la dirección de bind y TLS se configuran en Access & Authentication." + "body": "Esta página reúne endpoints para integraciones externas: datos de lectura y operaciones como iniciar copias, enviar avisos y confirmar alertas. La API usa el mismo proceso Flask que sirve el panel en TCP 8008. La dirección de escucha y TLS se explican en Acceso y autenticación." }, "headerEndpoint": "Endpoint", "headerMethod": "Método", "headerUse": "Uso", "auth": { "heading": "Autenticación", - "intro": "Cada endpoint marcado como \"authenticated\" espera un token bearer JWT en la cabecera de la petición:", + "intro": "Con la autenticación activada, los endpoints protegidos esperan un JWT Bearer en la cabecera de la petición:", "tokensIntro": "Dos formas de obtener el token:", "items": [ - "API tokens (recomendado para integraciones). Tokens de larga duración emitidos desde Settings → Security → API Tokens en el panel. Cada token tiene un nombre, se puede revocar individualmente y es lo que deberías pasar a Home Assistant / Homepage / Grafana / n8n.", - "Flujo de login (JWT de corta duración). POST /api/auth/login con un username, password y token TOTP si el 2FA está activado. El JWT devuelto es de corta duración y el panel lo refresca automáticamente; útil para scripts ad-hoc que se autentican como un usuario humano." + "Tokens API, recomendados para integraciones. Valen 365 días y se crean en Seguridad → Tokens API. Tienen nombre y revocación individual. Usa read_only para datos y full_admin solo para acciones administrativas necesarias.", + "Inicio de sesión, JWT de 24 horas. POST /api/auth/login con usuario, contraseña y TOTP si lo exige 2FA. El JWT caduca a las 24 horas; los scripts deben volver a autenticarse después." ], - "flowLink": "El flujo de auth, la política de contraseñas, la configuración de 2FA, el log de auditoría y la configuración TLS viven todos en Access & Authentication.", + "flowLink": "El acceso, contraseñas, 2FA, auditoría y TLS se explican en Acceso y autenticación.", "rows": [ { "endpoint": "/api/auth/login", "method": "POST", - "use": "Body: '{'\"username\",\"password\",\"totp_token?\"'}'. Devuelve un JWT de corta duración." + "use": "Campos del cuerpo (esquema): '{'\"username\",\"password\",\"totp_token?\"'}'. Devuelve un JWT de 24 horas." }, { "endpoint": "/api/auth/api-tokens", "method": "GET", - "use": "Lista los API tokens (solo metadatos — nombres, prefijos, fechas; nunca el secret real)." + "use": "Lista los tokens API: nombres, prefijos y fechas; el valor secreto no se devuelve." }, { - "endpoint": "/api/auth/api-tokens", + "endpoint": "/api/auth/generate-api-token", "method": "POST", - "use": "Emite un nuevo API token de larga duración. Body: '{'\"name\":\"'<'label'>'\"'}'. El valor del token se devuelve una vez y no se puede recuperar de nuevo." + "use": "Crea un token API de 365 días con una sesión autenticada. Campos: password, token_name?, totp_token?, scope?. Se comprueban otra vez contraseña y TOTP requerido. scope usa read_only por defecto; full_admin se elige expresamente. El secreto se devuelve una sola vez." }, { "endpoint": "/api/auth/api-tokens/", @@ -54,10 +54,10 @@ "conventions": { "heading": "Convenciones", "items": [ - "Todas las peticiones y respuestas son JSON salvo que se indique explícitamente (la descarga de logs es texto plano, /api/prometheus es text/plain en formato OpenMetrics, el log de tareas es texto plano).", - "Los endpoints que modifican estado con éxito devuelven '{'\"success\": true, ...'}'. Las respuestas de error usan un estado HTTP no-2xx con '{'\"success\": false, \"error\": \"'<'motivo'>'\"'}'.", - "Los endpoints de listado aceptan limit, offset, since opcionales y filtros específicos por categoría vía query string.", - "Los campos de tiempo se devuelven como segundos epoch Unix o ISO-8601 con zona horaria explícita, nunca como cadenas de locale." + "La mayoría usa JSON. Algunas descargas son texto plano y /api/prometheus devuelve el formato de exposición de Prometheus 0.0.4, en vez de OpenMetrics. Comprueba el tipo de respuesta de cada ruta.", + "Muchas operaciones devuelven '{'\"success\": true, ...'}'. Los errores varían; una forma habitual es '{'\"success\": false, \"error\": \"'<'reason'>'\"'}'. Comprueba estado HTTP y campos: algunos retos de autenticación usan HTTP 200 con success false.", + "Los parámetros dependen del endpoint. Usa limit, offset, since y filtros por categoría solo si esa ruta los admite.", + "Los tiempos varían por endpoint: marcas Unix, cadenas ISO-8601 y fechas con formato systemd. No supongas una unidad común ni una zona horaria explícita en todos los campos." ] }, "system": { @@ -66,7 +66,7 @@ { "endpoint": "/api/system", "method": "GET", - "use": "CPU, memoria, swap, uptime, load — snapshot actual." + "use": "Valores actuales de CPU, memoria, swap, tiempo encendido y carga." }, { "endpoint": "/api/info", @@ -76,93 +76,93 @@ { "endpoint": "/api/system-info", "method": "GET", - "use": "Snapshot extendido del sistema usado por la cabecera del panel (métricas globales + boot time)." + "use": "Datos ampliados usados por la cabecera del panel: métricas generales y hora de arranque." }, { "endpoint": "/api/hardware", "method": "GET", - "use": "Inventario hardware detallado — dispositivos PCI, GPUs, mapa de sensores." + "use": "Inventario detallado de hardware: dispositivos PCI, GPU y sensores." }, { "endpoint": "/api/hardware/live", "method": "GET", - "use": "Valores en vivo para sensores que cambian de segundo en segundo." + "use": "Valores actuales de sensores que cambian rápidamente." }, { "endpoint": "/api/temperature/history", "method": "GET", - "use": "Serie temporal de temperaturas CPU / package." + "use": "Historial de temperaturas de CPU y encapsulado." }, { "endpoint": "/api/gpu//realtime", "method": "GET", - "use": "Métricas en vivo de GPU NVIDIA / Intel / AMD por slot PCI." + "use": "Métricas actuales de GPU NVIDIA, Intel y AMD por posición PCI." } ] }, "actions": { "heading": "Acciones del sistema", - "intro": "Endpoints fire-and-forget que disparan las mismas operaciones que el usuario ejecutaría desde la interfaz del Monitor o desde el menú shell — pensados para Home Assistant, Homepage, Ansible, paneles personalizados y cualquier otra automatización que necesite alcanzar al host por HTTP. Toda ruta que muta el estado requiere un token con scope full_admin; los tokens read_only pueden consultar los endpoints .../status sin disparar nada. Cada acción devuelve 202 con una instantánea del estado; el cliente hace polling al .../status correspondiente para observar el progreso.", + "intro": "Estas acciones asíncronas se ejecutan en unidades systemd transitorias. Con autenticación activa, sus rutas de escritura exigen full_admin; read_only puede consultar .../status. El inicio aceptado devuelve HTTP 202 y estado; consulta .../status para el progreso. El control de invitados y las copias usan respuestas distintas, explicadas abajo.", "shapeTitle": "Formato de respuesta común", - "shapeIntro": "Todos los endpoints de acción devuelven el mismo objeto JSON — una sola forma que parsear desde cualquier cliente:", + "shapeIntro": "Las acciones asíncronas del sistema comparten este objeto JSON de estado. El control de invitados y las copias tienen formatos distintos:", "shapeCode": "{\n \"unit\": \"proxmenux-action-pve-update.service\",\n \"state\": \"idle | running | success | failed | cancelled\",\n \"started_at\": \"Sat 2026-08-01 11:01:32 CEST\",\n \"finished_at\": null,\n \"exit_code\": null,\n \"result\": null\n}", "concurrencyTitle": "Concurrencia y cancelación", - "concurrencyBody": "Un segundo POST mientras una ejecución está en curso devuelve 409 con el estado actual. Cancela una ejecución en curso con un DELETE a la URL base de la acción; el estado pasa a cancelled y los timestamps se conservan para que el cliente vea cuándo se disparó y se detuvo. El último estado terminal (success / failed / cancelled) se recuerda hasta que la siguiente ejecución lo reemplace.", + "concurrencyBody": "Iniciar otra ejecución de la misma acción activa devuelve HTTP 409. Solo se cancela si hay una ruta DELETE documentada, como en la actualización PVE. Su estado pasa a cancelled y conserva fechas. Los estados finales se guardan en memoria del proceso y pueden perderse al reiniciar Monitor.", "rows": [ { "endpoint": "/api/system/power/reboot", "method": "POST", - "use": "Reiniciar el host Proxmox. Fire-and-forget — la conexión HTTP cae cuando systemd inicia la secuencia de apagado." + "use": "Inicia el reinicio del host Proxmox. La conexión HTTP puede cerrarse cuando systemd comienza el apagado." }, { "endpoint": "/api/system/power/reboot/status", "method": "GET", - "use": "Estado de la última / actual acción de reinicio." + "use": "Estado del reinicio actual o anterior." }, { "endpoint": "/api/system/power/shutdown", "method": "POST", - "use": "Apagar el host Proxmox. Útil como efecto conectado a una señal de apagado del SAI." + "use": "Apaga el host Proxmox; puede conectarse a una señal de apagado del SAI." }, { "endpoint": "/api/system/power/shutdown/status", "method": "GET", - "use": "Estado de la última / actual acción de apagado." + "use": "Estado del apagado actual o anterior." }, { "endpoint": "/api/system/pve-update/run", "method": "POST", - "use": "Disparar el flujo seguro de actualización de PVE (el mismo que ejecuta el botón Update Now del Health Monitor y el menú shell — delega en update-pve-safe.sh)." + "use": "Inicia la actualización de PVE usada por Actualizar ahora de Health Monitor y el menú de consola; delega en update-pve-safe.sh." }, { "endpoint": "/api/system/pve-update/status", "method": "GET", - "use": "Estado de la última / actual ejecución de actualización de PVE." + "use": "Estado de la actualización PVE actual o anterior." }, { "endpoint": "/api/system/pve-update", "method": "DELETE", - "use": "Cancelar una actualización de PVE en curso (SIGTERM al script en ejecución)." + "use": "Cancela una actualización PVE en curso mediante SIGTERM al proceso." }, { "endpoint": "/api/proxmenux/self-update/run", "method": "POST", - "use": "Actualizar el propio ProxMenux canalizando el instalador estable canónico. Corre en su propia unit systemd para que la actualización complete a pesar del reinicio de proxmenux-monitor que el instalador realiza." + "use": "Actualiza ProxMenux con el instalador del canal estable o beta configurado. Usa su propia unidad systemd para poder continuar durante el reinicio de proxmenux-monitor que realiza el instalador." }, { "endpoint": "/api/proxmenux/self-update/status", "method": "GET", - "use": "Estado de la última / actual ejecución de self-update de ProxMenux." + "use": "Estado de la actualización de ProxMenux actual o anterior." }, { "endpoint": "/api/vms//control", "method": "POST", - "use": "Encender / apagar / apagar limpio / reiniciar una VM o contenedor LXC (las mismas operaciones que expone la modal VM & LXC del Monitor). El cuerpo lleva action: start, stop, shutdown o reboot. Síncrono — devuelve el resultado directo sin necesidad de polling." + "use": "Envía una orden de control de VM o LXC. El campo action admite start, stop, shutdown o reboot. La respuesta correcta devuelve una tarea PVE confirmada, sin indicar que ya haya terminado. Consulta el endpoint control-task del invitado para obtener el resultado." }, { "endpoint": "/api/vms//backup", "method": "POST", - "use": "Crear un backup vzdump de una VM o LXC. Campos del cuerpo, todos opcionales salvo cuando los valores por defecto no encajan con la distribución del almacenamiento: storage (un almacenamiento de PVE), mode (snapshot, suspend o stop), compress (zstd, lzo, gz o none), protected (true o false), notes, notification (auto, always, failure o never) y pbs_change_detection (default, legacy o data). Devuelve el UPID de la tarea PVE." + "use": "Crea una copia vzdump de una VM o LXC. Campos opcionales, ajustables según el almacenamiento: storage (destino PVE), mode (snapshot, suspend o stop), compress (zstd, lzo, gzip o none), protected (true o false), notes, notification (auto, always, failure o never) y pbs_change_detection (default, legacy o data). Devuelve el UPID de la tarea PVE." }, { "endpoint": "/api/vms//backups", @@ -170,14 +170,14 @@ "use": "Listar backups anteriores de una VM o LXC en todos los storages accesibles." } ], - "syncVsAsyncTitle": "Dos estilos de acción", - "syncVsAsyncBody": "Las acciones a nivel de sistema (power del host, PVE update, self-update de ProxMenux) pueden tardar minutos — corren en su propia unit systemd transitoria y exponen un endpoint .../status más un DELETE para cancelar. Las acciones VM / LXC (start, stop, shutdown, reboot, backup) son rápidas y usan el estilo fire-and-return que la UI del Monitor ya expone: el POST devuelve el resultado directo. Ambos estilos comparten el mismo modelo de autenticación (JWT o token de API de larga duración).", - "curlTitle": "Ejemplo con curl", - "curlBody": "Disparar una actualización de PVE y hacer polling hasta que termine — exactamente la misma secuencia que ejecutaría una automatización de Home Assistant o un playbook de Ansible:", - "curlCode": "TOKEN=\n\ncurl -sSf -X POST \\\n -H \"Authorization: Bearer $TOKEN\" \\\n https://:8008/api/system/pve-update/run\n\nwhile true; do\n state=$(curl -sSf -H \"Authorization: Bearer $TOKEN\" \\\n https://:8008/api/system/pve-update/status | jq -r .state)\n [ \"$state\" != \"running\" ] && break\n sleep 30\ndone\necho \"estado final: $state\"", - "haTitle": "Snippet de integración con Home Assistant", - "haBody": "Un sensor rest hace polling del estado y un rest_command dispara la actualización. Conecta ambos a un botón del dashboard y a las automatizaciones que quieras:", - "haCode": "# configuration.yaml\nsensor:\n - platform: rest\n resource: https://pve.local:8008/api/system/pve-update/status\n name: pve_update_state\n value_template: \"{{ value_json.state }}\"\n scan_interval: 60\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\nrest_command:\n pve_update:\n url: https://pve.local:8008/api/system/pve-update/run\n method: POST\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\n # Encender VM 100 (funciona igual para LXC — mismo endpoint)\n vm_100_start:\n url: https://pve.local:8008/api/vms/100/control\n method: POST\n content_type: 'application/json'\n payload: '{\"action\": \"start\"}'\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\n # Backup de la VM 100 al storage 'pbs-main'\n vm_100_backup:\n url: https://pve.local:8008/api/vms/100/backup\n method: POST\n content_type: 'application/json'\n payload: '{\"storage\": \"pbs-main\", \"mode\": \"snapshot\", \"compress\": \"zstd\"}'\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"" + "syncVsAsyncTitle": "Dos tipos de acción", + "syncVsAsyncBody": "Encendido, apagado y actualizaciones del host usan unidades systemd transitorias con .../status. Solo la actualización PVE tiene aquí una ruta de cancelación DELETE. El control VM/LXC devuelve una tarea que debe consultarse; la copia devuelve un UPID de trabajo en segundo plano. Aceptar la petición no equivale a terminarla. Autenticación y permisos dependen de la ruta.", + "curlTitle": "Ejemplo curl", + "curlBody": "Inicia una actualización PVE y consulta hasta que termine: la secuencia que usaría una automatización Home Assistant o un playbook Ansible.", + "curlCode": "TOKEN=\n\ncurl -sSf -X POST \\\n -H \"Authorization: Bearer $TOKEN\" \\\n https://:8008/api/system/pve-update/run\n\nwhile true; do\n state=$(curl -sSf -H \"Authorization: Bearer $TOKEN\" \\\n https://:8008/api/system/pve-update/status | jq -r .state)\n [ \"$state\" != \"running\" ] && break\n sleep 30\ndone\necho \"final state: $state\"", + "haTitle": "Ejemplo para Home Assistant", + "haBody": "Un sensor rest consulta el estado y rest_command inicia la actualización. Úsalos con un botón del panel y las automatizaciones que necesites:", + "haCode": "# configuration.yaml\nsensor:\n - platform: rest\n resource: https://pve.local:8008/api/system/pve-update/status\n name: pve_update_state\n value_template: \"{{ value_json.state }}\"\n scan_interval: 60\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\nrest_command:\n pve_update:\n url: https://pve.local:8008/api/system/pve-update/run\n method: POST\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\n # Start VM 100 (works for LXC too — same endpoint)\n vm_100_start:\n url: https://pve.local:8008/api/vms/100/control\n method: POST\n content_type: 'application/json'\n payload: '{\"action\": \"start\"}'\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\n # Backup VM 100 to the 'pbs-main' storage\n vm_100_backup:\n url: https://pve.local:8008/api/vms/100/backup\n method: POST\n content_type: 'application/json'\n payload: '{\"storage\": \"pbs-main\", \"mode\": \"snapshot\", \"compress\": \"zstd\"}'\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"" }, "health": { "heading": "Monitor de salud", @@ -185,22 +185,22 @@ { "endpoint": "/api/health", "method": "GET", - "use": "Probe pequeño de salud — devuelve JSON con status, timestamp, version. Adecuado para keyword checks de Uptime Kuma; el receptor debe enviar la cabecera bearer." + "use": "Comprobación ligera que devuelve JSON con status, timestamp y version. Sirve para palabras clave de Uptime Kuma; con autenticación activa, el cliente debe enviar la cabecera Bearer." }, { "endpoint": "/api/health/status", "method": "GET", - "use": "Veredicto global de salud — severidad única + cadena de resumen." + "use": "Estado global: un nivel de gravedad y un resumen." }, { "endpoint": "/api/health/details", "method": "GET", - "use": "Las diez categorías con estados por categoría y el payload estructurado que produjo cada uno." + "use": "Las diez categorías con estado y datos estructurados de cada comprobación." }, { "endpoint": "/api/health/full", "method": "GET", - "use": "Snapshot completo — categorías + errores activos + lista de dismissed + ajustes de supresión personalizados. Alimenta el modal en un round-trip; usa una caché de fondo de 6 min para respuesta instantánea." + "use": "Datos completos: categorías, errores activos, alertas descartadas y ajustes de silenciamiento. Usa resultados de fondo con menos de seis minutos; si no hay caché reciente o fuerzas la actualización, ejecuta una comprobación nueva." }, { "endpoint": "/api/health/active-errors", @@ -210,12 +210,12 @@ { "endpoint": "/api/health/dismissed", "method": "GET", - "use": "Lista de dismissed con las horas de supresión restantes." + "use": "Alertas descartadas con horas de silencio restantes." }, { "endpoint": "/api/health/settings", "method": "GET", - "use": "Valores de Suppression Duration por categoría configurados actualmente." + "use": "Duración de silenciamiento configurada para cada categoría." }, { "endpoint": "/api/health/remote-storages", @@ -225,12 +225,12 @@ { "endpoint": "/api/health/interfaces", "method": "GET", - "use": "Inventario de interfaces de red con tipo (bridge / bond / physical), IP y velocidad de enlace." + "use": "Interfaces de red con tipo (bridge / bond / física), IP y velocidad del enlace." }, { "endpoint": "/api/health/acknowledge", "method": "POST", - "use": "Body: '{'\"error_key\":\"smart_sdh\"'}'. Descarta una alerta con la Suppression Duration configurada de la categoría." + "use": "Cuerpo: '{'\"error_key\":\"smart_sdh\"'}'. Silencia una alerta durante el periodo configurado para su categoría." }, { "endpoint": "/api/health/cleanup-orphans", @@ -238,7 +238,7 @@ "use": "Limpieza manual de errores cuyo dispositivo o VM subyacente ha desaparecido. Idempotente." } ], - "outro": "Las formas de respuesta y la semántica de las categorías viven en Monitor de salud." + "outro": "Los formatos de respuesta y las categorías se explican en Health Monitor." }, "storage": { "heading": "Almacenamiento", @@ -246,7 +246,7 @@ { "endpoint": "/api/storage", "method": "GET", - "use": "Todos los discos visibles al host (block devices, pools ZFS, LVM)." + "use": "Discos visibles para el host: dispositivos de bloques, pools ZFS y LVM." }, { "endpoint": "/api/storage/summary", @@ -261,7 +261,7 @@ { "endpoint": "/api/storage/observations", "method": "GET", - "use": "Historial permanente de observaciones de disco — advertencias SMART, errores I/O, eventos de pool ZFS, conservados a través de auto-resoluciones de errores." + "use": "Historial persistente de observaciones: avisos SMART, errores de E/S y eventos ZFS. Se conserva aunque se resuelva la alerta." }, { "endpoint": "/api/storage/smart/", @@ -286,7 +286,7 @@ { "endpoint": "/api/storage/smart//test", "method": "POST", - "use": "Dispara un self-test SMART. Body: '{'\"type\":\"short\"|\"long\"'}'." + "use": "Inicia una prueba SMART. Esquema del cuerpo: '{'\"type\":\"short\"|\"long\"'}'." }, { "endpoint": "/api/storage/smart/schedules", @@ -296,7 +296,7 @@ { "endpoint": "/api/storage/smart/tools", "method": "GET", - "use": "Detecta si smartctl y compañía están instalados." + "use": "Comprueba si están instalados smartctl y las herramientas asociadas." } ] }, @@ -316,12 +316,12 @@ { "endpoint": "/api/network//metrics", "method": "GET", - "use": "RX / TX por interfaz, contadores de errores, serie temporal RRD." + "use": "RX/TX por interfaz, contadores de errores y series temporales RRD." }, { "endpoint": "/api/network/latency/current", "method": "GET", - "use": "Último probe de latencia al gateway." + "use": "Última medición de latencia hasta la puerta de enlace." }, { "endpoint": "/api/network/latency/history", @@ -336,7 +336,7 @@ { "endpoint": "/api/vms", "method": "GET", - "use": "Lista de todas las VMs y CTs con estado, vmid, nombre." + "use": "VM y CT del nodo local con estado, vmid y nombre." }, { "endpoint": "/api/vms/", @@ -351,22 +351,22 @@ { "endpoint": "/api/vms//logs", "method": "GET", - "use": "Logs de tareas recientes acotados a ese guest." + "use": "Registros de tareas recientes de ese invitado." }, { "endpoint": "/api/vms//backups", "method": "GET", - "use": "Lista los backups actualmente conservados para este guest." + "use": "Copias de seguridad conservadas para este invitado." }, { "endpoint": "/api/vms//control", "method": "POST", - "use": "Body: '{'\"action\":\"start|stop|reboot|shutdown\"'}'. Power-cycle de un guest." + "use": "Selecciona una acción del esquema: '{'\"action\":\"start|stop|reboot|shutdown\"'}'. Controla el estado de encendido del invitado." }, { "endpoint": "/api/vms//backup", "method": "POST", - "use": "Dispara vzdump para ese guest. El body elige storage y modo (snapshot / suspend / stop)." + "use": "Inicia vzdump para el invitado. El cuerpo indica almacenamiento y modo (snapshot / suspend / stop)." }, { "endpoint": "/api/vms//config", @@ -376,22 +376,22 @@ { "endpoint": "/api/node/metrics", "method": "GET", - "use": "Métricas agregadas a nivel de nodo (RRD)." + "use": "Métricas agregadas del nodo en series RRD." } ] }, "backups": { - "heading": "Backups", + "heading": "Copias de seguridad", "rows": [ { "endpoint": "/api/backups", "method": "GET", - "use": "Lista de backups a nivel de cluster." + "use": "Copias encontradas en almacenamientos dir, NFS, CIFS y PBS consultados desde el nodo local. No explora todos los nodos del clúster." }, { "endpoint": "/api/backup-storages", "method": "GET", - "use": "Almacenamientos marcados como destinos de backup, con espacio libre." + "use": "Almacenamientos que admiten copias de seguridad, con espacio libre." } ] }, @@ -406,7 +406,7 @@ { "endpoint": "/api/logs/download", "method": "GET", - "use": "Volcado en texto plano del rango filtrado." + "use": "Exporta el intervalo filtrado como texto plano." }, { "endpoint": "/api/events", @@ -416,13 +416,13 @@ { "endpoint": "/api/task-log/", "method": "GET", - "use": "Log completo en texto plano para una tarea Proxmox por UPID." + "use": "Registro completo de una tarea Proxmox, en texto plano, identificado por UPID." } ] }, "notifications": { - "heading": "Notifications e IA", - "intro": "La pipeline de despacho, los walk-throughs de canales y la configuración del reescritor de IA viven en Notifications y Asistente de IA.", + "heading": "Notificaciones e IA", + "intro": "El envío, la configuración de canales y la reformulación con IA se explican en Notificaciones y Asistente de IA.", "rows": [ { "endpoint": "/api/notifications", @@ -432,42 +432,42 @@ { "endpoint": "/api/notifications/download", "method": "GET", - "use": "Exporta notificaciones como texto." + "use": "Exporta las notificaciones como texto." }, { "endpoint": "/api/notifications/status", "method": "GET", - "use": "Estado del dispatcher — si el hilo de fondo está corriendo, profundidad de cola, último envío." + "use": "Estado del envío: proceso de fondo activo, longitud de cola y último envío." }, { "endpoint": "/api/notifications/settings", "method": "GET", - "use": "Lee la configuración completa de notificaciones (canales, toggles por evento, reescritor de IA, Display Name)." + "use": "Lee la configuración de notificaciones: canales, controles por evento, reformulación con IA y nombre visible." }, { "endpoint": "/api/notifications/history", "method": "GET", - "use": "Historial de despacho. Query: ?limit=&offset=&severity=&channel=." + "use": "Historial de envío. Parámetros: ?limit=&offset=&severity=&channel=." }, { "endpoint": "/api/notifications/history", "method": "DELETE", - "use": "Borra la tabla de historial de despacho." + "use": "Borra la tabla del historial de envío." }, { "endpoint": "/api/notifications/test", "method": "POST", - "use": "Envía una notificación de prueba a un canal. Body: '{'\"channel\":\"telegram\"'}'." + "use": "Envía un aviso de prueba a un canal. Cuerpo: '{'\"channel\":\"telegram\"'}'." }, { "endpoint": "/api/notifications/send", "method": "POST", - "use": "Emite un evento personalizado. Body: '{'\"event_type\":\"custom\",\"severity\":\"WARNING\",\"title\":\"...\",\"body\":\"...\",\"data\":'{''}''}'." + "use": "Emite un evento personalizado. Cuerpo: '{'\"event_type\":\"custom\",\"severity\":\"WARNING\",\"title\":\"...\",\"body\":\"...\",\"data\":'{''}''}'." }, { "endpoint": "/api/notifications/test-ai", "method": "POST", - "use": "Prueba la conexión del proveedor de IA. Body: '{'\"provider\",\"api_key\",\"model\",\"ollama_url?\"'}'." + "use": "Prueba la conexión con el proveedor de IA. Campos del cuerpo (esquema): '{'\"provider\",\"api_key\",\"model\",\"ollama_url?\"'}'." }, { "endpoint": "/api/notifications/provider-models", @@ -502,22 +502,22 @@ { "endpoint": "/api/security/fail2ban/details", "method": "GET", - "use": "Estado del jail Fail2Ban — solo útil cuando el jail opcional está instalado." + "use": "Estado del jail Fail2Ban; requiere tener instalado ese componente opcional." }, { "endpoint": "/api/security/fail2ban/activity", "method": "GET", - "use": "Eventos recientes de Fail2Ban (bans, unbans, arranques de jail)." + "use": "Eventos recientes de Fail2Ban: bloqueos, desbloqueos y arranques del jail." }, { "endpoint": "/api/security/lynis/status", "method": "GET", - "use": "Estado de última ejecución de Lynis (si está instalado, timestamp de último scan)." + "use": "Estado de Lynis: instalación y fecha del último análisis." }, { "endpoint": "/api/security/lynis/report", "method": "GET", - "use": "Último reporte de auditoría Lynis (warnings, sugerencias, hardening index)." + "use": "Último informe Lynis: avisos, sugerencias e índice de refuerzo de seguridad." }, { "endpoint": "/api/security/tools", @@ -532,7 +532,7 @@ { "endpoint": "/api/proxmenux/update-status", "method": "GET", - "use": "Si ProxMenux Monitor tiene actualización disponible, versión actual y última." + "use": "Disponibilidad de actualización de ProxMenux Monitor, versión instalada y más reciente." }, { "endpoint": "/api/proxmenux/installed-tools", @@ -542,13 +542,13 @@ { "endpoint": "/api/proxmenux/tool-source/", "method": "GET", - "use": "Código fuente de una función post-instalación específica — el bash exacto que se aplicó." + "use": "Código de la función posterior a la instalación asociada, extraído del script actual del host o de código antiguo conservado. No garantiza una copia del código exacto ejecutado originalmente." } ] }, "prometheus": { "heading": "Métricas Prometheus", - "intro": "ProxMenux Monitor expone un endpoint de scrape formato Prometheus en GET /api/prometheus (autenticado) devolviendo texto formato OpenMetrics. Cada métrica está etiquetada con node=\"<hostname>\" y lleva un timestamp explícito para que ingese limpio en Prometheus, VictoriaMetrics, Mimir o cualquier TSDB compatible.", + "intro": "GET /api/prometheus con autenticación devuelve el formato de texto Prometheus 0.0.4. Cada métrica incluye node=\"<hostname>\" y una marca de tiempo explícita. Recógela con Prometheus u otra base temporal compatible.", "exportedTitle": "Métricas exportadas", "headerGroup": "Grupo", "headerMetric": "Métrica", @@ -559,7 +559,7 @@ "metrics": [ { "metric": "proxmox_cpu_usage", - "desc": "Porcentaje de uso de CPU (gauge)." + "desc": "Porcentaje de uso de CPU, de tipo gauge." }, { "metric": "proxmox_memory_total_bytes", @@ -567,7 +567,7 @@ }, { "metric": "proxmox_memory_used_bytes", - "desc": "Memoria usada en bytes." + "desc": "Memoria utilizada en bytes." }, { "metric": "proxmox_memory_usage_percent", @@ -575,16 +575,16 @@ }, { "metric": "proxmox_load_average", - "desc": "Load average del sistema. Etiqueta period=\"1m\" | \"5m\" | \"15m\"." + "desc": "Carga media del sistema. Etiqueta period=\"1m\" | \"5m\" | \"15m\"." } ] }, { - "group": "Uptime", + "group": "Tiempo de actividad", "metrics": [ { "metric": "proxmox_uptime_seconds", - "desc": "Segundos desde el último boot." + "desc": "Segundos desde el último arranque." } ] }, @@ -593,15 +593,15 @@ "metrics": [ { "metric": "proxmox_cpu_temperature_celsius", - "desc": "Temperatura del package de CPU." + "desc": "Temperatura del encapsulado de CPU." }, { "metric": "proxmox_disk_temperature_celsius", - "desc": "Temperatura por disco. Etiqueta device." + "desc": "Temperatura por disco. Etiqueta disk." }, { "metric": "proxmox_fan_speed_rpm", - "desc": "Velocidades de ventilador. Etiqueta fan." + "desc": "Velocidades de ventiladores. Etiqueta fan." } ] }, @@ -610,15 +610,15 @@ "metrics": [ { "metric": "proxmox_disk_total_bytes", - "desc": "Espacio total de disco por mount. Etiqueta mountpoint." + "desc": "Capacidad total de cada entrada de disco exportada. Etiqueta disk." }, { "metric": "proxmox_disk_used_bytes", - "desc": "Espacio usado de disco por mount." + "desc": "Capacidad utilizada de cada entrada de disco exportada." }, { "metric": "proxmox_disk_usage_percent", - "desc": "Porcentaje de uso de disco por mount." + "desc": "Porcentaje utilizado de cada entrada de disco exportada." } ] }, @@ -627,11 +627,11 @@ "metrics": [ { "metric": "proxmox_network_bytes_sent_total", - "desc": "Total de bytes enviados (counter)." + "desc": "Total de bytes enviados, de tipo counter." }, { "metric": "proxmox_network_bytes_received_total", - "desc": "Total de bytes recibidos (counter)." + "desc": "Total de bytes recibidos, de tipo counter." }, { "metric": "proxmox_interface_bytes_sent_total", @@ -652,23 +652,23 @@ }, { "metric": "proxmox_vms_running", - "desc": "Número de guests en ejecución." + "desc": "Número de invitados en ejecución." }, { "metric": "proxmox_vms_stopped", - "desc": "Número de guests parados." + "desc": "Número de invitados detenidos." }, { "metric": "proxmox_vm_status", - "desc": "Estado por VM/CT (1 = running, 0 = stopped). Etiquetas vmid, name, type." + "desc": "Estado por VM/CT: 1 en ejecución, 0 en otro estado. Etiquetas node, vmid y name." }, { "metric": "proxmox_vm_cpu_usage", - "desc": "Uso de CPU por VM/CT. Mismas etiquetas." + "desc": "Uso de CPU por VM/CT, con las mismas etiquetas." }, { "metric": "proxmox_vm_memory_used_bytes / _max_bytes", - "desc": "Memoria usada por VM/CT y máximo configurado." + "desc": "Memoria utilizada y máximo configurado por VM/CT." } ] }, @@ -677,7 +677,7 @@ "metrics": [ { "metric": "proxmox_gpu_temperature_celsius", - "desc": "Temperatura de GPU. Etiquetas slot, vendor." + "desc": "Temperatura GPU. Etiquetas slot y vendor; también incluye el nombre de GPU en gpu." }, { "metric": "proxmox_gpu_utilization_percent", @@ -685,19 +685,19 @@ }, { "metric": "proxmox_gpu_memory_total_bytes", - "desc": "Total de memoria de GPU." + "desc": "Memoria total de la GPU." }, { "metric": "proxmox_gpu_power_draw_watts", - "desc": "Consumo de potencia de GPU en vatios." + "desc": "Consumo eléctrico de la GPU en vatios." }, { "metric": "proxmox_gpu_clock_speed_mhz", - "desc": "Velocidad de reloj del core de GPU." + "desc": "Frecuencia del núcleo de la GPU." }, { "metric": "proxmox_gpu_memory_clock_mhz", - "desc": "Velocidad de reloj de memoria de GPU." + "desc": "Frecuencia de la memoria de la GPU." } ] }, @@ -706,7 +706,7 @@ "metrics": [ { "metric": "proxmox_ups_battery_charge_percent", - "desc": "Porcentaje de carga de batería." + "desc": "Porcentaje de carga de la batería." }, { "metric": "proxmox_ups_load_percent", @@ -714,7 +714,7 @@ }, { "metric": "proxmox_ups_runtime_seconds", - "desc": "Autonomía estimada en batería." + "desc": "Autonomía estimada con batería." }, { "metric": "proxmox_ups_input_voltage_volts", @@ -724,36 +724,36 @@ } ], "scrapeTitle": "Configuración de scrape de Prometheus", - "scrapeIntro": "El endpoint requiere autenticación. Pasa el API token como cabecera bearer en tu configuración de scrape de Prometheus:", - "perHostTitle": "Scrape por host", - "perHostBody": "Cada instancia de ProxMenux Monitor exporta métricas para el host en el que corre. En un cluster, apunta Prometheus a cada nodo — la etiqueta node en cada serie te permite distinguirlos en consultas Grafana (proxmox_vms_running'{'node=\"pve01\"'}')." + "scrapeIntro": "Con autenticación activa, añade un token API a la cabecera Bearer de la configuración de recogida de Prometheus:", + "perHostTitle": "Recogida por host", + "perHostBody": "Cada instancia exporta métricas de su propio host. En un clúster, configura Prometheus para consultar cada nodo. La etiqueta node distingue las series en Grafana (proxmox_vms_running'{'node=\"pve01\"'}')." }, "puttingItTogether": { - "heading": "Juntándolo todo", - "body": "Para guías de principio a fin que conectan estos endpoints con sensores de Home Assistant, tarjetas de Homepage, paneles de Grafana, flujos de n8n y otras herramientas, mira la página dedicada Integrations — recorre la configuración típica de cada plataforma con ejemplos copia-pega. Esta página se mantiene centrada en el catálogo en sí." + "heading": "Combinar las integraciones", + "body": "Consulta Integraciones para conectar estos endpoints con sensores Home Assistant, tarjetas Homepage, paneles Grafana, flujos n8n y otras herramientas. Incluye la configuración habitual de cada plataforma con ejemplos copiables. Esta página reúne el catálogo de endpoints." }, "whereNext": { "heading": "Por dónde seguir", "items": [ { - "label": "Access & Authentication", + "label": "Acceso y autenticación", "href": "/docs/monitor/access-auth", - "tail": " — emisión de tokens, log de auditoría, jail Fail2Ban opcional, configuración TLS." + "tail": " — creación de tokens, registro de auditoría, jail opcional de Fail2Ban y TLS." }, { - "label": "Notifications", + "label": "Notificaciones", "href": "/docs/monitor/notifications", - "tailRich": " — qué transporta cada tipo de evento en data cuando llamas a /api/notifications/send." + "tailRich": " — contenido de data para cada evento al llamar a /api/notifications/send." }, { "label": "Asistente de IA", "href": "/docs/monitor/ai-assistant", - "tailRich": " — cómo están cableados /api/notifications/test-ai y /api/notifications/provider-models." + "tailRich": " — funcionamiento de /api/notifications/test-ai y /api/notifications/provider-models." }, { "label": "Monitor de salud", "href": "/docs/monitor/health-monitor", - "tailRich": " — la forma de respuesta de /api/health/* y la semántica de las diez categorías." + "tailRich": " — formato de respuesta de /api/health/* y significado de las diez categorías." } ] } diff --git a/web/messages/es/docs/monitor/architecture.json b/web/messages/es/docs/monitor/architecture.json index 6867ff47..f7821bee 100644 --- a/web/messages/es/docs/monitor/architecture.json +++ b/web/messages/es/docs/monitor/architecture.json @@ -1,37 +1,37 @@ { "meta": { "title": "Arquitectura de ProxMenux Monitor — AppImage, Flask, SQLite, WebSocket | ProxMenux", - "description": "Cómo está construido ProxMenux Monitor: estructura del AppImage, blueprints de Flask, hilos de fondo, fuentes de datos (psutil, pvesh, smartctl, journalctl), persistencia en SQLite, terminal WebSocket, proveedores de IA, canales de notificación, reverse proxy e integración opcional con Fail2Ban.", + "description": "Cómo se construye ProxMenux Monitor: estructura AppImage, blueprints Flask, tareas de fondo, datos de psutil, pvesh, smartctl y journalctl, almacenamiento SQLite, terminal WebSocket, proveedores de IA, canales de aviso, proxy inverso y Fail2Ban opcional.", "ogTitle": "Arquitectura de ProxMenux Monitor", - "ogDescription": "Dentro de ProxMenux Monitor — estructura del AppImage, blueprints de Flask, hilos de fondo, SQLite, WebSocket, proveedores de IA, canales de notificación.", + "ogDescription": "Dentro de ProxMenux Monitor: AppImage, blueprints Flask, tareas de fondo, SQLite, WebSocket, proveedores de IA y canales de aviso.", "twitterTitle": "Arquitectura de ProxMenux Monitor", "twitterDescription": "AppImage, Flask, SQLite, WebSocket, proveedores de IA y canales de notificación — por dentro del Monitor." }, "header": { "title": "Arquitectura", - "description": "Cómo se empaqueta ProxMenux Monitor, qué corre dentro del AppImage y cómo fluyen las peticiones desde el navegador a través del backend Flask hasta las herramientas del host y el almacén SQLite.", + "description": "Cómo se distribuye ProxMenux Monitor, qué contiene el AppImage y cómo las peticiones del navegador pasan por Flask hasta las herramientas del host y el almacenamiento SQLite.", "section": "ProxMenux Monitor" }, "intro": { "title": "Un proceso, muchas responsabilidades", - "body": "Un único proceso Python escucha en el puerto TCP 8008. Sirve el build estático de Next.js, expone la API REST, gestiona el terminal WebSocket, ejecuta el Monitor de salud periódico y despacha notificaciones. No hay un servidor web aparte, ni un broker de mensajes, ni una base de datos externa." + "body": "Un proceso Python escucha en TCP 8008. Sirve la web estática Next.js, ofrece la API REST, gestiona el terminal WebSocket, ejecuta Health Monitor y envía notificaciones. No necesita un servidor web separado, un intermediario de mensajes ni una base de datos externa." }, "requestFlow": { - "heading": "Flujo de petición", - "intro": "Del navegador al kernel, cada vista del panel sigue el mismo camino:", - "diagramCaption": "Cada petición se autentica por JWT (cuando la autenticación está activada), se enruta a un blueprint y se responde con datos recogidos bajo demanda desde las herramientas del host. Si Fail2Ban está instalado y el jail proxmenux está activo, el middleware también comprueba la petición contra la lista de IPs baneadas del jail. El reverse proxy opcional es transparente para Flask — reenvía las cabeceras X-Forwarded-* y la app recupera la IP real del cliente a partir de ellas. El estado que necesita sobrevivir a una petición vive en SQLite.", + "heading": "Recorrido de una petición", + "intro": "Una petición de datos típica sigue este recorrido; las preferencias del navegador pueden gestionarse localmente:", + "diagramCaption": "Las rutas protegidas validan JWT si la autenticación está activa. Flask devuelve datos del host almacenados en caché o recién obtenidos. El control opcional de Fail2Ban consulta su lista de bloqueos en caché. Solo se confía en cabeceras de IP reenviadas con PROXMENUX_TRUST_PROXY=1; si no, se usa la IP de la conexión. El estado persistente incluye SQLite y archivos JSON como auth.json.", "diagramArrowLabel": "HTTP / WS", "nodes": { "clientLabel": "Cliente", "clientDetail": "Navegador o PWA\n+ proxy opcional\nNginx / Caddy /\nTraefik", "flaskLabel": "Flask :8008", - "flaskDetail": "Blueprints\nMiddleware JWT\nHook Fail2Ban\n(si está instalado)", + "flaskDetail": "Blueprints\nMiddleware JWT\nControl Fail2Ban\n(si está instalado)", "hostLabel": "Herramientas del host", "hostDetail": "psutil\npvesh\nsmartctl\njournalctl", "stateLabel": "Estado local", "stateDetail": "DB SQLite\n+ auth.json" }, - "threadsIntro": "El mismo proceso también ejecuta cuatro hilos de fondo arrancados al boot — no sirven HTTP, empujan estado a SQLite o a la cola de notificaciones mientras el host está activo:", + "threadsIntro": "El proceso también ejecuta hilos en segundo plano. Estos ejemplos recogen datos, actualizan cachés y SQLite, y envían notificaciones. Hay más tareas y el envío depende de que esté activado:", "headerThread": "Hilo", "headerCadence": "Cadencia", "headerJob": "Tarea", @@ -39,50 +39,50 @@ { "thread": "_temperature_collector_loop", "cadence": "60 s", - "job": "Registra la temperatura de la CPU y una muestra de latencia de red en la DB de historial para que las gráficas del panel tengan datos incluso cuando ningún cliente está conectado." + "job": "Guarda temperatura CPU y muestras de latencia en la base de historial, de modo que haya datos para gráficas sin un navegador conectado." }, { "thread": "_health_collector_loop", "cadence": "5 min", - "job": "Ejecuta el ciclo completo del Monitor de salud (10 categorías), persiste errores activos, dismissals y observaciones de disco, y alimenta nuevos eventos al motor de notificaciones." + "job": "Ejecuta el ciclo Health Monitor de diez categorías, guarda errores y observaciones de disco, mantiene los descartes y envía nuevos eventos al motor de avisos." }, { "thread": "_vital_signs_sampler", - "cadence": "~1 s", - "job": "Muestreador de alta frecuencia de CPU + temperatura usado por los widgets en vivo del panel Overview." + "cadence": "CPU 5 s; temperatura 15 s; memoria 30 s", + "job": "Muestrea uso CPU, memoria y temperatura CPU para los indicadores y la detección sostenida, con independencia del análisis general de cinco minutos." }, { "thread": "notification_manager.start()", "cadence": "dirigido por eventos", - "job": "Lanza los watchers de journal / task / hook (JournalWatcher, TaskWatcher, ProxmoxHookWatcher) y despacha a los canales configurados con reescritura opcional con IA." + "job": "Inicia observadores del journal, tareas y hooks (JournalWatcher, TaskWatcher, ProxmoxHookWatcher) y envía a los canales configurados, con reformulación IA opcional." } ] }, "systemd": { "heading": "Unidad systemd", - "intro": "El instalador deja una unidad en /etc/systemd/system/proxmenux-monitor.service. Contenido por defecto:", + "intro": "El instalador crea la unidad /etc/systemd/system/proxmenux-monitor.service. Configuración predeterminada:", "items": [ - "User=root — obligatorio: SMART, pvesh, scopes de journal, comandos ZFS y el terminal web requieren todos root.", - "Restart=on-failure con back-off de 10 segundos — las salidas con código distinto de cero relanzan automáticamente.", - "After=network.target — espera a que el stack de red del host esté online." + "User=root: el servicio usa privilegios root para operaciones del host como SMART, pvesh y gestión ZFS. Los procesos del terminal heredan esos permisos.", + "Restart=on-failure con espera de 10 segundos: se reinicia automáticamente tras una salida con error.", + "After=network.target: ordena el inicio después de ese objetivo; no garantiza IP asignada, DNS ni conectividad externa." ], - "inspectTitle": "Inspeccionar la unidad en vivo" + "inspectTitle": "Consultar la unidad actual" }, "appimage": { "heading": "Qué contiene el AppImage", - "intro": "El AppImage es un sistema de archivos automontable. AppRun en la raíz prepara el entorno y ejecuta flask_server.py:", + "intro": "AppImage es un sistema de archivos que se monta al ejecutarlo. AppRun en su raíz prepara el entorno y lanza flask_server.py:", "consequencesIntro": "Dos consecuencias de esta estructura:", "consequences": [ - "Sin polución del Python del host. El intérprete y los paquetes empaquetados están aislados dentro del AppImage — actualizar el Python del sistema host no afecta al Monitor y viceversa.", - "Las herramientas de hardware también vienen incluidas. ipmitool, lm-sensors y upsc viajan dentro del AppImage para que el panel pueda leer sensores fuera de banda y el estado de la UPS sin forzar al usuario a instalar paquetes Debian." + "Entorno Python incluido. El intérprete y sus paquetes vienen en AppImage, evitando instalarlos en Python del host. La aplicación sigue usando interfaces del kernel y herramientas externas del host.", + "Clientes de hardware incluidos. Contiene ipmitool, lm-sensors y upsc. Las lecturas dependen del hardware compatible, acceso a sensores y, para el SAI, un servidor NUT configurado." ] }, "flask": { - "heading": "Estructura de la app Flask", - "intro": "flask_server.py crea una única instancia Flask(__name__), habilita CORS y registra seis blueprints más un inicializador de WebSocket:", + "heading": "Estructura de la aplicación Flask", + "intro": "flask_server.py crea una instancia Flask(__name__) con CORS restringido, registra directamente nueve blueprints e inicializa el terminal. La tabla destaca módulos principales; también registra auditoría, copias VM y PBS. Las precargas PVE solo se ejecutan en hosts PVE.", "headerBlueprint": "Blueprint / módulo", "headerPrefix": "Prefijo de rutas", - "headerOwns": "Responsable de", + "headerOwns": "Responsabilidad", "rows": [ { "blueprint": "flask_server.py", @@ -95,208 +95,208 @@ "/api/logs", "/api/prometheus" ], - "owns": "Endpoints de datos principales + servir el panel estático + comprobación opcional de Fail2Ban a nivel de aplicación (activa solo cuando Fail2Ban está instalado en el host con el jail proxmenux)." + "owns": "Endpoints principales, web estática y control opcional Fail2Ban, activo si existe el jail proxmenux en el host." }, { "blueprint": "flask_auth_routes.py", "prefix": [ "/api/auth/*" ], - "owns": "Login, emisión de JWT, configuración / verificación de TOTP, cambio de contraseña, generación de API tokens." + "owns": "Inicio de sesión, emisión JWT, configuración y verificación TOTP, cambio de contraseña y tokens API." }, { "blueprint": "flask_health_routes.py", "prefix": [ "/api/health/*" ], - "owns": "Probe de salud público, estado detallado, errores activos / dismissed, ajustes de supresión." + "owns": "Comprobaciones de salud, estado detallado, errores activos y descartados, y silenciamientos. Las rutas protegidas exigen autenticación si está activada." }, { "blueprint": "flask_terminal_routes.py", "prefix": [ "/api/terminal/* + WS" ], - "owns": "Asignación de PTY por sesión y pipe WebSocket hacia xterm.js en el navegador." + "owns": "Crea un PTY por sesión y lo conecta por WebSocket con xterm.js del navegador." }, { "blueprint": "flask_notification_routes.py", "prefix": [ "/api/notifications/*" ], - "owns": "CRUD de canales, envío de prueba, configuración del proveedor de IA, historial, envíos manuales." + "owns": "Crear, consultar, editar y borrar canales; pruebas, IA, historial y envíos manuales." }, { "blueprint": "flask_security_routes.py", "prefix": [ "/api/security/*" ], - "owns": "Fallos de autenticación y, cuando Fail2Ban está instalado, estado del jail, eventos de ban y desbaneo manual." + "owns": "Fallos de acceso y, con Fail2Ban instalado, estado del jail, bloqueos y desbloqueo manual." }, { "blueprint": "flask_proxmenux_routes.py", "prefix": [ "/api/proxmenux/*" ], - "owns": "Lee qué optimizaciones post-instalación de ProxMenux están instaladas en el host." + "owns": "Lee las optimizaciones ProxMenux registradas en el host." }, { "blueprint": "flask_oci_routes.py", "prefix": [ "/api/oci/*" ], - "owns": "Ayudantes de despliegue de apps OCI / container (Proxmox VE 9.1+)." + "owns": "Funciones de despliegue de aplicaciones OCI y contenedores en Proxmox VE 9.1+." } ], - "endpointsLink": "La lista completa de endpoints con la forma de petición / respuesta está en API Reference." + "endpointsLink": "Los endpoints de integración y sus formatos se explican en Referencia de la API." }, "dataSources": { "heading": "Fuentes de datos", - "intro": "Nada se recoge a través de un agente propio — el Monitor lee los mismos archivos y ejecuta los mismos comandos que un administrador humano:", + "intro": "Los datos del host proceden principalmente de bibliotecas, archivos y comandos habituales de administración. Algunos datos del invitado dependen además de QEMU Guest Agent o de comandos ejecutados en el CT:", "headerSource": "Fuente", "headerUsedFor": "Usado para", "rows": [ { "source": "psutil", - "usedFor": "Carga de CPU, memoria, swap, uso de puntos de montaje, contadores de NIC, lista de procesos." + "usedFor": "Carga CPU, memoria, swap, ocupación de montajes, contadores de red y procesos." }, { "source": "pvesh / qm / pct", - "usedFor": "Información del nodo Proxmox, inventario y configuración de VMs y CTs, pools de almacenamiento, historial de tareas." + "usedFor": "Información del nodo Proxmox, inventario y configuración VM/CT, almacenamiento e historial de tareas." }, { "source": "smartctl", - "usedFor": "Atributos SATA / NVMe, salud SMART, desgaste / vida útil, modelo y número de serie." + "usedFor": "Atributos SATA/NVMe, estado SMART, desgaste, vida útil, modelo y número de serie." }, { "source": "zpool / zfs", - "usedFor": "Estado del pool (ONLINE / DEGRADED / FAULTED / UNAVAIL), progreso de scrub, uso de datasets." + "usedFor": "Estado del pool (ONLINE / DEGRADED / FAULTED / UNAVAIL), progreso del scrub y uso de datasets." }, { "source": "journalctl", - "usedFor": "Logs del sistema, OOM kills, errores ATA / NVMe / dm, eventos de seguridad, unidades de servicio propias." + "usedFor": "Registros del sistema, procesos terminados por OOM, errores ATA/NVMe/dm, seguridad y unidades de servicio propias." }, { "source": "ip / iproute2", - "usedFor": "Interfaces, direcciones, bridges, bonds, dispositivos gestionados por OVS." + "usedFor": "Interfaces, direcciones, bridges, bonds y dispositivos gestionados por OVS." }, { "source": "nvidia-smi · intel_gpu_top", - "usedFor": "Utilización de GPU, VRAM, temperatura, carga de encoder / decoder." + "usedFor": "Datos GPU disponibles de utilización, VRAM, temperatura y codificación/decodificación. Los campos dependen del fabricante, herramienta y controlador." }, { "source": "lspci · lscpu · dmidecode", - "usedFor": "Topología PCIe, modelo y topología de CPU, información de placa y BIOS." + "usedFor": "Topología PCIe, modelo y topología CPU, placa base y BIOS." }, { "source": "ipmitool · sensors", - "usedFor": "Sensores fuera de banda, velocidades de ventilador, temperaturas de placa (cuando son compatibles)." + "usedFor": "Sensores fuera de banda, ventiladores y temperaturas de la placa, si el hardware lo admite." }, { "source": "upsc (NUT)", - "usedFor": "Estado de batería de UPS, carga, autonomía — cuando hay un servidor NUT configurado en el host." + "usedFor": "Estado de batería, carga y autonomía del SAI si hay un servidor NUT configurado." } ], - "cacheTitle": "La salida se cachea — no toda petición llega al host", - "cacheBody": "Las fuentes costosas (smartctl -a, pvesh get) se envuelven en cachés temporizadas dentro del proceso Flask para que una pestaña ocupada del panel no martillee el disco o la API del cluster. Los TTLs de la caché están ajustados por fuente (unos pocos segundos para métricas en vivo, varios minutos para SMART)." + "cacheTitle": "Caché para reducir las consultas al host", + "cacheBody": "Los resultados costosos de smartctl -a y pvesh get se guardan temporalmente en el proceso Flask para reducir consultas repetidas al disco y a la API del clúster. La duración depende de la fuente: segundos para métricas y minutos para SMART." }, "persistence": { "heading": "Persistencia", - "intro": "Dos ubicaciones del sistema de archivos separan el estado por sensibilidad:", - "headerPath": "Ruta", + "intro": "Varios archivos guardan estados con distinto contenido y requisitos de acceso:", + "headerPath": "Path", "headerOwner": "Propietario", "headerContents": "Contenido", "rows": [ { "path": "/usr/local/share/proxmenux/health_monitor.db", "owner": "root:root", - "contents": "DB SQLite. Tablas: errors, events, disk_registry, disk_observations, user_settings, notification_history, excluded_storages, excluded_interfaces. Modo journal WAL." + "contents": "Base SQLite. Tablas: errors, events, disk_registry, disk_observations, user_settings, notification_history, excluded_storages, excluded_interfaces. Modo de registro WAL." }, { "path": "/usr/local/share/proxmenux/.notification_key", "owner": "root 0600", - "contents": "Clave XOR de 32 bytes usada para cifrar ajustes sensibles de notificaciones antes de guardarlos en la DB (tokens de Telegram, API keys de IA, etc.)." + "contents": "Clave maestra de 32 bytes para secretos de notificación ENC2. Usa sal aleatoria por valor, claves derivadas y MAC. Los valores XOR antiguos se admiten para migrarlos." }, { "path": "/root/.config/proxmenux-monitor/auth.json", "owner": "root:root", - "contents": "Estado de autenticación: flag de activación, nombre de usuario, hash SHA-256 de la contraseña, secret TOTP, códigos de backup, lista de API tokens emitidos, lista de hashes de tokens revocados." + "contents": "Configuración de acceso: activación, usuario, hash de contraseña PBKDF2-HMAC-SHA256 con sal, secreto TOTP, códigos de recuperación, clave JWT propia de la instalación, metadatos de tokens API y hashes de revocación. Los hashes SHA-256 antiguos migran al iniciar sesión correctamente." }, { "path": "/var/log/proxmenux-auth.log", "owner": "root:root", - "contents": "Log de eventos de autenticación en texto plano. Siempre se escribe. Si Fail2Ban está instalado con el jail [proxmenux], el jail lee este archivo para banear intentos de fuerza bruta; si no, el archivo simplemente acumula las entradas del log." + "contents": "Registro de autenticación en texto plano, independiente de Fail2Ban. Si el jail [proxmenux] está instalado y activo, lee este archivo para detectar fallos repetidos de acceso. Sin ese jail, el registro sigue disponible para consulta." } ], - "backupTitle": "Haz backup de auth.json antes de reinstalar", - "backupBody": "Reinstalar el AppImage reemplaza el binario pero deja /root/.config/proxmenux-monitor/auth.json y /usr/local/share/proxmenux/health_monitor.db intactos. Si restauras desde un backup del host, mantén ambos archivos juntos — los API tokens guardados en auth.json se validan contra JWT_SECRET; si la DB y auth.json se desincronizan, los errores dismissed y los tokens guardados pueden comportarse mal." + "backupTitle": "Guarda auth.json antes de reinstalar", + "backupBody": "Sustituir AppImage suele conservar /root/.config/proxmenux-monitor/auth.json y /usr/local/share/proxmenux/health_monitor.db. Conserva auth.json con su jwt_secret para mantener validez y metadatos de tokens. La base guarda estado de salud y avisos por separado. Guarda .notification_key con ella para restaurar secretos de canales; restaurar solo la base no restaura la autenticación API." }, "health": { - "heading": "Ciclo del Monitor de salud", - "intro": "Cada 5 minutos health_monitor.py ejecuta un ciclo determinista a través de las diez categorías mostradas en el panel:", + "heading": "Ciclo Health Monitor", + "intro": "Aproximadamente cada cinco minutos, el proceso de fondo llama a health_monitor.py para comprobar las diez categorías del panel:", "items": [ "Servicios críticos de PVE (pveproxy, pvedaemon, pvestatd, pve-cluster).", - "Pools de almacenamiento Proxmox (pvesh get /storage + disponibilidad por almacenamiento).", - "Discos y sistemas de archivos: SMART, errores de I/O en dmesg, salud de pool ZFS, capacidad de puntos de montaje.", - "VMs y CTs: arranques fallidos, guests caídos, errores QMP, fallos de apagado.", - "Red: estado de bridge / bond, estado de enlace, latencia al gateway.", - "Actualizaciones: actualizaciones de paquetes pendientes y parches de seguridad.", - "Logs: detección de patrones persistentes / spike / cascada en el journal del sistema.", - "Memoria: actividad del OOM killer, presión alta sostenida.", - "Temperatura: sensores CPU / chasis contra umbrales del fabricante.", - "Seguridad: fallos de autenticación, eventos de ban, estado del jail fail2ban." + "Almacenamientos Proxmox: pvesh get /storage y disponibilidad de cada uno.", + "Discos y sistemas de archivos: SMART, errores de E/S en dmesg, estado ZFS y capacidad de montajes.", + "VM y CT: fallos de arranque, caídas, errores QMP y fallos de apagado.", + "Red: estado de bridges y bonds, enlaces y latencia hasta la puerta de enlace.", + "Actualizaciones: paquetes pendientes y parches de seguridad.", + "Registros: patrones persistentes, picos y cascadas en el journal del sistema.", + "Memoria: actividad del OOM killer y presión RAM sostenida.", + "Temperatura: lecturas CPU y discos frente a umbrales de monitorización; los sensores disponibles dependen del hardware.", + "Seguridad: fallos de acceso, bloqueos y estado del jail Fail2Ban." ], - "afterIntro": "Cada hallazgo se normaliza a un error_key + categoría + severidad estable. La capa de persistencia deduplica contra la tabla errors existente — los eventos repetidos actualizan last_seen y el contador de ocurrencias sin spamear notificaciones.", - "cycleEnd": "El ciclo también auto-resuelve errores obsoletos usando el ajuste de Suppression Duration por categoría, limpia errores de recursos que ya no existen (VMs eliminadas / discos retirados / almacenamientos desmontados) y poda el log events con más de 30 días. El catálogo completo de categorías y la vista del panel que las expone está documentado en Dashboard → Monitor de salud." + "afterIntro": "Los hallazgos usan error_key, categoría y gravedad estables. Las filas de errors se actualizan con last_seen y recuentos, sin duplicarlas. El envío de avisos tiene además sus propias huellas y tiempos de espera.", + "cycleEnd": "La limpieza puede resolver errores obsoletos con la duración de silenciamiento por categoría y reglas de estado, retirar registros huérfanos de recursos eliminados y borrar events de más de 30 días. Las categorías se explican en Panel → Health Monitor." }, "notifications": { "heading": "Motor de notificaciones", - "intro": "notification_manager.py es el orquestador. Carga los canales configurados, posee la cola de entrega y expone tanto una API Python (para rutas Flask y el ciclo del Monitor de salud) como un punto de entrada CLI (para los scripts .sh de hooks que vienen con ProxMenux).", + "intro": "notification_manager.py coordina el envío: carga canales, gestiona la cola y ofrece una API Python para Flask y Health Monitor, además de una entrada de consola para los hooks .sh de ProxMenux.", "items": [ - "Los watchers empujan eventos: JournalWatcher sigue el journal del sistema, TaskWatcher hace polling de la lista de tareas Proxmox, ProxmoxHookWatcher reacciona a hooks de backup / replicación / snapshot y PollingCollector gestiona fuentes de datos lentas.", - "Las templates convierten un evento en un par (título, cuerpo). La misma template puede pasar por el proveedor de IA configurado (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter) para producir una reescritura en lenguaje natural; ambas versiones se guardan en notification_history.", - "Los canales entregan los mensajes: Telegram, Discord, Email, Gotify, Pushover y Apprise (multicanal). Cada uno está implementado en notification_channels.py mediante la misma interfaz create_channel() / send().", - "Cifrado. Los ajustes sensibles (telegram.bot_token, discord.webhook_url, pushover.user_key, pushover.api_token, ai_api_key_*, email.password) se cifran con la clave de .notification_key antes de escribirse en la base de datos y aparecen ocultos en la interfaz." + "Los observadores generan eventos: JournalWatcher sigue el journal, TaskWatcher consulta tareas Proxmox, ProxmoxHookWatcher recibe hooks de copias, replicación y snapshots, y PollingCollector gestiona fuentes lentas.", + "Las plantillas convierten eventos en título y texto. El proveedor de IA configurado (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter) puede reformularlos en lenguaje natural. Ambas versiones se guardan en notification_history.", + "Los canales envían por Telegram, Discord, correo, Gotify, Pushover y Apprise, entre otros. Las implementaciones en notification_channels.py comparten create_channel() / send().", + "Cifrado. Los ajustes sensibles (telegram.bot_token, discord.webhook_url, pushover.user_key, pushover.api_token, ai_api_key_*, email.password) se cifran con la clave de .notification_key antes de guardarse en la base de datos y se muestran enmascarados en la interfaz." ], - "linksFooter": "Los toggles por evento, los overrides por canal y la configuración de IA se exponen en Settings → Notifications y Settings → AI Assistant." + "linksFooter": "Los controles por evento, ajustes por canal e IA se explican en Ajustes → Notificaciones y Ajustes → Asistente de IA." }, "websocket": { "heading": "Terminal WebSocket", - "intro": "La pestaña Terminal del panel es un cliente fino xterm.js cableado a un PTY del lado servidor a través de un WebSocket. Dos modos de transporte:", + "intro": "La pestaña Terminal conecta un cliente ligero xterm.js a un PTY del servidor por WebSocket. Hay dos modos:", "items": [ - "Modo HTTP (por defecto): el servidor de desarrollo de Flask con flask-sock gestiona las peticiones de upgrade. Suficiente para LAN / acceso directo.", - "Modo HTTPS / WSS: cuando hay un certificado SSL configurado, el proceso cambia a gevent.pywsgi.WSGIServer con geventwebsocket.handler.WebSocketHandler, para que los WebSockets funcionen sobre TLS sin polyfills." + "Modo HTTP, predeterminado: el servidor Flask incluido y flask-sock gestionan el cambio de protocolo a WebSocket.", + "Modo HTTPS / WSS: usa gevent.pywsgi.WSGIServer con geventwebsocket.handler.WebSocketHandler para conexiones WebSocket sobre TLS." ], - "outro": "El PTY es un hijo del proceso Flask, así que hereda User=root de la unidad. Cada petición de terminal pasa por auth JWT; el usuario debe estar ya logueado en el panel antes de que se asigne un PTY.", - "proxyNote": "Si accedes al Monitor a través de un reverse proxy, asegúrate de habilitar el reenvío de WebSocket (cabeceras Upgrade y Connection). Sin eso, el terminal no funcionará." + "outro": "Los procesos del terminal heredan User=root. Con autenticación activa, abrir WebSocket exige un ticket breve y de un solo uso, obtenido del endpoint de tickets autenticado con permisos administrativos. Si la autenticación está desactivada o se rechazó configurarla, la conexión sigue ese modo sin autenticación.", + "proxyNote": "Si usas un proxy inverso, permite el tráfico WebSocket y sus cabeceras Upgrade y Connection. El terminal necesita ese reenvío." }, "proxy": { - "heading": "Reverse proxy y Fail2Ban", - "intro": "Dos salvaguardas se aseguran de que la seguridad funcione igual tanto si el panel se accede directamente como a través de un reverse proxy:", + "heading": "Proxy inverso y Fail2Ban", + "intro": "La elección de IP del cliente y el bloqueo opcional en la aplicación dependen de estos ajustes y componentes:", "items": [ - "Recuperación de la IP real del cliente. Un hook before_request lee X-Forwarded-For y X-Real-IP en ese orden, cayendo a request.remote_addr. La dirección recuperada es la que ven el log de autenticación y el rate limiting. Esto está siempre activo.", - "Comprobación de Fail2Ban a nivel de aplicación (opcional). Cuando el panel está detrás de un proxy, el firewall del kernel no puede bloquear la IP real del atacante — la conexión siempre viene del proxy. Para tapar ese hueco, el mismo hook de arriba consulta el jail proxmenux de Fail2Ban cada 30 segundos, cachea el conjunto de IPs baneadas y corta las peticiones desde esas IPs con HTTP 403 dentro de Flask." + "Elección de IP. El control before_request y el registro de acceso solo confían en X-Forwarded-For y después X-Real-IP con PROXMENUX_TRUST_PROXY=1. Si no, usan request.remote_addr. Las cabeceras reenviadas no se aceptan automáticamente.", + "Fail2Ban opcional en la aplicación. Una conexión por proxy puede mostrar la IP del proxy como origen TCP. Si se obtiene la IP fiable del cliente y está activo el jail proxmenux, Flask rechaza las IP bloqueadas con HTTP 403. La lista se guarda 30 segundos y se renueva al procesar peticiones tras caducar, sin un temporizador de consultas." ], "calloutTitle": "Fail2Ban no viene incluido", - "calloutBody": "Fail2Ban no lo instala ProxMenux Monitor por sí mismo. La comprobación a nivel de aplicación es un no-op hasta que instales Fail2Ban en el host (p. ej. vía Seguridad → Fail2Ban en el menú de ProxMenux). Cuando el binario fail2ban-client o el jail proxmenux está ausente, la llamada falla silenciosamente y las peticiones no se filtran — la autenticación sigue aplicándose, pero no hay baneo a nivel de IP.", - "outro": "Los snippets de reverse proxy (Nginx / Caddy / Traefik) y el walkthrough del jail Fail2Ban están en Access & Authentication y Seguridad → Fail2Ban." + "calloutBody": "Fail2Ban no viene incluido ni se instala automáticamente. Puede instalarse desde Seguridad del Monitor o Seguridad → Fail2Ban en ProxMenux Scripts. Si faltan fail2ban-client o el jail proxmenux, este control no bloquea peticiones. La autenticación sigue la política configurada.", + "outro": "Los ejemplos de proxy inverso Nginx/Caddy/Traefik y la guía del jail están en Acceso y autenticación y Seguridad → Fail2Ban." }, "whereNext": { "heading": "Por dónde seguir", "items": [ { - "label": "Access & Authentication", + "label": "Acceso y autenticación", "href": "/docs/monitor/access-auth", - "tail": " — configuración de primer arranque, contraseña + TOTP 2FA, snippets de reverse proxy, jail Fail2Ban." + "tail": " — primer inicio, contraseña y TOTP 2FA, ejemplos de proxy inverso y jail Fail2Ban." }, { - "label": "API Reference", + "label": "Referencia de la API", "href": "/docs/monitor/api", - "tail": " — cada endpoint, gestión de tokens, mejores prácticas de seguridad." + "tail": " — endpoints de integración, tokens y convenciones de autenticación." }, { - "label": "Settings → ProxMenux Monitor", + "label": "Ajustes → ProxMenux Monitor", "href": "/docs/settings/proxmenux-monitor", - "tail": " — el toggle del servicio dentro del menú y el flujo de verificación del estado dentro de la TUI de ProxMenux." + "tail": " — control del servicio y comprobación del estado en el menú de texto de ProxMenux." } ] } diff --git a/web/messages/es/docs/monitor/audit-report/assessment.json b/web/messages/es/docs/monitor/audit-report/assessment.json index ca43cf02..fbdde226 100644 --- a/web/messages/es/docs/monitor/audit-report/assessment.json +++ b/web/messages/es/docs/monitor/audit-report/assessment.json @@ -1,7 +1,7 @@ { "meta": { "title": "Evaluación e inventario | Auditoría e informes", - "description": "La evaluación de Auditoría e informes: perfiles de informe, clasificación de los resultados, riesgos aceptados, fuentes ilegibles, Lynis e inventario del nodo." + "description": "Evaluación de Auditoría e informes: perfiles de informe, clasificación de resultados, riesgos aceptados, fuentes ilegibles, Lynis e inventario del nodo." }, "header": { "title": "Evaluación e inventario", @@ -19,7 +19,7 @@ } }, { - "p": "Ejecutar evaluación inicia una ejecución con el perfil seleccionado en Informe. La vista muestra la fecha de la última ejecución y cuánto tiempo ha pasado." + "p": "Ejecutar evaluación inicia una ejecución con el perfil seleccionado en Informe. La vista muestra la fecha de la última ejecución y el tiempo transcurrido." } ] }, @@ -30,14 +30,35 @@ "blocks": [ { "table": { - "headers": ["Perfil", "Qué abarca"], + "headers": [ + "Perfil", + "Qué abarca" + ], "rows": [ - ["Auditoría completa", "Todas las comprobaciones y toda la estructura disponible."], - ["Diagnóstico rápido", "Todas las comprobaciones; el resultado empieza por los hallazgos críticos, las advertencias y las lecturas que no pudieron verificarse."], - ["Inventario", "Una descripción del nodo, sin comprobaciones ni clasificación."], - ["Revisión de seguridad", "Exposición, acceso, privilegios, certificados, actualizaciones, repositorios y Lynis."], - ["Garantía de backups", "Cobertura, antigüedad, resultados, verificación, retención y recuperación de los backups."], - ["Capacidad y desgaste", "Margen de crecimiento, memoria, ocupación y vida útil de los discos."] + [ + "Auditoría completa", + "Todas las comprobaciones y toda la estructura disponible." + ], + [ + "Diagnóstico rápido", + "Todas las comprobaciones; el resultado empieza por los hallazgos críticos, las advertencias y las lecturas que no pudieron verificarse." + ], + [ + "Inventario", + "Una descripción del nodo, sin comprobaciones ni clasificación." + ], + [ + "Revisión de seguridad", + "Exposición, acceso, privilegios, certificados, actualizaciones, repositorios y Lynis." + ], + [ + "Garantía de backups", + "Cobertura, antigüedad, resultados, verificación, retención y recuperación de los backups." + ], + [ + "Capacidad y desgaste", + "Margen de crecimiento, memoria, ocupación y vida útil de los discos." + ] ] } }, @@ -52,16 +73,43 @@ "blocks": [ { "table": { - "headers": ["Clasificación", "Significado"], + "headers": [ + "Clasificación", + "Significado" + ], "rows": [ - ["Crítico", "Una condición fallida con prioridad."], - ["Advertencia", "Una condición que requiere revisión, según la evidencia o la política."], - ["Observación", "Información sobre el nodo que no se presenta como fallo."], - ["Sin verificar", "La fuente que necesita la comprobación no pudo leerse. No significa que el problema no exista."], - ["Conforme", "La condición cumple el criterio aplicado."], - ["No aplicable", "Dentro del alcance de la comprobación no hay nada a lo que aplicarla."], - ["Riesgo aceptado", "El hallazgo existe y hay registrada una decisión sobre él."], - ["Excluido por política", "La política declara que el elemento queda fuera del recuento."] + [ + "Crítico", + "Una condición fallida con prioridad." + ], + [ + "Advertencia", + "Una condición que requiere revisión, según la evidencia o la política." + ], + [ + "Observación", + "Información sobre el nodo que no se presenta como fallo." + ], + [ + "Sin verificar", + "No se pudo leer la fuente que requiere la comprobación. Esto no significa que el problema no exista." + ], + [ + "Conforme", + "La condición cumple el criterio aplicado." + ], + [ + "No aplicable", + "Dentro del alcance de la comprobación no hay nada a lo que aplicarla." + ], + [ + "Riesgo aceptado", + "El hallazgo existe y hay registrada una decisión sobre él." + ], + [ + "Excluido por política", + "La política declara que el elemento queda fuera del recuento." + ] ] } }, @@ -76,11 +124,23 @@ "blocks": [ { "table": { - "headers": ["Caso", "Comportamiento"], + "headers": [ + "Caso", + "Comportamiento" + ], "rows": [ - ["Sin verificar", "La comprobación conserva su identidad, indica en su evidencia qué fuente falló y no convierte la falta de datos en un resultado conforme."], - ["Evidencia incompleta", "El informe nombra la fuente y el momento de la recogida, de modo que un problema real puede distinguirse de una lectura insuficiente."], - ["Una nueva ejecución", "Una vez corregido el acceso, el paquete o el servicio, el mismo perfil se ejecuta de nuevo y la comparación muestra si el resultado pudo verificarse."] + [ + "Sin verificar", + "La comprobación conserva su identidad, indica qué fuente falló en su evidencia y no convierte datos ausentes en un resultado conforme." + ], + [ + "Evidencia incompleta", + "El informe indica la fuente y el momento de recogida para distinguir un problema real de una lectura insuficiente." + ], + [ + "Una nueva ejecución", + "Una vez corregido el acceso, el paquete o el servicio, el mismo perfil se ejecuta de nuevo y la comparación muestra si el resultado pudo verificarse." + ] ] } } @@ -91,7 +151,7 @@ "title": "Lynis", "blocks": [ { - "p": "La revisión de seguridad usa el informe de Lynis del host. Cuando Lynis no se ha ejecutado todavía, o su informe supera el umbral de antigüedad de la política, un diálogo ofrece Ejecutar con Lynis, que tarda unos minutos más, o Ejecutar sin Lynis, que usa el informe existente." + "p": "La revisión de seguridad usa el informe Lynis del host. Si Lynis nunca se ha ejecutado o el informe supera la antigüedad permitida por la política, un diálogo ofrece Ejecutar con Lynis, que tarda unos minutos más, o Ejecutar sin Lynis, que usa el informe existente." }, { "figure": { @@ -107,20 +167,32 @@ "title": "Aceptar un riesgo", "blocks": [ { - "p": "Aceptar riesgo registra una decisión sobre un hallazgo. El motivo es obligatorio y se guarda junto al autor y la fecha." + "p": "Aceptar riesgo registra una decisión sobre un hallazgo. El motivo es obligatorio y se guarda con el autor y la fecha." }, { "table": { - "headers": ["Campo", "Opciones"], + "headers": [ + "Campo", + "Opciones" + ], "rows": [ - ["Motivo", "Texto libre, obligatorio."], - ["Deja de aplicarse tras", "90 días, 180 días, 1 año o no caduca. Al cumplirse el plazo, el hallazgo vuelve a estar activo."], - ["Recordarme revisarla", "Un recordatorio que devuelve la decisión a la atención mientras sigue en vigor."] + [ + "Motivo", + "Texto libre, obligatorio." + ], + [ + "Deja de aplicarse tras", + "90 días, 180 días, 1 año o no caduca. Al cumplirse el plazo, el hallazgo vuelve a estar activo." + ], + [ + "Recordarme revisarla", + "Un recordatorio que devuelve la decisión a la atención mientras sigue en vigor." + ] ] } }, { - "p": "Un hallazgo aceptado sigue visible con su decisión, y Volver a activo la revoca. Un riesgo aceptado no es una corrección: la comparación lo presenta como aceptado, no como resuelto." + "p": "El hallazgo aceptado sigue visible con su decisión; Volver a activo revoca la aceptación. Aceptar un riesgo no lo corrige: la comparación lo muestra como aceptado y no como resuelto." } ] }, diff --git a/web/messages/es/docs/monitor/audit-report/changes.json b/web/messages/es/docs/monitor/audit-report/changes.json index 9c6d4364..8c7566b1 100644 --- a/web/messages/es/docs/monitor/audit-report/changes.json +++ b/web/messages/es/docs/monitor/audit-report/changes.json @@ -1,11 +1,11 @@ { "meta": { "title": "Cambios | Auditoría e informes", - "description": "El registro de cambios de Auditoría e informes: qué ha cambiado ProxMenux en el host, qué había antes, la diferencia y si puede deshacerse." + "description": "Registro de cambios de Auditoría e informes: qué modificó ProxMenux en el host, el estado anterior, las diferencias y si puede deshacerse." }, "header": { "title": "Cambios", - "description": "El registro de las operaciones que ProxMenux realiza en el host y, cuando se capturó, el estado antes y después de cada una.", + "description": "Registro de las operaciones realizadas por ProxMenux en el host y, cuando se capturó, el estado anterior y posterior de cada una.", "section": "Auditoría e informes" }, "sections": [ @@ -14,25 +14,37 @@ "blocks": [ { "calloutInfo": { - "title": "Del script que se ejecutó al cambio que hizo", - "body": "Una función extensa puede cambiar solo dos líneas. El registro conserva cada operación concreta con el script, la función y la versión responsables, el recurso afectado, la diferencia y si puede deshacerse." + "title": "Del script ejecutado al cambio realizado", + "body": "Una función extensa puede cambiar solo dos líneas. El registro guarda cada operación concreta con el script, función y versión responsables, el recurso afectado, las diferencias y la posibilidad de deshacerla." } }, { "flow": { "nodes": [ - { "label": "Script", "detail": "función + versión" }, - { "label": "Captura", "detail": "contenido previo" }, - { "label": "Operación", "detail": "archivo · paquete · servicio" }, - { "label": "Registro", "detail": "atribución + diferencia" } + { + "label": "Script", + "detail": "función + versión" + }, + { + "label": "Captura", + "detail": "contenido previo" + }, + { + "label": "Operación", + "detail": "archivo · paquete · servicio" + }, + { + "label": "Registro", + "detail": "atribución + diferencia" + } ], - "caption": "La captura se toma al ejecutarse la operación y se consolida cuando el Monitor lee el registro." + "caption": "La captura se realiza al ejecutar la operación y se consolida cuando Monitor lee el registro." } }, { "figure": { "src": "/monitor/audit/changes-view.png", - "alt": "Vista Cambios de Auditoría e informes con las entradas agrupadas por opción de post-install y por script", + "alt": "Vista Cambios de Auditoría e informes con entradas agrupadas por opción de postinstalación y script", "caption": "La vista Cambios, con la diferencia de un archivo editado por ProxMenux." } } @@ -45,12 +57,27 @@ "blocks": [ { "table": { - "headers": ["Tipo", "Qué registra"], + "headers": [ + "Tipo", + "Qué registra" + ], "rows": [ - ["Configuración", "ProxMenux escribió, editó o eliminó un archivo, cambió un ajuste o alteró un servicio."], - ["Instalaciones", "ProxMenux añadió un paquete o componente, y se registran los paquetes que aparecieron realmente."], - ["Ejecuciones", "ProxMenux ejecutó un comando; lo que cambió depende del propio comando."], - ["Aplicado", "Una función se aplicó antes de que existiera el registro; el estado previo no se capturó."] + [ + "Configuración", + "ProxMenux escribió, editó o eliminó un archivo, cambió un ajuste o alteró un servicio." + ], + [ + "Instalaciones", + "ProxMenux añadió un paquete o componente, y se registran los paquetes que aparecieron realmente." + ], + [ + "Ejecuciones", + "ProxMenux ejecutó un comando; sus efectos dependen del propio comando." + ], + [ + "Aplicado", + "Una función se aplicó antes de que existiera el registro; no se capturó su estado anterior." + ] ] } } @@ -62,11 +89,23 @@ "blocks": [ { "table": { - "headers": ["Sección", "Contenido"], + "headers": [ + "Sección", + "Contenido" + ], "rows": [ - ["Optimizaciones de post-install", "Agrupadas por la opción de post-install que seleccionó el usuario."], - ["Scripts de ProxMenux", "GPU, Coral, red, almacenamiento, seguridad, utilidades y el resto de scripts instrumentados, incluidos el instalador de ProxMenux y ProxMenux Monitor."], - ["Paquetes y utilidades instalados", "Software que ProxMenux instaló en el host."] + [ + "Optimizaciones de post-install", + "Agrupadas por la opción de post-install que seleccionó el usuario." + ], + [ + "Scripts de ProxMenux", + "GPU, Coral, red, almacenamiento, seguridad, utilidades y el resto de scripts instrumentados, incluidos el instalador de ProxMenux y ProxMenux Monitor." + ], + [ + "Paquetes y utilidades instalados", + "Software instalado por ProxMenux en el host." + ] ] } }, @@ -88,7 +127,7 @@ "Las líneas añadidas y eliminadas.", "Los paquetes que se añadieron realmente.", "La transición de estado de un servicio.", - "Deshacer esto: Restaura exactamente lo que había, Elimina el fichero (no había ninguno antes), Se puede desinstalar el paquete, un deshacer parcial o No se puede deshacer desde el registro." + "Deshacer esto: Restaura exactamente lo que había, Elimina el archivo (no existía antes), Se puede desinstalar el paquete, una reversión parcial o No puede deshacerse desde el registro." ] } } @@ -96,10 +135,10 @@ }, { "id": "before", - "title": "Qué significa el estado previo", + "title": "Qué significa el estado anterior", "blocks": [ { - "p": "El estado previo puede ser contenido capturado, un archivo creado por primera vez o un estado desconocido. Los cambios hechos antes de que existiera el registro no pueden reconstruirse; al volver a ejecutar la función se captura primero el estado encontrado en ese momento." + "p": "El estado anterior puede ser contenido capturado, un archivo creado por primera vez o un estado desconocido. Los cambios anteriores al registro no pueden reconstruirse; al volver a ejecutar la función, primero se captura el estado encontrado en ese momento." } ] }, @@ -125,21 +164,42 @@ "blocks": [ { "table": { - "headers": ["Elemento", "Comportamiento"], + "headers": [ + "Elemento", + "Comportamiento" + ], "rows": [ - ["Entradas", "Se conservan en el host; del registro no se elimina nada automáticamente."], - ["Contenido capturado", "Un objeto capturado se conserva mientras alguna entrada lo referencia."], - ["Tamaño de una captura", "El contenido de más de 1 MiB no se guarda entero; la entrada registra que la captura se omitió por su tamaño."], - ["Lectura", "El Monitor no carga objetos guardados de más de 2 MiB."], - ["Diferencia", "Se muestran como máximo 400 líneas, y una diferencia más larga se marca como truncada."], - ["Listado", "La API devuelve 200 entradas por petición por defecto y hasta 1000."] + [ + "Entradas", + "Se conservan en el host; del registro no se elimina nada automáticamente." + ], + [ + "Contenido capturado", + "Un objeto capturado se conserva mientras alguna entrada lo referencia." + ], + [ + "Tamaño de una captura", + "El contenido de más de 1 MiB no se guarda entero; la entrada registra que la captura se omitió por su tamaño." + ], + [ + "Lectura", + "El Monitor no carga objetos guardados de más de 2 MiB." + ], + [ + "Diferencia", + "Se muestran como máximo 400 líneas; una diferencia más larga se marca como truncada." + ], + [ + "Listado", + "La API devuelve por defecto 200 entradas por petición, con un máximo de 1000." + ] ] } }, { "calloutWarning": { - "title": "Conservar el contenido no es deshacer automáticamente", - "body": "El contenido previo a un cambio puede consultarse y restaurarse a mano, pero la vista Cambios no revierte operaciones. Una entrada de ejecución registra el comando sin conocer todos los efectos de la herramienta que ejecutó." + "title": "Guardar el contenido no implica deshacer automáticamente", + "body": "El contenido anterior puede consultarse y restaurarse a mano, pero la vista Cambios no revierte operaciones. Una entrada de ejecución registra el comando sin conocer todos los efectos de la herramienta ejecutada." } } ] diff --git a/web/messages/es/docs/monitor/audit-report/index.json b/web/messages/es/docs/monitor/audit-report/index.json index 520624fe..b4bf8e0c 100644 --- a/web/messages/es/docs/monitor/audit-report/index.json +++ b/web/messages/es/docs/monitor/audit-report/index.json @@ -1,11 +1,11 @@ { "meta": { "title": "Auditoría e informes | ProxMenux Monitor", - "description": "Evaluación de un nodo Proxmox VE, registro de lo que ProxMenux ha cambiado en él y declaración de lo que se espera de sus invitados y almacenamientos, con informes imprimibles." + "description": "Evalúa un nodo Proxmox VE, registra los cambios de ProxMenux y declara qué se espera de sus invitados y almacenamiento, con informes imprimibles." }, "header": { "title": "Auditoría e informes", - "description": "Una evaluación del nodo, el registro de lo que ProxMenux ha cambiado en él y la declaración de lo que se espera de él, con documentos que pueden imprimirse o guardarse como PDF.", + "description": "Evaluación del nodo, registro de los cambios realizados por ProxMenux y declaración de expectativas, con documentos imprimibles o guardables en PDF.", "section": "ProxMenux Monitor" }, "sections": [ @@ -15,26 +15,47 @@ { "calloutInfo": { "title": "Tres vistas, tres preguntas", - "body": "Auditoría e informes separa los hechos del nodo, las intervenciones de ProxMenux y las expectativas declaradas para él. Una configuración que la evaluación no puede contrastar con una finalidad declarada se describe, no se presenta como un fallo." + "body": "Auditoría e informes separa los hechos del nodo, las intervenciones de ProxMenux y las expectativas declaradas. Si una configuración no puede contrastarse con una finalidad declarada, se describe sin considerarla un fallo." } }, { "cards": { "items": [ - { "icon": "shield", "title": "Evaluación: ¿cómo está el nodo?", "body": "Ejecuta las comprobaciones del perfil elegido, compone el inventario y clasifica lo que requiere atención, con la evidencia de cada resultado." }, - { "icon": "refresh", "title": "Cambios: ¿qué ha hecho ProxMenux?", "body": "Enumera los archivos, paquetes, servicios y comandos que han cambiado los scripts instrumentados de ProxMenux, con lo que había antes cuando se capturó." }, - { "icon": "fileText", "title": "Política: ¿qué se espera?", "body": "Declara qué invitados necesitan backup o deben arrancar con el host, qué almacenamiento es esencial y los umbrales de las comprobaciones." } + { + "icon": "shield", + "title": "Evaluación: ¿cómo está el nodo?", + "body": "Ejecuta las comprobaciones del perfil elegido, compone el inventario y clasifica lo que requiere atención, con la evidencia de cada resultado." + }, + { + "icon": "refresh", + "title": "Cambios: ¿qué ha hecho ProxMenux?", + "body": "Enumera los archivos, paquetes, servicios y comandos modificados por los scripts de ProxMenux con instrumentación de auditoría, e incluye el estado anterior cuando se capturó." + }, + { + "icon": "fileText", + "title": "Política: ¿qué se espera?", + "body": "Declara qué invitados necesitan copia de seguridad o deben arrancar con el host, qué almacenamiento es esencial y los umbrales de las comprobaciones." + } ] } }, { "flow": { "nodes": [ - { "label": "Evaluación", "detail": "hechos" }, - { "label": "Política", "detail": "contexto" }, - { "label": "Cambios", "detail": "intervenciones" } + { + "label": "Evaluación", + "detail": "hechos" + }, + { + "label": "Política", + "detail": "contexto" + }, + { + "label": "Cambios", + "detail": "intervenciones" + } ], - "caption": "La evaluación aporta los hechos, la política les da contexto y el registro recoge lo que ha hecho ProxMenux." + "caption": "La evaluación aporta los hechos, la política les da contexto y el registro recoge lo que hizo ProxMenux." } }, { @@ -52,11 +73,23 @@ "blocks": [ { "table": { - "headers": ["Función", "Qué hace"], + "headers": [ + "Función", + "Qué hace" + ], "rows": [ - ["Health Monitor", "Observa métricas y eventos de forma continua y puede generar notificaciones."], - ["Auditoría e informes", "Ejecuta una evaluación cuando se pide, documenta el nodo y compara ejecuciones entre sí."], - ["Registro de cambios", "Registra las operaciones que ProxMenux realiza a través de sus primitivas de auditoría."] + [ + "Monitor de estado", + "Observa métricas y eventos continuamente y puede generar notificaciones." + ], + [ + "Auditoría e informes", + "Ejecuta una evaluación bajo demanda, documenta el nodo y compara ejecuciones entre sí." + ], + [ + "Registro de cambios", + "Registra las operaciones realizadas por ProxMenux mediante sus primitivas de auditoría." + ] ] } } @@ -69,11 +102,31 @@ { "next": { "items": [ - { "label": "Evaluación e inventario", "href": "/docs/monitor/audit-report/assessment", "tail": "perfiles, resultados, riesgos aceptados e inventario." }, - { "label": "Cambios", "href": "/docs/monitor/audit-report/changes", "tail": "el registro de lo que ProxMenux ha cambiado en el host." }, - { "label": "Política", "href": "/docs/monitor/audit-report/policy", "tail": "invitados, almacenamiento y umbrales." }, - { "label": "Informes y comparaciones", "href": "/docs/monitor/audit-report/reports", "tail": "los seis documentos y la ejecución de referencia." }, - { "label": "Alcance y garantías", "href": "/docs/monitor/audit-report/scope", "tail": "fuentes, límites y datos guardados." } + { + "label": "Evaluación e inventario", + "href": "/docs/monitor/audit-report/assessment", + "tail": "perfiles, resultados, riesgos aceptados e inventario." + }, + { + "label": "Cambios", + "href": "/docs/monitor/audit-report/changes", + "tail": "el registro de lo que ProxMenux ha cambiado en el host." + }, + { + "label": "Política", + "href": "/docs/monitor/audit-report/policy", + "tail": "invitados, almacenamiento y umbrales." + }, + { + "label": "Informes y comparaciones", + "href": "/docs/monitor/audit-report/reports", + "tail": "los seis documentos y la ejecución de referencia." + }, + { + "label": "Alcance y garantías", + "href": "/docs/monitor/audit-report/scope", + "tail": "fuentes, límites y datos guardados." + } ] } } diff --git a/web/messages/es/docs/monitor/audit-report/policy.json b/web/messages/es/docs/monitor/audit-report/policy.json index e15244d7..b8463cb0 100644 --- a/web/messages/es/docs/monitor/audit-report/policy.json +++ b/web/messages/es/docs/monitor/audit-report/policy.json @@ -1,11 +1,11 @@ { "meta": { "title": "Política | Auditoría e informes", - "description": "La política del nodo en Auditoría e informes: backup, arranque y objetivo de recuperación de cada invitado, el papel de cada almacenamiento y los umbrales de las comprobaciones." + "description": "Política del nodo en Auditoría e informes: copias de seguridad, arranque automático y objetivo de recuperación de cada invitado, función de cada almacenamiento y umbrales de comprobación." }, "header": { "title": "Política", - "description": "La política declara lo que ninguna inspección puede deducir: para qué sirve cada invitado y almacenamiento y los umbrales que aplican las comprobaciones.", + "description": "La política declara lo que una inspección no puede deducir: la finalidad de cada invitado y almacenamiento y los umbrales que deben aplicar las comprobaciones.", "section": "Auditoría e informes" }, "sections": [ @@ -34,11 +34,27 @@ "blocks": [ { "table": { - "headers": ["Campo", "Valores", "Efecto en la evaluación"], + "headers": [ + "Campo", + "Valores", + "Efecto en la evaluación" + ], "rows": [ - ["Backup", "Obligatorio, No obligatorio, Sin especificar", "La falta de backup es una advertencia si es obligatorio, una observación si no se especifica, y queda fuera del recuento si no es obligatorio."], - ["Arranque", "Obligatorio, No obligatorio, Sin especificar", "Si el invitado debe arrancar con el host."], - ["Objetivo de recuperación", "Horas", "La antigüedad máxima aceptable del último backup."] + [ + "Backups", + "Obligatorio, No obligatorio, Sin especificar", + "La falta de backup es una advertencia si es obligatorio, una observación si no se especifica, y queda fuera del recuento si no es obligatorio." + ], + [ + "Arranque automático", + "Obligatorio, No obligatorio, Sin especificar", + "Si el invitado debe arrancar con el host." + ], + [ + "Objetivo de recuperación", + "Horas", + "La antigüedad máxima aceptable del último backup." + ] ] } } @@ -47,30 +63,30 @@ { "id": "storage", "title": "Almacenamiento", - "intro": "Cada almacenamiento del nodo se declara Esencial, Opcional o Sin especificar.", "blocks": [ { "p": "Un almacenamiento inaccesible se presenta como crítico cuando se declara esencial o sirve a un invitado en marcha, como advertencia cuando su papel no se especifica, y como observación cuando se declara opcional." } - ] + ], + "intro": "Cada almacenamiento del nodo se declara Esencial, Opcional o Sin especificar." }, { "id": "thresholds", "title": "Umbrales", - "intro": "Un umbral vacío usa el valor de fábrica, que se muestra como texto de ejemplo.", + "intro": "Un umbral vacío usa el valor incluido por defecto, mostrado como texto de ejemplo.", "blocks": [ { "list": { "items": [ - "Revisión de capacidad de almacenamiento (%) y revisión de ocupación de thin pool (%).", - "Ratio de sobreaprovisionamiento thin y ratio de sobreasignación de memoria.", + "Revisión de capacidad de almacenamiento (%) y ocupación del thin pool (%).", + "Ratio de sobreaprovisionamiento thin y de sobreasignación de memoria.", "Intervalo de scrub de ZFS (días).", - "Plazo de respaldo para la antigüedad (días) y margen sobre el calendario (ratio).", + "Plazo alternativo para la antigüedad del backup (días) y margen sobre el calendario (ratio).", "Aviso de caducidad de certificado (días).", "Vida útil del disco (horas) y ventana de errores de disco recientes (días).", - "Antigüedad del informe de Lynis (días) y antigüedad de los índices de paquetes (días).", - "Journal frente a su tope (%).", - "Revisión de espacio del sistema de archivos (%) y revisión de inodos del sistema de archivos (%)." + "Antigüedad del informe de Lynis (días) y del índice de paquetes (días).", + "Uso del journal respecto a su límite (%).", + "Revisión del espacio (%) y de los inodos (%) del sistema de archivos." ] } } @@ -81,12 +97,12 @@ "title": "Cómo se guarda la política", "blocks": [ { - "p": "La declaración se valida y se guarda de forma atómica en /usr/local/share/proxmenux/audit_policy.json. Cada guardado lleva una revisión: si la declaración cambió en otra sesión, el borrador no se guarda y la vista ofrece recargar la declaración guardada." + "p": "La declaración se valida y guarda de forma atómica en /usr/local/share/proxmenux/audit_policy.json. Cada guardado incluye una revisión: si otra sesión cambió la declaración, el borrador no se guarda y la vista ofrece recargar la versión guardada." }, { "calloutWarning": { "title": "La política nunca se deduce", - "body": "ProxMenux no añade ningún requisito por su cuenta. Un campo vacío conserva el valor de fábrica o queda sin especificar, y una declaración parcial solo afecta a los elementos que nombra." + "body": "ProxMenux no añade requisitos por su cuenta. Un campo vacío conserva el valor incluido por defecto o queda sin especificar; una declaración parcial solo afecta a los elementos que menciona." } } ] diff --git a/web/messages/es/docs/monitor/audit-report/reports.json b/web/messages/es/docs/monitor/audit-report/reports.json index 07b63261..9dbd2930 100644 --- a/web/messages/es/docs/monitor/audit-report/reports.json +++ b/web/messages/es/docs/monitor/audit-report/reports.json @@ -1,11 +1,11 @@ { "meta": { "title": "Informes y comparaciones | Auditoría e informes", - "description": "Los seis documentos de Auditoría e informes, cómo se imprimen o guardan como PDF y cómo se comparan las ejecuciones con una ejecución de referencia." + "description": "Los seis documentos de Auditoría e informes, su impresión o guardado en PDF y la comparación de ejecuciones con una referencia." }, "header": { "title": "Informes y comparaciones", - "description": "Seis documentos, cada uno compuesto para una pregunta distinta, y la comparación de cada ejecución con una ejecución de referencia.", + "description": "Seis documentos que responden a preguntas distintas y comparación de cada ejecución con una referencia.", "section": "Auditoría e informes" }, "sections": [ @@ -29,11 +29,17 @@ "items": [ { "title": "Auditoría completa", - "body": "Documenta el nodo de extremo a extremo como registro técnico.", + "body": "Documenta todo el nodo como registro técnico.", "href": "/monitor/audit/sample-audit-full-report.pdf", "facts": [ - { "label": "Comprobaciones", "value": "Todas las disponibles." }, - { "label": "Contenido", "value": "Resumen ejecutivo; identidad y clúster; hardware; red y latencia; almacenamiento; invitados; passthrough; aplicaciones; hallazgos con evidencia; fuentes y alcance." } + { + "label": "Comprobaciones", + "value": "Todas las comprobaciones disponibles." + }, + { + "label": "Contenido", + "value": "Resumen ejecutivo; identidad y clúster; hardware; red y latencia; almacenamiento; invitados; passthrough; aplicaciones; hallazgos con evidencia; fuentes y alcance." + } ] }, { @@ -41,8 +47,14 @@ "body": "Muestra lo que requiere atención sin el inventario completo.", "href": "/monitor/audit/sample-audit-diagnostic-report.pdf", "facts": [ - { "label": "Comprobaciones", "value": "Las mismas que la auditoría completa." }, - { "label": "Contenido", "value": "Identidad mínima; hallazgos críticos; advertencias; observaciones relevantes; lecturas sin verificar y acciones prioritarias. Deja fuera diagramas, inventario y anexos extensos." } + { + "label": "Comprobaciones", + "value": "Las mismas que la auditoría completa." + }, + { + "label": "Contenido", + "value": "Identidad mínima; hallazgos críticos; advertencias; observaciones relevantes; lecturas sin verificar y acciones prioritarias. Deja fuera diagramas, inventario y anexos extensos." + } ] }, { @@ -50,8 +62,14 @@ "body": "Describe lo que existe en el nodo sin evaluarlo.", "href": "/monitor/audit/sample-audit-inventory-report.pdf", "facts": [ - { "label": "Comprobaciones", "value": "Ninguna; no se clasifica ningún hallazgo." }, - { "label": "Contenido", "value": "Identidad; clúster; CPU y memoria; placa, BIOS y controladoras; red; almacenamiento; VM y LXC; passthrough; aplicaciones y elementos gestionados por ProxMenux." } + { + "label": "Comprobaciones", + "value": "Ninguna; no se clasifica ningún hallazgo." + }, + { + "label": "Contenido", + "value": "Identidad; clúster; CPU y memoria; placa, BIOS y controladoras; red; almacenamiento; VM y LXC; passthrough; aplicaciones y elementos gestionados por ProxMenux." + } ] }, { @@ -59,8 +77,14 @@ "body": "Abarca la exposición y los controles de acceso al nodo.", "href": "/monitor/audit/sample-audit-security-report.pdf", "facts": [ - { "label": "Comprobaciones", "value": "El área de seguridad, más los privilegios de los contenedores, las actualizaciones, los repositorios y la cadena APT." }, - { "label": "Contenido", "value": "Identidad y clúster; red y latencia; acceso; cortafuegos; 2FA; certificados; privilegios; actualizaciones; repositorios; estado y antigüedad de Lynis." } + { + "label": "Comprobaciones", + "value": "El área de seguridad, más los privilegios de los contenedores, las actualizaciones, los repositorios y la cadena APT." + }, + { + "label": "Contenido", + "value": "Identidad y clúster; red y latencia; acceso; cortafuegos; 2FA; certificados; privilegios; actualizaciones; repositorios; estado y antigüedad de Lynis." + } ] }, { @@ -68,8 +92,14 @@ "body": "Comprueba que la protección declarada existe y que sus backups son utilizables.", "href": "/monitor/audit/sample-audit-backup-report.pdf", "facts": [ - { "label": "Comprobaciones", "value": "El área de backups, más la conectividad del almacenamiento y la entrega de notificaciones." }, - { "label": "Contenido", "value": "Cobertura por invitado; objetivo de recuperación declarado; antigüedad y resultado; destino; retención; verificación; trabajos fallidos; recuperación y fuentes incompletas." } + { + "label": "Comprobaciones", + "value": "El área de backups, más la conectividad del almacenamiento y la entrega de notificaciones." + }, + { + "label": "Contenido", + "value": "Cobertura por invitado; objetivo de recuperación declarado; antigüedad y resultado; destino; retención; verificación; trabajos fallidos; recuperación y fuentes incompletas." + } ] }, { @@ -77,8 +107,14 @@ "body": "Mide el margen de crecimiento y las señales de agotamiento o envejecimiento.", "href": "/monitor/audit/sample-audit-capacity-report.pdf", "facts": [ - { "label": "Comprobaciones", "value": "Las áreas de almacenamiento y hardware, más memoria, swap, journal y el sistema de archivos del host." }, - { "label": "Contenido", "value": "Ocupación y umbrales; thin pools; sobreaprovisionamiento; memoria; inodos; ZFS; temperaturas; horas de funcionamiento; errores SMART y vida útil de NVMe/SSD." } + { + "label": "Comprobaciones", + "value": "Las áreas de almacenamiento y hardware, más memoria, swap, journal y el sistema de archivos del host." + }, + { + "label": "Contenido", + "value": "Ocupación y umbrales; thin pools; sobreaprovisionamiento; memoria; inodos; ZFS; temperaturas; horas de funcionamiento; errores SMART y vida útil NVMe/SSD." + } ] } ] @@ -92,7 +128,7 @@ } }, { - "p": "Un documento contiene la identidad del nodo y la fecha de la evaluación, el resultado ejecutivo, un resumen por áreas, la estructura de hardware, red y almacenamiento, la protección de los invitados, los hallazgos con su evidencia, las fuentes que no pudieron leerse, y el alcance y la política aplicada, en la medida en que cada perfil los incluye." + "p": "Cada perfil incluye, según corresponda, identidad del nodo y fecha de evaluación, resumen ejecutivo, resumen por áreas, estructura de hardware, red y almacenamiento, protección de invitados, hallazgos con evidencia, fuentes ilegibles y alcance y política aplicados." } ] }, @@ -103,10 +139,22 @@ { "steps": { "items": [ - { "title": "Ejecutar", "body": "Una evaluación se ejecuta con el perfil seleccionado en Informe." }, - { "title": "Revisar", "body": "La ejecución terminada muestra sus hallazgos, las fuentes que no pudo leer y la política que aplicó." }, - { "title": "Generar informe", "body": "Generar informe abre la vista preparada como documento." }, - { "title": "Imprimir", "body": "Imprimir o guardar como PDF abre el diálogo de impresión del navegador, donde se selecciona una impresora o Guardar como PDF." } + { + "title": "Ejecutar", + "body": "La evaluación usa el perfil seleccionado en Informe." + }, + { + "title": "Revisar", + "body": "La ejecución terminada muestra sus hallazgos, las fuentes que no pudo leer y la política que aplicó." + }, + { + "title": "Generar informe", + "body": "Generar informe abre la vista preparada como documento." + }, + { + "title": "Imprimir", + "body": "Imprimir o guardar como PDF abre el diálogo de impresión del navegador para elegir una impresora o Guardar como PDF." + } ] } }, @@ -121,37 +169,76 @@ { "id": "compare", "title": "Comparar con una ejecución de referencia", - "intro": "Usar como referencia marca una ejecución terminada como referencia. Las ejecuciones posteriores se comparan con ella y sus hallazgos se separan en:", + "intro": "Usar como referencia marca una ejecución terminada. Las siguientes se comparan con ella y sus hallazgos se agrupan en:", "blocks": [ { "table": { - "headers": ["Grupo", "Significado"], + "headers": [ + "Grupo", + "Significado" + ], "rows": [ - ["Nuevos", "Presentes ahora y no antes."], - ["Empeoraron", "Siguen presentes, y son más graves o afectan a más que antes."], - ["Mejoraron", "Siguen presentes, pero son menos graves o afectan a menos que antes."], - ["Resueltos", "Ya no aparecen, y nadie los aceptó."], - ["Aceptados", "Ya no cuentan porque se aceptó un riesgo, no porque haya cambiado el host."], - ["Ya no se evalúan", "Estaban antes y no aparecen en esta ejecución; nada ha verificado que hayan dejado de existir."] + [ + "Nuevos", + "Presentes ahora y no antes." + ], + [ + "Empeoraron", + "Siguen apareciendo, pero son más graves o afectan a más que antes." + ], + [ + "Mejoraron", + "Siguen apareciendo, pero son menos graves o afectan a menos que antes." + ], + [ + "Resueltos", + "Ya no aparecen y nadie los ha aceptado." + ], + [ + "Aceptados", + "Ya no cuentan porque se aceptó un riesgo, no porque haya cambiado el host." + ], + [ + "Ya no se evalúan", + "Aparecían antes pero no en esta ejecución; no se ha verificado que hayan desaparecido." + ] ] } }, { "table": { - "headers": ["Ejecución de referencia", "Comportamiento"], + "headers": [ + "Ejecución de referencia", + "Comportamiento" + ], "rows": [ - ["Marcarla", "Puede marcarse cualquier ejecución terminada; ninguna se marca automáticamente."], - ["Cambiarla", "Marcar otra ejecución mueve la referencia sin borrar el historial."], - ["Comparar", "Si no se seleccionan dos ejecuciones, la comparación usa la referencia y la ejecución seleccionada o la más reciente."], - ["Conservar ejecuciones", "Se conservan las 30 ejecuciones más recientes, y la ejecución de referencia nunca se elimina."], - ["Sin referencia", "La vista indica que todavía no se ha elegido una ejecución de referencia, así que no hay con qué comparar."] + [ + "Marcarla", + "Puede marcarse cualquier ejecución terminada; ninguna se marca automáticamente." + ], + [ + "Cambiarla", + "Marcar otra ejecución cambia la referencia sin borrar el historial." + ], + [ + "Comparar", + "Si no se seleccionan dos ejecuciones, la comparación usa la referencia y la ejecución seleccionada o la más reciente." + ], + [ + "Conservar ejecuciones", + "Se conservan las 30 ejecuciones más recientes; la de referencia nunca se elimina." + ], + [ + "Sin referencia", + "La vista indica que aún no se ha elegido una ejecución de referencia, así que no hay con qué comparar." + ] ] } }, { "calloutWarning": { "title": "Un informe describe un momento", - "body": "Una evaluación no certifica un periodo completo. Los resultados antiguos dejan de describir el estado actual; la vista muestra la antigüedad de la última ejecución y cada fuente conserva el momento en que se recogió." + "body": "Una evaluación no certifica un periodo completo. Los resultados antiguos dejan de representar el estado actual; la vista muestra la antigüedad de la última ejecución y cada fuente conserva su momento de recogida." } } ] diff --git a/web/messages/es/docs/monitor/audit-report/scope.json b/web/messages/es/docs/monitor/audit-report/scope.json index a63870a3..9d91efa8 100644 --- a/web/messages/es/docs/monitor/audit-report/scope.json +++ b/web/messages/es/docs/monitor/audit-report/scope.json @@ -1,11 +1,11 @@ { "meta": { "title": "Alcance y garantías | Auditoría e informes", - "description": "De dónde proceden los datos de Auditoría e informes, qué queda fuera de su alcance, las garantías de su diseño y dónde se guardan sus datos." + "description": "Origen de los datos de Auditoría e informes, límites de su alcance, garantías del diseño y ubicación de sus datos." }, "header": { "title": "Alcance y garantías", - "description": "De dónde proceden los datos de una evaluación, qué queda fuera de su alcance y dónde guarda Auditoría e informes sus datos.", + "description": "De dónde proceden los datos de una evaluación, qué queda fuera de su alcance y dónde guarda sus datos Auditoría e informes.", "section": "Auditoría e informes" }, "sections": [ @@ -38,7 +38,7 @@ "El equipamiento de red fuera del host.", "Las dependencias remotas que el nodo no puede observar.", "El estado físico que el hardware no expone.", - "Las acciones manuales o de otro software, en el registro de cambios." + "El registro de cambios no incluye acciones manuales ni de otros programas." ] } }, @@ -62,7 +62,7 @@ "Una política validada y guardada de forma atómica.", "Riesgos aceptados con motivo y visibles.", "Atribución de los cambios al script y a la función.", - "Captura del estado anterior y posterior cuando está disponible.", + "Captura del estado anterior y posterior, cuando está disponible.", "Un resultado explícito cuando algo no puede medirse o capturarse." ] } @@ -75,20 +75,38 @@ "blocks": [ { "table": { - "headers": ["Datos", "Ubicación"], + "headers": [ + "Datos", + "Ubicación" + ], "rows": [ - ["Política", "/usr/local/share/proxmenux/audit_policy.json"], - ["Evaluaciones", "La base de datos de auditoría del Monitor"], - ["Objetos capturados", "/usr/local/share/proxmenux/changes/objects/"], - ["Entradas pendientes", "/usr/local/share/proxmenux/changes/spool/"], - ["Registro consolidado", "/usr/local/share/proxmenux/changes.db"] + [ + "Política", + "/usr/local/share/proxmenux/audit_policy.json" + ], + [ + "Evaluaciones", + "La base de datos de auditoría del Monitor" + ], + [ + "Objetos capturados", + "/usr/local/share/proxmenux/changes/objects/" + ], + [ + "Entradas pendientes", + "/usr/local/share/proxmenux/changes/spool/" + ], + [ + "Registro consolidado", + "/usr/local/share/proxmenux/changes.db" + ] ] } }, { "calloutInfo": { "title": "Una herramienta de revisión, no una certificación", - "body": "Auditoría e informes revisa, compara y documenta el nodo. Sus resultados se leen junto con la finalidad del sistema, la política declarada y las fuentes disponibles." + "body": "Auditoría e informes revisa, compara y documenta el nodo. Sus resultados se interpretan según la finalidad del sistema, la política declarada y las fuentes disponibles." } } ] diff --git a/web/messages/es/docs/monitor/dashboard/apps.json b/web/messages/es/docs/monitor/dashboard/apps.json index cf4751b3..d48fb992 100644 --- a/web/messages/es/docs/monitor/dashboard/apps.json +++ b/web/messages/es/docs/monitor/dashboard/apps.json @@ -10,7 +10,7 @@ }, "intro": { "title": "Un lanzador, no un instalador de aplicaciones", - "body": "La pestaña Apps no instala software ni descubre servicios por sí sola. Convierte los enlaces web guardados en una cuadrícula con búsqueda. Los enlaces que pertenecen a un LXC se configuran en la pestaña App del contenedor; los enlaces personalizados permiten incluir servicios de VMs, proxies inversos y paneles externos." + "body": "La pestaña Apps no instala ni descubre servicios. Convierte enlaces guardados en una cuadrícula con búsqueda. Los enlaces de LXC se configuran en su pestaña App; los personalizados permiten incluir servicios VM, proxies inversos y paneles externos." }, "sources": { "heading": "Qué aparece en Apps", @@ -31,12 +31,12 @@ }, { "source": "Enlace personalizado sin asociación", - "appears": "Cualquier destino HTTP(S), incluido un servicio externo o publicado mediante proxy inverso.", + "appears": "Cualquier destino HTTP(S), incluidos servicios externos o publicados mediante proxy inverso.", "managedFrom": "Apps → Editar" } ], "relationshipTitle": "Apps y la pestaña App del LXC tienen funciones diferentes", - "relationshipBody": "La pestaña App del LXC gestiona la identidad de la aplicación, sus enlaces web y el seguimiento opcional de versión. La pestaña principal Apps utiliza esos enlaces para ofrecer un acceso rápido. Por eso, al editar una tarjeta que pertenece a un LXC se vuelve a su registro original en lugar de crear una segunda configuración." + "relationshipBody": "La pestaña App del LXC gestiona identidad, enlaces web y seguimiento opcional de versión. Apps usa esos enlaces para abrirlos rápidamente. Editar una tarjeta LXC vuelve al registro del invitado sin duplicar la configuración." }, "cards": { "heading": "Cómo utilizar una tarjeta", @@ -45,7 +45,7 @@ "Pulsa la tarjeta para abrir su URL en una pestaña nueva del navegador.", "El logotipo utiliza primero el definido para el enlace web y, cuando corresponde, recurre al logotipo general de la aplicación.", "La etiqueta de categoría utiliza el mismo color y nombre que el enlace correspondiente en la pestaña App del LXC.", - "La etiqueta del invitado identifica la VM o el LXC asociado. Púlsala para abrir su modal; los enlaces de LXC abren directamente App y los de VM abren Estado.", + "La etiqueta del invitado identifica la VM o LXC asociado. Púlsala para abrir su ventana: LXC abre App y VM abre Estado.", "La flecha morada hacia arriba indica que existe una actualización para esa aplicación o imagen Docker concreta. No representa el total de actualizaciones del invitado." ] }, @@ -55,8 +55,8 @@ "items": [ "La búsqueda tiene en cuenta el nombre de la aplicación, el nombre del invitado, el VMID y la categoría.", "El filtro de categoría permite mostrar una categoría concreta o todas las aplicaciones.", - "Se puede ordenar por Nombre, ID o Categoría. Al ordenar por categoría se insertan encabezados entre los grupos de tarjetas.", - "El orden seleccionado se recuerda en este navegador. El texto de búsqueda y el filtro de categoría se restablecen al volver a la página.", + "Ordena por Nombre, ID o Categoría. Ordenar por categoría añade encabezados entre grupos de tarjetas.", + "El orden se recuerda en este navegador. Búsqueda y filtro de categoría se restablecen al volver a la página.", "La pestaña Apps permanece disponible aunque la cuadrícula esté vacía, de modo que se pueda añadir el primer enlace personalizado sin registrar antes una aplicación LXC." ] }, @@ -67,21 +67,41 @@ "Pulsa Añadir enlace en la barra de herramientas o en el estado vacío.", "Introduce un nombre y una URL completa que empiece por http:// o https://.", "Opcionalmente, añade un logotipo, elige o crea una categoría y asocia el enlace a una VM o un LXC.", - "Guarda el enlace. La nueva tarjeta se añade a la cuadrícula de inmediato.", - "Para modificar o eliminar un enlace personalizado, pulsa Editar y utiliza el lápiz de su tarjeta." + "Guarda el enlace. Su tarjeta aparece inmediatamente en la cuadrícula.", + "Para modificar o eliminar un enlace personalizado, pulsa Editar y el lápiz de su tarjeta." ], "colField": "Campo", "colRequired": "Obligatorio", "colPurpose": "Finalidad", "fields": [ - { "field": "Nombre", "required": "Sí", "purpose": "Título de la tarjeta y término de búsqueda." }, - { "field": "URL", "required": "Sí", "purpose": "Destino HTTP(S) completo que abre la tarjeta." }, - { "field": "URL del logotipo", "required": "No", "purpose": "Imagen remota que se muestra en la tarjeta." }, - { "field": "Categoría", "required": "No", "purpose": "Añade una etiqueta común y permite filtrar por categoría." }, - { "field": "Asociación a invitado", "required": "No", "purpose": "Vincula el enlace a una VM o un LXC y activa su acceso directo." } + { + "field": "Nombre", + "required": "Sí", + "purpose": "Título de la tarjeta y término de búsqueda." + }, + { + "field": "URL", + "required": "Sí", + "purpose": "Destino HTTP(S) completo que abre la tarjeta." + }, + { + "field": "URL del logotipo", + "required": "No", + "purpose": "Imagen remota que se muestra en la tarjeta." + }, + { + "field": "Categoría", + "required": "No", + "purpose": "Añade una etiqueta común y permite filtrar por categoría." + }, + { + "field": "Asociación al invitado", + "required": "No", + "purpose": "Vincula el enlace a una VM o un LXC y activa su acceso directo." + } ], "editTitle": "Edita la fuente original", - "editBody": "El modo de edición solo muestra lápices en los enlaces personalizados. Para cambiar una tarjeta generada desde una aplicación LXC registrada, abre la pestaña App de ese contenedor y edita allí el enlace web guardado." + "editBody": "El modo de edición solo muestra lápices en enlaces personalizados. Para una tarjeta de aplicación LXC, abre la pestaña App del invitado y cambia allí el enlace guardado." }, "categories": { "heading": "Categorías y señales de actualización", @@ -90,17 +110,17 @@ "El registro asistido por catálogo puede proponer una categoría para una aplicación LXC, pero el usuario siempre puede modificarla.", "Desde el mismo selector se pueden crear categorías propias y reutilizarlas después en el filtro.", "Los colores de las categorías son estables y se adaptan al tema claro u oscuro. El morado y el rojo se reservan para actualizaciones y estados de peligro.", - "En los enlaces web de Docker, ProxMenux relaciona la tarjeta con su contenedor o imagen y muestra el estado de actualización de esa imagen. Las actualizaciones de Docker Engine permanecen en la pestaña Updates del LXC." + "En Docker, la tarjeta se relaciona con su contenedor o imagen y muestra las actualizaciones de esa imagen. Las de Docker Engine permanecen en la pestaña Actualizaciones del LXC." ] }, "persistence": { "heading": "Persistencia y comportamiento de la caché", "intro": "El panel está diseñado para abrirse con los datos ya disponibles en el Monitor, sin volver a analizar todos los invitados.", "items": [ - "Los enlaces personalizados se guardan de forma atómica en /etc/proxmenux/custom_links.json y se cargan en memoria al iniciar el Monitor.", + "Los enlaces personalizados se guardan atómicamente en /etc/proxmenux/custom_links.json y se cargan en memoria al iniciar Monitor.", "Los enlaces registrados en LXCs siguen formando parte del registro guardado de cada aplicación; el panel Apps no los duplica en el archivo de enlaces personalizados.", "Al crear, editar o eliminar un enlace personalizado, la lista en memoria se actualiza de inmediato.", - "La preferencia de ordenación se guarda solo en el navegador. No se sincroniza entre dispositivos ni usuarios.", + "La preferencia de orden solo se guarda en este navegador, sin sincronizarse entre dispositivos o usuarios.", "La posición de Apps en la navegación principal se configura por separado en Ajustes → Orden de navegación." ] }, @@ -109,19 +129,46 @@ "colProblem": "Situación", "colResolution": "Solución", "rows": [ - { "problem": "Una aplicación LXC está registrada, pero no aparece ninguna tarjeta", "resolution": "Abre su pestaña App y añade al menos un enlace web. El seguimiento de versión por sí solo no crea una tarjeta en el lanzador." }, - { "problem": "La URL o el logotipo son incorrectos", "resolution": "Edita el enlace personalizado desde Apps o modifica el enlace web en la pestaña App del LXC correspondiente." }, - { "problem": "Falta un servicio Docker", "resolution": "Edita la aplicación Docker registrada y guarda el puerto web publicado por el servicio como enlace web." }, - { "problem": "La flecha morada corresponde a otra actualización Docker", "resolution": "Revisa el nombre y la descripción del enlace web para que se puedan relacionar con el contenedor o la imagen correctos." }, - { "problem": "Apps se abre antes que Resumen del sistema", "resolution": "El primer elemento guardado en Ajustes → Orden de navegación se convierte en la pestaña inicial. Restaura el orden predeterminado o mueve Resumen a la primera posición." } + { + "problem": "Una aplicación LXC está registrada, pero no aparece ninguna tarjeta", + "resolution": "Abre su pestaña App y añade al menos un enlace web. El seguimiento de versión por sí solo no crea una tarjeta en el lanzador." + }, + { + "problem": "La URL o el logotipo son incorrectos", + "resolution": "Edita el enlace personalizado desde Apps o modifica el enlace web en la pestaña App del LXC correspondiente." + }, + { + "problem": "Falta un servicio Docker", + "resolution": "Edita la aplicación Docker registrada y guarda el puerto web publicado por el servicio como enlace web." + }, + { + "problem": "La flecha morada corresponde a otra actualización Docker", + "resolution": "Revisa el nombre y la descripción del enlace web para que se puedan relacionar con el contenedor o la imagen correctos." + }, + { + "problem": "Apps se abre antes que Resumen del sistema", + "resolution": "El primer elemento guardado en Ajustes → Orden de navegación se convierte en la pestaña inicial. Restaura el orden predeterminado o mueve Resumen a la primera posición." + } ] }, "whereNext": { "heading": "Por dónde seguir", "items": [ - { "label": "Pestaña App del LXC", "href": "/docs/monitor/dashboard/vms-lxcs/app", "tail": " — registrar aplicaciones, enlaces web y seguimiento opcional de versión." }, - { "label": "Pestaña Updates del LXC", "href": "/docs/monitor/dashboard/vms-lxcs/updates", "tail": " — configurar y ejecutar actualizaciones de aplicaciones, Docker Engine e imágenes." }, - { "label": "Pestaña Ajustes", "href": "/docs/monitor/dashboard/settings#navigation-order", "tail": " — cambiar el orden de navegación y la pestaña inicial." } + { + "label": "Pestaña App del LXC", + "href": "/docs/monitor/dashboard/vms-lxcs/app", + "tail": " — registrar aplicaciones, enlaces web y seguimiento opcional de versión." + }, + { + "label": "Pestaña Updates del LXC", + "href": "/docs/monitor/dashboard/vms-lxcs/updates", + "tail": " — configurar y ejecutar actualizaciones de aplicaciones, Docker Engine e imágenes." + }, + { + "label": "Pestaña Ajustes", + "href": "/docs/monitor/dashboard/settings#navigation-order", + "tail": " — cambiar el orden de navegación y la pestaña inicial." + } ] } } diff --git a/web/messages/es/docs/monitor/dashboard/hardware.json b/web/messages/es/docs/monitor/dashboard/hardware.json index 71995ba0..167d8ddb 100644 --- a/web/messages/es/docs/monitor/dashboard/hardware.json +++ b/web/messages/es/docs/monitor/dashboard/hardware.json @@ -1,6 +1,6 @@ { "meta": { - "title": "ProxMenux Monitor — Panel: pestaña Hardware | ProxMenux Documentation", + "title": "ProxMenux Monitor — Panel: Hardware | Documentación de ProxMenux", "description": "La pestaña Hardware inventaría la máquina física: CPU y placa base, módulos de memoria, sensores térmicos, GPUs (con monitorización en tiempo real por slot e instalador de drivers en un clic), aceleradoras Coral TPU, resumen de almacenamiento con comprobaciones de velocidad de enlace, listas completas de dispositivos PCI y USB, consumo de energía, PSUs, ventiladores y estado del UPS." }, "header": { @@ -14,29 +14,29 @@ }, "thresholds": { "title": "Colores de estado y umbrales aplicados aquí", - "intro": "Cada chip de temperatura y lectura de esta pestaña sigue la misma clasificación — verde por debajo de Warning, ámbar entre Warning y Critical, rojo en Critical y por encima. Valores por defecto recomendados que vienen con ProxMenux:", + "intro": "Cada indicador y lectura de temperatura usa la misma escala: verde por debajo de Advertencia, ámbar entre Advertencia y Crítico, rojo desde Crítico. Valores recomendados incluidos con ProxMenux:", "items": [ - "Temperatura de CPU — Warning 80 °C, Critical 90 °C.", - "Temperatura de disco — HDD 60/65 °C · SSD 70/75 °C · NVMe 80/85 °C · SAS 55/65 °C (warning / critical)." + "Temperatura de CPU: advertencia 80 °C, crítico 90 °C.", + "Temperatura de disco: HDD 60/65 °C · SSD 70/75 °C · NVMe 80/85 °C · SAS 55/65 °C (advertencia / crítico)." ], - "outro": "Cada valor es configurable por host — Settings → Health Monitor Thresholds es la fuente única de verdad y explica cómo ajustarlos." + "outro": "Los valores se configuran por host; Ajustes → Umbrales del monitor de salud documenta y centraliza su ajuste." }, "sections": { "heading": "Secciones", - "intro": "La pestaña renderiza de arriba abajo en este orden. Algunas secciones solo aparecen cuando el host tiene el hardware o la herramienta correspondiente instalada — se marcan (condicional) abajo.", - "systemInfoTitle": "System Information", + "intro": "Las secciones aparecen en este orden de arriba abajo. Algunas requieren el hardware o la herramienta correspondiente; se indican como (condicional).", + "systemInfoTitle": "Información del sistema", "systemInfoIntro": "Dos bloques uno al lado del otro, siempre presentes:", "systemInfoItems": [ - "CPU — nombre del modelo, microarquitectura, sockets / cores / threads, frecuencia base / boost, flags de virtualización (VT-x / AMD-V), topología de caché.", - "Placa base — vendor, modelo, versión de BIOS, fecha de BIOS, UUID SMBIOS. Útil para emparejar con páginas de descarga del fabricante al buscar actualizaciones de firmware." + "CPU: modelo, microarquitectura, sockets, núcleos, hilos, frecuencias base y turbo, capacidades de virtualización (VT-x / AMD-V) y topología de caché.", + "Placa base: fabricante, modelo, versión y fecha de BIOS y UUID SMBIOS. Sirve para localizar la página de descarga correcta del fabricante al buscar firmware." ], - "memoryTitle": "Memory Modules", - "memoryBody": "Una fila por slot poblado desde dmidecode: etiqueta del slot, tamaño del módulo, tipo (DDR4 / DDR5 / variantes ECC), velocidad (configurada y nominal), fabricante, part number y serial. Los slots vacíos se listan atenuados para que veas de un vistazo el margen de ampliación.", - "thermalTitle": "Thermal Monitoring", - "thermalIntro": "Siete sub-bloques alimentados por lm-sensors, sysfs y scrapers específicos por herramienta. Los sensores hwmon de almacenamiento se correlacionan con el dispositivo de bloques físico, por lo que cada unidad detectada incluye su modelo y la ruta /dev/.... Un bloque permanece oculto cuando no hay sensores en esa categoría.", + "memoryTitle": "Módulos de memoria", + "memoryBody": "Una fila por ranura ocupada según dmidecode: etiqueta, capacidad del módulo, tipo (DDR4 / DDR5 / variantes ECC), velocidad configurada y nominal, fabricante, referencia y número de serie. Las ranuras vacías aparecen atenuadas para mostrar el margen de ampliación.", + "thermalTitle": "Monitoreo Térmico", + "thermalIntro": "Siete bloques alimentados por lm-sensors, sysfs y lectores específicos de cada herramienta. Los sensores hwmon de almacenamiento se asocian al dispositivo de bloques físico, con su modelo y ruta /dev/.... Cada bloque se oculta si no hay sensores en su categoría.", "thermalItems": [ - "CPU — temperaturas de package y por core.", - "GPU — sensores de GPU discreta vía nvidia-smi / amdgpu_top / iGPU Intel. Incluye hot-spot y memory-junction cuando el driver los expone.", + "CPU: temperatura del encapsulado y de cada núcleo.", + "GPU: sensores de GPU dedicada mediante nvidia-smi / amdgpu_top y de iGPU Intel. Incluye punto caliente y unión de memoria cuando el controlador los ofrece.", "NVME — temperatura composite del controlador asociada a su namespace NVMe exacto.", "HDD — lecturas de drivetemp para dispositivos de bloques rotacionales.", "SSD — lecturas de drivetemp para dispositivos de bloques SATA/SAS no rotacionales.", @@ -45,16 +45,16 @@ ] }, "graphics": { - "heading": "Graphics Cards", - "intro": "Cada controlador de vídeo detectado renderiza como su propia tarjeta con vendor, modelo, tipo (Integrada / PCI / BMC), slot PCI (BDF), kernel driver y lista de módulos. La tarjeta también expone un control inline Switch Mode que alterna la GPU entre compartición LXC (driver nativo) y passthrough a VM (vfio-pci) — mira Switch GPU Mode (VM ↔ LXC) para entender qué pasa en el host cuando lo pulsas.", + "heading": "Tarjetas gráficas", + "intro": "Cada controlador de vídeo aparece en una tarjeta con fabricante, modelo, tipo (Integrada / PCI / BMC), dirección PCI (BDF), controlador del kernel y módulos. Cambiar modo alterna entre compartir la GPU con LXC (controlador nativo) y passthrough a VM (vfio-pci). Cambiar modo GPU (VM ↔ LXC) explica sus efectos en el host.", "vfioImageAlt": "Sección Graphics Cards mostrando una GPU integrada Matrox G200EH atada a mgag200 (Ready for LXC) y una NVIDIA Quadro P400 atada a vfio-pci (Ready for VM passthrough)", "vfioImageCaption": "Dos GPUs detectadas: el chip BMC Matrox está en el driver nativo y listo para LXC; la NVIDIA Quadro P400 está atada a vfio-pci, lista para passthrough a VM.", - "lxcImageAlt": "Sección Graphics Cards mostrando una iGPU Intel UHD Graphics en i915 y una NVIDIA Quadro P1000 en el driver nvidia, ambas etiquetadas Ready for LXC containers", + "lxcImageAlt": "Tarjetas gráficas: iGPU Intel UHD Graphics con i915 y NVIDIA Quadro P1000 con nvidia, ambas listas para contenedores LXC", "lxcImageCaption": "Mismo nodo después de devolver la tarjeta NVIDIA al driver nativo — ambas GPUs ahora Ready for LXC containers.", - "realtimeTitle": "Modal de monitorización en tiempo real", - "realtimeBody": "Pulsar una tarjeta de GPU abre una modal de monitorización por slot que sondea la herramienta del vendor adecuada cada tres segundos. La modal expone vendor, tipo, slot PCI, driver, módulo(s) del kernel, utilización en vivo de motores (Render/3D, Video, Blitter, VideoEnhance), clocks de gráficos y memoria, temperatura, consumo de potencia (cuando se reporta), uso de VRAM y una tabla Active Processes con carga de motor por proceso. Los datos se sirven desde /api/gpu/<slot>/realtime.", - "toolsIntro": "La herramienta de vendor usada por GPU:", - "headerVendor": "Vendor", + "realtimeTitle": "Ventana de monitorización en tiempo real", + "realtimeBody": "Pulsa una GPU para abrir su monitorización por ranura, que consulta la herramienta del fabricante cada tres segundos. Muestra fabricante, tipo, ranura PCI, controlador, módulos del kernel, uso de motores (Render/3D, Video, Blitter, VideoEnhance), frecuencias de gráficos y memoria, temperatura, consumo si está disponible, VRAM y procesos activos con carga por proceso. Datos de /api/gpu/<slot>/realtime.", + "toolsIntro": "Herramienta del fabricante usada para cada GPU:", + "headerVendor": "Proveedor", "headerTool": "Herramienta", "headerProject": "Proyecto", "tools": [ @@ -65,7 +65,7 @@ "projectHref": "https://developer.nvidia.com/nvidia-system-management-interface" }, { - "vendor": "Intel iGPU", + "vendor": "iGPU Intel", "tool": "intel_gpu_top (igt-gpu-tools)", "projectLabel": "gitlab.freedesktop.org", "projectHref": "https://gitlab.freedesktop.org/drm/igt-gpu-tools" @@ -78,97 +78,97 @@ }, { "vendor": "Matrox / ASPEED (BMC)", - "tool": "— (solo display)", + "tool": "— (solo visualización)", "projectLabel": "Detectado y etiquetado como BMC; sin bloque realtime." } ], - "nvidiaImageAlt": "Modal de monitorización de GPU para una NVIDIA Quadro P1000: vendor NVIDIA, driver nvidia cargado, clock gráfico 1.26 GHz, clock de memoria 2.50 GHz, temperatura 50 °C, todas las barras de utilización de motor al 0 %, sin procesos activos, memoria total 4096 MiB", - "nvidiaImageCaption": "NVIDIA Quadro P1000 con el driver propietario cargado — clocks, temperatura, barras de motores y procesos activos todos visibles.", - "intelImageAlt": "Modal de monitorización de GPU para una iGPU Intel UHD Graphics en driver i915, mostrando 11.31 W de consumo, 1 % de carga en motor de video y un proceso ffmpeg consumiendo 8 MB", + "nvidiaImageAlt": "Monitorización de NVIDIA Quadro P1000: fabricante NVIDIA, controlador nvidia cargado, frecuencia gráfica 1.26 GHz, memoria 2.50 GHz, temperatura 50 °C, motores al 0 %, sin procesos activos y memoria total 4096 MiB", + "nvidiaImageCaption": "NVIDIA Quadro P1000 con controlador propietario: frecuencias, temperatura, barras de uso de motores y procesos activos.", + "intelImageAlt": "Monitorización de iGPU Intel UHD Graphics con controlador i915: consumo 11.31 W, carga de vídeo 1 % y proceso ffmpeg con 8 MB", "intelImageCaption": "iGPU Intel con i915 activo. La tabla Active Processes recoge un job ffmpeg usando el motor de video.", - "amdImageAlt": "Modal de monitorización de GPU para una GPU integrada AMD Lucienne en driver amdgpu, con barras de utilización de motor al 0 % y amdgpu_top listado como proceso activo", - "amdImageCaption": "iGPU AMD monitorizada a través de amdgpu_top — la propia herramienta aparece como proceso activo porque es el backend de polling en vivo.", - "installTitle": "Instalar el driver NVIDIA desde la modal", - "installBody": "Cuando una GPU NVIDIA está atada a nouveau/nvidiafb (sin driver propietario instalado), el bloque realtime no puede leer clocks, potencia ni carga por proceso. La modal entonces reemplaza las métricas con un botón Install NVIDIA Drivers que conecta directamente con el mismo script documentado en Install NVIDIA Drivers (Host).", - "noDriverAlt": "Modal de monitorización de GPU para una NVIDIA Quadro P620 con módulos de kernel nvidiafb y nouveau cargados, un callout Extended Monitoring Not Available y un botón azul Install NVIDIA Drivers", + "amdImageAlt": "Monitorización de GPU integrada AMD Lucienne con amdgpu: motores al 0 % y amdgpu_top como proceso activo", + "amdImageCaption": "iGPU AMD monitorizada con amdgpu_top. La herramienta aparece como proceso activo porque obtiene los datos en vivo.", + "installTitle": "Instalar el controlador NVIDIA desde la ventana", + "installBody": "Si una GPU NVIDIA usa nouveau/nvidiafb sin controlador propietario, no se pueden leer frecuencias, consumo ni carga por proceso. La ventana muestra Instalar controladores NVIDIA, que ejecuta el script de Instalar controladores NVIDIA (Host).", + "noDriverAlt": "Monitorización de NVIDIA Quadro P620 con nvidiafb y nouveau cargados, aviso Monitorización ampliada no disponible y botón azul Instalar controladores NVIDIA", "noDriverCaption": "Sin driver propietario instalado todavía — la modal muestra un instalador de un solo clic.", - "promptAlt": "Diálogo de confirmación NVIDIA GPU Driver Installation listando las GPUs detectadas, contenedores LXC con passthrough NVIDIA y un par Yes/Cancel", + "promptAlt": "Confirmación de instalación de controladores NVIDIA, con GPU detectadas, contenedores LXC con passthrough NVIDIA y botones Sí/Cancelar", "promptCaption": "Resumen pre-instalación: GPUs detectadas, contenedores LXC que ya tienen passthrough NVIDIA y qué hará el script. No se toca nada hasta que confirmas.", "successAlt": "Salida de terminal mostrando el driver NVIDIA 580.105.08 instalado correctamente y nvidia-smi reportando una Quadro P620", "successCaption": "Instalación correcta — el .run de NVIDIA construido vía DKMS, el servicio de persistencia en su sitio y nvidia-smi reportando la GPU.", "warningTitle": "Elige una versión de driver que tu GPU soporte de verdad", - "warningBody": "Las ramas más nuevas de driver NVIDIA dejan de dar soporte a familias de GPU antiguas (p. ej. Maxwell / Kepler). Si la instalación termina pero nvidia-smi reporta \"No devices were found\" o DKMS da error, lo más probable es que la rama elegida no cubra tu GPU — vuelve a lanzar el instalador y elige una rama más antigua (legacy 470.x para tarjetas de era Kepler, etc.). NVIDIA publica la compatibilidad por GPU en la página oficial de búsqueda de drivers.", + "warningBody": "Las ramas nuevas de NVIDIA eliminan soporte para GPU antiguas, como Maxwell o Kepler. Si termina la instalación pero nvidia-smi muestra \"No devices were found\" o falla DKMS, puede que la rama no sea compatible. Repite el instalador con una rama anterior, como legacy 470.x para Kepler. Consulta la compatibilidad en la página oficial de búsqueda de controladores.", "whereGoIntro": "Por dónde seguir desde aquí:", "whereGoItems": [ - "Install NVIDIA Drivers (Host) — recorrido completo del instalador, matriz de compatibilidad de kernel, parche opcional NVENC y propagación a LXC.", - "Switch GPU Mode (VM ↔ LXC) — qué hace realmente el control inline Switch Mode.", - "Add GPU to VM (Passthrough) y Add GPU to LXC — asignación por primera vez de una GPU sin atar." + "Instalar controladores NVIDIA (Host): guía del instalador, matriz de compatibilidad del kernel, parche NVENC opcional y propagación a LXC.", + "Cambiar modo GPU (VM ↔ LXC): efectos del control Cambiar modo de la tarjeta.", + "Añadir GPU a VM (passthrough) y Añadir GPU a LXC: primera asignación de una GPU sin asociar." ] }, "coral": { "heading": "Coral TPU / Aceleradoras de IA", "subHeading": "(condicional)", - "intro": "Se renderiza cuando el host tiene dispositivos Google Coral u otras aceleradoras de IA conectadas. Cada dispositivo abre una modal con su tipo de conexión (M.2 / mini-PCIe / USB), ancho de enlace PCIe, vendor / product ID, kernel driver (apex para PCIe, libedgetpu para USB), módulos del kernel (gasket + apex), nodos de dispositivo (/dev/apex_*), estado del runtime Edge TPU, temperatura en vivo y los umbrales de aviso de hardware del firmware.", + "intro": "Aparece cuando hay dispositivos Google Coral u otras aceleradoras de IA conectadas. Cada dispositivo abre sus detalles: conexión (M.2 / mini-PCIe / USB), ancho PCIe, ID de fabricante/producto, soporte de software (apex del kernel para PCIe, libedgetpu de usuario para USB), módulos (gasket + apex), nodos (/dev/apex_*), estado del runtime Edge TPU, temperatura en vivo y umbrales de aviso del firmware.", "imageAlt": "Modal de detalle Coral Edge TPU: conexión PCIe / M.2, enlace PCIe 5.0 GT/s x1, vendor 1ac1:089a, kernel driver apex, módulos gasket y apex cargados, /dev/apex_0 presente, Edge TPU Runtime no instalado, temperatura 53.5 °C con umbrales de aviso de hardware", "imageCaption": "Coral M.2 con los módulos de kernel del host cargados, el nodo de dispositivo arriba y los avisos de temperatura del firmware expuestos. La línea del runtime se pone verde una vez instalado el runtime Edge TPU correspondiente.", - "pathsIntro": "Existen dos rutas de instalación dependiendo del form factor:", + "pathsIntro": "Hay dos vías de instalación según el formato:", "pathsItems": [ "M.2 / Mini-PCIe — el host necesita los módulos de kernel gasket + apex construidos vía DKMS para que el nodo de dispositivo /dev/apex_0 aparezca en el arranque.", "USB Accelerator — el host solo necesita el runtime de espacio de usuario Edge TPU (libedgetpu1-std) desde el repositorio APT de Google." ], - "outro": "Ambas las gestiona una única entrada de ProxMenux — Install Coral TPU on the Host — que auto-detecta lo que tienes. El contexto y el runtime oficial viven en coral.ai/docs. Una vez listo el lado del host, entrega el dispositivo a un contenedor con Add Coral TPU to LXC." + "outro": "Una sola entrada, Instalar Coral TPU en el host, detecta y gestiona ambos tipos. Consulta el contexto y runtime oficial en coral.ai/docs. Después, asígnalo a un contenedor con Añadir Coral TPU a LXC." }, "storage": { - "heading": "Storage Summary", - "intro": "Cada dispositivo de bloque que conoce el kernel, agrupado por tipo. Para cada disco obtienes el nombre del kernel (sda, nvme0n1, zram0 …), la etiqueta de tipo (SSD, HDD, NVMe SSD), la cadena del modelo y la información del enlace negociado. Pulsa cualquier disco para abrir una modal de info de hardware con modelo, serial, capacidad, interfaz y velocidad de enlace actual vs máxima.", + "heading": "Resumen de almacenamiento", + "intro": "Todos los dispositivos de bloques conocidos por el kernel, agrupados por tipo. Cada disco muestra su nombre (sda, nvme0n1, zram0…), tipo (SSD, HDD, NVMe SSD), modelo y enlace negociado. Pulsa para abrir modelo, número de serie, capacidad, interfaz y velocidad actual y máxima.", "imageAlt": "Tarjeta Storage Summary listando once dispositivos de bloque (SSDs SATA, HDDs SATA, SSDs NVMe y zram) con cadenas de modelo y velocidades de enlace negociadas; los dos discos NVMe muestran 3.0 x4 con la velocidad actual resaltada", - "imageCaption": "Once dispositivos en este nodo. Los enlaces SATA se imprimen como SATA <version>, <Gb/s> (current: ...); los discos NVMe se imprimen como <PCIe gen> x<width>.", - "nvmeBody": "Para los discos NVMe la línea por tarjeta muestra tanto el enlace negociado como el máximo que soporta el dispositivo. Cuando ambos no coinciden (p. ej. un SSD Gen3 x4 corriendo a 3.0 x1 porque está sentado en un slot del chipset cableado a un solo lane), la velocidad actual se renderiza en ámbar para que el downgrade sea visible de un vistazo — útil al diagnosticar discos inesperadamente lentos o después de que una actualización de BIOS reorganice los lanes.", + "imageCaption": "Once dispositivos en este nodo. Los enlaces SATA aparecen como SATA <version>, <Gb/s> (current: ...); los NVMe como <PCIe gen> x<width>.", + "nvmeBody": "La línea de cada NVMe compara el enlace negociado con el máximo admitido. Si difieren, como un SSD Gen3 x4 funcionando a 3.0 x1 en una ranura de un solo carril, el valor actual aparece en ámbar. Permite detectar enlaces limitados al investigar discos lentos o cambios de carriles tras actualizar BIOS.", "nvmeModalAlt": "Modal de detalle de disco NVMe para nvme0n1: tipo NVMe SSD, 953.9 GB de capacidad, velocidad actual de enlace 3.0 x1 resaltada en ámbar, velocidad máxima 3.0 x4, modelo WDC CL SN720, número de serie, interfaz PCIe/NVMe", - "nvmeModalCaption": "Modal NVMe mostrando el downgrade de lanes — el disco soporta x4 pero el slot está cableado x1.", - "outro": "Los datos SMART, los self-tests, el historial y el informe PDF de disco viven una pestaña a la derecha, en Panel: pestaña Almacenamiento. Los mismos datos alimentan el script en SMART Disk Health & Test — lanzar un test long desde el script escribe el JSON que el Monitor muestra en Storage → History." + "nvmeModalCaption": "Detalles NVMe con enlace limitado: el disco admite x4, pero la ranura está conectada a x1.", + "outro": "Los datos SMART, autopruebas, historial e informe PDF están en Panel: Almacenamiento. Los mismos datos alimentan Salud y pruebas SMART de discos. Una prueba larga desde el script escribe el JSON mostrado por Monitor en Almacenamiento → Historial." }, "pci": { - "heading": "PCI Devices", - "intro": "Cada dispositivo direccionable por PCI, identificado por su BDF PCI (Bus:Device.Function — p. ej. 03:00.0) y su clase de dispositivo (Storage Controller, USB Controller, Graphics Card, Network Controller, Audio Controller …). Cada tarjeta muestra el fabricante, el nombre del dispositivo y el kernel driver actualmente atado — que es el campo que realmente quieres al diagnosticar passthrough, grupos IOMMU o una tarjeta que el host no esté manejando correctamente.", + "heading": "Dispositivos PCI", + "intro": "Dispositivos PCI identificados por BDF PCI (Bus:Device.Function, p. ej. 03:00.0) y clase (Controlador de almacenamiento, Controlador USB, Tarjeta gráfica, Controlador de red, Controlador de audio…). Cada tarjeta muestra fabricante, nombre y controlador del kernel asociado, útil para diagnosticar passthrough, grupos IOMMU o controladores incorrectos.", "imageAlt": "Sección PCI Devices listando quince dispositivos agrupados por clase: storage controllers en ahci/nvme, USB controllers, tarjetas gráficas (una en vfio-pci, otra en el driver nativo), network controllers en igb / tg3, un audio controller junto a una GPU pasada por passthrough", "imageCaption": "Quince dispositivos en este nodo. Fíjate en la GPU y su función de audio compañera, ambas atadas a vfio-pci — esa es una tarjeta preparada para passthrough a VM.", "bdfTitle": "Leer el BDF", - "bdfBody": "03:00.0 significa bus PCI 03, dispositivo 00, función 0. Los dispositivos multifunción como las GPUs discretas suelen reclamar .0 para la GPU y .1 para la función de audio HDMI — ambos hay que pasarlos por passthrough juntos, por eso Switch GPU Mode también gestiona la limpieza de la función de audio huérfana al salir del modo VM." + "bdfBody": "03:00.0 indica bus PCI 03, dispositivo 00 y función 0. Las GPU dedicadas suelen usar .0 para gráficos y .1 para audio HDMI. Ambas funciones se pasan juntas a la VM; por eso Cambiar modo GPU limpia también el audio que quedaría sin asociar al salir del modo VM." }, "usb": { - "heading": "USB Devices", - "intro": "Cada dispositivo USB que enumera el host, con cadenas de fabricante / producto, versión USB, la dirección bus:device, el par vendor:product y el kernel driver. El renderer también clasifica roles comunes — Communications (sticks Z-Wave / Zigbee), UPS, almacenamiento, HID — para que veas de un vistazo cuál de tus sticks es cuál sin cruzar IDs.", - "imageAlt": "Tarjeta USB Devices listando tres dispositivos: un Z-Stick Z-Wave Aeotec, un coordinador Zigbee ConBee II y un UPS Ellipse ECO, cada uno con versión USB, dirección, vendor:product ID y driver atado", + "heading": "Dispositivos USB", + "intro": "Dispositivos USB con fabricante y producto, versión USB, dirección bus:device, ID vendor:product y controlador del kernel. Se clasifican por función: Comunicaciones (adaptadores Z-Wave / Zigbee), SAI, almacenamiento o HID. Así se identifican sin comparar sus ID.", + "imageAlt": "Dispositivos USB: Aeotec Z-Wave Z-Stick, coordinador Zigbee ConBee II y SAI Ellipse ECO, con versión USB, dirección, ID vendor:product y controlador asociado", "imageCaption": "Tres dispositivos USB — dos radios de domótica en usbfs y un UPS en usbfs (NUT le habla a través de libusb)." }, "power": { - "heading": "Power Consumption", + "heading": "Consumo de energía", "subHeading": "(condicional)", - "intro": "Se renderiza solo cuando el host expone telemetría de energía. Se exponen dos fuentes independientes cuando están disponibles:", + "intro": "Aparece si el host ofrece telemetría de potencia. Muestra dos fuentes independientes cuando están disponibles:", "items": [ - "Consumo total ACPI / IPMI — watios de todo el sistema desde un sensor a nivel de placa o el BMC. Típico en placas de servidor.", - "Consumo de package CPU — leído de los contadores Intel RAPL (o equivalente AMD). Útil para separar el consumo de CPU del resto del sistema en placas consumer que no exponen una cifra total." + "Consumo total ACPI / IPMI: potencia de todo el sistema desde un sensor de la placa o el BMC. Habitual en placas de servidor.", + "Consumo del encapsulado CPU: contadores Intel RAPL o equivalente AMD. Distingue el consumo de CPU del resto en placas de consumo sin sensor total." ], - "supplyImageAlt": "Sección Power Consumption mostrando 198 W de consumo total vía interfaz ACPI, más una tarjeta Power Supplies con dos PSUs ambas reportando OK (salida de 185 W y 5 W)", + "supplyImageAlt": "Consumo: 198 W totales por ACPI y dos fuentes de alimentación con estado OK y salida de 185 W y 5 W", "supplyImageCaption": "Placa de servidor con un único sensor de energía ACPI y PSUs duales reportadas a través de IPMI — la segunda PSU es la redundante, en idle a 5 W.", - "cpuImageAlt": "Sección Power Consumption en una placa consumer mostrando solo CPU Power 8.7 W vía Intel RAPL", - "cpuImageCaption": "Placa consumer sin sensor de todo el sistema — la sección cae a RAPL solo-CPU." + "cpuImageAlt": "Consumo en una placa de uso doméstico: solo 8.7 W de CPU medidos por Intel RAPL", + "cpuImageCaption": "Placa de uso doméstico sin sensor de consumo total: se muestra solo CPU mediante RAPL." }, "psu": { - "heading": "Power Supplies", + "heading": "Fuentes de alimentación", "subHeading": "(condicional)", - "body": "Máquinas con placa de servidor / PSU dual vía IPMI: presencia (PSU 1 / PSU 2 / …), voltaje de entrada, watios de salida, flag OK / failed. Lo primero que compruebas tras un parpadeo de luz en un nodo con PSUs redundantes." + "body": "En máquinas con placa de servidor o fuentes dobles, IPMI muestra presencia (PSU 1 / PSU 2 / …), tensión de entrada, potencia de salida y estado correcto/fallo. Compruébalo tras una interrupción eléctrica en nodos con fuentes redundantes." }, "fans": { - "heading": "System Fans", + "heading": "Ventiladores del sistema", "subHeading": "(condicional)", - "body": "RPM por ventilador con un pequeño sparkline (cuando se soporta). En placas sin reporte por ventilador la sección cae a una única lectura del ventilador de chasis." + "body": "RPM de cada ventilador con minigráfico de tendencia, si se admite. Sin datos individuales, muestra una sola lectura del ventilador del chasis." }, "ups": { - "heading": "UPS Status", + "heading": "Estado del SAI", "subHeading": "(condicional)", - "body": "Se renderiza cuando hay un servidor NUT (Network UPS Tools) configurado y accesible. Muestra: estado (online / on battery / charging / low battery), porcentaje de carga de batería, estimación de runtime, porcentaje de carga, voltaje de entrada, modelo y firmware. Los mismos datos alimentan la categoría Security & Certificates del Monitor de salud — un UPS que pasa a batería sale inmediatamente." + "body": "Aparece si hay un servidor NUT (Network UPS Tools) configurado y accesible. Muestra estado (en línea / batería / cargando / batería baja), carga de batería, autonomía estimada, porcentaje de carga soportada, tensión de entrada, modelo y firmware. Alimenta también Seguridad y certificados del monitor de salud: el paso a batería se señala inmediatamente." }, "dataCollected": { "heading": "Cómo se recopilan los datos", @@ -184,12 +184,12 @@ { "section": "Valores de sensores en vivo", "endpoint": "/api/hardware/live", - "source": "sensors (lm-sensors) junto con /sys/class/hwmon y /sys/block para identificar los dispositivos de almacenamiento. Las temperaturas permanecen en vivo; solo la topología hwmon-dispositivo se guarda en caché durante 60 segundos." + "source": "sensors (lm-sensors), /sys/class/hwmon y /sys/block identifican los dispositivos de almacenamiento. Las temperaturas son en vivo; solo se guarda en caché 60 segundos la asociación hwmon-dispositivo." }, { "section": "Historial de temperatura de CPU", "endpoint": "/api/temperature/history", - "source": "Serie temporal muestreada por el Monitor de salud cada 5 min y persistida a SQLite." + "source": "Serie temporal registrada cada 60 segundos por el recolector de temperatura y almacenada en SQLite." }, { "section": "Métricas en vivo de GPU", @@ -197,31 +197,31 @@ "source": "NVIDIA: nvidia-smi --query-gpu=.... Intel: intel_gpu_top. AMD: sysfs /sys/class/drm/cardN." } ], - "codeComment1": "# Cross-check del inventario contra la vista del SO", + "codeComment1": "# Contrastar el inventario con la información del sistema operativo", "codeComment2": "# Confirmar la tarjeta GPU que ve el panel" }, "whereNext": { "heading": "Por dónde seguir", "items": [ { - "label": "Install NVIDIA Drivers (Host)", + "label": "Instalar controladores NVIDIA (Host)", "href": "/docs/hardware/nvidia-host", - "tail": " — lo que ejecuta el botón de instalación de la modal de GPU." + "tail": " — script que ejecuta el botón de instalación de la ventana de GPU." }, { - "label": "Switch GPU Mode (VM ↔ LXC)", + "label": "Cambiar modo GPU (VM ↔ LXC)", "href": "/docs/hardware/switch-gpu-mode", "tail": " — lo que el conmutador de modo inline en cada tarjeta de GPU le hace al host." }, { - "label": "Install Coral TPU on the Host", + "label": "Instalar Coral TPU en el host", "href": "/docs/hardware/install-coral-tpu-host", - "tail": " — la instalación del módulo de kernel / runtime de Coral." + "tail": " — instalación del módulo del kernel y runtime de Coral." }, { - "label": "SMART Disk Health & Test", + "label": "Prueba de salud de disco SMART", "href": "/docs/disk-manager/smart-disk-test", - "tail": " — el script detrás de los datos SMART que muestra la vista en detalle de disco de la pestaña Almacenamiento." + "tail": " — script que produce los datos SMART de los detalles de disco en Almacenamiento." }, { "label": "Panel: pestaña Almacenamiento", @@ -231,12 +231,12 @@ { "label": "Monitor de salud", "href": "/docs/monitor/health-monitor", - "tail": " — la categoría CPU y Temperatura que consume los mismos sensores." + "tail": " — categoría CPU y Temperatura, que usa los mismos sensores." }, { "label": "Referencia de la API", "href": "/docs/monitor/api", - "tail": " — los endpoints de hardware y GPU." + "tail": " — endpoints de hardware y GPU." }, { "label": "Índice del panel", diff --git a/web/messages/es/docs/monitor/dashboard/index.json b/web/messages/es/docs/monitor/dashboard/index.json index fe8b5e74..71a9733c 100644 --- a/web/messages/es/docs/monitor/dashboard/index.json +++ b/web/messages/es/docs/monitor/dashboard/index.json @@ -1,16 +1,16 @@ { "meta": { - "title": "ProxMenux Monitor — Panel | ProxMenux Documentation", - "description": "El panel es la interfaz principal de ProxMenux Monitor: diez pestañas de contenido, incluido el lanzador Apps, además de la cabecera global y un orden de navegación configurable." + "title": "ProxMenux Monitor — Panel | Documentación de ProxMenux", + "description": "El panel es la interfaz principal de ProxMenux Monitor: diez pestañas, incluido el lanzador Apps, una cabecera global y un orden de navegación configurable." }, "header": { "title": "Panel", - "description": "El panel es la vista diaria de ProxMenux Monitor: diez pestañas de contenido, incluido el lanzador Apps, además de una cabecera global y un orden de navegación configurable.", + "description": "La vista diaria de ProxMenux Monitor: diez pestañas, incluido el lanzador Apps, una cabecera global y un orden de navegación configurable.", "section": "ProxMenux Monitor" }, "oneHeader": { "title": "Una cabecera, diez pestañas", - "body": "La cabecera (logo, nombre del nodo, información de estado, uptime, refresco, conmutador de tema) permanece visible en todo momento. La pestaña activa que hay debajo cambia el área de contenido entera. El color de la información de estado refleja la peor categoría del Monitor de salud — es el mismo dato visto desde el panel." + "body": "La cabecera (logo, nombre del nodo, indicador de estado, tiempo activo, actualización y tema) permanece visible. La pestaña activa cambia toda el área de contenido. El color del indicador refleja la peor categoría del Monitor de estado: el mismo dato mostrado en el panel." }, "tabs": { "heading": "Las diez pestañas", @@ -24,9 +24,9 @@ "owns": "Widgets de CPU, memoria y temperatura; contador de VMs y LXCs activos; gráficas históricas y resúmenes de almacenamiento y red. Es la pestaña inicial mientras no se personalice el orden de navegación." }, { - "name": "Apps", + "name": "Aplicaciones", "linksTo": "/docs/monitor/dashboard/apps", - "owns": "Lanzador unificado para enlaces web registrados en LXCs y enlaces personalizados, con categorías, búsqueda, acceso al invitado y señales de actualización por aplicación." + "owns": "Lanzador unificado de enlaces web de LXC registrados y enlaces personalizados, con categorías, búsqueda, accesos al invitado y señales de actualización por aplicación." }, { "name": "Almacenamiento", @@ -34,11 +34,11 @@ }, { "name": "Red", - "owns": "Cada interfaz (física / bond / bridge / OVS), IP/MAC, gráficas RX/TX, RRD histórica por interfaz." + "owns": "Interfaces físicas, bond, bridge y OVS, direcciones IP/MAC, gráficas RX/TX e histórico RRD por interfaz." }, { "name": "VMs y LXCs", - "owns": "Inventario de guests, vista en detalle de config / métricas / logs, acciones start / stop / reboot / shutdown." + "owns": "Inventario de invitados, detalles de configuración, métricas y registros, acciones de iniciar, detener, reiniciar y apagar." }, { "name": "Hardware", @@ -50,7 +50,7 @@ }, { "name": "Terminal", - "owns": "Shell en el navegador al host o a cualquier VM/CT, sobre xterm.js y WebSockets." + "owns": "Shell del host o de cualquier VM/CT en el navegador, con xterm.js sobre WebSockets." }, { "name": "Seguridad", @@ -58,19 +58,19 @@ }, { "name": "Ajustes", - "owns": "Idioma del Monitor, orden de navegación, canales de notificación, proveedor de IA, umbrales de salud, exclusiones e inventario de optimizaciones." + "owns": "Idioma de Monitor, orden de navegación, canales de notificación, proveedor IA, umbrales de estado, exclusiones e inventario de optimizaciones posteriores a la instalación." } ] }, "headerAnatomy": { "heading": "Anatomía de la cabecera", "items": [ - "Logo de ProxMenux. El logo cambia a la variante \"actualización disponible\" cuando se detecta una nueva release del Monitor.", - "Identidad del nodo — el nombre del nodo Proxmox resuelto desde pvesh get /nodes, con fallback a hostname.", - "Información del estado de salud — Healthy (verde), Warning (amarillo), Critical (rojo). Pulsa encima para abrir la modal del Monitor de salud. Aparece una insignia azul extra de info cuando hay items descartados que siguen dentro de su ventana de supresión.", - "Uptime — tiempo desde el último arranque del host, formateado de forma legible.", - "Botón de refresco — relanza todas las llamadas API en vivo sin recargar la página entera.", - "Conmutador de tema — claro / oscuro / sistema. Persiste en localStorage." + "Logo y nombre del producto a la izquierda. El logo adopta la variante «actualización disponible» cuando se detecta una versión más reciente de Monitor.", + "Identidad del nodo: nombre obtenido con pvesh get /nodes, usando hostname como alternativa.", + "Indicador de estado: Correcto (verde), Advertencia (amarillo), Crítico (rojo). Abre el Monitor de estado al pulsarlo. Una insignia azul info aparece si hay elementos descartados cuyo periodo de supresión sigue vigente.", + "Tiempo activo: tiempo de funcionamiento del host en formato legible.", + "Botón de actualización: repite las llamadas API de datos en directo sin recargar toda la página.", + "Selector de tema: claro, oscuro o sistema. Se guarda en localStorage." ] }, "whereNext": { @@ -79,7 +79,7 @@ { "label": "Pestaña Apps", "href": "/docs/monitor/dashboard/apps", - "tail": " — el lanzador unificado de enlaces web y su relación con las aplicaciones registradas en LXCs." + "tail": " — lanzador unificado de enlaces web y relación con las aplicaciones LXC registradas." }, { "label": "Pestaña Resumen del sistema", @@ -89,7 +89,7 @@ { "label": "Monitor de salud", "href": "/docs/monitor/health-monitor", - "tail": " — la modal detrás de la información de estado, vista en profundidad de las diez categorías." + "tail": " — ventana del indicador de estado, con detalle de diez categorías." }, { "label": "Arquitectura", diff --git a/web/messages/es/docs/monitor/dashboard/network.json b/web/messages/es/docs/monitor/dashboard/network.json index 7ab83bba..540d4847 100644 --- a/web/messages/es/docs/monitor/dashboard/network.json +++ b/web/messages/es/docs/monitor/dashboard/network.json @@ -1,16 +1,16 @@ { "meta": { - "title": "ProxMenux Monitor — Panel: pestaña Red | ProxMenux Documentation", - "description": "La pestaña Red inventaría cada interfaz del host: NICs físicas, bridges, bonds, VLANs y las interfaces virtuales de VM/LXC. La vista en detalle por interfaz muestra IP / MAC / estado / miembros del bond / tráfico desde el arranque y una gráfica RRD histórica." + "title": "ProxMenux Monitor — Panel: pestaña Red | Documentación de ProxMenux", + "description": "La pestaña Red enumera todas las interfaces del host: físicas, puentes, enlaces agrupados, VLAN e interfaces virtuales VM/LXC. El detalle muestra IP, MAC, estado, miembros del enlace agrupado, tráfico desde el arranque e historial RRD." }, "header": { "title": "Panel: pestaña Red", - "description": "Cada interfaz que reporta el kernel — NICs físicas, bridges, bonds, VLANs y puertos virtuales de VM/LXC — agrupadas en tres tarjetas. Cada fila es pulsable y abre una vista en detalle con direccionamiento, contadores de tráfico y datos RRD históricos.", + "description": "Todas las interfaces que detecta el kernel —físicas, puentes, enlaces agrupados, VLAN y puertos virtuales VM/LXC— se agrupan en tres tarjetas. Pulsa una fila para ver direcciones, contadores de tráfico e historial RRD.", "section": "ProxMenux Monitor · Panel" }, "intro": { - "title": "En vivo + histórico, ambos incluidos", - "body": "El estado en vivo viene de psutil.net_if_stats() y ip; el ancho de banda histórico del almacén RRD de Proxmox vía /api/network/<interface>/metrics. La página refresca cada ~5 segundos los contadores en vivo y obtiene datos RRD frescos bajo demanda para la gráfica." + "title": "Datos actuales e históricos", + "body": "El estado actual procede de psutil.net_if_stats() e ip; el historial de ancho de banda, del almacén RRD de Proxmox mediante /api/network/<interface>/metrics. Los contadores se actualizan cada 5 segundos aproximadamente y el gráfico obtiene datos RRD cuando se solicitan." }, "topRow": { "heading": "Fila superior: cuatro tarjetas de estadísticas", @@ -18,122 +18,122 @@ "headerWhat": "Qué muestra", "rows": [ { - "card": "Network Traffic", + "card": "Tráfico de red", "what": "Tasa agregada RX / TX a lo largo de todas las interfaces, formateada en la unidad correcta (bps / Kbps / Mbps / Gbps)." }, { - "card": "Active Interfaces", - "what": "Dos contadores: Physical X / Y y Bridges X / Y (activas sobre total). El primer contador que miras cuando algo deja de funcionar." + "card": "Interfaces activas", + "what": "Dos contadores: Physical X / Y y Bridges X / Y, con interfaces activas respecto al total. Es un primer punto de comprobación cuando algo deja de funcionar." }, { - "card": "Network Status", - "what": "Veredicto rápido — Healthy / Warning / Critical en función del estado del enlace, alcanzabilidad del gateway e integridad del bridge. Refleja la categoría Network Interfaces del Monitor de salud." + "card": "Estado de la red", + "what": "Estado rápido: Correcto / Aviso / Crítico según el enlace, la accesibilidad de la puerta de enlace y la integridad del puente. Refleja la categoría Interfaces de red de Health Monitor." }, { - "card": "Network Latency", - "what": "Round-trip time al gateway con un sparkline. Pulsar la tarjeta abre la modal Network Latency documentada más abajo — vista histórica + test de ping bajo demanda contra gateway / Cloudflare / Google con un informe PDF descargable." + "card": "Latencia de red", + "what": "Tiempo de ida y vuelta a la puerta de enlace con un minigráfico. Al pulsar, abre el diálogo Latencia de red descrito más abajo: historial y prueba de ping a petición contra la puerta de enlace, Cloudflare o Google, con informe PDF descargable." } ] }, "flow": { "heading": "Diagrama Network Flow", - "intro": "Entre la fila superior y las tres tarjetas de grupos, la pestaña renderiza una vista de topología en vivo llamada Network Flow. Dibuja cada camino que un paquete puede tomar a través del host — NICs físicas en un extremo, bridges en el medio, VMs y contenedores en el otro — con pulsos animados que muestran el tráfico rx/tx en tiempo real sobre cada enlace.", + "intro": "Entre la fila superior y las tres tarjetas aparece la topología en directo Network Flow. Muestra los recorridos de los paquetes: interfaces físicas en un extremo, puentes en medio y máquinas virtuales y contenedores en el otro. Los pulsos animados representan el tráfico rx/tx actual de cada enlace.", "imageAlt": "Diagrama Network Flow — NICs a la izquierda, host y bridges en el medio, VMs y LXCs a la derecha, con pulsos animados en cada conexión", "imageCaption": "Network Flow — nodos con código de color más cometas animados cuya dirección y grosor reflejan el tráfico en vivo.", "elementsTitle": "Qué muestra el diagrama", - "elementsIntro": "Cada nodo es una entidad del mismo inventario que usan las tarjetas de abajo, pero organizadas como topología para que las relaciones se vean de un vistazo:", + "elementsIntro": "Cada nodo representa una entidad del mismo inventario que las tarjetas inferiores. La disposición como topología permite ver sus relaciones de un vistazo:", "elements": [ - "NICs (ámbar) — cada interfaz física con enlace activo. Las interfaces reportadas como down se dibujan atenuadas.", - "Host (ámbar) — el propio host Proxmox, situado entre las NICs y los bridges. Renderizado como anclaje fijo; no clicable.", - "Bridges (cian) — bridges Linux y OVS. Sólo se dibujan los bridges que llevan al menos un guest activo; los bridges sin uso se ocultan para que el diagrama muestre lo que realmente mueve tráfico.", - "LXCs (cian) — contenedores en ejecución conectados a un bridge.", - "VMs (púrpura) — máquinas virtuales en ejecución conectadas a un bridge.", - "Los guests offline (VMs / contenedores parados) se ocultan." + "NIC (ámbar): interfaces físicas con enlace activo; las inactivas aparecen atenuadas.", + "Host (ámbar): el host Proxmox entre las interfaces físicas y los puentes. Es un punto fijo y no se puede pulsar.", + "Puentes (cian): puentes Linux y OVS con al menos una máquina invitada activa. Los que no se usan se ocultan para centrar el diagrama en el tráfico actual.", + "LXC (cian): contenedores en ejecución conectados a un puente.", + "VM (morado): máquinas virtuales en ejecución conectadas a un puente.", + "Las máquinas virtuales y los contenedores detenidos se ocultan." ], "pulsesTitle": "Qué codifica la animación", "pulsesBody": "Los cometas animados que viajan por cada arista representan tráfico en vivo:", "pulses": [ - "Dirección — un pulso que fluye hacia la NIC es tx del guest; hacia el guest es rx.", - "Grosor de trazo escala con el rate combinado rx+tx del guest. Un guest inactivo dibuja una línea animada tenue; uno con carga la dibuja gruesa.", - "Halo de la cabeza del cometa — templado hacia ~1 MB/s, caliente a ≥30 MB/s. Útil para detectar de un vistazo qué guest está dominando una NIC.", - "Click — cada nodo excepto el host es clicable y abre el mismo modal de detalle por interfaz documentado más abajo. Pulsar el host es intencionadamente un no-op — no hay modal a nivel de host en esta vista." + "Dirección: hacia la NIC significa tx de la máquina invitada; hacia la máquina, rx.", + "El grosor del trazo aumenta con la tasa rx+tx de la máquina invitada. Sin tráfico se mantiene una línea animada tenue; con mucho tráfico, la línea es gruesa.", + "Brillo de la cabeza del cometa: tono cálido hacia 1 MB/s e intenso a partir de 30 MB/s. Permite identificar qué máquina invitada concentra el tráfico de una NIC.", + "Clic: todos los nodos salvo el host abren el diálogo de detalle por interfaz descrito más abajo. Pulsar el host no tiene efecto; esta vista no incluye un diálogo para él." ], "useTitle": "Cuándo es útil", - "useBody": "Las tarjetas de grupos de abajo te dicen qué existe; el diagrama te dice cómo está conectado y por dónde fluye el tráfico ahora mismo. Patrones fáciles de ver de un vistazo: un bridge sin ningún guest activo conectado, dos guests pesados usando la misma NIC (candidato a cuello de botella), o una única VM saturando un enlace mientras el resto está tranquilo." + "useBody": "Las tarjetas muestran qué existe; el diagrama, cómo está conectado y por dónde fluye el tráfico. Permite detectar máquinas que comparten un puente, dos máquinas con mucho tráfico en una misma NIC —posible cuello de botella— o una VM que satura un enlace mientras las demás apenas transmiten." }, "groups": { "heading": "Tres grupos de interfaces", - "intro": "Bajo la fila superior, tres tarjetas dividen el inventario por rol. Cada tarjeta tiene su propia insignia de recuento de activas en la cabecera. El tipo de interfaz se identifica de un vistazo mediante una insignia coloreada en cada fila:", + "intro": "Tres tarjetas agrupan las interfaces por función. La cabecera de cada una indica cuántas están activas. Una etiqueta de color identifica el tipo de cada interfaz:", "badges": [ "Azul Physical — NIC real.", "Verde Bridge — bridge Linux o bridge OVS (vmbr*).", "Morado Bond — agregador bond / LACP / active-backup.", - "Cian VLAN — sub-interfaz VLAN (vmbr0.10, eno1.42, …)." + "Cian VLAN: subinterfaz VLAN (vmbr0.10, eno1.42, …)." ], - "clickable": "Cada fila es pulsable — física, virtual, bridge o bond — y abre la vista en detalle por interfaz descrita más abajo (info básica, IPs, contadores de tráfico, gráfica RX/TX histórica del almacén RRD de Proxmox).", - "physicalTitle": "Physical Interfaces", - "physicalBody": "Cada NIC que el kernel ve como un dispositivo real — eno1, enp4s0, eth0, wlp3s0, etc. Una fila por dispositivo con la insignia azul Physical y el estado del enlace. Los miembros del bond (NICs esclavizadas a un bond) también se muestran aquí, con una pista que apunta al bond padre.", - "bridgeTitle": "Bridge Interfaces", - "bridgeBody": "Bridges Linux (vmbr0, vmbr1, …) y los bridges OVS que gestiona Proxmox. Cada fila muestra la insignia verde Bridge, la interfaz física subyacente (cuando es un bridge de un solo puerto) y el estado del bridge. Los bonds visibles en esta capa reciben la insignia morada Bond; las sub-interfaces VLAN reciben la insignia cian VLAN.", - "vmTitle": "VM / LXC Interfaces", - "vmBody": "Las interfaces tap* y veth* creadas cuando arrancan los guests — una por NIC virtual. La cabecera de la tarjeta muestra X / Y Active; las filas enlazan con el VM/CT al que pertenecen, así que puedes saltar directamente al guest en la pestaña VMs y LXCs. Las entradas inactivas quedan por un instante después de que un guest se pare; envejecen y se eliminan en el siguiente ciclo de refresco." + "clickable": "Todas las filas se pueden pulsar: físicas, virtuales, puentes y bonds. Abren el detalle descrito más abajo: información básica, IP, contadores y gráfico histórico RX/TX del almacén RRD Proxmox.", + "physicalTitle": "Interfaces físicas", + "physicalBody": "Interfaces físicas reconocidas por el kernel: eno1, enp4s0, eth0, wlp3s0, etc. Cada dispositivo tiene una fila con etiqueta azul Physical y estado del enlace. Los miembros de un bond también aparecen, con una referencia al bond al que pertenecen.", + "bridgeTitle": "Interfaces de puente", + "bridgeBody": "Puentes Linux (vmbr0, vmbr1, …) y OVS gestionados por Proxmox. Cada fila muestra la etiqueta verde Bridge, la interfaz física subyacente si tiene un solo puerto y su estado. Los enlaces agrupados llevan la etiqueta morada Bond; las subinterfaces VLAN, la cian VLAN.", + "vmTitle": "Interfaces de VM / LXC", + "vmBody": "Interfaces tap* y veth* creadas al arrancar las máquinas invitadas, una por NIC virtual. La cabecera muestra X / Y Active y las filas enlazan a su VM/CT en la pestaña VMs y LXCs. Tras detener una máquina, las entradas inactivas desaparecen en el siguiente ciclo de actualización." }, "drillIn": { - "heading": "Vista en detalle por interfaz", - "intro": "Pulsar cualquier fila abre una modal con cinco bloques:", + "heading": "Detalle por interfaz", + "intro": "Al pulsar una fila, se abre un diálogo con cinco bloques:", "headerBlock": "Bloque", "headerContents": "Contenido", "rows": [ { - "block": "Basic Information", - "contents": "Nombre de la interfaz, tipo (física / bridge / bond / VLAN / vm), dirección MAC, estado (up / down), MTU y la interfaz física subyacente para los tipos no físicos." + "block": "Información básica", + "contents": "Nombre, tipo (física / puente / bond / VLAN / vm), MAC, estado (activo / inactivo), MTU e interfaz física subyacente para los tipos virtuales." }, { - "block": "Bond Members", - "contents": "Solo para bonds. Lista cada NIC esclavizada con el flag active / failed, el modo del bond (active-backup / 802.3ad / balance-alb / …) y la interfaz primaria cuando está configurada." + "block": "Miembros del bond", + "contents": "Solo para bonds: cada NIC integrante con estado activo o fallido, modo del bond (active-backup / 802.3ad / balance-alb / …) e interfaz principal si está configurada." }, { - "block": "IP Addresses", + "block": "Direcciones IP", "contents": "Cada dirección IPv4 / IPv6 con su longitud de prefijo. Las direcciones link-local autoconfiguradas se listan pero salen atenuadas." }, { "block": "Gráfica histórica", - "contents": "Ancho de banda RX / TX sobre el timeframe seleccionado (1 hora / 24 horas / 7 días / 30 días / 1 año), traído de /api/network/<interface>/metrics (RRD de Proxmox)." + "contents": "Ancho de banda RX/TX durante el periodo elegido (1 hora / 24 horas / 7 días / 30 días / 1 año), obtenido de /api/network/<interface>/metrics (RRD Proxmox)." }, { "block": "Tráfico desde el último arranque", - "contents": "Bytes y paquetes totales RX / TX desde el último arranque del host, más contadores de errores y descartes." + "contents": "Total de bytes y paquetes RX/TX desde el último arranque del host, con contadores de errores y descartes." } ], - "inactiveTitle": "Las interfaces inactivas siguen abriendo la vista en detalle", - "inactiveBody": "Para una interfaz down, la modal renderiza un pequeño banner \"Interface Inactive\" y omite los contadores en vivo. La configuración (direcciones, miembros del bond) y los datos históricos siguen mostrándose — útil al diagnosticar por qué falló algo y cuándo." + "inactiveTitle": "También puedes ver el detalle de las interfaces inactivas", + "inactiveBody": "Si la interfaz está inactiva, el diálogo muestra el aviso «Interfaz inactiva» y omite los contadores actuales. Conserva la configuración —direcciones y miembros del bond— y el historial para diagnosticar qué falló y cuándo." }, "latency": { - "heading": "Modal Network Latency", - "intro": "Pulsar la tarjeta Network Latency de la fila superior abre una modal dedicada. Tiene dos modos (histórico y test bajo demanda), tres opciones de destino y un informe PDF descargable.", + "heading": "Diálogo Latencia de red", + "intro": "Pulsa Latencia de red en la fila superior para abrir su diálogo. Incluye historial, pruebas a petición, tres destinos y un informe PDF descargable.", "targetsTitle": "Destinos", - "targetsIntro": "Un desplegable de destino en lo alto de la modal selecciona contra qué se hace ping:", + "targetsIntro": "El desplegable de la parte superior selecciona el destino del ping:", "targets": [ - "Gateway — tu router de la LAN. Solo testea el tramo de red local; útil cuando sospechas de un problema de switch / cableado y quieres descartar la WAN.", - "Cloudflare (1.1.1.1) — resolutor DNS público, red anycast. Testea el tramo WAN.", - "Google (8.8.8.8) — destino público alternativo, útil como verificación sanity o cuando Cloudflare está degradado regionalmente." + "Puerta de enlace: tu router LAN. Comprueba solo el tramo local para investigar problemas del switch o del cableado sin incluir la WAN.", + "Cloudflare (1.1.1.1): resolutor DNS público en una red anycast. Comprueba el tramo WAN.", + "Google (8.8.8.8): destino público alternativo para contrastar resultados o comprobar incidencias regionales de Cloudflare." ], "mode1Title": "Modo 1 — Vista histórica", - "mode1Alt": "Modal Network Latency en modo histórico — destino Gateway con un timeframe de 1 hora y las muestras pasadas ploteadas", - "mode1Caption": "Vista histórica — destino Gateway sobre la última hora, alimentada desde la base de datos de historial de latencia que el hilo recolector de temperatura/latencia escribe cada 60 segundos.", - "mode1Body1": "El modo por defecto al abrir la modal. Un segundo desplegable elige el timeframe (1 Hour / 24 Hours / 7 Days / 30 Days / 1 Year); la resolución de los datos baja con la ventana para que la gráfica se mantenga legible. Las estadísticas titulares — Current / Min / Avg / Max — se renderizan encima de la gráfica, con una pastilla de estado (Excellent / Good / Fair / Poor) que refleja el valor actual frente a los umbrales de abajo.", - "mode1Body2": "Fuente: las mismas muestras de latencia que usa el Monitor de salud para detectar ralentizaciones persistentes de red — muestreadas cada 60 segundos contra el gateway por el hilo en background _temperature_collector_loop, escritas a un historial SQLite local.", + "mode1Alt": "Diálogo de latencia en modo histórico, con destino Puerta de enlace, periodo de una hora y muestras anteriores representadas", + "mode1Caption": "Historial de la puerta de enlace durante la última hora. El recolector de temperatura y latencia guarda las muestras en la base de datos cada 60 segundos.", + "mode1Body1": "Es el modo inicial del diálogo. Un segundo desplegable elige el periodo (1 hora / 6 horas / 24 horas / 3 días / 7 días). Encima aparecen Actual / Mínimo / Media / Máximo y un indicador Excelente / Bueno / Regular / Malo según los umbrales siguientes.", + "mode1Body2": "Fuente: las muestras que usa Health Monitor para detectar ralentizaciones persistentes. El hilo _temperature_collector_loop mide la latencia de la puerta de enlace cada 60 segundos y la guarda en un historial SQLite local.", "mode2Title": "Modo 2 — Test en tiempo real", - "mode2Alt": "Modal Network Latency ejecutando un test de ping en tiempo real contra Cloudflare — barra de progreso al 50%, muestras en vivo acumulándose en la gráfica", - "mode2Caption": "Test en tiempo real contra Cloudflare — ejecución de 2 minutos con una lectura cada 5 segundos, muestras ploteadas según llegan. Pulsa Stop para terminar antes; Test Again añade más muestras al mismo dataset.", + "mode2Alt": "Diálogo de latencia ejecutando un ping a Cloudflare en tiempo real, con progreso al 50 % y nuevas muestras en el gráfico", + "mode2Caption": "Prueba de dos minutos contra Cloudflare, con una lectura cada cinco segundos que se añade al gráfico al llegar. Pulsa Detener para finalizar antes; Repetir prueba añade muestras al mismo conjunto de datos.", "mode2Intro": "Cambiar el destino a Cloudflare o Google arranca un test de ping bajo demanda. Comportamiento:", "mode2Items": [ - "Duración — 2 minutos por ejecución, con barra de progreso y un contador de segundos restantes.", - "Cadencia — una lectura cada 5 segundos (24 lecturas por ejecución).", - "Método — ICMP Echo Request (ping), 3 pings consecutivos por muestra, latencia promediada.", + "Duración: dos minutos por ejecución, con barra de progreso y segundos restantes.", + "Frecuencia: una lectura cada cinco segundos, 24 por ejecución.", + "Método: ICMP Echo Request (ping), con tres pings seguidos por muestra y su latencia media.", "Stop — termina el test inmediatamente; los datos parciales se preservan.", - "Test Again — añade nuevas muestras al dataset existente en lugar de empezar de cero, así puedes construir un registro más largo a lo largo de varias ejecuciones.", - "Pastilla de estado en vivo — se reevalúa tras cada muestra con los mismos umbrales Excellent / Good / Fair / Poor." + "Repetir prueba: añade muestras a los datos existentes para construir un registro más largo con varias ejecuciones.", + "Indicador de estado actual: se recalcula tras cada muestra con los mismos umbrales Excelente / Bueno / Regular / Malo." ], "thresholdsTitle": "Umbrales de rendimiento", "headerStatus": "Estado", @@ -141,47 +141,47 @@ "headerImpact": "Impacto práctico", "thresholdRows": [ { - "status": "Excellent", + "status": "Excelente", "range": "< 50 ms", "impact": "Óptimo para apps en tiempo real, gaming y videollamadas." }, { - "status": "Good", + "status": "Bueno", "range": "50 – 100 ms", "impact": "Aceptable para la mayoría de aplicaciones con impacto mínimo." }, { - "status": "Fair", + "status": "Regular", "range": "100 – 200 ms", "impact": "Retardo perceptible. Puede afectar a VoIP y apps interactivas." }, { - "status": "Poor", + "status": "Malo", "range": "> 200 ms", "impact": "Latencia significativa. Se recomienda investigar." } ], - "reportTitle": "Network Latency Report (PDF)", - "reportIntro": "Ambos modos tienen un botón Report junto al selector de destino. Pulsarlo genera un PDF con todo lo que enviarías a tu ISP si quisieras argumentar un mal servicio.", - "reportPreviewAlt": "Primera página del PDF Network Latency Report — Executive Summary con el gauge, estadísticas de latencia, la gráfica de latencia y la guía de umbrales", - "reportPreviewCaption": "Primera página del Network Latency Report — Executive Summary con el dial del gauge y las estadísticas titulares, la gráfica de latencia por segundo y la guía de umbrales. De la página 2 en adelante está la tabla por muestra y la metodología.", - "downloadLabel": "Descargar informe de ejemplo Network Latency (PDF)", + "reportTitle": "Informe de latencia de red (PDF)", + "reportIntro": "Ambos modos tienen un botón Informe junto al selector de destino. Genera un PDF de las mediciones que puedes adjuntar a una solicitud de asistencia a tu proveedor de Internet.", + "reportPreviewAlt": "Primera página del informe PDF de latencia: resumen ejecutivo, indicador, estadísticas, gráfico y guía de umbrales", + "reportPreviewCaption": "La primera página contiene resumen ejecutivo, indicador, estadísticas principales, serie temporal de latencia y guía de umbrales. Desde la página 2 aparecen la tabla de muestras y la metodología.", + "downloadLabel": "Descargar informe de ejemplo de latencia (PDF)", "sectionsIntro": "El informe tiene seis secciones:", "sections": [ - "Executive Summary — dial del gauge (0–300+ ms con zonas verde / amarilla / roja), el veredicto de estado (EXCELLENT / GOOD / FAIR / POOR), el destino / modo / recuento de muestras y un resumen de una línea sobre packet loss.", - "Latency Statistics — Current / Min / Avg / Max como cuatro tiles grandes, más Sample Count, Packet Loss (avg) y Test Period.", - "Latency Graph — gráfica de área de cada muestra a lo largo de la ventana del test con una rejilla en el eje y de min/avg/max.", - "Performance Thresholds — la misma escala de cuatro niveles documentada arriba, con un punto coloreado por nivel.", - "Detailed Test Results — tabla numerada con timestamp, latencia, packet loss y estado para cada muestra. Útil para detectar micro-ráfagas que esconden los promedios titulares.", - "Methodology — método del test (ICMP Echo Request), muestras por test (3 pings consecutivos), nombre del destino, IP del destino y un párrafo final \"Performance Assessment\" derivado del veredicto." + "Resumen ejecutivo: indicador de 0 a más de 300 ms con zonas verde, amarilla y roja; estado Excelente / Bueno / Regular / Malo; destino, modo, número de muestras y resumen de pérdida de paquetes.", + "Estadísticas de latencia: cuatro indicadores con valor actual, mínimo, media y máximo, además del número de muestras, pérdida media de paquetes y periodo de prueba.", + "Gráfico de latencia: gráfico de área de las muestras durante la prueba, con referencias de mínimo, media y máximo en el eje vertical.", + "Umbrales de rendimiento: la misma escala de cuatro niveles anterior, con un punto de color por nivel.", + "Resultados detallados: tabla numerada con fecha y hora, latencia, pérdida de paquetes y estado de cada muestra. Permite detectar picos breves ocultos por las medias.", + "Metodología: ICMP Echo Request, tres pings consecutivos por muestra, nombre e IP del destino y evaluación final derivada del estado." ], - "useCaseTitle": "Caso de uso: reclamaciones a tu ISP", - "useCaseBody": "Ejecuta el test en tiempo real contra Cloudflare durante 2 minutos en un momento de lentitud percibida, después pulsa Test Again unas cuantas veces para extender el dataset y finalmente Report. El PDF lleva la tabla completa por muestra más el bloque de metodología — los ISPs suelen aceptar esto como evidencia, sobre todo si está correlacionado con timestamps de una reclamación aparte." + "useCaseTitle": "Caso de uso: asistencia de tu proveedor de Internet", + "useCaseBody": "Ejecuta dos minutos de prueba contra Cloudflare cuando notes lentitud, usa Repetir prueba para ampliar el registro y selecciona Informe. El PDF incluye todas las muestras y la metodología. Puedes adjuntarlo a una solicitud de asistencia con las horas de la incidencia; tu proveedor decide qué pruebas necesita." }, "excluding": { - "heading": "Excluir interfaces ruidosas", - "body1": "Igual que los almacenamientos, las interfaces individuales se pueden excluir de la monitorización de salud — útil para bridges deshabilitados a propósito, interfaces de test o NICs físicamente retiradas pero que siguen en la configuración. El flag se guarda en la tabla excluded_interfaces y lo respeta el ciclo del Monitor de salud: sin warnings, sin notificaciones, sin contribución a la pastilla de estado de la cabecera.", - "body2": "Desde el menú contextual de la fila, elige Exclude from monitoring. La interfaz sigue visible en el panel con una insignia morada excluded, y puedes reactivar la monitorización desde el mismo menú." + "heading": "Excluir interfaces de la supervisión", + "body1": "Puedes excluir interfaces de la supervisión, por ejemplo puentes desactivados a propósito, interfaces de prueba o NIC retiradas que siguen en la configuración. El ajuste se guarda en excluded_interfaces: Health Monitor no genera avisos ni notificaciones ni incluye esas interfaces en el indicador general.", + "body2": "En el menú contextual de la fila, elige Excluir de la supervisión. La interfaz sigue visible con una etiqueta morada excluida. Puedes reactivar la supervisión desde el mismo menú." }, "dataCollected": { "heading": "Cómo se recopilan los datos", @@ -192,31 +192,31 @@ { "section": "Inventario de interfaces", "endpoint": "/api/network", - "source": "ip -j addr + ip -j link + introspección de bond / bridge." + "source": "ip -j addr + ip -j link y consulta de bonds y puentes." }, { "section": "Tarjetas resumen", "endpoint": "/api/network/summary", - "source": "Agregación sobre el inventario más recuentos up/down por interfaz." + "source": "Resumen del inventario y recuento de interfaces activas e inactivas." }, { "section": "Serie temporal RX/TX por interfaz", "endpoint": "/api/network//metrics", - "source": "/proc/net/dev muestreado por el Monitor de salud con cálculo de byte-rate." + "source": "Los contadores actuales usan /proc/net/dev; el historial del gráfico procede de RRD Proxmox mediante pvesh. Las interfaces VM/LXC usan datos del invitado; las físicas y los puentes, datos del nodo." }, { "section": "Latencia: actual", "endpoint": "/api/network/latency/current", - "source": "Una ráfaga corta de ping contra el gateway / destino configurado." + "source": "Serie corta de ping a la puerta de enlace o al destino configurado." }, { "section": "Latencia: histórica", "endpoint": "/api/network/latency/history", - "source": "Muestras persistidas — cada 5 min por el ciclo del Monitor de salud." + "source": "Muestras guardadas aproximadamente cada 60 segundos por el recolector de temperatura y latencia en segundo plano." } ], - "codeComment1": "# Cross-check del estado de interfaz que ve el panel", - "codeComment2": "# Verificar una sonda de latencia actual de extremo a extremo" + "codeComment1": "# Contrastar el estado de las interfaces que muestra el panel", + "codeComment2": "# Comprobar una medición actual de latencia de extremo a extremo" }, "whereNext": { "heading": "Por dónde seguir", @@ -224,17 +224,17 @@ { "label": "Monitor de salud", "href": "/docs/monitor/health-monitor", - "tail": " — la categoría Red y los umbrales del historial de latencia." + "tail": " — categoría Red y umbrales del historial de latencia." }, { "label": "Referencia de la API", "href": "/docs/monitor/api", - "tail": " — los endpoints de red y latencia." + "tail": " — endpoints de red y latencia." }, { "label": "Integraciones", "href": "/docs/monitor/integrations", - "tail": " — el scrape de Prometheus expone las mismas métricas de red." + "tail": " — la recopilación de Prometheus ofrece las mismas métricas de red." }, { "label": "Índice del panel", diff --git a/web/messages/es/docs/monitor/dashboard/security.json b/web/messages/es/docs/monitor/dashboard/security.json index 9d82f323..11698780 100644 --- a/web/messages/es/docs/monitor/dashboard/security.json +++ b/web/messages/es/docs/monitor/dashboard/security.json @@ -1,174 +1,174 @@ { "meta": { - "title": "ProxMenux Monitor — Panel: pestaña Seguridad | ProxMenux Documentation", - "description": "La pestaña Seguridad agrupa cada control relacionado con protección en dos columnas: ProxMenux Monitor (Autenticación, SSL/HTTPS, tokens API, Secure Gateway) y Proxmox VE (Firewall, Fail2Ban, auditoría Lynis). Asistente paso a paso de Secure Gateway, recorrido de auditoría Lynis, instalación de Fail2Ban y ajuste de reglas." + "title": "ProxMenux Monitor — Panel: pestaña Seguridad | Documentación de ProxMenux", + "description": "La pestaña Seguridad reúne los controles de protección en dos columnas: ProxMenux Monitor (autenticación, SSL/HTTPS, tokens de API y Secure Gateway) y Proxmox VE (cortafuegos, Fail2Ban y auditoría de Lynis). Incluye el asistente de Secure Gateway, la auditoría de Lynis y la instalación y el ajuste de reglas de Fail2Ban." }, "header": { "title": "Panel: pestaña Seguridad", - "description": "Cada control de seguridad del panel, agrupado en dos bloques claramente etiquetados: configuración del propio Monitor (auth, SSL, tokens, Secure Gateway) y configuración del host Proxmox al que vigila (firewall, Fail2Ban, Lynis).", + "description": "Los controles de seguridad del panel se agrupan en dos bloques: la configuración del propio Monitor (autenticación, SSL, tokens y Secure Gateway) y la del host Proxmox que supervisa (cortafuegos, Fail2Ban y Lynis).", "section": "ProxMenux Monitor · Panel" }, "intro": { "title": "Dos ámbitos, una pestaña", - "body": "La pestaña Seguridad está dividida en dos secciones claramente separadas: ProxMenux Monitor (settings para el propio panel) y Proxmox VE (settings para el host de debajo). Las tarjetas se renderizan de forma condicional — Fail2Ban y Lynis solo aparecen una vez instalados." + "body": "La pestaña Seguridad tiene dos secciones: ProxMenux Monitor (ajustes del panel) y Proxmox VE (ajustes del host). Las tarjetas de Fail2Ban y Lynis ofrecen instalar estas herramientas si faltan y muestran sus controles una vez instaladas." }, "monitor": { "heading": "ProxMenux Monitor", - "intro": "Cuatro tarjetas controlan cómo se alcanza y autentica el propio panel." + "intro": "Cuatro tarjetas permiten configurar el acceso al panel y su autenticación." }, "auth": { "heading": "Autenticación", - "imageAlt": "Tarjeta Authentication mostrando estado Enabled, Logout, Change Password, info de Two-Factor Authentication, botones Enable Two-Factor Authentication y Disable Authentication", - "imageCaption": "Tarjeta Authentication con auth activa — insignia de estado, Change Password, Enable 2FA y la acción (destructiva) Disable Authentication.", - "intro": "La tarjeta te permite gestionar el login del propio panel. El flujo completo de primer arranque, política de contraseñas, pantallas de alta de TOTP y recuperación de authenticator perdido están documentados en Acceso y autenticación — esta tarjeta es la superficie del día a día para esos settings:", + "imageAlt": "Tarjeta de autenticación con estado Activada, botones Cerrar sesión y Cambiar contraseña, información sobre la autenticación de dos factores y botones para activarla o desactivar la autenticación", + "imageCaption": "Tarjeta con la autenticación activada: indicador de estado, Cambiar contraseña, Activar 2FA y la acción destructiva Desactivar autenticación.", + "intro": "La tarjeta permite gestionar el inicio de sesión del panel. El primer inicio, la política de contraseñas, el alta de TOTP y la recuperación por pérdida del autenticador se explican en Acceso y autenticación. Esta tarjeta permite gestionar esos ajustes a diario:", "items": [ - "Authentication Status — insignia mostrando Enabled / Disabled / Declined.", - "Change Password — contraseña actual + nueva contraseña + confirmación.", - "Enable / Disable Two-Factor Authentication — abre el diálogo de alta con QR al activar, pide la contraseña actual al desactivar.", - "Disable Authentication — acción destructiva que vuelve a mostrar el diálogo de primer arranque Protect your dashboard? en la siguiente visita." + "Estado de autenticación: indicador con Activada / Desactivada / Rechazada.", + "Cambiar contraseña: contraseña actual + nueva contraseña + confirmación.", + "Activar / Desactivar autenticación de dos factores: al activarla, abre el diálogo de registro con QR; al desactivarla, solicita la contraseña actual.", + "Desactivar autenticación: acción destructiva que vuelve a mostrar el diálogo inicial ¿Proteger tu panel? en la siguiente visita." ] }, "ssl": { - "heading": "SSL / HTTPS", - "imageAlt": "Tarjeta SSL / HTTPS mostrando estado HTTP No SSL, certificado del host Proxmox detectado con Subject, Issuer, Expires, botón Use Proxmox Certificate y opción Use Custom Certificate", - "imageCaption": "Tarjeta SSL / HTTPS con HTTPS apagado. El Monitor detecta el certificado ya instalado en el host Proxmox y lo ofrece como opción de un solo clic, con un fallback a Use Custom Certificate si tienes tus propios archivos en otro sitio.", - "intro": "Sirve el panel sobre HTTPS sin ningún reverse proxy por delante. La tarjeta auto-detecta el certificado que usa el propio Proxmox (bajo /etc/pve/local/) y muestra el subject, issuer y expiración para que lo puedas verificar antes de activar. Dos rutas para activar HTTPS:", + "heading": "SSL/HTTPS", + "imageAlt": "Tarjeta SSL/HTTPS con estado HTTP sin SSL, certificado del host Proxmox detectado con sujeto, emisor y caducidad, botón Usar certificado de Proxmox y opción Usar certificado personalizado", + "imageCaption": "Tarjeta SSL/HTTPS con HTTPS desactivado. Monitor detecta el certificado instalado en el host Proxmox y permite usarlo con un clic. Si tienes otros archivos, puedes elegir Usar certificado personalizado.", + "intro": "Permite servir el panel por HTTPS sin un proxy inverso. La tarjeta detecta el certificado usado por Proxmox en /etc/pve/local/ y muestra su sujeto, emisor y caducidad para verificarlo antes de activarlo. Hay dos formas de activar HTTPS:", "items": [ - "Use Proxmox Certificate — un clic. El Monitor reutiliza el certificado instalado en el host. Buena opción para usuarios que ya tienen su PVE corriendo en el mismo nombre DNS que el panel.", - "Use Custom Certificate — pega rutas absolutas a tus propios archivos .pem de certificado y .key de clave privada. Las rutas se validan antes de reiniciar el servicio; si la carga falla, el panel cae a HTTP automáticamente (sin estado roto)." + "Usar certificado de Proxmox: con un clic, Monitor reutiliza el certificado del host. Es adecuado si PVE y el panel ya usan el mismo nombre DNS.", + "Usar certificado personalizado: pega las rutas absolutas de tu certificado .pem y clave privada .key. Se validan antes de reiniciar el servicio. Si no pueden cargarse, el panel vuelve automáticamente a HTTP y permanece accesible." ], - "enabledAlt": "Tarjeta SSL/HTTPS con estado HTTPS Enabled, Active Certificate mostrando rutas pve-ssl.pem y pve-ssl.key, y un botón Disable HTTPS", - "enabledCaption": "HTTPS activo — la tarjeta expone el certificado actualmente en uso, las rutas de archivos y una acción Disable HTTPS que vuelve a HTTP en el mismo puerto.", + "enabledAlt": "Tarjeta SSL/HTTPS con HTTPS activado, certificado activo con las rutas de pve-ssl.pem y pve-ssl.key y botón Desactivar HTTPS", + "enabledCaption": "HTTPS activo: la tarjeta muestra el certificado en uso, sus rutas y la acción Desactivar HTTPS, que vuelve a HTTP en el mismo puerto.", "acmeTitle": "ACME / Let's Encrypt vía Proxmox", - "acmeBody": "Si tu nodo Proxmox ya tiene Let's Encrypt configurado en Datacenter → Certificates → ACME, ese es el certificado que el host sirve a los navegadores — y eso es lo que el panel reutiliza al pulsar Use Proxmox Certificate. No necesitas fontanería ACME separada para el Monitor.", - "walkthroughLink": "Para un recorrido paso a paso — incluyendo cómo el Monitor auto-detecta el certificado subido por ACME, qué se escribe a disco y cómo caer a un par .pem / .key custom — mira HTTPS para ProxMenux Monitor." + "acmeBody": "Si tu nodo Proxmox ya tiene Let’s Encrypt configurado en Datacenter → Certificates → ACME, el panel reutiliza ese mismo certificado al pulsar Usar certificado de Proxmox. No necesitas configurar ACME por separado para Monitor.", + "walkthroughLink": "Consulta HTTPS para ProxMenux Monitor para ver paso a paso cómo se detecta el certificado de ACME, qué se guarda en disco y cómo usar un par .pem / .key propio." }, "apiTokens": { "heading": "Tokens de acceso API", - "emptyAlt": "Tarjeta API Access Tokens en estado vacío con caja info About API Tokens y botón Generate New API Token", - "emptyCaption": "Tarjeta API Access Tokens en una instalación recién hecha — la caja About API Tokens resume lifetime, uso y cómo embeber el token en cabeceras Authorization: Bearer.", - "intro": "Tokens de vida larga (1 año) para integraciones desatendidas — widgets Homepage, sensores REST de Home Assistant, scrapers de Grafana, flujos n8n, scripts propios. La tarjeta te lleva por tres estados: vacío → formulario → generado.", - "generateBody": "Generar un token. Pulsa Generate New API Token. El formulario pide un Token Name descriptivo (ayuda a identificarlo después en la lista activa) y tu contraseña como confirmación de segundo factor. Si 2FA está activo, el formulario pide adicionalmente el código TOTP actual.", - "generateAlt": "Formulario API Access Tokens generate con input Token Name, input Password, botones Generate Token y Cancel", - "generateCaption": "El formulario Generate API Token — rellena un nombre y confirma con tu contraseña (y TOTP si 2FA está activo).", - "saveBody": "Guarda el token inmediatamente. La cadena completa del token se muestra solo una vez tras generarlo. La tarjeta lo destaca con un aviso ámbar y un botón de copia. No hay forma de recuperarlo después — solo verás el prefix en la lista Active Tokens.", - "generatedAlt": "Token API generado correctamente con token enmascarado, botón de copia, instrucciones para cabecera Authorization Bearer y lista Active Tokens con prefix", - "generatedCaption": "Token generado — el valor se muestra una vez con un botón de copia y el snippet exacto Authorization: Bearer. Debajo, la lista Active Tokens mantiene nombre + prefix + fecha de creación para que puedas revocar tokens individuales después.", - "outro": "La tarjeta muestra cada token activo con un botón Revoke por fila. Revocar invalida el token inmediatamente; cualquier integración que lo use deja de funcionar desde ese momento. Los cookbooks para Homepage, Home Assistant, n8n y Prometheus están en Integraciones." + "emptyAlt": "Tarjeta de tokens de acceso a la API vacía, con información sobre los tokens y botón Generar nuevo token de API", + "emptyCaption": "Tarjeta de tokens en una instalación nueva. El cuadro Acerca de los tokens de API resume su duración, uso y cómo incluirlos en cabeceras Authorization: Bearer.", + "intro": "Tokens con un año de validez para integraciones desatendidas: widgets de Homepage, sensores REST de Home Assistant, recolectores de Grafana, flujos de n8n y scripts propios. La tarjeta pasa por tres estados: vacío → formulario → generado.", + "generateBody": "Generar un token. Pulsa Generar nuevo token de API. Introduce un nombre del token descriptivo para identificarlo después y tu contraseña como confirmación adicional. Si 2FA está activo, también solicita el código TOTP actual.", + "generateAlt": "Formulario de generación de tokens de API con campos Nombre del token y Contraseña y botones Generar token y Cancelar", + "generateCaption": "Formulario Generar token de API: introduce un nombre y confirma con tu contraseña y, si 2FA está activo, el código TOTP.", + "saveBody": "Guarda el token inmediatamente. Su valor completo se muestra solo una vez tras generarlo. La tarjeta lo señala con un aviso naranja y un botón de copia. No podrás recuperarlo después; la lista de tokens activos solo mostrará su prefijo.", + "generatedAlt": "Token de API generado, con valor oculto, botón de copia, instrucciones para la cabecera Authorization: Bearer y lista de tokens activos con sus prefijos", + "generatedCaption": "Token generado: el valor se muestra una vez, con botón de copia y el fragmento exacto Authorization: Bearer. Debajo, la lista de tokens activos muestra nombre, prefijo y fecha de creación para revocarlos individualmente.", + "outro": "Cada token activo tiene un botón Revocar. La revocación lo invalida inmediatamente y las integraciones que lo usen dejan de funcionar. Encontrarás ejemplos para Homepage, Home Assistant, n8n y Prometheus en Integraciones." }, "gateway": { "heading": "Secure Gateway", - "cardAlt": "Tarjeta Secure Gateway con botón Deploy Secure Gateway antes de que se haya desplegado ningún gateway", - "cardCaption": "Tarjeta Secure Gateway en setup recién hecho — un botón arranca el asistente.", - "intro": "Alcanza el panel, la UI web de Proxmox y cualquier guest desde cualquier sitio en tu tailnet de Tailscale, sin exponer ningún puerto a la internet pública. El Monitor despliega un contenedor LXC Alpine en el host corriendo tailscaled como subnet router; una vez aprobado en la consola de admin de Tailscale, tus dispositivos remotos alcanzan la IP de LAN del host desde cualquier sitio.", + "cardAlt": "Tarjeta Secure Gateway con el botón Desplegar Secure Gateway antes de desplegar la primera pasarela", + "cardCaption": "Tarjeta Secure Gateway en una instalación nueva: un botón inicia el asistente.", + "intro": "Accede al panel, a la interfaz web de Proxmox y a cualquier máquina invitada desde tu red Tailscale, sin exponer puertos a Internet. Monitor despliega en el host un contenedor LXC Alpine con tailscaled como router de subred. Tras aprobarlo en la consola de administración de Tailscale, los dispositivos remotos pueden acceder a la IP LAN del host desde cualquier lugar.", "wizardTitle": "Asistente paso a paso", - "wizardIntro": "Antes de pulsar Deploy Secure Gateway, genera una auth key en tu consola de admin de Tailscale — el asistente la pedirá en el paso 2.", - "step0Title": "0. Generar la auth key de Tailscale", - "step0Body": "Entra en login.tailscale.com/admin/settings/keys y pulsa Generate auth key…. Elige una key pre-autenticada (para que el gateway no necesite un login interactivo de Tailscale) y copia el valor — se muestra solo una vez.", - "step0Alt": "Consola de admin de Tailscale, página Settings Keys con el botón Generate auth key resaltado", + "wizardIntro": "Antes de pulsar Deploy Secure Gateway, genera una clave de autenticación en la consola de Tailscale. El asistente la pedirá en el paso 2.", + "step0Title": "0. Generar la clave de autenticación de Tailscale", + "step0Body": "Entra en login.tailscale.com/admin/settings/keys y pulsa Generate auth key…. Elige una clave preautenticada para que la pasarela no necesite un inicio de sesión interactivo. Copia el valor: solo se muestra una vez.", + "step0Alt": "Página Settings → Keys de la consola de administración de Tailscale, con el botón Generate auth key resaltado", "step0Caption": "Consola de admin de Tailscale — Settings → Keys → Generate auth key…. Usa una cuenta gratuita de Tailscale si aún no tienes (link dentro del asistente).", "step1Title": "1. Abrir el asistente", - "step1Body": "De vuelta en la pestaña Seguridad, pulsa Deploy Secure Gateway. El primer paso es una intro con lo que vas a obtener y lo que necesitas.", - "step1Alt": "Paso intro del asistente Secure Gateway Setup explicando qué provee el gateway: acceso VPN, sin port forwarding, cifrado de extremo a extremo", + "step1Body": "Vuelve a la pestaña Seguridad y pulsa Deploy Secure Gateway. El primer paso presenta sus funciones y requisitos.", + "step1Alt": "Introducción del asistente Secure Gateway con acceso VPN, sin redirección de puertos y con cifrado de extremo a extremo", "step1Caption": "Paso 1 — resumen de lo que provee el Secure Gateway y recordatorio de que necesitarás una cuenta gratuita de Tailscale.", - "step2Title": "2. Tailscale Authentication", - "step2Body": "Pega la auth key del paso 0 y elige un hostname (así es como aparecerá el gateway en la consola de admin de Tailscale — típicamente proxmox-gateway o el nombre de tu nodo).", - "step2Alt": "Paso del asistente Secure Gateway pidiendo Tailscale Auth Key y Device Hostname con link para generar la key", - "step2Caption": "Paso 2 — pega la pre-auth key y elige el hostname del dispositivo. El link debajo del campo abre la página de Tailscale del paso 0 si te lo saltaste.", - "step3Title": "3. Access Scope", + "step2Title": "2. Autenticación de Tailscale", + "step2Body": "Pega la clave de autenticación del paso 0 y elige un nombre de host. Será el nombre de la pasarela en la consola de Tailscale, normalmente proxmox-gateway o el nombre de tu nodo.", + "step2Alt": "Paso del asistente Secure Gateway que solicita la clave de autenticación de Tailscale y el nombre de host del dispositivo, con enlace para generar la clave", + "step2Caption": "Paso 2: pega la clave preautenticada y elige el nombre de host. Si omitiste el paso 0, el enlace bajo el campo abre la página de Tailscale correspondiente.", + "step3Title": "3. Alcance de acceso", "step3Intro": "Elige a qué puede llegar tu tailnet a través del gateway:", "step3Items": [ "Proxmox Only — solo la UI de Proxmox y el Monitor. La menor superficie de ataque.", "Full Local Network — la subred LAN entera (auto-detectada desde la interfaz primaria del host). Te permite alcanzar NAS, impresoras, VMs y cualquier otro dispositivo de la LAN.", - "Custom Subnets — lista CIDRs específicos. Para setups multi-VLAN donde quieres exponer algunos segmentos pero no otros." + "Subredes personalizadas: indica los CIDR concretos. Permite dar acceso solo a determinados segmentos en instalaciones con varias VLAN." ], - "step3Alt": "Paso Access Scope del asistente Secure Gateway con tres opciones: Proxmox Only, Full Local Network, Custom Subnets", - "step3Caption": "Paso 3 — elige el access scope. Full Local Network se autorrellena con la subred LAN detectada.", - "step4Title": "4. Advanced Options (opcional)", - "step4Intro": "Dos toggles opcionales. Ambos off por defecto:", + "step3Alt": "Paso Ámbito de acceso del asistente Secure Gateway, con las opciones Solo Proxmox, Toda la red local y Subredes personalizadas", + "step3Caption": "Paso 3: elige el ámbito de acceso. Toda la red local rellena automáticamente la subred LAN detectada.", + "step4Title": "4. Opciones avanzadas (opcional)", + "step4Intro": "Dos interruptores opcionales, ambos desactivados por defecto:", "step4Items": [ - "Exit Node — cuando se activa y se selecciona desde un dispositivo remoto, todo el tráfico de internet de ese dispositivo sale por la WAN del host Proxmox. Útil para escenarios de viaje donde quieres que el tráfico de tu móvil parezca de casa.", - "Accept Routes — deja que este gateway alcance redes anunciadas por otros subnet routers del tailnet (para setups multi-sitio)." + "Exit Node: al activarlo y seleccionarlo desde un dispositivo remoto, todo el tráfico de Internet de ese dispositivo sale por la WAN del host Proxmox. Es útil al viajar para que el tráfico del móvil salga por tu conexión de casa.", + "Aceptar rutas: permite que esta pasarela acceda a redes anunciadas por otros routers de subred de la red Tailscale, para instalaciones en varias ubicaciones." ], - "step4Alt": "Paso Advanced Options del asistente Secure Gateway con checkboxes Exit Node y Accept Routes", - "step4Caption": "Paso 4 — Exit Node y Accept Routes. Salta ambos si lo único que quieres es acceso al panel desde tu móvil o portátil.", - "step5Title": "5. Review & Deploy", - "step5Body": "Resumen final antes de que arranque el deploy. El asistente te recuerda que aún queda un paso manual en el admin de Tailscale tras desplegar: aprobar la subnet route.", - "step5Alt": "Paso Review and Deploy del asistente Secure Gateway con Configuration Summary mostrando hostname, access mode, networks, exit node, accept routes y un botón Deploy Gateway", + "step4Alt": "Paso Opciones avanzadas de Secure Gateway con las casillas Exit Node y Accept Routes", + "step4Caption": "Paso 4: Exit Node y Accept Routes. Deja ambas opciones desactivadas si solo necesitas acceder al panel desde el móvil o el portátil.", + "step5Title": "5. Revisar y desplegar", + "step5Body": "Resumen final antes del despliegue. El asistente recuerda que después queda un paso manual en la consola de Tailscale: aprobar la ruta de subred.", + "step5Alt": "Paso Revisar y desplegar de Secure Gateway, con el resumen del nombre de host, modo de acceso, redes, Exit Node y Accept Routes y el botón Desplegar pasarela", "step5Caption": "Paso 5 — revisa la configuración y despliega. El aviso azul al pie señala la aprobación de ruta pendiente.", "approvalTitle": "Un último paso manual en el admin de Tailscale", - "approvalBody": "Tras desplegar, vuelve a login.tailscale.com/admin/machines y aprueba la subnet route que el gateway está anunciando. Hasta que lo hagas, los dispositivos remotos de tu tailnet no podrán alcanzar realmente IPs de LAN a través del gateway. Tailscale marca las rutas pendientes con un aviso amarillo en la fila del dispositivo — pulsa Edit route settings y marca la casilla de la ruta." + "approvalBody": "Tras el despliegue, vuelve a login.tailscale.com/admin/machines y aprueba la ruta de subred anunciada por la pasarela. Hasta entonces, los dispositivos remotos de tu red Tailscale no podrán acceder a las IP LAN a través de ella. Las rutas pendientes aparecen con un aviso amarillo en la fila del dispositivo: pulsa Edit route settings y marca la casilla de la ruta." }, "pve": { "heading": "Proxmox VE", - "intro": "Las protecciones del propio host — firewall, prevención de intrusiones y auditoría de seguridad. Los dos últimos solo se renderizan cuando sus herramientas respectivas están instaladas." + "intro": "Las protecciones del host: cortafuegos, prevención de intrusiones y auditoría de seguridad. Las tarjetas de Fail2Ban y Lynis ofrecen instalarlos si faltan y después muestran sus controles de gestión." }, "firewall": { "heading": "Proxmox Firewall", - "imageAlt": "Tarjeta Proxmox Firewall mostrando estado de Cluster Firewall y Host Firewall, Quick Access Rules para ProxMenux Monitor y Proxmox Web UI, contadores Rules Overview y una lista de Firewall Rules con botón Add Rule", - "imageCaption": "Tarjeta Proxmox Firewall — toggles enable / disable a nivel cluster y host, puertos comunes como Quick Access Rules, totales en Rules Overview y la lista completa de reglas con + Add Rule.", - "intro": "La tarjeta expone el firewall integrado de Proxmox VE (que es independiente de cualquier iptables / nftables a nivel host que puedas correr en paralelo). Tres bloques:", + "imageAlt": "Tarjeta del cortafuegos Proxmox con estado del clúster y del host, reglas de acceso rápido para Monitor y la interfaz web Proxmox, contadores, lista de reglas y botón Añadir regla", + "imageCaption": "Tarjeta del cortafuegos Proxmox: interruptores para el clúster y el host, puertos comunes en Reglas de acceso rápido, contadores en Resumen de reglas y lista completa con + Añadir regla.", + "intro": "La tarjeta gestiona la configuración del cortafuegos de Proxmox VE. El backend clásico usa iptables y el alternativo usa nftables. No gestiona reglas arbitrarias creadas fuera de Proxmox. Tres bloques:", "items": [ - "Cluster Firewall + Host Firewall — toggles globales. El cluster firewall debe estar activo para que cualquier regla a nivel host surta efecto; la tarjeta señala esta dependencia inline.", - "Quick Access Rules — filas predefinidas para puertos que importan al propio ProxMenux: 8008/TCP (Monitor), 8006/TCP (UI web de Proxmox). Cada fila muestra el estado actual allow / deny / unprotected. La UI web de Proxmox se permite vía el macro de firewall integrado de Proxmox y no se puede eliminar por accidente.", - "Rules Overview — contadores de reglas totales, reglas accept, reglas drop / reject y puertos distintos protegidos. Los números se leen de /etc/pve/firewall/cluster.fw y /etc/pve/nodes/<node>/host.fw.", - "Firewall Rules — lista completa con action / protocolo / puerto / source / level. + Add Rule abre un editor inline; el icono de papelera en cada fila elimina la regla. Las ediciones escriben a los mismos archivos que usa Proxmox, así que los cambios también aparecen en la UI de Proxmox (Datacenter / Node → Firewall)." + "Cortafuegos del clúster + cortafuegos del host: interruptores globales. El del clúster debe estar activado para que se apliquen las reglas del host. La tarjeta indica esta dependencia junto al ajuste.", + "Reglas de acceso rápido: filas predefinidas para 8008/TCP (Monitor) y 8006/TCP (interfaz web Proxmox), con estado permitido, bloqueado o sin protección. La interfaz de Proxmox se permite mediante su macro de cortafuegos integrada, que no puede eliminarse por accidente.", + "Resumen de reglas: contadores del total de reglas, reglas accept, reglas drop/reject y puertos distintos protegidos. Los datos se leen de /etc/pve/firewall/cluster.fw y /etc/pve/nodes/<node>/host.fw.", + "Reglas del cortafuegos: lista con acción, protocolo, puerto, origen y nivel. + Añadir regla abre el editor en la tarjeta; la papelera elimina la regla. Los cambios se guardan en los archivos de Proxmox y también aparecen en su interfaz (Datacenter / Node → Firewall)." ] }, "fail2ban": { "heading": "Fail2Ban", - "subHeading": "(condicional)", - "whatIs": "Qué es. Fail2Ban es un daemon open-source de prevención de intrusiones que vigila archivos de log buscando intentos repetidos fallidos de login y banea la IP ofensora a nivel de firewall. Es la respuesta de facto a los escáneres de fuerza bruta que pegan SSH y formularios de login web 24/7. ProxMenux lo conecta a tres jails por defecto: SSH, el login de la UI web de Proxmox (puerto 8006) y el login del ProxMenux Monitor (puerto 8008).", - "notBundled": "Fail2Ban no viene de fábrica. La tarjeta detecta si está instalado y se adapta: cuando falta ofrece una instalación de un clic; una vez instalado muestra estado en vivo de jails, IPs baneadas y te deja ajustar retries / ban time por jail.", - "notInstalledAlt": "Tarjeta Fail2Ban mostrando estado Not Installed con explicación de lo que configuraría: SSH, UI web de Proxmox y protección de ProxMenux Monitor con backend nftables, más un botón Install and Configure Fail2Ban", + "subHeading": "(según el estado)", + "whatIs": "Qué es. Fail2Ban es un servicio de código abierto que detecta intentos de inicio de sesión fallidos repetidos en los registros y bloquea la IP en el cortafuegos. Protege frente a ataques de fuerza bruta continuos contra SSH y los formularios web. ProxMenux configura tres jails: SSH, acceso web de Proxmox (puerto 8006) y acceso de ProxMenux Monitor (puerto 8008).", + "notBundled": "Fail2Ban no viene incluido. La tarjeta detecta si está instalado y adapta su contenido: si falta, ofrece instalarlo con un clic; una vez instalado, muestra el estado de las jails y las IP bloqueadas, y permite ajustar los reintentos y el tiempo de bloqueo de cada jail.", + "notInstalledAlt": "Tarjeta Fail2Ban sin instalar, con descripción de la protección de SSH, la interfaz web Proxmox y Monitor mediante nftables y botón Instalar y configurar Fail2Ban", "notInstalledCaption": "Tarjeta Fail2Ban antes de instalar — la caja azul previsualiza lo que configuraría la instalación.", - "clickBody": "Pulsa Install and Configure Fail2Ban y obtienes una modal de confirmación listando cada cambio que hará el script en el host:", - "confirmAlt": "Modal de confirmación Install Fail2Ban listando protección SSH modo agresivo, protección de interfaz web Proxmox puerto 8006, protección ProxMenux Monitor puerto 8008, backend nftables auto-detectado, ajuste del log level de journald y hardening de SSH MaxAuthTries", - "confirmCaption": "Confirmación de instalación — lista explícita de jails, ajustes al log level de journald (para que el jail de auth pueda leer eventos SSH) y un efecto colateral de hardening SSH (MaxAuthTries=3).", - "confirmIntro": "La confirmación dispara un panel de instalación en streaming (apt + config de jails + tests). La misma fontanería que el instalador CLI de ProxMenux.", - "progressAlt": "Panel Fail2Ban Installation mostrando log de instalación en vivo: instalación del paquete, journald MaxLevelStore ajustado para logging de auth, jails configurados, backend nftables detectado, hardening MaxAuthTries, test de comunicación fail2ban-client, mensaje de finalización", - "progressCaption": "Instalación en curso — cada paso se loguea en el panel. Connection-closed al final marca el fin de la sesión de streaming.", - "afterInstall": "Tras instalar la tarjeta pasa a la vista de estado en vivo: jails configurados, contador de IPs baneadas, eventos recientes de ban. Las pestañas grandes separan Jails & Banned IPs de Recent Activity (las últimas N entradas del log de Fail2Ban).", - "activeAlt": "Tarjeta Fail2Ban tras instalar con estado Active, tres jails configurados (proxmenux, proxmox, sshd), contador Banned IPs, Total Bans, Failed Attempts, y filas por jail con retries, ban time, window e icono de rueda dentada", - "activeCaption": "Fail2Ban activo — los tres jails por defecto (proxmenux, proxmox, sshd) con sus settings de retries / ban time / window.", - "tuneBody": "Ajustar reglas del jail. Pulsa el icono de rueda dentada en cualquier fila de jail para ajustar Max Retries, Ban Time (usa ban permanente si quieres que los ofensores queden bloqueados hasta que tú los desbanees manualmente) y Find Time (la ventana deslizante para contar retries). Los valores comunes están documentados dentro del formulario.", - "configAlt": "Formulario Configure jail sshd con Max Retries, Ban Time en segundos con opción Permanent Ban, Find Time, recordatorio de valores comunes y botón Save Configuration", - "configCaption": "Editando el jail sshd — elige un Max Retries más estricto para SSH si solo te logueas desde tu propia subred, o extiende el Ban Time para el panel de cara al público.", - "outro": "El recorrido completo Qué instala / cómo se configura / cómo desinstalar — incluyendo la ruta de instalación manual, el efecto colateral de SSH MaxAuthTries y la relación con el journal proxmenux-auth.log — está en ProxMenux → Seguridad → Fail2Ban.", - "calloutTitle": "Sin Fail2Ban, la protección contra fuerza bruta es best-effort", - "calloutBody": "ProxMenux Monitor tiene su propio hook de ban a nivel de aplicación en el pipeline de peticiones de Flask — pero solo surte efecto si Fail2Ban está instalado y escribe a la tabla de bans. Sin Fail2Ban, el Monitor loguea los logins fallidos a proxmenux-auth.log para inspección futura pero no bloquea IPs activamente." + "clickBody": "Pulsa Instalar y configurar Fail2Ban para abrir un diálogo de confirmación que enumera todos los cambios del script en el host:", + "confirmAlt": "Confirmación de Fail2Ban con modo agresivo para SSH, protección de Proxmox en el puerto 8006 y Monitor en el 8008, detección de nftables, ajuste de registros de journald y refuerzo de SSH MaxAuthTries", + "confirmCaption": "Confirmación de instalación: lista de jails, ajuste del nivel de registro de journald para leer eventos SSH y refuerzo adicional de SSH (MaxAuthTries=3).", + "confirmIntro": "Al confirmar, se abre un panel con el registro de instalación en directo: apt, configuración de jails y pruebas. Usa el mismo mecanismo que el instalador CLI de ProxMenux.", + "progressAlt": "Panel con el registro de instalación de Fail2Ban: paquete, journald MaxLevelStore para autenticación, jails, detección de nftables, refuerzo MaxAuthTries, prueba de comunicación fail2ban-client y mensaje de finalización", + "progressCaption": "Instalación en curso: el panel registra cada paso. El mensaje Connection closed al final indica que ha terminado la sesión de transmisión.", + "afterInstall": "Tras instalarse, la tarjeta muestra el estado en directo: jails configurados, IP bloqueadas y bloqueos recientes. Las pestañas separan Jails e IP bloqueadas de Actividad reciente, con las últimas N entradas del registro de Fail2Ban.", + "activeAlt": "Tarjeta Fail2Ban activa con tres jails (proxmenux, proxmox, sshd), contadores de IP bloqueadas, bloqueos totales e intentos fallidos, y filas con intentos, tiempo de bloqueo, intervalo y rueda dentada", + "activeCaption": "Fail2Ban activo: los tres jails predeterminados (proxmenux, proxmox y sshd) con sus ajustes de intentos, duración del bloqueo e intervalo de detección.", + "tuneBody": "Ajustar las reglas del jail. Pulsa su rueda dentada para cambiar Max Retries, Ban Time y Find Time, el intervalo móvil en que se cuentan los intentos. Un bloqueo permanente dura hasta que lo retires manualmente. El formulario explica los valores habituales.", + "configAlt": "Formulario del jail sshd con Max Retries, Ban Time en segundos, opción Permanent Ban, Find Time, ayuda con valores habituales y botón Guardar configuración", + "configCaption": "Edición del jail sshd: reduce Max Retries para SSH si solo accedes desde tu subred, o amplía Ban Time para el panel expuesto a Internet.", + "outro": "La guía Qué instala, cómo se configura y cómo desinstalar incluye la instalación manual, el cambio de SSH MaxAuthTries y la relación con el registro proxmenux-auth.log. Consulta ProxMenux → Seguridad → Fail2Ban.", + "calloutTitle": "Sin Fail2Ban, este mecanismo no bloquea las IP", + "calloutBody": "ProxMenux Monitor comprueba las IP bloqueadas por Fail2Ban a nivel de aplicación antes de procesar las peticiones de Flask. Consulta fail2ban-client y guarda el resultado en caché durante 30 segundos; no lee ninguna tabla SQL de bloqueos. Sin Fail2Ban, los intentos fallidos se registran en proxmenux-auth.log, pero este mecanismo no bloquea IPs." }, "lynis": { - "heading": "Lynis Security Audit", - "subHeading": "(condicional)", - "whatIs": "Qué es. Lynis es una herramienta open-source de auditoría de seguridad que ejecuta ~280 tests en el host (permisos de archivos, hardening del kernel, config SSH, vulnerabilidades de paquetes, política de cripto, tareas programadas, banner grabbing, etc.) y produce una puntuación de hardening 0–100, una lista de warnings y una lista de sugerencias. Es la baseline de facto para \"¿este servidor está en buena forma?\" en servidores basados en Debian.", - "whyUseful": "Por qué es útil. Conocer la postura de seguridad de tu servidor es difícil de hacer leyendo archivos de config uno a uno. Lynis captura las cosas que rutinariamente se pasan por alto: flags de hardening del kernel ausentes, cifrados SSH débiles activos, journal no persistente, NOPASSWD en sudoers para cuentas por defecto, y muchas más. Volver a ejecutarlo tras aplicar los ajustes post-instalación de ProxMenux te da un número objetivo de la mejora.", - "notInstalledAlt": "Tarjeta Lynis Security Audit con estado Not Installed y botón Install Lynis, listando features: scoring de hardening, detección de vulnerabilidades, comprobación de compliance y fuente GitHub", + "heading": "Auditoría de seguridad de Lynis", + "subHeading": "(según el estado)", + "whatIs": "Qué es. Lynis es una herramienta de auditoría de seguridad de código abierto que realiza unas 280 pruebas del host: permisos, protección del kernel, SSH, vulnerabilidades de paquetes, política criptográfica, tareas programadas e identificación de servicios, entre otras. Genera un índice de seguridad de 0 a 100, avisos y sugerencias. Se usa como referencia para evaluar servidores basados en Debian.", + "whyUseful": "Por qué es útil. Evaluar la seguridad leyendo cada archivo de configuración resulta difícil. Lynis detecta fallos habituales: opciones de protección del kernel ausentes, cifrados SSH débiles, registros no persistentes o NOPASSWD en sudoers para cuentas predeterminadas. Repetir el análisis tras los ajustes de ProxMenux permite comparar la mejora con una puntuación.", + "notInstalledAlt": "Tarjeta Lynis sin instalar con botón Instalar Lynis y funciones: puntuación de seguridad, detección de vulnerabilidades, cumplimiento y código en GitHub", "notInstalledCaption": "Tarjeta Lynis antes de instalar — la caja azul resume lo que hace la herramienta.", - "notBundled": "Lynis tampoco viene de fábrica. ProxMenux instala la última release directamente desde la fuente oficial en GitHub (no el paquete Debian, que va varias versiones menores por detrás).", - "confirmAlt": "Modal de confirmación Install Lynis listando lo que hace Lynis: scoring de hardening, detección de vulnerabilidades, análisis de configuración, comprobación de compliance, fuente desde el repositorio oficial de GitHub", - "confirmCaption": "Confirmación de instalación — explícita sobre la fuente GitHub.", - "progressAlt": "Panel en streaming Lynis Installation: instalando la última herramienta de scan, versión 3.1.6 confirmada, mensaje de instalación completada", - "progressCaption": "Instalación en curso — el mismo patrón de panel en streaming que Fail2Ban.", - "afterInstall": "Tras instalar la tarjeta muestra la versión y un historial de auditorías vacío. Pulsa Run Security Audit para arrancar el primer scan.", - "installedAlt": "Tarjeta Lynis Security Audit tras instalar con insignia versión 3.1.6 Installed, timestamp Last Scan, Hardening Index 0, Warnings 0, Suggestions 0, fila de audit report vacía y botón Run Security Audit", - "installedCaption": "Lynis instalado, sin auditoría todavía. La tarjeta prerrellena los tiles de métricas con ceros.", - "runningAlt": "Tarjeta Lynis Security Audit mientras la auditoría está corriendo mostrando mensaje Security audit in progress, duración estimada de 2-5 minutos y un botón Running Audit deshabilitado", - "runningCaption": "Auditoría en curso — el botón de acción muestra un spinner y la tarjeta avisa explícitamente de que el scan puede llevar 2–5 minutos.", - "finishedBody": "Cuando termina, la tarjeta pasa a la vista de resultados: hardening index, warnings, suggestions y una lista Audit Reports con cada scan histórico.", - "resultsAlt": "Tarjeta Lynis Security Audit con resultados: Hardening Index 71 con desglose Lynis 66 PVE 71, 3 warnings, 40 suggestions, barra de progreso Security Hardening Score Proxmox Adjusted 71 de 100 en el rango Good, lista de audit reports con descarga PDF y botón Run Security Audit", - "resultsCaption": "Resultados de auditoría — Hardening Index 71/100 (Good) en una ejecución de ejemplo. La tarjeta también muestra la \"puntuación raw de Lynis\" (66) frente a la puntuación ajustada para Proxmox (71) que devuelve 11 puntos por hallazgos que el corpus de tests de Lynis marca pero que son comportamiento esperado en Proxmox VE.", - "scoreTitle": "Puntuación raw de Lynis vs puntuación ajustada para Proxmox", - "scoreIntro": "Lynis trae reglas ajustadas para Debian de propósito general. Proxmox diverge legítimamente de algunas (servicios corriendo como root por razones de cluster, tuning custom de journald, etc.). La tarjeta muestra ambos números para que puedas:", + "notBundled": "Lynis tampoco viene incluido. ProxMenux lo instala directamente desde el código oficial de GitHub en lugar del paquete de Debian.", + "confirmAlt": "Diálogo de confirmación de Lynis con sus funciones: puntuación de seguridad, detección de vulnerabilidades, análisis de configuración, comprobación de cumplimiento y origen en el repositorio oficial de GitHub", + "confirmCaption": "Confirmación de instalación que indica expresamente el origen en GitHub.", + "progressAlt": "Panel de instalación de Lynis en directo, con instalación de la herramienta más reciente, versión 3.1.6 confirmada y mensaje de finalización", + "progressCaption": "Instalación en curso: el panel muestra el registro en directo, igual que con Fail2Ban.", + "afterInstall": "Tras la instalación, la tarjeta muestra la versión y un historial de auditorías vacío. Pulsa Ejecutar auditoría de seguridad para iniciar el primer análisis.", + "installedAlt": "Tarjeta Lynis tras instalarse con versión 3.1.6, fecha del último análisis, índice de seguridad 0, avisos 0, sugerencias 0, informe vacío y botón Ejecutar auditoría de seguridad", + "installedCaption": "Lynis instalado, aún sin auditorías. Los indicadores muestran ceros inicialmente.", + "runningAlt": "Tarjeta Lynis durante la auditoría con mensaje de análisis en curso, duración estimada de 2 a 5 minutos y botón Auditoría en curso deshabilitado", + "runningCaption": "Auditoría en curso: el botón muestra un indicador de carga y la tarjeta avisa de que el análisis puede tardar de 2 a 5 minutos.", + "finishedBody": "Al terminar, la tarjeta muestra los resultados: índice de seguridad, avisos, sugerencias y la lista de Informes de auditoría con los análisis anteriores.", + "resultsAlt": "Tarjeta Lynis con índice 71, desglose Lynis 66 y PVE 71, 3 avisos, 40 sugerencias, puntuación ajustada a Proxmox 71 de 100 en el rango Bueno, informes con descarga PDF y botón Ejecutar auditoría de seguridad", + "resultsCaption": "Resultados de ejemplo: índice de seguridad 71/100 (Bueno). La tarjeta muestra la puntuación original de Lynis (66) y la ajustada para Proxmox (71). El ajuste depende de la puntuación original y de la proporción de hallazgos considerados normales en Proxmox VE; no suma 11 puntos fijos.", + "scoreTitle": "Puntuación original de Lynis y puntuación ajustada para Proxmox", + "scoreIntro": "Las reglas de Lynis están pensadas para Debian de uso general. Proxmox se aparta de algunas por motivos válidos, como servicios de clúster ejecutados como root o ajustes propios de journald. La tarjeta muestra ambas puntuaciones para:", "scoreItems": [ - "Trackear tu puntuación raw de Lynis igual que lo harían auditores externos.", - "Trackear la puntuación ajustada para Proxmox — una baseline más justa si estás comparando nodos dentro del mismo cluster." + "Seguir la evolución de la puntuación original de Lynis, como haría un auditor externo.", + "Seguir la puntuación ajustada para Proxmox, una referencia más adecuada para comparar nodos del mismo clúster." ], - "reportBody": "El informe completo. Cada fila de auditoría en la lista tiene un botón PDF que descarga un informe de varias páginas con el resumen ejecutivo, info del sistema, postura de seguridad, cada warning con explicación, cada sugerencia rankeada por impacto y el inventario de paquetes. Es el artefacto que adjuntarías a una revisión de seguridad.", - "reportAlt": "Primera página de ejemplo del PDF Lynis Security Audit Report mostrando resumen ejecutivo con hardening 71 de 100, contadores de warnings y suggestions, bloque de System Information con hostname, kernel, versión de Lynis, fecha del informe, resumen de postura de seguridad", - "reportCaption": "Primera página de un informe descargado — resumen ejecutivo, System Information y resumen de postura de seguridad. El informe completo continúa con warnings detallados, sugerencias y la lista de paquetes instalados. Hay un PDF de ejemplo adjunto como referencia.", + "reportBody": "Informe completo. El botón PDF de cada auditoría descarga un informe de varias páginas: resumen ejecutivo, información del sistema, estado de seguridad, avisos explicados, sugerencias ordenadas por impacto e inventario de paquetes. Puedes adjuntarlo a una revisión de seguridad.", + "reportAlt": "Primera página de ejemplo del informe PDF de Lynis con resumen ejecutivo, índice 71 de 100, contadores de avisos y sugerencias, nombre de host, kernel, versión de Lynis, fecha y resumen del estado de seguridad", + "reportCaption": "Primera página del informe descargado: resumen ejecutivo, información del sistema y estado de seguridad. Después incluye avisos detallados, sugerencias y paquetes instalados. Se adjunta un PDF de ejemplo como referencia.", "runPeriodically": "Ejecuta la auditoría periódicamente (tras grandes upgrades de Proxmox, tras aplicar ajustes post-instalación, antes de abrir una ruta de acceso remoto) y guarda los informes — la tendencia importa más que cualquier número aislado.", - "outro": "El recorrido completo Qué instala / cómo se configura / cómo desinstalar y un análisis escrito del informe de ejemplo están en ProxMenux → Seguridad → Lynis." + "outro": "La guía completa de instalación, configuración y desinstalación y el análisis de un informe de ejemplo están en ProxMenux → Seguridad → Lynis." }, "dataCollected": { "heading": "Cómo se recopilan los datos", @@ -179,22 +179,22 @@ { "card": "Autenticación, 2FA, cambio de contraseña", "endpoint": "/api/auth/*", - "source": "SQLite local + JWT emitido por el Monitor." + "source": "Configuración local de autenticación en ~/.config/proxmenux-monitor/auth.json; JWT emitidos por Monitor." }, { - "card": "SSL / HTTPS", + "card": "SSL/HTTPS", "endpoint": "/api/auth/ssl/*", "source": "openssl x509 sobre /etc/pve/local/pve-ssl.pem + /etc/proxmenux/ssl_config.json." }, { - "card": "Listar / generar / revocar tokens API", + "card": "Listar, generar y revocar tokens de API", "endpoint": "/api/auth/api-tokens", "source": "Filas de token guardadas localmente; nada sale del host." }, { "card": "Secure Gateway (deploy + estado)", "endpoint": "/api/oci/*", - "source": "Provisiona LXC Alpine + tailscaled vía pct create / pct exec." + "source": "Crea un LXC Alpine y configura tailscaled mediante pct create / pct exec." }, { "card": "Estado y reglas de firewall", @@ -219,27 +219,27 @@ { "label": "Acceso y autenticación", "href": "/docs/monitor/access-auth", - "tail": " — flujo completo de primer arranque, selector de app 2FA, recuperación de authenticator perdido, snippets de reverse proxy." + "tail": " — configuración inicial completa, selección de app 2FA, recuperación por pérdida del autenticador y ejemplos de proxy inverso." }, { "label": "Integraciones", "href": "/docs/monitor/integrations", - "tail": " — cookbooks para usar tokens API con Homepage, Home Assistant, Prometheus, n8n y el Secure Gateway de extremo a extremo." + "tail": " — ejemplos de uso de tokens de API con Homepage, Home Assistant, Prometheus y n8n, y configuración completa de Secure Gateway." }, { "label": "Referencia de la API", "href": "/docs/monitor/api", - "tailRich": " — cada endpoint /api/auth, /api/security y /api/oci con método, body y ejemplos curl." + "tailRich": " — endpoints de /api/auth, /api/security y /api/oci con método, cuerpo de petición y ejemplos de curl." }, { "label": "ProxMenux → Seguridad → Fail2Ban", "href": "/docs/security/fail2ban", - "tail": " — recorrido de instalación, jails configurados, ruta de instalación manual." + "tail": " — guía de instalación, jails configurados e instalación manual." }, { "label": "ProxMenux → Seguridad → Lynis", "href": "/docs/security/lynis", - "tail": " — informe de ejemplo, interpretación del score, cuándo volver a ejecutarlo." + "tail": " — informe de ejemplo, interpretación de la puntuación y cuándo repetir la auditoría." } ] } diff --git a/web/messages/es/docs/monitor/dashboard/settings.json b/web/messages/es/docs/monitor/dashboard/settings.json index 7b75180d..d4d57152 100644 --- a/web/messages/es/docs/monitor/dashboard/settings.json +++ b/web/messages/es/docs/monitor/dashboard/settings.json @@ -1,173 +1,173 @@ { "meta": { "title": "ProxMenux Monitor — Panel: pestaña Ajustes | Documentación de ProxMenux", - "description": "La pestaña Ajustes controla el idioma del Monitor, el orden de navegación, las preferencias del panel, los umbrales y exclusiones de salud, las notificaciones, la IA y el inventario de optimizaciones." + "description": "La pestaña Ajustes controla idioma, orden de navegación, preferencias del panel, umbrales y exclusiones de supervisión, notificaciones, IA e inventario de optimizaciones posteriores a la instalación." }, "header": { "title": "Panel: pestaña Ajustes", - "description": "Idioma del Monitor, orden de navegación, preferencias del panel, exclusiones de monitorización, notificaciones, configuración de IA e inventario de optimizaciones de ProxMenux.", + "description": "Idioma de Monitor, orden de navegación, preferencias del panel, exclusiones, notificaciones, IA e inventario actualizado de optimizaciones de ProxMenux.", "section": "ProxMenux Monitor · Panel" }, "intro": { - "title": "Dónde vive realmente cada setting", - "body": "La pestaña Ajustes reúne varias funciones distintas: cómo se muestra el panel, qué vigila el Monitor de salud, cómo se envían las alertas y qué cambios ha aplicado ProxMenux en el host. Las tarjetas que tienen su propia página de documentación enlazan a ella en lugar de duplicar el contenido: Ajustes es el punto de entrada." + "title": "Dónde se guarda cada ajuste", + "body": "Ajustes reúne la presentación del panel, la supervisión de Health Monitor, el envío de alertas y los cambios ya aplicados al host por ProxMenux. Las tarjetas con documentación detallada enlazan a ella; aquí encontrarás su punto de acceso." }, "interfaceLanguage": { "heading": "Idioma de la interfaz", - "intro": "Selecciona el idioma de la interfaz web del Monitor. El cambio se aplica de inmediato; no reinicia el servicio ni modifica el idioma de los menús de ProxMenux ejecutados en la terminal.", + "intro": "Elige el idioma de la interfaz web del Monitor. Se aplica de inmediato, sin reiniciar el servicio ni cambiar el idioma de los menús de terminal de ProxMenux.", "items": [ "ProxMenux Monitor ofrece actualmente inglés, alemán, español, francés, italiano, portugués, eslovaco y sueco.", - "En la primera visita, el Monitor utiliza el idioma del navegador si está disponible; en caso contrario, utiliza inglés.", - "Al cambiar la selección, se actualiza el idioma de la página y también el de otras pestañas abiertas con el mismo perfil del navegador.", - "Si falta una cadena traducida, solo ese texto se muestra en inglés en lugar de presentar una clave rota." + "En la primera visita usa el idioma del navegador si está disponible; en caso contrario, inglés.", + "Cambiar la selección actualiza el idioma de la página y lo sincroniza con las demás pestañas del mismo perfil del navegador.", + "Si falta una traducción, solo ese texto aparece en inglés en lugar de una clave o marcador roto." ], "scopeTitle": "Preferencia local del navegador", - "scopeBody": "La selección se guarda en localStorage con la clave proxmenux-ui-language. Por tanto, pertenece a este perfil de navegador y dispositivo; no es un ajuste global del nodo. Cada administrador puede utilizar un idioma distinto." + "scopeBody": "La selección se guarda en localStorage con la clave proxmenux-ui-language. Pertenece al perfil y dispositivo actuales, no a todo el nodo. Cada administrador puede elegir su idioma." }, "navigationOrder": { "heading": "Orden de navegación", - "intro": "Esta tarjeta permite ordenar los siete elementos principales: Resumen, Apps, VMs y LXCs, Nodo, Copias, Terminal y Administración. Pulsa Editar, arrastra las filas y guarda el resultado.", + "intro": "Ordena los siete elementos principales: Resumen, Apps, VMs y LXCs, Nodo, Copias, Terminal y Administración. Pulsa Editar, arrastra las filas y guarda.", "items": [ - "Con el ratón, el arrastre comienza al pulsar. En una pantalla táctil se utiliza una pulsación mantenida de 250 ms para no confundir el desplazamiento normal con una reordenación.", - "Los grupos Nodo y Administración se mueven como unidades completas; sus páginas internas conservan el orden establecido por ProxMenux.", - "El menú móvil respeta el mismo orden guardado.", - "Restaurar valores predeterminados restablece el borrador. Es necesario guardar para aplicar el cambio.", - "Si una versión futura añade una nueva pestaña principal, esta se incorpora al final del orden personalizado sin borrar la organización del usuario." + "Con el ratón, el arrastre empieza al pulsar. En pantallas táctiles requiere mantener la pulsación 250 ms para distinguirlo del desplazamiento.", + "Los grupos Nodo y Administración se mueven completos; sus páginas internas conservan el orden establecido.", + "El menú móvil respeta el orden guardado.", + "Restaurar valores predeterminados restablece el orden en edición. Guarda para aplicar el cambio.", + "Las nuevas pestañas principales de futuras versiones se añaden al final del orden personalizado, conservando tu organización." ], - "landingTitle": "El primer elemento se convierte en la pestaña inicial", - "landingBody": "El primer elemento guardado es la página que abre el Monitor al cargar. Si Nodo ocupa la primera posición, se abre Almacenamiento; si la ocupa Administración, se abren los Logs del sistema. El orden se guarda solo en este navegador con la clave proxmenux-nav-order, por lo que cada dispositivo puede utilizar una organización distinta." + "landingTitle": "El primer elemento es la pestaña inicial", + "landingBody": "Monitor abre el primer elemento guardado. Si es Nodo, abre Almacenamiento; si es Administración, abre Registros del sistema. El orden se guarda en este navegador bajo proxmenux-nav-order, por lo que cada dispositivo puede tener su propia organización." }, "networkUnits": { - "heading": "Network Units", - "imageAlt": "Tarjeta Network Units con desplegable Network Unit Display puesto en Bytes", - "imageCaption": "Elige entre bits por segundo y bytes por segundo para cada rate de red mostrado en el panel.", - "body": "Elige cómo se muestra el throughput de red a lo largo del panel: bits por segundo (Mbps / Gbps) o bytes por segundo (MB/s / GB/s). Bits es el valor por defecto porque es como los fabricantes de NICs e ISPs etiquetan sus productos; bytes es lo que reportan la mayoría de herramientas de transferencia de archivos. El setting afecta cada gráfica, insignia y tooltip que muestra rate de red — aplicado inmediatamente, sin recargar." + "heading": "Unidades de red", + "imageAlt": "Tarjeta Unidades de red con el selector de visualización en Bytes", + "imageCaption": "Elige bits por segundo o bytes por segundo para todas las velocidades de red del panel.", + "body": "Muestra la velocidad de red en bits por segundo (Mbps/Gbps) o bytes por segundo (MB/s/GB/s). Por defecto se usan bits, como en las especificaciones de interfaces y proveedores; las transferencias de archivos suelen usar bytes. El cambio se aplica de inmediato a gráficos, etiquetas y ayudas, sin recargar." }, "health": { "heading": "Monitor de salud", - "intro": "La tarjeta expone el setting Suppression Duration por categoría — una vez se descarta una alerta, cuánto tiene que pasar antes de que se permita al escáner volver a dispararla. Cada una de las diez categorías del Monitor de salud (CPU, Memoria, Almacenamiento, Discos, Red, VMs, Servicios PVE, Logs, Updates, Seguridad) tiene su propio desplegable con estos valores:", + "intro": "La tarjeta configura la duración del silenciamiento: cuánto debe esperar el análisis antes de volver a avisar de una alerta descartada. Cada categoría —CPU, memoria, almacenamiento, discos, red, VM, servicios PVE, registros, actualizaciones y seguridad— tiene su desplegable:", "items": [ "24 h — por defecto para la mayoría de categorías transitorias.", - "72 h — para eventos sobre los que quieres unos días de silencio.", + "72 h — para silenciar estos eventos durante unos días.", "168 h (1 semana) y 720 h (1 mes) — chequeos periódicos.", - "8760 h (1 año) — efectivamente \"silencio en el futuro previsible\".", + "8760 h (1 año) — silencio durante un periodo largo.", "-1 — silencio permanente hasta que lo reactives manualmente.", - "Custom hours — cualquier entero si necesitas un valor intermedio." + "Horas personalizadas: cualquier número entero si necesitas un valor intermedio." ], - "imageAlt": "Card Settings → Monitor de salud con los desplegables de supresión por categoría y la sección Active Suppressions", - "imageCaption": "Card Monitor de salud — los desplegables por categoría fijan los valores por defecto para nuevos dismisses; la sección Active Suppressions debajo lista cada alerta actualmente silenciada y permite revertirlas.", - "editTitle": "Modo Edit", - "editBody": "La tarjeta es de solo-lectura por defecto. Pulsa Edit en la esquina superior derecha de la card para activar los desplegables y los botones Re-enable. Save confirma todos los cambios pendientes (cambios de Suppression Duration y re-enables encolados) en un solo lote; Cancel los descarta todos. El botón Save solo se activa cuando hay al menos un cambio pendiente.", - "activeTitle": "Active Suppressions", - "activeIntro": "Debajo de los desplegables de Suppression Duration, la sección Active Suppressions lista cada alerta actualmente silenciada — tanto los dismisses time-limited (24 h, 7 días, ventanas custom) como los Permanent. Cada fila muestra:", + "imageAlt": "Ajustes, tarjeta Health Monitor con duración por categoría y sección de silenciamientos activos", + "imageCaption": "Los desplegables definen la duración para futuros descartes. La sección inferior muestra las alertas silenciadas y permite reactivarlas.", + "editTitle": "Modo de edición", + "editBody": "La tarjeta comienza en solo lectura. Pulsa Editar arriba a la derecha para activar desplegables y botones de reactivación. Guardar aplica en un lote las duraciones y reactivaciones pendientes; Cancelar las descarta. Guardar solo se activa cuando hay cambios.", + "activeTitle": "Silenciamientos activos", + "activeIntro": "Bajo las duraciones, Silenciamientos activos enumera las alertas silenciadas temporalmente —24 h, 7 días u otro periodo— y las permanentes. Cada fila muestra:", "activeItems": [ - "Un badge coloreado — Permanent (ámbar) o una cuenta atrás como 24h remaining / 7d remaining (azul).", - "El identificador de la alerta, normalizado para legibilidad (p. ej. pve_storage_full_PBS-Cloud → PVE Storage Full: PBS-Cloud).", - "Categoría, severidad y el timestamp en que se descartó la alerta.", - "Un botón Re-enable (activo solo en modo Edit) que encola la alerta para ser un-acknowledged al siguiente Save." + "Una insignia de color: Permanente en ámbar o una cuenta atrás, como 24 h restantes / 7 días restantes, en azul.", + "El identificador de la alerta, adaptado para facilitar su lectura (p. ej. pve_storage_full_PBS-Cloud → Almacenamiento PVE lleno: PBS-Cloud).", + "Categoría, gravedad y fecha y hora en que se descartó la alerta.", + "Un botón Reactivar, disponible al editar, deja pendiente retirar el silenciamiento al guardar." ], - "activeReenableTitle": "Flujo de Re-enable", - "activeReenableBody": "Pulsar Re-enable en modo Edit marca la fila en verde y tacha su identificador — está encolada pero todavía no aplicada. Volver a hacer clic en la misma fila la Undo (la saca de la cola). Cuando pulsas Save, cada re-enable encolado dispara POST /api/health/un-acknowledge en paralelo y las filas afectadas desaparecen de la lista. Si la condición subyacente sigue presente y la categoría soporta re-fire, la alerta reaparece en la lista Active del Monitor de salud en el siguiente ciclo de escaneo.", - "activePermanentNote": "Los dismisses permanentes (alertas descartadas con Permanently desde el modal del Monitor, o aquellas cuya categoría tenga el default puesto a -1) solo se pueden revertir desde aquí. El modal del dashboard no expone un botón un-dismiss para ellas — el panel Active Suppressions es el único log de auditoría + UI de revert.", - "activeAutoRefreshTitle": "Auto-refresh", - "activeAutoRefreshBody": "La lista se refresca automáticamente cuando descartas o un-dismiss una alerta desde el modal del Monitor de salud (vía un evento in-browser), cuando la pestaña recupera el foco y al cambio de visibilidad. No necesitas recargar la página tras descartar una alerta desde el dashboard.", - "calloutTitle": "La semántica completa vive en la página del Monitor de salud", - "calloutBody": "Las reglas de escalada (cuándo un re-fire pasa a critical), el comportamiento de auto-resolve para eventos cuyo dispositivo subyacente desaparece y la diferencia entre dismissed y resolved — todo documentado bajo Monitor de salud → Descartar alertas y la Suppression Duration. Esta tarjeta solo expone los desplegables por categoría y el panel Active Suppressions." + "activeReenableTitle": "Cómo reactivar una alerta", + "activeReenableBody": "Reactivar al editar marca la fila en verde y tacha su identificador; aún no se aplica. Pulsa de nuevo para Deshacer. Guardar envía en paralelo POST /api/health/un-acknowledge por cada reactivación y retira sus filas. Si el problema persiste y la categoría permite repetir avisos, la alerta volverá a Activas en el próximo análisis.", + "activePermanentNote": "Los descartes permanentes —mediante Permanente o duración predeterminada -1— solo se revierten aquí. El diálogo general no ofrece ese botón; esta sección reúne el registro y la reactivación.", + "activeAutoRefreshTitle": "Actualización automática", + "activeAutoRefreshBody": "La lista se actualiza al descartar o reactivar una alerta desde Health Monitor, al volver a la pestaña y al cambiar su visibilidad. No necesitas recargar la página.", + "calloutTitle": "Detalles en la página de Health Monitor", + "calloutBody": "Las reglas de escalado, la resolución automática cuando desaparece un dispositivo y la diferencia entre descartar y resolver se explican en Health Monitor → Descartar alertas y duración del silenciamiento. Esta tarjeta ofrece los desplegables y los silenciamientos activos." }, "thresholds": { - "heading": "Health Monitor Thresholds", - "intro": "Donde la tarjeta anterior decide cuánto tiempo quedarse callado tras un dismiss, esta decide a qué valor se dispara una alerta en primer lugar. Cada chequeo que ejecuta el Monitor de salud está parametrizado por un par de números — un umbral Warning y un umbral Critical — y ambos se exponen aquí para que el operador los ajuste.", + "heading": "Umbrales de Health Monitor", + "intro": "La tarjeta anterior define cuánto dura el silencio tras descartar; esta define el valor que activa una alerta. La mayoría de controles tienen valores Aviso y Crítico ajustables. La tabla explica excepciones como la regla combinada de swap y el detector actual de RAM.", "whatForTitle": "Para qué sirve", - "whatForIntro": "Los valores por defecto que vienen con ProxMenux son sensatos para el host Proxmox medio, pero cada entorno tiene su propio sobre operativo:", + "whatForIntro": "Los valores predeterminados sirven como punto de partida, pero cada entorno tiene sus propias condiciones:", "whatForItems": [ - "Un homelab pequeño con un SSD único puede querer avisar antes en capacidad (75 / 90 %) para dejar margen a snapshots.", - "Un host de datacenter con nodos Ceph redundantes puede ser más relajado en avisos de memoria (un working set al 90 % es normal bajo ARC de ZFS).", - "Un mini-PC con refrigeración pasiva necesita umbrales de temperatura más bajos que un servidor con refrigeración forzada por aire — misma clase de drive, sobre físico distinto.", - "Un host muy virtualizado que clava CPU durante builds no debería avisar en cada pico del 80 %, pero sí debe seguir alertando sobre presión sostenida." + "Un homelab con un único SSD puede avisar antes de llenarse, por ejemplo al 75/90 %, para dejar margen a las instantáneas.", + "Los umbrales de memoria deben reflejar las mediciones y la carga del host. La redundancia Ceph no justifica por sí sola relajar avisos, y el uso elevado de ARC de ZFS no equivale a memoria de trabajo irrecuperable.", + "Elige umbrales de temperatura según las especificaciones del disco y sus condiciones reales. La refrigeración pasiva o forzada no determina por sí sola un límite seguro universalmente más bajo o más alto.", + "Un host muy virtualizado puede alcanzar picos de CPU durante compilaciones sin necesitar avisos por cada pico del 80 %, pero debe seguir avisando de saturación sostenida." ], - "whatForOutro": "Editar un umbral surte efecto en el siguiente scan — el Monitor de salud relee los valores desde /usr/local/share/proxmenux/health_thresholds.json en cada ciclo, sin reinicio de servicio. Los mismos números también alimentan los rangos de color de los widgets del panel (la línea de temperatura en la modal de temperatura de disco, las barras de las tarjetas de almacenamiento) para que la clasificación visual coincida con lo que dispara la alerta.", - "coloursTitle": "Colores de estado: cómo renderizan Warning y Critical en el panel", - "coloursIntro": "Cada umbral de abajo produce la misma clasificación de tres estados a lo largo del panel — los mismos colores para barras de almacenamiento, anillos de CPU/memoria, chips de temperatura y el punto de la modal de disco. Leer un color en cualquier sitio del Monitor mapea a un rango definido relativo al par configurado:", + "whatForOutro": "Los cambios admitidos se aplican en el siguiente análisis. Health Monitor lee /usr/local/share/proxmenux/health_thresholds.json cada ciclo sin reinicio. Algunos indicadores, como temperatura de disco, usan estos valores; ciertas barras de capacidad conservan sus propios cortes. La fila de RAM explica una excepción actual.", + "coloursTitle": "Colores de estado de Aviso y Crítico", + "coloursIntro": "Los widgets que usan el par Aviso/Crítico siguen los tres estados siguientes. Algunos indicadores, como las barras de capacidad PVE, tienen límites propios; su color no basta para deducir una alerta de Health Monitor.", "headerColour": "Color", "headerRange": "Rango", "headerMeaning": "Significado", "colourRows": [ { "colour": "Verde", - "range": "valor < Warning", - "meaning": "Rango operativo normal. No se dispara alerta." + "range": "Valor < Aviso", + "meaning": "Rango normal. No se genera alerta." }, { "colour": "Ámbar", - "range": "Warning ≤ valor < Critical", - "meaning": "Estado warning. El Monitor de salud dispara un evento de severidad WARNING; las notificaciones respetan los filtros del canal y las Quiet Hours." + "range": "Aviso ≤ valor < Crítico", + "meaning": "Estado de aviso. Health Monitor genera un evento WARNING; las notificaciones respetan filtros de canal y horario de silencio." }, { "colour": "Rojo", - "range": "valor ≥ Critical", - "meaning": "Estado critical. El Monitor de salud dispara un evento CRITICAL; CRITICAL salta las Quiet Hours y siempre alcanza al canal." + "range": "Valor ≥ Crítico", + "meaning": "Estado crítico. Health Monitor genera un evento CRITICAL que omite el horario de silencio. Siguen aplicándose los ajustes de categoría y evento del canal; la entrega también depende de su disponibilidad." } ], - "sectionsTitle": "Secciones y valores por defecto recomendados", - "sectionsIntro": "Estos son los valores con los que viene ProxMenux — la baseline recomendada. Es lo que ves en un host recién montado hasta que sobreescribes algo. Las secciones están ordenadas de arriba abajo de cómputo → calor → capacidad de almacenamiento, así que leer hacia abajo va de lo concreto (carga actual) al estado acumulado (espacio libre).", + "sectionsTitle": "Secciones y valores predeterminados recomendados", + "sectionsIntro": "Son los valores iniciales de ProxMenux hasta que los cambies. Las secciones van de carga de cómputo a temperatura y capacidad de almacenamiento, desde la carga actual al espacio ocupado.", "headerSection": "Sección", - "headerWarning": "Warning", - "headerCritical": "Critical", + "headerWarning": "Aviso", + "headerCritical": "Crítico", "headerGates": "Qué controla", "thresholdRows": [ { "section": "Uso de CPU", "warning": "85 %", "critical": "95 %", - "gates": "Alerta de carga sostenida cuando la CPU promedia por encima del umbral durante la ventana de scan." + "gates": "Alerta de carga sostenida cuando la CPU media supera el umbral durante el periodo de análisis." }, { "section": "Memoria", "warning": "85 %", "critical": "95 %", - "gates": "Presión de RAM en el host." + "gates": "Presión de RAM del host. La configuración muestra Crítico al 95 %, pero el detector actual usa una regla fija del 90 % sostenido; cambiar ese ajuste no modifica actualmente esa rama de ejecución." }, { - "section": "Swap (solo critical)", + "section": "Uso de swap (solo crítico)", "warning": "—", - "critical": "5 %", - "gates": "Swap realmente en uso. El número es intencionadamente bajo: un host Proxmox sano apenas debería tocar swap, así que incluso un 5 % es una señal significativa de presión de RAM." + "critical": "80 %", + "gates": "El estado CRITICAL de swap exige superar el 80 % de swap y tener menos del 15 % de RAM disponible, sostenido en las muestras. El swap ocupado por sí solo no activa esta regla." }, { "section": "Temperatura de CPU", "warning": "80 °C", "critical": "90 °C", - "gates": "Lectura de temperatura de package / core de CPU desde lm-sensors." + "gates": "Temperatura del conjunto o de los núcleos de CPU obtenida de lm-sensors." }, { "section": "Temp de disco — HDD", "warning": "60 °C", "critical": "65 °C", - "gates": "Drives spinning estándar. El sobre del fabricante topa alrededor de 60–65 °C, así que Critical se fija justo en el límite duro." + "gates": "Temperatura HDD. Valores iniciales: aviso a 60 °C y crítico a 65 °C. Son valores de supervisión, no un límite universal del fabricante; consulta las especificaciones del modelo." }, { "section": "Temp de disco — SSD", "warning": "70 °C", "critical": "75 °C", - "gates": "SSDs SATA 2.5'' / M.2 — corren más frescos que NVMe pero más calientes que HDDs." + "gates": "SSD SATA de 2,5 pulgadas o M.2. Esta clase usa valores iniciales de 70/75 °C; los límites reales dependen del modelo." }, { "section": "Temp de disco — NVMe", "warning": "80 °C", "critical": "85 °C", - "gates": "Los drives NVMe corren más calientes por diseño; los controladores auto-throttlean por encima de ~85 °C, así que Warning captura la escalada antes de que entre el throttling." + "gates": "Temperatura NVMe. Esta clase usa valores iniciales de 80/85 °C. La temperatura de limitación del controlador varía por modelo y no siempre es 85 °C." }, { "section": "Temp de disco — SAS", "warning": "55 °C", "critical": "65 °C", - "gates": "Los drives SAS enterprise comparten el mismo límite de fabricante de ~65 °C que los HDDs, pero se despliegan normalmente en chasis rack con refrigeración activa. Una lectura a 55 °C ya señala un problema de refrigeración (ventilador fallando, problema de HVAC) antes de que el propio drive esté en riesgo — de ahí un Warning más bajo que HDD, no porque SAS sea menos tolerante al calor." + "gates": "Temperatura SAS. Esta clase usa aviso a 55 °C y crítico a 65 °C. Son valores de supervisión, no una prueba de fallo de refrigeración a 55 °C ni un límite universal del fabricante." }, { "section": "Espacio de disco — host", "warning": "85 %", "critical": "95 %", - "gates": "Capacidad de / y cada mountpoint del host (/var/lib/vz, /mnt/*…)." + "gates": "Capacidad de / y de cada punto de montaje del host (/var/lib/vz, /mnt/*…)." }, { "section": "Espacio de disco — rootfs LXC", @@ -176,105 +176,105 @@ "gates": "Disco raíz por contenedor, evaluado contra el tamaño del rootfs según PVE." }, { - "section": "Mount points LXC", + "section": "Puntos de montaje LXC", "warning": "85 %", "critical": "95 %", - "gates": "Capacidad de mountpoints dentro de CTs en ejecución (mp0, mp1, NFS, bind mounts). Excluye rootfs." + "gates": "Capacidad de montajes en CT en ejecución: mp0, mp1, NFS y bind mounts. Excluye rootfs." }, { "section": "Almacenamiento PVE", "warning": "85 %", "critical": "95 %", - "gates": "Almacenamientos PVE estilo bloque (LVM, LVM-thin, ZFS-pool, RBD/Ceph, PBS)." + "gates": "Almacenamientos gestionados por PVE: LVM, LVM-thin, ZFS-pool, RBD/Ceph y PBS. No todos son backends de bloques." }, { "section": "Pool ZFS", "warning": "85 %", "critical": "95 %", - "gates": "Pools ZFS a nivel host — independiente del registro PVE." + "gates": "Pools ZFS del host, con independencia de su registro en PVE." } ], - "defaultsTitle": "Valores por defecto, overrides y reset", - "defaultsBody": "El backend expone una vista fundida: cada sección parte de los valores por defecto de ProxMenux (los que ves cuando el host está recién hecho) y sobreescribes solo los knobs que te importan. La tarjeta muestra el valor efectivo — la sobreescritura si pones una, en otro caso el valor por defecto. Un botón Reset limpia cada override y vuelve a los valores por defecto en todas las secciones de una vez.", + "defaultsTitle": "Valores predeterminados, modificaciones y restablecimiento", + "defaultsBody": "Cada sección parte de los valores predeterminados y solo guardas las modificaciones necesarias. La tarjeta muestra el valor efectivo: tu modificación o el valor inicial. Restablecer borra todas las modificaciones y restaura los valores de todas las secciones.", "validationTitle": "Validación", - "validationBody": "Guardar rechaza valores que no tienen sentido (porcentajes fuera de 0–100, critical por debajo de warning, temperaturas negativas). El frontend muestra el error inline; el backend valida otra vez antes de persistir, así que no se puede engañar a la API con un PUT hecho a mano para que acepte un umbral roto." + "validationBody": "Al guardar se comprueban los rangos permitidos y se rechaza Crítico por debajo de Aviso. La interfaz muestra errores y el servidor vuelve a validar las peticiones API antes de guardar." }, "lxcDetection": { - "heading": "LXC Update Detection", - "imageAlt": "Tarjeta LXC Update Detection con un único switch — cuando está activo, el Monitor escanea periódicamente contenedores LXC Debian/Ubuntu/Alpine en ejecución buscando paquetes con update pendiente.", - "imageCaption": "El toggle para el scan periódico apt list --upgradable / apk list -u a lo largo de cada CT en ejecución. Por defecto ON. El toggle de notificación correspondiente en Notifications → Services solo aparece mientras la detección está activa.", - "intro": "Un toggle dedicado para el scan de actualizaciones LXC, situado entre Health Monitor Thresholds y la tarjeta Notifications. Cuando está ON, ProxMenux recorre cada CT en ejecución del host y consulta al gestor de paquetes dentro del contenedor por updates pendientes; los resultados aterrizan en los contadores de insignias de la pestaña Hardware y alimentan la notificación lxc_updates_available. Cuando está OFF, el scan se detiene por completo (sin llamadas pct exec) y cualquier entrada LXC existente en managed_installs.json se purga inmediatamente, así el panel y el endpoint /api/managed-installs dejan de reportar estado de update LXC sin esperar al siguiente ciclo de 24h.", - "whatRunsTitle": "Qué ejecuta realmente el scan", - "whatRunsIntro": "Para cada CT en estado running con un gestor de paquetes soportado:", + "heading": "Detección de actualización de LXC", + "imageAlt": "Tarjeta de detección de actualizaciones LXC con interruptor para buscar paquetes pendientes en contenedores Debian, Ubuntu y Alpine en ejecución", + "imageCaption": "Interruptor del análisis periódico con apt list --upgradable / apk list -u en los CT en ejecución. Viene activado. El interruptor de aviso en Notificaciones → Servicios aparece mientras la detección está activa.", + "intro": "El interruptor entre Umbrales y Notificaciones controla el análisis LXC. Al activarlo, consulta los gestores de paquetes de CT en ejecución; los resultados aparecen en Hardware y alimentan lxc_updates_available. Al desactivarlo, cesan sus llamadas pct exec y se eliminan las entradas LXC de managed_installs.json, por lo que /api/managed-installs deja de mostrar ese estado sin esperar 24 h.", + "whatRunsTitle": "Qué ejecuta el análisis", + "whatRunsIntro": "Para cada CT en estado running con un gestor de paquetes compatible:", "whatRunsItems": [ - "Gate de frescura de caché. Si la caché de metadatos apt/apk dentro del contenedor es más vieja que 24 horas, primero corre un refresh best-effort (apt-get update -qq en Debian/Ubuntu, apk update en Alpine) con un timeout de 60 s. Cualquier fallo (sin red, repo roto, timeout) se traga en silencio — el listado de abajo sigue corriendo contra la caché que exista, así que un problema transitorio de repo nunca puede empeorar la detección.", - "Listing. Después ProxMenux ejecuta apt list --upgradable / apk list -u y parsea la salida en un recuento estructurado más una muestra de los nombres de paquetes top.", - "Dedup por CT. Una fingerprint construida a partir del recuento, security-count y los nombres top ordenados se almacena para que un conjunto estable de updates pendientes no re-notifique diariamente, mientras que un conjunto significativamente distinto sí lo haga." + "Actualización de metadatos. Si la caché apt/apk supera 24 horas, intenta renovarla con apt-get update -qq en Debian/Ubuntu o apk update en Alpine, con límite de 60 s. Si falla, el listado usa la caché disponible y puede estar desactualizado.", + "Listado. Ejecuta apt list --upgradable / apk list -u y obtiene el número de paquetes y una muestra de sus nombres.", + "Evitar duplicados por CT. Guarda una huella del total, las actualizaciones de seguridad y los nombres ordenados para no repetir avisos diarios del mismo conjunto. Un cambio relevante sí vuelve a avisar." ], - "selfUpdateTitle": "Los CTs que se auto-actualizan fuera de apt pueden legítimamente reportar 0", - "selfUpdateBody": "La detección solo ve lo que el gestor de paquetes dentro del contenedor conoce. Un CT cuyo software clave se actualiza fuera de apt (el cron plexupdate de Plex, contenedores Docker actualizados vía docker pull, el actualizador integrado de Frigate, etc.) seguirá reportando updates apt bajos o cero aunque el appliance se mantenga al día activamente — eso es correcto, no es un bug. El sistema base a nivel apt del mismo CT puede aún tener sus propios updates pendientes, que sí saca a la luz el scan.", - "refreshTitle": "Por qué el auto-refresh de 24 h", - "refreshBody": "Los CTs appliance de larga vida con frecuencia acaban con cachés apt meses desactualizadas porque nadie ejecuta rutinariamente apt update dentro de ellos. Sin el refresh, apt list --upgradable reporta 0 updates desde una snapshot congelada y el operador nunca ve el backlog. El umbral coincide con el resto del ciclo de chequeo — si el CT se refrescó en las últimas 24 h, ProxMenux confía en esa señal y se salta el refresh.", - "toggleTitle": "Toggle de notificación condicional", - "toggleBody": "El toggle de notificación por canal lxc_updates_available en Notifications → Services solo se renderiza mientras la detección está activa. Cuando pones la detección en OFF, esa fila desaparece de la lista de categorías de cada canal — pero su preferencia almacenada se preserva en la DB, así que reactivar la detección trae el toggle de vuelta al valor que tenía antes.", - "purgeTitle": "Qué se purga al desactivar la detección", - "purgeBody": "Apagar el switch elimina inmediatamente cada entrada type=lxc de /usr/local/share/proxmenux/managed_installs.json. Las insignias de la pestaña Hardware caen a cero en el siguiente refresco del panel. Volver a activarlo repuebla el registro en el siguiente ciclo de detección (o antes si disparas un refresh manual desde la API)." + "selfUpdateTitle": "Los CT con actualizaciones fuera de apt pueden mostrar 0", + "selfUpdateBody": "La detección solo cubre el gestor de paquetes del CT. Software actualizado fuera de apt, como un trabajo plexupdate configurado o imágenes obtenidas con docker pull, queda fuera del recuento. Cero actualizaciones apt no demuestra que todas las aplicaciones estén al día. El sistema base del CT puede tener paquetes pendientes que sí se detectan.", + "refreshTitle": "Por qué renovar los metadatos cada 24 h", + "refreshBody": "Un CT de larga duración puede tener metadatos apt antiguos si nadie ejecuta apt update. Entonces apt list --upgradable puede omitir actualizaciones recientes. ProxMenux intenta renovarlos si tienen más de 24 horas y omite el paso si son más recientes.", + "toggleTitle": "Interruptor de aviso condicionado a la detección", + "toggleBody": "El interruptor por canal lxc_updates_available en Notificaciones → Servicios solo aparece con la detección activa. Al desactivarla, la fila se oculta en todos los canales. Su preferencia se conserva en la base de datos y recupera el mismo valor al reactivarla.", + "purgeTitle": "Qué se elimina al desactivar la detección", + "purgeBody": "Desactivarlo elimina de inmediato las entradas type=lxc de /usr/local/share/proxmenux/managed_installs.json. Los contadores de actualizaciones LXC de Hardware desaparecen en el siguiente refresco. Al reactivarlo, el próximo ciclo de detección repuebla el registro, o antes con una actualización manual de la API." }, "storageExclusions": { - "heading": "Remote Storage Exclusions", - "imageAlt": "Tarjeta Remote Storage Exclusions listando almacenamientos PBS-Cloud, PBS y PBS2 con toggles Health y Alerts por fila", - "imageCaption": "Toggles Health y Alerts por almacenamiento. Los almacenamientos con ambos toggles en off dejan de contar contra el Monitor de salud y dejan de generar notificaciones — pero siguen renderizándose en la pestaña Almacenamiento marcados como excluidos.", - "intro": "Marca los almacenamientos gestionados por Proxmox (NFS / CIFS / PBS / Ceph / iSCSI / etc.) como excluidos de monitorización. Dos toggles independientes por almacenamiento:", + "heading": "Exclusiones de almacenamiento remoto", + "imageAlt": "Tarjeta de exclusiones de almacenamiento remoto con PBS-Cloud, PBS y PBS2 y controles de Estado y Alertas por fila", + "imageCaption": "Controles Estado y Alertas por almacenamiento. Con ambos desactivados, deja de participar en Health Monitor y de enviar avisos. Sigue visible en Almacenamiento, marcado como excluido.", + "intro": "Puedes excluir almacenamientos gestionados por Proxmox (NFS / CIFS / PBS / Ceph / iSCSI / etc.) con dos controles independientes:", "items": [ - "Health — cuando está off, el almacenamiento deja de contribuir a la categoría Almacenamiento del Monitor de salud. Útil para volúmenes de archivo que están intencionadamente offline la mayor parte del tiempo o destinos de backup remotos que solo se encienden a horario.", - "Alerts — cuando está off, las alertas sobre este almacenamiento dejan de salir a través de los canales configurados, aunque los chequeos Health sigan activos. Útil cuando quieres la vista del panel pero no las notificaciones." + "Estado — al desactivar este control, el almacenamiento deja de contar en la categoría Almacenamiento de Health Monitor. Útil para volúmenes de archivo habitualmente desconectados o destinos remotos de copia que solo se encienden según un horario.", + "Alertas — desactivarlo impide enviar avisos de este almacenamiento por los canales configurados, aunque los controles de estado sigan activos. Útil si quieres ver su estado en el panel sin recibir avisos." ], - "outro": "Los almacenamientos excluidos siguen renderizándose en la pestaña Almacenamiento con una insignia morada excluded para que la entrada no desaparezca silenciosamente de tu inventario. El estado se persiste en la tabla SQLite excluded_storages." + "outro": "Los almacenamientos excluidos siguen en la pestaña Almacenamiento con la insignia morada excluido, para mantener visible el inventario. El estado se guarda en la tabla SQLite excluded_storages." }, "interfaceExclusions": { - "heading": "Network Interface Exclusions", - "imageAlt": "Tarjeta Network Interface Exclusions listando vmbr0, vmbr1, vmbr2, bond0 y eno1 con toggles Health y Alerts por interfaz", - "imageCaption": "La misma forma que Storage Exclusions — toggles Health y Alerts por interfaz. Cada fila muestra la interfaz, insignia de tipo (bridge / bond / física), la IP y la velocidad del enlace.", - "intro": "La misma forma que Storage Exclusions pero para interfaces de red. Por interfaz: excluir de los chequeos Health y/o excluir de las notificaciones. Casos de uso típicos:", + "heading": "Exclusiones de interfaz de red", + "imageAlt": "Tarjeta de exclusiones de interfaces con vmbr0, vmbr1, vmbr2, bond0 y eno1 y controles de Estado y Alertas por interfaz", + "imageCaption": "Igual que las exclusiones de almacenamiento, ofrece Estado y Alertas por interfaz. Cada fila muestra nombre, tipo (bridge / bond / física), IP y velocidad del enlace.", + "intro": "El mismo principio se aplica a las interfaces: excluir cada una de los controles de estado, de los avisos o de ambos. Ejemplos habituales:", "items": [ - "Un bridge spare intencionadamente down.", - "Una NIC que se retiró físicamente pero sigue referenciada en /etc/network/interfaces.", - "Una sub-interfaz VLAN usada solo durante ventanas de mantenimiento.", - "Un bridge de gestión que está up pero no lleva tráfico — flappeando ruidosamente en cada ciclo." + "Un bridge de reserva desactivado intencionadamente.", + "Una NIC retirada físicamente que aún figura en /etc/network/interfaces.", + "Una subinterfaz VLAN usada solo durante tareas de mantenimiento.", + "Un bridge de gestión con cambios de estado del enlace conocidos y repetidos durante el mantenimiento." ], - "outro": "El estado se persiste en la tabla SQLite excluded_interfaces. La misma insignia morada excluded en la pestaña Red para que las interfaces excluidas sigan visibles." + "outro": "El estado se guarda en la tabla SQLite excluded_interfaces. La insignia morada excluida de la pestaña Red mantiene visibles las interfaces excluidas." }, "notifications": { "heading": "Notificaciones e IA", - "body1": "Esta sección de la pestaña Settings es donde se activan las notificaciones de ProxMenux Monitor y el reescritor con IA. Pulsar Enable Notifications arranca el hilo de envío en background, registra un target de webhook de Proxmox VE en el host para que los eventos emitidos por PVE fluyan al mismo pipeline y despliega el formulario de canales para que puedas conectar Telegram, Discord, Email, Gotify y el resto. El reescritor con IA vive dentro del mismo panel como una sección avanzada colapsable.", - "body2": "Ambas superficies tienen muchas piezas en movimiento — canales, toggles por evento, mensajes Rich, el Display Name, el pipeline de envío (dedup, cooldown, agregación, quiet hours), la integración del webhook PVE, proveedores de IA, modos de prompt — y viven en sus propias páginas dedicadas en lugar de repetirse aquí:", + "body1": "Aquí se activan las notificaciones de ProxMenux Monitor y la reformulación con IA. Activar notificaciones inicia el proceso de envío en segundo plano, registra un destino webhook de Proxmox VE para incorporar sus eventos y abre el formulario de canales: Telegram, Discord, correo, Gotify y otros. La reformulación con IA está en una sección avanzada desplegable del mismo panel.", + "body2": "Sus opciones se explican en páginas propias: canales, controles por evento, mensajes enriquecidos, nombre visible, envío (duplicados, espera, agrupación y horario de silencio), webhook PVE, proveedores de IA y modos de instrucciones:", "items": [ - "Notificaciones — recorridos por canal (Telegram, Discord, Gotify, Email + app passwords de Gmail / Microsoft, ntfy, Slack, Teams, webhook genérico), categorías por evento, mensajes Rich, Display Name, pipeline de envío, integración del webhook PVE, historial y API.", - "Asistente de IA — proveedores (OpenAI, Anthropic, Gemini, Groq, OpenRouter, Ollama), selección de modelo, modos de prompt (default / custom), idioma de salida, niveles de detalle por canal y sugerencias de IA." + "Notificaciones: configuración de canales (Telegram, Discord, Gotify, correo y contraseñas de aplicación de Gmail / Microsoft, ntfy, Slack, Teams y webhook genérico), categorías por evento, mensajes enriquecidos, nombre visible, envío, webhook PVE, historial y API.", + "Asistente de IA: proveedores (OpenAI, Anthropic, Gemini, Groq, OpenRouter, Ollama), modelos, instrucciones predeterminadas o personalizadas, idioma de salida, detalle por canal y sugerencias de IA." ] }, "optimizations": { - "heading": "ProxMenux Optimizations", - "intro": "Un inventario en vivo y transparente de cada optimización post-instalación de ProxMenux actualmente activa en el host. Cada vez que aplicas una opción post-instalación desde el lado Scripts — ya sea vía el Automated post-install o vía el Customizable post-install a la carta — el script correspondiente se registra a sí mismo en /usr/local/share/proxmenux/installed_tools.json. El Monitor lee ese archivo y renderiza esta tarjeta para que veas, de un vistazo, qué se ha cambiado en tu servidor.", - "imageAlt": "Tarjeta ProxMenux Optimizations con rejilla de herramientas instaladas, cada fila mostrando un punto verde, nombre de la herramienta y versión. Ejemplos incluyen APT IPv4 Force, Bashrc Customization, Fastfetch, Log2ram SSD Protection, Memory Settings Optimization, Setting persistent network interfaces, System Limits Increase, APT Language Skip, Entropy Generation haveged con insignia Legacy, Kernel Panic Configuration, Logrotate Optimization, Network Optimizations, Subscription Banner Removal, VFIO IOMMU Passthrough — 14 activas en total", - "imageCaption": "La tarjeta lista cada optimización activa con su nombre, versión, un punto coloreado y un contador naranja 14 active arriba a la derecha. Las herramientas cuyo source es alcanzable son pulsables.", + "heading": "Optimizaciones ProxMenux", + "intro": "Inventario de optimizaciones posteriores a la instalación registradas por ProxMenux en el host. Las opciones de Instalación posterior automatizada y Instalación posterior personalizable registran su aplicación en /usr/local/share/proxmenux/installed_tools.json. Monitor usa ese registro para la tarjeta. Una entrada no comprueba de nuevo que todos los ajustes sigan intactos.", + "imageAlt": "Tarjeta de optimizaciones ProxMenux con 14 entradas: punto de color, nombre y versión. Figuran APT IPv4 Force, Bashrc Customization, Fastfetch, Log2ram SSD Protection, Memory Settings Optimization, Setting persistent network interfaces, System Limits Increase, APT Language Skip, Entropy Generation haveged con Legacy, Kernel Panic Configuration, Logrotate Optimization, Network Optimizations, Subscription Banner Removal y VFIO IOMMU Passthrough.", + "imageCaption": "Cada optimización aparece con nombre, versión y punto de color. Arriba a la derecha hay un contador naranja 14 activas. Las herramientas con código fuente disponible se pueden abrir.", "dotsTitle": "Qué significan los puntos", "dotsItems": [ - " Punto verde — optimización actual, registrada por la versión activa de ProxMenux. El código fuente es alcanzable: pulsa la fila para abrirlo.", - " Punto ámbar + insignia legacy — aplicada por una versión más vieja de ProxMenux cuyo script ha sido renombrado o reemplazado desde entonces. Sigue activa en el host; el source abre en modo \"legacy\" (con un acento ámbar) para que puedas auditar qué se ejecutó realmente." + " Punto verde: optimización registrada sin marca Legacy ni actualización indicada. Pulsa la fila si tiene código fuente disponible.", + " Punto ámbar e insignia legacy: optimización registrada cuyo script cambió de nombre o fue sustituido. Abre su código conservado en modo Legacy con detalles ámbar. No comprueba de nuevo la configuración actual del host." ], - "clickTitle": "Acceso al código fuente", - "clickBody": "Pulsar una herramienta abre una modal con la función bash exacta que aplicó el cambio, más la ruta del archivo de script en el que vive (auto_post_install.sh para el bundle Automated, customizable_post_install.sh para el lado à la carte). Los comentarios y constructos de shell tienen syntax highlighting; un botón Copy pone el source en tu portapapeles. Esta es la superficie \"muestra tu trabajo\" — verifica lo que ProxMenux le hizo a tu host antes de cualquier cambio manual que añadas encima.", - "detailAlt": "Modal de código fuente de herramienta para APT IPv4 Force mostrando la función bash force_apt_ipv4 desde customizable_post_install.sh versión 1.0 con código resaltado que configura /etc/apt/apt.conf.d/99-force-ipv4 con Acquire ForceIPv4 true, registra la herramienta y emite un mensaje translate APT IPv4 configuration completed", - "detailCaption": "Modal de source para APT IPv4 Force — función force_apt_ipv4() exacta de customizable_post_install.sh v1.0, con syntax highlighting y un Copy de un clic.", + "clickTitle": "Abrir el código fuente", + "clickBody": "Pulsar una herramienta abre su función bash asociada y el nombre del script (auto_post_install.sh o customizable_post_install.sh). Para herramientas actuales se extrae del archivo del host; las antiguas pueden usar código conservado. Hay resaltado de sintaxis y Copiar. No garantiza una copia del código exacto ejecutado al instalar.", + "detailAlt": "Ventana de código de APT IPv4 Force con la función bash force_apt_ipv4 de customizable_post_install.sh versión 1.0. El código resaltado configura /etc/apt/apt.conf.d/99-force-ipv4 con Acquire ForceIPv4 true, registra la herramienta y muestra un mensaje traducido de configuración APT IPv4 completada.", + "detailCaption": "Código de APT IPv4 Force: función force_apt_ipv4() de customizable_post_install.sh v1.0, con resaltado de sintaxis y copia con un clic.", "whyTitle": "Por qué importa esto", - "whyBody": "ProxMenux cambia cosas en tu host: parámetros de kernel, configuración de repositorios, bits de red, rotación de logs, passthrough de GPU, etc. Saber exactamente qué está activo es esencial antes de empezar a añadir customización manual encima — y aún más si un admin distinto opera el host del que lo montó. Esta tarjeta es el registro auditable de cada optimización actualmente en efecto, con el código exacto que la produjo.", - "updatesTitle": "Banner Updates available", - "updatesBody": "Cuando una optimización post-instalación tiene en disco una versión más nueva que la actualmente registrada en el host, la tarjeta muestra un banner \"Updates available\" arriba con el recuento y un botón Apply. Pulsar Apply abre un selector por optimización (el mismo disponible desde la entrada Apply available updates del menú Post-Install). Elige qué optimizaciones aplicar; ProxMenux relanza la función correspondiente y refresca la versión en el registro. Cuando todo está al día, el banner desaparece.", - "updatesAlt": "Tarjeta ProxMenux Optimizations con un banner Updates available arriba — recuento de updates pendientes más un botón Apply que abre el selector por optimización", - "updatesCaption": "El banner solo se renderiza cuando al menos una optimización tiene una versión más nueva en disco. Mira Apply Available Updates para el flujo completo de update y el equivalente Path-A en el menú de la shell.", - "revertTitle": "Revertir una optimización", - "revertBody": "La tarjeta es de solo lectura — para deshacer una optimización, ejecuta la opción correspondiente Uninstall Optimizations del menú ProxMenux Scripts. El paso de desinstalación elimina la entrada de installed_tools.json, así que desaparece de esta tarjeta en el siguiente refresco." + "whyBody": "ProxMenux puede cambiar parámetros del kernel, repositorios, red, rotación de registros y passthrough de GPU. Revisa las optimizaciones registradas antes de añadir cambios manuales, sobre todo si otro administrador preparó el host. La tarjeta muestra el registro y el código disponible; no audita todos los ajustes actuales ni conserva un historial exacto de ejecución.", + "updatesTitle": "Aviso de actualizaciones disponibles", + "updatesBody": "Si la versión de una optimización disponible en disco supera la registrada en el host, aparece un aviso con el total y Aplicar. Aplicar abre un selector de optimizaciones, como Aplicar actualizaciones disponibles del menú posterior a la instalación. Elige cuáles actualizar: ProxMenux vuelve a ejecutar sus funciones y actualiza el registro. El aviso desaparece cuando no quedan versiones pendientes.", + "updatesAlt": "Tarjeta de optimizaciones ProxMenux con aviso de actualizaciones disponibles, número pendiente y botón Aplicar para seleccionar optimizaciones", + "updatesCaption": "El aviso aparece si al menos una optimización tiene una versión más reciente en disco. Consulta Aplicar actualizaciones disponibles para el proceso completo y la opción equivalente Path-A del menú de consola.", + "revertTitle": "Deshacer una optimización", + "revertBody": "Para deshacer una optimización, usa la opción correspondiente de Desinstalar optimizaciones en ProxMenux Scripts. Al desinstalar se elimina su entrada de installed_tools.json y desaparece de la tarjeta en el siguiente refresco." }, "dataCollected": { "heading": "Cómo se recopilan los datos", @@ -285,22 +285,22 @@ { "card": "Idioma de la interfaz", "endpoint": "localStorage", - "source": "Preferencia del navegador proxmenux-ui-language, obtenida inicialmente del idioma del navegador cuando todavía no existe una selección guardada." + "source": "Preferencia proxmenux-ui-language del navegador; inicialmente usa su idioma si no hay una elección guardada." }, { "card": "Orden de navegación", "endpoint": "localStorage", - "source": "Preferencia del navegador proxmenux-nav-order; también determina la pestaña inicial." + "source": "Preferencia proxmenux-nav-order del navegador; también determina la pestaña inicial." }, { - "card": "Network Units", + "card": "Unidades de red", "endpoint": "/api/settings", - "source": "Persistido en la tabla SQLite de settings del panel." + "source": "Guardado en la tabla de ajustes SQLite del panel." }, { - "card": "Duraciones del Monitor de salud", + "card": "Duraciones de Health Monitor", "endpoint": "/api/health/settings", - "source": "Duraciones de supresión por categoría en la DB de Health." + "source": "Duración de silenciamiento por categoría en la base de datos de Health Monitor." }, { "card": "Exclusiones de almacenamiento / interfaz", @@ -310,17 +310,17 @@ { "card": "Panel Notificaciones e IA", "endpoint": "/api/notifications/*", - "source": "Mira las páginas dedicadas Notificaciones / Asistente de IA." + "source": "Consulta Notificaciones y Asistente de IA." }, { - "card": "Lista ProxMenux Optimizations", + "card": "Lista de optimizaciones ProxMenux", "endpoint": "/api/proxmenux/installed-tools", - "source": "Lee /usr/local/share/proxmenux/installed_tools.json, escrito por llamadas register_tool dentro de los scripts post-instalación." + "source": "Lee /usr/local/share/proxmenux/installed_tools.json, escrito mediante llamadas a register_tool en los scripts posteriores a la instalación." }, { - "card": "Modal de código fuente de optimización", + "card": "Ventana de código de optimización", "endpoint": "/api/proxmenux/tool-source", - "source": "Extrae la función bash correspondiente de auto_post_install.sh o customizable_post_install.sh en el host." + "source": "Extrae la función bash asociada de auto_post_install.sh o customizable_post_install.sh del host; las antiguas pueden usar código conservado." } ] }, @@ -330,37 +330,37 @@ { "label": "Pestaña Apps", "href": "/docs/monitor/dashboard/apps", - "tail": " — el lanzador cuya posición se puede cambiar desde Orden de navegación." + "tail": " — el lanzador cuya posición se cambia con Orden de navegación." }, { "label": "Notificaciones", "href": "/docs/monitor/notifications", - "tail": " — canales, toggles por evento, overrides de canal, historial, test-send." + "tail": " — canales, controles por evento, ajustes particulares por canal, historial y envíos de prueba." }, { "label": "Asistente de IA", "href": "/docs/monitor/ai-assistant", - "tail": " — proveedores, modelos, modos de prompt, idiomas, niveles de detalle por canal." + "tail": " — proveedores, modelos, modos de instrucciones, idiomas y detalle por canal." }, { - "label": "Monitor de salud → Descartar alertas y la Suppression Duration", + "label": "Health Monitor → Descartar alertas y duración del silenciamiento", "href": "/docs/monitor/health-monitor#dismissing-alerts-and-the-suppression-duration", - "tail": " — la semántica detrás de los desplegables por categoría de arriba." + "tail": " — cómo funcionan los desplegables de duración por categoría." }, { - "label": "ProxMenux Scripts → Automated post-install", + "label": "ProxMenux Scripts → Ajustes posteriores a la instalación automatizados", "href": "/docs/post-install/automated", - "tailRich": " y Customizable post-install — los scripts reales que se registran en la lista de optimizaciones de arriba." + "tailRich": " y Ajustes posteriores a la instalación personalizables: los scripts que registran las optimizaciones en la lista anterior." }, { - "label": "Uninstall Optimizations", + "label": "Desinstalar optimizaciones", "href": "/docs/post-install/uninstall", - "tail": " — cómo revertir una optimización registrada arriba." + "tail": " — cómo deshacer una optimización de la lista anterior." }, { "label": "Índice del panel", "href": "/docs/monitor/dashboard", - "tail": " — volver al resumen de la pestaña." + "tail": " — volver al resumen de pestañas." } ] } diff --git a/web/messages/es/docs/monitor/dashboard/storage.json b/web/messages/es/docs/monitor/dashboard/storage.json index 066259a1..162982b3 100644 --- a/web/messages/es/docs/monitor/dashboard/storage.json +++ b/web/messages/es/docs/monitor/dashboard/storage.json @@ -1,193 +1,193 @@ { "meta": { - "title": "ProxMenux Monitor — Panel: pestaña Almacenamiento | ProxMenux Documentation", - "description": "La pestaña Almacenamiento consolida cuatro vistas: almacenamientos gestionados por Proxmox con su estado, pools ZFS, discos físicos internos con datos SMART y unidades externas (USB). La vista en detalle de cada disco expone atributos SMART, desgaste y vida útil y el historial permanente de observaciones." + "title": "ProxMenux Monitor — Panel: pestaña Almacenamiento | Documentación de ProxMenux", + "description": "La pestaña Almacenamiento reúne cuatro vistas: almacenamientos Proxmox con su estado, pools ZFS, discos internos con SMART y unidades USB externas. El detalle de cada disco muestra atributos SMART, desgaste, vida útil e historial permanente de observaciones." }, "header": { "title": "Panel: pestaña Almacenamiento", - "description": "El estado de almacenamiento del host en una pantalla — pools de Proxmox (NFS / CIFS / LVM / ZFS / dir), salud de pools ZFS, discos internos SATA / NVMe con SMART y unidades USB externas. Pulsa cualquier disco para abrir una vista en detalle con la tabla completa de atributos SMART y el historial de observaciones por disco.", + "description": "Todo el almacenamiento del host en una pantalla: NFS / CIFS / LVM / ZFS / dir de Proxmox, estado de pools ZFS, discos internos SATA/NVMe con SMART y unidades USB externas. Pulsa un disco para abrir sus atributos SMART y su historial de observaciones.", "section": "ProxMenux Monitor · Panel" }, "intro": { "title": "Respaldado por tres fuentes", - "body": "Los almacenamientos Proxmox vienen de pvesm status; el estado ZFS de zpool status; los discos físicos de lsblk + smartctl (y nvme para campos específicos de NVMe). La pestaña refresca cada ~60 segundos; la vista en detalle por disco dispara una lectura SMART fresca bajo demanda." + "body": "Los almacenamientos Proxmox proceden de pvesm status; ZFS, de zpool status; los discos físicos, de lsblk + smartctl, y nvme para campos específicos. La pestaña se actualiza aproximadamente cada 60 segundos; abrir el detalle solicita una lectura SMART." }, "thresholds": { "title": "Colores de estado y umbrales aplicados aquí", - "intro": "Cada barra, chip y punto de esta pestaña sigue la misma clasificación de tres estados — verde por debajo de Warning, ámbar entre Warning y Critical, rojo en Critical y por encima. Valores por defecto recomendados que vienen con ProxMenux:", + "intro": "Health Monitor clasifica el estado como verde por debajo de Aviso, ámbar entre Aviso y Crítico y rojo desde Crítico. Sus valores predeterminados se indican a continuación. Las barras del panel pueden usar otros límites visuales, descritos más abajo.", "items": [ - "Capacidad (discos del host, almacenamientos PVE, pools ZFS, mounts de LXC) — Warning 85 %, Critical 95 %.", + "Capacidad (discos del host, almacenamientos PVE, pools ZFS y montajes LXC): aviso 85 %, crítico 95 %.", "Temperatura de disco — HDD 60/65 °C · SSD 70/75 °C · NVMe 80/85 °C · SAS 55/65 °C (warning / critical)." ], - "outro": "Cada valor es configurable por host — Settings → Health Monitor Thresholds es la fuente única de verdad y explica cómo ajustarlos." + "outro": "Puedes configurar cada valor por host. Ajustes → Umbrales de Health Monitor recoge los valores y explica cómo ajustarlos." }, "topRow": { - "heading": "Fila superior: almacenamiento de un vistazo", - "intro": "Al abrir la pestaña Almacenamiento aterrizas en un resumen de cuatro tarjetas del estado de almacenamiento del host — capacidad total, qué se está usando localmente, qué se está usando en almacenamientos remotos y el inventario de discos físicos. Cada tarjeta es una respuesta de una línea a una pregunta común; las tarjetas debajo de la fila son donde profundizas en el detalle.", - "imageAlt": "Pestaña Almacenamiento — fila superior de cuatro tarjetas de estadísticas: Total Storage, Local Used, Remote Used, Physical Disks", - "imageCaption": "Fila superior de la pestaña Almacenamiento — capacidad total y recuento de discos, bytes usados separados en almacenamientos locales vs remotos y un desglose por tipo de discos físicos con su resumen de salud.", + "heading": "Fila superior: resumen del almacenamiento", + "intro": "Al abrir Almacenamiento, cuatro tarjetas resumen capacidad total, uso local, uso remoto e inventario de discos físicos. Ofrecen respuestas rápidas; las tarjetas inferiores contienen los detalles.", + "imageAlt": "Pestaña Almacenamiento, con cuatro tarjetas: capacidad total, uso local, uso remoto y discos físicos", + "imageCaption": "Fila superior: capacidad total y número de discos, bytes usados localmente y en remoto y desglose de discos físicos por tipo con resumen de estado.", "headerCard": "Tarjeta", "headerWhat": "Qué muestra", - "totalLabel": "Total Storage", - "totalWhat": "Capacidad bruta combinada de todos los discos físicos. La línea al pie muestra el recuento de discos físicos descubiertos.", - "localLabel": "Local Used", - "localWhat": "Bytes usados en almacenamientos locales (LVM / LVM-thin / ZFS / dir en los discos del propio host). Muestra los bytes usados de forma prominente, con una línea al pie X.XX % de Y TB para que veas el porcentaje de llenado al mismo tiempo.", - "remoteLabel": "Remote Used", - "remoteWhat": "La misma forma que Local Used pero para almacenamientos remotos (NFS / CIFS / PBS / Ceph / iSCSI). Se cuentan por separado porque las caídas remotas no afectan a los datos locales y normalmente los dimensionas y monitorizas de forma diferente.", - "disksLabel": "Physical Disks", + "totalLabel": "Almacenamiento total", + "totalWhat": "Capacidad bruta total de todos los discos físicos. El pie indica cuántos discos se han detectado.", + "localLabel": "Local usado", + "localWhat": "Bytes usados en almacenamientos locales: LVM / LVM-thin / ZFS / dir en los discos del host. El valor principal indica los bytes usados y el pie X.XX % de Y TB muestra también el porcentaje de ocupación.", + "remoteLabel": "Uso remoto", + "remoteWhat": "El mismo formato que Uso local, para almacenamientos remotos NFS / CIFS / PBS / Ceph / iSCSI. Se cuentan por separado porque los fallos remotos y locales tienen un alcance distinto y estos recursos suelen dimensionarse y supervisarse de forma diferente.", + "disksLabel": "Discos físicos", "disksIntro": "Dos líneas de desglose para el inventario:", "disksItems": [ - "Por tipo — recuentos de NVMe (morado), SSD (azul) y HDD (azul) descubiertos. Los hosts con discos mixtos reciben los tres; un host todo-NVMe muestra solo el recuento NVMe.", - "Por salud — recuentos de discos normal (verde), warning (amarillo) y critical (rojo). El estado sano normalmente muestra solo \"X normal\"; warnings y critical aparecen solo cuando algo escala." + "Por tipo: número de NVMe en morado y de SSD y HDD en azul. Se muestran los tipos detectados; un host solo con NVMe muestra únicamente ese recuento.", + "Por estado: número de discos normales en verde, con aviso en amarillo y críticos en rojo. Sin problemas, solo aparece «X normales»; los otros estados aparecen cuando hay incidencias." ] }, "pveStorage": { "heading": "Tarjeta Proxmox Storage", - "intro": "Una fila por almacenamiento configurado en /etc/pve/storage.cfg. Cada fila muestra la insignia de tipo (nfs / cifs / zfspool / lvm / lvmthin / dir / pbs), el nombre del almacenamiento, una insignia active / error / not-monitored, el porcentaje de uso y una barra de progreso coloreada:", + "intro": "Una fila por almacenamiento de /etc/pve/storage.cfg, con tipo (nfs / cifs / zfspool / lvm / lvmthin / dir / pbs), nombre, estado activo/error/no supervisado, porcentaje de uso y barra de color:", "items": [ - "< 75 % — barra de progreso azul, valor en azul.", - "75 – 90 % — barra de progreso amarilla, valor en amarillo (el Monitor de salud avisa en este punto).", - "> 90 % — barra de progreso roja, valor en rojo (el Monitor de salud escala).", - "error — fila entera con borde rojo, se usa cuando el almacenamiento está configurado pero inalcanzable (servidor NFS caído, credenciales CIFS caducadas).", - "excluded — borde morado + la insignia \"not monitored\". Almacenamientos excluidos explícitamente por el usuario de los chequeos de salud (cómodo para volúmenes manuales / de archivo que están intencionadamente offline)." + "Hasta el 75 %: barra y valor azules.", + "Más del 75 % y hasta el 90 %: barra y valor amarillos. Son límites visuales distintos de los umbrales de Health Monitor.", + "> 90 %: barra y valor rojos. Este límite visual es distinto del escalado de Health Monitor.", + "Error: borde rojo en toda la fila cuando el almacenamiento está configurado pero no es accesible, por ejemplo por caída de NFS o credenciales CIFS caducadas.", + "Excluido: borde morado y etiqueta «no supervisado». Almacenamientos que has excluido de las comprobaciones, como volúmenes de archivo que mantienes desconectados." ], - "calloutTitle": "Excluir un almacenamiento ruidoso", - "calloutBody": "Desde la fila del almacenamiento, el menú por almacenamiento te permite marcarlo como excluded from monitoring. El flag se guarda en la tabla excluded_storages y lo respetan tanto la vista del panel como el ciclo del Monitor de salud — no se disparan notificaciones para almacenamientos excluidos, y no empujan la pastilla de la cabecera." + "calloutTitle": "Excluir un almacenamiento de la supervisión", + "calloutBody": "El menú de cada almacenamiento permite marcarlo como excluido de la supervisión. Se guarda en excluded_storages y lo respetan el panel y Health Monitor: no genera notificaciones ni afecta al indicador general." }, "zfs": { "heading": "Tarjeta ZFS Pools", - "intro": "Se renderiza solo cuando ZFS está instalado y existe al menos un pool. Una fila por pool con una insignia de salud, size / allocated / free y un icono que refleja el estado de salud:", + "intro": "Solo aparece si ZFS está instalado y existe al menos un pool. Cada fila muestra un pool con estado, tamaño, espacio asignado y libre e icono de estado:", "items": [ "ONLINE — verde. Todo sano.", - "DEGRADED — amarillo. El pool sigue sirviendo datos pero al menos un dispositivo no está disponible; arranca la ventana de reemplazo.", - "FAULTED / UNAVAIL / SUSPENDED — rojo. El pool no sirve datos; se requiere intervención inmediata." + "DEGRADED: amarillo. El pool sirve datos, pero al menos un dispositivo no está disponible; hay que gestionar su sustitución.", + "FAULTED / UNAVAIL / SUSPENDED: rojo. El pool no sirve datos y requiere intervención inmediata." ], - "outro": "Tanto el estado ZFS como el estado SMART por disco alimentan la categoría Disks & I/O del Monitor de salud." + "outro": "El estado ZFS y SMART de cada disco contribuyen a la categoría Discos y E/S de Health Monitor." }, "physical": { - "heading": "Physical Disks & SMART Status", + "heading": "Discos físicos y estado SMART", "intro": "Discos internos (SATA / NVMe). Cada fila condensa los campos más útiles de un vistazo:", "items": [ "Ruta del dispositivo — /dev/sda, /dev/nvme0n1.", - "Insignia de tipo — SATA / NVMe (y el icono correspondiente).", - "Insignia System — etiqueta naranja que marca los discos desde los que se está ejecutando el SO del host. El panel lo deriva de los mountpoints de / y /boot: cualquier disco físico que los aloje recibe la etiqueta System para que no lo borres o reasignes por accidente. Los discos sin la etiqueta son unidades puras de datos.", - "Modelo — vendor + cadena del modelo de smartctl -i.", - "Capacidad — formateada de forma legible.", - "Temperatura — °C actuales, coloreada por el umbral de tipo de disco (NVMe corre más caliente que SATA).", - "Estado SMART — passed / failed / unknown.", - "Insignia de observaciones — cuando el historial permanente disk_observations tiene entradas para este disco, aparece una insignia azul con el recuento (p. ej. 3 obs.). Pulsa el disco para entrar y revisarlas.", - "Insignia de salud — Healthy / Warning / Critical, derivada del chequeo SMART + observaciones recientes." + "Etiqueta de tipo: SATA / NVMe y su icono.", + "Etiqueta de sistema: marca naranja para los discos identificados como discos del SO. Se detectan mediante los montajes de / y /boot y reciben la etiqueta System. La ausencia de etiqueta no demuestra que se puedan borrar o reutilizar sin riesgo.", + "Modelo: fabricante y modelo de smartctl -i.", + "Capacidad: expresada en unidades legibles.", + "Temperatura: °C actuales, con color según el umbral del tipo de disco; NVMe admite umbrales más altos que SATA.", + "Estado SMART: correcto / fallido / desconocido.", + "Etiqueta de observaciones: si el historial permanente disk_observations contiene entradas del disco, aparece una etiqueta azul con el número, como 3 obs.. Pulsa el disco para revisarlas.", + "Etiqueta de estado: Correcto / Aviso / Crítico, según SMART y las observaciones recientes." ], - "clickHint": "La fila entera es pulsable y abre la vista en detalle por disco descrita abajo.", - "warningTitle": "No toques los discos con etiqueta System a la ligera", - "warningBody": "Los discos con la insignia naranja System alojan el SO en ejecución. El panel expone la etiqueta como guardarraíl — las acciones destructivas lanzadas desde ProxMenux → Disk Manager → Format / Wipe se niegan explícitamente a actuar sobre ellos. Si de verdad necesitas reasignar el disco de arranque, hazlo desde un entorno de rescate, no desde dentro de Proxmox." + "clickHint": "Toda la fila se puede pulsar para abrir el detalle del disco descrito más abajo.", + "warningTitle": "Cuidado con los discos etiquetados como System", + "warningBody": "Los discos con etiqueta naranja System alojan el SO activo. La etiqueta ayuda a identificarlos; ProxMenux → Gestor de discos → Formatear / Borrar rechaza las acciones destructivas sobre ellos. Para reutilizar un disco de arranque, usa un entorno de rescate externo al Proxmox en ejecución." }, "external": { - "heading": "External Storage (USB)", - "body": "Una tarjeta separada para unidades conectadas por USB, solo se renderiza cuando hay al menos una presente. Los mismos campos que los discos internos más una etiqueta naranja USB. Las unidades USB suelen aparecer y desaparecer (backups en frío, jobs ocasionales de descarga), así que el Monitor de salud es conservador con ellas — las observaciones se retienen, pero los errores de E/S en una unidad USB desconectada no escalan." + "heading": "Almacenamiento externo (USB)", + "body": "Las unidades USB tienen una tarjeta propia, visible cuando hay alguna conectada. Muestra los mismos campos que los discos internos y una etiqueta naranja USB. Como suelen conectarse solo para copias o transferencias ocasionales, se conservan sus observaciones, pero los errores de E/S de una unidad USB desconectada no se escalan." }, "drillIn": { - "heading": "Modal de vista en detalle de disco", - "intro": "Pulsar cualquier fila de disco abre una modal con cuatro pestañas: Overview · SMART · History · Schedule. La cabecera siempre muestra la ruta del dispositivo, el modelo + capacidad y la insignia naranja System si aplica.", - "overviewTitle": "Pestaña 1 — Overview", - "overviewImageAlt": "Modal de vista en detalle de disco — pestaña Overview con estado de salud, anillo Wear & Lifetime y atributos SMART rápidos", - "overviewImageCaption": "Pestaña Overview — identidad, insignia de salud, anillo de vida restante con el desgaste actual y los datos escritos, además de un bloque rápido con los atributos SMART más vigilados.", - "overviewIntro": "La pestaña por defecto al entrar — todo lo que necesitas para responder \"¿este disco está bien?\" sin lanzar un test. Tres bloques:", + "heading": "Diálogo de detalle del disco", + "intro": "Pulsa un disco para abrir cuatro pestañas: Resumen · SMART · Historial · Programación. La cabecera muestra ruta, modelo, capacidad y, si corresponde, la etiqueta naranja System.", + "overviewTitle": "Pestaña 1 — Resumen", + "overviewImageAlt": "Detalle de disco, pestaña Resumen con estado, indicador circular de desgaste y vida útil y atributos SMART principales", + "overviewImageCaption": "Resumen: identificación, estado, vida restante con desgaste actual y datos escritos, y atributos SMART principales.", + "overviewIntro": "Pestaña inicial para consultar el estado del disco sin ejecutar una prueba. Tiene tres bloques:", "overviewItems": [ - "Identity — modelo, serial, capacidad, insignia Health (Healthy / Warning / Critical).", - "Wear & Lifetime — anillo grande de vida restante (97 %, 50 %, …) con el atributo de origen explícito (Media Wearout Indicator, Percentage Used, …), una barra de desgaste (% de consumo actual), una proyección Est. Life en años y los Data Written totales. Los discos NVMe también muestran Available Spare.", - "SMART Attributes — seis campos titulares en una rejilla de 2 columnas: Temperature, Power On Hours (con duración humanizada como 3y 116d), Rotation Rate (o SSD), Power Cycles, SMART Status, Reallocated Sectors, Pending Sectors, CRC Errors. La tabla de atributos completa vive en la pestaña SMART." + "Identificación: modelo, número de serie, capacidad y estado Correcto / Aviso / Crítico.", + "Desgaste y vida útil: indicador circular de vida restante (97 %, 50 %, …) con atributo de origen (Media Wearout Indicator, Percentage Used, …), barra del porcentaje consumido, proyección Vida estimada en años y total de datos escritos. NVMe también muestra Available Spare.", + "Atributos SMART: los datos principales se muestran en dos columnas: temperatura, horas de encendido (con una duración legible, como 3 años y 116 días), velocidad de rotación (o SSD), ciclos de encendido, estado SMART, sectores reasignados, sectores pendientes y errores CRC. La tabla completa de atributos se encuentra en la pestaña SMART." ], "smartTitle": "Pestaña 2 — SMART", - "smartImageAlt": "Modal de vista en detalle de disco — pestaña SMART con botones Run SMART Test (Short / Extended), resultado del último test y la tabla completa de atributos SMART", - "smartImageCaption": "Pestaña SMART — lanza un test Short o Extended, mira el resultado del último test, scrollea la tabla completa de atributos SMART y genera el informe PDF completo de salud.", - "smartIntro": "Donde viven las acciones. Tres secciones:", + "smartImageAlt": "Detalle del disco, pestaña SMART con pruebas corta y extendida, resultado anterior y tabla completa de atributos", + "smartImageCaption": "Pestaña SMART: ejecuta pruebas cortas o extendidas, consulta el último resultado, revisa todos los atributos y abre el informe completo para imprimirlo o guardarlo como PDF.", + "smartIntro": "Acciones disponibles, en tres secciones:", "smartItems": [ - "Run SMART Test — dos botones. Short Test (~2 min) corre síncrono y muestra el resultado inline. Extended Test (background) puede tardar horas en discos grandes, corre en el servidor y dispara una notificación cuando termina.", - "Last Test — tipo, insignia de estado (passed / failed) y timestamp de la ejecución más reciente.", - "SMART Attributes — la tabla completa de atributos (ID / nombre / valor / worst / estado con iconos OK / warning / critical). Para SATA / SAS, la lista numerada clásica. Para NVMe, los campos estructurados de nvme smart-log (temperatura, available spare, percentage used, data units written / read, host reads / writes, controller busy time, power cycles, unsafe shutdowns, media errors, error-log entries, warning / critical composite temperature time)." + "Ejecutar prueba SMART: dos botones. Prueba corta (~2 min) espera al resultado y lo muestra en el diálogo. Prueba extendida (segundo plano) puede tardar horas en discos grandes, continúa en el servidor y avisa al terminar.", + "Última prueba: tipo, estado (correcta / fallida) y fecha y hora de la última ejecución.", + "Atributos SMART: tabla completa con ID, nombre, valor, peor valor y estado correcto, aviso o crítico. SATA/SAS muestra la lista numerada. NVMe usa nvme smart-log: temperatura, reserva disponible, porcentaje usado, unidades leídas/escritas, lecturas/escrituras del host, tiempo ocupado del controlador, ciclos de encendido, apagados inseguros, errores del medio, entradas del registro de errores y tiempo con temperatura compuesta en aviso/crítico." ], - "pdfTitle": "View Full SMART Report (PDF)", - "pdfIntro": "Al pie de la pestaña SMART, el botón View Full SMART Report genera un PDF imprimible y listo para archivo — el mismo informe estructurado que enviarías a un fabricante para un RMA.", - "pdfPreviewAlt": "Primera página del PDF SMART Health Report generado — Executive Summary con el anillo PASSED + bloque Disk Information", - "pdfPreviewCaption": "Primera página del SMART Health Report — Executive Summary con el anillo PASSED y el bloque Disk Information completo. El PDF completo de abajo lleva el anillo de desgaste SSD, cada atributo SMART y el historial de tests.", + "pdfTitle": "Ver informe SMART completo (PDF)", + "pdfIntro": "Al pie de SMART, Ver informe SMART completo abre un informe imprimible. Usa el diálogo de impresión del navegador para guardarlo como PDF, archivarlo o compartirlo con el fabricante en un RMA.", + "pdfPreviewAlt": "Primera página del informe SMART: resumen ejecutivo con indicador PASSED e información del disco", + "pdfPreviewCaption": "Primera página: resumen, indicador PASSED e información completa del disco. El PDF de ejemplo incluye desgaste SSD, todos los atributos SMART e historial de pruebas.", "pdfDownloadLabel": "Descargar informe SMART de ejemplo (PDF)", - "pdfSectionsIntro": "El informe tiene cinco secciones de alto nivel:", + "pdfSectionsIntro": "El informe tiene seis secciones principales:", "pdfSections": [ - "Executive Summary — gran veredicto PASSED / FAILED, párrafo de evaluación de salud del disco en lenguaje claro (\"tu disco está sano / muestra signos de desgaste / está fallando\") y cuatro estadísticas rápidas (timestamp del informe, tipo del último test, resultado del test, atributos comprobados).", - "Disk Information — modelo, serial, capacidad, tipo (HDD / SSD / NVMe), familia, form factor, interfaz (SATA 3.3 · 6.0 Gb/s, …), soporte de TRIM, temperatura actual con el umbral óptimo, tiempo de power-on, ciclos de encendido, estado SMART, además de los contadores titulares (pending sectors, CRC errors, reallocated sectors).", - "SSD Wear & Lifetime (solo SSD / NVMe) — anillo de vida restante, atributo de origen, nivel actual de desgaste, datos escritos, horas de power-on.", - "SMART Attributes (full) — cada atributo que reporta el drive, con ID, nombre, valor, worst, threshold, valor raw y una pastilla de estado. Los más relevantes para el usuario (Reallocated Sector Ct, Power On Hours, Reported Uncorrect, UDMA CRC Error Count, Media Wearout Indicator, …) incluyen una explicación de una línea en lenguaje claro bajo la fila.", - "Last Self-Test Result + Full Self-Test History — el último test (tipo, resultado, mensaje de finalización, en qué marca de power-on-hours) más una tabla numerada de cada test retenido.", - "Recommendations — items de acción basados en el veredicto: Disk is Healthy / Schedule periodic tests / Backup strategy para discos sanos, lenguaje en escalada con guía de reemplazo cuando los atributos se salen de rango." + "Resumen ejecutivo: estado PASSED/FAILED, evaluación clara del disco —correcto, con desgaste o fallando— y cuatro datos: fecha del informe, tipo de última prueba, resultado y atributos comprobados.", + "Información del disco: modelo, serie, capacidad, tipo HDD/SSD/NVMe, familia, formato, interfaz (SATA 3.3 · 6.0 Gb/s, …), TRIM, temperatura y umbral óptimo, horas y ciclos de encendido, SMART, sectores pendientes y reasignados y errores CRC.", + "Desgaste y vida útil SSD (solo SSD/NVMe): indicador de vida restante, atributo de origen, desgaste actual, datos escritos y horas de encendido.", + "Atributos SMART completos: ID, nombre, valor, peor valor, umbral, valor bruto y estado de cada atributo. Los principales —Reallocated Sector Ct, Power On Hours, Reported Uncorrect, UDMA CRC Error Count, Media Wearout Indicator, …— incluyen una explicación breve bajo su fila.", + "Última autoprueba e historial completo: última prueba con tipo, resultado, mensaje final y horas de encendido en ese momento, más una tabla numerada de todas las pruebas conservadas.", + "Recomendaciones: acciones según el resultado. Para discos correctos: disco sano / pruebas periódicas / estrategia de copias. Si los atributos salen de rango, incluye indicaciones de sustitución." ], - "pdfOutro": "El PDF se produce en el servidor y se descarga con un patrón de nombre estable (SMART-<short-id>.pdf) para que múltiples snapshots a lo largo del tiempo puedan convivir en tu archivo. Útil cuando estás rastreando degradación a lo largo de meses o enviando evidencia al soporte del fabricante.", - "historyTitle": "Pestaña 3 — History", - "historyImageAlt": "Modal de vista en detalle de disco — pestaña History listando tests SMART pasados con acciones de descarga y borrado", - "historyImageCaption": "Pestaña History — cada test SMART retenido para este disco. Por fila: tipo, timestamp, etiqueta \"X days ago\", marca latest, descargar (salida raw de smartctl) y acciones de borrado.", - "historyIntro": "El pool retenido de tests SMART para este disco — tanto las ejecuciones short como extended que se completaron. Cada entrada es la salida raw de smartctl capturada en tiempo de ejecución, más los campos estructurados que el Monitor parseó para el panel. Acciones por fila:", + "pdfOutro": "El navegador crea el informe imprimible; Imprimir y Guardar como PDF abren su diálogo de impresión. Elige un nombre como SMART-<short-id>.pdf. Conserva copias fechadas para comparar cambios o compartirlas con el fabricante.", + "historyTitle": "Pestaña 3 — Historial", + "historyImageAlt": "Detalle del disco, pestaña Historial con pruebas SMART anteriores y acciones de descarga y eliminación", + "historyImageCaption": "Historial de pruebas SMART del disco. Cada fila muestra tipo, fecha y hora, antigüedad, marca de última prueba y acciones de descarga de la salida smartctl y eliminación.", + "historyIntro": "Pruebas cortas y extendidas completadas y conservadas para el disco. Cada entrada guarda la salida original de smartctl y los campos que Monitor interpreta para el panel. Acciones por fila:", "historyItems": [ - "Download — guarda la salida raw de smartctl -a como un archivo de texto. Idéntico a lo que parsea el informe PDF, útil cuando necesitas la línea exacta que pide un fabricante.", - "Delete — elimina el test del historial. El límite de retención fijado en la pestaña Schedule (Last 5 / 10 / 20) borra el más viejo primero automáticamente; esta acción es la sobreescritura manual." + "Descargar: guarda la instantánea JSON con los datos de smartctl -a usados por el informe. Útil si el fabricante necesita los campos de diagnóstico originales.", + "Eliminar: borra una prueba del historial manualmente. La retención de Programación (últimas 5 / 10 / 20) elimina automáticamente las más antiguas." ], - "scheduleTitle": "Pestaña 4 — Schedule", - "scheduleImageAlt": "Modal de vista en detalle de disco — pestaña Schedule con el toggle Automatic SMART Tests, la lista de schedules configurados y el botón Add Schedule", - "scheduleImageCaption": "Pestaña Schedule — elige tipo de test, frecuencia y retención; el Monitor lo conecta a cron para que los tests corran sin atención.", - "scheduleIntro": "Tests SMART automáticos guiados por cron, sin shell. La página tiene tres áreas:", + "scheduleTitle": "Pestaña 4 — Programación", + "scheduleImageAlt": "Detalle del disco, pestaña Programación con interruptor de pruebas SMART automáticas, lista de horarios y botón Añadir programación", + "scheduleImageCaption": "Programación: elige tipo, frecuencia y retención; Monitor configura cron para ejecutar las pruebas automáticamente.", + "scheduleIntro": "Pruebas SMART automáticas mediante cron, sin usar la terminal. Tres áreas:", "scheduleItems": [ - "Toggle Automatic SMART Tests — interruptor global on/off para cada schedule de este disco. Útil cuando quieres pausar todo durante mantenimiento sin perder las definiciones de schedule.", - "Configured Schedules — una fila por schedule existente con la insignia de tipo de test (short / long), la expresión cron en forma humana (\"Day 1 of month at 03:00\", \"Every Sunday at 02:00\"), los discos que cubre y el ajuste de retención.", - "Add Schedule / Edit Schedule — formulario con: Test Type (Short ~2 min / Long 1-4 h), Frequency (Daily / Weekly / Monthly), Day of Month / Day of Week, Time, Keep Results (Last 5 / 10 / 20)." + "Pruebas SMART automáticas: interruptor general de todos los horarios del disco. Permite pausarlos durante el mantenimiento sin borrar su configuración.", + "Programaciones configuradas: una fila por horario con tipo (corto / largo), expresión cron legible («Día 1 de cada mes a las 03:00», «Cada domingo a las 02:00»), discos incluidos y retención.", + "Añadir / Editar programación: tipo (corta ~2 min / larga 1–4 h), frecuencia (diaria / semanal / mensual), día del mes o semana, hora y resultados guardados (últimos 5 / 10 / 20)." ], - "scheduleOutro": "El schedule se materializa como una entrada cron en el host que llama de vuelta al Monitor; los resultados se guardan en el mismo historial SMART mostrado en la pestaña 3, y el ajuste de retención auto-poda el test más viejo cuando termina uno nuevo.", - "tempTitle": "Modal de historial de temperatura", - "tempIntro": "Cada disco que expone un sensor de temperatura tiene sus lecturas muestreadas de forma continua por el Monitor y persistidas a una serie temporal local. El valor actual aparece como uno de los seis atributos SMART titulares en la pestaña Overview; pulsar ese bloque abre una modal dedicada de historial de temperatura con la imagen completa.", - "tempImageAlt": "Modal de historial de temperatura de disco — cabecera con la ruta y modelo del disco, un selector de timeframe (1 Hour / 24 Hours / 7 Days / 30 Days), una fila de cuatro tarjetas de estadísticas (Current / Min / Avg / Max) y una gráfica de línea de la temperatura sobre el rango seleccionado coloreada por los umbrales por tipo de disco", - "tempImageCaption": "Detalle de temperatura — se abre desde la pestaña Overview en cualquier disco cuyo sensor devuelva una lectura no-cero. La gráfica se colorea contra el umbral de tipo de disco (HDD / SSD / NVMe / SAS).", - "tempShowsTitle": "Lo que muestra la modal", + "scheduleOutro": "El horario crea una entrada cron en el host que llama a Monitor. Los resultados se guardan en el historial SMART de la pestaña 3 y la retención elimina automáticamente los más antiguos al terminar una prueba nueva.", + "tempTitle": "Diálogo de historial de temperatura", + "tempIntro": "Monitor toma periódicamente las lecturas de los discos con sensor de temperatura y las guarda en un historial local. El valor actual aparece en Resumen; al pulsarlo, se abre el detalle del historial de temperatura.", + "tempImageAlt": "Historial de temperatura del disco con ruta y modelo, periodos de 1 hora, 24 horas, 7 días o 30 días, indicadores Actual/Mínimo/Media/Máximo y gráfico de líneas coloreado según los umbrales del tipo de disco", + "tempImageCaption": "El detalle de temperatura se abre desde Resumen si el sensor devuelve un valor distinto de cero. El gráfico usa umbrales de HDD / SSD / NVMe / SAS.", + "tempShowsTitle": "Qué muestra el diálogo", "tempShowsItems": [ - "Selector de timeframe con cuatro rangos: 1 Hour, 24 Hours (por defecto), 7 Days, 30 Days. Cada uno consulta al mismo backend con un downsampling distinto para que la gráfica siga legible en cada horizonte.", - "Cuatro tarjetas de estadísticas en lo alto de la modal: Current, Min, Avg, Max para el rango seleccionado. La tarjeta Current se colorea con los mismos umbrales de estado que usan la pestaña Almacenamiento y las notificaciones, para que veas de un vistazo si el disco está en territorio normal / warm / hot.", - "Gráfica de línea de la temperatura a lo largo del tiempo, con la línea y el área sombreada coloreadas por tipo de disco:" + "Selector de periodo: 1 hora, 24 horas por defecto, 7 días o 30 días. Cada consulta ajusta la resolución para mantener el gráfico legible.", + "Cuatro indicadores: Actual, Mínimo, Media y Máximo del periodo. Actual usa los umbrales de la pestaña Almacenamiento y las notificaciones para distinguir temperatura normal, elevada o alta.", + "Gráfico de líneas de la temperatura a lo largo del tiempo, con línea y área sombreada coloreadas según el tipo de disco:" ], "tempDiskTypes": [ "HDD — umbrales típicamente más frescos.", "SSD — umbrales moderados.", "NVMe — umbrales más altos (NVMe corre más caliente por diseño).", - "SAS — mismos valores por defecto que HDD." + "SAS: aviso a 55 °C y crítico a 65 °C, con umbral de aviso distinto al HDD." ], - "tempConfigurable": "Los cuatro son configurables desde Settings → Health Monitor Thresholds.", - "tempWhyTitle": "Por qué importa aquí un historial", + "tempConfigurable": "Los cuatro tipos se configuran en Ajustes → Umbrales de Health Monitor.", + "tempWhyTitle": "Por qué importa el historial", "tempWhyItems": [ - "Detección de drift. Los discos que se calientan progresivamente a lo largo de semanas (ventilador fallando, acumulación de polvo, disco vecino muriéndose y empujando aire caliente) son invisibles para una lectura única de \"temperatura actual\". Las vistas de 7 días y 30 días sacan el drift a la superficie.", - "Correlación de picos. Cuando una ventana de backup o un rebuild empujaron el disco brevemente por encima de su umbral, los rangos de 1 hora y 24 horas muestran si fue puntual o un patrón recurrente.", - "Ajuste de umbrales. Antes de subir o bajar un umbral en Settings → Health Monitor Thresholds, la gráfica de 30 días muestra el rango operativo real del disco para que el nuevo valor encaje con lo que el hardware realmente hace en vez de un cálculo a ojo." + "Detectar tendencias. Una lectura aislada no revela que un disco lleva semanas calentándose, por ejemplo por fallos de ventilación, polvo o calor cercano. Las vistas de 7 y 30 días permiten ver la evolución.", + "Relacionar picos. Si una copia de seguridad o reconstrucción elevó brevemente la temperatura por encima del umbral, las vistas de 1 y 24 horas muestran si fue puntual o recurrente.", + "Ajustar umbrales. Antes de cambiarlos en Ajustes → Umbrales de Health Monitor, consulta el gráfico de 30 días para conocer el rango real de funcionamiento del disco." ], - "obsTitle": "Historial de observaciones (a lo largo de pestañas)", - "obsIntro": "Los discos modernos fallan de forma gradual. Un disco puede reportar SMART PASSED y aún así loguear errores ocasionales de lectura en dmesg, perder enlaces SATA o exponer pending sectors que van y vienen. La UI estándar de Proxmox te muestra el veredicto SMART actual — no mantiene un historial de esas señales. ProxMenux sí, y las expone directamente dentro de la modal de disco.", - "obsImageAlt": "Pestaña Overview de la modal Disk Details mostrando un disco sano con estado SMART Passed, 0 errores reallocated/pending/CRC y una sección Observations listando un evento I/O Error registrado con el mensaje raw del kernel, una traducción humana del código de error ATA, timestamps de primera y última ocurrencia y un contador de ocurrencias", - "obsImageCaption": "Un disco que SMART dice que está bien puede aún así tener un historial de observaciones. La tarjeta es la capa de señales histórica bajo el veredicto SMART.", + "obsTitle": "Historial de observaciones en las pestañas", + "obsIntro": "Los fallos de disco pueden desarrollarse gradualmente. Un disco puede indicar SMART PASSED y registrar errores de lectura en dmesg, perder enlaces SATA o mostrar sectores pendientes intermitentes. ProxMenux conserva estas señales y las muestra en el diálogo junto al estado SMART actual.", + "obsImageAlt": "Resumen de un disco con SMART correcto y cero sectores reasignados, pendientes y errores CRC, pero una observación de error E/S con mensaje original del kernel, explicación ATA, primera y última fecha y contador", + "obsImageCaption": "Un disco que supera SMART puede tener observaciones anteriores. La tarjeta añade el historial de señales al estado actual.", "obsWhatTitle": "Qué es una observación", - "obsWhatIntro": "Cualquier cosa que ProxMenux capture en el log del kernel, dmesg o salida SMART que parezca un evento a nivel de disco — y que por sí sola sería demasiado granular para una notificación — se registra como una observación. Cada fila muestra:", + "obsWhatIntro": "ProxMenux registra como observación los eventos de disco detectados en el registro del kernel, dmesg o SMART que por sí solos serían demasiado específicos para una notificación. Cada fila muestra:", "obsWhatItems": [ - "Insignia de tipo (I/O Error, SMART Error, Filesystem Error, ZFS Pool Error, Connection Error).", - "Mensaje raw del kernel tal cual apareció en dmesg — útil al copiar y pegar en un buscador o en un ticket de soporte.", - "Una frase humana bajo el mensaje raw para códigos ATA conocidos (IDNF → \"Sector address not found — posible bad sector o problema de cable\", UNC → \"Uncorrectable read error — bad sector\", y el resto de códigos estándar).", - "Timestamps de primera y última ocurrencia, más un contador de ocurrencias deduplicado por signature de error." + "Tipo: error E/S, SMART, sistema de archivos, pool ZFS o conexión.", + "Mensaje original del kernel tal como aparece en dmesg, para copiarlo a un buscador o solicitud de soporte.", + "Explicación breve para códigos ATA conocidos: IDNF, dirección de sector no encontrada, posible sector defectuoso o cable; UNC, error de lectura irrecuperable, sector defectuoso; y otros códigos estándar.", + "Primera y última fecha y número de apariciones, agrupadas por firma del error." ], - "obsWhyTitle": "Por qué ProxMenux las registra y las muestra", + "obsWhyTitle": "Por qué ProxMenux las registra y muestra", "obsWhyItems": [ - "El fallo de disco rara vez es un evento único. Normalmente empieza con errores esporádicos de bus ATA, algún sector UNC o un par de errores medium semanas antes de que SMART pase a FAILED. Sin persistencia esos avisos tempranos desaparecen de dmesg en el siguiente arranque.", - "SMART puede mentir. Un drive puede mostrar todos los atributos en verde y aún así estar a punto de irse — la capa de observaciones captura los síntomas que SMART no expone (en especial ICRC, IDNF, link resets a velocidades SATA más bajas).", - "Separa \"está pasando ahora\" de \"pasó recientemente\". El Monitor de salud auto-resuelve errores transitorios en cuanto dejan de dispararse, lo cual es genial para mantener limpia la lista de alertas activas — pero aún quieres ver, días después, que este disco tuvo tres errores de E/S esa noche. La tabla de observaciones es la respuesta.", - "Alimenta el modelo de notificación por niveles. El detector disk_io lee la tasa de observaciones de esta tabla para decidir silent / WARNING / CRITICAL (la ventana deslizante de 24h introducida en 1.2.1.2). El historial es lo que hace posible esa clasificación." + "Los fallos pueden evolucionar. Pueden aparecer errores de bus ATA, sectores UNC o errores del medio antes de que SMART indique FAILED. El búfer dmesg no los conserva tras reiniciar; el historial de observaciones sí.", + "SMART no descarta todos los fallos. Un disco puede tener atributos verdes y presentar problemas. Las observaciones conservan síntomas adicionales, como ICRC, IDNF, reinicios de enlace SATA o reducción de velocidad.", + "Distingue lo actual de lo reciente. Health Monitor resuelve automáticamente errores transitorios que dejan de aparecer. El historial permite comprobar días después que el disco tuvo, por ejemplo, tres errores de E/S esa noche.", + "Alimenta las notificaciones por niveles. disk_io usa la frecuencia de observaciones de la tabla para elegir silencio, WARNING o CRITICAL mediante una ventana móvil de 24 horas introducida en 1.2.1.2." ], - "obsDedupTitle": "Cómo funcionan dedup y re-notificación", - "obsDedupBody1": "Las observaciones se deduplican por su signature — una huella estable del tipo de error, dispositivo y campos clave de la línea del kernel. El mismo evento repitiéndose sube el occurrence_count de la fila existente en lugar de crear una nueva. Una signature diferente en el mismo disco crea una nueva observación y se trata como un evento nuevo para efectos de notificación.", - "obsDedupBody2": "Las notificaciones siguen una regla anti-cascada: la primera ocurrencia de una combinación (disco, signature, severidad) dada avisa al operador, y entonces ProxMenux espera 24 horas antes de volver a pingar sobre la misma combinación — aunque el contador siga subiendo. Una severidad escalando (WARNING → CRITICAL) rompe el cooldown para que se le cuente al operador cuando las cosas empeoran, no solo cuando ocurren.", - "obsDismissTitle": "Historial permanente vs errores activos", - "obsDismissBody1": "Una observación no se puede descartar, ocultar ni eliminar. Cada observación distinta de un disco es una tarjeta; la misma observación vista de nuevo suma a su contador de ocurrencias y actualiza su última fecha en lugar de crear otra tarjeta. El historial pertenece al disco, identificado por su número de serie: un disco conectado donde había otro empieza sin ninguna, y un disco que el kernel renombra conserva las suyas.", - "obsDismissBody2": "Resolver o descartar del lado de error activo (Monitor de salud) es independiente de las observaciones — la observación persiste más allá del auto-resolve del error activo. Ese es justo el punto: sobrevive, para que un warning transitorio de la semana pasada siga visible hoy en la tarjeta del disco. Mira Monitor de salud para el lado de error activo de la misma imagen." + "obsDedupTitle": "Agrupación de duplicados y repetición de avisos", + "obsDedupBody1": "Las observaciones se agrupan por firma, una huella estable del tipo de error, dispositivo y campos clave del mensaje. Las repeticiones aumentan occurrence_count en la fila existente. Una firma distinta crea otra observación y cuenta como evento nuevo para las notificaciones.", + "obsDedupBody2": "Para evitar avisos en cascada, la primera combinación de disco, firma y gravedad notifica al operador. La misma combinación no vuelve a avisar hasta pasadas 24 horas, aunque aumente el contador. Un cambio de WARNING a CRITICAL interrumpe esa espera y avisa del empeoramiento.", + "obsDismissTitle": "Historial permanente y errores activos", + "obsDismissBody1": "Las observaciones no se pueden descartar, ocultar ni borrar. Cada firma tiene una tarjeta; si se repite, aumenta el contador y actualiza la última fecha. El historial sigue al número de serie: otro disco empieza vacío aunque use el mismo puerto, y un cambio de nombre del kernel no pierde el historial.", + "obsDismissBody2": "Resolver o descartar un error activo en Health Monitor no modifica sus observaciones. Se conservan después de la resolución automática, de modo que un aviso transitorio de la semana pasada siga visible hoy. Consulta Health Monitor para gestionar los errores activos." }, "dataCollected": { "heading": "Cómo se recopilan los datos", @@ -196,14 +196,14 @@ "headerSource": "Fuente", "rows": [ { - "section": "Tarjetas resumen superiores", + "section": "Tarjetas de resumen superiores", "endpoint": "/api/storage/summary", "source": "Agregado desde lsblk, zpool list, vgs / lvs." }, { "section": "Inventario por disco", "endpoint": "/api/storage", - "source": "lsblk -O + smartctl -i por dispositivo, con caché estable de identidad de disco (limpiado en eventos de hot-plug)." + "source": "lsblk -O + smartctl -i por dispositivo, con caché de identidad que se vacía al conectar o desconectar discos en caliente." }, { "section": "Almacenamientos Proxmox", @@ -213,22 +213,22 @@ { "section": "Valores SMART actuales", "endpoint": "/api/storage/smart/", - "source": "smartctl -A <dev> — refrescado bajo demanda, no cacheado." + "source": "smartctl -A <dev> es una de las consultas disponibles; el endpoint de detalle también usa JSON SMART completo y datos específicos de NVMe." }, { - "section": "Historial de self-tests SMART", + "section": "Historial de autopruebas SMART", "endpoint": "/api/storage/smart//history", - "source": "Almacenado bajo /var/lib/proxmenux-monitor/smart/<disk>/ como snapshots JSON." + "source": "Se guarda en /usr/local/share/proxmenux/smart/<disk>/ como instantáneas JSON." }, { "section": "Observaciones permanentes", "endpoint": "/api/storage/observations", - "source": "Tabla SQLite alimentada por el Monitor de salud cada ciclo (se mantiene tras auto-resolve)." + "source": "Tabla SQLite actualizada por Health Monitor en cada ciclo, conservada después de resolver errores activos." } ], "outro": "Verificar la cadena de recolección en el host:", - "codeComment1": "# Traer la snapshot actual desde un script", - "codeComment2": "# Cross-check de lo que ve el panel contra la vista raw del SO" + "codeComment1": "# Obtener el estado actual desde un script", + "codeComment2": "# Contrastar los datos del panel con el estado directo del sistema operativo" }, "whereNext": { "heading": "Por dónde seguir", @@ -236,17 +236,17 @@ { "label": "Monitor de salud", "href": "/docs/monitor/health-monitor", - "tail": " — la categoría discos y E/S y el modelo de supresión." + "tail": " — categoría Discos y E/S y reglas de supresión." }, { "label": "Referencia de la API", "href": "/docs/monitor/api", - "tail": " — los endpoints de storage y SMART." + "tail": " — endpoints de almacenamiento y SMART." }, { "label": "Notificaciones", "href": "/docs/monitor/notifications", - "tailRich": " — qué disparan aguas abajo disk_io_error, storage_unavailable y smart_test_failed." + "tailRich": " — qué acciones posteriores desencadenan disk_io_error, storage_unavailable y smart_test_failed." }, { "label": "Índice del panel", @@ -254,14 +254,14 @@ "tail": " — el resto de pestañas." }, { - "label": "ProxMenux → Disk Manager", + "label": "ProxMenux → Gestor de discos", "href": "/docs/disk-manager", - "tail": " — la cara de las acciones: format / wipe / SMART tests / importar discos a VMs y CTs desde la TUI." + "tail": " — acciones de la TUI: formatear, borrar, pruebas SMART e importar discos a VM y contenedores." }, { - "label": "ProxMenux → SMART Disk Health & Test", + "label": "ProxMenux → Estado y pruebas SMART del disco", "href": "/docs/disk-manager/smart-disk-test", - "tail": " — la contraparte CLI de esta pestaña: programar tests SMART, exportar el JSON que renderiza el panel y la referencia más profunda de tipos de test / interpretación." + "tail": " — equivalente CLI: programar pruebas SMART, exportar el JSON mostrado en el panel y consultar los tipos de prueba y su interpretación." } ] } diff --git a/web/messages/es/docs/monitor/dashboard/system-logs.json b/web/messages/es/docs/monitor/dashboard/system-logs.json index c771895b..a618efd4 100644 --- a/web/messages/es/docs/monitor/dashboard/system-logs.json +++ b/web/messages/es/docs/monitor/dashboard/system-logs.json @@ -1,41 +1,41 @@ { "meta": { - "title": "ProxMenux Monitor — Panel: pestaña Logs del sistema | ProxMenux Documentation", + "title": "ProxMenux Monitor — Panel: Logs del sistema | Documentación de ProxMenux", "description": "La pestaña Logs del sistema reúne tres fuentes en una sola pantalla: journalctl en vivo con filtros y descarga, historial de tareas de Proxmox (UPIDs) y log de notificaciones — todo buscable, filtrable por severidad / rango temporal y descargable como paquetes de texto." }, "header": { "title": "Panel: pestaña Logs del sistema", - "description": "Tres sub-pestañas bajo un mismo techo: el journal del sistema (journalctl con filtros), el historial de tareas de Proxmox y el log de notificaciones. Las tres son buscables, filtrables y descargables como paquetes de texto.", + "description": "Tres subpestañas en una pantalla: journal del sistema (journalctl con filtros), historial de tareas de Proxmox y registro de notificaciones. Las tres permiten buscar, filtrar y descargar los datos como paquetes de texto.", "section": "ProxMenux Monitor · Panel" }, "readOnly": { "title": "Solo lectura por diseño", - "body": "Nada en esta pestaña modifica los archivos de log. Los filtros viven en la URL / estado, las descargas son paquetes generados en el servidor. El panel nunca borra entradas de log — para mantenimiento usa el propio journalctl --vacuum-time=<N> o logrotate del host." + "body": "Esta pestaña no modifica los archivos de log. Los filtros se mantienen en la URL o en el estado de la interfaz y las descargas se generan en el servidor. El panel nunca borra entradas; para su mantenimiento usa journalctl --vacuum-time=<N> o logrotate en el host." }, "topRow": { "heading": "Fila superior: cuatro contadores", "items": [ - "Total Entries — número de registros dentro de la ventana de filtro activa.", - "Errors — recuento de severidad ≤ 3 (err / crit / alert / emerg).", - "Warnings — recuento de severidad 4 (warning).", - "Backups — recuento de entradas de tareas vzdump / PBS en la misma ventana." + "Entradas totales: número de registros dentro del intervalo del filtro activo.", + "Errores: número de entradas con severidad ≤ 3 (err / crit / alert / emerg).", + "Advertencias: número de entradas con severidad 4 (warning).", + "Copias de seguridad: número de entradas de tareas vzdump / PBS en el mismo intervalo." ] }, "subtabs": { "heading": "Tres sub-pestañas", - "logsTitle": "Logs", - "logsIntro": "El journal del sistema, servido por journalctl en el backend. Filtros disponibles en la barra de herramientas:", + "logsTitle": "Registros", + "logsIntro": "El journal del sistema, obtenido en el servidor con journalctl. La barra de herramientas ofrece estos filtros:", "logsFilters": [ - "Severidad — emerg / alert / crit / err / warning / notice / info / debug, o cualquier combinación.", + "Severidad: emerg / alert / crit / err / warning / notice / info / debug o cualquier combinación.", "Rango temporal — últimos 5 min / 15 min / 1 h / 6 h / 24 h / 7 d / personalizado.", - "Búsqueda de texto libre — substring o regex (journalctl --grep).", - "Filtro por unidad — restringir a una unidad systemd concreta (pveproxy.service, nginx.service, …)." + "Búsqueda de texto libre: subcadena o expresión regular (journalctl --grep).", + "Filtro de unidad: restringe a una unidad systemd concreta (pveproxy.service, nginx.service, …)." ], "logsRowsAfter": "Cada fila muestra timestamp, insignia de severidad, unidad de origen y el mensaje. Los mensajes largos se colapsan con un conmutador \"mostrar más\". La acción Download empaqueta el filtro actual en un único archivo .txt vía GET /api/logs/download — útil cuando quieres compartir un trozo del journal con alguien.", "logDetailsModalTitle": "Modal Log Details", - "logDetailsBody": "Pulsar cualquier fila abre una modal Log Details con cada campo estructurado que journald capturó para esa entrada — la misma vista que construirías a mano ejecutando journalctl --output=verbose en el host.", + "logDetailsBody": "Al pulsar una fila se abre Detalles del log con todos los campos estructurados que journald capturó para esa entrada, como al ejecutar journalctl --output=verbose en el host.", "logDetailsImageAlt": "Modal Log Details — una entrada del journal desplegada con Level, Service, Timestamp, Source, Systemd Unit, Process ID, Hostname y el mensaje completo", - "logDetailsImageCaption": "Modal Log Details — cada campo estructurado que journald lleva para esta entrada, con el mensaje íntegro sin truncar al final. Útil para logs de cron y de servicios donde importa la línea de comandos ejecutada.", + "logDetailsImageCaption": "Detalles del log: todos los campos estructurados de journald para la entrada, con el mensaje completo sin truncar al final. Útil para logs de cron y servicios donde importa la línea de comando ejecutada.", "fieldsIntro": "Campos mostrados:", "fields": [ "Level — insignia de severidad coloreada (INFO / WARNING / ERROR / CRITICAL).", @@ -45,15 +45,15 @@ "Systemd Unit — la unidad .service / .timer / .socket real si la entrada estaba asociada a una.", "Process ID — PID del proceso emisor.", "Hostname — útil cuando los journals se reenvían entre nodos de cluster.", - "Message — el mensaje completo sin truncar en un bloque monoespaciado, listo para copiar." + "Mensaje: mensaje completo sin truncar, en un bloque monoespaciado listo para copiar." ], "maxLevelStoreTitle": "MaxLevelStore de journald", - "maxLevelStoreBody": "En una instalación recién hecha de Proxmox, journald usa por defecto MaxLevelStore=warning, lo que descarta en silencio los mensajes de nivel info. El Monitor lo detecta en el arranque y añade un drop-in (/etc/systemd/journald.conf.d/proxmenux-loglevel.conf) que sube el umbral a info para que la pestaña Logs tenga algo que mostrar en todas las severidades.", - "backupsTitle": "Backups", + "maxLevelStoreBody": "En una instalación nueva de Proxmox, journald usa por defecto MaxLevelStore=warning, que descarta los mensajes info. Monitor lo detecta al arrancar y añade un archivo de configuración complementario (/etc/systemd/journald.conf.d/proxmenux-loglevel.conf) con el umbral info para conservar los mensajes informativos y los de mayor gravedad. Esto no incluye debug.", + "backupsTitle": "Copias de seguridad", "backupsBody": "Historial de tareas de Proxmox filtrado a las entradas relacionadas con backup. Una fila por tarea (vzdump, transferencias PBS, Garbage Collect, Verify) con el estado (OK / WARNINGS / ERROR), el guest implicado, el almacenamiento de origen, la duración y el UPID. Pulsa una fila para cargar el log completo de la tarea vía GET /api/task-log/<upid> — los mismos datos que Proxmox expone a través de Datacenter → Tasks, acotado a backups.", - "notificationsTitle": "Notifications", - "notificationsBody1": "Cada notificación enviada por el Monitor — Telegram, Discord, Email, Gotify, ntfy, Slack, Teams, webhook. Cada fila: timestamp, canal, tipo de evento, severidad, el título renderizado, el cuerpo renderizado y (si IA está activa) un conmutador para ver la reescritura con IA junto al original.", - "notificationsBody2": "Usa esta pestaña para verificar que un canal está entregando de verdad y para comparar lo que produjo la reescritura con IA frente a la plantilla base. La configuración de canales vive en la página detallada de Notificaciones." + "notificationsTitle": "Notificaciones", + "notificationsBody1": "Todas las notificaciones enviadas por Monitor: Telegram, Discord, correo electrónico, Gotify, ntfy, Slack, Teams y webhook. Cada fila muestra fecha y hora, canal, tipo de evento, severidad, título y cuerpo generados y, si la IA está activa, un selector para comparar su reescritura con el original.", + "notificationsBody2": "Usa esta pestaña para verificar la entrega de un canal y comparar la reescritura de IA con la plantilla base. Los canales se configuran en la página detallada de Notificaciones." }, "dataCollected": { "heading": "Cómo se recopilan los datos", @@ -64,27 +64,27 @@ { "subtab": "Logs (filtro en vivo)", "endpoint": "/api/logs", - "source": "journalctl --output json --since <range> con filtros de severidad / unidad / búsqueda aplicados en el servidor." + "source": "journalctl --output json --since <range> con filtros de severidad, unidad y búsqueda aplicados en el servidor." }, { - "subtab": "Download", + "subtab": "Descargar", "endpoint": "/api/logs/download", "source": "La misma consulta, devuelta como texto plano para grep / less." }, { - "subtab": "Backups", + "subtab": "Copias de seguridad", "endpoint": "/api/backups", "source": "Historial de tareas PVE filtrado por vzdump, transferencias PBS, Garbage Collect, Verify." }, { - "subtab": "Vista en detalle de una tarea de backup", + "subtab": "Detalles de una tarea de copia de seguridad", "endpoint": "/api/task-log/<upid>", "source": "Log completo de la tarea en texto plano leído de /var/log/pve/tasks/<index>/<upid>." }, { "subtab": "Historial de notificaciones", "endpoint": "/api/notifications/history", - "source": "Tabla SQLite notification_history alimentada por el loop de envío." + "source": "Tabla SQLite notification_history, alimentada por el bucle de envío." } ], "apiIntro": "Tanto el filtro en vivo como las descargas también son accesibles vía API:", @@ -98,17 +98,17 @@ { "label": "Monitor de salud", "href": "/docs/monitor/health-monitor", - "tail": " — la categoría Logs del sistema que vigila patrones persistentes / picos / cascadas." + "tail": " — la categoría Logs del sistema, que vigila patrones persistentes, picos y cascadas." }, { "label": "Notificaciones", "href": "/docs/monitor/notifications", - "tail": " — el watcher del journal lee la misma fuente y convierte coincidencias en notificaciones." + "tail": " — el observador del journal lee la misma fuente y convierte las coincidencias en notificaciones." }, { "label": "Referencia de la API", "href": "/docs/monitor/api", - "tail": " — los endpoints logs y task-log con sus parámetros de consulta." + "tail": " — endpoints logs y task-log y sus parámetros de consulta." }, { "label": "Índice del panel", diff --git a/web/messages/es/docs/monitor/dashboard/system-overview.json b/web/messages/es/docs/monitor/dashboard/system-overview.json index 0f0f76b6..90d47653 100644 --- a/web/messages/es/docs/monitor/dashboard/system-overview.json +++ b/web/messages/es/docs/monitor/dashboard/system-overview.json @@ -1,85 +1,85 @@ { "meta": { - "title": "ProxMenux Monitor — Panel: pestaña Resumen del sistema | ProxMenux Documentation", - "description": "La pestaña por defecto al abrir ProxMenux Monitor: cuatro tarjetas de métricas (CPU, memoria, VMs y LXCs activos, temperatura) con actualizaciones en vivo y sparkline, la gráfica de métricas históricas y los paneles condensados de Almacenamiento y Red con acceso directo a sus pestañas dedicadas." + "title": "ProxMenux Monitor — Panel: Resumen del sistema | Documentación de ProxMenux", + "description": "La pestaña inicial por defecto de ProxMenux Monitor: cuatro tarjetas (CPU, memoria, VM y LXC activos, temperatura) con actualización en vivo y minigráfico de tendencia, gráfica histórica y resúmenes de almacenamiento y red con enlaces a sus pestañas." }, "header": { "title": "Panel: pestaña Resumen del sistema", - "description": "La primera pestaña que abre el panel. Cuatro tarjetas de métricas en vivo arriba, la gráfica de métricas históricas en el medio y paneles condensados de almacenamiento / red abajo — todo derivado de las mismas APIs que alimentan las pestañas dedicadas.", + "description": "La pestaña que el panel abre por defecto. Cuatro tarjetas con métricas en vivo arriba, gráfica histórica en el centro y resúmenes de almacenamiento y red abajo, usando las mismas API que sus pestañas dedicadas.", "section": "ProxMenux Monitor · Panel" }, "readOnly": { "title": "Un vistazo de solo lectura", - "body": "Nada en esta pestaña es una superficie de control — todos los paneles son informativos. Las acciones viven en las pestañas dedicadas a las que enlazan: entra en Almacenamiento para gestionar discos, en VMs y LXCs para arrancar / parar guests, en la pestaña Seguridad para configurar autenticación, y así sucesivamente." + "body": "Todos los paneles de esta pestaña son informativos. Las acciones están en las pestañas enlazadas: Almacenamiento para gestionar discos, VMs y LXCs para iniciar o detener invitados y Seguridad para configurar la autenticación." }, "captureAlt": "Pestaña Resumen del sistema — cuatro tarjetas de métricas (CPU, Memoria, VMs activos, Temperatura), gráfica de métricas del nodo y tarjetas resumen de Almacenamiento / Red", - "captureCaption": "La pestaña Resumen del sistema — la que abre el panel. Las cuatro tarjetas están en vivo, la gráfica de debajo es histórica y las dos tarjetas de abajo resumen Almacenamiento y Red.", + "captureCaption": "Resumen del sistema, la pestaña inicial por defecto. Las cuatro tarjetas se actualizan en vivo, la gráfica muestra el historial y las dos tarjetas inferiores resumen almacenamiento y red.", "topRow": { "heading": "Fila superior: tarjetas de métricas en vivo", - "intro": "Cuatro tarjetas en una rejilla 2×2 en móvil, una sola fila en escritorio. Cada una se actualiza desde /api/system cada pocos segundos.", + "intro": "Cuatro tarjetas en rejilla 2×2 en móvil y una fila en escritorio. Cada una recibe datos de /api/system cada pocos segundos.", "headerCard": "Tarjeta", "headerWhat": "Qué muestra", "headerSource": "Fuente", "rows": [ { - "card": "CPU Usage", + "card": "Uso de CPU", "what": "Porcentaje actual con barra de progreso. Se actualiza cada ~1 s vía el sampler de signos vitales.", "source": "psutil.cpu_percent()" }, { - "card": "Memory Usage", - "what": "GB usados, porcentaje, GB totales. La barra de progreso sigue al porcentaje.", + "card": "Uso de la memoria", + "what": "GB usados, porcentaje y GB totales. La barra representa el porcentaje.", "source": "psutil.virtual_memory()" }, { - "card": "Active VM & LXC", - "what": "Recuento de guests actualmente en ejecución, con una insignia de desglose Running / Stopped y una línea al pie con los totales de VMs y LXCs.", + "card": "VM y LXC activos", + "what": "Número de invitados en ejecución, con desglose En ejecución / Detenidos y totales de VMs y LXCs al pie.", "source": "/api/vms (consolidado)" }, { - "card": "Temperature", - "what": "Temperatura de CPU en °C con insignia de estado (cool / warm / hot) y un sparkline de 5 minutos detrás. Muestra N/A cuando no se detecta sensor. Pulsa para abrir la modal de detalle de temperatura.", + "card": "Temperatura", + "what": "Temperatura de CPU en °C, estado (fría / templada / caliente) y minigráfico de los últimos 5 minutos detrás. Muestra N/A si no hay sensor. Pulsa para abrir los detalles.", "source": "sensors / coretemp" } ], "thresholdsTitle": "Colores de estado y umbrales aplicados aquí", - "thresholdsIntro": "Cada anillo, barra y sparkline en las cuatro tarjetas de métricas sigue la misma clasificación — verde por debajo de Warning, ámbar entre Warning y Critical, rojo en Critical y por encima. Valores por defecto recomendados que vienen con ProxMenux:", + "thresholdsIntro": "Cada anillo, barra y minigráfico usa la misma escala: verde por debajo de Advertencia, ámbar entre Advertencia y Crítico, rojo desde Crítico. Valores recomendados incluidos con ProxMenux:", "thresholdsItems": [ - "Uso de CPU — Warning 85 %, Critical 95 %.", - "Memoria — Warning 85 %, Critical 95 % (el swap también dispara Critical al 5 % usado — un host Proxmox sano apenas debería tocar swap).", - "Temperatura de CPU — Warning 80 °C, Critical 90 °C." + "Uso de CPU: advertencia 85 %, crítico 95 %.", + "Memoria: advertencia 85 %, crítico 95 %. Swap también activa Crítico al 5 % de uso; un host Proxmox sano debería usarlo rara vez.", + "Temperatura de CPU: advertencia 80 °C, crítico 90 °C." ], - "thresholdsOutro": "Cada valor es configurable por host — Settings → Health Monitor Thresholds es la fuente única de verdad y explica cómo ajustarlos.", - "sparklineTitle": "El sparkline es significativo", + "thresholdsOutro": "Los valores se configuran por host; Ajustes → Umbrales del monitor de salud documenta y centraliza su ajuste.", + "sparklineTitle": "El minigráfico muestra la tendencia", "sparklineBody": "La tarjeta de temperatura dibuja una traza de 5 minutos bajo el valor, con la línea y el degradado siguiendo el mismo par Warning/Critical documentado arriba. Es la forma más rápida de ver si el host está en escalada térmica sin abrir la modal de detalle." }, "processes": { "heading": "Top procesos por CPU / Memoria", - "intro": "Las tarjetas CPU Usage y Memory de la pestaña Resumen son clicables. Al pulsar cualquiera de ellas se abre una lista ordenable con los 25 procesos top — ordenada por uso de CPU si la abriste desde la tarjeta de CPU, o por memoria residente si la abriste desde la de Memory.", + "intro": "Las tarjetas Uso de CPU y Memoria son pulsables. Abren una lista ordenable con los 25 procesos principales, por uso de CPU desde la primera tarjeta o por memoria residente desde la segunda.", "listTitle": "El diálogo con la lista", "listItems": [ - "Auto-refresco — la lista se actualiza cada 5 segundos mientras el diálogo está abierto y deja de pedir datos en cuanto se cierra.", - "Filtro — la caja de búsqueda acota la lista por command, user o PID.", + "Actualización automática: la lista se actualiza cada 5 segundos mientras está abierta y deja de consultar datos al cerrar.", + "Filtro: el buscador acota la lista por comando, usuario o PID.", "Barra en línea — la columna de la métrica principal dibuja una barra pequeña escalada al mayor valor de la lista filtrada, para que el orden siga siendo visible aunque ningún proceso esté cerca del 100 %.", "Layout móvil — por debajo de 640 px las columnas PID y User se ocultan para que Command, CPU % y Memory sigan cabiendo en la pantalla de un teléfono sin scroll horizontal." ], "captureListAlt": "Modal Top processes by Memory — tabla con columnas PID, USER, COMMAND, CPU %, Memory ordenada por RSS", "captureListCaption": "La tarjeta Memory abre la lista ordenada por RSS (acento índigo). La tarjeta CPU abre la misma lista ordenada por uso de CPU (acento azul).", "detailTitle": "Detalle por proceso", - "detailIntro": "Al pulsar cualquier fila de la lista se abre un segundo diálogo con la foto en vivo de ese proceso, organizada en cuatro secciones:", + "detailIntro": "Pulsa una fila para abrir un segundo diálogo con los datos en vivo del proceso, organizados en cuatro secciones:", "detailItems": [ - "Overview — estado, proceso padre, número de hilos, descriptores de fichero abiertos, usuario y grupo.", - "Resources — CPU %, Memoria %, Resident (RSS), Virtual size, Swap, totales de I/O de lectura y escritura.", - "Command — nombre corto, línea de comandos completa, ruta del ejecutable y directorio de trabajo.", - "Lifetime — timestamp de arranque y tiempo transcurrido en ejecución." + "Resumen: estado, proceso padre, número de hilos, descriptores de archivo abiertos, usuario y grupo.", + "Recursos: CPU %, memoria %, memoria residente (RSS), tamaño virtual, swap y totales de E/S leída y escrita.", + "Comando: nombre corto, línea de comandos completa, ruta del ejecutable y directorio de trabajo.", + "Duración: fecha y hora de inicio y tiempo transcurrido en ejecución." ], - "detailRefresh": "El diálogo de detalle se refresca cada 3 segundos mientras está abierto. Si el proceso termina con el diálogo abierto, el polling se detiene, aparece un banner ámbar This process has finished y el último snapshot capturado se queda en pantalla (atenuado) para que sigas viendo qué estaba pasando justo antes de que terminara.", - "captureDetailAlt": "Modal de detalle de proceso — secciones Overview, Resources, Command y Lifetime para un único PID", + "detailRefresh": "El detalle se actualiza cada 3 segundos mientras está abierto. Al terminar el proceso, cesan las consultas y aparece el aviso ámbar Este proceso ha terminado. La última captura queda atenuada para ver qué ocurría justo antes de finalizar.", + "captureDetailAlt": "Detalle de proceso: secciones Resumen, Recursos, Comando y Duración para un PID", "captureDetailCaption": "Diálogo de detalle por proceso abierto desde una fila de la lista. El color de acento sigue al de la tarjeta que lo abrió (azul para CPU, índigo para Memory)." }, "middle": { "heading": "Medio: gráficas de métricas del nodo", - "body1": "Bajo la fila superior se encuentra el componente NodeMetricsCharts — gráficas históricas de CPU, memoria y E/S de disco tomadas del propio almacén RRD de Proxmox vía /api/node/metrics. Un selector de timeframe alterna entre 1 hora / 24 horas / 7 días / 30 días / 1 año; la resolución de los datos baja a medida que crece la ventana para que la gráfica se mantenga fluida.", + "body1": "Bajo las tarjetas está NodeMetricsCharts, con gráficas históricas de CPU, memoria y E/S de disco del almacén RRD de Proxmox mediante /api/node/metrics. El selector permite 1 hora / 24 horas / 7 días / 30 días / 1 año; la resolución baja al ampliar el intervalo para mantener la fluidez.", "body2": "Son las mismas gráficas que la UI web de Proxmox renderiza para un nodo, simplemente consolidadas en el tema oscuro del Monitor y alineadas con el resto de paneles." }, "bottom": { @@ -87,25 +87,25 @@ "storageTitle": "Tarjeta Storage Overview", "storageIntro": "Una vista condensada del estado de almacenamiento del host, dividida en tres bloques:", "storageItems": [ - "Total Node Capacity — suma de todos los almacenamientos de VM/LXC más el almacenamiento local de sistema, con una barra de progreso en degradado del reparto total usado / libre.", + "Capacidad total del nodo: suma de los almacenamientos de VM/LXC y del almacenamiento local del sistema, con barra degradada de espacio usado y libre.", "Total Capacity / Physical Disks — titular de capacidad bruta y el recuento de discos físicos descubiertos.", - "VM/LXC Storage — usado / libre / porcentaje para los almacenamientos donde viven los guests, más un contador cuando hay más de uno configurado.", - "Local Storage (System) — el propio mount raíz / sistema del host, separado del pool de guests." + "Almacenamiento VM/LXC: espacio usado, libre y porcentaje de los almacenamientos de invitados, con contador si hay más de uno.", + "Almacenamiento local (sistema): montaje raíz o de sistema del host, separado del pool de invitados." ], - "storageDrillIn": "La vista en detalle vive en la pestaña Almacenamiento — SMART por disco, detalles de pool ZFS, historial de observaciones, etc.", + "storageDrillIn": "Los detalles están en la pestaña Almacenamiento: SMART por disco, pools ZFS, historial de observaciones, etc.", "networkTitle": "Tarjeta Network Overview", "networkBody1": "La línea superior muestra el recuento de interfaces activas (físicas + bridges combinados). Debajo, dos filas de insignias coloreadas para las interfaces en up — NICs físicas en azul, bridges en un color secundario. Un selector de timeframe arriba a la derecha (1 hora / 24 horas / 7 días / 30 días / 1 año) controla una pequeña gráfica de tráfico RX / TX.", - "networkBody2": "La vista en detalle por interfaz (IP/MAC, gráfica RRD, miembros del bridge, modo del bond, etc.) vive en la pestaña Red." + "networkBody2": "Los detalles por interfaz (IP/MAC, gráfica RRD, miembros del bridge, modo de bond, etc.) están en la pestaña Red." }, "refresh": { - "heading": "Modelo de refresco", - "intro": "Cada panel gestiona su propio estado de carga (loadingStates.cpu, loadingStates.storage, …) para que una fuente lenta no bloquee al resto. Mientras un panel está obteniendo datos, muestra un skeleton con animación pulse; los fetchs fallidos degradan con elegancia — por ejemplo, un sensor de temperatura ausente renderiza la tarjeta como N/A en vez de un error.", + "heading": "Modelo de actualización", + "intro": "Cada panel tiene su propio estado de carga (loadingStates.cpu, loadingStates.storage, …), de modo que una fuente lenta no bloquea las demás. Mientras carga muestra un marcador pulsante. Los fallos se presentan sin interrumpir el resto; por ejemplo, sin sensor de temperatura muestra N/A en vez de un error.", "items": [ - "Tarjetas de métricas superiores — refresco cada ~5 s. Los paneles de CPU y temperatura también reciben un push de 1 s del sampler de signos vitales.", - "Gráfica de métricas del nodo — refresco cada 30 s, o al cambiar de timeframe.", + "Tarjetas superiores: se actualizan cada ~5 s. CPU y temperatura también reciben datos cada 1 s del muestreador de signos vitales.", + "Gráfica de métricas del nodo: carga al abrir y al cambiar de intervalo o idioma. Si hay que reintentar, espera 60 s.", "Tarjeta de almacenamiento — refresco cada 60 s. Los datos SMART se cachean más tiempo (la pestaña Almacenamiento dispara una lectura fresca bajo demanda).", - "Tarjeta de red — refresco cada 5 s en el timeframe activo.", - "Refresco manual — el botón Refresh en la cabecera fuerza a todos los paneles a recargar inmediatamente." + "Tarjeta de red: resumen cada 59 s y gráfica de tráfico cada 60 s en el intervalo activo.", + "Actualización manual: el botón Actualizar de la cabecera vuelve a cargar todos los paneles inmediatamente." ] }, "dataCollected": { @@ -115,12 +115,12 @@ "headerSource": "Fuente", "rows": [ { - "card": "Pastilla de estado de la cabecera", + "card": "Indicador de estado de la cabecera", "endpoint": "/api/health", "source": "El estado global cacheado que produce el Monitor de salud en cada ciclo." }, { - "card": "CPU / RAM / Swap / Uptime", + "card": "CPU / RAM / Swap / Tiempo de actividad", "endpoint": "/api/system", "source": "/proc/stat, /proc/meminfo, /proc/uptime con muestreo de CPU en ventana corta." }, @@ -135,13 +135,13 @@ "source": "Mira las pestañas dedicadas para cada una. Las tarjetas de la cabecera muestran una vista compactada de los mismos endpoints." }, { - "card": "Cadencia de refresco", + "card": "Frecuencia de actualización", "endpoint": "—", - "source": "CPU / red 5 s; almacenamiento / VMs 30 s; info estática cada 5 min. El botón Refresh de la cabecera fuerza una recarga inmediata en todos los paneles." + "source": "Sistema cada 5 s; almacenamiento, VMs y resumen de red cada 59 s. El botón Actualizar de la cabecera fuerza la recarga inmediata de todos los paneles." } ], - "codeComment1": "# Llamada única que alimenta la pastilla de la cabecera", - "codeComment2": "# pública, sin token", + "codeComment1": "# Llamada que alimenta el indicador de estado de la cabecera", + "codeComment2": "# público, sin token", "codeComment3": "# Snapshot autenticada que usan las tarjetas" }, "whereNext": { @@ -150,12 +150,12 @@ { "label": "Monitor de salud", "href": "/docs/monitor/health-monitor", - "tail": " — la modal detrás de la pastilla de estado de la cabecera (diez categorías, descartes, supresión)." + "tail": " — la ventana del indicador de estado de la cabecera: diez categorías, descartes y supresión de avisos." }, { "label": "Referencia de la API", "href": "/docs/monitor/api", - "tail": " — los endpoints system, info y health." + "tail": " — endpoints system, info y health." }, { "label": "Notificaciones", @@ -165,12 +165,12 @@ { "label": "Índice del panel", "href": "/docs/monitor/dashboard", - "tail": " — las otras ocho pestañas de un vistazo." + "tail": " — las demás pestañas del panel de un vistazo." }, { "label": "Arquitectura", "href": "/docs/monitor/architecture", - "tail": " — los hilos en background y las APIs que alimentan esta vista." + "tail": " — los hilos en segundo plano y las API que alimentan esta vista." } ] } diff --git a/web/messages/es/docs/monitor/dashboard/terminal.json b/web/messages/es/docs/monitor/dashboard/terminal.json index fad47110..050f8f60 100644 --- a/web/messages/es/docs/monitor/dashboard/terminal.json +++ b/web/messages/es/docs/monitor/dashboard/terminal.json @@ -1,16 +1,16 @@ { "meta": { - "title": "ProxMenux Monitor — Panel: pestaña Terminal | ProxMenux Documentation", - "description": "Shell en el navegador al host Proxmox: hasta 4 terminales a la vez con vista en rejilla, ayudas de teclado para móvil (ESC, TAB, flechas, combinaciones con Ctrl), una chuleta de comandos integrada con cheat.sh, protegida con JWT." + "title": "ProxMenux Monitor — Panel: Terminal | Documentación de ProxMenux", + "description": "Shell del host Proxmox en el navegador: hasta 4 terminales en rejilla, botones de teclado para móviles (ESC, TAB, flechas, combinaciones Ctrl), guía de comandos integrada con cheat.sh y protección JWT." }, "header": { "title": "Panel: pestaña Terminal", - "description": "Una sesión real de shell en el navegador, sobre el host Proxmox. Hasta cuatro terminales a la vez, ayudas de teclado para móvil, una chuleta de comandos integrada — todo en el mismo tema que el resto del panel.", + "description": "Una sesión real de shell en el host Proxmox desde el navegador. Hasta cuatro terminales a la vez, botones de teclado para móviles y una guía de comandos integrada, con el mismo tema que el resto del panel.", "section": "ProxMenux Monitor · Panel" }, "intro": { "title": "Un PTY real en el navegador", - "body": "El terminal asigna una PTY del lado del servidor a través de flask_terminal_routes, la canaliza por un WebSocket hacia xterm.js en el navegador y se ejecuta como root (el usuario de la unidad systemd). Cualquier cosa que puedas hacer en ssh root@<host> funciona aquí — incluidos vim, tmux, herramientas ncurses y las CLIs de Proxmox (qm, pct, pvesh, pvecm). Cada PTY lanzada desde esta pestaña exporta la variable de entorno PROXMENUX_TERMINAL=monitor, que hereda todo proceso bash hijo — incluida una llamada posterior a menu — para que los flujos de ProxMenux puedan saber si se están ejecutando dentro del terminal del navegador del Monitor." + "body": "El terminal crea una PTY en el servidor mediante flask_terminal_routes, la conecta por WebSocket con xterm.js en el navegador y se ejecuta como root, el usuario de la unidad systemd. Permite lo mismo que ssh root@<host>: vim, tmux, herramientas ncurses y las CLI de Proxmox (qm, pct, pvesh, pvecm). Cada PTY exporta PROXMENUX_TERMINAL=monitor. Sus procesos hijos bash, incluido un lanzamiento posterior de menu, heredan esta variable para reconocer el terminal de Monitor." }, "singleAlt": "Pestaña Terminal de ProxMenux Monitor — una única sesión de terminal mostrando el resumen del sistema de Fastfetch al hacer login", "singleCaption": "Un terminal del host abierto — la barra de arriba muestra el recuento (1 / 4 terminals), + New, Search, Clear y Close. Las ayudas de teclado para móvil aparecen bajo el terminal en dispositivos táctiles.", @@ -20,24 +20,24 @@ "body2": "Para llegar a un contenedor LXC desde el navegador, usa el botón Console dedicado en cada tarjeta de CT en ejecución de la pestaña VMs y LXCs. Abre una modal que ejecuta pct enter <vmid> y reutiliza la misma barra para móvil descrita abajo." }, "menuGuard": { - "heading": "Guarda de autoactualización cuando menu corre dentro de este terminal", - "body1": "El menu de ProxMenux se autoactualiza en sitio: aceptar el prompt reemplaza su propio árbol de scripts y recarga. Eso funciona bien por SSH o desde la consola de Proxmox, pero el terminal del navegador no puede sobrevivir a ello — la actualización desmonta la propia PTY sobre la que corre la shell y el WebSocket cae a mitad. Para no dejar la sesión colgada, los handlers internos check_updates_stable, check_updates_beta y apply_release_channel leen PROXMENUX_TERMINAL y detectan el contexto Monitor.", - "body2": "Al detectarlo, el diálogo clásico sí / no se sustituye por un msgbox informativo con el instalador canónico de una línea — bash -c \"$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)\" para el canal estable, y la URL equivalente de install_proxmenux_beta.sh para beta. La actualización propiamente dicha se deja para una sesión SSH o la consola del host Proxmox; el terminal del navegador solo se usa para confirmar y leer el comando." + "heading": "Protección de autoactualización de menu en este terminal", + "body1": "menu se autoactualiza sustituyendo su árbol de scripts y recargándose al aceptar. Funciona por SSH o consola Proxmox, pero en el navegador cerraría la PTY de la shell e interrumpiría el WebSocket. Para evitarlo, check_updates_stable, check_updates_beta y apply_release_channel consultan PROXMENUX_TERMINAL y detectan el contexto Monitor.", + "body2": "Al detectarlo, el diálogo sí/no se sustituye por un mensaje informativo con el comando oficial del instalador: bash -c \"$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)\" para estable y la URL equivalente de install_proxmenux_beta.sh para beta. Ejecuta la actualización por SSH o consola del host Proxmox; el terminal del navegador solo permite leer y confirmar el mensaje." }, "fourTerminals": { "heading": "Hasta cuatro terminales a la vez", - "intro": "La pestaña te permite abrir hasta cuatro terminales del host simultáneamente. Cada uno obtiene su propia PTY y su propio WebSocket — son sesiones totalmente independientes. Dos layouts se alternan con los iconos junto al botón \"New\":", + "intro": "La pestaña permite abrir hasta cuatro terminales del host simultáneamente, cada uno con su propia PTY y WebSocket: son sesiones independientes. Los iconos junto a «Nuevo» alternan entre dos disposiciones:", "items": [ - "Vista en pestañas — un terminal visible a la vez, los demás como pestañas nombradas arriba (Terminal 1, Terminal 2…). Ideal para trabajar en una tarea con el resto en background.", - "Vista en rejilla — todos los terminales abiertos visibles a la vez en una rejilla 2×2. Útil para vigilar htop en un panel, iftop en otro y editar en un tercero sin saltar entre ellos." + "Vista en pestañas: un terminal visible y los demás como pestañas con nombre arriba (Terminal 1, Terminal 2…). Adecuado para trabajar en una tarea con las otras en segundo plano.", + "Vista en rejilla: todos los terminales abiertos en una rejilla 2×2. Permite vigilar htop en uno, iftop en otro y editar en un tercero sin cambiar de pestaña." ], - "outro": "La barra muestra el recuento actual (1/4 terminals, 4/4 terminals). Las nuevas pestañas se abren con + New y las individuales se cierran desde la pequeña × en la cabecera de la pestaña. El botón rojo grande Close de arriba derriba todos los terminales a la vez." + "outro": "La barra muestra el recuento (1/4 terminales, 4/4 terminales). + Nuevo abre una pestaña y la × de su cabecera cierra solo esa. El botón rojo grande Cerrar de arriba cierra todos los terminales." }, "gridAlt": "Pestaña Terminal de ProxMenux Monitor — vista en rejilla con cuatro terminales del host ejecutando ls, configuración de red, iftop y el menú principal de ProxMenux uno al lado del otro", - "gridCaption": "Vista en rejilla (4 / 4 terminals) — cuatro PTYs del host independientes corriendo en paralelo: listado de directorio, /etc/network/interfaces en un lado, iftop en otro y el menú principal de ProxMenux en el cuarto. Alterna entre rejilla y pestañas con el conmutador de layout en la barra.", + "gridCaption": "Vista en rejilla (4 / 4 terminales): cuatro PTY independientes en paralelo, con listado de directorio, /etc/network/interfaces, iftop y el menú principal de ProxMenux. Alterna entre rejilla y pestañas con el selector de disposición de la barra.", "keyboard": { - "heading": "Ayudas de teclado para móvil", - "intro": "Los teclados de móvil y tablet normalmente no exponen ESC, TAB, las flechas ni combinaciones con modificadores. Sin ellos, navegar por vim, nano, htop o cualquier menú TUI es imposible. La pestaña Terminal lo resuelve renderizando una fila de botones táctiles bajo el terminal siempre que el dispositivo sea suficientemente pequeño o tenga capacidad táctil:", + "heading": "Botones de teclado para dispositivos móviles", + "intro": "Los teclados de móvil y tablet suelen carecer de ESC, TAB, flechas y combinaciones de modificadores. Estas teclas son necesarias para manejar vim, nano, htop o menús TUI. Terminal añade botones táctiles debajo cuando la pantalla es pequeña o el dispositivo admite interacción táctil:", "headerButton": "Botón", "headerSends": "Envía", "headerUse": "Uso típico", @@ -50,7 +50,7 @@ { "button": "TAB", "sends": "\\t", - "use": "Autocompletado de rutas, navegación de campos en dialog/whiptail." + "use": "Autocompletado de rutas y navegación entre campos en dialog/whiptail." }, { "button": "↑ ↓ ← →", @@ -58,9 +58,9 @@ "use": "Historial de la shell, movimiento del cursor, navegación de menús." }, { - "button": "↵ Enter", + "button": "↵ Intro", "sends": "\\r", - "use": "Confirmar. Algunos teclados en pantalla cambian Enter por Go/Done — este botón es inequívoco." + "use": "Confirmar. Algunos teclados en pantalla sustituyen Intro por Ir/Hecho; este botón evita ambigüedades." }, { "button": "Ctrl ▾", @@ -71,46 +71,46 @@ "ctrlIntro": "Tres secuencias de control:", "ctrlItems": [ "Ctrl+C — cancelar / interrumpir el comando en ejecución (\\x03).", - "Ctrl+X — salir de nano (\\x18).", - "Ctrl+R — búsqueda inversa en el historial de bash (\\x12)." + "Ctrl+X: salir de nano (\\x18).", + "Ctrl+R: búsqueda inversa en el historial de bash (\\x12)." ], - "modalTitle": "Misma barra en la modal de consola LXC", - "modalBody": "La consola del contenedor que lanzas desde VMs y LXCs → Console renderiza las mismas ayudas de teclado bajo la modal. La modal además auto-tipea pct enter <vmid> al conectar, para que aterrices directamente dentro del contenedor." + "modalTitle": "La misma barra en la ventana de consola LXC", + "modalBody": "La consola que abres desde VMs y LXCs → Consola muestra los mismos botones de teclado bajo la ventana. Al conectar, introduce automáticamente pct enter <vmid> para entrar directamente en el contenedor." }, - "lxcAlt": "Modal de consola LXC de ProxMenux Monitor — Terminal: ubuntu (ID: 103) con la misma barra para móvil (ESC, TAB, flechas, Enter, Ctrl) bajo el terminal", - "lxcCaption": "La modal de consola LXC — abierta desde VMs y LXCs → Console. La cabecera muestra el contenedor de destino (Terminal: ubuntu (ID: 103)) y la misma barra táctil aparece bajo el terminal.", + "lxcAlt": "Ventana de consola LXC de ProxMenux Monitor — Terminal: ubuntu (ID: 103), con la misma barra para móviles (ESC, TAB, flechas, Intro, Ctrl) debajo", + "lxcCaption": "Consola LXC abierta desde VMs y LXCs → Consola. La cabecera identifica el contenedor (Terminal: ubuntu (ID: 103)) y debajo del terminal aparece la misma barra táctil.", "search": { - "heading": "Search Commands — chuleta integrada", - "intro": "El botón azul Search de la barra abre una modal con búsqueda difusa de comandos. Escribe unas letras de cualquier comando de Linux o Proxmox (ls, tar, qm, pct, zpool, systemctl…) y la modal lista ejemplos de uso con Send to active terminal de un solo toque. Elimina el viaje de ida y vuelta \"espera, ¿qué flag era esa?\" a otra pestaña del navegador.", - "modalAlt": "Modal Search Commands de ProxMenux Monitor — búsqueda difusa de comandos de Linux y Proxmox con cheat.sh, mostrando varios ejemplos de uso de ls", - "modalCaption": "La modal Search Commands consultando ls — cada resultado muestra el comando, su descripción y una pequeña flecha \"send\" que lo canaliza al terminal activo. La esquina inferior derecha indica la fuente de los datos (Powered by cheat.sh).", + "heading": "Buscar comandos: guía de referencia integrada", + "intro": "El botón azul Buscar abre una búsqueda aproximada de comandos. Escribe unas letras de un comando Linux o Proxmox (ls, tar, qm, pct, zpool, systemctl…) para ver ejemplos de uso y Enviar al terminal activo con un toque. Así puedes consultar sus opciones sin cambiar de pestaña.", + "modalAlt": "Ventana Buscar comandos de ProxMenux Monitor: búsqueda aproximada de comandos Linux y Proxmox con cheat.sh y varios ejemplos de ls", + "modalCaption": "Buscar comandos con la consulta ls: cada resultado muestra comando, descripción y una flecha de envío al terminal activo. La esquina inferior derecha indica la fuente (Con tecnología de cheat.sh).", "aboutLabel": "Sobre cheat.sh:", - "aboutBody": "es una chuleta unificada de código abierto y curada por la comunidad que agrega ejemplos cortos y prácticos de uso para cientos de comandos de Linux, herramientas de sysadmin y lenguajes de programación. Diseñada originalmente para consultarse desde un terminal con curl cheat.sh/<command>, también es accesible desde cualquier navegador. ProxMenux Monitor pasa las consultas por un proxy en el servidor para que la modal siga funcionando bajo el mismo origen que el panel.", + "aboutBody": "es una guía de referencia de código abierto mantenida por la comunidad, con ejemplos breves y prácticos de cientos de comandos Linux, herramientas de administración y lenguajes de programación. Diseñada para consultarse con curl cheat.sh/<command>, también funciona en el navegador. ProxMenux Monitor envía las consultas mediante un proxy del servidor para mantener el mismo origen que el panel.", "headerSource": "Fuente", "headerWhen": "Cuándo se usa", "headerWhat": "Lo que ves", - "onlineLabel": "(online)", + "onlineLabel": "(en línea)", "onlineWhen": "Cuando el host tiene acceso a internet y el proxy de cheat.sh responde.", - "onlineWhat": "Varios ejemplos del mundo real por comando, tipeados con su descripción encima. El punto de estado en la cabecera de la modal es verde.", - "fallbackLabel": "Fallback local", + "onlineWhat": "Varios ejemplos prácticos por comando con su descripción encima. El punto de estado de la cabecera es verde.", + "fallbackLabel": "Alternativa local", "fallbackWhen": "Cuando cheat.sh no está disponible (host offline, firewall restrictivo, caída de cheat.sh).", - "fallbackWhat": "Una lista empaquetada de comandos comunes de Linux + Proxmox. Catálogo más pequeño pero siempre disponible. El punto de estado es rojo.", - "sendingNote": "Cómo funciona el envío: pulsar la pequeña flecha \"send\" junto a un resultado reenvía el texto del comando al terminal que esté activo en ese momento (la pestaña enfocada, o la última en la que pulsaste en la vista en rejilla). La modal se cierra automáticamente para que puedas darle a Enter inmediatamente." + "fallbackWhat": "Una lista incluida de comandos habituales Linux y Proxmox. El catálogo es menor, pero siempre está disponible. El punto de estado es rojo.", + "sendingNote": "Cómo funciona el envío: la flecha junto al resultado envía el texto al terminal activo (la pestaña enfocada o el último terminal pulsado en rejilla). La ventana se cierra automáticamente para que puedas pulsar Intro." }, "auth": { "heading": "Autenticación", "items": [ - "El upgrade WebSocket lleva el JWT en la cabecera Authorization. Si la autenticación está activa y el token falta o ha caducado, la conexión se rechaza con HTTP 401 antes de asignar una PTY.", + "El navegador primero solicita un ticket de un solo uso mediante POST /api/terminal/ticket, autenticado con JWT en la cabecera Authorization. Después envía ese ticket al abrir el WebSocket. Caduca a los 5 segundos; si la autenticación está activa y falta o no es válido, se cierra la conexión antes de crear una PTY.", "Si el Monitor está detrás de un reverse proxy, el proxy debe reenviar los upgrades WebSocket. Mira la página Acceso y autenticación para snippets de Nginx / Caddy / Traefik." ] }, "clipboard": { - "heading": "Portapapeles, scrollback y resize", + "heading": "Portapapeles, historial de pantalla y tamaño", "items": [ - "Copiar / pegar — usa el portapapeles nativo del navegador. Selecciona texto con el ratón / trackpad y usa el atajo del SO (Cmd+C en macOS, Ctrl+Shift+C en Linux/Windows). Los escritorios Linux también soportan pegar con el botón central del ratón.", - "Scrollback — rueda / scroll con dos dedos. xterm.js mantiene las últimas varios miles de líneas en memoria.", - "Resize — el terminal renegocia el tamaño de ventana de la PTY cuando redimensionas el panel del dashboard, así htop y vim renderizan bien.", - "Reconexión al recuperar foco de la pestaña — si cambias de app en móvil o tablet (comportamiento habitual en iPad), el WebSocket normalmente caería. La pestaña Terminal detecta el cambio de visibilidad y reconecta automáticamente al volver, con un timeout de 15 segundos para rutas VPN lentas." + "Copiar y pegar: usa el portapapeles del navegador. Selecciona texto con ratón o trackpad y usa el atajo del sistema (Cmd+C en macOS, Ctrl+Shift+C en Linux/Windows). Los escritorios Linux también permiten pegar con clic central.", + "Historial de pantalla: rueda o desplazamiento con dos dedos. xterm.js conserva en memoria los últimos miles de líneas.", + "Cambiar tamaño: al redimensionar el panel se ajusta la ventana PTY para mostrar correctamente htop y vim.", + "Reconexión al volver a la pestaña: cambiar de app en móvil o tablet, especialmente iPad, puede cortar el WebSocket. Terminal detecta el cambio de visibilidad y reconecta al volver, con un tiempo de espera de 15 segundos para VPN lentas." ] }, "disconnect": { @@ -120,26 +120,26 @@ "headerFix": "Solución", "rows": [ { - "cause": "JWT de sesión caducado (ventana de 24 h).", + "cause": "JWT de sesión caducado al abrir o reconectar un terminal (ventana de 24 h).", "fix": "Refresca la página y vuelve a hacer login. El terminal no está pensado para sesiones desatendidas, así que el tiempo de vida del JWT coincide con el del login normal del panel." }, { - "cause": "Timeout de idle del reverse proxy.", - "fix": "Sube proxy_read_timeout en Nginx o el equivalente en Caddy / Traefik (snippets en Acceso y autenticación)." + "cause": "Tiempo de espera por inactividad del proxy inverso.", + "fix": "Aumenta proxy_read_timeout en Nginx o su equivalente en Caddy / Traefik (ejemplos en Acceso y autenticación)." }, { - "cause": "Móvil o tablet en sleep.", - "fix": "Cuando el dispositivo despierta, la pestaña auto-reconecta (timeout de 15 s para rutas VPN). Si no lo hace, recarga la pestaña." + "cause": "Móvil o tablet en reposo.", + "fix": "Al reactivarse el dispositivo, la pestaña reconecta automáticamente (15 s de espera para rutas VPN). Si falla, recárgala." }, { "cause": "Reinicio del servicio en el host.", - "fix": "Cualquier reinicio de proxmenux-monitor.service tira todas las PTY. Abre nuevos terminales una vez el panel termine de recargar." + "fix": "Reiniciar proxmenux-monitor.service cierra todas las PTY. Abre nuevos terminales cuando el panel termine de recargarse." } ] }, "warning": { - "title": "El terminal es una shell de root sobre el host", - "body": "El terminal hereda la identidad de la unidad systemd (root) y por tanto tiene privilegios totales sobre el host Proxmox. Configura un usuario, contraseña y 2FA en Acceso y autenticación antes de exponer el panel más allá de tu red local: cualquiera que llegue al puerto 8008 sin autenticación aterrizaría directamente en una shell de root — sin prompts adicionales, sin credenciales SSH. Para acceso desde fuera de la LAN, enruta el panel a través de Secure Gateway (Tailscale) o un reverse proxy con HTTPS, en lugar de abrir el puerto a la internet pública." + "title": "El terminal es una shell de root en el host", + "body": "El terminal hereda el usuario de la unidad systemd (root) y tiene todos los privilegios del host Proxmox. Configura usuario, contraseña y 2FA en Acceso y autenticación antes de dar acceso fuera de tu red local. Con la autenticación desactivada, quien llegue al puerto 8008 puede abrir una shell de root sin más confirmaciones ni credenciales SSH. Para acceso externo, usa Secure Gateway (Tailscale) o un proxy inverso HTTPS en lugar de publicar el puerto en Internet." }, "whereNext": { "heading": "Por dónde seguir", @@ -147,17 +147,17 @@ { "label": "Acceso y autenticación", "href": "/docs/monitor/access-auth", - "tail": " — snippets de reverse proxy incluyendo las líneas de upgrade WebSocket que requiere el terminal." + "tail": " — ejemplos de proxy inverso con las líneas de cambio de protocolo WebSocket necesarias para el terminal." }, { "label": "Arquitectura", "href": "/docs/monitor/architecture", - "tail": " — el transporte WebSocket (HTTP vía flask-sock vs HTTPS / WSS vía gevent)." + "tail": " — transporte WebSocket (HTTP mediante flask-sock y HTTPS / WSS mediante gevent)." }, { "label": "Referencia de la API", "href": "/docs/monitor/api", - "tail": " — los endpoints WebSocket /ws/terminal y /ws/script/ junto al resto de la API." + "tail": " — endpoints WebSocket /ws/terminal y /ws/script/, junto al resto de la API." }, { "label": "Integraciones → Secure Gateway", diff --git a/web/messages/es/docs/monitor/dashboard/vms-lxcs-app.json b/web/messages/es/docs/monitor/dashboard/vms-lxcs-app.json index 08895a8f..108840d4 100644 --- a/web/messages/es/docs/monitor/dashboard/vms-lxcs-app.json +++ b/web/messages/es/docs/monitor/dashboard/vms-lxcs-app.json @@ -12,7 +12,7 @@ "p2": "El procedimiento que modifica el software se configura por separado en la pestaña Actualizaciones. Guardar una app nunca ejecuta un instalador ni un actualizador.", "callout": "El registro, el seguimiento de versiones y la actualización son tres capacidades independientes. Cada una puede utilizarse sin exigir las otras dos.", "dashboardTitle": "Del registro al lanzador Apps", - "dashboard": "Cada enlace web guardado aquí también se muestra como una tarjeta en la pestaña Apps principal. Esta página del LXC sigue siendo la fuente original para el nombre, el logotipo, los enlaces y el seguimiento de versión de la aplicación." + "dashboard": "Cada enlace web guardado aquí aparece también como tarjeta en la pestaña Apps principal. Esta página del LXC sigue siendo la referencia para nombre, logotipo, enlaces y seguimiento de versiones." }, "overview": { "heading": "Qué puede contener un registro", @@ -31,7 +31,7 @@ "lead": "Las aplicaciones sugeridas forman parte de la caché del modal de cada LXC. El escaneo de arranque las prepara en segundo plano para que la pestaña App pueda mostrar inmediatamente los resultados almacenados.", "items": [ "Abrir la pestaña App no inicia otro escaneo del catálogo ni consulta repetidamente el LXC.", - "Buscar aplicaciones ejecuta expresamente una detección nueva solo para ese LXC. Se utiliza después de instalar software mientras ProxMenux ya está en ejecución.", + "Buscar aplicaciones ejecuta una detección nueva para ese LXC. Úsalo tras instalar software nuevo mientras ProxMenux ya está en ejecución.", "La lista anterior permanece visible durante la búsqueda. Las nuevas coincidencias se añaden al finalizar.", "Si no se encuentra ninguna coincidencia nueva, el resultado aparece junto a las acciones y Registrar aplicación continúa disponible para introducirla manualmente.", "Guardar, eliminar o restaurar una app actualiza la misma caché inmediatamente. El arranque o la restauración de un LXC actualiza únicamente ese sistema mediante su evento de ciclo de vida existente." @@ -42,10 +42,10 @@ "heading": "Registrar una aplicación", "lead": "Las sugerencias detectadas y los registros manuales utilizan el mismo editor:", "steps": [ - "Pulsa Registrar en una sugerencia o Registrar aplicación para elegir una entrada del catálogo o escribir un nombre personalizado.", + "Pulsa Registrar en una sugerencia o Registrar aplicación para elegir del catálogo o introducir un nombre personalizado.", "Revisa el nombre y el logotipo propuestos por el catálogo.", "Añade los enlaces web necesarios. Los puertos en escucha se ofrecen como accesos rápidos, pero ninguno se guarda automáticamente.", - "Deja Seguir versión disponible desactivado para un registro de solo enlace o actívalo y revisa el detector instalado y la fuente disponible.", + "Deja Seguir versión disponible desactivado para registros de solo enlace, o actívalo y revisa el detector de la versión instalada y la fuente de la versión disponible.", "Utiliza Probar detector cuando el seguimiento esté activado y guarda el registro.", "Pulsa Hecho al terminar la edición. Las pestañas App y Actualizaciones reutilizan el registro actualizado de la caché." ] @@ -80,7 +80,7 @@ "Cada enlace guarda un esquema, un puerto, una descripción opcional y una URL de logotipo opcional.", "La URL mostrada utiliza la dirección actual ya detectada para el LXC; esa dirección no se duplica en cada registro.", "Un enlace sin logotipo propio utiliza el logotipo general de la app.", - "Varios enlaces pueden representar una interfaz de administración, una API, una interfaz secundaria u otro punto final de la misma app.", + "Varios enlaces pueden representar una interfaz de administración, una API, una interfaz secundaria u otro endpoint de la misma app.", "Una app guardada solo con enlaces también aparece en Actualizaciones, donde se puede configurar posteriormente un actualizador personalizado." ] }, @@ -90,24 +90,48 @@ "colMethod": "Método de versión instalada", "colUse": "Uso", "detectorRows": [ - { "method": "dpkg / apk", "use": "Lee la versión del paquete instalado desde los metadatos de Debian, Ubuntu o Alpine." }, - { "method": "binary", "use": "Ejecuta una ruta binaria absoluta o un nombre de comando con sus parámetros de versión." }, - { "method": "file + regex", "use": "Lee un archivo real y extrae la versión mediante un grupo de captura." }, - { "method": "docker label / docker exec", "use": "Lee una etiqueta de versión OCI o ejecuta un comando de versión dentro de un contenedor Docker." }, - { "method": "python distribution", "use": "Usa importlib.metadata mediante el intérprete de Python seleccionado." }, - { "method": "command", "use": "Ejecuta un comando avanzado en formato argv, sin shell, y extrae la versión de su salida." }, - { "method": "manual", "use": "Guarda una versión introducida manualmente; debe cambiarse después de actualizar la app." }, - { "method": "OCI image", "use": "Para contenedores instalados por OCI manager Apps. Lee las versiones de la aplicación y de la imagen del registro de la instalación y compara el digest instalado con el que publica el registro; no necesita configuración." } + { + "method": "dpkg / apk", + "use": "Lee la versión del paquete instalado desde los metadatos de Debian, Ubuntu o Alpine." + }, + { + "method": "binary", + "use": "Ejecuta una ruta binaria absoluta o un nombre de comando con sus parámetros de versión." + }, + { + "method": "file + regex", + "use": "Lee un archivo real y extrae la versión mediante un grupo de captura." + }, + { + "method": "docker label / docker exec", + "use": "Lee una etiqueta de versión OCI o ejecuta un comando de versión dentro de un contenedor Docker." + }, + { + "method": "python distribution", + "use": "Usa importlib.metadata mediante el intérprete de Python seleccionado." + }, + { + "method": "command", + "use": "Ejecuta un comando avanzado en formato argv, sin shell, y extrae la versión de su salida." + }, + { + "method": "manual", + "use": "Guarda una versión introducida manualmente; debe cambiarse después de actualizar la app." + }, + { + "method": "OCI image", + "use": "Para contenedores instalados por OCI manager Apps. Lee las versiones de app e imagen del registro de instalación y compara el digest instalado con el publicado por el registro de imágenes. No necesita configuración." + } ], "sourcesHeading": "Fuentes para la versión disponible", "sources": [ - "Repositorio de GitHub: último lanzamiento o etiqueta de un repositorio público propietario/nombre.", - "HTTP JSON: un punto final público y una ruta como data.version o releases[0].tag_name.", + "Repositorio de GitHub: último lanzamiento o etiqueta de un repositorio público owner/name.", + "HTTP JSON: un endpoint público y una ruta con puntos, como data.version o releases[0].tag_name.", "Docker Hub: etiquetas versionadas filtradas con una expresión regular. La vista previa muestra etiquetas reales coincidentes antes de guardar.", - "Las etiquetas móviles como latest, stable o lts no contienen una versión. Esas imágenes se siguen por digest desde las actualizaciones de imágenes Docker." + "Etiquetas móviles como latest, stable o lts no contienen una versión. Sigue esas imágenes por digest en las actualizaciones de imágenes Docker." ], "regexHeading": "Expresión de captura", - "regexLead": "La expresión regular del detector debe devolver la versión en su primer grupo de captura.", + "regexLead": "La expresión regular debe devolver la versión en su primer grupo de captura.", "regexRules": [ "Haz coincidir el texto emitido por el binario, archivo, comando o fuente de etiquetas seleccionada; no supongas una ruta genérica.", "Escapa los puntos literales como \\. para que no coincidan con cualquier carácter.", @@ -135,11 +159,31 @@ "colDisplay": "Presentación", "colMeaning": "Significado", "rows": [ - { "state": "Actualización disponible", "display": "Versión disponible en morado con un icono de flecha ascendente", "meaning": "Las versiones instalada y disponible son diferentes." }, - { "state": "Actualizada", "display": "Versiones instalada y disponible sin la alerta morada", "meaning": "La última comprobación no encontró una versión superior." }, - { "state": "Seguimiento pendiente", "display": "Estado de comprobación o pendiente", "meaning": "El registro está configurado, pero aún no ha completado las dos comprobaciones." }, - { "state": "Seguimiento desactivado", "display": "Solo enlaces web, sin bloque de comparación", "meaning": "El registro sigue siendo válido y puede tener un actualizador." }, - { "state": "Error de comprobación", "display": "Explicación en ámbar dentro de la tarjeta", "meaning": "El estado guardado anterior permanece visible mientras se informa del error del detector o de la fuente." } + { + "state": "Actualización disponible", + "display": "Versión disponible en morado con un icono de flecha ascendente", + "meaning": "Las versiones instalada y disponible son diferentes." + }, + { + "state": "Actualizada", + "display": "Versiones instalada y disponible sin la alerta morada", + "meaning": "La última comprobación no encontró una versión superior." + }, + { + "state": "Seguimiento pendiente", + "display": "Estado de comprobación o pendiente", + "meaning": "El registro está configurado, pero aún no ha completado las dos comprobaciones." + }, + { + "state": "Seguimiento desactivado", + "display": "Solo enlaces web, sin bloque de comparación", + "meaning": "El registro sigue siendo válido y puede tener un actualizador." + }, + { + "state": "Error de comprobación", + "display": "Explicación en ámbar dentro de la tarjeta", + "meaning": "El estado guardado anterior permanece visible mientras se informa del error del detector o de la fuente." + } ] }, "management": { @@ -158,11 +202,26 @@ "colProblem": "Situación", "colResolution": "Resolución", "rows": [ - { "problem": "Se instaló software después de arrancar ProxMenux", "resolution": "Pulsa Buscar aplicaciones. El escaneo explícito actualiza las sugerencias en caché de ese LXC." }, - { "problem": "No se detectó la aplicación", "resolution": "Regístrala manualmente. Un nombre y un enlace web son suficientes; el seguimiento puede añadirse después." }, - { "problem": "El detector sugerido devuelve una versión incorrecta", "resolution": "Abre Editar campos, selecciona el paquete, binario o archivo real y prueba el detector antes de guardar." }, - { "problem": "Una carga Docker no se ofrece como app LXC", "resolution": "Registra Docker y añade la interfaz publicada de la carga como enlace web de Docker. Las actualizaciones de imágenes permanecen en la sección Docker." }, - { "problem": "Una app guardada no tiene botón de actualización", "resolution": "Abre Actualizaciones y configura su método. El seguimiento de versiones no define por sí solo cómo se instala una actualización." } + { + "problem": "Se instaló software después de arrancar ProxMenux", + "resolution": "Pulsa Buscar aplicaciones. El escaneo explícito actualiza las sugerencias en caché de ese LXC." + }, + { + "problem": "No se detectó la aplicación", + "resolution": "Regístrala manualmente. Un nombre y un enlace web son suficientes; el seguimiento puede añadirse después." + }, + { + "problem": "El detector sugerido devuelve una versión incorrecta", + "resolution": "Abre Editar campos, selecciona el paquete, binario o archivo real y prueba el detector antes de guardar." + }, + { + "problem": "Una carga Docker no se ofrece como app LXC", + "resolution": "Registra Docker y añade la interfaz publicada de la carga como enlace web de Docker. Las actualizaciones de imágenes permanecen en la sección Docker." + }, + { + "problem": "Una app guardada no tiene botón de actualización", + "resolution": "Abre Actualizaciones y configura su método. El seguimiento de versiones no define por sí solo cómo se instala una actualización." + } ] }, "figures": { diff --git a/web/messages/es/docs/monitor/dashboard/vms-lxcs-updates.json b/web/messages/es/docs/monitor/dashboard/vms-lxcs-updates.json index 6bd3f77d..6770a754 100644 --- a/web/messages/es/docs/monitor/dashboard/vms-lxcs-updates.json +++ b/web/messages/es/docs/monitor/dashboard/vms-lxcs-updates.json @@ -56,7 +56,7 @@ "notes": "Descarga la imagen seleccionada y recrea su grupo de servicios Compose o su contenedor independiente protegido." } ], - "callout": "El comando personalizado reemplaza a Helper-Scripts para esa aplicación. Las ejecuciones manuales, en bloque y programadas respetan la elección guardada. Se conservan los comandos existentes y las selecciones antiguas guardadas en planes o programaciones activadas; una programación antigua nunca activa el actualizador de una app recién registrada." + "callout": "Un comando personalizado reemplaza Helper-Scripts para esa app. Las ejecuciones manuales, en bloque y programadas respetan la elección. Se conservan los comandos existentes y las selecciones antiguas guardadas expresamente en planes o programaciones activadas; una programación antigua nunca incorpora una app recién registrada." }, "docker": { "heading": "Docker Engine e imágenes Docker", @@ -84,13 +84,13 @@ "statusColMeaning": "Significado", "statusRows": [ { - "state": "Actualización verificada", + "state": "Actualización verificada disponible", "appearance": "Texto morado, icono de flecha ascendente y acción morada", "meaning": "La versión instalada y la disponible, o los digests de imagen, son diferentes." }, { "state": "Actualizado y verificado", - "appearance": "Comprobación verde y acción Actualizado en verde", + "appearance": "Marca de verificación verde y acción Actualizado en verde", "meaning": "La última comprobación terminada confirma que el objetivo está actualizado." }, { @@ -110,8 +110,8 @@ "No incluyas pct exec; ProxMenux ya entra en el contenedor y ejecuta el comando como root." ], "exampleLead": "Ejemplo de procedimiento completo dentro del contenedor:", - "example": "cd /opt/mi-app && ./update.sh", - "callout": "Un comando de versión como miapp --version solo lee una versión; no instala nada. Los comandos se ejecutan con privilegios administrativos y deben revisarse con el mismo cuidado que un comando de shell como root." + "example": "cd /opt/my-app && ./update.sh", + "callout": "Un comando de versión como myapp --version solo lee una versión; no instala nada. Los comandos se ejecutan con privilegios administrativos y deben revisarse con el mismo cuidado que un comando de shell como root." }, "bulk": { "heading": "Actualización en bloque", @@ -120,7 +120,7 @@ "Los paquetes del SO son obligatorios. Debe seleccionarse al menos una app, Docker Engine o unidad de imagen Docker adicional.", "Las aplicaciones y unidades Docker se seleccionan individualmente. Un servicio principal de Compose muestra las dependencias que se actualizarán con él.", "Los objetivos eliminados o no disponibles se marcan como obsoletos y deben retirarse antes de guardar la configuración.", - "El botón Aplicar actualizaciones es morado si algún objetivo seleccionado tiene una actualización verificada, verde si todos están verificados como actualizados y neutro cuando el resultado es desconocido.", + "Aplicar actualizaciones es morado si algún objetivo tiene una actualización verificada, verde si todos están verificados como actualizados y neutro si el resultado es desconocido.", "Eliminar la configuración en bloque no borra los métodos individuales ni la programación." ], "callout": "La actualización en bloque no reemplaza los botones individuales. Es un acceso opcional para una selección que debe ejecutarse junta." @@ -140,9 +140,9 @@ "items": [ "Selecciona una frecuencia o expresión cron y después objetivos exactos: paquetes del SO, apps individuales, Docker Engine, unidades Docker independientes o grupos de servicios Compose.", "La espera tras una versión solo se aplica a las apps seleccionadas con seguimiento. Las apps sin seguimiento ejecutan su actualizador cuando vence la programación.", - "El estado de la última ejecución diferencia entre éxito, finalización parcial, error, retención de seguridad y ausencia de elementos pendientes. Después de la primera ejecución programada, Actualizaciones → Actualizaciones programadas → Ver log abre la salida completa capturada del actualizador y de los scripts secundarios que haya ejecutado.", + "El estado de la última ejecución distingue éxito, finalización parcial, fallo, retención de seguridad y ausencia de actualizaciones pendientes. Tras la primera ejecución programada, Actualizaciones → Actualizaciones programadas → Ver registro abre toda la salida del actualizador y de los scripts secundarios invocados.", "Después de cada ejecución, ProxMenux comprueba el marcador estándar de Debian que indica si es necesario reiniciar. Cuando hace falta, la pestaña Actualizaciones y la notificación de finalización lo indican; el aviso se elimina cuando ese LXC se inicia o reinicia.", - "En el host Proxmox, los logs de las ejecuciones programadas se guardan en /usr/local/share/proxmenux/logs/lxc-updates/ con el nombre <VMID>-scheduled-<id-de-ejecución>.log. Se conservan los diez últimos logs de cada LXC y los archivos más antiguos se eliminan automáticamente.", + "En el host Proxmox, los logs de las ejecuciones programadas se guardan en /usr/local/share/proxmenux/logs/lxc-updates/ con el nombre <VMID>-scheduled-<run-id>.log. Se conservan los diez últimos logs de cada LXC y los archivos más antiguos se eliminan automáticamente.", "Este historial corresponde a las actualizaciones programadas. Una actualización manual muestra su salida en tiempo real en la ventana de ejecución del Monitor y no crea un log de ejecución programada en ese directorio.", "Las programaciones externas detectadas de Proxmox VE Helper-Scripts se muestran aparte para hacer visible cualquier automatización coincidente." ], @@ -186,7 +186,7 @@ }, { "problem": "Una actualización programada indica que es necesario reiniciar", - "resolution": "Abre Ver log para revisar la ejecución completada y reinicia ese LXC. ProxMenux elimina el aviso mediante el evento de ciclo de vida existente cuando el contenedor vuelve a arrancar." + "resolution": "Abre Ver registro para revisar la ejecución completada y después reinicia ese LXC. ProxMenux borra el aviso cuando el evento de ciclo de vida detecta el nuevo arranque." } ] }, diff --git a/web/messages/es/docs/monitor/dashboard/vms-lxcs.json b/web/messages/es/docs/monitor/dashboard/vms-lxcs.json index eb46abd8..baabcc31 100644 --- a/web/messages/es/docs/monitor/dashboard/vms-lxcs.json +++ b/web/messages/es/docs/monitor/dashboard/vms-lxcs.json @@ -1,168 +1,168 @@ { "meta": { - "title": "ProxMenux Monitor — Panel: pestaña VMs y LXCs | ProxMenux Documentation", - "description": "La pestaña VMs y LXCs inventaría cada guest del host con uso de CPU / memoria / disco en vivo. La vista en detalle por guest muestra configuración, recursos, backups, logs completos del guest, notas y controles Start / Shutdown / Reboot / Stop." + "title": "ProxMenux Monitor — Panel: VMs y LXCs | Documentación de ProxMenux", + "description": "Inventario de todos los invitados con CPU, memoria y disco en vivo. Los detalles incluyen configuración, recursos, copias de seguridad, resultados recientes del log Proxmox, notas y controles Iniciar / Apagar / Reiniciar / Forzar parada." }, "header": { - "title": "Panel: pestaña VMs y LXCs", - "description": "El inventario completo de guests del nodo. Cuatro métricas titulares arriba, una lista ordenable con cada VM y LXC abajo y una vista en detalle por guest con config, recursos, backups, logs y los cuatro controles de ciclo de vida (Start / Shutdown / Reboot / Stop).", + "title": "Panel: VMs y LXCs", + "description": "Inventario completo de invitados del nodo: cuatro métricas arriba, lista ordenable de VM y LXC abajo y detalles por invitado con configuración, recursos, copias, logs y cuatro controles de ciclo de vida (Iniciar / Apagar / Reiniciar / Forzar parada).", "section": "ProxMenux Monitor · Panel" }, "intro": { - "title": "La superficie de control para guests", - "body": "El resto de pestañas son de solo lectura; esta es desde la que actúas. Todo lo que cambia el estado de un guest pasa por POST /api/vms/<vmid>/control con una confirmación explícita y la respuesta se refleja de vuelta en la fila del guest. No hay force-shutdown sin pasar por el botón Stop dedicado." + "title": "Controles de los invitados", + "body": "Controla el ciclo de vida de los invitados desde esta pestaña. Las acciones pasan por POST /api/vms/<vmid>/control con confirmación explícita y actualizan la fila del invitado. El apagado forzado requiere el botón específico Forzar parada." }, "topRow": { "heading": "Fila superior: cuatro tarjetas de estadísticas", - "intro": "Al abrir la pestaña VMs y LXCs aterrizas en un resumen de cuatro tarjetas del estado de los guests — totales, utilización de CPU, compromiso de memoria vs capacidad del host y asignación de disco.", + "intro": "Al abrir VMs y LXCs aparecen cuatro tarjetas: número de invitados, uso CPU, memoria asignada frente a la capacidad del host y espacio de disco asignado.", "imageAlt": "Pestaña VMs y LXCs — fila superior de cuatro tarjetas de estadísticas: Total VMs & LXCs, Total CPU, Total Memory, Total Disk", - "imageCaption": "Fila superior de la pestaña VMs y LXCs — totales + insignias Running / Stopped, utilización actual de CPU, memoria desglosada en used / running-allocated / total-allocated (con una insignia Within Limits) y espacio de disco asignado.", + "imageCaption": "Fila superior: totales y estados En ejecución / Detenidos, uso actual de CPU, memoria usada / asignada a invitados activos / asignada total (con Dentro de límites) y espacio de disco asignado.", "headerCard": "Tarjeta", "headerWhat": "Qué muestra", - "totalLabel": "Total VMs & LXCs", + "totalLabel": "Total de VM y LXC", "totalWhat": "Recuento total con dos insignias — X Running (verde) y Y Stopped (rojo, solo cuando > 0). El número que miras cuando algo no volvió tras un reinicio.", - "cpuLabel": "Total CPU", - "cpuWhat": "Utilización agregada de CPU en vivo a lo largo de todos los guests como porcentaje de la CPU física del host, con una línea al pie \"Allocated CPU usage\".", - "memoryLabel": "Total Memory", + "cpuLabel": "CPU total", + "cpuWhat": "Uso CPU total en vivo de todos los invitados como porcentaje de la CPU física del host, con el pie «Uso de CPU asignada».", + "memoryLabel": "Memoria Total", "memoryIntro": "Tres lecturas apiladas verticalmente:", "memoryItems": [ - "Currently used — valor grande (p. ej. 15.4 GB) más X.X % de Y GB contra la RAM total del host. Una barra de progreso azul sigue al porcentaje.", - "Running allocated + Total allocated — suma de maxmem a lo largo de los guests que están actualmente up junto a la misma suma a lo largo de todos los guests incluyendo los parados. El primero importa hoy; el segundo importa cuando arrancas todo a la vez.", - "Insignia Within Limits (verde) — pasa a Over-committed si el total asignado excede la RAM del host. Un over-commit sano de memoria está bien en hosts con KSM, pero la insignia es el aviso temprano cuando ya no es cómodo." + "Usada actualmente: valor principal, como 15.4 GB, y X.X % de Y GB respecto a la RAM del host. La barra azul indica el porcentaje.", + "Asignada a activos + Asignada total: suma de maxmem de los invitados en ejecución y de todos, incluidos los detenidos. La primera refleja la situación actual; la segunda, qué pasaría al arrancarlos todos.", + "Dentro de límites, en verde, cambia a Sobreasignada si la memoria total asignada supera la RAM del host. Una sobreasignación controlada puede funcionar con KSM; la etiqueta avisa cuando el margen disminuye." ], - "diskLabel": "Total Disk", - "diskWhat": "Suma del espacio de disco asignado a lo largo de todos los guests, en la unidad adecuada (GB / TB), con la línea al pie \"Allocated disk space\"." + "diskLabel": "Disco total", + "diskWhat": "Suma del espacio de disco asignado a todos los invitados, en GB o TB, con el pie «Espacio de disco asignado»." }, "inventory": { - "heading": "Lista Virtual Machines & Containers", + "heading": "Lista de máquinas virtuales y contenedores", "intro": "Una fila por guest. La lista se nutre de una única fuente, /api/vms, que consolida qm list + pct list + pvesh /cluster/resources en el host.", "imageAlt": "Lista Virtual Machines & Containers — una fila por guest con estado, insignia de tipo, nombre, ID y porcentajes inline de CPU / memoria / disco", "imageCaption": "El layout optimizado para móvil del inventario — los mismos datos que muestra la vista de escritorio, reapilados en una sola columna con los porcentajes e indicadores de estado compactos.", "rowsIntro": "Cada fila muestra:", "rows": [ - "Icono de estado — play verde (running) o cuadrado rojo (stopped). Para guests parados, el resto de la fila se atenúa para que veas al instante qué está offline.", + "Icono de estado: triángulo verde (en ejecución) o cuadrado rojo (detenido). Las filas de invitados detenidos se atenúan para identificarlos de inmediato.", "Insignia de tipo — LXC (cian) para contenedores, VM (morado) para máquinas virtuales.", - "Nombre — hostname / nombre de display del guest.", + "Nombre: nombre de host o nombre visible del invitado.", "VMID — el ID numérico de Proxmox bajo el nombre.", "Métricas inline — tres porcentajes con su icono (CPU %, Memory %, Disk %). Cada icono se pone naranja cuando la métrica cruza un umbral de atención (p. ej. memoria por encima del 90 %), así un vistazo rápido te dice qué guest está bajo presión sin abrirlo." ], - "clickHint": "Pulsar cualquier fila — running o stopped — abre la modal de vista en detalle descrita abajo.", - "mobileTitle": "La lista está construida mobile-first", - "mobileBody": "En móviles y ventanas estrechas el inventario reflowea a una única columna con insignia de tipo, nombre, ID y los tres porcentajes de métricas, uno por línea — exactamente la captura de arriba. En viewports más anchos los mismos datos se reparten horizontalmente con más espacio para los porcentajes. De cualquier modo, cada fila es el mismo target completo: pulsa para entrar." + "clickHint": "Pulsa una fila, esté el invitado en ejecución o detenido, para abrir sus detalles.", + "mobileTitle": "La lista está diseñada para móviles", + "mobileBody": "En móviles y ventanas estrechas, tipo, nombre, ID y tres porcentajes se apilan en una columna, como en la captura. En pantallas anchas se reparten horizontalmente con más espacio. Toda la fila es pulsable para abrir los detalles." }, "drillIn": { - "heading": "Modal de vista en detalle por guest", + "heading": "Ventana de detalles del invitado", "intro": "El modal se abre con el nombre, VMID, tipo, estado y tiempo de actividad del sistema. La navegación se adapta al elemento: Estado, App y Actualizaciones para gestionar aplicaciones LXC, Montajes cuando existen puntos de montaje, Logs en los contenedores instalados por OCI manager Apps, además de Backups y Cortafuegos. La barra inferior mantiene los controles de ciclo de vida y el terminal LXC disponibles desde cualquier pestaña.", "statusTitle": "Pestaña 1 — Estado", - "statusImageAlt": "Modal de vista en detalle por guest — pestaña Status con tarjetas en vivo de CPU / Memoria / Disco, totales de E/S de disco y red, el logo de distro del SO y el bloque Resources / IP Addresses", - "statusImageCaption": "Pestaña Status — CPU / Memoria / Disco en vivo con barras de progreso arriba, totales de E/S acumulados (lectura/escritura de disco, descarga/subida de red) abajo, después el bloque estático Resources con expansiones de Notes y + Info y la lista de pastillas IP Addresses.", - "statusIntro": "La pestaña por defecto — la vista \"¿este guest se está portando?\". Tres bloques:", + "statusImageAlt": "Detalles del invitado: Estado con CPU, memoria y disco en vivo, E/S de disco y red, logotipo del SO y Recursos / Direcciones IP", + "statusImageCaption": "Estado: CPU, memoria y disco con barras arriba; totales acumulados de E/S (disco leído/escrito, red recibida/enviada); Recursos con Notas, + Info y lista de direcciones IP.", + "statusIntro": "La pestaña inicial permite comprobar el estado del invitado. Tres bloques:", "liveTitle": "1. Fila de métricas en vivo", "liveItems": [ - "CPU Usage (X cores) — porcentaje actual con barra de progreso. La cabecera muestra el recuento de cores configurado para que sepas qué significaría un 100 %.", - "Memory — used / max en GB con barra de progreso.", - "Disk — used / max a lo largo de la imagen de disco primaria del guest, misma forma." + "Uso CPU (X núcleos): porcentaje con barra. La cabecera muestra los núcleos configurados para interpretar qué significa 100 %.", + "Memoria: usada / máxima en GB con barra.", + "Disco: usado / máximo de la imagen principal de disco, con el mismo formato." ], "ioTitle": "2. Totales de E/S + logo del SO", "ioItems": [ - "Disk I/O — totales acumulados de lectura (↓) y escritura (↑) desde el arranque. Útil para detectar un guest que se ha vuelto de repente intensivo en E/S comparado con su baseline.", - "Network I/O — descarga (↓) y subida (↑) acumuladas. Misma idea en el lado de red.", - "Logo de distro del SO — el icono de Debian / Ubuntu / Alpine / Windows / etc. detectado del tipo de SO del guest. Una pista visual rápida cuando scrolleas varias modales abiertas." + "E/S de disco: totales de lectura (↓) y escritura (↑) desde el arranque. Ayuda a detectar aumentos de E/S frente a la actividad habitual del invitado.", + "E/S de red: descarga (↓) y subida (↑) acumuladas; el mismo concepto para la red.", + "Logotipo del SO: icono Debian / Ubuntu / Alpine / Windows / etc. según el sistema detectado. Ayuda a identificarlo al consultar varias ventanas." ], - "resourcesTitle": "3. Bloque Resources", - "resourcesIntro": "La configuración del guest tal como la ve Proxmox — CPU Cores, Memory (maxmem configurado), Swap. Dos botones colapsables en la cabecera del bloque:", + "resourcesTitle": "3. Bloque Recursos", + "resourcesIntro": "Configuración del invitado según Proxmox: núcleos CPU, memoria (maxmem configurado) y swap. Dos botones despliegan información adicional:", "resourcesItems": [ - "Notes — el campo de descripción del guest. Editable: escribir aquí y guardar llama PUT /api/vms/<vmid>/config y escribe de vuelta en /etc/pve/qemu-server/<vmid>.conf o /etc/pve/lxc/<vmid>.conf.", - "+ Info — campos extra que son demasiado verbosos para la vista por defecto: bios mode, machine type, agent state, entradas de hostpci passthrough, mount points (CT), boot order." + "Notas: descripción editable del invitado. Guardar llama a PUT /api/vms/<vmid>/config y escribe en /etc/pve/qemu-server/<vmid>.conf o /etc/pve/lxc/<vmid>.conf.", + "+ Info: modo BIOS, tipo de máquina, estado del agente, asignaciones passthrough hostpci, puntos de montaje CT y orden de arranque." ], - "ipsTitle": "4. IP Addresses", - "ipsBody": "Lista de pastillas con cada dirección IPv4 / IPv6 que el guest expone actualmente — pastilla verde por dirección. Vacía cuando el guest está parado o cuando el QEMU agent no está instalado en una VM (los LXCs siempre reportan direcciones directamente).", + "ipsTitle": "4. Direcciones IP", + "ipsBody": "Cada dirección IPv4 o IPv6 del invitado aparece en una etiqueta verde. La lista queda vacía si está detenido o si una VM carece del agente QEMU; los LXC comunican sus direcciones directamente.", "appTitle": "Pestaña 2 — App (solo LXC)", "appIntro": "Registra las aplicaciones que pertenecen al LXC, guarda enlaces web y, opcionalmente, compara las versiones instalada y disponible. Las sugerencias proceden de la caché de arranque; Buscar aplicaciones actualiza expresamente la detección de este LXC después de instalar software nuevo.", "appLinkLead": "Consulta la", "appLinkLabel": "página específica de App", "appLinkTail": "para conocer la detección en caché, el registro asistido por catálogo, los enlaces web de Docker y los detectores de versión.", "updatesTitle": "Pestaña 3 — Actualizaciones (solo LXC)", - "updatesIntro": "Mantiene como objetivos separados los paquetes del SO, las aplicaciones registradas, Docker Engine y las imágenes Docker. Cada objetivo puede ejecutarse por separado; una acción en bloque y una programación opcionales seleccionan los métodos exactos que deben ejecutarse juntos.", + "updatesIntro": "Mantiene separados paquetes del SO, aplicaciones, Docker Engine e imágenes Docker. Cada objetivo se ejecuta por separado o se incluye en una selección exacta para actualización en bloque o programada.", "updatesLinkLead": "Consulta la", "updatesLinkLabel": "página específica de Actualizaciones", - "updatesLinkTail": "para conocer los actualizadores integrados y personalizados, la recreación Docker, la selección en bloque, las opciones de seguridad y la programación.", - "mountsTitle": "Pestaña 4 — Montajes (solo LXC, cuando existen)", - "mountsImageAlt": "Modal de vista en detalle LXC — pestaña Mounts listando cada mount point que está usando el contenedor: volúmenes PVE, host binds, binds desde almacenamiento PVE y montajes ad-hoc NFS/CIFS que el operador montó desde dentro del CT. Cada tarjeta lleva una insignia de tipo, barra de capacidad, bytes used/total, opciones de montaje y un punto de estado por color (verde sano, ámbar readonly/divergente, rojo stale)", + "updatesLinkTail": "para actualizadores integrados y personalizados, recreación de contenedores Docker, selección en bloque, opciones de seguridad y programación.", + "mountsTitle": "Pestaña 4 — Montajes (solo LXC, si existen)", + "mountsImageAlt": "Detalles LXC, Montajes: volúmenes PVE, bind mounts del host o de almacenamiento PVE y NFS/CIFS montados dentro del CT. Cada tarjeta muestra tipo, capacidad, bytes usados/totales, opciones y estado por color: verde correcto, ámbar solo lectura/divergente, rojo inaccesible.", "mountsImageCaption": "Pestaña Mounts — solo se renderiza para contenedores LXC, y solo cuando hay al menos un mount point o un montaje remoto ad-hoc presente. Un CT sin mounts no recibe pestaña.", - "mountsIntro": "La propia UI de Proxmox muestra las entradas de mount-point definidas en la config del contenedor (mpX) pero se queda ahí — cualquier cosa que montes desde dentro del CT después (mount.cifs, NFS vía autofs, …) es invisible. Esta pestaña funde ambas vistas: los mounts configurados y los mounts en runtime que ProxMenux sonda desde dentro del contenedor, con un estado de salud por mount y una barra de capacidad cuando el backend la puede resolver.", - "mountTypesTitle": "Tipos de mount detectados", + "mountsIntro": "Proxmox muestra los montajes configurados como mpX, pero no los añadidos después desde el CT con mount.cifs, NFS mediante autofs, etc. Esta pestaña une ambas vistas: montajes configurados y detectados dentro del contenedor, con estado por montaje y capacidad cuando el servidor puede obtenerla.", + "mountTypesTitle": "Tipos de montaje detectados", "mountTypesItems": [ - "PVE volume — respaldado por un almacenamiento gestionado por Proxmox (un subvol ZFS, una entrada de directorio, un Ceph RBD, …). La capacidad viene de las stats del almacenamiento PVE para que la barra coincida con lo que el propio Proxmox muestra.", - "Bind from PVE storage — entrada mpX apuntando a una ruta en un almacenamiento conocido por PVE.", - "Bind from host — entrada mpX apuntando a una ruta arbitraria del host (/mnt/something). La capacidad es el df de esa ruta del host.", + "Volumen PVE: almacenamiento gestionado por Proxmox (subvolumen ZFS, entrada de directorio, Ceph RBD, etc.). La capacidad usa las estadísticas PVE para coincidir con Proxmox.", + "Bind de almacenamiento PVE: entrada mpX que apunta a una ruta de un almacenamiento conocido por PVE.", + "Bind del host: entrada mpX con una ruta arbitraria del host (/mnt/something). La capacidad se obtiene con df de esa ruta.", "Ad-hoc inside CT — mount que solo existe en el namespace de mounts del contenedor (p. ej. un share NFS que el CT monta por su cuenta). La capacidad se lee vía pct exec <vmid> df, que es la única forma de verla — /proc/<pid>/root desde el host no expone las stats reales del mount remoto." ], "mountStateTitle": "Punto de estado por tarjeta y avisos", "mountStateItems": [ - " Verde — mount sano y alcanzable.", - " Ámbar — divergente (configurado pero no montado en realidad), read-only o zombie bind (el origen en el host fue retirado pero el CT sigue viendo el bind como montado — típico cuando se desconectó una unidad USB o hubo un umount manual en el host).", - " Rojo — stale: la sonda de runtime no pudo alcanzar el mount (común con exports NFS cuyo servidor está caído)." + " Verde: montaje correcto y accesible.", + " Ámbar: configurado pero no montado, solo lectura o bind zombi. En este último caso se retiró el origen del host, pero el CT aún lo ve montado, por ejemplo tras desconectar un USB o ejecutar umount en el host.", + " Rojo: inaccesible; la comprobación en ejecución no alcanzó el montaje, por ejemplo un recurso NFS con el servidor caído." ], - "mountsCalloutTitle": "Lo que esto te da sobre la UI nativa", + "mountsCalloutTitle": "Información adicional respecto a Proxmox", "mountsCalloutBody": "Una vista veraz y consciente de la capacidad de cada sitio donde el contenedor lee o escribe. Shares NFS o CIFS montados desde dentro del CT — invisibles para la UI web de Proxmox — aparecen aquí con el mismo aspecto y la misma sonda de salud que cualquier mount point configurado. Mounts remotos stale y zombie binds salen marcados antes de que muerdan durante un backup.", "logsTitle": "Pestaña 5 — Logs (solo contenedores OCI)", - "logsBody": "Solo aparece en los contenedores instalados por OCI manager Apps. Muestra la salida de consola del proceso principal de la imagen, guardada en el host en /var/log/proxmenux/oci/VMID.console.log: las últimas 100, 500 o 1000 líneas, seguidas en directo con el contenedor en marcha, con un filtro y una descarga. Lee el archivo cada vez que se abre, así que también funciona con el contenedor detenido. Los detalles están en Contenedores OCI en ProxMenux Monitor.", - "backupsTitle": "Pestaña 6 — Backups", + "logsBody": "Solo para contenedores de OCI manager Apps. Muestra la consola del proceso principal de la imagen, guardada en /var/log/proxmenux/oci/VMID.console.log: últimas 100, 500 o 1000 líneas, seguimiento en vivo mientras está activo, filtro y descarga. Relee el archivo al abrir y funciona detenido. Más en Contenedores OCI en ProxMenux Monitor.", + "backupsTitle": "Pestaña 6 — Copias de seguridad", "backupsImageAlt": "Modal de vista en detalle por guest — pestaña Backups con la lista de backups disponibles, etiqueta de destino, tamaños y el botón Create Backup", - "backupsImageCaption": "Pestaña Backups — cada backup almacenado en los almacenamientos Proxmox configurados para este guest, ordenados de más nuevo a más viejo. La cabecera de la pestaña lleva la insignia de recuento.", - "backupsIntro": "Lista cada backup almacenado en los almacenamientos Proxmox configurados para este guest, ordenados de más nuevo a más viejo. El título de la pestaña lleva una insignia de recuento para que veas de un vistazo si el guest está backupeado. Por fila:", + "backupsImageCaption": "Todas las copias del invitado en almacenamientos Proxmox configurados, de más nueva a más antigua. La cabecera muestra su número.", + "backupsIntro": "Lista las copias del invitado en almacenamientos Proxmox, empezando por la más reciente. El contador del título permite comprobar si tiene copias. Cada fila muestra:", "backupsItems": [ - "Timestamp — fecha y hora de la ejecución.", + "Fecha y hora: momento de la ejecución.", "Etiqueta de destino — el almacenamiento donde vive (PBS-Cloud, PBS-Local, NFS-Backup, …) coloreada por estado.", - "Size — tamaño final en disco del backup." + "Tamaño: tamaño final en disco de la copia." ], - "backupsOutro": "El botón + Create Backup arriba a la derecha arranca una nueva ejecución en el almacenamiento marcado como \"Backup target\" en la config de almacenamiento de Proxmox. El restore vive en la UI web de Proxmox — el Monitor expone la vista \"¿este guest tiene backup reciente?\", no el flujo de recuperación.", + "backupsOutro": "+ Crear copia inicia una copia en el almacenamiento marcado «Backup target» en Proxmox. Para restaurar usa la interfaz web de Proxmox; Monitor muestra las copias recientes del invitado y permite crearlas.", "firewallTitle": "Pestaña 7 — Cortafuegos", - "firewallIntro": "Lee el log de firewall de Proxmox por guest directamente del host (sin servicio extra, sin polling). La pestaña siempre está presente en la barra de navegación; el panel decide qué renderizar dependiendo de si el firewall está activo para ese guest y si alguna regla está logueando realmente:", + "firewallIntro": "Lee el registro del cortafuegos de cada invitado directamente del host, sin servicio extra ni consultas periódicas. La pestaña siempre aparece; el contenido depende de que el cortafuegos esté activado y de que alguna regla registre paquetes.", "firewallItems": [ - "Firewall disabled — un aviso ámbar explica exactamente dónde activarlo en la UI de Proxmox (<Container|VM> → Firewall → Options) y te recuerda que al menos una regla necesita log: info (o superior) antes de que aparezcan paquetes.", - "Firewall enabled, no events yet — pista de estado vacío con el mismo requisito de logging, útil cuando acabas de activar el firewall.", - "Events present — un panel monoespaciado scrolleable con las entradas raw coloreadas por acción: ACCEPT (verde), REJECT (naranja), DROP (rojo). Una insignia de recuento en la cabecera muestra cuántas entradas hay cargadas en este momento." + "Cortafuegos desactivado: aviso ámbar que indica dónde activarlo en Proxmox (<Container|VM> → Firewall → Options) y que alguna regla requiere log: info o superior para mostrar paquetes.", + "Cortafuegos activo, sin eventos aún: el panel vacío recuerda el mismo requisito de registro, útil al activarlo por primera vez.", + "Hay eventos: panel monoespaciado con desplazamiento y entradas originales por acción: ACCEPT verde, REJECT naranja y DROP rojo. El contador de la cabecera indica las entradas cargadas." ], - "firewallRefresh": "Un botón Refresh arriba a la derecha del panel trae las últimas entradas bajo demanda — no hay auto-refresh dentro de la modal, así que la lista es una snapshot del momento en que abriste la pestaña o pulsaste refresh. Los datos vienen del archivo de log por guest que Proxmox escribe bajo /var/log/pve-firewall.log filtrado por VMID, expuesto vía GET /api/vms/<vmid>/firewall/log.", + "firewallRefresh": "Actualizar carga las entradas más recientes bajo demanda. No hay actualización automática: se muestra el momento de apertura o de la última pulsación. Los datos proceden de /var/log/pve-firewall.log, filtrados por VMID mediante GET /api/vms/<vmid>/firewall/log.", "firewallCalloutTitle": "¿Por qué tenerlo aquí cuando la UI de Proxmox ya lo muestra?", - "firewallCalloutBody": "Dos razones: elimina el viaje de ida y vuelta a la UI web de Proxmox cuando ya estás inspeccionando un guest desde el panel, y mantiene la misma vista acotada por VMID que usa el resto de la modal — arrancar el guest, comprobar sus mounts, mirar los hits recientes del firewall y pararlo otra vez sin salir del panel. El Monitor nunca edita reglas de firewall; la edición de reglas se queda en la interfaz nativa de Proxmox donde corresponde.", + "firewallCalloutBody": "Evita cambiar a la interfaz Proxmox y mantiene la vista del mismo VMID: inicia el invitado, comprueba montajes y eventos del cortafuegos y vuelve a detenerlo desde el panel. Las reglas se editan en Proxmox; Monitor no las modifica.", "actionBarTitle": "Barra de acciones del pie", "actionBarIntro": "Siempre visible al pie de la modal independientemente de qué pestaña esté activa:", - "consoleItem": "Console (solo LXC, running) — abre una modal que ejecuta pct enter <vmid> y te deja dentro del contenedor. La misma fontanería xterm.js + WebSocket que la pestaña Terminal independiente, incluyendo la barra para móvil con ESC, TAB, flechas, Enter y las combinaciones Ctrl (Ctrl+C / Ctrl+X / Ctrl+R) bajo el terminal — haciendo la modal usable desde el teclado de un móvil o tablet. Las VMs no exponen un botón Console aquí; usa la consola web de Proxmox (noVNC) para acceso al guest.", - "lifecycleIntro": "Debajo, cuatro botones de ciclo de vida en una rejilla 2×2. Cada uno dispara POST /api/vms/<vmid>/control con la action correspondiente; el estado de enabled depende de si el guest está actualmente en ejecución:", + "consoleItem": "Consola, solo para LXC en ejecución, abre pct enter <vmid> dentro del contenedor. Usa la misma conexión xterm.js y WebSocket que la pestaña Terminal, incluida la barra para móviles con ESC, TAB, flechas, Intro y Ctrl+C / Ctrl+X / Ctrl+R. Permite trabajar con móvil o tablet. Para VM usa la consola Proxmox noVNC.", + "lifecycleIntro": "Debajo hay cuatro botones en rejilla 2×2. Cada uno envía POST /api/vms/<vmid>/control con su action. Se habilitan según el estado actual del invitado.", "headerButton": "Botón", "headerEnabled": "Habilitado cuando", "headerAction": "Acción enviada al host", "lifecycleRows": [ { - "button": "Start", + "button": "Iniciar", "color": "green", "enabled": "El guest está parado.", "action": "qm start / pct start" }, { - "button": "Shutdown", + "button": "Apagar", "color": "blue", - "enabled": "El guest está en ejecución.", - "action": "qm shutdown / pct shutdown — graceful, ACPI" + "enabled": "El invitado está en ejecución.", + "action": "qm shutdown / pct shutdown — apagado ordenado, ACPI" }, { - "button": "Reboot", + "button": "Reiniciar", "color": "blue", - "enabled": "El guest está en ejecución.", - "action": "qm reboot / pct reboot — reinicio graceful" + "enabled": "El invitado está en ejecución.", + "action": "qm reboot / pct reboot — reinicio ordenado" }, { - "button": "Force Stop", + "button": "Forzar parada", "color": "red", - "enabled": "El guest está en ejecución.", - "action": "qm stop / pct stop — apagado en duro" + "enabled": "El invitado está en ejecución.", + "action": "qm stop / pct stop — apagado forzado" } ], - "forceStopTitle": "Force Stop es el kill switch, no la opción educada", - "forceStopBody": "Force Stop salta la secuencia de apagado del guest — equivalente a tirar del cable de la luz. Usa Shutdown cuando el guest responde; recurre a Force Stop solo cuando Shutdown se cuelga y aceptas el riesgo de pérdida de datos de un apagado no coordinado. El botón es rojo y está etiquetado a propósito para que no lo pulses por reflejo." + "forceStopTitle": "Forzar parada corta la ejecución inmediatamente", + "forceStopBody": "Forzar parada omite el apagado del invitado, como cortar la alimentación. Usa Apagar mientras responda. Fuerza la parada solo si el apagado se bloquea y aceptas el riesgo de perder datos. El botón rojo y su etiqueta ayudan a evitar pulsaciones accidentales." }, "dataCollected": { "heading": "Cómo se recopilan los datos", @@ -186,9 +186,9 @@ "source": "Datos RRD de PVE (pvesh get /nodes/<node>/qemu/<id>/rrddata) condensados a una forma amigable para gráficas." }, { - "section": "Logs recientes de tareas (modal)", + "section": "Resultados recientes del log Proxmox", "endpoint": "/api/vms//logs", - "source": "Tareas para ese vmid desde /var/log/pve/tasks/index." + "source": "pvesh get /nodes/<node>/<qemu|lxc>/<vmid>/log --start 0 --limit 1000. Si el comando falla devuelve una lista vacía; no proporciona todos los logs internos del invitado." }, { "section": "Backups disponibles para el guest", @@ -206,8 +206,8 @@ "source": "qm start|stop|reboot|shutdown o equivalentes pct." } ], - "codeComment1": "# Cross-check de lo que ve el panel contra PVE", - "codeComment2": "# Inspeccionar la config de un guest concreto tal como la ve la modal", + "codeComment1": "# Contrastar los datos del panel con PVE", + "codeComment2": "# Inspeccionar la configuración de un invitado tal como la muestra la ventana", "codeComment3": "# VM", "codeComment4": "# CT" }, @@ -217,7 +217,7 @@ { "label": "Monitor de salud", "href": "/docs/monitor/health-monitor", - "tailRich": " — la categoría VMs y Contenedores (boot fallido, timeouts QMP, fallos de shutdown de CT)." + "tailRich": " — categoría VMs y Contenedores: fallos de arranque, tiempos de espera QMP y errores de apagado CT." }, { "label": "Notificaciones", @@ -227,7 +227,7 @@ { "label": "Referencia de la API", "href": "/docs/monitor/api", - "tailRich": " — los endpoints de VM y backup." + "tailRich": " — endpoints de VM y copias de seguridad." }, { "label": "Índice del panel", @@ -235,9 +235,9 @@ "tailRich": " — el resto de pestañas." }, { - "label": "ProxMenux → Create VM", + "label": "ProxMenux → Crear VM", "href": "/docs/create-vm", - "tailRich": " — la cara de provisión: plantillas de System NAS (Synology y otros), VMs Linux / Windows, valores por defecto pensados para Proxmox." + "tailRich": " — creación de sistemas: plantillas NAS (Synology y otros), VM Linux/Windows y valores adaptados a Proxmox." } ] } diff --git a/web/messages/es/docs/monitor/health-monitor.json b/web/messages/es/docs/monitor/health-monitor.json index c06fb4e6..6b47c0f0 100644 --- a/web/messages/es/docs/monitor/health-monitor.json +++ b/web/messages/es/docs/monitor/health-monitor.json @@ -1,7 +1,7 @@ { "meta": { "title": "Monitor de salud de Proxmox — CPU, memoria, almacenamiento, SMART, ZFS, logs | ProxMenux", - "description": "Monitorización proactiva de salud de Proxmox VE: diez categorías escaneadas cada cinco minutos (CPU y temperatura, memoria y swap, almacenamiento, discos/SMART, red, VMs, servicios, logs, actualizaciones, seguridad), cuatro niveles de severidad, duraciones de supresión por categoría, limpieza automática de errores resueltos, un historial permanente de observaciones de disco y el camino desde un evento crudo a una notificación a Telegram, Discord, Gotify o email.", + "description": "Supervisión proactiva de Proxmox VE: diez categorías cada cinco minutos (CPU y temperatura, memoria y swap, almacenamiento, discos/SMART, red, máquinas virtuales, servicios, registros, actualizaciones y seguridad), cuatro niveles de gravedad, silenciamiento por categoría, limpieza automática de errores resueltos, historial permanente de discos y notificaciones por Telegram, Discord, Gotify o correo.", "ogTitle": "Monitor de salud de Proxmox — CPU, memoria, almacenamiento, SMART, ZFS, logs", "ogDescription": "Monitorización proactiva de salud de Proxmox VE a través de diez categorías con niveles de severidad, duraciones de supresión y notificaciones dirigidas por eventos.", "twitterTitle": "Monitor de salud de Proxmox | ProxMenux", @@ -10,27 +10,27 @@ "header": { "title": "Monitor de salud", "description": "El auto-chequeo continuo que escanea diez categorías de estado del host en un ciclo de cinco minutos, muestrea signos vitales continuamente entre ciclos, deduplica hallazgos en un stream de eventos estructurado, y alimenta el panel, el motor de notificaciones y el reescritor opcional de IA desde una única fuente de verdad.", - "section": "ProxMenux Monitor" + "section": "Monitor de ProxMenux" }, "intro": { "title": "Un escáner, tres consumidores", - "body": "Un hilo de fondo ejecuta el ciclo completo de salud cada 5 minutos, persiste cada hallazgo en SQLite bajo un error_key estable, y deja que (1) el panel renderice el estado actual, (2) el motor de notificaciones reparta los eventos nuevos a los canales configurados y (3) el asistente opcional de IA reescriba las alertas en lenguaje natural. Configuras el escáner una vez; todo lo de aguas abajo se mantiene en sync." + "body": "Un hilo en segundo plano ejecuta el ciclo completo cada cinco minutos y guarda cada hallazgo en SQLite con un error_key estable. Así, (1) el panel muestra el estado actual, (2) el sistema de notificaciones distribuye los eventos nuevos a los canales configurados y (3) el asistente de IA opcional reformula las alertas en lenguaje sencillo. Configuras el análisis una vez y los componentes utilizan los mismos datos." }, "howItWorks": { "heading": "Cómo funciona", - "intro": "El Monitor de salud corre en dos carriles paralelos dentro del proceso del Monitor. Un muestreador de signos vitales ligero lee CPU, memoria y temperatura cada pocos segundos para que las condiciones de umbral sostenido se detecten rápido; en paralelo, el ciclo completo de salud corre cada cinco minutos y ejercita cada categoría de principio a fin. Ambos carriles convergen en las mismas tablas SQLite — y desde ahí, tres consumidores leen el estado independientemente.", + "intro": "El Monitor de salud usa dos hilos paralelos. Un muestreador de métricas ligero llena los historiales de CPU, memoria y temperatura. El ciclo completo de salud lee esos datos, evalúa las condiciones sostenidas y realiza las demás comprobaciones aproximadamente cada cinco minutos; después guarda los hallazgos en SQLite para el panel y las notificaciones.", "scannerTitle": "Del muestreo al hallazgo guardado", - "scannerCaption": "El escáner. Los signos vitales se muestrean rápido para que la presión sostenida de CPU / memoria se detecte antes del siguiente ciclo de 5 min. El ciclo completo lee esos buffers y ejecuta los chequeos más pesados (SMART, estado de pool ZFS, escaneo de journal, salud de servicio, etc.) antes de escribir los hallazgos estructurados a SQLite.", + "scannerCaption": "El muestreador llena los historiales entre ciclos: CPU cada 5 s, memoria cada 30 s y temperatura cada 15 s. No evalúa las alertas. El ciclo completo evalúa esos datos y realiza las comprobaciones más pesadas (SMART, estado ZFS, registros y servicios) antes de guardar los hallazgos en SQLite.", "scannerArrowLabel": "paso", "scannerNodes": { "samplerLabel": "Muestreador de signos vitales", - "samplerDetail": "Uso de CPU 30 s\nMemoria 30 s\nTemperatura 15 s\n→ buffers de historial", + "samplerDetail": "Uso de CPU 5 s\nMemoria 30 s\nTemperatura 15 s\n→ historiales", "cycleLabel": "Ciclo completo de salud", "cycleDetail": "Cada 5 min\nLee buffers\n+ probes en vivo\n(SMART, ZFS,\nservicios, journal…)", "checksLabel": "Chequeos por categoría", "checksDetail": "Diez categorías\n(CPU, memoria,\nalmacenamiento, discos,\nred, VMs,\nservicios, logs,\nactualizaciones, seguridad)", "sqliteLabel": "SQLite", - "sqliteDetail": "tabla errors\n(activos +\ndismissed)\n+ disk_observations\n(historial\npermanente por disco)" + "sqliteDetail": "tabla errors\n(activas +\nsilenciadas)\n+ disk_observations\n(historial permanente\npor disco)" }, "notifTitle": "Del hallazgo guardado al usuario", "notifCaption": "El camino de la notificación. La misma tabla errors también dirige la vista del panel (listas Active / Dismissed renderizadas en vivo) y la consume la rutina de limpieza al final de cada ciclo para auto-resolver entradas obsoletas — ambas corren desde los mismos datos sin pasar por el dispatcher.", @@ -43,7 +43,7 @@ "templatesLabel": "Templates + reescritura con IA", "templatesDetail": "Template\npor evento\n→ reescritura\nopcional con IA\nen lenguaje natural", "channelsLabel": "Canales", - "channelsDetail": "Telegram\nDiscord\nGotify\nEmail (SMTP)" + "channelsDetail": "Telegram\nDiscord\nGotify\nCorreo electrónico (SMTP)" } }, "categories": { @@ -58,7 +58,7 @@ { "category": "CPU y Temperatura", "checks": "Uso de CPU con histéresis, temperatura de sensor", - "events": "Carga sostenida alta; temperatura de CPU cruzando los umbrales warning / critical del fabricante." + "events": "Uso elevado y sostenido de CPU; avisos de temperatura basados en las lecturas muestreadas." }, { "category": "Memoria y Swap", @@ -68,7 +68,7 @@ { "category": "Almacenamiento", "checks": "Almacenamientos Proxmox, sistema de archivos raíz", - "events": "Almacenamiento offline (servidor NFS inalcanzable, credenciales CIFS caducadas); montaje raíz > 90 %; pool LVM thin cerca de lleno." + "events": "Uso de espacio por encima de los umbrales configurados en la raíz u otros sistemas de archivos supervisados (85% aviso / 95% crítico por defecto); exportación NFS desconectada; fallo de autenticación CIFS; pool LVM-thin lleno." }, { "category": "Discos y SMART", @@ -98,7 +98,7 @@ { "category": "Actualizaciones del sistema", "checks": "Actualizaciones pendientes, actualizaciones de seguridad, kernel / versión de PVE, antigüedad del sistema", - "events": "Actualizaciones de seguridad disponibles; kernel pinneado varias versiones menores por detrás; uptime del host > 90 días. Cuando hay actualizaciones pendientes, la cabecera de Overview muestra un botón Update Now que ejecuta el flujo completo de actualización de ProxMenux en línea; al cerrar vuelve a golpear el endpoint de health con ?refresh=1 para que el badge refleje el nuevo estado sin esperar al siguiente ciclo de 5 minutos." + "events": "Actualizaciones pendientes de seguridad o del kernel en uso; sistema sin actualizar desde hace mucho tiempo. Si hay actualizaciones, la cabecera de Vista general muestra Actualizar ahora. Ejecuta todo el proceso de actualización de ProxMenux; al cerrarlo, consulta el estado con ?refresh=1 para actualizar el indicador sin esperar al próximo ciclo." }, { "category": "Seguridad y Certificados", @@ -141,7 +141,7 @@ ], "infoNote": "Una categoría que está OK pero tiene eventos dismissed todavía dentro de su ventana de supresión se renderiza como INFO — para recordarte que algo está siendo silenciado en vez de que nunca hubo nada mal.", "unknownTitle": "UNKNOWN, cuando un chequeo no puede completar", - "unknownBody": "Un chequeo que falla en producir un veredicto durante tres ciclos seguidos (un probe que caduca, un sensor que ha desaparecido, una herramienta que sale con error) se registra internamente como UNKNOWN. El panel lo muestra como un estado amarillo — la vista global capa el UNKNOWN a WARNING para que nunca escale un host sano a CRITICAL por sí solo." + "unknownBody": "Una comprobación no disponible devuelve UNKNOWN; tras tres ciclos consecutivos así, se registra un hallazgo persistente. El panel muestra la comprobación en amarillo. El estado general limita UNKNOWN a WARNING: por sí sola, una comprobación no disponible no vuelve crítico al host." }, "dashboardView": { "heading": "La vista del panel", @@ -150,7 +150,7 @@ "Active — cada categoría con un hallazgo sin resolver. Cada fila expande para mostrar los chequeos individuales que produjeron el estado, la cadena reason cruda, el dispositivo o VM ID involucrado, y (para categorías que enlazan a una pestaña) un click-through a Almacenamiento / Red / VMs / Logs / Hardware para investigar.", "Dismissed — items previamente reconocidos por el usuario que aún están dentro de su ventana de supresión. Cada fila muestra cuánto queda de la supresión y la duración configurada. Cuando la ventana caduca, el item desaparece de esta lista; si la condición subyacente sigue presente y la categoría soporta re-firing, reaparece en Active." ], - "pillTitle": "La pildora refleja la peor categoría", + "pillTitle": "El indicador refleja la categoría más grave", "pillBody": "El color de la cabecera del panel es la severidad más alta entre las diez categorías: cualquier CRITICAL → rojo, si no cualquier WARNING → amarillo, si no cualquier INFO → azul, si no verde. La misma lógica dirige el punto del favicon y el badge del PWA.", "updateNowTitle": "Botón Update Now en la cabecera de Overview", "updateNowBody1": "Cuando la categoría Actualizaciones del sistema reporta una o más actualizaciones pendientes, la cabecera de Overview renderiza un botón Update Now al lado de la pildora de salud. El botón abre una modal que ejecuta el mismo flujo del lado del host que ProxMenux → Settings post-install Proxmox → Proxmox System Update: higiene de repos, apt full-upgrade vía el worker seguro update-pve-safe.sh, recompilación DKMS automática de los drivers gestionados por ProxMenux cuando aterriza un kernel nuevo, autoremove / autoclean y prompt de reinicio si el kernel cambió. Las líneas de progreso van llegando a la modal según las va imprimiendo el worker.", @@ -159,54 +159,54 @@ "dismiss": { "heading": "Hacer dismiss de alertas y la Suppression Duration", "intro": "Algunos eventos son ruidosos por naturaleza — un System Updates: actualizaciones pendientes disponibles permanece cierto hasta que parches el host, y no quieres una notificación cada cinco minutos durante una semana. El botón Update Now de la cabecera de Overview es el atajo directo para resolver ese caso concreto en sitio; para todo lo demás, o cuando el parche se aplaza, el Monitor de salud ofrece además dos mecanismos de silenciamiento acoplados:", - "step1": "Acción Dismiss por evento en el modal. El botón Dismiss abre un dropdown con tres opciones — 24 horas, 7 días o Permanently — que te permite elegir cuánto tiempo se silencia esta alerta concreta independientemente del valor por defecto de la categoría. Elegir una llama a POST /api/health/acknowledge con el error_key y el suppression_hours escogido (-1 para permanente). El evento se mueve a la lista Dismissed con un acknowledged_at con timestamp.", - "dropdownImageAlt": "Dropdown de Dismiss sobre una alerta del Monitor de salud — 24 horas, 7 días o Permanently", - "dropdownImageCaption": "Dropdown Dismiss por evento. La ventana elegida aplica solo a esta alerta; si no eliges ninguna por evento se usa el valor por defecto de la categoría. Los dismisses permanentes se marcan con un badge ámbar distinto Permanent en la lista Dismissed y no se re-disparan.", + "step1": "Descartar un evento desde su ventana. El botón ofrece 24 horas, 7 días o Permanentemente, independientemente del valor de la categoría. Envía POST /api/health/acknowledge con el error_key y las suppression_hours elegidas (-1 para permanente). El evento pasa a Descartados con su fecha acknowledged_at.", + "dropdownImageAlt": "Menú para descartar una alerta: 24 horas, 7 días o permanentemente", + "dropdownImageCaption": "La duración elegida se aplica solo a esta alerta; sin una elección individual, se usa el valor de la categoría. Los descartes permanentes llevan una etiqueta ámbar Permanente y normalmente no reaparecen. La excepción de temperatura crítica de CPU se explica más abajo.", "step2": "Ajuste de Suppression Duration por categoría. Desde la card Settings → Health Monitor (o POST /api/health/settings), cada una de las diez categorías tiene su propia ventana por defecto, aplicada cuando se hace un Dismiss sin elegir ventana por evento:", "imageAlt": "Card Settings → Health Monitor con los dropdowns de supresión por categoría y la sección Active Suppressions", - "imageCaption": "Card Health Monitor — un dropdown por categoría fija los valores por defecto para nuevos dismisses; la sección Active Suppressions debajo lista todas las alertas actualmente silenciadas (ver más abajo).", + "imageCaption": "Un selector de duración por categoría. Elige una ventana mayor para eventos ruidosos, como actualizaciones pendientes, y menor para los que quieras reevaluar pronto. Debajo se muestran los silenciamientos activos.", "outro": "Mientras un evento está suprimido, el escáner sigue corriendo y actualiza el timestamp last_seen de la fila, pero no se despacha ninguna notificación nueva y el panel se mantiene calmado. Cuando la ventana caduca, el siguiente ciclo reevalúa la condición y o bien re-dispara fresco o, si la condición se ha aclarado por sí sola, retira la fila de las listas.", "activeSuppressionsTitle": "Revisar y revertir dismisses — el panel Active Suppressions", - "activeSuppressionsBody": "Cada alerta actualmente silenciada (time-limited y permanente) aparece en Settings → Health Monitor → Active Suppressions. Cada fila muestra el identificador de la alerta, categoría, severidad, cuándo se descartó y cuánto tiempo le queda, más un botón Re-enable que limpia el reconocimiento para que la alerta pueda volver a disparar en el próximo escaneo. Los dismisses permanentes solo se pueden revertir desde aquí; los time-limited también se pueden revivir a la fuerza sin esperar a la cuenta atrás. La acción Re-enable está protegida por el modo Edit del Health Monitor arriba de la card — pulsa Edit, haz clic en Re-enable en cada fila que quieras revivir (las filas en cola muestran un borde verde y el identificador tachado) y luego pulsa Save para confirmar. Cancel descarta la cola.", - "autoTitle": "Auto-supresión cuando cambias la Duration", + "activeSuppressionsBody": "Las alertas silenciadas, temporales o permanentes, aparecen en Ajustes → Monitor de salud → Silenciamientos activos. Cada fila muestra identificador, categoría, gravedad, fecha y tiempo restante. Reactivar quita la confirmación para permitir otra alerta en el próximo análisis. Los descartes permanentes se revierten desde aquí; los temporales también pueden reactivarse antes de tiempo. Activa el modo Editar de la tarjeta, pulsa Reactivar en las filas deseadas (quedan con borde verde y tachadas) y Guarda para aplicar. Cancelar vacía la selección.", + "autoTitle": "Silenciamiento automático al cambiar la duración", "autoBody": "Poner una Suppression Duration de categoría a cualquier cosa distinta del valor por defecto de 24 h tiene un segundo efecto más allá de los dismissals iniciados por el usuario: los futuros hallazgos en esa categoría entran en la tabla ya reconocidos con esa duración. Esto es por diseño — si le has dicho al Monitor que quieres los eventos de disco silenciados durante una semana, los hallazgos de disco nuevos honran esa intención sin que tengas que hacer dismiss de cada uno a mano. Aparecen directamente en la lista Dismissed con el tiempo restante configurado. Las categorías dejadas en 24 h no se ven afectadas y se comportan de la forma clásica (los hallazgos nuevos aterrizan en Active hasta que actúes).", "tempTitle": "La temperatura de CPU CRITICAL es el override de seguridad", - "tempBody": "Un hallazgo específico saltea la supresión por completo: temperatura de CPU CRITICAL. Si el sensor cruza el umbral crítico, la alerta re-dispara independientemente de cualquier dismissal previo — una CPU achicharrada es una CPU achicharrada. Este es el único override integrado del modelo de dismiss.", - "nonDismissableTitle": "Hallazgos a los que no se les puede hacer dismiss", - "nonDismissableBody": "Un puñado de hallazgos están marcados como no-descartables a propósito — señalan una condición donde silenciar la alerta podría costar datos, hardware o conectividad. El botón Dismiss está oculto para estas filas; la alerta se aclara solo cuando la condición subyacente se recupera y la limpieza auto-resolve la coge. Otros hallazgos (eventos I/O transitorios en un disco sano, estados recuperados) también están marcados no-descartables pero por la razón opuesta: no hay nada que silenciar porque la fila ya es informativa y se auto-aclara.", + "tempBody": "La persistencia incluye una regla especial para un registro Temperatura de CPU CRITICAL: si lo recibe, ignora la confirmación previa y el silenciamiento automático. Esto no significa que todos los comprobadores de temperatura emitan un registro crítico al superar un umbral configurado.", + "nonDismissableTitle": "¿Qué hallazgos pueden descartarse?", + "nonDismissableBody": "La ventana muestra Descartar solo si la comprobación devuelve explícitamente dismissable = true. Si el valor es falso o falta, oculta el botón. La gravedad no determina este permiso: varias comprobaciones críticas permiten la confirmación. Los ejemplos describen los datos actuales; silenciar una alerta no corrige su causa.", "headerFinding": "Hallazgo", - "headerWhy": "Por qué no se puede hacer dismiss", + "headerWhy": "Comportamiento al descartar", "rows": [ { "finding": "Advertencia / crítico de temperatura de CPU", - "why": "Riesgo hardware — sobre-temperatura sostenida daña el silicio. Silenciar dejaría a una CPU achicharrándose pasar desapercibida." + "why": "El aviso de temperatura basado en muestras permite descartarse explícitamente. Una regla separada ignora la confirmación si llega un registro de temperatura de CPU con gravedad CRITICAL." }, { "finding": "Espacio crítico de filesystem (montaje raíz)", - "why": "Riesgo de pérdida de datos — un raíz lleno impide escrituras y corrompe estado. La alerta debe permanecer visible hasta que liberes espacio." + "why": "Las comprobaciones de espacio permiten descartarse, incluso con uso crítico. Confirmar la alerta no libera espacio ni elimina el riesgo de fallos de escritura." }, { "finding": "Pool ZFS DEGRADED / FAULTED", - "why": "Riesgo de integridad de datos — el fallo del pool amenaza cada dataset en él. Silenciar mientras el pool está enfermo nunca es la respuesta correcta." + "why": "Las comprobaciones de capacidad del pool ZFS permiten descartarse. Otros hallazgos del pool siguen su propio indicador. Confirmar no repara un pool degradado o averiado." }, { "finding": "Errores I/O de disco con SMART FAILED", - "why": "Fallo de unidad confirmado por SMART — enmascarar oculta hardware real muriendo. La alerta se queda hasta que el dispositivo sea reemplazado (o eliminado del host)." + "why": "Los hallazgos de disco persistidos desde el journal pueden permitir descartarse. SMART FAILED sigue necesitando investigación; el botón depende del indicador de la comprobación, no solo del texto de la alerta." }, { "finding": "Interfaz de red DOWN", - "why": "Pérdida de conectividad — bridges, bonds e interfaces físicas con tráfico activo deben permanecer visibles. Silenciarlos enmascararía una pérdida de acceso remoto." + "why": "Las comprobaciones persistidas de interfaz DOWN permiten descartarse. Esto no restaura un bridge, un bond o un enlace físico, ni recupera el acceso remoto." }, { "finding": "Eventos I/O en discos sanos (INFO)", - "why": "Eventos ATA / dmesg transitorios en un disco cuyo SMART dice OK — marcado INFO y auto-aclarándose. Nada que descartar porque el siguiente ciclo ya los retira." + "why": "Los eventos ATA o dmesg transitorios con SMART sano pueden ser informativos y resolverse solos. Las filas informativas pueden no ofrecer Descartar; el comprobador decide cuándo se resuelve la condición." } ], - "principle": "Todo lo demás se puede descartar. El principio es: alertas que indican \"daño real en progreso\" o que ya se han auto-resuelto se mantienen fuera del camino de dismiss; las alertas sobre condiciones sostenidas que puede que quieras reconocer y revisar más tarde (uso alto de CPU, actualizaciones pendientes, certificado cerca de caducar, warnings de log, hipos de arranque de VM, etc.) todas exponen el botón Dismiss." + "principle": "Usa el botón que muestre el hallazgo concreto; no deduzcas su disponibilidad por la categoría o gravedad. La confirmación controla la presentación y las notificaciones. Las comprobaciones de recuperación y el historial del disco son independientes." }, "autoresolve": { "heading": "Auto-resolución y limpieza", - "intro": "Muchas alertas deberían aclararse solas cuando la condición desaparece — una VM que estaba fallando al arrancar y ahora está corriendo, un disco que ya no está en el sistema, una temperatura que ha bajado a la normalidad. Una rutina de limpieza corre al final de cada ciclo de cinco minutos y aplica estas reglas:", + "intro": "Muchas alertas deben desaparecer cuando cesa la causa: una VM que ya arranca, un disco retirado o una temperatura que vuelve a la normalidad. La limpieza al final de cada ciclo de cinco minutos aplica estas reglas:", "headerTrigger": "Disparador", "headerAction": "Acción", "rows": [ @@ -228,7 +228,7 @@ }, { "trigger": "Hallazgos provenientes del journal (categoría logs, entradas SMART, errores ATA / I/O) cuando su ventana de supresión caduca.", - "action": "Retirados limpiamente. Cada scan inspecciona entradas frescas del journal desde ese punto en adelante; la misma línea histórica en el journal no se re-emite." + "action": "Se retiran. Cada análisis examina nuevas entradas del journal a partir de ese punto; la misma línea histórica no vuelve a emitirse." }, { "trigger": "Errores resueltos con más de siete días.", @@ -236,27 +236,27 @@ } ], "permanentTitle": "La supresión permanente no es lo mismo que resuelto", - "permanentBody": "Poner una Suppression Duration de categoría a -1 (permanente) silencia alertas futuras para items que descartas en esa categoría — pero no salta el chequeo de auto-resolve de arriba. Si la condición subyacente desaparece (recurso borrado, umbral ya no rebasado), el item igualmente se limpia automáticamente." + "permanentBody": "Una duración por categoría de -1 (permanente) silencia futuras alertas de los elementos descartados, pero no evita la comprobación automática anterior. Si desaparece la causa —recurso eliminado o umbral ya no superado—, el elemento sigue limpiándose automáticamente." }, "observations": { "heading": "Observaciones de disco — el historial permanente", - "intro": "Los eventos de disco son especiales. Un warning SMART en /dev/sdh a las 02:14 AM es algo que quieres recordar incluso después de que la tormenta I/O se calmase y el error se auto-resolviese — el disco tiene ahora un track record. Para ese propósito, el Monitor de salud guarda una tabla permanente aparte: disk_observations.", + "intro": "Los eventos de disco merecen conservarse. Un aviso SMART en /dev/sdh a las 02:14 sigue siendo relevante cuando termina la ráfaga de E/S y el error se resuelve solo: el disco ya tiene antecedentes. Por eso el Monitor de salud mantiene otra tabla permanente: disk_observations.", "headerProperty": "Propiedad", - "headerErrors": "tabla errors (Active)", + "headerErrors": "Tabla errors (Activos)", "headerObs": "tabla disk_observations", "rows": [ { "property": "Propósito", "errors": "Dirige la vista actual de salud + despacho de notificaciones.", - "obs": "Audit trail permanente por disco." + "obs": "Registro de auditoría permanente por disco." }, { - "property": "Auto-resolve", - "errors": "Sí — las filas se aclaran cuando la condición desaparece.", + "property": "Resolución automática", + "errors": "Sí: las filas se retiran cuando desaparece la causa.", "obs": "No — las entradas persisten para siempre salvo que el usuario las descarte explícitamente." }, { - "property": "Clave de dedup", + "property": "Clave de deduplicación", "errors": "error_key (p. ej. smart_sdh).", "obs": "(disk_registry_id, error_type, error_signature) con firmas estables despojadas de datos volátiles." }, @@ -268,10 +268,10 @@ { "property": "Qué registra", "errors": "Lo que esté fallando actualmente.", - "obs": "Warnings SMART (problemas de sector / temperatura / CRC / self-tests fallidos), errores I/O (ATA / NVMe / dm), errores de filesystem, eventos de pool ZFS." + "obs": "Avisos SMART (sectores, temperatura, CRC o autopruebas fallidas), errores de E/S (ATA / NVMe / dm), errores del sistema de archivos y eventos de pools ZFS." } ], - "outro": "Consecuencia práctica: una alerta puede aclararse del panel mientras el mismo incidente sigue registrado en el historial del disco. Cuando entras a un disco bajo Almacenamiento, la tarjeta muestra el conteo de observaciones pendientes y una lista con timestamps, severidad y el mensaje crudo original — útil cuando estás decidiendo si una unidad necesita reemplazo.", + "outro": "Una alerta puede desaparecer del panel mientras el incidente sigue registrado en el historial del disco. Al abrir el disco en Almacenamiento, su tarjeta muestra las observaciones pendientes con fecha, gravedad y mensaje original sin procesar. Esto ayuda a decidir si hay que sustituirlo.", "renameTitle": "Los renombres entre dispositivos se fusionan automáticamente", "renameBody": "Los discos a veces aparecen bajo nombres transitorios (ata8, nvme0n1p3) antes de conseguir un nombre estable de block-device. La capa de observaciones consolida entradas por número de serie cuando se conoce: si un evento se registró primero como ata8 y el mismo disco se identifica más tarde como sdh, las observaciones históricas se reasocian a sdh en el siguiente ciclo para que el historial no se fragmente." }, @@ -283,13 +283,13 @@ "Si el tipo de evento está activado en los ajustes globales de notificación, y el canal no ha silenciado esta categoría, se encola un evento.", "El motor de templates renderiza un par (título, cuerpo) desde los detalles estructurados. Si el reescritor de IA está activado, el mismo par también pasa por el proveedor configurado para una versión en lenguaje natural.", "La implementación del canal lo envía: mensaje de Telegram, embed de Discord, push de Gotify o email. El resultado del despacho se guarda en notification_history.", - "Si un dismiss llega más tarde, la ventana de supresión entra en juego y cualquier re-firing posterior del mismo error_key se queda en la cola hasta que la ventana cierre." + "Descartar una alerta inicia su ventana de silenciamiento. Durante ella, las nuevas detecciones del mismo error_key normalmente no generan notificaciones ni quedan en cola para enviarse al terminar. La regla de temperatura crítica de CPU sigue siendo una excepción." ], - "outro": "La configuración de canales (token de bot de Telegram, URLs de webhook, keys de proveedor de IA, toggles por evento, overrides por canal) está documentada en Notifications y Asistente de IA." + "outro": "La configuración de canales —token del bot Telegram, URLs de webhook, claves de IA, opciones por evento y ajustes por canal— se explica en Notificaciones y Asistente de IA." }, "rest": { "heading": "Endpoints REST", - "intro": "Todo lo que hace el modal se puede llamar desde la API — útil para scripts, paneles propios o tu propia integración de chat-bot. Cada llamada necesita un token de API; las que modifican algo — descartar una alerta, guardar los ajustes de supresión o limpiar huérfanos — requieren uno con scope full_admin, y un token read_only recibe 403.", + "intro": "Las acciones de la ventana están disponibles por API para scripts, paneles o bots. Con la autenticación del Monitor activada, las llamadas necesitan un token Bearer válido, obtenido al iniciar sesión o en la pantalla de tokens API. Los cambios, como confirmar alertas, guardar ajustes o limpiar errores huérfanos, exigen full_admin; read_only recibe 403. Si la autenticación está desactivada o se rechazó, estos controles permiten acceder sin token.", "headerEndpoint": "Endpoint", "headerMethod": "Método", "headerUse": "Uso", @@ -297,7 +297,7 @@ { "endpoint": "/api/health", "method": "GET", - "use": "Probe pequeño de salud — devuelve JSON con status, timestamp y version. Adecuado para keyword checks de Uptime Kuma; el receptor debe enviar la cabecera bearer." + "use": "Comprobación ligera que devuelve JSON con status, timestamp y version. Sirve para comprobar palabras clave con Uptime Kuma; si la autenticación del Monitor está activa, el cliente debe enviar una cabecera Bearer." }, { "endpoint": "/api/health/status", @@ -312,27 +312,27 @@ { "endpoint": "/api/health/full", "method": "GET", - "use": "Snapshot completo — categorías + errores activos + lista de dismissed + ajustes de supresión personalizados. Alimenta el modal en un round-trip y usa una caché de fondo de 6 min para respuesta instantánea." + "use": "Vista completa: categorías, errores activos, descartados y ajustes de silenciamiento. Alimenta la ventana con una sola petición y usa una caché en segundo plano de seis minutos para responder rápidamente." }, { "endpoint": "/api/health/active-errors", "method": "GET", - "use": "Solo la lista Active. Filtrable por ?category=<name>." + "use": "Solo la lista Activos. Admite el filtro ?category=<name>." }, { "endpoint": "/api/health/dismissed", "method": "GET", - "use": "Solo la lista Dismissed, con las horas de supresión restantes." + "use": "Solo la lista Descartados, con las horas restantes de silenciamiento." }, { "endpoint": "/api/health/acknowledge", "method": "POST", - "use": "Body: '{'\"error_key\":\"smart_sdh\"'}'. Descarta una alerta con la ventana configurada de la categoría." + "use": "Cuerpo: '{'\"error_key\":\"smart_sdh\"'}'. Descarta una alerta durante el plazo configurado para su categoría." }, { "endpoint": "/api/health/settings", "method": "GET / POST", - "use": "Lee o escribe los valores de Suppression Duration por categoría." + "use": "Lee o guarda la duración del silenciamiento por categoría." }, { "endpoint": "/api/health/cleanup-orphans", @@ -348,14 +348,14 @@ "heading": "Por dónde seguir", "items": [ { - "label": "Dashboard", + "label": "Panel", "href": "/docs/monitor/dashboard", "tail": " — desde donde se abre el modal del Monitor de salud en la UI." }, { - "label": "Notifications", + "label": "Notificaciones", "href": "/docs/monitor/notifications", - "tail": " — canales, toggles por evento, el hook de reescritura con IA, historial." + "tail": " — canales, opciones por evento, integración de la reformulación IA e historial." }, { "label": "Asistente de IA", diff --git a/web/messages/es/docs/monitor/index.json b/web/messages/es/docs/monitor/index.json index 75755b86..1f0f4033 100644 --- a/web/messages/es/docs/monitor/index.json +++ b/web/messages/es/docs/monitor/index.json @@ -27,7 +27,7 @@ "tableWhat": "Qué muestra", "sections": [ { - "name": "Health Monitor", + "name": "Monitor de salud", "description": "Alertas activas y descartadas para CPU, memoria, almacenamiento, discos, red, servicios, logs, VMs, actualizaciones y seguridad. Alimenta el motor de notificaciones." }, { @@ -40,7 +40,7 @@ }, { "name": "VMs y contenedores", - "description": "Inventario de todas las VMs y LXCs con estado, recursos y uptime. El detalle muestra config, métricas históricas, logs completos del guest y acciones de start/stop/reboot/shutdown." + "description": "Inventario de VM y LXC con estado, recursos y tiempo de actividad. El detalle muestra configuración, métricas históricas, descarga de registros de Proxmox y acciones de iniciar/parar/reiniciar/apagar. Los registros dependen del endpoint de Proxmox; no es un archivo completo del sistema invitado." }, { "name": "Hardware", @@ -52,37 +52,37 @@ }, { "name": "Terminal", - "description": "Shell en el navegador hacia el host o cualquier VM/CT, mediante xterm.js sobre WebSockets. Autenticado y auditado igual que el resto de la API." + "description": "Shell del host y acceso a consolas VM/CT compatibles en el navegador mediante xterm.js y WebSockets. Sigue el modo de autenticación configurado: si está desactivada o rechazada, los clientes con acceso de red pueden abrir sesiones sin iniciar sesión. No implica auditoría de cada comando." }, { "name": "Seguridad", - "description": "Fallos de autenticación, estado de jails de Fail2Ban, eventos de bloqueo recientes, integración con el jail [proxmenux] del host." + "description": "Fallos de autenticación, estado de las jails de Fail2Ban, bloqueos recientes e integración con la jail [proxmenux] del host." } ], - "footer": "Cada sección tiene su propia página de documentación bajo Dashboard en la barra lateral." + "footer": "Cada sección tiene documentación propia bajo Panel en la barra lateral." }, "howItRuns": { "heading": "Cómo se ejecuta", - "intro": "ProxMenux Monitor se distribuye como un AppImage autocontenido. Una única unidad systemd (proxmenux-monitor.service) arranca un proceso Flask que:", + "intro": "ProxMenux Monitor se distribuye como una AppImage autónoma. Una única unidad de systemd (proxmenux-monitor.service) inicia un proceso de Flask que:", "bullets": [ "Escucha en TCP 8008 en el host (HTTP).", "Sirve el panel Next.js como activos estáticos bajo / y la API bajo /api/* desde el mismo proceso.", "Obtiene datos en vivo con herramientas estándar del host: psutil, pvesh, smartctl, journalctl, zpool, ip, nvidia-smi, etc.", "Persiste su propio estado en una base de datos SQLite local (/usr/local/share/proxmenux/health_monitor.db): alertas descartadas, observaciones de discos, configuración de notificaciones, configuración de IA. El estado de autenticación vive aparte en /root/.config/proxmenux-monitor/auth.json." ], - "footer": "El flujo completo de petición, la disposición de archivos y la integración systemd se describen en Architecture." + "footer": "El flujo de peticiones, la estructura de archivos y la integración systemd se describen en Arquitectura." }, "noAgent": { "title": "Sin agente en los guests", - "body": "El Monitor lee todo desde el host. Las VMs y CTs no necesitan ningún agente instalado — los datos del guest provienen de la API de Proxmox y de la visibilidad a nivel de kernel del propio host sobre los guests en ejecución." + "body": "El Monitor obtiene los datos desde el host. No hace falta instalar un agente en las VM ni en los CT: los datos proceden de la API de Proxmox y de la información que el kernel del host ofrece sobre los invitados en ejecución." }, "access": { "heading": "Acceder al panel", "intro": "Se soportan dos patrones de acceso y la aplicación detecta cuál está en uso:", "codeComment1": "# 1) Acceso directo al host", "codeComment2": "# 2) Mediante proxy inverso (Nginx / Caddy / Traefik)", - "afterCode": "Cuando hay un proxy inverso por delante, el Monitor respeta X-Forwarded-For, X-Forwarded-Proto y X-Forwarded-Host para que las URLs y CORS funcionen correctamente sin configuración manual.", - "footer": "La configuración inicial, contraseña + TOTP 2FA y snippets de proxy inverso se cubren en Access & Authentication." + "afterCode": "El proxy inverso debe configurar X-Forwarded-For, X-Forwarded-Proto y X-Forwarded-Host correctamente y permitir WebSockets. En puertos estándar el navegador usa su origen actual. El backend solo confía en direcciones reenviadas con PROXMENUX_TRUST_PROXY=1 explícito; restringe su acceso directo si activas esa confianza.", + "footer": "La configuración inicial, contraseña + TOTP 2FA y ejemplos de proxy inverso se explican en Acceso y autenticación." }, "mobile": { "heading": "Uso móvil e instalación en la pantalla de inicio", @@ -95,8 +95,8 @@ "androidLabel": "Android Chrome / Edge:", "androidBody": "menú de tres puntos → Instalar app (o Añadir a pantalla de inicio en versiones antiguas).", "afterInstall": "Una vez instalado, abrir el icono lanza el panel en modo standalone con su propia entrada en el conmutador de tareas.", - "onlineOnlyTitle": "Solo online", - "onlineOnlyBody": "La PWA es instalable pero no funciona sin conexión — no hay service worker. El lanzador se comporta como una app nativa, pero el dispositivo necesita poder llegar al host en TCP 8008 (LAN, VPN o HTTPS tras proxy inverso) para que el panel cargue." + "onlineOnlyTitle": "Requiere conexión", + "onlineOnlyBody": "La PWA se puede instalar, pero no funciona sin conexión: no incluye un service worker. El acceso directo se comporta como una aplicación nativa, pero el dispositivo debe poder conectar con el host por TCP 8008 (mediante LAN, VPN o HTTPS a través de un proxy inverso) para cargar el panel." }, "health": { "heading": "El Health Monitor y las notificaciones", @@ -112,38 +112,38 @@ }, "api": { "heading": "API REST e integraciones", - "intro": "Todo lo que muestra la interfaz está disponible como JSON sobre HTTP/HTTPS. Los mismos endpoints alimentan widgets de Homepage, sensores de Home Assistant, dashboards de Grafana (vía el exporter Prometheus en /api/prometheus), pruebas de Uptime Kuma y cualquier script personalizado que hable curl.", - "tokens": "Los tokens API de larga duración (365 días) se generan desde Settings → API Access Tokens o vía POST /api/auth/generate-api-token.", - "bearer": "Los tokens viajan como Authorization: Bearer …. Los endpoints públicos (/api/health, /api/auth/*) funcionan sin token para que las pruebas externas de uptime puedan llegar al host sin entregar credenciales.", - "catalog": "El catálogo completo de endpoints, la guía de rotación de tokens y las buenas prácticas de seguridad viven en API Reference; los ejemplos listos para Homepage, Home Assistant, Grafana, Uptime Kuma y un patrón genérico de cURL están en Integrations." + "intro": "Los endpoints REST ofrecen datos de monitorización JSON por HTTP/HTTPS para widgets Homepage, sensores Home Assistant, pruebas Uptime Kuma y scripts. Grafana puede usar el exportador de texto Prometheus en /api/prometheus. Las peticiones se pueden hacer con curl.", + "tokens": "Los tokens API de larga duración (365 días) se generan en Configuración → Tokens de acceso API o mediante POST /api/auth/generate-api-token.", + "bearer": "Envía tokens con Authorization: Bearer …. El endpoint público /api/health permite pruebas de disponibilidad sin credenciales. Bajo /api/auth/* hay rutas públicas de configuración/inicio/estado y rutas protegidas de cuentas y tokens; no todas son anónimas.", + "catalog": "El catálogo de endpoints, rotación de tokens y prácticas de seguridad están en Referencia de la API. Los ejemplos para Homepage, Home Assistant, Grafana, Uptime Kuma y cURL están en Integraciones." }, "serviceControl": { "heading": "Control del servicio", - "intro": "Día a día, el Monitor se gestiona exactamente como cualquier otro servicio systemd. También está expuesto como dos entradas dentro del TUI de ProxMenux bajo Settings:", + "intro": "Monitor se gestiona como cualquier servicio systemd. También tiene dos entradas en la interfaz de texto ProxMenux bajo Configuración:", "codeComment": "# Control manual", - "footer": "Mira Settings → ProxMenux Monitor para el conmutador del menú y el flujo de verificación de estado." + "footer": "Consulta Configuración → ProxMenux Monitor para activar/desactivar el servicio y verificar su estado." }, "nextSteps": { "heading": "A dónde ir ahora", "items": [ { - "label": "Architecture", + "label": "Arquitectura", "description": "— backend Flask, unidad systemd, esquema SQLite, proveedores IA, canales de notificación." }, { - "label": "Access & Authentication", + "label": "Acceso y autenticación", "description": "— primer arranque, configuración de contraseña, TOTP 2FA, configuración de proxy inverso, integración con Fail2Ban." }, { - "label": "Dashboard", + "label": "Panel", "description": "— cada sección de la interfaz, una página por cada una." }, { - "label": "API Reference", + "label": "Referencia de la API", "description": "— cada endpoint, forma de petición / respuesta y gestión de tokens." }, { - "label": "Integrations", + "label": "Integraciones", "description": "— Homepage, Home Assistant, Grafana / Prometheus, Uptime Kuma, patrón genérico de cURL." } ] diff --git a/web/messages/es/docs/monitor/integrations.json b/web/messages/es/docs/monitor/integrations.json index 36896b10..4fbf74b1 100644 --- a/web/messages/es/docs/monitor/integrations.json +++ b/web/messages/es/docs/monitor/integrations.json @@ -10,21 +10,21 @@ "header": { "title": "Integraciones", "description": "Guías copia-pega para conectar ProxMenux Monitor en los paneles y herramientas que tu homelab ya usa — Homepage, Home Assistant, Grafana vía Prometheus, Uptime Kuma. Cada guía muestra la configuración exacta que espera la herramienta receptora, el endpoint del Monitor con el que habla y el patrón de cabecera de auth que lo une todo.", - "section": "ProxMenux Monitor" + "section": "Monitor de ProxMenux" }, "intro": { "title": "Qué puedes construir desde esta página", - "body": "Cada guía de abajo está lista para copiar a tu herramienta elegida. Los endpoints de la API usados aquí están documentados en la API Reference — esta página es el compañero \"cómo usarlos realmente en Homepage / Home Assistant / Grafana\". Las capturas muestran la salida real que verás una vez la guía esté en su sitio." + "body": "Copia cada ejemplo en la herramienta correspondiente. Los endpoints están documentados en la Referencia de la API; esta página explica cómo utilizarlos en Homepage, Home Assistant y Grafana. Las capturas muestran el resultado de esas configuraciones." }, "auth": { "heading": "Autenticación: lo único que cada guía necesita", "intro": "La mayoría de los endpoints usados por estas integraciones están autenticados. Tienes dos formas de satisfacer ese requisito.", "optAtitle": "Opción A — API token (recomendado para integraciones)", - "optAbody1": "Abre el panel y ve a Settings → Security → API Tokens. Pulsa Generate token, dale un nombre (p. ej. homepage, home-assistant, prometheus), y copia el token — se muestra una vez. De larga duración (un año de expiración por defecto), revocable individualmente, y lo que deberías usar para cualquier cliente no-navegador.", + "optAbody1": "Entra en Ajustes → Seguridad → Tokens API. Pulsa Generar token, ponle un nombre, como homepage, home-assistant o prometheus, y cópialo: se muestra una sola vez. Caduca al año por defecto y puede revocarse individualmente. Úsalo para los clientes externos al navegador.", "optAbody2": "A partir de ahí cada petición es simplemente:", "optBtitle": "Opción B — flujo de login (usuario + contraseña)", "optBbody": "Útil para scripts que se autentican como un usuario humano. El token devuelto es de corta duración; la mayoría de integraciones deberían preferir la Opción A.", - "outro": "El campo TOTP solo es requerido cuando el 2FA está activado en la cuenta. La rotación de tokens, la revocación, la política de contraseñas y el log de auditoría viven en Access & Authentication.", + "outro": "El campo TOTP solo hace falta con la autenticación en dos pasos activada. La rotación y revocación de tokens, la política de contraseñas y el registro de auditoría se explican en Acceso y autenticación.", "httpsTitle": "Usando HTTPS en lugar de HTTP", "httpsIntro": "Cada guía de abajo usa http:// en las URLs para mantener los ejemplos cortos. Si has activado TLS en el Monitor (Settings → Security → SSL/HTTPS), cambia http:// por https:// en cada URL — ese es el único cambio. Dos notas específicas para ciertas herramientas:", "httpsItems": [ @@ -37,7 +37,7 @@ "headingHref": "https://gethomepage.dev", "intro": "Homepage es un panel de aplicaciones totalmente estático y personalizable. ProxMenux Monitor se enchufa vía el widget customapi integrado — pega una entrada de servicio en services.yaml, reinicia Homepage y la tarjeta aparece con números en vivo.", "iconCalloutTitle": "El logo oficial de ProxMenux está en dashboardicons.com", - "iconCalloutBody": "Las guías de abajo usan icon: proxmenux.png. Homepage resuelve automáticamente los nombres de archivo simples contra dashboardicons.com — una librería de iconos curada para paneles autoalojados. La entrada de ProxMenux vive en dashboardicons.com/icons/external/proxmenux y Homepage la descarga en el primer render. La misma búsqueda funciona para miles de otras herramientas (Telegram, Discord, Grafana, Tailscale, etc.) — basta con escribir icon: <nombre>.png en cualquier entrada de servicio.", + "iconCalloutBody": "Las guías de abajo usan icon: proxmenux.png. Homepage resuelve automáticamente los nombres de archivo simples contra dashboardicons.com — una librería de iconos curada para paneles autoalojados. La entrada de ProxMenux vive en dashboardicons.com/icons/external/proxmenux y Homepage la descarga en el primer render. La misma búsqueda funciona para miles de otras herramientas (Telegram, Discord, Grafana, Tailscale, etc.) — basta con escribir icon: <name>.png en cualquier entrada de servicio.", "imageAlt": "Panel Homepage mostrando tres tarjetas de ProxMenux Monitor (EDGE, VOID, DREAM) con uptime, CPU, RAM y temperatura para cada host Proxmox", "imageCaption": "Tres instancias de ProxMenux Monitor renderizadas como tarjetas Homepage — uptime, CPU, RAM y temperatura de CPU leídas en vivo desde /api/system en cada host cada 10 s.", "basicTitle": "Widget básico — sin autenticación", @@ -48,16 +48,16 @@ "multiTitle": "Setup multi-widget — sistema, almacenamiento, red", "multiIntro": "Para una vista más rica, renderiza tres tarjetas separadas respaldadas por distintos endpoints — una para métricas del sistema, una para almacenamiento, una para red. Usa el mismo token en cada tarjeta; es la misma instancia del Monitor.", "multiCalloutTitle": "Múltiples hosts Proxmox", - "multiCalloutBody": "Repite el bloque de entrada por host para obtener el layout multi-tarjeta de la captura de arriba — cada entrada apunta a la URL http://<host>:8008 de su propia instancia de ProxMenux Monitor. El token puede ser distinto por host (una entrada secret por host) o compartido, según cómo los generes." + "multiCalloutBody": "Repite el bloque para cada host y obtendrás las tarjetas de la captura. Cada entrada usa la URL http://<host>:8008 de su propia instancia. Genera y guarda un token por host: cada instalación tiene su clave de firma y no debes asumir que el token de otra funcione." }, "homeAssistant": { "heading": "Home Assistant", "headingHref": "https://www.home-assistant.io", - "intro": "No hay una integración HACS nativa para ProxMenux Monitor (todavía) — pero no la necesitas. La integración rest integrada en Home Assistant puede consumir cada endpoint documentado en la API Reference y convertir las respuestas en sensores, atributos y triggers. El build de referencia completo de abajo expone ~25 sensores cubriendo recursos del sistema, el Monitor de salud, VMs / CTs, almacenamiento, red, latencia al gateway y estado de actualización de ProxMenux — pega el YAML en configuration.yaml, reinicia y tienes una capa completa de observabilidad de Proxmox dentro de HA.", + "intro": "Estos ejemplos usan la integración rest de Home Assistant y no necesitan un componente HACS propio. Leen endpoints del Monitor descritos en la Referencia de la API y convierten sus respuestas en sensores y atributos para automatizaciones. La configuración ofrece unos 25 sensores de recursos, salud, VMs/CTs, almacenamiento, red y actualizaciones. Añádela a configuration.yaml y recarga o reinicia HA.", "imageAlt": "Panel Home Assistant mostrando entidades de ProxMenux Monitor — badge de estado de salud, gauges de CPU / RAM / Temp, contador de VMs, uso de almacenamiento y contador de errores activos", "imageCaption": "ProxMenux Monitor como integración de primera clase en Home Assistant — sensores construidos desde la guía YAML de abajo.", "step1Title": "1 · Guarda el API token", - "step1Body": "Mete el token en el secrets.yaml de Home Assistant para que nunca se filtre en un volcado de config. El prefijo bearer entero va en una línea — eso permite al YAML referenciarlo directamente como valor de cabecera. El nombre y ubicación del archivo depende de tu instalación de HA (típicamente /config/secrets.yaml para HA OS / Container).", + "step1Body": "Guarda el token en secrets.yaml para separarlo de la configuración principal. Incluye el prefijo Bearer y el token en un único valor para usarlo como cabecera. El archivo no está cifrado y también debe mantenerse privado. Su ubicación depende de la instalación; normalmente es /config/secrets.yaml en HA OS o Container.", "step2Title": "2 · Añade la configuración REST", "step2Body": "Seis bloques REST cubren toda la superficie — uno por área principal del Monitor. Cada bloque tiene un scan_interval sensato ajustado a cuán a menudo cambian los datos subyacentes (recursos del sistema cada 30 s, salud cada 60 s, inventarios que cambian despacio cada 5-10 min). Pega en configuration.yaml:", "step3Title": "3 · Añade sensores binarios y helpers de template", @@ -65,21 +65,21 @@ "step4Title": "4 · Recarga y verifica", "step4Body": "Desde la UI de HA: Developer Tools → YAML → Check Configuration primero para validar la sintaxis, luego recarga All YAML configuration (o reinicia completo). Después de que vuelva, filtra Settings → Devices & Services → Entities por proxmenux — deberías ver las ~25 entidades llenándose dentro de un intervalo de scan.", "replaceTitle": "¿Reemplazando una versión anterior de esta guía?", - "replaceBody": "Si probaste una versión previa de estos bloques YAML, el registro de entidades de Home Assistant puede haber cacheado los IDs de entidad viejos y entidades obsoletas seguirán apareciendo (con warnings Entidad no encontrada en tus tarjetas Lovelace). Estado limpio en dos pasos: borra los bloques rest: y template: previos de configuration.yaml, recarga, y luego bajo Settings → Devices & Services → Entities filtra por proxmenux y quita cualquier entrada marcada como \"Restored\" o mostrada como indisponible. Luego pega el YAML actual y recarga de nuevo — las entidades nuevas se registran limpiamente.", + "replaceBody": "Si usaste una versión anterior, el registro de entidades puede conservar IDs obsoletos y las tarjetas mostrar Entidad no encontrada. Quita los bloques anteriores rest: y template: de configuration.yaml y recarga. En Ajustes → Dispositivos y servicios → Entidades, filtra por proxmenux y elimina las entradas antiguas restauradas o no disponibles. Añade después el YAML actual y recarga para registrar las nuevas.", "step5Title": "5 · Panel Lovelace", "step5Body": "El YAML de abajo es una única tarjeta vertical-stack que combina todas las sub-tarjetas en un bloque — cabecera con logo, KPIs rápidos, detalle del sistema, VMs, almacenamiento, red y una tarjeta condicional de problemas de salud. Para usarla: abre tu panel, pulsa el lápiz (editar), pulsa Add card, baja al final y elige Manual, luego pega:", "viewTipTitle": "¿Lo quieres como vista completa de panel en lugar de una sola tarjeta?", "viewTipBody": "Abre el menú de 3 puntos del panel → Raw configuration editor y añade una vista nueva con esta cabecera (encima de la lista cards: del YAML de arriba):", "viewTipOutro": "Eso te da una pestaña/vista dedicada en tu panel con su propio icono y título, en vez de una tarjeta larga en una vista existente.", "altViewTitle": "Alternativa — una vista de panel dedicada", - "altViewIntro": "Si prefieres tener una página dedicada completa (su propia pestaña en la barra lateral del panel) en vez de una tarjeta dentro de una vista existente, Home Assistant te deja crear una vista nueva directamente con YAML. Pasos:", + "altViewIntro": "Para crear una pestaña propia dentro de un panel existente, añade una vista con el YAML de abajo. Una vista es una pestaña del panel; no crea una entrada nueva en la barra lateral. Pasos:", "altViewSteps": [ "Abre el panel donde quieres la nueva pestaña.", "Pulsa el lápiz (editar panel) arriba a la derecha.", "Pulsa la pestaña + al final de las pestañas existentes para crear una vista nueva.", "En el diálogo que se abre, cambia a la pestaña Code editor (arriba a la derecha del diálogo — alterna entre editor visual y YAML).", "Pega el YAML de abajo.", - "Guarda. La nueva pestaña ProxMenux Monitor aparece en la barra lateral con todas las tarjetas renderizadas." + "Guarda. La vista ProxMenux Monitor aparece como pestaña dentro del panel con sus tarjetas." ], "twoEditorsTitle": "Dos editores YAML en HA — elige el correcto", "twoEditorsIntro": "Home Assistant tiene dos editores YAML que parecen similares pero esperan formatos distintos:", @@ -89,12 +89,12 @@ ], "twoEditorsOutro": "Pegar YAML de cuerpo de vista en el editor de panel entero (o viceversa) te deja con una Vista sin nombre y cards: []. El YAML de abajo es para el editor de una sola vista — pega exactamente como se muestra.", "viewImageAlt": "Vista dedicada de Home Assistant renderizando ProxMenux Monitor — cabecera picture-entity, KPIs glance y tarjetas de entidad Sistema / VMs / Almacenamiento / Red distribuidas automáticamente por HA en múltiples columnas", - "viewImageCaption": "La vista dedicada ProxMenux Monitor como la renderiza Home Assistant en una pantalla ancha — el layout por defecto de HA divide las tarjetas en múltiples columnas automáticamente.", + "viewImageCaption": "La vista ProxMenux Monitor en pantalla ancha. La disposición Masonry distribuye las tarjetas automáticamente en columnas; el resultado depende del tipo de vista configurado.", "twoColTipTitle": "¿Quieres un layout fijo de dos columnas en lugar del auto layout?", "twoColTipBody": "Reemplaza cualquier par de tarjetas (p. ej. Sistema + VMs, o Almacenamiento + Red) con un único horizontal-stack envolviendo ambas, para que siempre se rendericen lado a lado independientemente del ancho de pantalla:", "twoColTipOutro": "En móvil la fila se mantiene comprimida; el auto layout de HA (sin horizontal-stack) refluye mejor a anchos estrechos.", "step6Title": "6 · Automatizaciones", - "step6Body": "Tres automatizaciones que cubren los escenarios reactivos más comunes — reemplaza notify.mobile_app_<tu_movil> por el servicio notify que uses:", + "step6Body": "Tres automatizaciones que cubren los escenarios reactivos más comunes — reemplaza notify.mobile_app_<your_phone> por el servicio notify que uses:", "logoTitle": "Sobre el logo de ProxMenux", "logoBody": "La tarjeta picture-entity en la parte superior del YAML Lovelace descarga el logo oficial de ProxMenux desde dashboardicons.com — una librería de iconos gratuita curada para paneles autoalojados. La entrada de ProxMenux vive en dashboardicons.com/icons/external/proxmenux. Home Assistant descarga el SVG sobre HTTPS en el primer render y lo cachea.", "logoBrokenTitle": "Si la tarjeta del logo muestra una imagen rota", @@ -105,28 +105,28 @@ "En el YAML Lovelace, reemplaza la URL image: por /local/icons/proxmenux.svg. Guarda y recarga — la imagen se renderiza desde el archivo local, sin internet necesaria." ], "scanTipTitle": "Regla práctica para scan_interval", - "scanTipBody": "/api/system es barato de llamar — 30 s está bien. /api/health/full usa una caché interna de 6 min, así que hacer polling más a menudo de ~60 s no te aporta nada. /api/storage/summary cambia despacio — cada 5 min sobra. /api/proxmenux/update-status solo importa una vez por hora. Ajusta a tu presupuesto de hardware si tienes muchos sensores en muchos hosts." + "scanTipBody": "Un punto de partida razonable es consultar /api/system cada 30 s. /api/health/full suele leer datos en caché válidos hasta seis minutos; consultarlo cada 60 s no evita esa caché. Prueba cinco minutos para /api/storage/summary y una hora para /api/proxmenux/update-status. Ajusta los intervalos a tu hardware y número de hosts." }, "grafana": { "heading": "Prometheus + Grafana", "promHref": "https://prometheus.io", "grafanaHref": "https://grafana.com", - "intro": "ProxMenux Monitor expone un endpoint de scrape formato Prometheus en GET /api/prometheus (autenticado) devolviendo texto OpenMetrics. Cabléalo a Prometheus, luego construye un panel Grafana encima — los mismos datos que muestra la UI del panel, en el formato que tu TSDB espera.", + "intro": "ProxMenux Monitor expone GET /api/prometheus con formato de exposición de texto Prometheus 0.0.4. Necesita un token Bearer si la autenticación está activada. Configura Prometheus para recoger las métricas y Grafana para visualizar la base de datos de series temporales.", "imageAlt": "Panel Grafana renderizando métricas de ProxMenux Monitor — gauge de uso de CPU, timeseries de uso de memoria, contador de VMs en ejecución, throughput de red", "imageCaption": "Un panel Grafana básico construido desde el scrape Prometheus de ProxMenux — CPU, memoria, VMs en ejecución, throughput de red. El catálogo completo de métricas vive en la API Reference → Métricas Prometheus.", "step1Title": "1 · Añade el job de scrape a Prometheus", "step1Body": "Pasa el API token vía el bloque nativo authorization de Prometheus (más limpio que cabeceras personalizadas y funciona con secret stores):", - "step1After": "Recarga Prometheus (kill -HUP o systemctl reload prometheus, o docker compose restart prometheus si lo corres como contenedor) y comprueba Status → Targets — el job proxmenux debería ponerse verde dentro de un intervalo de scrape. Cada métrica lleva una etiqueta node=\"<hostname>\" para que puedas distinguir hosts en las queries.", - "tokenTipTitle": "Token vía archivo o env, no inline", + "step1After": "Recarga Prometheus con kill -HUP <PID> (sustituye PID por su ID de proceso), systemctl reload prometheus si el servicio lo permite o docker compose restart prometheus para el contenedor. Revisa Status → Targets: el job proxmenux debería pasar a UP en un intervalo de recogida. Las métricas llevan node=\"<hostname>\" para distinguir los hosts.", + "tokenTipTitle": "Guarda el token en un archivo separado", "tokenTipBody": "Para despliegues en producción evita poner el token inline. Prometheus soporta credentials_file: /etc/prometheus/secrets/proxmenux.token como alternativa — guarda el token en un archivo 0600 y deja que Prometheus lo lea.", "step2Title": "2 · Verifica el scrape con un par de queries", - "step2Body": "Antes de configurar Grafana, confirma que Prometheus realmente tiene los datos. Abre la propia UI de Prometheus en http://<host-prometheus>:9090, pulsa Query y ejecuta cualquiera de estas — deberías obtener números en vivo de tu host Proxmox:", - "headerQuery": "Query", + "step2Body": "Antes de configurar Grafana, confirma que Prometheus realmente tiene los datos. Abre la propia UI de Prometheus en http://<prometheus-host>:9090, pulsa Query y ejecuta cualquiera de estas — deberías obtener números en vivo de tu host Proxmox:", + "headerQuery": "Consulta", "headerConfirms": "Qué confirma", "verifyRows": [ { "query": "up{job=\"proxmenux\"}", - "confirms": "Devuelve 1 si Prometheus está haciendo scrape del Monitor con éxito, 0 si no. La comprobación de cordura más rápida." + "confirms": "Devuelve 1 si Prometheus recoge datos del Monitor correctamente y 0 si falla. Es la comprobación inicial más rápida." }, { "query": "proxmox_cpu_usage", @@ -134,7 +134,7 @@ }, { "query": "proxmox_vms_running", - "confirms": "Número de guests en ejecución. Compara con lo que ves en la UI de Proxmox." + "confirms": "Número de máquinas invitadas en ejecución. Compáralo con la interfaz de Proxmox." }, { "query": "proxmox_uptime_seconds / 86400", @@ -142,13 +142,13 @@ } ], "calloutTitle": "El 401 que puedes ver al pulsar la URL del endpoint es normal", - "calloutBody": "En la página Status → Targets, pulsar el enlace del endpoint (/api/prometheus) hace que tu navegador lo descargue directamente — sin la cabecera bearer que Prometheus usa para sus propios scrapes. Así que verás '{'\"error\":\"Authentication required\"'}'. Eso confirma que la API está correctamente protegida; el propio Prometheus se autentica correctamente porque tiene el token de la configuración de scrape. Confía en el verde State: UP, no en el click-through.", + "calloutBody": "Con la autenticación activa, al pulsar el enlace en Status → Targets el navegador consulta /api/prometheus sin la cabecera Bearer de Prometheus. Puede responder '{'\"error\":\"Authentication required\"'}'. Comprueba el State: UP del destino para confirmar que Prometheus recoge los datos con su token.", "step3Title": "3 · Añade Prometheus como fuente de datos en Grafana", - "step3Body": "En Grafana: Connections → Data sources → Add new → Prometheus. Configura la URL a tu instancia de Prometheus (p. ej. http://prometheus.lan:9090), guarda y prueba. No se necesita auth extra en esta capa — Prometheus ya se ha autenticado a ProxMenux.", + "step3Body": "En Grafana, abre Connections → Data sources → Add new → Prometheus. Indica la URL de Prometheus, por ejemplo http://prometheus.lan:9090, guarda y prueba. Si tu servidor Prometheus exige autenticación, configúrala aquí por separado. El token del Monitor pertenece al job de recogida de Prometheus.", "step4Title": "4 · Construye paneles con estas queries PromQL", "step4Body": "Un set inicial que mapea directamente a lo que los usuarios típicamente vigilan en un host Proxmox:", "headerPanel": "Idea de panel", - "headerPromql": "Query PromQL", + "headerPromql": "Consulta PromQL", "panelRows": [ { "panel": "Gauge de uso de CPU por host", @@ -179,11 +179,11 @@ "promql": "rate(proxmox_interface_bytes_sent_total[5m])" }, { - "panel": "Load average (1m)", + "panel": "Promedio de carga (1m)", "promql": "proxmox_load_average{period=\"1m\"}" }, { - "panel": "% espacio en disco usado por mountpoint", + "panel": "Porcentaje de espacio usado por punto de montaje", "promql": "proxmox_disk_usage_percent" }, { @@ -198,55 +198,55 @@ "outro": "Añade cada query como un panel Grafana, configura la visualización adecuada (Stat para gauges, Time series para tendencias) y agrupa paneles en filas por categoría. Usa la etiqueta node como variable de panel (Settings → Variables → New → Query → label_values(proxmox_cpu_usage, node)) para filtrar todos los paneles por host." }, "uptimeKuma": { - "heading": "Uptime Kuma y otros status checkers", + "heading": "Uptime Kuma y otras herramientas de comprobación de estado", "href": "https://github.com/louislam/uptime-kuma", - "intro": "Para probes externos, usa GET /api/system-info — es el único endpoint que funciona sin token, devolviendo un payload JSON pequeño con hostname, uptime y el estado global de salud (mapeado a healthy / warning / critical). Eso es exactamente lo que necesita un monitor basado en keyword.", - "kumaTitle": "Uptime Kuma — HTTP keyword monitor", + "intro": "Para comprobar una palabra clave, usa GET /api/system-info. Esta ruta no exige token y devuelve nombre del host, tiempo de actividad y salud como healthy, warning o critical. Es una comprobación pública, a diferencia de los endpoints detallados protegidos.", + "kumaTitle": "Uptime Kuma — Monitor HTTP de palabras clave", "kumaSteps": [ "En Uptime Kuma, pulsa + Add New Monitor.", - "Monitor Type: HTTP(s) - Keyword.", - "Friendly Name: ProxMenux Monitor — pve01.", + "Tipo de monitor: HTTP(s) - Palabras clave.", + "Nombre descriptivo: ProxMenux Monitor — pve01.", "URL: http://pve01.lan:8008/api/system-info.", "Keyword: healthy (el valor de health.status cuando el host está OK).", - "Heartbeat Interval: 60 segundos basta.", - "Guarda. Sin cabeceras necesarias — el endpoint es público." + "Intervalo de comprobación: 60 segundos es suficiente.", + "Guarda. La ruta system-info no necesita una cabecera Bearer." ], "healthchecksTitle": "healthchecks.io / pings tipo cron", - "healthchecksBody": "Mismo endpoint, misma forma — apunta tu ping tipo cron a /api/system-info y comprueba .health.status == \"healthy\". La mayoría de estos servicios aceptan un estado HTTP 2xx como señal de \"up\" también, en cuyo caso incluso un curl sin parsing basta.", + "healthchecksBody": "Un trabajo cron puede consultar /api/system-info y comprobar .health.status == \"healthy\". Solo si supera la prueba debe enviar un ping de éxito a la URL única de Healthchecks.io. Ese servicio recibe pings de los trabajos; no consulta el Monitor. Un HTTP 2xx por sí solo no demuestra buena salud del host.", "richTitle": "¿Quieres datos de salud más ricos?", - "richBody": "Para el estado completo (las diez categorías del Monitor de salud + errores activos + lista dismissed), usa GET /api/health/full en su lugar — ese requiere un API token pero te da todo lo que el modal del panel renderiza en una sola respuesta." + "richBody": "Para el estado completo —diez categorías de salud, errores activos y descartados— usa GET /api/health/full. Devuelve los datos de la ventana del panel en una respuesta y necesita un token Bearer si la autenticación está activada." }, "workflows": { "heading": "n8n, Zapier y scripts propios", - "intro": "Para herramientas de workflow y scripts ad-hoc que necesitan levantar notificaciones a través del Monitor (un fallo de CI, un sensor de smart-home, un cron job que tardó demasiado), la guía es un POST a /api/notifications/send. El evento fluye por la misma pipeline de despacho que cualquier cosa emitida internamente — dedup, cooldown, reescritura con IA opcional, fan-out a los canales configurados.", - "n8nBody": "En n8n, el equivalente es un nodo HTTP Request con método POST, la URL de arriba, una cabecera Authorization configurada a Bearer '{''{'$credentials.proxmenux.token'}''}' (usando credentials de n8n) y un body JSON coincidiendo con el payload de curl. Cabléa cualquier nodo precedente como el trigger (cron, webhook, condición).", - "severityBody": "Los valores de severidad son INFO, WARNING o CRITICAL (en mayúsculas). El payload data es JSON libre — el reescritor de IA, cuando está activado, sacará cualquier cosa útil de ahí para el cuerpo renderizado. La semántica completa de tipos de evento vive en Notifications → Catálogo de eventos." + "intro": "Las herramientas de workflow y scripts pueden enviar notificaciones con un POST a /api/notifications/send, por ejemplo por un fallo de CI o un trabajo cron demasiado largo. Es un envío directo: omite la cola y la espera entre huellas de eventos. Conserva el formato por canal, la IA opcional y la entrega a los canales configurados. Controla los duplicados desde quien llama.", + "n8nBody": "En n8n, usa un nodo HTTP Request con POST, la URL anterior y el mismo JSON que curl. Elige credenciales genéricas Header Auth: nombre Authorization y valor Bearer YOUR_API_TOKEN, sustituyendo el marcador. Conecta una programación, webhook u otro nodo para disparar la petición.", + "severityBody": "La gravedad usa INFO, WARNING o CRITICAL en mayúsculas. El objeto data aporta contexto. La IA usa el título y mensaje renderizados más el enriquecimiento admitido; no se garantiza que todos los campos entren en el prompt o la salida. Consulta Notificaciones → Catálogo de eventos." }, "pveWebhook": { "heading": "Webhook nativo de Proxmox VE (entrante)", - "intro1": "Proxmox VE 8.1+ tiene su propio sistema de notificaciones. ProxMenux Monitor se registra como destino webhook para que todo lo que PVE emite por sí mismo (fencing HA, replicación, vzdump desde la GUI, renovación de certificado) aterrice en la misma pipeline de despacho que los propios eventos del Monitor. Esto ocurre automáticamente cuando pulsas Enable Notifications en la pestaña Settings — sin trabajo de integración requerido por parte del usuario.", + "intro1": "El sistema de notificaciones llegó en PVE 8.1; los destinos webhook nativos requieren Proxmox VE 8.3 o posterior. Activar notificaciones en Ajustes intenta registrar el Monitor como destino. Los avisos que PVE enruta allí, como informes de copias o replicación, entran en su flujo de envío. El alta depende de que la configuración esté disponible y permita escritura.", "intro2": "La mecánica, la plantilla de body que PVE envía, las entradas escritas en /etc/pve/notifications.cfg y el comportamiento en clusters están documentados en Notifications → Integración del webhook de PVE." }, "whereNext": { "heading": "Por dónde seguir", "items": [ { - "label": "API Reference", + "label": "Referencia de la API", "href": "/docs/monitor/api", "tail": " — cada endpoint con método, path y el catálogo completo de métricas Prometheus." }, { - "label": "Notifications", + "label": "Notificaciones", "href": "/docs/monitor/notifications", "tail": " — fuentes de eventos, canales, la pipeline de despacho, la integración del webhook de PVE en detalle." }, { "label": "Asistente de IA", "href": "/docs/monitor/ai-assistant", - "tail": " — el reescritor opcional que convierte cuerpos templated en lenguaje natural antes de llegar a Telegram / Discord / email / Gotify." + "tail": " — reformulación opcional de las plantillas en lenguaje sencillo antes de enviarlas a Telegram, Discord, correo o Gotify." }, { - "label": "Access & Authentication", + "label": "Acceso y autenticación", "href": "/docs/monitor/access-auth", "tail": " — emitir y revocar los API tokens que consumen estas guías, log de auditoría, configuración TLS." } diff --git a/web/messages/es/docs/monitor/notifications.json b/web/messages/es/docs/monitor/notifications.json index 85089fa0..4be8fc87 100644 --- a/web/messages/es/docs/monitor/notifications.json +++ b/web/messages/es/docs/monitor/notifications.json @@ -1,54 +1,54 @@ { "meta": { - "title": "Notificaciones de Proxmox — Telegram, Discord, Email, Gotify, Pushover, Apprise | ProxMenux Monitor", - "description": "Envía notificaciones de Proxmox VE a Telegram, Discord, Email, Gotify, Pushover y unos 80 servicios adicionales mediante Apprise. ProxMenux Monitor convierte los eventos del monitor de salud, el journal watcher y el webhook de Proxmox VE en mensajes enriquecidos con deduplicación, cooldown, agregación de ráfagas, una reescritura opcional con IA y un historial completo.", - "ogTitle": "Notificaciones de Proxmox — Telegram, Discord, Email, Gotify, Pushover, Apprise", - "ogDescription": "Envía alertas de Proxmox VE a Telegram, Discord, Email, Gotify, Pushover y unos 80 servicios adicionales mediante Apprise.", + "title": "Notificaciones de Proxmox — Telegram, Discord, correo, Gotify, Pushover, Apprise | ProxMenux Monitor", + "description": "Envía notificaciones de Proxmox VE a Telegram, Discord, correo, Gotify, Pushover y unos 80 servicios mediante Apprise. Los eventos del monitor de salud, los registros y el webhook de PVE se convierten en mensajes con deduplicación, intervalos de repetición, agrupación de ráfagas, reescritura opcional con IA e historial.", + "ogTitle": "Notificaciones de Proxmox — Telegram, Discord, correo, Gotify, Pushover, Apprise", + "ogDescription": "Alertas a Telegram, Discord, correo, Gotify, Pushover y unos 80 servicios mediante Apprise, con deduplicación, intervalos de repetición, agrupación de ráfagas e IA opcional.", "twitterTitle": "Notificaciones de Proxmox | ProxMenux Monitor", "twitterDescription": "Envía alertas de Proxmox VE a Telegram, Discord, Email, Gotify, Pushover y unos 80 servicios adicionales mediante Apprise." }, "header": { - "title": "Notifications", - "description": "El motor de distribución que recibe eventos de todos los colectores del Monitor y los entrega a Telegram, Discord, Email, Gotify, Pushover y unos 80 servicios adicionales mediante Apprise, con deduplicación, cooldown, agregación de ráfagas, controles por evento y por canal, reescritura opcional con IA e historial consultable.", - "section": "ProxMenux Monitor" + "title": "Notificaciones", + "description": "Distribuye eventos de los colectores del Monitor a Telegram, Discord, correo, Gotify, Pushover y unos 80 servicios mediante Apprise. Incluye deduplicación, límites de repetición, agrupación de ráfagas, controles por evento y canal, IA opcional e historial consultable.", + "section": "Monitor de ProxMenux" }, "intro": { "title": "De dónde vienen los mensajes", - "body": "Las notificaciones no son un escáner aparte. Son el lado de salida de cada colector que ya está corriendo dentro del Monitor — el Monitor de salud, el journal watcher, el task watcher de Proxmox, el hook del webhook de PVE, el polling collector y los eventos in-process emitidos por scripts de ProxMenux. Cada evento corre por la misma pipeline de despacho antes de llegar a un móvil o a un buzón de correo." + "body": "Las notificaciones distribuyen los eventos de los colectores del Monitor: Monitor de salud, vigilancia del registro y de tareas Proxmox, webhook de PVE, consultas periódicas y emisores internos de los scripts. Cada evento pasa por el mismo proceso de envío antes de llegar al móvil o al correo." }, "howItWorks": { "heading": "Cómo funciona", - "intro": "Cada notificación sigue el mismo camino por el proceso del Monitor. Los eventos los producen un puñado de colectores independientes, se normalizan en un payload estructurado, pasan por una pipeline de despacho que decide si enviar y en qué forma, opcionalmente se reescriben por un LLM, y finalmente se reparten a los canales que el usuario haya configurado.", + "intro": "Cada notificación sigue el mismo recorrido: los colectores producen eventos estructurados, el proceso de distribución decide si enviarlos y con qué formato, la IA puede reescribirlos y finalmente se entregan a los canales configurados.", "arrowLabel": "evento", - "caption": "Flujo de alto nivel. Cada intento real de despacho — exitoso, agregado o fallido — se registra en la tabla de historial SQLite para inspección retrospectiva. Los eventos suprimidos por la etapa de cooldown no se loguean.", + "caption": "Esquema general. Cada intento de envío realizado, correcto, agrupado o fallido, se registra en SQLite. Los eventos suprimidos por el intervalo de repetición no se registran.", "nodes": { "sourcesLabel": "Fuentes", - "sourcesDetail": "Monitor de salud\nJournal watcher\nTask watcher\nPVE webhook hook\nPolling collector\nEmisores in-process", - "dispatchLabel": "Pipeline de despacho", - "dispatchDetail": "Toggle por evento\nDedup fingerprint\nCooldown\nAgregación de ráfaga", + "sourcesDetail": "Monitor de salud\nVigilancia del registro\nVigilancia de tareas\nWebhook de PVE\nConsultas periódicas\nEmisores internos", + "dispatchLabel": "Proceso de envío", + "dispatchDetail": "Agrupación de ráfagas\nHuella e intervalo de repetición\nLímites por grupo\nControles por canal", "aiLabel": "Reescritura IA (opc.)", - "aiDetail": "OpenAI / Anthropic\nGemini / Groq\nOpenRouter / Ollama\n(off por defecto)", + "aiDetail": "OpenAI / Anthropic\nGemini / Groq\nOpenRouter / Ollama\n(desactivado por defecto)", "channelsLabel": "Canales", "channelsDetail": "Telegram\nDiscord\nEmail (SMTP)\nGotify\nPushover\nApprise (~80 servicios)" } }, "enabling": { "heading": "Activar el panel", - "intro": "En una instalación recién hecha la tarjeta Notifications en la pestaña Settings muestra un badge Disabled y un único botón Enable Notifications. Nada se despacha y ninguna config de PVE se toca hasta que lo pulsas.", - "disabledAlt": "Tarjeta Notifications en una instalación recién hecha mostrando badge Disabled y un único botón Enable Notifications", + "intro": "En una instalación nueva, la tarjeta Notificaciones de Ajustes muestra Desactivado y el botón Activar notificaciones. Hasta pulsarlo no se envía nada ni se modifica la configuración de PVE.", + "disabledAlt": "Tarjeta de notificaciones inicial con estado Desactivado y botón Activar notificaciones", "disabledCaption": "El primer estado — un clic para activar.", "stepsIntro": "Pulsar el botón hace tres cosas en secuencia:", "steps": [ - "Cambia el panel a su estado Active y despliega el formulario de canal debajo.", - "Registra un destino webhook de Proxmox VE en /etc/pve/notifications.cfg apuntando a POST http://127.0.0.1:8008/api/notifications/webhook. Desde este momento, todo lo que Proxmox VE emite por sí mismo (HA, replicación, vzdump desde la GUI) fluye a la misma pipeline que los eventos propios del Monitor. Mira Integración del webhook de PVE más abajo para la mecánica completa.", - "Arranca el hilo de fondo de despacho. El hilo hace polling de la cola de eventos y camina cada evento por la pipeline diagramada arriba." + "Activa el estado Activo y muestra el formulario de canales.", + "Registra un destino webhook de Proxmox en /etc/pve/notifications.cfg. Sin HTTPS usa POST http://127.0.0.1:8008/api/notifications/webhook; con HTTPS usa el receptor HTTP local del puerto 8009. Las notificaciones PVE entran en el proceso de envío del Monitor. Consulta Integración del webhook de PVE.", + "Inicia el hilo de envío en segundo plano, que consulta la cola y procesa cada evento según el esquema anterior." ], "activeAlt": "Tarjeta de notificaciones activada con pestañas de canales, nombre visible y opciones avanzadas de IA", - "activeCaption": "Estado activo: pestañas Telegram, Gotify, Discord, Email, Pushover y Apprise, nombre visible, categorías por canal y opciones avanzadas de IA." + "activeCaption": "Estado activo: pestañas de canales en la parte superior (Telegram / Gotify / Discord / correo electrónico / Pushover / Apprise), campo Nombre para mostrar, lista de categorías de cada canal y sección desplegable Avanzado: mejora con IA." }, "sources": { "heading": "Fuentes de eventos", - "intro": "Seis colectores independientes alimentan el motor de notificaciones. Corren como hilos de fondo dentro del proceso del Monitor y emiten un NotificationEvent estructurado cada vez que algo pasa.", + "intro": "Seis tipos de fuentes alimentan el motor: colectores en segundo plano, receptor webhook y emisores internos. Producen objetos NotificationEvent estructurados.", "headerCollector": "Colector", "headerWatches": "Vigila", "headerEvents": "Eventos típicos", @@ -59,51 +59,51 @@ "events": "new_error, error_resolved, error_escalated, health_degraded, health_persistent." }, { - "collector": "Journal watcher", - "watches": "journalctl --follow con pattern matching para fallos de autenticación SSH / web, bans de Fail2Ban (cuando el jail opcional está instalado), errores I/O del kernel, OOM, eventos de smartd.", + "collector": "Monitor del registro del sistema", + "watches": "journalctl --follow con patrones para fallos de acceso SSH/web, bloqueos Fail2Ban cuando está instalado el jail, errores de E/S del núcleo, OOM y eventos smartd.", "events": "auth_fail, ip_block, oom_kill, disk_io_error, service_fail." }, { - "collector": "Task watcher", - "watches": "Hace polling de /var/log/pve/tasks/index para nuevos UPIDs de tareas y sigue sus logs por archivo.", + "collector": "Monitor de tareas", + "watches": "Consulta /var/log/pve/tasks/index para detectar nuevos UPID y sigue sus archivos de registro.", "events": "backup_start, backup_complete, backup_warning, backup_fail, migration_*, snapshot_complete." }, { - "collector": "Hook de webhook Proxmox", - "watches": "Escucha en POST /api/notifications/webhook. Proxmox VE 8.1+ empuja sus propias notificaciones aquí una vez configurada la integración (mira abajo).", + "collector": "Receptor webhook de Proxmox", + "watches": "Recibe POST /api/notifications/webhook. Las versiones de PVE con destinos webhook pueden reenviar sus avisos tras configurarlo; consulta más abajo.", "events": "Cualquier cosa que PVE emita — incluyendo eventos que el Monitor de otro modo perdería (HA, replicación, vzdump desde la GUI)." }, { - "collector": "Polling collector", + "collector": "Colector de consultas periódicas", "watches": "Comparaciones periódicas (nodos del cluster online, caducidad de certificado, estado de passthrough de GPU, disponibilidad de actualización PVE / ProxMenux).", "events": "node_disconnect, node_reconnect, pve_update, proxmenux_update, gpu_mode_switch, pci_passthrough_conflict." }, { - "collector": "Emisores in-process", + "collector": "Emisores internos", "watches": "Llamadas directas desde scripts de ProxMenux y desde el propio Monitor (notification_manager.emit_event(...)).", "events": "system_startup, system_shutdown, system_reboot, ai_model_migrated, eventos de prueba personalizados." } ], - "after1": "Cada evento lleva un event_type estable (el catálogo está abajo), una severity (INFO, WARNING, CRITICAL), una category (usada para enriquecimiento de emoji y filtros por grupo) y un payload data con lo que la template necesite (vmid, device, source_ip, reason…).", - "after2": "Cada event_type tiene una template coincidente en notification_templates.py que renderiza el evento estructurado en un cuerpo de texto plano antes de que cualquier otra cosa pase. Ese cuerpo templated es lo que viaja por la pipeline de despacho, y lo que la capa opcional de IA reescribe si está activada. Mira la página del Asistente de IA para cómo la capa de reescritura interactúa con este cuerpo templated." + "after1": "Cada evento incluye un event_type estable, una severity (INFO, WARNING, CRITICAL), una category para emojis y filtros, y los valores data que necesita la plantilla (vmid, device, source_ip, reason…).", + "after2": "Cada event_type tiene una plantilla en notification_templates.py que convierte el evento en texto. Ese texto pasa por el proceso de envío y puede ser reescrito por la IA. La página del Asistente de IA explica esa interacción." }, "channels": { - "heading": "Walkthroughs de canales", + "heading": "Configuración de los canales", "intro": "Actualmente se admiten seis canales: Telegram, Discord, Gotify, Email (SMTP), Pushover y Apprise. Los cinco primeros son integraciones nativas con sus propios campos de configuración. Apprise funciona como un concentrador genérico que añade unos 80 servicios adicionales (ntfy, Matrix, Slack, Teams, Pushbullet, AWS SNS, Mattermost…) mediante una única URL. Todos están documentados paso a paso a continuación.", - "credsTitle": "Dónde viven las credenciales", + "credsTitle": "Dónde se guardan las credenciales", "credsBody": "Los tokens, las claves, las URL de webhook y las contraseñas SMTP se guardan localmente en la base de datos SQLite del Monitor dentro de /usr/local/share/proxmenux/. Los valores sensibles están protegidos y se ocultan en la interfaz. Solo salen del host para comunicarse con el servicio correspondiente. Una copia de ese directorio permite recuperar los canales configurados." }, "telegram": { "heading": "Telegram", - "intro": "Se requieren dos piezas de información: un Bot Token (uno por bot, reutilizable entre chats) y un Chat ID (donde el bot debe publicar — tu chat privado, un grupo o un tema dentro de un supergrupo). La guía in-app de abajo contiene el paso a paso completo; el resto de esta sección lo repite como texto más las dos formas que puede tomar el Chat ID.", - "guideAlt": "Modal Telegram Bot Setup Guide con cuatro secciones numeradas: Crear un Bot con BotFather, Obtener el Bot Token, Obtener tu Chat ID y Para Grupos o Canales", - "guideCaption": "El enlace + setup guide dentro de la pestaña Telegram abre este modal — los cuatro pasos numerados van de sin bot a un canal funcionando en unos dos minutos.", + "intro": "Necesitas un Token del bot, reutilizable entre chats, y un ID del chat de destino: privado, grupo o tema de un supergrupo. La guía integrada muestra el procedimiento; aquí se explica también el formato de cada ID.", + "guideAlt": "Guía de configuración de Telegram con cuatro secciones: crear bot con BotFather, obtener token, obtener ID del chat y configurar grupos o canales", + "guideCaption": "El enlace + guía de configuración de Telegram abre estos cuatro pasos para crear el bot y configurar el canal en unos dos minutos.", "step1Title": "1 · Crea un bot con BotFather", "step1Items": [ "Abre Telegram y empieza un chat con @BotFather (el que tiene el tick azul de verificación — las copias son comunes).", "Envía /newbot.", "Elige un nombre visible (p. ej. ProxMenux Lab). Se puede cambiar después.", - "Elige un username terminado en bot (p. ej. proxmenux_lab_bot). Debe ser único en Telegram.", + "Elige un nombre de usuario terminado en bot, como proxmenux_lab_bot. Debe ser único en Telegram.", "BotFather responde con un token de la forma 123456789:ABCdef… — ese es el Bot Token. Trátalo como una contraseña." ], "step2Title": "2 · Obtén el Chat ID", @@ -119,62 +119,62 @@ "groupItems": [ "Añade el bot al grupo como miembro (y hazlo admin si el grupo lo requiere para publicar).", "Envía cualquier mensaje en el grupo.", - "Abre https://api.telegram.org/bot<TU_TOKEN>/getUpdates en un navegador. Busca chat.id en la respuesta JSON — para grupos es un número negativo, para supergrupos empieza con -100.", - "Para supergrupos con Topics activado, anota también el message_thread_id del tema al que quieres apuntar — eso va en el campo opcional Topic ID." + "Abre https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates en un navegador. Busca chat.id en la respuesta JSON — para grupos es un número negativo, para supergrupos empieza con -100.", + "En supergrupos con Temas, anota el message_thread_id de destino e introdúcelo en el campo opcional ID del tema." ], "groupAlt": "Formulario de canal Telegram con Bot Token (enmascarado), Chat ID negativo prefijado con -100 indicando un supergrupo, y Topic ID 3 configurado para entregar a un tema específico", "groupCaption": "Supergrupo — el Chat ID empieza con -100… y el Topic ID opcional apunta a un hilo específico.", "step3Title": "3 · Guarda y prueba", - "step3Body": "Pega el Bot Token y el Chat ID en la pestaña Telegram, guarda y pulsa Send Test al final del panel. Un mensaje de prueba debería llegar en un segundo; si no llega, la sección History registra el fallo con el motivo exacto (token inválido, bot no en el grupo, bloqueado por el usuario, etc.)." + "step3Body": "Pega el token del bot y el ID del chat en Telegram, guarda y pulsa Enviar prueba. El mensaje debería llegar en un segundo; si no, el Historial muestra el motivo del fallo, como token inválido, bot fuera del grupo o bloqueo por el usuario." }, "discord": { "heading": "Discord", - "intro": "Los canales de Discord aceptan mensajes entrantes a través de una Webhook URL ligada a un único canal. El Monitor necesita esa URL y nada más.", + "intro": "Discord recibe mensajes mediante una URL de webhook asociada a un canal. Monitor necesita esa URL.", "items": [ - "En Discord, abre el servidor donde quieres que aterricen las notificaciones y ve a Server Settings → Integrations → Webhooks.", - "Pulsa New Webhook. Dale un nombre (p. ej. ProxMenux) y elige el canal donde debe publicar. Un avatar es opcional.", - "Pulsa Copy Webhook URL — tiene aspecto de https://discord.com/api/webhooks/<id>/<token>.", + "Abre el servidor Discord y ve a Ajustes del servidor → Integraciones → Webhooks.", + "Pulsa Nuevo webhook, ponle un nombre como ProxMenux y elige el canal de destino. El avatar es opcional.", + "Pulsa Copiar URL del webhook. Su formato es https://discord.com/api/webhooks/<id>/<token>.", "Pégalo en el campo Webhook URL de la pestaña Discord en el panel Notifications y guarda." ], "imageAlt": "Formulario de canal Discord con campo Webhook URL empezando por https://discord.com/api/webhooks/", - "imageCaption": "Discord — pega la Webhook URL de Server Settings → Integrations → Webhooks." + "imageCaption": "Discord: pega la URL obtenida en Ajustes del servidor → Integraciones → Webhooks." }, "gotify": { "heading": "Gotify", - "intro": "Gotify es un servidor push autoalojado. Necesitas su URL base y un Application Token generado desde la UI de admin de Gotify.", + "intro": "Gotify es un servidor de notificaciones que puedes alojar. Necesitas su URL base y un Token de aplicación generado en su interfaz de administración.", "items": [ "Si aún no tienes una instancia de Gotify, instala una — mira la guía oficial de instalación.", - "Abre la UI web de Gotify, loguéate como admin, ve a Apps → Create Application. Dale un nombre (p. ej. ProxMenux). Gotify genera un token — cópialo.", - "En la pestaña Gotify del panel Notifications, configura Server URL a la URL base de tu instancia (p. ej. https://gotify.example.com) y pega el App Token.", - "Guarda y pulsa Send Test." + "Entra como administrador en Gotify y abre Aplicaciones → Crear aplicación. Ponle un nombre como ProxMenux y copia el token generado.", + "En Gotify, establece URL del servidor en la URL base, por ejemplo https://gotify.example.com, y pega el token.", + "Guarda y pulsa Enviar prueba." ], "imageAlt": "Formulario de canal Gotify con campo Server URL configurado a https://gotify.example.com y un campo App Token con placeholder A_valid_gotify_token", "imageCaption": "Gotify — URL del servidor de tu instancia autoalojada más el App Token de la UI de admin de Gotify." }, "email": { - "heading": "Email (SMTP)", + "heading": "Correo electrónico (SMTP)", "intro": "Email es el canal más flexible — y el que tiene más campos. Necesitas un servidor SMTP, un puerto, un modo TLS, opcionalmente un usuario y contraseña, una dirección de remitente y al menos un destinatario.", - "imageAlt": "Formulario de canal Email con SMTP Host, Port, dropdown TLS Mode, Username, Password, From Address, To Addresses separadas por coma y campos Subject Prefix", - "imageCaption": "Email — host / puerto / modo TLS de SMTP, usuario + contraseña opcionales, dirección de remitente, destinatarios separados por coma y un prefijo de asunto para hacer las alertas fáciles de filtrar en el lado del inbox.", - "appNote": "Si usas una cuenta personal de Gmail o Microsoft 365, el campo password no puede ser tu contraseña normal de cuenta — ambos proveedores requieren una app password generada específicamente para clientes de terceros. Los dos flujos están abajo.", - "gmailTitle": "App password de Gmail", + "imageAlt": "Formulario SMTP con servidor, puerto, modo TLS, usuario, contraseña, remitente, destinatarios separados por comas y prefijo del asunto", + "imageCaption": "Correo: servidor, puerto y TLS de SMTP; usuario y contraseña opcionales; remitente, destinatarios separados por comas y prefijo de asunto para filtrar avisos.", + "appNote": "Monitor usa autenticación SMTP con contraseña. Gmail puede requerir una contraseña de aplicación. En Microsoft depende del servicio y de las políticas del tenant: una contraseña de aplicación no permite saltarse el bloqueo de autenticación básica. Comprueba que el servicio admita este método.", + "gmailTitle": "Contraseña de aplicación de Gmail", "gmailIntro": "Las app passwords de Gmail requieren que la verificación en 2 pasos esté activa en la cuenta de Google. Si no lo está, la página App passwords no existirá.", "gmailItems": [ "Abre myaccount.google.com/security y activa Verificación en 2 pasos si no está activada.", "Ve a myaccount.google.com/apppasswords.", - "Escribe un nombre (p. ej. ProxMenux) y pulsa Create. Google muestra una contraseña de 16 caracteres — cópiala.", - "Rellena la pestaña Email con: Host smtp.gmail.com, Port 587, TLS Mode STARTTLS, Username tu dirección de Gmail, Password la app password de 16 caracteres." + "Escribe un nombre como ProxMenux y pulsa Crear. Copia la contraseña de 16 caracteres.", + "Configura: Servidor smtp.gmail.com, Puerto 587, Modo TLS STARTTLS, Usuario tu dirección Gmail y Contraseña la de aplicación de 16 caracteres." ], - "outlookTitle": "App password de Microsoft / Outlook", - "outlookIntro": "Microsoft ahora requiere verificación en dos pasos en la cuenta personal antes de que se pueda crear una app password. Los tenants empresariales donde el admin ha deshabilitado SMTP basic auth necesitan un camino distinto (OAuth2) que el Monitor no soporta actualmente — apunta esos a un relay SMTP que controles en su lugar.", + "outlookTitle": "Contraseña de aplicación de Microsoft / Outlook", + "outlookIntro": "Las contraseñas de aplicación de Microsoft exigen verificación en dos pasos, pero disponer de una no garantiza compatibilidad SMTP. Si el servicio o tenant exige OAuth2, el cliente SMTP de Monitor no puede autenticarse. Usa un relay que admita la autenticación del proveedor.", "outlookItems": [ "Abre account.microsoft.com/security y activa la verificación en dos pasos.", - "Abre Advanced security options, baja a App passwords y pulsa Create a new app password.", - "Microsoft muestra una contraseña aleatoria larga — cópiala.", - "Rellena la pestaña Email con: Host smtp-mail.outlook.com, Port 587, TLS Mode STARTTLS, Username tu dirección de Outlook / Microsoft 365, Password la app password generada." + "Si tu cuenta ofrece Opciones avanzadas de seguridad → Contraseñas de aplicación, elige Crear una contraseña de aplicación. Eso no garantiza que el correo admita autenticación SMTP con contraseña.", + "Si Microsoft genera la contraseña, cópiala y comprueba que tu servicio SMTP la acepte.", + "Solo si el proveedor admite SMTP con contraseña, usa sus ajustes autorizados: Servidor smtp.office365.com para Exchange Online, Puerto 587, Modo TLS STARTTLS, Usuario tu dirección y Contraseña la credencial permitida. Outlook.com personal usa requisitos y ajustes distintos; no presupongas que estas credenciales funcionen." ], "relayTitle": "Relay SMTP autoalojado", - "relayBody": "Si corres tu propio relay SMTP (Postfix, msmtp, etc.) en la LAN, apunta el Monitor a él y saltea el baile de app-password por completo. El relay maneja la auth upstream y el Monitor envía en cleartext sobre una red de confianza." + "relayBody": "Usa un relay SMTP que controles, como Postfix. El relay gestiona la autenticación hacia el proveedor. Configura la autenticación y TLS de Monitor según lo que exija el relay; que sea local no desactiva el cifrado." }, "pushover": { "heading": "Pushover", @@ -182,8 +182,8 @@ "stepsTitle": "Configuración", "steps": [ "Crea una cuenta de Pushover, instala la aplicación oficial en los dispositivos que recibirán las alertas e inicia sesión.", - "Copia la User Key que aparece en el panel de Pushover. También puedes usar una clave de grupo si varias personas o dispositivos deben recibir la misma alerta.", - "Abre Create an Application/API Token, crea una aplicación llamada ProxMenux y copia su token API de 30 caracteres.", + "Copia la Clave de usuario del panel Pushover. Puedes usar una clave de grupo si varias personas o dispositivos deben recibir la alerta.", + "Abre Crear aplicación/token API, crea una aplicación llamada ProxMenux y copia su token API de 30 caracteres.", "En Ajustes → Notificaciones → Pushover, pega la clave de usuario o grupo y el token API de la aplicación. Los campos de dispositivo y sonido son opcionales.", "Guarda los ajustes y pulsa Enviar prueba. La aplicación Pushover debería recibir el mensaje inmediatamente." ], @@ -198,160 +198,160 @@ "listIntro": "La lista completa de servicios compatibles y el formato exacto de cada URL están disponibles en la documentación oficial de Apprise:", "listItems": [ "Documentación de servicios de Apprise — índice completo de servicios compatibles.", - "URL basics — cómo se estructuran las URLs de Apprise." + "Conceptos básicos de las URL: estructura de las URL de Apprise." ], "stepsTitle": "Pasos", "steps": [ "Elige el servicio destino en la wiki de Apprise y copia la plantilla de URL para él. Cada página de servicio muestra el esquema exacto a usar (ntfy://, matrix://, pover://, slack://…) más cualquier token, canal u hostname requerido.", - "Rellena los placeholders con tus propias credenciales. Por ejemplo, un topic de ntfy.sh tiene aspecto de ntfy://ntfy.sh/mi-topic; una URL de Pushover tiene aspecto de pover://user@token; una URL de Matrix tiene aspecto de matrix://user:pass@host:port/#room.", + "Sustituye los marcadores por tus credenciales. Ejemplos: ntfy.sh ntfy://ntfy.sh/my-topic; Pushover pover://user@token; Matrix matrix://user:pass@host:port/#room.", "Pega la URL final en el campo Apprise URL en la pestaña Apprise del panel Notifications y guarda.", - "Pulsa Send Test para verificar que la URL es alcanzable y las credenciales se aceptan." + "Pulsa Enviar prueba para comprobar el acceso y las credenciales." ], "deliveredTitle": "Qué se entrega", "deliveredBody": "Apprise recibe el mismo payload que los otros canales — título, cuerpo y una severidad (info / success / warning / failure). La severidad se mapea a lo que el servicio destino exponga (icono, prioridad, color). El formato de mensajes ricos y la capa de reescritura con IA corren todos antes de que se invoque la URL, exactamente como para Telegram o Email.", "fanoutTitle": "Una URL por canal Apprise", - "fanoutBody": "El Monitor expone un único slot de URL por canal Apprise. Si necesitas hacer fan-out a varios servicios Apprise a la vez (p. ej. ntfy.sh más una sala de Matrix), el enfoque más limpio es alojar un pequeño servidor Apprise API con una config etiquetada y apuntar el Monitor a su endpoint — el servidor luego difunde a cada URL detrás de esa etiqueta." + "fanoutBody": "Monitor ofrece una URL por canal Apprise. Para enviar a varios servicios, como ntfy.sh y Matrix, aloja un servidor Apprise API con una configuración etiquetada. Monitor llama a ese destino y el servidor distribuye a las URL de la etiqueta." }, "rich": { - "heading": "Mensajes ricos, categorías y filtrado por canal", - "intro": "Bajo el formulario del canal cada canal expone los mismos tres controles: un toggle Rich messages arriba (destacado con la flecha en la captura), once Notification Categories colapsables con toggles por evento y un botón Send Test abajo.", - "imageAlt": "Panel Notification Categories con toggle maestro Rich messages destacado arriba, secciones colapsables para VM/CT, Backups, Resources, Storage, Network, Security, Cluster, Services, Health Monitor, Updates cada una con toggle y contador de eventos, y un botón Send Test", - "imageCaption": "Flecha de arriba — el toggle Rich messages por canal. Abajo — las once categorías colapsables con toggles por evento. Send Test está al final del canal.", - "richTitle": "Mensajes ricos", - "richIntro": "Con Rich messages activado, la cabecera de cada evento se prefija con un emoji de categoría y el cuerpo se renderiza usando el formato nativo del canal (HTML de Telegram, embed de Discord con color de severidad). Con él desactivado, el Monitor envía una versión de texto plano con la misma información menos las pistas visuales. Mismo contenido, distinta presentación:", - "plainHeader": "Plano — Rich messages off", - "richHeader": "Rico — Rich messages on", - "richOutro": "El toggle es por canal: deja Email plano para legibilidad de reglas de inbox dejando que Telegram y Discord rendericen la versión rica. Los canales que no soportan formato inline (email texto plano, Gotify) ignoran el formato y caen a texto de todas formas.", + "heading": "Mensajes enriquecidos, categorías y filtros por canal", + "intro": "Cada canal tiene tres controles: Mensajes enriquecidos arriba, once secciones de Categorías de notificación con interruptores por evento y Enviar prueba abajo.", + "imageAlt": "Categorías con Mensajes enriquecidos destacado, secciones de VM/CT, copias, recursos, almacenamiento, red, seguridad, clúster, servicios, salud y actualizaciones, con interruptores y contadores, y botón Enviar prueba", + "imageCaption": "La flecha señala Mensajes enriquecidos. Debajo están las once categorías desplegables con controles por evento. Enviar prueba está al final.", + "richTitle": "Mensajes enriquecidos", + "richIntro": "Con Mensajes enriquecidos, cada aviso lleva un emoji de categoría y formato nativo del canal, como HTML en Telegram o tarjetas coloreadas en Discord. Desactivado, se envía el mismo contenido en texto simple:", + "plainHeader": "Texto simple: formato enriquecido desactivado", + "richHeader": "Texto enriquecido: formato activado", + "richOutro": "El control es independiente por canal. Puedes dejar el correo en texto simple y usar formato en Telegram y Discord. Los canales sin ese formato, como correo de texto o Gotify, reciben texto.", "togglesTitle": "Categorías por evento", - "togglesIntro": "Unos setenta tipos de evento están agrupados en once categorías de UI. Cada evento tiene un toggle maestro y un override por canal — dos capas que deciden si un evento dado llega a un canal dado:", + "togglesIntro": "Cada canal controla sus categorías y tipos de evento de forma independiente. Desactivar una categoría suprime sus eventos en ese canal. Los controles individuales se aplican dentro de las categorías activas; el distribuidor no tiene un control maestro global por evento.", "togglesItems": [ - "Toggle maestro por evento. Si vm_start está off en todas partes, ningún canal ve nunca un vm_start. Los toggles persisten como event_toggles[event_type] = true | false.", - "Overrides por canal. Un tipo de evento también se puede silenciar para un canal específico (\"enviar backup_complete a Discord pero no a Telegram\"). Estos viven en channel_overrides[channel_name][event_type] y solo aplican si el evento pasó el toggle maestro." + "Control de categoría por canal. Por ejemplo, desactivar VM/CT suprime vm_start y sus equivalentes para ese canal. Se guarda como <channel>.events.<group>.", + "Control de evento por canal. En una categoría activa puedes elegir enviar backup_complete a Discord pero no a Telegram. Se guarda como <channel>.event.<event_type>." ], - "togglesOutro": "Cada cabecera de categoría en la captura también muestra el conteo de eventos actualmente activados / total para ese grupo, y un toggle a nivel de categoría que pone cada evento dentro a on o off en un clic — el atajo para silenciar un grupo entero (p. ej. todos los backups info, todos los eventos relacionados con actualizaciones) sin expandir la sección." + "togglesOutro": "Cada categoría indica los eventos activados frente al total y permite activar o desactivar el grupo completo con un clic, por ejemplo copias info o avisos de actualización, sin abrirlo." }, "quiet": { - "heading": "Quiet Hours", - "intro": "Quiet Hours es una ventana temporal por canal durante la cual el dispatcher solo deja pasar eventos CRITICAL. Todo lo demás — INFO, WARNING, eventos de acción — se retiene, se persiste a disco y se entrega como un único resumen agrupado en el momento en que la ventana cierra. El canal sigue recibiendo las cosas urgentes en tiempo real; el ruido espera hasta que probablemente lo quieras.", - "imageAlt": "Ajustes de canal mostrando ambos knobs lado a lado: tarjeta Quiet Hours con toggle activado, Start 22:00 y End 07:00 más una preview en vivo de la siguiente transición, y justo debajo la tarjeta Daily digest con su propio toggle, un selector de hora de entrega configurado a 09:00 y la nota de que CRITICAL y WARNING nunca se retrasan", - "imageCaption": "Ambos knobs viven lado a lado dentro de la tarjeta de ajustes de cada canal — Quiet Hours arriba, Daily digest debajo. Independientes por canal.", + "heading": "Horas de silencio", + "intro": "Durante las horas de silencio de cada canal solo pasan los eventos CRITICAL. INFO, WARNING y las acciones se guardan en disco y se entregan en un resumen al terminar el intervalo.", + "imageAlt": "Ajustes de canal con Horas de silencio de 22:00 a 07:00 y vista del próximo cambio; debajo, Resumen diario a 09:00 con aviso de que este resumen no retrasa CRITICAL ni WARNING", + "imageCaption": "Cada canal tiene ambos ajustes independientes: Horas de silencio arriba y Resumen diario debajo.", "purposeTitle": "Para qué sirve", "purposeItems": [ "No me despiertes a las 03:00 por un aviso de actualización. Backups, actualizaciones de apps, optimizaciones post-instalación y otros eventos de nivel INFO dejan de avisar a tu móvil por la noche.", - "Pero aun así despiértame por un fuego. Fallos de disco, OOM kills, shutdowns del host, bans de fail2ban — cualquier cosa clasificada como CRITICAL — saltea la ventana y llega inmediatamente.", - "Tampoco pierdas nada. Los eventos suprimidos durante la ventana no se descartan silenciosamente — se sientan en un buffer SQLite hasta que vuelves al reloj." + "Los eventos críticos siguen llegando. Solo los clasificados como CRITICAL evitan el silencio. El nombre no determina la severidad: el monitor del registro emite los bloqueos Fail2Ban y los avisos de apagado/reinicio del host como INFO, por lo que pueden retenerse.", + "Conserva los avisos aplazados. Los eventos retenidos se guardan en un búfer SQLite hasta que termine el intervalo." ], "howTitle": "Cómo funciona", "howItems": [ - "Toggle por canal. Cada canal tiene su propia configuración de Quiet Hours — Telegram puede estar silencioso 22:00-07:00 mientras email sigue recibiendo todo 24/7.", + "Control por canal. Por ejemplo, Telegram puede guardar silencio de 22:00 a 07:00 mientras el correo recibe avisos todo el día.", "Hora de inicio y fin en tu zona horaria local, intervalo semi-abierto (inicio inclusivo, fin exclusivo). La ventana puede cruzar medianoche (p. ej. 22:00-07:00 significa esta noche hasta mañana por la mañana).", - "Línea de preview en vivo justo debajo de los inputs muestra si la ventana está actualmente activa y cuándo ocurre la siguiente transición. Ahorra abrir un reloj.", - "Durante la ventana: los eventos CRITICAL siguen disparando por la pipeline de despacho normal. Los eventos INFO y WARNING se enrutan a un buffer persistente (tabla quiet_pending en la DB SQLite del Monitor).", - "Cuando la ventana cierra: se envía una única notificación agrupada con todo lo que se acumuló — una línea por evento bufferizado, en orden cronológico. El buffer se limpia solo después de que el canal confirme la entrega, para que un fallo transitorio de Telegram / SMTP no pierda el contexto de la noche.", - "A través de reinicios. Si el Monitor reinicia a mitad de ventana, el buffer está intacto en disco. Si el reinicio ocurre justo después de que la ventana cierre, el siguiente ciclo de despacho detecta las filas pendientes y las descarga con un único resumen \"recovery\" — no se pierden notificaciones por un deploy o un reboot." + "Vista previa en directo. Bajo los campos se indica si el intervalo está activo y cuándo cambiará.", + "Durante el intervalo: CRITICAL sigue por el proceso de envío; INFO y WARNING se guardan en la tabla SQLite quiet_pending.", + "Al terminar: se envía un resumen cronológico con una línea por evento guardado. El búfer se borra tras confirmar la entrega, para resistir fallos transitorios de Telegram o SMTP.", + "Resiste reinicios. El búfer permanece en disco. Tras reiniciar, el siguiente ciclo detecta las filas pendientes y envía un resumen de recuperación cuando corresponde." ], "criticalTitle": "Qué cuenta como CRITICAL", - "criticalBody": "La severidad se fija en la creación del evento, no en el momento del despacho. Los fallos de disco, OOM kills, split-brain de cluster, shutdowns del host y el nivel \"duro\" de errores I/O de disco se envían como CRITICAL por diseño. Todo lo demás (backups OK, actualizaciones disponibles, logs INFO, hits de rate-limit) cae por defecto a INFO o WARNING y por tanto es silenciable. Puedes verificar la severidad por defecto de un evento dado en el Catálogo de eventos más abajo en esta página." + "criticalBody": "El productor fija la severidad al crear el evento. Que trate de disco, apagado o seguridad no lo convierte en CRITICAL. El monitor del registro emite ip_block, system_shutdown y system_reboot como INFO. El Catálogo de eventos enumera los tipos; consulta el productor y el evento recibido para conocer su severidad real." }, "digest": { "heading": "Resumen diario de eventos INFO", - "intro1": "El Daily Digest es el knob opuesto: un ajuste opt-in que dice \"no me envíes cada backup exitoso o aviso de actualización según ocurre — recoléctalos y envíame un resumen al día a las 09:00 (o la hora que elija)\". Mismo objetivo que Quiet Hours (menos ruido) pero un mecanismo distinto (resumen basado en tiempo en vez de una ventana diaria).", - "intro2": "Vive en la misma tarjeta de ajustes de canal que Quiet Hours (mira la figura bajo Quiet Hours), justo debajo. Cada uno se activa independientemente.", + "intro1": "El resumen diario es una opción que activas expresamente: agrupa avisos INFO aptos, como actualizaciones disponibles, a las 09:00 o a la hora elegida. Los resultados de copias y replicación y las acciones en directo están excluidos. Las horas de silencio aplazan los avisos no críticos durante un intervalo.", + "intro2": "Está debajo de las horas de silencio en la misma tarjeta; consulta la figura en Horas de silencio. Ambos se activan por separado.", "purposeTitle": "Para qué sirve", "purposeItems": [ - "El recap matutino de \"todo lo que pasó\". Si chequeas el host una vez al día con un café, un digest a las 09:00 lleva la misma información que 20 pings individuales a lo largo del día anterior, sin que leas 20 burbujas de Telegram.", - "Separa ruido de señal. Los eventos INFO responden a \"qué pasó\"; CRITICAL y WARNING responden a \"qué necesito hacer ahora mismo\". El digest maneja el primero; todo lo demás mantiene su entrega en vivo." + "Un repaso matutino de lo ocurrido. Un resumen a las 09:00 reúne la información de 20 avisos individuales del día anterior y evita leer 20 mensajes de Telegram.", + "Separa actividad y urgencias. INFO explica qué pasó; CRITICAL y WARNING indican qué requiere atención. El resumen agrupa los INFO aptos; los demás conservan el envío directo." ], "howTitle": "Cómo funciona", "howItems": [ - "Opt-in por canal. Off por defecto — Telegram no batcheaiza silenciosamente tus alertas. Lo activas en los canales donde quieres un digest, dejando otros en entrega en vivo.", + "Activación por canal. Desactivado por defecto. Actívalo solo donde quieras resúmenes y deja los otros canales con avisos directos.", "Hora de entrega en tu zona horaria local. Por defecto 09:00 pero puedes elegir cualquier hora; el dispatcher dispara el digest dentro de ~60 s de ese minuto.", - "Qué entra en el digest: cualquier evento que el canal habría recibido en vivo cuya severidad es INFO. Ejemplos — vzdump complete, Tailscale update available, ProxMenux optimisation update available, APT security updates pending, rate-limit hit.", + "Incluye: eventos generales aptos de nivel INFO, como actualización de aplicación disponible, actualización de Tailscale disponible, actualización de optimización de ProxMenux disponible, actualizaciones de seguridad APT pendientes y aviso de límite de envíos. Los resultados de copias y otras acciones excluidas siguen en directo.", "Qué nunca se retrasa:", - "Persistencia. Los eventos pendientes se sientan en una tabla SQLite (digest_pending) hasta la hora configurada. El Monitor puede reiniciar libremente sin perder lo que el digest eventualmente contendrá.", - "Los días vacíos son silenciosos. Si nada de nivel INFO pasó, no se envía digest — el canal se mantiene quieto en vez de recibir un mensaje \"no hay eventos para reportar\"." + "Persistencia. Los pendientes se guardan en SQLite, tabla digest_pending, hasta la hora elegida y sobreviven a reinicios.", + "Sin eventos, sin resumen. Si no hay avisos INFO pendientes, no se envía ningún resumen vacío." ], "neverDelayedSub": [ "Los eventos CRITICAL siempre pasan inmediatamente.", "Los eventos WARNING siempre pasan inmediatamente.", - "Eventos de acción en vivo (VM/CT start / stop / shutdown / restart, vm_fail / ct_fail, backup start / fail, replication start / fail, host shutdown / reboot) saltean el digest incluso con severidad INFO — has hecho opt-in a verlos en vivo, el digest derrotaría ese opt-in." + "Las acciones de VM/CT, sus fallos, inicio y resultados de copias, resultados de replicación y apagado o reinicio del host evitan el resumen incluso con nivel INFO. Las horas de silencio sí pueden retrasarlas si no son críticas." ], - "comboTitle": "Combinar Quiet Hours y Daily Digest", - "comboBody": "Los dos funcionan juntos. Un canal puede tener ambos activos — Quiet Hours de 22:00 a 07:00 más un Daily Digest a las 09:00. Los eventos INFO durante la ventana quiet van al buffer quiet y llegan a las 07:00 como el resumen de cierre de ventana; los eventos INFO durante el día van al buffer digest y llegan a las 09:00 a la mañana siguiente. CRITICAL y WARNING siempre atraviesan ambos. Elige Quiet Hours cuando el objetivo es una ventana de silencio, el Daily Digest cuando el objetivo es un resumen a hora fija; muchos setups quieren ambos." + "comboTitle": "Combinar horas de silencio y resumen diario", + "comboBody": "Puedes activar ambos: silencio de 22:00 a 07:00 y resumen a 09:00. Los avisos no críticos del intervalo se liberan en el resumen de 07:00; los INFO aptos de fuera van al resumen diario. CRITICAL evita ambos; WARNING evita el diario, pero espera durante el silencio. Elige un intervalo sin avisos, un resumen a hora fija o ambos." }, "displayName": { - "heading": "Display Name", - "intro": "Cada notificación lleva un Display Name — la etiqueta que identifica qué host produjo la alerta. Es el valor que ves al final del ejemplo de mensajes ricos arriba (🏠 home-lab) y dentro del prefijo de asunto del email.", - "imageAlt": "Campo Display Name con el valor amd mostrado como ejemplo, etiqueta Name shown in notifications - edit to customize or leave empty to use the system hostname", - "imageCaption": "El campo Display Name — déjalo vacío para usar el hostname del sistema, o sobreescríbelo con lo que quieras.", + "heading": "Nombre visible", + "intro": "Cada aviso lleva un Nombre visible para identificar el host, como 🏠 home-lab al pie del ejemplo y en el prefijo del asunto del correo.", + "imageAlt": "Campo Nombre visible con amd como ejemplo; permite un nombre propio o usar el del sistema si queda vacío", + "imageCaption": "Nombre visible: déjalo vacío para usar el nombre del host o escribe uno propio.", "outro": "Si el campo está vacío, el Monitor cae al hostname del sistema. El override es sobre todo útil cuando corres varios hosts ProxMenux que envían al mismo chat de Telegram o buzón — una etiqueta más amigable (home-lab, office-pve) es más fácil de leer que pve01.lan o pmx-prod-01." }, "dispatch": { - "heading": "Pipeline de despacho", - "intro": "Entre que un evento se levanta y un mensaje sale del host, corren tres etapas en este orden:", + "heading": "Proceso de envío", + "intro": "La tabla describe tres mecanismos relacionados. El proceso real empieza con la agrupación de ráfagas, sigue con reserva de entrega, intervalos de repetición y límites por grupo, y termina con formato y controles de cada canal:", "headerStage": "Etapa", "headerWhat": "Qué hace", "headerTunable": "¿Ajustable?", "rows": [ { - "stage": "1. Deduplicación por huella", - "what": "Cada evento genera una huella (event_type + campos clave de data). Las huellas idénticas dentro de una ventana corta se consideran duplicados del primero.", + "stage": "Deduplicación por huella", + "what": "Cada evento genera una huella (event_type + key fields from data). Las huellas idénticas dentro de una ventana corta se consideran duplicados del primero.", "tunable": "No — lógica interna del dispatcher." }, { - "stage": "2. Cooldown", - "what": "Cuando una huella ya se ha enviado, esa misma huella se silencia durante el cooldown propio de cada severidad. El estado se guarda en la tabla SQLite notification_last_sent para que sobreviva a reinicios. Valores por defecto: CRITICAL 60 s, WARNING 300 s, INFO 900 s, con posibilidad de override por categoría (por ejemplo resources 900 s, updates 86 400 s).", - "tunable": "No — valores por defecto integrados en el dispatcher." + "stage": "Intervalo de repetición", + "what": "Tras un envío correcto se suprimen huellas repetidas y se guarda el estado en notification_last_sent. Las bases de CRITICAL, WARNING e INFO son 86400 s, igual que resources y updates. Excepciones: 5 s para acciones VM/CT y apagado/reinicio, 10 s para resultados de copias/replicación y 1800–3600 s para varias categorías de salud. Los ajustes explícitos por evento o grupo prevalecen.", + "tunable": "Sí: los ajustes explícitos del distribuidor por evento o grupo sustituyen los valores predeterminados." }, { - "stage": "3. Agregación de ráfagas", + "stage": "Agrupación de ráfagas", "what": "Cuando llegan N eventos del mismo tipo dentro de una ventana corta (por ejemplo un aluvión de intentos de fuerza bruta SSH), se agrupan en un único mensaje burst_* con un contador y una muestra.", "tunable": "No — ventana y umbral están fijados por tipo de evento." } ], - "calloutTitle": "El despacho ocurre en un hilo de fondo", - "calloutBody": "El bucle de despacho corre en su propio hilo. La petición HTTP que emite un evento devuelve en cuanto el evento se encola — no espera al RTT de Telegram, SMTP o el webhook. Cada resultado de envío se registra en la tabla de historial para revisarlo después." + "calloutTitle": "El envío se ejecuta en segundo plano", + "calloutBody": "La petición HTTP termina al poner el evento en cola; el hilo de envío espera las respuestas de Telegram, SMTP o webhook y guarda los resultados en el historial." }, "aiRewrite": { "heading": "Reescritura con IA opcional", - "body1": "Cualquier evento se puede pasar por un LLM que reescribe su cuerpo en lenguaje natural y (opcionalmente) en el idioma del usuario destino antes del fan-out. El reescritor de IA está off por defecto. Cuando se activa corre en el hilo de despacho; si la llamada al proveedor falla o caduca, se usa el cuerpo templated original en su lugar.", - "body2": "Se soportan seis proveedores (OpenAI, Anthropic, Google Gemini, Groq, OpenRouter y Ollama local), con nivel de detalle por canal (brief, standard, detailed), idioma de salida, modo de prompt (default o custom) y un prompt personalizado opcional. El walkthrough de configuración completo, capturas y ejemplos de prompt viven en la página dedicada Asistente de IA.", + "body1": "Los eventos aptos pueden reescribirse con un LLM. Los resultados backup_complete y backup_fail lo omiten. La IA está desactivada por defecto y se ejecuta en el hilo de envío. Si falla o agota el tiempo, se usa la plantilla original.", + "body2": "Admite OpenAI, Anthropic, Google Gemini, Groq, OpenRouter y Ollama local, con detalle por canal (brief, standard, detailed), idioma, modo de instrucciones (default o custom) e instrucciones propias. Guía y ejemplos en Asistente de IA.", "privacyTitle": "Nota de privacidad", - "privacyBody": "La reescritura con IA envía el cuerpo del evento — que puede incluir hostnames, direcciones IP, usernames, mensajes de error y líneas de journal — al proveedor configurado. Ollama mantiene todo en el host; los otros cinco proveedores transmiten datos a sus respectivos endpoints. Desactiva el reescritor, o usa Ollama, si el host corre en un entorno donde el contenido de los eventos no puede salir de la red." + "privacyBody": "La petición de IA puede incluir título, severidad, texto, instrucciones del sistema o propias y contexto, con nombres de host, IP, usuarios, errores y registros. Se envía al destino elegido. Ollama solo procesa localmente con servidor y modelo locales; un servidor remoto o modelo en la nube envía datos fuera del host. Desactiva la reescritura o usa un servidor y modelo locales controlados si el contenido debe permanecer en la red." }, "pveWebhook": { "heading": "Integración del webhook de PVE", - "intro1": "Proxmox VE 8.1+ tiene su propio sistema de notificaciones con endpoints integrados (sendmail, gotify, SMTP, webhook). Cuando activas Notifications en el Monitor, se registra como uno de esos endpoints — un destino webhook que apunta de vuelta a la propia API del Monitor. Desde ese momento, todo lo que Proxmox mismo emite (fencing HA, replicación, vzdump desde la GUI, renovación de certificado, etc.) fluye por la misma pipeline de despacho que los eventos propios del Monitor.", - "intro2": "El destino es visible desde la GUI de Proxmox en Datacenter → Notifications → Notification Targets:", + "intro1": "El sistema de notificaciones Proxmox tiene destinos sendmail, Gotify, SMTP y, en versiones compatibles, webhook. Monitor registra un destino webhook al activarse. Los avisos de PVE, como HA, replicación y copias desde la interfaz, entran así en el mismo proceso de envío.", + "intro2": "Puedes verlo en Datacenter → Notificaciones → Destinos de notificación.", "imageAlt": "Diálogo Proxmox VE Edit Webhook mostrando el destino proxmenux-webhook autocreado con método POST, URL http://127.0.0.1:8008/api/notifications/webhook y una plantilla JSON usando escape title, escape message, escape severity, escape timestamp y campos json", "imageCaption": "El destino webhook del lado PVE como Proxmox lo ve (la GUI está en el locale configurado del host — español en este ejemplo). Los mismos campos aplican en cualquier idioma.", "registeredIntro": "Qué se registra:", "registeredItems": [ - "Método y URL. POST http://127.0.0.1:8008/api/notifications/webhook. Solo loopback — PVE habla con el proceso del Monitor corriendo en el mismo host.", - "Plantilla de body. Un body JSON usando los helpers Handlebars nativos de PVE — guardado base64-encoded en el archivo de config por PVE, pero se expande a:", + "Método y URL. POST http://127.0.0.1:8008/api/notifications/webhook sin HTTPS en Monitor. Con HTTPS, usa el receptor HTTP local del puerto 8009. Ambos permanecen en el mismo host.", + "Plantilla del cuerpo. JSON con funciones Handlebars de PVE, guardado como base64 en la configuración. Al expandirse resulta:", "Matcher. Un bloque compañero matcher: proxmenux-matcher con mode all para que cada notificación de PVE llegue al destino.", - "Bloque priv compañero. Una entrada vacía webhook: proxmenux-webhook se añade a /etc/pve/priv/notifications.cfg. PVE se niega a instanciar cualquier endpoint webhook sin un bloque privado coincidente, incluso cuando no se necesitan secrets — así que el Monitor escribe un stub solo de cabecera ahí. No se configuran tokens, cabeceras ni HMAC en el lado PVE." + "Configuración privada. Se escribe webhook: proxmenux-webhook en /etc/pve/priv/notifications.cfg, con el secreto compartido en base64. El destino público lo referencia para enviar X-Webhook-Secret. El bloque contiene ese secreto." ], "securityTitle": "Cómo se asegura el receptor", "securityIntro": "El receptor webhook en POST /api/notifications/webhook aplica distintas capas de seguridad según de dónde venga la petición:", "securityItems": [ - "Loopback (127.0.0.1 / ::1). Solo rate-limit. El endpoint confía en la interfaz loopback — solo procesos corriendo en el host pueden alcanzarlo, y PVE mismo no puede enviar cabeceras de auth personalizadas en el body que genera. Este es el camino que viaja cada notificación emitida por PVE.", - "Llamadores remotos. Cinco capas se apilan encima del rate-limiting: un shared secret en la cabecera X-Webhook-Secret, un timestamp de frescura en X-ProxMenux-Timestamp (rechazado si se desvía más allá de la ventana configurada), una búsqueda de caché de replay y una allowlist de IP opcional. El shared secret vive en la tabla de ajustes SQLite del Monitor — no en /etc/pve/priv/notifications.cfg — y se genera en el primer setup. Este camino existe para integraciones personalizadas que hacen POST desde fuera del host; el destino configurado por PVE nunca lo ejercita." + "Orígenes locales (127.0.0.1 / ::1). Se aplica límite de peticiones, pero se omiten las comprobaciones remotas de secreto, tiempo y repetición. También se consideran locales las IP asignadas a las interfaces del host. El destino automático de PVE usa loopback.", + "Peticiones remotas. Además del límite de envíos, se comprueban el secreto de X-Webhook-Secret, la fecha en X-ProxMenux-Timestamp o el JSON, las repeticiones y la lista opcional de IP. El secreto está en SQLite y también se copia en base64 a /etc/pve/priv/notifications.cfg para que PVE envíe la cabecera." ], "practiceTitle": "En la práctica", - "practiceBody": "El setup de PVE escribe el destino como http://127.0.0.1:8008, así que las notificaciones emitidas por PVE siempre pasan por el camino loopback con seguridad solo rate-limit. El camino de llamador remoto con shared secret es opt-in para integraciones personalizadas — apunta un servicio externo a https://<host-monitor>:<port>/api/notifications/webhook y suministra la cabecera X-Webhook-Secret para usarlo.", + "practiceBody": "PVE usa http://127.0.0.1:8008 sin HTTPS, o HTTP en 8009 con HTTPS. Las integraciones externas en https://<monitor-host>:<port>/api/notifications/webhook deben enviar X-Webhook-Secret y una fecha actual, y superar las comprobaciones de repetición e IP. El secreto solo no basta.", "actionsIntro": "El Monitor gestiona este destino a través de tres acciones en la pestaña Settings:", "actionsItems": [ - "Setup — corre automáticamente cuando activas Notifications. Crea la entrada en /etc/pve/notifications.cfg. El archivo solo se escribe cuando su contenido tiene que cambiar, y se guarda un backup del anterior en /usr/local/share/proxmenux/backups/pve-notifications/ (los tres más recientes). No se escribe nada mientras /etc/pve no está montado: un Monitor que arranca durante un reinicio de pve-cluster registra la entrada cuando vuelve.", - "Cleanup — elimina la entrada. El backup previo del archivo se conserva.", - "Read config — muestra los destinos y matchers actuales como PVE los ve. Así es como confirmas que la entrada del Monitor es la que dispara cuando PVE tiene múltiples rutas de notificación configuradas." + "Configurar: al activar las notificaciones crea la entrada en /etc/pve/notifications.cfg. Solo escribe cambios y conserva las tres copias anteriores más recientes en /usr/local/share/proxmenux/backups/pve-notifications/. Mientras /etc/pve no está montado no escribe; registra la entrada cuando pve-cluster vuelve a estar disponible.", + "Limpiar: elimina la entrada y conserva la copia anterior.", + "Leer configuración: muestra destinos y reglas para comprobar qué ruta de notificación usa PVE." ], "clusterTitle": "Nodos de cluster", - "clusterBody": "/etc/pve/ se replica entre miembros del cluster, así que el destino webhook es visible en cada nodo. Cada nodo, sin embargo, hace POST a su propio 127.0.0.1:8008 — lo que significa que el Monitor corriendo en ese nodo recibe los eventos que PVE generó localmente. Ejecuta el Monitor en cada nodo que quieras ver en el historial de Notifications." + "clusterBody": "/etc/pve/ se comparte en el clúster, incluida URL y secreto. Cada nodo llama a su receptor local: 127.0.0.1:8008 sin HTTPS, o HTTP 8009 con HTTPS. Ejecuta Monitor en cada nodo necesario y mantén el destino compartido compatible con sus receptores." }, "catalogue": { "heading": "Catálogo de eventos", - "intro": "Unos setenta tipos de evento están agrupados en once categorías de UI. El panel Notifications renderiza una sección colapsable por grupo con un toggle por cada evento dentro. Cada evento está on por defecto salvo que se marque explícitamente lo contrario.", + "intro": "Unos setenta tipos se agrupan en once categorías. Cada sección desplegable permite activar eventos. Están activos por defecto salvo indicación contraria.", "headerGroup": "Grupo", "headerEvents": "Eventos", "rows": [ @@ -360,7 +360,7 @@ "events": "vm_start, vm_start_warning, vm_stop, vm_shutdown, vm_fail, vm_restart, más los equivalentes ct_*, migration_start, migration_complete, migration_warning, migration_fail, replication_complete, replication_fail." }, { - "group": "Backups", + "group": "Copias de seguridad", "events": "backup_start, backup_complete, backup_warning, backup_fail, snapshot_complete, snapshot_fail." }, { @@ -380,7 +380,7 @@ "events": "auth_fail, ip_block, firewall_issue, user_permission_change." }, { - "group": "Cluster", + "group": "Clúster", "events": "split_brain, node_disconnect, node_reconnect." }, { @@ -400,52 +400,52 @@ "events": "gpu_mode_switch, gpu_passthrough_blocked, pci_passthrough_conflict, ai_model_migrated." } ], - "burstNote": "Un puñado de tipos de agregación burst_* (burst_auth_fail, burst_ip_block, burst_disk_io, etc.) existen solo en el dispatcher — reemplazan ráfagas de eventos individuales con un único mensaje de resumen y no se exponen como toggles en la UI. Heredan el estado on/off de su tipo de evento padre.", + "burstNote": "Los tipos agrupados burst_* (burst_auth_fail, burst_ip_block, burst_disk_io, etc.) sustituyen ráfagas por un resumen. No tienen controles propios en la interfaz y heredan los del evento de origen.", "backupResults": { "heading": "Resultados de backup", - "intro": "Una notificación sobre un trabajo de backup de Proxmox indica cómo terminó el trabajo. El resultado se lee del informe que envía Proxmox, y determina el título, el icono que se muestra con Rich messages activado y la fila de estado del email.", - "headerIcon": "Icono", + "intro": "El informe de cada trabajo de copia determina su resultado, título, icono con Mensajes enriquecidos y fila de estado del correo.", + "headerIcon": "Icon", "headerResult": "Resultado", "headerWhen": "Cuándo", "rows": [ { "icon": "💾✅", "result": "Backup completado", - "when": "Todos los guests del trabajo terminaron y el informe no contiene advertencias." + "when": "Todos los sistemas invitados terminaron sin advertencias en el informe." }, { "icon": "💾⚠️", "result": "Backup completado con advertencias", - "when": "Todos los guests terminaron y el informe contiene al menos una línea de advertencia." + "when": "Todos los sistemas invitados terminaron y el informe contiene alguna advertencia." }, { "icon": "💾❌", "result": "Backup fallido", - "when": "Un guest falló, o el trabajo se detuvo con un error." + "when": "Falló un sistema invitado o el trabajo terminó con un error." }, { "icon": "💾❔", "result": "Resultado del backup sin confirmar", - "when": "El informe está incompleto o no indica un resultado para cada guest." + "when": "El informe está incompleto o no indica el resultado de cada sistema invitado." } ], "items": [ - "El título indica sobre qué era el trabajo. Incluye el almacenamiento y, en un trabajo con un solo guest, su tipo, nombre e ID. Un trabajo fallido nombra el guest que falló.", - "El cuerpo lista cada guest con su propio resultado, tamaño, duración y archivo, seguido de una línea con los totales del trabajo.", + "El título identifica el trabajo. Incluye almacenamiento y, si solo hay un invitado, su tipo, nombre e ID. Si falla, identifica el invitado afectado.", + "El cuerpo detalla cada sistema invitado, con resultado, tamaño, duración y archivo, seguido de los totales.", "Las advertencias y los errores se listan una vez. Las líneas repetidas se muestran una sola vez con la causa principal primero; a partir de ocho líneas, el resto se cuenta en una línea de cierre y permanece en el log de la tarea de Proxmox.", - "Un trabajo que falla antes de su primer guest muestra la causa que dio Proxmox, por ejemplo un almacenamiento que no existe.", - "Los resúmenes conservan el resultado. Un backup listado en el resumen de Quiet Hours o en el Daily Digest lleva el icono de su propio resultado." + "Un trabajo que falla antes del primer invitado muestra la causa indicada por Proxmox, por ejemplo un almacenamiento inexistente.", + "Los resúmenes conservan el resultado. Una copia en el resumen de horas de silencio conserva su icono. Los resultados de copias evitan el resumen diario." ] } }, "history": { "heading": "Historial", - "body1": "Cada intento de despacho que el dispatcher realmente ejecuta se registra en la tabla SQLite notification_history. Cada fila guarda el timestamp (sent_at), canal, tipo de evento, severidad, título, cuerpo de mensaje renderizado, un flag success y — cuando el envío falló — el error devuelto por el proveedor en error_message. Los eventos agregados en ráfaga aparecen como una única fila con el tipo de evento burst_*. Los eventos suprimidos por la etapa de cooldown no se loguean: nunca se convierten en un intento de despacho.", + "body1": "Cada intento de envío realizado se guarda en notification_history: fecha sent_at, canal, evento, severidad, título, cuerpo, indicador success y, si falla, error_message. Las ráfagas usan una fila de tipo burst_*. Los eventos suprimidos por el intervalo de repetición no se registran.", "body2": "Settings → Notifications tiene una sección Historial de notificaciones, cerrada por defecto, con las últimas 20 entradas: el resultado de cada envío, su canal y su fecha, el error cuando falló y, en cada ejecución del resumen diario, si tenía algo que enviar. La página no ofrece borrarlo: Audit & Report lee ese mismo historial para comprobar la entrega de cada canal.", "body3": "Los mismos datos se exponen en GET /api/notifications/history con parámetros opcionales limit, offset, severity y channel, y se pueden borrar con DELETE /api/notifications/history." }, "api": { - "heading": "Endpoints de API", + "heading": "Endpoints de la API", "headerEndpoint": "Endpoint", "headerMethod": "Método", "headerUse": "Uso", @@ -453,7 +453,7 @@ { "endpoint": "/api/notifications/settings", "method": "GET / POST", - "use": "Lee o escribe la configuración completa (canales, toggles por evento, reescritor de IA, Display Name)." + "use": "Lee o escribe la configuración: canales, controles por evento, IA y nombre visible." }, { "endpoint": "/api/notifications/test", @@ -483,7 +483,7 @@ { "endpoint": "/api/notifications/webhook", "method": "POST", - "use": "Recibe las notificaciones propias de Proxmox VE. Los llamadores loopback están solo rate-limited; los llamadores remotos deben pasar adicionalmente la cabecera X-Webhook-Secret, comprobación de frescura X-ProxMenux-Timestamp, caché de replay y allowlist de IP opcional." + "use": "Recibe avisos de Proxmox. Los orígenes locales omiten las comprobaciones remotas, pero tienen límite de peticiones. Los remotos se comprueban con X-Webhook-Secret, fecha en X-ProxMenux-Timestamp o JSON, detección de repeticiones y lista de IP configurada." }, { "endpoint": "/api/notifications/proxmox/setup-webhook", @@ -508,7 +508,7 @@ { "label": "Asistente de IA", "href": "/docs/monitor/ai-assistant", - "tail": " — proveedores, modelos, modos de prompt, idiomas, niveles de detalle por canal." + "tail": " — proveedores, modelos, modos de instrucciones, idiomas y detalle por canal." }, { "label": "Monitor de salud", @@ -521,14 +521,14 @@ "tailRich": " — dónde encajan las tablas SQLite (notification_last_sent, notification_history) y el hilo de despacho en el proceso más amplio del Monitor." }, { - "label": "Access & Authentication", + "label": "Acceso y autenticación", "href": "/docs/monitor/access-auth", "tailRich": " — cómo se emiten API tokens para scripts que llaman a /api/notifications/send." }, { "label": "Dashboard → Logs del sistema", "href": "/docs/monitor/dashboard/system-logs", - "tail": " — la vista en vivo del mismo journal que alimenta el journal watcher." + "tail": " — vista en directo del registro del sistema que alimenta su monitor de eventos." } ] } diff --git a/web/messages/fr/docs/monitor/access-auth.json b/web/messages/fr/docs/monitor/access-auth.json new file mode 100644 index 00000000..a81ae173 --- /dev/null +++ b/web/messages/fr/docs/monitor/access-auth.json @@ -0,0 +1,396 @@ +{ + "meta": { + "title": "Authentification du tableau de bord Proxmox — 2FA, jetons API, profil, proxy inverse | ProxMenux Monitor", + "description": "Accès et protection de ProxMenux Monitor : premier démarrage, mot de passe avec nom et avatar, profil, TOTP 2FA, jetons API pour les scripts, HTTPS, exemples Nginx/Caddy/Traefik, journal d’audit et jail Fail2Ban facultative.", + "ogTitle": "Authentification Proxmox — 2FA, jetons API, proxy inverse", + "ogDescription": "Protégez ProxMenux Monitor avec mot de passe, TOTP 2FA, jetons API, HTTPS, exemples de proxy inverse et jail Fail2Ban facultative.", + "twitterTitle": "Authentification du tableau de bord Proxmox | ProxMenux Monitor", + "twitterDescription": "Mot de passe + TOTP 2FA, jetons API, HTTPS, Nginx/Caddy/Traefik et journal d'audit." + }, + "header": { + "title": "Accès et authentification", + "description": "Accès au tableau de bord, premier démarrage et couches de protection : mot de passe et TOTP, sessions JWT, jetons API, HTTPS, proxy inverse, Secure Gateway et jail Fail2Ban facultative.", + "section": "Moniteur ProxMenux" + }, + "intro": { + "title": "L’authentification est facultative", + "body": "Au premier lancement, le tableau de bord affiche la boîte de dialogue « Protéger votre tableau de bord ? », avec les boutons Oui, définir un mot de passe et Non, continuer sans protection. La seconde option laisse les points d’accès de l’API ouverts sur TCP 8008 : cela peut convenir à un réseau local de laboratoire isolé, mais reste dangereux ailleurs. L’authentification à deux facteurs (2FA) ne fait pas partie de ce choix initial ; elle se configure ensuite dans l’onglet Sécurité, après la définition d’un mot de passe." + }, + "reaching": { + "heading": "Atteindre le tableau de bord", + "intro": "Le ProxMenux Monitor se lie au 0.0.0.0:8008. Il y a trois façons communes d'y parvenir:", + "outro": "L’accès direct correspond à l’unité systemd par défaut. Le proxy inverse et Secure Gateway sont décrits ci-dessous. Les IP de X-Forwarded-For nécessitent PROXMENUX_TRUST_PROXY=1 et un proxy que vous contrôlez. X-Forwarded-Proto ou X-Forwarded-Host seuls n’activent pas cette confiance ; le frontend construit les URL API depuis l’origine du navigateur." + }, + "firstLaunch": { + "heading": "Premier démarrage", + "intro": "La première fois que vous ouvrez le tableau de bord, le frontend appelle GET /api/auth/status. Si la configuration auth n'a jamais été écrite (configured: false), une boîte de dialogue unique s'affiche intitulée \"Protect Your Dashboard?\" avec deux choix :", + "imageAlt": "Dialogue initial « Protéger votre tableau de bord ? », avec choix de définir un mot de passe ou de continuer sans protection", + "imageCaption": "Choix initial de protection par mot de passe ou non. Réapparaît après une installation neuve ou la désactivation de l’authentification dans les paramètres.", + "headerButton": "Bouton", + "headerWhat": "Ce qui se passe", + "headerApi": "Appel API", + "rows": [ + { + "button": "Oui, configurer le mot de passe", + "what": "Ouvre un formulaire avec identifiant et mot de passe obligatoires, plus un nom d’affichage et une image d’avatar facultatifs. Active l’authentification dans auth.json avec enabled: true et renvoie un JWT pour vous connecter. Le profil facultatif est enregistré par des appels ultérieurs, décrits ci-dessous.", + "api": "POST /api/auth/setup" + }, + { + "button": "Non, continuez sans protection", + "what": "Définit declined: true dans auth.json. Les points d’accès API restent ouverts jusqu’à l’activation de la protection dans les paramètres.", + "api": "POST /api/auth/skip" + } + ], + "twofaCalloutTitle": "2FA est configuré plus tard, pas ici", + "twofaCalloutBody": "Le dialogue initial concerne seulement la protection par mot de passe. L’authentification à deux facteurs (TOTP) se configure ensuite dans l’onglet Sécurité, une fois connecté par mot de passe. Le guide complet suit plus bas.", + "createTitle": "Création du premier utilisateur", + "createIntro": "Cliquer sur Oui, définir un mot de passe ouvre un formulaire pour créer le compte et renseigner le profil facultatif. L’avatar peut ainsi apparaître dès l’enregistrement. Les champs :", + "headerField": "Champ", + "headerRequired": "Requis", + "headerNotes": "Remarques", + "fieldRows": [ + { + "field": "Nom d'utilisateur", + "required": "Oui", + "notes": "Identifiant de connexion. Non modifiable depuis l’interface ; il faut éditer auth.json directement." + }, + { + "field": "Mot de passe", + "required": "Oui", + "notes": "Au moins 10 caractères, issus d’au moins 3 des 4 catégories : minuscules, majuscules, chiffres, symboles. Les mots de passe évidents comme password, 12345678 et proxmenux sont refusés. Les mêmes règles sont imposées côté serveur : curl ne permet pas de contourner le contrôle." + }, + { + "field": "Nom d'affichage", + "required": "Non", + "notes": "Nom affiché dans le menu de l’en-tête et le profil. Sans valeur, le nom d’utilisateur est repris. Modifiable ensuite via Avatar → Voir le profil." + }, + { + "field": "Image Avatar", + "required": "Non", + "notes": "PNG, JPEG, WebP ou GIF jusqu'à 2 MB. Rendu comme un cercle dans l'en-tête et sur la page de profil. Lorsque vide, l'en-tête affiche la première lettre du nom d'affichage (ou nom d'utilisateur) sur un cercle coloré. Peut être téléchargé, remplacé ou supprimé plus tard de la page de profil." + } + ], + "createImageAlt": "Formulaire de création du compte : identifiant et mot de passe obligatoires, nom d’affichage et avatar facultatifs", + "createImageCaption": "Formulaire du premier démarrage. Sans nom d’affichage ni avatar, le compte est créé et l’en-tête affiche une lettre dans un cercle.", + "saveCalloutTitle": "Un enregistrement, jusqu’à trois appels API", + "saveCalloutBody": "Le formulaire envoie d’abord POST /api/auth/setup avec identifiant et mot de passe. Le JWT reçu sert ensuite à PUT /api/auth/profile pour le nom et à POST /api/auth/profile/avatar pour l’image, si renseignés. Une erreur de profil n’annule pas le compte : vous pourrez compléter le profil plus tard.", + "avatarTitle": "Menu et page de profil Avatar", + "avatarBody1": "Une fois l’authentification configurée, l’avatar apparaît en haut à droite près du choix du thème. Son menu mène au profil et à Sécurité, avec l’action Se déconnecter. La déconnexion est aussi disponible dans Sécurité.", + "avatarBody2": "Le profil affiche l’avatar, le nom d’utilisateur en lecture seule et le nom d’affichage modifiable. Les ajouts, remplacements et suppressions d’avatar sont atomiques ; l’en-tête s’actualise automatiquement après réussite. Le formulaire initial et le profil utilisent les mêmes points d’accès décrits ci-dessous.", + "profileImageAlt": "Profil avec aperçu de l’avatar, boutons Ajouter / Remplacer / Supprimer, identifiant en lecture seule et nom d’affichage modifiable", + "profileImageCaption": "Page de profil dédiée. Le nom d’utilisateur est en lecture seule ; le nom d’affichage et l’avatar sont modifiables ici sans passer par Sécurité.", + "headerEndpoint": "Point d’accès", + "headerEpWhat": "Ce qu'il fait", + "endpointRows": [ + { + "endpoint": "GET /api/auth/profile", + "what": "Renvoie le nom d’utilisateur, le nom d’affichage et l’état de l’avatar (has_avatar, avatar_mtime)." + }, + { + "endpoint": "PUT /api/auth/profile", + "what": "Modifie le nom d’affichage. Corps de la requête : '{' \"display_name\": \"...\" '}'." + }, + { + "endpoint": "GET /api/auth/profile/avatar", + "what": "Renvoie l’image d’avatar en PNG / JPEG / WebP / GIF avec le type de contenu adapté. Nécessite l’en-tête Bearer ; le frontend récupère un blob et crée une URL d’objet locale pour l’afficher." + }, + { + "endpoint": "POST /api/auth/profile/avatar", + "what": "Charge un nouvel avatar (max. 2 MB). Le type de contenu doit correspondre au fichier. L'ancien avatar est remplacé atomiquement." + }, + { + "endpoint": "DELETE /api/auth/profile/avatar", + "what": "Supprime l’avatar. L’en-tête affiche à nouveau une initiale dans un cercle coloré." + } + ], + "reversibleTitle": "Vous pouvez activer la protection plus tard", + "reversibleBody": "Après Non, continuer sans protection, le dialogue ne réapparaît plus. Activez l’authentification dans l’onglet Sécurité ou modifiez /root/.config/proxmenux-monitor/auth.json, retirez l’indicateur declined et redémarrez le service." + }, + "password": { + "heading": "Authentification du mot de passe", + "intro": "Une fois la protection configurée, les appels API protégés nécessitent un JWT dans Authorization: Bearer <token> :", + "items": [ + "Jeton de session : valable 24 heures, émis par POST /api/auth/login.", + "Jeton API pour les intégrations : valable 365 jours, émis par POST /api/auth/generate-api-token. Voir la section suivante." + ], + "loginImageAlt": "Écran de connexion affiché après la configuration de l'authentification — champs nom d'utilisateur et mot de passe", + "loginImageCaption": "Une fois l'authentification configurée, chaque visite au tableau de bord commence ici. Avec 2FA activé, l'écran demande le code à chiffres 6 dans une deuxième étape après l'acceptation du mot de passe.", + "loginFlowTitle": "Flux de connexion", + "twofaIntro": "Avec 2FA, le premier appel renvoie requires_totp: true. Répétez-le avec le code à six chiffres :", + "publicTitle": "Accès public et sondes protégées", + "publicIntro": "La connexion et son état sont publics. La création du compte reste possible tant qu’aucun identifiant et mot de passe ne sont enregistrés, même après un refus de protection. Les données système exigent une authentification lorsque la protection est active :", + "publicItems": [ + "/api/auth/login et /api/auth/status sont publics. /api/auth/setup crée le premier compte et refuse d’écraser des identifiants existants.", + "/api/system-info est un endpoint public d’informations système légères, dont health.status. Il n’exige pas de jeton. /api/auth/status est également public et permet de vérifier la disponibilité." + ], + "cryptoTitle": "Cryptographie et stockage", + "cryptoIntro": "ProxMenux Monitor est open source — rien de tout cela n'est secret. Documenter la pile ici explicitement est un choix délibéré: les opérateurs qui stockent des identifiants sur leur hôte méritent de savoir comment ces identifiants sont protégés avant de décider de leur faire confiance. Les algorithmes ci-dessous sont les mêmes que le code utilisé dans scripts/auth_manager.py; cette section est un contrat, pas une promesse de marketing.", + "headerAsset": "Élément", + "headerAlgo": "Algorithme", + "headerWhere": "Emplacement", + "cryptoRows": [ + { + "asset": "Mot de passe", + "algorithm": "PBKDF2-HMAC-SHA256 avec un sel aléatoire par mot de passe et un taux d'itération élevé (base de référence de l'OWASP 2023+). Conservé comme pbkdf2_sha256$<iters>$<salt>$<hash>.", + "where": "auth.json → password_hash" + }, + { + "asset": "Séance / API JWT", + "algorithm": "Signature HS256 avec un secret propre à l’installation, généré au premier démarrage (secrets.token_urlsafe, ≥48 octets). Les jetons contiennent iss=proxmenux-monitor et aud=api ; chaque requête vérifie la signature avec le secret actuel.", + "where": "Secret: auth.json → jwt_secret. JWT lui-même: seulement sur le client." + }, + { + "asset": "Métadonnées de jeton API", + "algorithm": "Le SHA-256 du JWT est conservé avec l’empreinte signed_with du jwt_secret qui l’a signé. Cela permet d’afficher les métadonnées et de repérer les jetons affectés par un changement de secret.", + "where": "auth.json → api_tokens[]" + }, + { + "asset": "Secret TOTP de 2FA", + "algorithm": "TOTP standard (RFC 6238), avec secret encodé en base32. Les huit codes de récupération sont à usage unique et conservés sous forme de hachages SHA-256.", + "where": "auth.json → totp_secret + backup_codes[]" + }, + { + "asset": "Révocations", + "algorithm": "Lors d’une révocation, le SHA-256 du jeton rejoint une liste de refus consultée à chaque vérification. Un cache mémoire d’environ 30 s évite des lectures disque répétées.", + "where": "auth.json → revoked_tokens[]" + } + ], + "authJsonTitle": "auth.json — ce qu'il contient et comment il est protégé", + "authJsonBody": "Les données d’authentification se trouvent dans /root/.config/proxmenux-monitor/auth.json, mode 0600, propriétaire root. Le fichier contient des hachages PBKDF2 et des secrets cryptographiques (jwt_secret, totp_secret), jamais le mot de passe en clair. Chiffrez les destinations de sauvegarde ou de réplication et n’ajoutez jamais ce fichier au contrôle de version.", + "rotateTitle": "La rotation de jwt_secret invalide tous les JWT existants", + "rotateBody": "Si auth.json est recréé ou restauré avec un autre secret, jwt_secret change. Les anciens JWT de session et d’API échouent alors avec « Invalid or expired token ». L’interface affiche Invalide — régénérer pour les jetons concernés. Révoquez-les et remplacez-les aussi dans Home Assistant, les scripts et les autres clients.", + "recoverTitle": "Récupération d'un mot de passe perdu", + "recoverIntro": "Il n'y a pas de flux \"mot de passe oublié\" en ligne — par conception, puisque le tableau de bord fonctionne sur le propre hôte de l'opérateur et le chemin de récupération est l'accès shell à cet hôte. ProxMenux envoie une réinitialisation guidée dans le menu de configuration afin que vous n'ayez pas à éditer manuellement auth.json:", + "survivesTitle": "Ce qui survit à la réinitialisation", + "survivesBody": "La connexion interactive est effacée, mais jwt_secret et les api_tokens enregistrés sont conservés. Home Assistant et les autres scripts gardent leurs jetons. Pour repartir entièrement de zéro avec un nouveau secret, supprimez auth.json et redémarrez le service : tous les anciens jetons deviennent invalides.", + "physicalTitle": "Préalable d'accès physique", + "physicalBody": "Cette méthode exige un shell root sur l’hôte. Quiconque exécute menu en root contrôle déjà la machine ; la réinitialisation n’ajoute aucun privilège. Le mot de passe Monitor ne protège donc pas l’hôte contre une personne ayant déjà cet accès root." + }, + "twofa": { + "heading": "Authentification à deux facteurs (TOTP)", + "intro": "2FA ajoute un deuxième facteur en plus de votre mot de passe : un code à chiffres 6 qui tourne chaque 30 secondes, généré sur un téléphone ou un gestionnaire de mots de passe que vous contrôlez. Même si quelqu'un obtient le mot de passe, il ne peut toujours pas se connecter sans le code de votre appareil. ProxMenux Monitor implémente le protocole standard TOTP (RFC 6238), donc toute application d'authentification fonctionne.", + "pickTitle": "Choisir une application d'authentification", + "pickIntro": "Vous pouvez utiliser une application TOTP existante. Voici des options courantes : certaines gratuites, d’autres sur abonnement. Les plateformes et les méthodes de sauvegarde diffèrent aussi.", + "headerApp": "Application", + "headerPlatforms": "Plateformes", + "headerAppNotes": "Remarques", + "apps": [ + { + "name": "Google Authenticator", + "href": "https://safety.google/authentication/", + "platforms": "iOS, Android", + "notes": "La valeur par défaut pour de nombreux utilisateurs. Sauvegarde en nuage optionnelle Google-compte." + }, + { + "name": "Microsoft Authenticator", + "href": "https://www.microsoft.com/en-us/security/mobile-authenticator-app", + "platforms": "iOS, Android", + "notes": "Sauvegarde via un compte Microsoft. Gère aussi les notifications push Microsoft utilisées au travail." + }, + { + "name": "Authy", + "href": "https://authy.com/", + "platforms": "iOS, Android", + "notes": "Synchronisation chiffrée entre appareils. L’application de bureau n’est plus prise en charge depuis le 19 mars 2024." + }, + { + "name": "Apple Passwords", + "href": "https://support.apple.com/guide/passwords/welcome/mac", + "platforms": "iOS, iPadOS, macOS, visionOS, Windows (via iCloud)", + "notes": "Intégrée aux systèmes Apple ; application Passwords distincte depuis iOS 18 / macOS Sequoia. Conserve TOTP avec le mot de passe et synchronise via le trousseau iCloud." + }, + { + "name": "Bitwarden", + "href": "https://bitwarden.com/", + "platforms": "iOS, Android, bureau, navigateur", + "notes": "Code source ouvert. TOTP peut être conservé avec les mots de passe dans le coffre. C’est pratique, mais cela ne les sépare pas sur un second appareil." + }, + { + "name": "1Password", + "href": "https://1password.com/", + "platforms": "iOS, Android, bureau, navigateur", + "notes": "Comme Bitwarden : TOTP intégré au coffre de mots de passe. Sur abonnement." + }, + { + "name": "Aegis Authenticator", + "href": "https://getaegis.app/", + "platforms": "Android", + "notes": "Code source ouvert. Sauvegarde locale chiffrée sous votre contrôle. Aucun cloud ni compte requis." + }, + { + "name": "Raivo OTP", + "href": "https://raivo-otp.com/", + "platforms": "iOS, macOS", + "notes": "Code source ouvert. Synchronisation iCloud facultative. Une option de l’écosystème Apple comparable à Aegis." + }, + { + "name": "Ente Auth", + "href": "https://ente.io/auth/", + "platforms": "iOS, Android, bureau, web", + "notes": "Code source ouvert. Synchronisation cloud entre appareils avec chiffrement de bout en bout." + }, + { + "name": "2FAS", + "href": "https://2fas.com/", + "platforms": "iOS, Android, extension du navigateur", + "notes": "Code source ouvert. Sauvegarde cloud chiffrée facultative ; l’extension de navigateur peut remplir les codes automatiquement." + }, + { + "name": "FreeOTP+", + "href": "https://github.com/helloworld1/FreeOTPPlus", + "platforms": "Android", + "notes": "Fork libre de FreeOTP pour Android, avec importation et exportation. Aucun compte requis." + } + ], + "backupTitle": "Pourquoi les sauvegardes comptent", + "backupBody": "Si vous perdez l’appareil, utilisez un code de récupération conservé ou restaurez une sauvegarde préparée auparavant. Synchronisation cloud et exports varient selon l’application : vérifiez que votre méthode restaure bien les secrets TOTP. L’accès root à l’hôte permet aussi une récupération, décrite ci-dessous. Gardez une sauvegarde distincte et sécurisée.", + "setupTitle": "Configuration étape par étape depuis le tableau de bord", + "setupImageAlt": "Écran de configuration 2FA avec code QR et codes de sauvegarde", + "setupImageCaption": "Le dialogue 2FA montre un QR code, le secret Base32 pour la saisie manuelle et huit codes de récupération à usage unique. Copiez-les avant de fermer : ils ne seront plus affichés.", + "setupSteps": [ + "Installez l'application authentificateur sur votre téléphone (ou ouvrez votre gestionnaire de mots de passe). Une des applications du tableau ci-dessus. Vous n'avez besoin de le faire qu'une seule fois — la même application contiendra des codes pour chaque service que vous protégez.", + "Se connecter au tableau de bord avec votre nom d'utilisateur et votre mot de passe.", + "Ouvrez l’onglet Sécurité, puis Activer 2FA. Le dialogue montre le QR code, le secret Base32 et huit codes de récupération.", + "Ajouter l'entrée à l'application authentificateur:", + "Conservez les codes de récupération. Gardez les huit dans un gestionnaire de mots de passe, une note chiffrée ou une copie papier sécurisée. Chacun sert une fois si l’application est indisponible.", + "Confirmez avec le code actuel à six chiffres de l’application dans le champ « Code de vérification », puis validez. Le code change toutes les 30 secondes ; s’il expire pendant la saisie, utilisez le suivant.", + "Terminé. 2FA est actif. La prochaine connexion demande d’abord le mot de passe, puis le code actuel à six chiffres." + ], + "setupStep4Sub": [ + "Méthode simple : dans l’application, choisissez Ajouter un compte → Scanner un QR code, puis visez le code affiché. L’entrée reçoit un nom comme ProxMenux Monitor (your-username) et affiche un code à six chiffres renouvelé toutes les 30 secondes.", + "Alternative manuelle si le scan est impossible, notamment sur le même téléphone : Ajouter un compte → Saisir une clé de configuration. Choisissez un nom comme Proxmox Monitor, collez le secret Base32, laissez le Type sur Basé sur le temps et enregistrez." + ], + "testTitle": "Tester avant de déconnecter", + "testBody": "Gardez la session actuelle ouverte et testez une nouvelle connexion dans une fenêtre privée immédiatement après la configuration. Si le code échoue, vérifiez les horloges du serveur et du téléphone avant de fermer la session fonctionnelle. Si l’accès est perdu, utilisez un code de récupération ou modifiez auth.json depuis le shell de l’hôte.", + "lostTitle": "Authentificateur perdu", + "lostIntro": "Trois méthodes de récupération, de la moins intrusive à la plus intrusive :", + "lostItems": [ + "Utilisez un code de récupération. Saisissez un des huit codes dans le champ TOTP. Il sert une fois ; les autres restent valides. Après connexion, reconfigurez 2FA dans les paramètres pour obtenir huit nouveaux codes.", + "Restaurer l'authentificateur à partir du cloud / sauvegarde. Si votre application a une synchronisation cloud (Google, Microsoft, Authy, Apple Passwords via iCloud Keychain, Ente, 2FAS) l'installe sur un nouvel appareil, se connecte et les entrées réapparaissent. Si votre application utilise un fichier d'exportation chiffré (Aegis, Raivo, FreeOTP+), installer l'application sur le nouvel appareil et importer le fichier.", + "Désactivez 2FA depuis le shell de l'hôte. Lorsque les options précédentes ne sont pas disponibles, modifiez /root/.config/proxmenux-monitor/auth.json sur l'hôte Proxmox (vous avez besoin de root SSH ou d'un accès à la console), définissez totp_enabled sur false, enregistrez et redémarrez le service :" + ], + "lostShellOutro": "Vous pouvez vous connecter avec le nom d'utilisateur + mot de passe seulement, puis réactiver 2FA depuis Paramètres.", + "disableTitle": "Désactiver 2FA", + "disableBody": "Ouvrez Sécurité et choisissez Désactiver 2FA. POST /api/auth/totp/disable exige le mot de passe actuel et un code TOTP ou de récupération valide. Le secret TOTP et les codes sont effacés. Retirez aussi l’ancienne entrée de l’application.", + "rejectedTitle": "Le code à chiffres 6 est toujours rejeté", + "rejectedIntro": "TOTP dépend du temps : les horloges du serveur et du téléphone doivent différer de moins d’environ 30 s. Deux contrôles :", + "rejectedItems": [ + "Téléphone : Paramètres → Date et heure → activer la synchronisation automatique / réseau.", + "Hôte Proxmox : timedatectl status doit afficher « System clock synchronized: yes ». Sinon, lancez timedatectl set-ntp true et attendez une minute." + ], + "rejectedOutro": "Une fois les horloges synchronisées, le code est accepté dans la fenêtre de 30 secondes suivante." + }, + "apiTokens": { + "heading": "Jetons API de longue durée", + "intro": "Les sessions expirent après 24 heures. Pour Homepage, Home Assistant, Grafana ou Uptime Kuma, créez un jeton API valable 365 jours. Ce JWT utilise le même secret de signature ; le champ token_name permet de le suivre et de le révoquer individuellement.", + "imageAlt": "Panneau de jetons API montrant la liste de jetons avec nom, préfixe, date de création et expiration", + "imageCaption": "Liste des jetons dans les paramètres : nom, préfixe avec quatre derniers caractères d’identification, dates de création et d’expiration, action de révocation.", + "generateTitle": "Générer un jeton", + "generateIntro": "Dans le tableau de bord:", + "generateSteps": [ + "Ouvrez Sécurité → Jetons d’accès API.", + "Tapez un nom descriptif (p.ex. \"Home Assistant\").", + "Entrez de nouveau votre mot de passe. Si 2FA est activé, aussi le code à chiffres 6 actuel.", + "Cliquez sur Générer le jeton. Il s’affiche une seule fois : copiez-le immédiatement." + ], + "generateCli": "Depuis la ligne de commande :", + "useTitle": "Utiliser un jeton", + "revokeTitle": "Révoquer un jeton", + "revokeBody": "Chaque ligne propose Révoquer, qui ajoute le hachage à revoked_tokens dans auth.json. Le jeton est refusé dès la requête suivante.", + "cheatTitle": "Aide-mémoire de sécurité des jetons", + "cheatItems": [ + "Gardez les jetons dans le stockage de secrets de l’intégration : Homepage secrets.yaml, Home Assistant !secret, variables d’environnement. Ne les ajoutez jamais à Git.", + "Un jeton par intégration, portant son nom. Révoquez-le lors du retrait de cette intégration.", + "Rotation tous les 6–12 mois. L'expiration est une limite dure, pas une recommandation." + ], + "outro": "Conseils de stockage et exemples : Référence API → Gestion des jetons et Intégrations." + }, + "https": { + "heading": "HTTPS", + "intro": "Deux chemins vers TLS:", + "items": [ + "Proxy inverse recommandé. Terminez TLS sur Nginx / Caddy / Traefik et transmettez HTTP au processus Flask sur le port 8008. Exemples ci-dessous.", + "HTTPS direct dans l’AppImage. Configurez un certificat via POST /api/ssl/configure (interface : Paramètres → SSL). HTTPS utilise gevent.pywsgi avec son gestionnaire standard ; flask-sock gère WebSocket pour WSS. Les chemins des certificats sont enregistrés dans la configuration SSL." + ], + "calloutTitle": "Limites directes de HTTPS", + "calloutBody": "Monitor peut utiliser un certificat géré par Proxmox ou des fichiers personnalisés. Il n’émet pas lui-même de certificats ACME. Pour l’émission et le renouvellement automatiques, utilisez Proxmox ACME ou un proxy inverse Caddy, Traefik ou Nginx et veillez au chargement des certificats renouvelés." + }, + "gateway": { + "heading": "Passerelle sécurisée (Tailscale)", + "intro": "Un proxy inverse permet l’accès distant. Secure Gateway évite d’exposer TCP 8008 : il déploie un LXC Alpine exécutant Tailscale comme routeur de sous-réseau. L’accès à l’IP LAN de l’hôte dépend des routes approuvées et des règles d’accès du tailnet.", + "calloutTitle": "Pourquoi c'est pratique", + "calloutBody": "Utilisez l’URL LAN http://<proxmox-lan-ip>:8008 via la route approuvée. Les routeurs Tailscale utilisent SNAT par défaut : Monitor voit généralement l’IP LAN de la passerelle, et non l’IP 100.x.y.z du client. Journaux et Fail2Ban identifient l’adresse source reçue par l’hôte.", + "deployBody": "Sur un écran, choisissez le stockage LXC, collez une clé Tailscale créée sur login.tailscale.com/admin/settings/keys, choisissez les sous-réseaux et déployez. Le LXC s’initialise en environ 30 secondes et rejoint le tailnet.", + "outro": "Déploiement, routes de sous-réseau, ACL Tailscale et mode Exit Node sont détaillés dans Tableau de bord → Sécurité → Secure Gateway, où se trouve aussi l’assistant. Cette page décrit l’accès." + }, + "proxy": { + "heading": "Extraits de proxy inversés", + "intro": "Utilisez un nom d’hôte dédié, comme monitor.example.com, qui transmet au port 8008 de l’hôte Proxmox. Les exemples suivent ce modèle. Un sous-chemin comme example.com/proxmenux-monitor/ exige des adaptations frontend et proxy ; retirer le préfixe ne suffit pas.", + "nginxTitle": "Nginx", + "caddyTitle": "Caddy", + "traefikTitle": "Traefik (étiquettes — Docker / Kubernetes)", + "subPathTitle": "Avancé : déploiement sous un sous-chemin", + "subPathBody": "Le frontend actuel n’a pas de base de sous-chemin configurée et construit ses appels API depuis la racine avec /api/*. Retirer un préfixe comme example.com/proxmenux-monitor/ ne traite ni ces appels ni tous les fichiers frontend. Utilisez un nom d’hôte dédié. Un sous-chemin exige des changements coordonnés et des tests spécifiques." + }, + "audit": { + "heading": "Registre des audits", + "intro": "Les échecs de connexion et avertissements de limitation sont écrits ligne par ligne dans /var/log/proxmenux-auth.log. Ce logger n’enregistre pas les connexions réussies :", + "outro": "Suivez le journal avec tail -F /var/log/proxmenux-auth.log. Une configuration ajoutée à logrotate permet sa rotation ; Monitor ne l’effectue pas lui-même." + }, + "fail2ban": { + "heading": "Facultatif : jail Fail2Ban", + "calloutTitle": "Fail2Ban n'est pas livré avec le moniteur", + "calloutBody": "Fail2Ban n'est pas installé par ProxMenux Monitor lui-même. Installez-le via Sécurité → Fail2Ban dans le menu ProxMenux (ou avec le package Debian standard). Sans cela, le moniteur écrit toujours le journal d'audit ci-dessus ; il n'interdit tout simplement pas les récidivistes.", + "intro": "L’intégration ProxMenux fournit une jail [proxmenux] qui :", + "items": [ + "Lit /var/log/proxmenux-auth.log.", + "Correspond au modèle authentication failure; rhost=<ip> avec un filtre dédié.", + "Interdit par défaut l'IP contrevenant au niveau du pare-feu du noyau.", + "Le hook Flask before_request compare les requêtes à la liste de blocage, mise en cache 30 s. Derrière un proxy inverse, le blocage par IP exige aussi PROXMENUX_TRUST_PROXY=1 et un proxy contrôlé qui définit des en-têtes fiables." + ], + "outro": "Configuration, durée de blocage et déblocage : Sécurité → Fail2Ban." + }, + "troubleshoot": { + "heading": "Dépannage", + "noScreenTitle": "L'écran du premier lancement n'apparaît jamais", + "noScreenBody": "L’authentification est déjà configurée (configured: true) ou a été ignorée. Pour recommencer :", + "noScreenOutro": "Cela efface l'état d'auth — aussi tous les secrets TOTP et les jetons API. Sauvegardez d'abord auth.json si vous avez des jetons que vous voulez garder.", + "tokenTitle": "HTTP 401 sur chaque demande d'un jeton API en service", + "tokenBody": "Les jetons ont expiré (limite 365 d) ou sont entrés dans la liste revoked_tokens. Générer un nouveau dans Paramètres et mettre à jour l'intégration. Pour vérifier :", + "tokenOutro": "Les jetons périmés ou révoqués retournent '{'\"error\":\"Invalid or expired token\"'}'.", + "no2faTitle": "Impossible de se connecter après avoir activé 2FA, aucun authentificateur à portée de main", + "no2faBody": "Utilisez un code de sauvegarde dans le champ TOTP. Si ceux-ci sont partis, modifiez /root/.config/proxmenux-monitor/auth.json à partir d'un shell hôte, définissez totp_enabled à false, redémarrez le service.", + "wsTitle": "Le proxy inverse fonctionne mais l'onglet terminal se déconnecte chaque minute", + "wsBody": "Délai d’inactivité WebSocket du proxy. Augmentez le délai de lecture (Nginx : proxy_read_timeout 86400s ; Traefik : idleTimeout du point d’entrée ou middleware). Pour Nginx, vérifiez proxy_set_header Upgrade $http_upgrade et Connection \"upgrade\"." + }, + "whereNext": { + "heading": "Où aller ensuite", + "items": [ + { + "label": "Référence API → Gestion des jetons", + "href": "/docs/monitor/api", + "tail": " — créer, lister et révoquer les jetons API ; bonnes pratiques de sécurité et stockage des secrets." + }, + { + "label": "Intégrations", + "href": "/docs/monitor/integrations", + "tail": " — Homepage, Home Assistant, Grafana / Prometheus, Uptime Kuma et exemples cURL." + }, + { + "label": "Tableau de bord → Sécurité → Portail sécurisé", + "href": "/docs/monitor/dashboard/security", + "tail": " — déployer le LXC Tailscale pas à pas : routes de sous-réseau, ACL et mode Exit Node." + }, + { + "label": "Sécurité → Fail2Ban", + "href": "/docs/security/fail2ban", + "tail": " — installer et configurer la jail facultative." + }, + { + "label": "Paramètres → ProxMenux Monitor", + "href": "/docs/settings/proxmenux-monitor", + "tail": " — démarrer et arrêter le service systemd depuis la TUI ProxMenux." + } + ] + } +} diff --git a/web/messages/fr/docs/monitor/ai-assistant.json b/web/messages/fr/docs/monitor/ai-assistant.json new file mode 100644 index 00000000..c7bb3274 --- /dev/null +++ b/web/messages/fr/docs/monitor/ai-assistant.json @@ -0,0 +1,342 @@ +{ + "meta": { + "title": "Assistant IA Proxmox — OpenAI, Claude, Gemini, Groq, Ollama | ProxMenux Monitor", + "description": "L’assistant IA facultatif reformule les notifications Proxmox VE en langage clair. Six fournisseurs : OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter et Ollama. L’interface propose treize langues, trois niveaux de détail par canal, des instructions personnalisées avec une bibliothèque communautaire et un contexte incluant durée de fonctionnement, récurrence et données SMART.", + "ogTitle": "Assistant IA Proxmox — OpenAI, Claude, Gemini, Groq, Ollama", + "ogDescription": "Réécrire les notifications Proxmox VE en langage clair avec OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter ou Ollama local.", + "twitterTitle": "Assistant IA Proxmox | ProxMenux Monitor", + "twitterDescription": "Réécrire les notifications Proxmox VE en langage clair avec OpenAI, Anthropic, Gemini, Groq, OpenRouter ou Ollama local." + }, + "header": { + "title": "Assistant IA", + "description": "La reformulation IA facultative transforme les modèles de notification admissibles en messages clairs : niveaux de détail par canal, treize langues dans l’interface, instructions personnalisées, bibliothèque communautaire publique et contexte enrichi. Les rapports backup_complete et backup_fail ignorent entièrement l’IA.", + "section": "Moniteur ProxMenux" + }, + "intro": { + "title": "Désactivé par défaut, un seul interrupteur pour l’activer", + "body": "La reformulation IA est désactivée par défaut. Activez-la dans Paramètres → Notifications → Avancé : amélioration IA. Si l’enrichissement ou la reformulation échoue, le texte du modèle original est envoyé. Chaque reformulation a un délai maximal de 25 secondes ; au-delà, le modèle est utilisé sans attendre indéfiniment." + }, + "howItWorks": { + "heading": "Comment ça marche", + "intro": "Les événements envoyés par Monitor suivent le même processus. La reformulation IA est une étape facultative entre le texte du modèle et l’envoi au canal. Un événement passe par quatre étapes :", + "steps": [ + "Événement et modèle. Un événement provient d’un des six collecteurs. notification_templates.py le met en forme en texte brut structuré, qui serait envoyé sans reformulation IA.", + "Enrichissement du contexte. Le répartiteur ajoute les signaux pertinents selon l’événement : durée de fonctionnement pour les défaillances système critiques, fréquence des événements, données SMART pour les disques, correspondances dans la base des erreurs connues et lignes de journal.", + "Construction des instructions. Les instructions système combinent le modèle et les réglages du canal : langue, niveau de détail, règles emoji des Messages enrichis et suggestions IA si activées. En mode personnalisé, vos instructions remplacent tout le texte système. Le message utilisateur contient le texte du modèle et les blocs de contexte.", + "Appel au fournisseur. Groq, OpenAI, Anthropic, Gemini, Ollama ou OpenRouter renvoie un titre et un texte reformulés. Le répartiteur analyse la réponse, remplace ces contenus pour le canal et les transmet à son adaptateur d’envoi." + ], + "notesIntro": "Trois détails à retenir avant de lire le reste de cette page:", + "notes": [ + "L’IA ne crée pas d’événements. Chaque événement provient d’un signal réel : contrôle de santé, ligne de journal, webhook PVE, etc. Un modèle produit le texte avant son passage à l’IA, qui traduit et reformate sans surveiller le système.", + "L'IA fonctionne par canal. Telegram et Discord peuvent utiliser une brève réécriture tandis que l'email obtient un rapport détaillé — même événement, forme différente, tous à partir d'un seul appel de fournisseur par canal.", + "En cas d’échec, le modèle prend le relais. Si le fournisseur renvoie une erreur 5xx, dépasse le délai, produit une réponse incorrecte ou refuse la demande, le répartiteur journalise l’erreur et envoie le texte original du modèle pour ce canal." + ] + }, + "enabling": { + "heading": "Activer le panneau", + "intro": "La configuration IA se trouve en bas du panneau Notifications, dans l’onglet Paramètres, sous le bloc repliable Avancé : amélioration IA. Cliquez sur son titre pour l’ouvrir :", + "collapsedAlt": "En-tête replié des réglages IA avancés avec indicateur en chevron", + "collapsedCaption": "Replié par défaut ; un clic ouvre le panneau.", + "panelAlt": "Panneau IA ouvert avec interrupteur principal, fournisseur Google Gemini, clé API masquée, modèle gemini-2.5-flash, instructions par défaut, langue anglaise, détail par canal Telegram, Discord, Gotify et e-mail, suggestions IA et test de connexion", + "panelCaption": "Le panneau IA complet : chaque commande décrite dans cette page correspond à un des champs ci-dessus.", + "outro": "De haut en bas : interrupteur Messages améliorés par IA, choix du fournisseur et fenêtre d’information, clé API ou URL Ollama, liste des modèles chargée après saisie de la clé, mode Par défaut / Personnalisé, langue, détail par canal, Suggestions IA et bouton Tester la connexion qui envoie un message de test au fournisseur pour vérifier les identifiants." + }, + "context": { + "heading": "Quel contexte l'IA reçoit", + "intro": "Avant que l'invite ne soit construite, le régulateur suit une routine d'enrichissement du contexte qui décide quels signaux supplémentaires sont pertinents à l'événement en question. Le but est de donner au LLM suffisamment d'informations pour produire un message utile, sans l'envahir (et votre portefeuille) avec du bruit qui ne s'applique pas. Cinq blocs contextuels peuvent être ajoutés au message utilisateur :", + "headerBlock": "Bloc", + "headerWhen": "Quand il est injecté", + "headerWhat": "Ce qu'il porte", + "rows": [ + { + "block": "Durée de fonctionnement du système", + "when": "Uniquement pour les défaillances système critiques : crash, panic, oom, kernel, split_brain, quorum_lost, node_offline, node_fail, system_fail, boot_fail. Omis pour les erreurs de disque, avertissements et opérations courantes afin de limiter le texte des instructions.", + "what": "Une ligne telle que System uptime: 14 days (stable system). Permet au LLM de distinguer les problèmes de démarrage des échecs de longue durée." + }, + { + "block": "Fréquence des événements", + "when": "Toujours, quand le moniteur a vu la même empreinte digitale avant.", + "what": "Nombre d'occurrences, horodatage à première vue, étiquette de motif optionnelle (récurrent / unique / pic). Le LLM utilise cette expression pour dire « problème récurrent » par opposition à « première fois vu »." + }, + { + "block": "Données SMART", + "when": "Seulement pour les événements liés au disque (le type d'événement contient disk, smart, storage, io_error, ou le corps mentionne /dev/sd, ata, i/o error).", + "what": "Sortie de smartctl pour l'appareil touché — santé globale (PASSED / FAILED) plus les attributs pertinents pour le mode de défaillance." + }, + { + "block": "Base des erreurs connues", + "when": "Lorsque le contexte du corps ou du journal correspond à un modèle d'erreur spécifique à Proxmox envoyé avec le moniteur.", + "what": "Un bloc KNOWN PROXMOX ERROR DETECTED avec la cause reconnue et une solution précise. Les instructions demandent une traduction fidèle, sans reformuler la correction recommandée." + }, + { + "block": "Registres", + "when": "Chaque fois que le collectionneur d'origine a capturé des lignes de journal pour l'événement (principalement l'observateur de journal et l'observateur des tâches).", + "what": "Extraits bruts de journalctl. L'invite indique à la LLM d'extraire les ID, les timestamps et les indices de cause racine, et d'ignorer les entrées non liées." + } + ], + "afterBlocks": "Une fois ces blocs joints, le message utilisateur envoyé au LLM a cette forme :", + "calloutTitle": "Pas de télémétrie au-delà de l'événement lui-même", + "calloutBody": "Monitor envoie uniquement les informations disponibles pour l’événement courant : aucune télémétrie générale, série historique de métriques ou export d’inventaire. Les cinq blocs ci-dessus limitent ce qui quitte l’hôte lors d’une reformulation IA." + }, + "tokens": { + "heading": "Jetons — ce qu'ils sont et comment ils sont consommés", + "intro1": "Les fournisseurs commerciaux facturent les tokens. Un token représente environ quatre caractères anglais ou trois quarts de mot. La phrase anglaise \"Backup completed on storage local-bak\" compte environ huit tokens. Dix lignes de journal peuvent représenter 200 à 400 tokens selon leur contenu technique.", + "intro2": "Deux choses sont facturées à chaque appel :", + "items": [ + "Tokens d’entrée : instructions système et message utilisateur, avec gravité, titre, texte du modèle et contexte enrichi. Leur nombre dépend des instructions et de l’événement. Chaque canal reformulé peut consommer ses propres tokens ; les rapports de sauvegarde terminée ou échouée ignorent l’IA.", + "Tokens de sortie : la réponse du modèle. Monitor les limite avec max_tokens. Le plafond est une limite, pas une consommation fixe : pour 250 tokens produits avec un plafond de 1500, vous payez 250." + ], + "capsIntro": "Ce sont les plafonds réels que le régulateur applique, pris directement à partir de AI_DETAIL_TOKENS dans notification_templates.py:", + "headerLevel": "Niveau de détail", + "headerCap": "Limite de sortie (tokens)", + "headerConsumption": "Consommation réelle typique", + "capRows": [ + { + "level": "bref", + "cap": "500", + "consumption": "50-200 jetons de sortie pour les événements courts." + }, + { + "level": "standard", + "cap": "1500", + "consumption": "200 à 700 tokens de sortie pour les événements habituels avec peu de contexte." + }, + { + "level": "détaillé", + "cap": "3000", + "consumption": "500-2000 jetons de sortie pour les rapports de courriel complets avec les journaux et les tables SMART." + } + ], + "customNote": "Le mode personnalisé fixe la sortie à 500 tokens, quel que soit le niveau de détail. Vous contrôlez les instructions ; le plafond évite les réponses trop longues.", + "sizingTitle": "Taille pratique", + "sizingBody": "Estimez la consommation : événements reformulés × canaux IA × tokens d’entrée et de sortie par appel. Exemple : 50 événements × un canal × (500 en entrée + 300 en sortie) = 40 000 tokens par jour. Les valeurs réelles dépendent du modèle, du contexte, du cache et des limites du fournisseur. Détail par canal explique comment utiliser brief pour le chat au lieu de standard, avec des e-mails détaillés." + }, + "providers": { + "heading": "Fournisseurs d'IA", + "intro": "Six fournisseurs sont connectés au moniteur. Le menu déroulant du fournisseur dans l'interface utilisateur les montre tous; un bouton d'information à côté ouvre un modal avec une description d'une ligne pour chacun. Voici la référence complète, avec l'URL pour obtenir une clé API, la description affichée dans l'interface utilisateur et les notes pertinentes de la base de codes.", + "imageAlt": "Informations sur les fournisseurs d'IA modal énumérant les six fournisseurs supportés — Groq, OpenAI, Anthropic Claude, Google Gemini, Ollama, OpenRouter — chacun avec son icône et sa description en une seule ligne, et une note spéciale d'APIs compatibles OpenAI pour OpenAI", + "imageCaption": "La fenêtre de l’application : six fiches, une par fournisseur, avec les descriptions ci-dessous.", + "groq": { + "heading": "Groq", + "tagline": "Très rapide, généreux niveau libre (30 req/min). Idéal pour commencer.", + "items": [ + "Clé API : console.groq.com/keys", + "Exemples de la liste de modèles fournie : allam-2-7b, qwen/qwen3.8-27b, openai/gpt-oss-20b, groq/compound-mini.", + "Recommandation fournie : openai/gpt-oss-20b. Vérifiez sa disponibilité pour votre compte avec le sélecteur du fournisseur et le test de connexion." + ] + }, + "openai": { + "heading": "OpenAI", + "tagline": "Norme de l'industrie. Très précis et largement utilisé.", + "items": [ + "Clé API : platform.openai.com/api-keys", + "Exemples de la liste de modèles fournie : gpt-4.1-nano, gpt-4.1-mini, gpt-4o-mini, gpt-4.1, gpt-4o, gpt-5-nano.", + "Recommandation fournie : gpt-4.1-nano. L’adaptateur gère aussi les exigences des modèles de raisonnement ; la liste inclut gpt-5-nano, ils ne sont donc pas tous exclus." + ], + "baseUrlTitle": "URL de base compatible OpenAI", + "baseUrlBody": "Le fournisseur OpenAI accepte une URL de base personnalisée pour les points d’accès compatibles : BytePlus / ByteDance (Kimi K2.5), LocalAI, LM Studio, vLLM, Together AI, Fireworks AI et les services utilisant le format /v1/chat/completions. Saisissez l’URL dans l’onglet OpenAI près de la clé API." + }, + "anthropic": { + "heading": "Anthropic (Claude)", + "tagline": "Excellent pour l'écriture et la traduction. Rapide et économique.", + "items": [ + "Clé API : console.anthropic.com/settings/keys", + "Exemples de la liste de modèles fournie : claude-haiku-4-5-20251001, claude-sonnet-4-6, claude-opus-4-6.", + "Recommandation fournie : claude-haiku-4-5-20251001. Cette version précise est recommandée ; les anciens modèles Claude 3.5 ne figurent plus dans la liste fournie." + ] + }, + "gemini": { + "heading": "Google Gemini", + "tagline": "Niveau gratuit disponible, excellent rapport qualité/prix.", + "items": [ + "Clé API : aistudio.google.com/app/apikey", + "Exemples de la liste de modèles fournie : gemini-2.5-flash-lite, gemini-2.5-flash, gemini-3-flash-preview.", + "Recommandé: gemini-2.5-flash-lite — flash et flash-lite passent le vérificateur de façon cohérente. Les variantes pro rejettent le réglage thinkingBudget=0 du moniteur et sont surqualifiées pour cette charge de travail." + ] + }, + "openrouter": { + "heading": "OpenRouter", + "tagline": "Agrégateur avec accès aux modèles 100+ en utilisant une seule clé API. Flexibilité maximale.", + "items": [ + "Clé API : openrouter.ai/keys", + "Exemples de la liste de modèles fournie : meta-llama/llama-3.3-70b-instruct, meta-llama/llama-3.1-70b-instruct, meta-llama/llama-3.1-8b-instruct, anthropic/claude-haiku-4.5, google/gemini-2.5-flash-lite, openai/gpt-4o-mini, mistralai/mistral-medium-3.", + "Recommandé: meta-llama/llama-3.3-70b-instruct — le même modèle que l'entrée Groq mais acheminé par OpenRouter, ce qui signifie une seule clé pour tous les modèles listés." + ] + }, + "ollama": { + "heading": "Ollama (local)", + "tagline": "Utilise les modèles du serveur Ollama configuré. Les modèles locaux s’exécutent sur ce serveur ; les modèles cloud transmettent les requêtes à un fournisseur externe. L’exécution locale évite les frais d’API hébergée, mais utilise votre matériel et votre électricité.", + "items": [ + "Pas de clé API. Définissez le champ Ollama URL sur votre serveur (par défaut http://localhost:11434 ou quel que soit l'hôte exécute votre instance Ollama).", + "Modèles: non filtré. Le moniteur lit les modèles que vous avez tirés sur le côté Ollama via ollama pull <model>. Le menu déroulant est peuplé de GET /api/tags sur votre serveur Ollama.", + "Installation : ollama.com/download — Linux, macOS et Windows. Choisissez un modèle qui tient en RAM et dont la fenêtre de contexte peut contenir les blocs de journal ajoutés par le répartiteur." + ] + } + }, + "models": { + "heading": "Pourquoi ces modèles spécifiques", + "intro": "Le choix des modèles commerciaux utilise le catalogue fourni verified_ai_models.json et les contrôles de disponibilité des adaptateurs. Ceux-ci convertissent la demande interne system_prompt + user_message + max_tokens vers chaque API. Le catalogue contient des modèles testés et des ajouts manuels ; il ne garantit ni l’accès actuel du compte ni le passage de chaque entrée au même vérificateur.", + "consequencesIntro": "Deux conséquences méritent d'être connues:", + "consequences": [ + "La recommandation fournie est un point de départ pour les notifications. Évaluez qualité linguistique, latence et coût selon vos événements et votre compte ; ce n’est pas un classement universel.", + "Vous pouvez choisir un autre modèle de la liste selon votre quota ou vos préférences. Testez sa disponibilité : sa présence ne garantit pas l’accès actuel de votre compte." + ], + "ollamaTitle": "Ollama est l'exception", + "ollamaBody": "La liste Ollama n’est pas filtrée par le catalogue commercial ; elle reflète les modèles du serveur. Pour une exécution locale, choisissez un modèle local adapté à la RAM et au contexte des journaux. Les modèles cloud restent distants, même via un serveur Ollama local." + }, + "defaultPrompt": { + "heading": "Invite par défaut", + "intro": "Avec le mode prompt réglé sur Default, le moniteur utilise l'invite système ci-dessous. L'invite est modélisée à l'exécution : '{'language'}', '{'detail_level'}', '{'emoji_instructions'}' et '{'suggestions_addon'}' sont remplacés avant l'appel. Les variantes pour les canaux riches vs simples et l'ajout AI Suggestions sont affichés immédiatement après.", + "showFullSummary": "Afficher l'invite système par défaut complète", + "passagesIntro": "Deux variantes de texte sont choisies selon le réglage Messages enrichis de chaque canal :", + "passages": [ + "Rich on → un bloc emoji est injecté listant les icônes que LLM peut utiliser, plus une règle de nom d'hôte (le LLM doit garder le préfixe du nom d'hôte à partir du titre) et une poignée d'exemples formatés (démarrage de sauvegarde, sauvegarde complète, mises à jour, démarrage de VM, dégradation de la santé). C'est ce qui produit les messages préfixés emoji sur Telegram et Discord.", + "Rich off → un bloc d'une ligne dit au LLM d'utiliser uniquement ASCII simple — pas d'emojis, pas de symboles Unicode. Utilisé pour l'email et tout canal où le formatage du bruit fait mal aux règles de boîte de réception ou de lisibilité." + ], + "suggestionsPlaceholder": "L’espace réservé '{'suggestions_addon'}' reste vide sauf si vous activez les suggestions IA ; le bloc suivant est alors ajouté :", + "showAddonSummary": "Afficher le complément de suggestions IA" + }, + "customPrompt": { + "heading": "Mode d'invite personnalisé", + "intro": "Le mode Personnalisé remplace tout le texte système par vos propres instructions. Elles sont enregistrées dans les paramètres SQLite et envoyées sans modification à chaque appel IA. Vous pouvez ainsi choisir un autre ton, une autre structure ou priorité.", + "imageAlt": "Mode personnalisé Prompt affichant une zone de texte avec des règles de traduction et des boutons d'importation d'exportation plus un lien d'invite communautaire", + "imageCaption": "Prompt personnalisé — grande zone de texte avec l'invite de l'utilisateur, plus Export, Import et un lien vers la galerie communautaire sur GitHub.", + "changesTitle": "Ce qui change en mode personnalisé", + "changes": [ + "L'invite par défaut est entièrement remplacée. Les mappages Proxmox, les règles de gestion du contexte et les instructions emoji sont tous partis. Si vous voulez garder l'un d'eux, collez-les dans votre invite — le EXAMPLE_CUSTOM_PROMPT fourni ci-dessous est un point de départ.", + "Le sélecteur de langue est ignoré. Les instructions par défaut contiennent '{'language'}', contrairement au texte personnalisé. Précisez la langue dans vos instructions, par exemple « Traduire en espagnol » ou « Tout écrire en français ».", + "Le mode personnalisé reste limité à 500 tokens, indépendamment du détail enregistré par canal. Le mode par défaut utilise 500 / 1500 / 3000. Modifier les instructions ne relève pas ce plafond ; demandez une réponse plus courte ou choisissez un détail par défaut adapté.", + "Les marqueurs de sortie restent obligatoires. Incluez [TITLE] et [BODY] dans le format de réponse. L’analyseur extrait leur contenu ; si un marqueur manque, il renvoie le modèle original.", + "Rich messages émoji règles ne sont pas auto-injectés. Si vous voulez emojis, dites à l'invite de les utiliser. Si vous voulez un texte clair, dites-lui de ne pas le faire. La bascule ne porte que les blocs groupés de l'invite par défaut, et non votre chaîne personnalisée." + ], + "starterTitle": "Exemple initial d’instructions", + "starterIntro": "La zone de texte Custom Prompt est pré-remplie avec un exemple minimal que vous pouvez adapter:", + "showStarterSummary": "Afficher l’exemple initial personnalisé", + "shareTitle": "Partager des instructions avec la communauté", + "shareIntro": "Le bouton Exporter enregistre vos instructions dans un fichier (.txt / .md) à garder comme sauvegarde ou à partager. Importer recharge un fichier. Le troisième bouton ouvre la galerie communautaire publique sur GitHub :", + "shareLinkLabel": "github.com/MacRimi/ProxMenux/discussions — Partagez les instructions personnalisées pour les notifications AI", + "shareOutro": "Parcourez la discussion pour découvrir les créations des autres administrateurs : alertes très courtes, rapports techniques détaillés et variantes linguistiques. Si votre adaptation vous convient, partagez-la avec un paragraphe expliquant son objectif. Les retours sur ce qui fonctionne ou non sont également bienvenus." + }, + "suggestions": { + "heading": "Suggestions d'IA (BÊTA)", + "intro": "Les suggestions IA permettent d’ajouter un conseil court et applicable à la fin du texte. Elles nécessitent le mode Par défaut, l’IA et les Suggestions IA activés. Les instructions demandent d’omettre le conseil si la cause ou la solution est incertaine.", + "formatIntro": "Lorsqu’un conseil est ajouté, il suit ce format exact :", + "rulesIntro": "Les règles ont été introduites dans l'addon (visible dans le bloc pliable sous la section invite par défaut ci-dessus) :", + "rules": [ + "Le conseil est inclus uniquement si les journaux ou la base des erreurs connues indiquent clairement une correction précise.", + "Les instructions demandent un conseil de moins de 100 caractères ; l’analyseur ne vérifie pas cette longueur séparément.", + "Les instructions exigent une commande ou un chemin précis et demandent d’éviter les conseils généraux.", + "Si une erreur connue fournit une solution, la LLM doit utiliser cette solution, et non en inventer une nouvelle.", + "Les instructions demandent d’omettre le conseil si les données ne justifient pas une correction précise." + ], + "betaTitle": "Pourquoi BETA", + "betaBody": "La qualité des conseils dépend du modèle choisi et du contexte disponible dans les journaux. Un modèle performant, comme Claude 3.5 Haiku, GPT-4.1 Mini ou Llama 3.3 70B, avec données smartctl et lignes de journal, peut fournir un conseil utile. Un petit modèle Ollama local avec un événement d’une ligne peut donner un résultat peu utile ou aucun conseil. Désactivez les suggestions si elles vous gênent, puis réactivez-les à votre convenance." + }, + "detailLevel": { + "heading": "Niveau de détail par canal", + "intro": "Telegram, Discord, Gotify et e-mail ont chacun un choix de détail. Trois valeurs déterminent le plafond de tokens et les instructions du mode par défaut :", + "headerLevel": "Niveau", + "headerLabel": "Étiquette UI", + "headerCap": "Limite de production", + "headerProduce": "Ce que l'invite demande au LLM de produire", + "rows": [ + { + "level": "bref", + "label": "2 à 3 lignes, uniquement l’essentiel", + "cap": "500 tokens", + "produce": "\"Ce qui s'est passé + où\". Rien d'autre." + }, + { + "level": "standard", + "label": "Concise avec le contexte de base", + "cap": "1500 tokens", + "produce": "3 à 6 lignes : quoi, où, cause, appareils concernés." + }, + { + "level": "détaillé", + "label": "Détails techniques complets", + "cap": "3000 tokens", + "produce": "Rapport complet : quoi, où, cause, affecté, journaux, données SMART, historique." + } + ], + "defaultsIntro": "Valeurs par défaut à la première installation :", + "defaults": [ + "Telegram, Discord, Gotify — standard.", + "Courriel — detailed. Le courriel est le canal où vous voulez généralement l'image complète pour l'archivage." + ], + "emailTitle": "Le niveau de détail du courriel ajoute l'original", + "emailBody": "Si le formateur IA renvoie un résultat pour l’e-mail en detailed et que le texte original dépasse 50 caractères, il l’ajoute après 40 tirets et Original message:. Les détails restent disponibles pour les recherches. Si l’IA est ignorée ou échoue, le modèle original seul peut être envoyé." + }, + "language": { + "heading": "Langue", + "intro": "Le sélecteur propose treize langues. Il enregistre ai_language, utilisé par les instructions par défaut dans \"translate alerts into '{'language'}'\". La liste :", + "list": "Anglais (en), slovaque (sk), espagnol (es), français (fr), allemand (de), portugais (pt), italien (it), russe (ru), suédois (sv), norvégien (no), japonais (ja), chinois (zh), néerlandais (nl).", + "rulesIntro": "Deux règles importantes tirées directement de l'invite :", + "rules": [ + "Traduire : libellés, descriptions, états et unités, par exemple GB → Go en français.", + "Ne pas traduire: noms d'hôte, IPs, chemins, IDs VM/CT, noms de périphérique comme /dev/sdX, identifiants techniques. Celles-ci restent in extenso quelle que soit la langue." + ], + "customNote": "Mode d'invite personnalisé n'utilise pas le sélecteur de langue. Si vous passez à Custom et voulez un langage de sortie spécifique, déclarez-le à l'intérieur de votre invite." + }, + "templates": { + "heading": "Note sur les modèles", + "body1": "L’IA reçoit le texte d’un modèle, pas les données brutes de l’événement. vm_start, auth_fail et health_degraded ont des modèles dans notification_templates.py. L’IA reformule les sorties admissibles ; backup_complete et backup_fail conservent leurs rapports déterministes sans IA.", + "body2": "Deux implications pratiques: l'IA ne voit jamais un nom d'hôte ou VMID qu'il doit inventer — ces champs sont placés par le modèle avant la réécriture. Et si l'IA est désactivé, le corps modèle est ce qui est envoyé directement. La page Notifications documente le pipeline d'expédition en entier et est la bonne référence pour tout ce qui arrive à un événement avant qu'il atteigne ce calque." + }, + "privacy": { + "heading": "Confidentialité & flux de données", + "intro": "Avec la réécriture AI activée, le moniteur envoie le corps de notification rendu ainsi que les blocs de contexte enrichis au fournisseur configuré. Cela peut inclure des noms d'hôte, des IP, des noms d'utilisateur, des chemins de périphérique, des lignes de journal et des attributs SMART pour le périphérique touché. Si cela quitte l'hôte dépend du fournisseur que vous avez choisi:", + "headerProvider": "Fournisseur", + "headerDestination": "Destination des données", + "rows": [ + { + "provider": "Ollama", + "destination": "Les modèles locaux s’exécutent sur l’hôte Ollama configuré. S’il s’agit du nœud Proxmox, leurs requêtes y restent. Les modèles cloud transmettent les requêtes hors de l’hôte, même via un serveur Ollama local." + }, + { + "provider": "OpenAI", + "destination": "api.openai.com par défaut, ou l’URL de base personnalisée. La politique de données de l’opérateur réel du point d’accès s’applique." + }, + { + "provider": "Anthropic", + "destination": "api.anthropic.com." + }, + { + "provider": "Google Gemini", + "destination": "generativelanguage.googleapis.com." + }, + { + "provider": "Groq", + "destination": "api.groq.com." + }, + { + "provider": "OpenRouter", + "destination": "openrouter.ai, qui est transmis au fournisseur de modèles sous-jacent choisi dans le champ model. Deux sauts au lieu d'un." + } + ], + "calloutTitle": "Si le contenu de l'événement ne peut pas quitter le réseau", + "calloutBody": "Utilisez un point d’accès hébergé localement avec un modèle local, comme Ollama ou un serveur compatible OpenAI, ou désactivez l’IA. Les modèles cloud Ollama ne traitent pas les données localement. Le répartiteur ne masque ni noms d’hôte ni IP ; il utilise le contenu réel de l’événement." + }, + "whereNext": { + "heading": "Où aller ensuite", + "items": [ + { + "label": "Notifications", + "href": "/docs/monitor/notifications", + "tail": "— le pipeline d'expédition, les canaux, les toggles par événement et l'intégration PVE webhook qui entoure cette couche." + }, + { + "label": "Moniteur de santé", + "href": "/docs/monitor/health-monitor", + "tail": "— le plus grand producteur d'événements l'IA finit par réécrire, avec ses propres durées de suppression par catégorie." + }, + { + "label": "Architecture", + "href": "/docs/monitor/architecture", + "tail": "— où l'AI Enhancer s'inscrit dans le processus plus large de Monitor (c'est un module, pas un service séparé)." + } + ], + "communityLabel": "Instructions communautaires sur GitHub", + "communityTail": "— parcourez, partagez, demandez." + } +} diff --git a/web/messages/fr/docs/monitor/api-reference.json b/web/messages/fr/docs/monitor/api-reference.json new file mode 100644 index 00000000..416a903e --- /dev/null +++ b/web/messages/fr/docs/monitor/api-reference.json @@ -0,0 +1,760 @@ +{ + "meta": { + "title": "API Proxmox Monitor — Référence d’intégration | ProxMenux", + "description": "Points d’accès HTTP de ProxMenux Monitor pour Home Assistant, Homepage, Grafana, Prometheus, n8n et tableaux de bord personnalisés. Consulter l’état et lancer les opérations documentées : contrôle des VM, sauvegardes, notifications et acquittement des alertes.", + "ogTitle": "API Proxmox Monitor — Référence d’intégration", + "ogDescription": "Points d’accès ProxMenux Monitor pour Home Assistant, Homepage, Grafana, Prometheus, n8n et tableaux de bord personnalisés.", + "twitterTitle": "API Proxmox Monitor | ProxMenux", + "twitterDescription": "Points d’accès pour Home Assistant, Homepage, Grafana, Prometheus, n8n et tableaux de bord personnalisés." + }, + "header": { + "title": "Référence de l’API", + "description": "Points d’accès HTTP pour consulter l’état et lancer des actions documentées : capteurs Home Assistant, cartes Homepage, tableaux Grafana, collecte Prometheus, flux n8n et scripts personnalisés. Avec catégories, métriques exportées et exemples curl.", + "section": "ProxMenux Monitor" + }, + "intro": { + "title": "À quoi sert cette page", + "body": "Cette page réunit les points d’accès des intégrations : lecture des données, lancement de sauvegardes, notifications personnalisées et acquittement d’alertes. L’API utilise le processus Flask du tableau de bord sur TCP 8008. L’adresse d’écoute et TLS sont décrits dans Accès et authentification." + }, + "headerEndpoint": "Point d’accès", + "headerMethod": "Méthode", + "headerUse": "Utilisation", + "auth": { + "heading": "Authentification", + "intro": "Lorsque l’authentification est active, les points d’accès protégés attendent un jeton JWT Bearer dans l’en-tête :", + "tokensIntro": "Deux façons d'obtenir le jeton :", + "items": [ + "Jetons API, recommandés pour les intégrations. Valables 365 jours, créés dans Sécurité → Jetons API. Ils sont nommés et révocables individuellement. Utilisez read_only pour les données, full_admin uniquement pour les actions administratives nécessaires.", + "Connexion, JWT de 24 heures. POST /api/auth/login avec identifiant, mot de passe et TOTP si la 2FA l’exige. Le JWT expire après 24 heures ; les scripts doivent alors s’authentifier à nouveau." + ], + "flowLink": "Connexion, mots de passe, 2FA, journal d’audit et TLS sont décrits dans Accès et authentification.", + "rows": [ + { + "endpoint": "/api/auth/login", + "method": "POST", + "use": "Champs du corps (schéma) : '{'\"username\",\"password\",\"totp_token?\"'}'. Renvoie un JWT de 24 heures." + }, + { + "endpoint": "/api/auth/api-tokens", + "method": "GET", + "use": "Liste des jetons API (métadonnées seulement — noms, préfixes, dates; jamais le vrai secret)." + }, + { + "endpoint": "/api/auth/generate-api-token", + "method": "POST", + "use": "Crée un jeton API de 365 jours avec une session authentifiée. Champs : password, token_name?, totp_token?, scope?. Mot de passe et TOTP requis sont vérifiés à nouveau. scope vaut read_only par défaut ; full_admin doit être choisi explicitement. Le secret est renvoyé une seule fois." + }, + { + "endpoint": "/api/auth/api-tokens/", + "method": "DELETE", + "use": "Révoquer un jeton API par son identifiant." + } + ] + }, + "conventions": { + "heading": "Conventions", + "items": [ + "La plupart utilisent JSON. Certains téléchargements renvoient du texte brut ; /api/prometheus utilise le format texte Prometheus 0.0.4, plutôt qu’OpenMetrics. Vérifiez le type de réponse de chaque route.", + "De nombreuses écritures renvoient '{'\"success\": true, ...'}'. Les erreurs varient ; un format courant est '{'\"success\": false, \"error\": \"'<'reason'>'\"'}'. Vérifiez le statut HTTP et les champs : certains défis d’authentification utilisent HTTP 200 avec success false.", + "Les paramètres dépendent du point d’accès. Utilisez limit, offset, since et les filtres de catégorie uniquement si la route les accepte.", + "Les formats temporels varient : horodatages Unix, chaînes ISO-8601 et dates systemd. Ne supposez ni une unité commune ni un fuseau explicite pour tous les champs." + ] + }, + "system": { + "heading": "Système & matériel", + "rows": [ + { + "endpoint": "/api/system", + "method": "GET", + "use": "Valeurs actuelles de CPU, mémoire, swap, durée de fonctionnement et charge." + }, + { + "endpoint": "/api/info", + "method": "GET", + "use": "Informations statiques de l’hôte : nom, noyau, version PVE, modèle CPU et distribution." + }, + { + "endpoint": "/api/system-info", + "method": "GET", + "use": "Données système étendues de l’en-tête : métriques générales et heure de démarrage." + }, + { + "endpoint": "/api/hardware", + "method": "GET", + "use": "Inventaire matériel détaillé : périphériques PCI, GPU et capteurs." + }, + { + "endpoint": "/api/hardware/live", + "method": "GET", + "use": "Valeurs actuelles des capteurs à variation rapide." + }, + { + "endpoint": "/api/temperature/history", + "method": "GET", + "use": "Séries temporelles des températures du CPU et de son boîtier." + }, + { + "endpoint": "/api/gpu//realtime", + "method": "GET", + "use": "Métriques actuelles des GPU NVIDIA, Intel et AMD par emplacement PCI." + } + ] + }, + "actions": { + "heading": "Actions du système", + "intro": "Ces actions asynchrones utilisent des unités systemd temporaires. Avec authentification active, leurs écritures exigent full_admin ; read_only peut consulter .../status. Un lancement accepté renvoie HTTP 202 et l’état ; consultez .../status pour la progression. Le contrôle des invités et les sauvegardes ont d’autres réponses, décrites plus bas.", + "shapeTitle": "Forme de réponse commune", + "shapeIntro": "Les actions système asynchrones partagent l’objet d’état JSON ci-dessous. Le contrôle des invités et les sauvegardes ont d’autres formats :", + "shapeCode": "{\n \"unit\": \"proxmenux-action-pve-update.service\",\n \"state\": \"idle | running | success | failed | cancelled\",\n \"started_at\": \"Sat 2026-08-01 11:01:32 CEST\",\n \"finished_at\": null,\n \"exit_code\": null,\n \"result\": null\n}", + "concurrencyTitle": "Concurrence et annulation", + "concurrencyBody": "Relancer la même action déjà active renvoie HTTP 409. L’annulation existe seulement avec une route DELETE documentée, comme pour la mise à jour PVE. L’état devient cancelled avec dates conservées. Les états finaux sont en mémoire du processus et peuvent disparaître au redémarrage du moniteur.", + "rows": [ + { + "endpoint": "/api/system/power/reboot", + "method": "POST", + "use": "Lance le redémarrage de l’hôte Proxmox. La connexion HTTP peut se fermer quand systemd commence l’arrêt." + }, + { + "endpoint": "/api/system/power/reboot/status", + "method": "GET", + "use": "État du redémarrage actuel ou précédent." + }, + { + "endpoint": "/api/system/power/shutdown", + "method": "POST", + "use": "Éteint l’hôte Proxmox, par exemple en réponse au signal d’arrêt d’un onduleur." + }, + { + "endpoint": "/api/system/power/shutdown/status", + "method": "GET", + "use": "État de l’arrêt actuel ou précédent." + }, + { + "endpoint": "/api/system/pve-update/run", + "method": "POST", + "use": "Lance la mise à jour PVE utilisée par Mettre à jour maintenant du Health Monitor et le menu shell ; délègue à update-pve-safe.sh." + }, + { + "endpoint": "/api/system/pve-update/status", + "method": "GET", + "use": "État de la mise à jour PVE actuelle ou précédente." + }, + { + "endpoint": "/api/system/pve-update", + "method": "DELETE", + "use": "Annule une mise à jour PVE en cours par SIGTERM." + }, + { + "endpoint": "/api/proxmenux/self-update/run", + "method": "POST", + "use": "Met à jour ProxMenux avec l’installateur du canal stable ou bêta configuré. Une unité systemd distincte permet au travail de survivre au redémarrage de proxmenux-monitor lancé par l’installateur." + }, + { + "endpoint": "/api/proxmenux/self-update/status", + "method": "GET", + "use": "État de la mise à jour ProxMenux actuelle ou précédente." + }, + { + "endpoint": "/api/vms//control", + "method": "POST", + "use": "Envoie une commande de VM ou LXC. Le champ action accepte start, stop, shutdown ou reboot. Une réponse réussie renvoie une tâche PVE confirmée, sans garantir sa fin. Consultez le point d’accès control-task de l’invité pour le résultat." + }, + { + "endpoint": "/api/vms//backup", + "method": "POST", + "use": "Crée une sauvegarde vzdump de VM ou LXC. Champs facultatifs à adapter au stockage : storage (cible PVE), mode (snapshot, suspend ou stop), compress (zstd, lzo, gzip ou none), protected (true ou false), notes, notification (auto, always, failure ou never) et pbs_change_detection (default, legacy ou data). Renvoie l’UPID de la tâche PVE." + }, + { + "endpoint": "/api/vms//backups", + "method": "GET", + "use": "Liste les sauvegardes précédentes d’une VM ou d’un LXC sur les stockages accessibles." + } + ], + "syncVsAsyncTitle": "Deux types d’actions", + "syncVsAsyncBody": "Alimentation et mises à jour de l’hôte utilisent des unités systemd temporaires avec .../status. Seule la mise à jour PVE possède ici une route DELETE d’annulation. Le contrôle VM/LXC renvoie une tâche à suivre ; la sauvegarde un UPID de travail en arrière-plan. Acceptation ne signifie pas achèvement. Authentification et droits dépendent de la route.", + "curlTitle": "Exemple curl", + "curlBody": "Lance une mise à jour PVE et suit sa progression jusqu’à la fin, comme une automatisation Home Assistant ou un playbook Ansible.", + "curlCode": "TOKEN=\n\ncurl -sSf -X POST \\\n -H \"Authorization: Bearer $TOKEN\" \\\n https://:8008/api/system/pve-update/run\n\nwhile true; do\n state=$(curl -sSf -H \"Authorization: Bearer $TOKEN\" \\\n https://:8008/api/system/pve-update/status | jq -r .state)\n [ \"$state\" != \"running\" ] && break\n sleep 30\ndone\necho \"final state: $state\"", + "haTitle": "Exemple pour Home Assistant", + "haBody": "Un capteur rest consulte l’état et rest_command lance la mise à jour. Associez-les à un bouton du tableau de bord et aux automatisations voulues :", + "haCode": "# configuration.yaml\nsensor:\n - platform: rest\n resource: https://pve.local:8008/api/system/pve-update/status\n name: pve_update_state\n value_template: \"{{ value_json.state }}\"\n scan_interval: 60\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\nrest_command:\n pve_update:\n url: https://pve.local:8008/api/system/pve-update/run\n method: POST\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\n # Start VM 100 (works for LXC too — same endpoint)\n vm_100_start:\n url: https://pve.local:8008/api/vms/100/control\n method: POST\n content_type: 'application/json'\n payload: '{\"action\": \"start\"}'\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\n # Backup VM 100 to the 'pbs-main' storage\n vm_100_backup:\n url: https://pve.local:8008/api/vms/100/backup\n method: POST\n content_type: 'application/json'\n payload: '{\"storage\": \"pbs-main\", \"mode\": \"snapshot\", \"compress\": \"zstd\"}'\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"" + }, + "health": { + "heading": "Moniteur de santé", + "rows": [ + { + "endpoint": "/api/health", + "method": "GET", + "use": "Sonde légère renvoyant JSON avec status, timestamp et version. Adaptée aux contrôles par mot-clé d’Uptime Kuma ; avec authentification active, le client doit envoyer l’en-tête Bearer." + }, + { + "endpoint": "/api/health/status", + "method": "GET", + "use": "État global : un niveau de gravité et un résumé." + }, + { + "endpoint": "/api/health/details", + "method": "GET", + "use": "Les dix catégories avec état et données structurées de chaque contrôle." + }, + { + "endpoint": "/api/health/full", + "method": "GET", + "use": "Données complètes : catégories, erreurs actives, alertes rejetées et réglages de suppression. Utilise les résultats en arrière-plan de moins de six minutes ; sinon, ou en cas d’actualisation forcée, lance un nouveau contrôle." + }, + { + "endpoint": "/api/health/active-errors", + "method": "GET", + "use": "Liste active, filtrée par ?category=<name>." + }, + { + "endpoint": "/api/health/dismissed", + "method": "GET", + "use": "Alertes rejetées avec les heures de suppression restantes." + }, + { + "endpoint": "/api/health/settings", + "method": "GET", + "use": "Durée de suppression configurée pour chaque catégorie." + }, + { + "endpoint": "/api/health/remote-storages", + "method": "GET", + "use": "Inventaire des stockages à distance définis par Proxmox, avec état en ligne." + }, + { + "endpoint": "/api/health/interfaces", + "method": "GET", + "use": "Interfaces réseau avec type (pont / agrégat / physique), IP et débit du lien." + }, + { + "endpoint": "/api/health/acknowledge", + "method": "POST", + "use": "Corps : '{'\"error_key\":\"smart_sdh\"'}'. Supprime une alerte pendant la durée configurée pour sa catégorie." + }, + { + "endpoint": "/api/health/cleanup-orphans", + "method": "POST", + "use": "Nettoyage manuel des erreurs de périphériques ou VM supprimés. Idempotent." + } + ], + "outro": "Les formats de réponse et les catégories sont décrits dans Health Monitor." + }, + "storage": { + "heading": "Stockage", + "rows": [ + { + "endpoint": "/api/storage", + "method": "GET", + "use": "Disques visibles par l’hôte : périphériques blocs, pools ZFS et LVM." + }, + { + "endpoint": "/api/storage/summary", + "method": "GET", + "use": "Résumé compact utilisé par les cartes de tableau de bord." + }, + { + "endpoint": "/api/proxmox-storage", + "method": "GET", + "use": "Stockages définis par Proxmox de /etc/pve/storage.cfg avec état en ligne et espace libre." + }, + { + "endpoint": "/api/storage/observations", + "method": "GET", + "use": "Historique persistant : avertissements SMART, erreurs d’E/S et événements ZFS. Conservé après la résolution automatique des alertes." + }, + { + "endpoint": "/api/storage/smart/", + "method": "GET", + "use": "Attributs actuels SMART pour un disque." + }, + { + "endpoint": "/api/storage/smart//latest", + "method": "GET", + "use": "Le plus récent auto-test SMART pour le disque." + }, + { + "endpoint": "/api/storage/smart//history", + "method": "GET", + "use": "Liste des rapports SMART stockés pour le disque." + }, + { + "endpoint": "/api/storage/smart//history/", + "method": "GET", + "use": "Lit un rapport SMART enregistré précis." + }, + { + "endpoint": "/api/storage/smart//test", + "method": "POST", + "use": "Lance un autotest SMART. Schéma du corps : '{'\"type\":\"short\"|\"long\"'}'." + }, + { + "endpoint": "/api/storage/smart/schedules", + "method": "GET", + "use": "Énumérez les tests SMART actuellement prévus." + }, + { + "endpoint": "/api/storage/smart/tools", + "method": "GET", + "use": "Vérifie si smartctl et les outils associés sont installés." + } + ] + }, + "network": { + "heading": "Réseau", + "rows": [ + { + "endpoint": "/api/network", + "method": "GET", + "use": "Toutes les interfaces avec état du lien et adresses." + }, + { + "endpoint": "/api/network/summary", + "method": "GET", + "use": "Vue compacte utilisée par le tableau de bord." + }, + { + "endpoint": "/api/network//metrics", + "method": "GET", + "use": "RX/TX par interface, compteurs d’erreurs et séries temporelles RRD." + }, + { + "endpoint": "/api/network/latency/current", + "method": "GET", + "use": "Dernière mesure de latence vers la passerelle." + }, + { + "endpoint": "/api/network/latency/history", + "method": "GET", + "use": "Série chronologique de latence de passerelle." + } + ] + }, + "vms": { + "heading": "Machines virtuelles et conteneurs", + "rows": [ + { + "endpoint": "/api/vms", + "method": "GET", + "use": "VM et CT du nœud local avec état, vmid et nom." + }, + { + "endpoint": "/api/vms/", + "method": "GET", + "use": "Détail complet pour un invité (config, réseau, disques)." + }, + { + "endpoint": "/api/vms//metrics", + "method": "GET", + "use": "Séries temporelles CPU, mémoire et E/S disque d’un invité (RRD)." + }, + { + "endpoint": "/api/vms//logs", + "method": "GET", + "use": "Journaux des tâches récentes de cet invité." + }, + { + "endpoint": "/api/vms//backups", + "method": "GET", + "use": "Sauvegardes conservées pour cet invité." + }, + { + "endpoint": "/api/vms//control", + "method": "POST", + "use": "Choisissez une action du schéma : '{'\"action\":\"start|stop|reboot|shutdown\"'}'. Contrôle l’alimentation de l’invité." + }, + { + "endpoint": "/api/vms//backup", + "method": "POST", + "use": "Lance vzdump pour l’invité. Le corps choisit le stockage et le mode (snapshot / suspend / stop)." + }, + { + "endpoint": "/api/vms//config", + "method": "PUT", + "use": "Modifie la description (notes) d’une VM ou d’un CT. Les autres paramètres de configuration ne sont pas modifiables par ce point d’accès." + }, + { + "endpoint": "/api/node/metrics", + "method": "GET", + "use": "Métriques agrégées du nœud en séries RRD." + } + ] + }, + "backups": { + "heading": "Sauvegardes", + "rows": [ + { + "endpoint": "/api/backups", + "method": "GET", + "use": "Sauvegardes trouvées dans les stockages dir, NFS, CIFS et PBS interrogés via le nœud local. Aucun parcours exhaustif de tous les nœuds du cluster." + }, + { + "endpoint": "/api/backup-storages", + "method": "GET", + "use": "Stockages marqués comme cibles de sauvegarde, avec espace libre." + } + ] + }, + "logs": { + "heading": "Journaux, tâches, événements", + "rows": [ + { + "endpoint": "/api/logs", + "method": "GET", + "use": "Entrées de journaux filtrées. Demande: ?level=&service=&limit=." + }, + { + "endpoint": "/api/logs/download", + "method": "GET", + "use": "Exporte la plage filtrée en texte brut." + }, + { + "endpoint": "/api/events", + "method": "GET", + "use": "Flux d'événements internes — le même qui alimente les notifications." + }, + { + "endpoint": "/api/task-log/", + "method": "GET", + "use": "Journal complet en texte brut d’une tâche Proxmox identifiée par UPID." + } + ] + }, + "notifications": { + "heading": "Notifications et IA", + "intro": "L’envoi, les canaux et la reformulation par IA sont décrits dans Notifications et Assistant IA.", + "rows": [ + { + "endpoint": "/api/notifications", + "method": "GET", + "use": "Notifications récentes affichées dans le tableau de bord." + }, + { + "endpoint": "/api/notifications/download", + "method": "GET", + "use": "Exporte les notifications en texte." + }, + { + "endpoint": "/api/notifications/status", + "method": "GET", + "use": "État de l’envoi : processus en arrière-plan actif, longueur de file et dernier envoi." + }, + { + "endpoint": "/api/notifications/settings", + "method": "GET", + "use": "Lit la configuration des notifications : canaux, réglages par événement, reformulation IA et nom affiché." + }, + { + "endpoint": "/api/notifications/history", + "method": "GET", + "use": "Historique d’envoi. Paramètres : ?limit=&offset=&severity=&channel=." + }, + { + "endpoint": "/api/notifications/history", + "method": "DELETE", + "use": "Vide la table de l’historique d’envoi." + }, + { + "endpoint": "/api/notifications/test", + "method": "POST", + "use": "Envoie une notification de test à un canal. Corps : '{'\"channel\":\"telegram\"'}'." + }, + { + "endpoint": "/api/notifications/send", + "method": "POST", + "use": "Émet un événement personnalisé. Corps : '{'\"event_type\":\"custom\",\"severity\":\"WARNING\",\"title\":\"...\",\"body\":\"...\",\"data\":'{''}''}'." + }, + { + "endpoint": "/api/notifications/test-ai", + "method": "POST", + "use": "Teste la connexion au fournisseur d’IA. Champs du corps (schéma) : '{'\"provider\",\"api_key\",\"model\",\"ollama_url?\"'}'." + }, + { + "endpoint": "/api/notifications/provider-models", + "method": "POST", + "use": "Liste des modèles disponibles pour le fournisseur d'IA sélectionné." + }, + { + "endpoint": "/api/notifications/proxmox/setup-webhook", + "method": "POST", + "use": "Enregistrer le moniteur comme cible webhook dans /etc/pve/notifications.cfg." + }, + { + "endpoint": "/api/notifications/proxmox/cleanup-webhook", + "method": "POST", + "use": "Supprimer la cible Monitor de la configuration de notification de PVE." + }, + { + "endpoint": "/api/notifications/proxmox/read-cfg", + "method": "GET", + "use": "Lisez le notifications.cfg actuel de PVE comme PVE le voit." + } + ] + }, + "security": { + "heading": "Sécurité (lecture)", + "rows": [ + { + "endpoint": "/api/security/firewall/status", + "method": "GET", + "use": "État du pare-feu PVE et règles actives." + }, + { + "endpoint": "/api/security/fail2ban/details", + "method": "GET", + "use": "État du jail Fail2Ban ; nécessite ce composant facultatif installé." + }, + { + "endpoint": "/api/security/fail2ban/activity", + "method": "GET", + "use": "Événements Fail2Ban récents : blocages, déblocages et démarrages du jail." + }, + { + "endpoint": "/api/security/lynis/status", + "method": "GET", + "use": "État de Lynis : installation et date de la dernière analyse." + }, + { + "endpoint": "/api/security/lynis/report", + "method": "GET", + "use": "Dernier rapport Lynis : avertissements, suggestions et indice de durcissement." + }, + { + "endpoint": "/api/security/tools", + "method": "GET", + "use": "Détectez quels outils de sécurité optionnels (Fail2Ban, Lynis) sont installés." + } + ] + }, + "proxmenuxIntegration": { + "heading": "Intégration ProxMenux", + "rows": [ + { + "endpoint": "/api/proxmenux/update-status", + "method": "GET", + "use": "Disponibilité d’une mise à jour ProxMenux Monitor, version installée et dernière version." + }, + { + "endpoint": "/api/proxmenux/installed-tools", + "method": "GET", + "use": "Liste de chaque optimisation de ProxMenux après l'installation actuellement enregistrée sur l'hôte (à partir de /usr/local/share/proxmenux/installed_tools.json)." + }, + { + "endpoint": "/api/proxmenux/tool-source/", + "method": "GET", + "use": "Code de la fonction de post-installation associée, extrait des scripts actuels de l’hôte ou d’ancien code conservé. Ce n’est pas un instantané garanti du code initialement exécuté." + } + ] + }, + "prometheus": { + "heading": "Métriques Prometheus", + "intro": "Le point d’accès authentifié GET /api/prometheus renvoie le format texte Prometheus 0.0.4. Chaque métrique inclut node=\"<hostname>\" et un horodatage explicite. Collectez-les avec Prometheus ou une base temporelle compatible.", + "exportedTitle": "Mesures exportées", + "headerGroup": "Groupe", + "headerMetric": "Métrique", + "headerDesc": "Description", + "groups": [ + { + "group": "Système", + "metrics": [ + { + "metric": "proxmox_cpu_usage", + "desc": "Pourcentage d’utilisation CPU, de type gauge." + }, + { + "metric": "proxmox_memory_total_bytes", + "desc": "Mémoire physique totale en octets." + }, + { + "metric": "proxmox_memory_used_bytes", + "desc": "Mémoire utilisée en octets." + }, + { + "metric": "proxmox_memory_usage_percent", + "desc": "Pourcentage d'utilisation de la mémoire." + }, + { + "metric": "proxmox_load_average", + "desc": "Moyenne de la charge du système. Étiquette period=\"1m\" | \"5m\" | \"15m\"." + } + ] + }, + { + "group": "Durée de fonctionnement", + "metrics": [ + { + "metric": "proxmox_uptime_seconds", + "desc": "Secondes depuis le dernier démarrage." + } + ] + }, + { + "group": "Matériel", + "metrics": [ + { + "metric": "proxmox_cpu_temperature_celsius", + "desc": "Température du boîtier du CPU." + }, + { + "metric": "proxmox_disk_temperature_celsius", + "desc": "Température par disque. Étiquette disk." + }, + { + "metric": "proxmox_fan_speed_rpm", + "desc": "Vitesses des ventilateurs. Étiquette fan." + } + ] + }, + { + "group": "Espace disque", + "metrics": [ + { + "metric": "proxmox_disk_total_bytes", + "desc": "Capacité totale de chaque entrée de disque exportée. Étiquette disk." + }, + { + "metric": "proxmox_disk_used_bytes", + "desc": "Capacité utilisée de chaque entrée de disque exportée." + }, + { + "metric": "proxmox_disk_usage_percent", + "desc": "Pourcentage utilisé de chaque entrée de disque exportée." + } + ] + }, + { + "group": "Réseau", + "metrics": [ + { + "metric": "proxmox_network_bytes_sent_total", + "desc": "Total des octets envoyés, de type counter." + }, + { + "metric": "proxmox_network_bytes_received_total", + "desc": "Total des octets reçus, de type counter." + }, + { + "metric": "proxmox_interface_bytes_sent_total", + "desc": "Octets envoyés par interface. Étiquette interface." + }, + { + "metric": "proxmox_interface_bytes_received_total", + "desc": "Octets reçus par interface." + } + ] + }, + { + "group": "VMs / CTs", + "metrics": [ + { + "metric": "proxmox_vms_total", + "desc": "Nombre total de VM et de LXC." + }, + { + "metric": "proxmox_vms_running", + "desc": "Nombre d’invités en cours d’exécution." + }, + { + "metric": "proxmox_vms_stopped", + "desc": "Nombre d’invités arrêtés." + }, + { + "metric": "proxmox_vm_status", + "desc": "État par VM/CT : 1 en cours d’exécution, 0 sinon. Étiquettes node, vmid et name." + }, + { + "metric": "proxmox_vm_cpu_usage", + "desc": "Utilisation CPU par VM/CT, avec les mêmes étiquettes." + }, + { + "metric": "proxmox_vm_memory_used_bytes / _max_bytes", + "desc": "Mémoire utilisée et maximum configuré par VM/CT." + } + ] + }, + { + "group": "GPU", + "metrics": [ + { + "metric": "proxmox_gpu_temperature_celsius", + "desc": "Température GPU. Étiquettes slot et vendor ; gpu contient aussi le nom du GPU." + }, + { + "metric": "proxmox_gpu_utilization_percent", + "desc": "Pourcentage d’utilisation du GPU." + }, + { + "metric": "proxmox_gpu_memory_total_bytes", + "desc": "Mémoire totale du GPU." + }, + { + "metric": "proxmox_gpu_power_draw_watts", + "desc": "Puissance consommée par le GPU en watts." + }, + { + "metric": "proxmox_gpu_clock_speed_mhz", + "desc": "Fréquence du cœur du GPU." + }, + { + "metric": "proxmox_gpu_memory_clock_mhz", + "desc": "Fréquence de la mémoire du GPU." + } + ] + }, + { + "group": "UPS", + "metrics": [ + { + "metric": "proxmox_ups_battery_charge_percent", + "desc": "Pourcentage de charge de la batterie." + }, + { + "metric": "proxmox_ups_load_percent", + "desc": "Charge courante sur l'UPS." + }, + { + "metric": "proxmox_ups_runtime_seconds", + "desc": "Autonomie estimée sur batterie." + }, + { + "metric": "proxmox_ups_input_voltage_volts", + "desc": "Tension d'entrée." + } + ] + } + ], + "scrapeTitle": "Configuration de collecte Prometheus", + "scrapeIntro": "Avec l’authentification active, ajoutez un jeton API à l’en-tête Bearer de la configuration de collecte Prometheus :", + "perHostTitle": "Collecte par hôte", + "perHostBody": "Chaque instance exporte les métriques de son hôte. Dans un cluster, configurez Prometheus pour collecter chaque nœud. L’étiquette node distingue les séries dans Grafana (proxmox_vms_running'{'node=\"pve01\"'}')." + }, + "puttingItTogether": { + "heading": "Assembler les intégrations", + "body": "Voir Intégrations pour relier ces points d’accès aux capteurs Home Assistant, cartes Homepage, tableaux Grafana, flux n8n et autres outils. La page fournit les configurations habituelles à copier. Cette page-ci présente le catalogue des points d’accès." + }, + "whereNext": { + "heading": "Pour continuer", + "items": [ + { + "label": "Accès et authentification", + "href": "/docs/monitor/access-auth", + "tail": " — création de jetons, journal d’audit, jail Fail2Ban facultatif et TLS." + }, + { + "label": "Notifications", + "href": "/docs/monitor/notifications", + "tailRich": " — contenu de data par événement lors d’un appel à /api/notifications/send." + }, + { + "label": "Assistant IA", + "href": "/docs/monitor/ai-assistant", + "tailRich": " — fonctionnement de /api/notifications/test-ai et /api/notifications/provider-models." + }, + { + "label": "Moniteur de santé", + "href": "/docs/monitor/health-monitor", + "tailRich": " — format de réponse de /api/health/* et sens des dix catégories." + } + ] + } +} diff --git a/web/messages/fr/docs/monitor/architecture.json b/web/messages/fr/docs/monitor/architecture.json new file mode 100644 index 00000000..8c3b92ec --- /dev/null +++ b/web/messages/fr/docs/monitor/architecture.json @@ -0,0 +1,303 @@ +{ + "meta": { + "title": "Architecture de ProxMenux Monitor — AppImage, Flask, SQLite, WebSocket | ProxMenux", + "description": "Construction de ProxMenux Monitor : structure AppImage, blueprints Flask, tâches en arrière-plan, données psutil, pvesh, smartctl et journalctl, stockage SQLite, terminal WebSocket, fournisseurs d’IA, canaux de notification, proxy inverse et Fail2Ban facultatif.", + "ogTitle": "Architecture ProxMenux Monitor", + "ogDescription": "Dans ProxMenux Monitor : AppImage, blueprints Flask, tâches en arrière-plan, SQLite, WebSocket, fournisseurs d’IA et canaux de notification.", + "twitterTitle": "Architecture ProxMenux Monitor", + "twitterDescription": "AppImage, Flask, SQLite, WebSocket, fournisseurs d'IA et canaux de notification — à l'intérieur du moniteur." + }, + "header": { + "title": "Architecture", + "description": "Comment ProxMenux Monitor est distribué, ce que contient l’AppImage et comment les requêtes du navigateur traversent Flask jusqu’aux outils de l’hôte et au stockage SQLite.", + "section": "ProxMenux Monitor" + }, + "intro": { + "title": "Un processus, de nombreuses responsabilités", + "body": "Un processus Python écoute sur TCP 8008. Il sert la version statique Next.js, expose l’API REST, gère le terminal WebSocket, exécute Health Monitor et envoie les notifications. Il ne nécessite ni serveur web distinct, ni courtier de messages, ni base externe." + }, + "requestFlow": { + "heading": "Parcours d’une requête", + "intro": "Une requête de données typique suit ce parcours ; les préférences du navigateur peuvent être traitées localement :", + "diagramCaption": "Les routes protégées valident JWT si l’authentification est active. Les routes centrales et blueprints renvoient des données en cache ou fraîchement collectées. Le contrôle Fail2Ban facultatif consulte sa liste de blocage en cache. Les en-têtes IP transférés sont acceptés uniquement avec PROXMENUX_TRUST_PROXY=1 ; sinon, l’adresse du pair est utilisée. L’état persistant comprend SQLite et des fichiers JSON comme auth.json.", + "diagramArrowLabel": "HTTP / WS", + "nodes": { + "clientLabel": "Client", + "clientDetail": "Navigateur ou PWA\n+ proxy facultatif\nNginx / Caddy /\nTraefik", + "flaskLabel": "Flask :8008", + "flaskDetail": "Blueprints\nMiddleware JWT\nContrôle Fail2Ban\n(si installé)", + "hostLabel": "Outils de l’hôte", + "hostDetail": "psutil\npvesh\nsmartctl\njournalctl", + "stateLabel": "État local", + "stateDetail": "SQLite DB\n+ auth.json" + }, + "threadsIntro": "Le processus exécute aussi des threads en arrière-plan. Ces exemples collectent les données, actualisent les caches et SQLite et envoient les notifications. D’autres tâches existent ; l’envoi doit être activé :", + "headerThread": "Fil", + "headerCadence": "Cadence", + "headerJob": "Tâche planifiée", + "rows": [ + { + "thread": "_temperature_collector_loop", + "cadence": "60 s", + "job": "Enregistre température CPU et mesures de latence dans la base d’historique pour alimenter les graphiques même sans navigateur connecté." + }, + { + "thread": "_health_collector_loop", + "cadence": "5 min", + "job": "Exécute le cycle Health Monitor des dix catégories, conserve erreurs et observations de disque, tient compte des rejets et transmet les nouveaux événements au moteur de notification." + }, + { + "thread": "_vital_signs_sampler", + "cadence": "CPU 5 s ; température 15 s ; mémoire 30 s", + "job": "Échantillonne CPU, mémoire et température CPU pour les indicateurs et la détection de conditions prolongées, indépendamment du contrôle global de cinq minutes." + }, + { + "thread": "notification_manager.start()", + "cadence": "événementiel", + "job": "Démarre les observateurs du journal, des tâches et des hooks (JournalWatcher, TaskWatcher, ProxmoxHookWatcher) et envoie aux canaux configurés, avec reformulation IA facultative." + } + ] + }, + "systemd": { + "heading": "Unité systemd", + "intro": "L’installateur crée l’unité /etc/systemd/system/proxmenux-monitor.service. Configuration par défaut :", + "items": [ + "User=root : le service utilise les privilèges root pour SMART, pvesh et la gestion ZFS. Les processus du terminal web héritent de ces droits.", + "Restart=on-failure avec attente de dix secondes : le service redémarre automatiquement après un échec.", + "After=network.target : ordonne le démarrage après cette cible ; ne garantit ni adresse IP, ni DNS, ni connexion externe." + ], + "inspectTitle": "Inspecter l’unité actuelle" + }, + "appimage": { + "heading": "Contenu de l’AppImage", + "intro": "L’AppImage contient un système de fichiers monté à l’exécution. AppRun à sa racine prépare l’environnement et lance flask_server.py :", + "consequencesIntro": "Deux conséquences de cette disposition :", + "consequences": [ + "Environnement Python fourni. Interpréteur et paquets sont dans l’AppImage, sans installation dans le Python système. L’application utilise toujours les interfaces du noyau et les outils externes de l’hôte.", + "Clients matériels inclus. L’AppImage fournit ipmitool, lm-sensors et upsc. Les mesures dépendent du matériel compatible, de l’accès aux capteurs et, pour l’onduleur, d’un serveur NUT configuré." + ] + }, + "flask": { + "heading": "Structure de l’application Flask", + "intro": "flask_server.py crée une instance Flask(__name__) avec CORS limité, enregistre directement neuf blueprints et initialise le terminal. Le tableau montre les modules principaux ; audit, sauvegarde VM et PBS sont aussi enregistrés. Les préchargements PVE ne tournent que sur les hôtes PVE.", + "headerBlueprint": "Blueprint / module", + "headerPrefix": "Préfixe des itinéraires", + "headerOwns": "Responsabilité", + "rows": [ + { + "blueprint": "flask_server.py", + "prefix": [ + "/api/system", + "/api/storage", + "/api/network", + "/api/vms", + "/api/hardware", + "/api/logs", + "/api/prometheus" + ], + "owns": "Points d’accès centraux, web statique et contrôle Fail2Ban facultatif si le jail proxmenux existe sur l’hôte." + }, + { + "blueprint": "flask_auth_routes.py", + "prefix": [ + "/api/auth/*" + ], + "owns": "Connexion, émission JWT, configuration et vérification TOTP, changement de mot de passe et jetons API." + }, + { + "blueprint": "flask_health_routes.py", + "prefix": [ + "/api/health/*" + ], + "owns": "Sondes d’état, détails, erreurs actives et rejetées et réglages de suppression. Les routes protégées exigent l’authentification lorsqu’elle est active." + }, + { + "blueprint": "flask_terminal_routes.py", + "prefix": [ + "/api/terminal/* + WS" + ], + "owns": "Alloue un PTY par session et le relie par WebSocket à xterm.js dans le navigateur." + }, + { + "blueprint": "flask_notification_routes.py", + "prefix": [ + "/api/notifications/*" + ], + "owns": "Créer, consulter, modifier et supprimer les canaux ; tests, IA, historique et envois manuels." + }, + { + "blueprint": "flask_security_routes.py", + "prefix": [ + "/api/security/*" + ], + "owns": "Échecs de connexion et, avec Fail2Ban installé, état du jail, blocages et déblocage manuel." + }, + { + "blueprint": "flask_proxmenux_routes.py", + "prefix": [ + "/api/proxmenux/*" + ], + "owns": "Lit les optimisations ProxMenux enregistrées sur l’hôte." + }, + { + "blueprint": "flask_oci_routes.py", + "prefix": [ + "/api/oci/*" + ], + "owns": "Fonctions de déploiement d’applications OCI et conteneurs sur Proxmox VE 9.1+." + } + ], + "endpointsLink": "Les points d’accès d’intégration et leurs formats sont décrits dans Référence de l’API." + }, + "dataSources": { + "heading": "Sources des données", + "intro": "Les données de l’hôte viennent surtout de bibliothèques standard, fichiers et commandes d’administration. Certaines données des invités dépendent aussi du QEMU Guest Agent ou de commandes dans un CT :", + "headerSource": "Source", + "headerUsedFor": "Utilisé pour", + "rows": [ + { + "source": "psutil", + "usedFor": "Charge CPU, mémoire, swap, occupation des montages, compteurs réseau et processus." + }, + { + "source": "pvesh / qm / pct", + "usedFor": "Informations du nœud Proxmox, inventaire et configuration VM/CT, stockage et historique des tâches." + }, + { + "source": "smartctl", + "usedFor": "Attributs SATA/NVMe, état SMART, usure, durée de vie, modèle et numéro de série." + }, + { + "source": "zpool / zfs", + "usedFor": "État du pool (ONLINE / DEGRADED / FAULTED / UNAVAIL), progression du scrub et utilisation des datasets." + }, + { + "source": "journalctl", + "usedFor": "Journaux système, processus arrêtés par OOM, erreurs ATA/NVMe/dm, sécurité et unités de service personnalisées." + }, + { + "source": "ip / iproute2", + "usedFor": "Interfaces, adresses, ponts, agrégats de liens et périphériques gérés par OVS." + }, + { + "source": "nvidia-smi · intel_gpu_top", + "usedFor": "Données GPU disponibles : utilisation, VRAM, température et encodage/décodage. Les champs dépendent du fabricant, de l’outil et du pilote." + }, + { + "source": "lspci · lscpu · dmidecode", + "usedFor": "Topologie PCIe, modèle et topologie CPU, carte mère et BIOS." + }, + { + "source": "ipmitool · sensors", + "usedFor": "Capteurs hors bande, ventilateurs et températures de la carte mère, si le matériel le permet." + }, + { + "source": "upsc (NUT)", + "usedFor": "État de batterie, charge et autonomie de l’onduleur avec un serveur NUT configuré." + } + ], + "cacheTitle": "Des caches réduisent les requêtes à l’hôte", + "cacheBody": "Les résultats coûteux de smartctl -a et pvesh get sont temporairement conservés dans Flask pour réduire les appels aux disques et à l’API du cluster. La durée dépend de la source : secondes pour les métriques et minutes pour SMART." + }, + "persistence": { + "heading": "Persistance", + "intro": "Plusieurs fichiers d’état ont des contenus et des besoins d’accès différents :", + "headerPath": "Path", + "headerOwner": "Propriétaire", + "headerContents": "Contenu", + "rows": [ + { + "path": "/usr/local/share/proxmenux/health_monitor.db", + "owner": "root:root", + "contents": "Base SQLite. Tables : errors, events, disk_registry, disk_observations, user_settings, notification_history, excluded_storages, excluded_interfaces. Journal en mode WAL." + }, + { + "path": "/usr/local/share/proxmenux/.notification_key", + "owner": "root 0600", + "contents": "Clé maîtresse de 32 octets pour les secrets de notification ENC2. Utilise un sel aléatoire par valeur, des clés dérivées et un MAC. Les anciennes valeurs XOR sont prises en charge pour migration." + }, + { + "path": "/root/.config/proxmenux-monitor/auth.json", + "owner": "root:root", + "contents": "Configuration d’accès : activation, identifiant, hachage PBKDF2-HMAC-SHA256 salé du mot de passe, secret TOTP, codes de secours, clé JWT propre à l’installation, métadonnées des jetons API et empreintes de révocation. Les anciens hachages SHA-256 migrent à la connexion réussie." + }, + { + "path": "/var/log/proxmenux-auth.log", + "owner": "root:root", + "contents": "Journal d’authentification en texte brut, indépendant de Fail2Ban. Si le jail [proxmenux] est installé et actif, il le lit pour détecter les échecs répétés. Sans ce jail, le journal reste consultable." + } + ], + "backupTitle": "Sauvegarder auth.json avant réinstallation", + "backupBody": "Remplacer l’AppImage conserve normalement /root/.config/proxmenux-monitor/auth.json et /usr/local/share/proxmenux/health_monitor.db. Gardez auth.json avec son jwt_secret pour préserver validité et métadonnées des jetons. La base conserve séparément état et notifications. Sauvegardez .notification_key avec elle pour restaurer les secrets des canaux ; la base seule ne restaure pas l’authentification API." + }, + "health": { + "heading": "Cycle Health Monitor", + "intro": "Environ toutes les cinq minutes, le collecteur appelle health_monitor.py pour les contrôles des dix catégories du tableau de bord :", + "items": [ + "Services PVE critiques (pveproxy, pvedaemon, pvestatd, pve-cluster).", + "Stockages Proxmox : pvesh get /storage et disponibilité de chacun.", + "Disques et systèmes de fichiers : SMART, erreurs d’E/S dans dmesg, état ZFS et capacité des montages.", + "VM et CT : échecs de démarrage, arrêts inattendus, erreurs QMP et échecs d’arrêt.", + "Réseau : état des ponts et agrégats, liens et latence vers la passerelle.", + "Mises à jour : paquets en attente et correctifs de sécurité.", + "Journaux : motifs persistants, pics et cascades dans le journal système.", + "Mémoire : interventions de l’OOM killer et pression mémoire prolongée.", + "Température : mesures CPU et disques comparées aux seuils de surveillance ; les capteurs disponibles dépendent du matériel.", + "Sécurité : échecs de connexion, blocages et état du jail Fail2Ban." + ], + "afterIntro": "Les constats utilisent error_key, catégorie et gravité stables. Les lignes d’errors sont mises à jour avec last_seen et le compteur, sans duplication. L’envoi a aussi ses propres empreintes et temporisations.", + "cycleEnd": "Le nettoyage peut résoudre les erreurs anciennes selon la durée de suppression par catégorie et des règles d’état, retirer les entrées orphelines des ressources supprimées et purger events après 30 jours. Voir Tableau de bord → Health Monitor pour les catégories." + }, + "notifications": { + "heading": "Moteur de notifications", + "intro": "notification_manager.py coordonne l’envoi : charge les canaux, gère la file et fournit une API Python pour Flask et Health Monitor ainsi qu’une entrée CLI pour les hooks .sh de ProxMenux.", + "items": [ + "Les observateurs produisent les événements : JournalWatcher suit le journal, TaskWatcher interroge les tâches Proxmox, ProxmoxHookWatcher reçoit les hooks de sauvegarde, réplication et snapshots, et PollingCollector gère les sources lentes.", + "Les modèles transforment les événements en titre et texte. Le fournisseur d’IA configuré (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter) peut les reformuler en langage courant. Les deux versions sont conservées dans notification_history.", + "Les canaux envoient par des services dont Telegram, Discord, courriel, Gotify, Pushover et Apprise. Les implémentations de notification_channels.py partagent l’interface create_channel() / send().", + "Chiffrement. Les réglages sensibles (telegram.bot_token, discord.webhook_url, pushover.user_key, pushover.api_token, ai_api_key_*, email.password) sont chiffrés avec la clé de .notification_key avant stockage et masqués dans l’interface." + ], + "linksFooter": "Les réglages par événement, options des canaux et IA sont décrits dans Paramètres → Notifications et Paramètres → Assistant IA." + }, + "websocket": { + "heading": "Terminal WebSocket", + "intro": "L’onglet Terminal relie un client léger xterm.js à un PTY du serveur via WebSocket. Deux modes existent :", + "items": [ + "Mode HTTP, par défaut : le serveur Flask intégré et flask-sock gèrent le passage au protocole WebSocket.", + "Mode HTTPS / WSS : utilise gevent.pywsgi.WSGIServer avec geventwebsocket.handler.WebSocketHandler pour WebSocket sur TLS." + ], + "outro": "Les processus du terminal héritent de User=root. Avec authentification active, WebSocket exige un ticket bref à usage unique obtenu par le point d’accès authentifié avec droits administratifs. Si l’authentification est désactivée ou refusée, la connexion suit ce mode sans authentification.", + "proxyNote": "Avec un proxy inverse, autorisez WebSocket et ses en-têtes Upgrade et Connection. Le terminal a besoin de ce transfert." + }, + "proxy": { + "heading": "Proxy inverse et Fail2Ban", + "intro": "Le choix de l’IP client et le blocage applicatif facultatif dépendent de ces réglages et composants :", + "items": [ + "Choix de l’IP client. Le contrôle before_request et le journal d’accès acceptent X-Forwarded-For, puis X-Real-IP, uniquement avec PROXMENUX_TRUST_PROXY=1. Sinon, ils utilisent request.remote_addr. Les en-têtes transférés ne sont pas acceptés automatiquement.", + "Fail2Ban applicatif facultatif. Une connexion proxy peut présenter l’IP du proxy comme pair TCP. Avec l’adresse client fiable et le jail proxmenux actif, Flask refuse les IP bloquées par HTTP 403. La liste est conservée 30 secondes puis actualisée lors du traitement d’une requête, sans temporisateur dédié." + ], + "calloutTitle": "Fail2Ban n’est pas inclus", + "calloutBody": "Fail2Ban n’est pas inclus ni installé automatiquement. Il peut être installé depuis Sécurité du Monitor ou Sécurité → Fail2Ban dans ProxMenux Scripts. Sans fail2ban-client ou le jail proxmenux, ce contrôle ne bloque aucune requête. La politique d’authentification configurée reste applicable.", + "outro": "Les exemples Nginx/Caddy/Traefik et le guide du jail sont dans Accès et authentification et Sécurité → Fail2Ban." + }, + "whereNext": { + "heading": "Pour continuer", + "items": [ + { + "label": "Accès et authentification", + "href": "/docs/monitor/access-auth", + "tail": " — premier lancement, mot de passe et TOTP 2FA, exemples de proxy inverse et jail Fail2Ban." + }, + { + "label": "Référence de l’API", + "href": "/docs/monitor/api", + "tail": " — points d’accès d’intégration, gestion des jetons et conventions d’authentification." + }, + { + "label": "Paramètres → ProxMenux Monitor", + "href": "/docs/settings/proxmenux-monitor", + "tail": " — commande du service et vérification de son état dans le menu texte ProxMenux." + } + ] + } +} diff --git a/web/messages/fr/docs/monitor/audit-report/assessment.json b/web/messages/fr/docs/monitor/audit-report/assessment.json new file mode 100644 index 00000000..2d953b1a --- /dev/null +++ b/web/messages/fr/docs/monitor/audit-report/assessment.json @@ -0,0 +1,218 @@ +{ + "meta": { + "title": "Évaluation et inventaire | Audit et rapports", + "description": "Évaluation d'Audit et rapports : profils des rapports, classement des résultats, risques acceptés, sources illisibles, Lynis et inventaire du nœud." + }, + "header": { + "title": "Évaluation et inventaire", + "description": "L'évaluation inspecte le noeud, conserve ses constatations et répond à différentes questions selon le profil du rapport.", + "section": "Audit et rapports" + }, + "sections": [ + { + "id": "read-only", + "blocks": [ + { + "calloutInfo": { + "title": "Une évaluation inspecte; elle ne modifie pas la configuration", + "body": "Il lit la configuration et l'état de l'hôte. Il écrit ses résultats, rapports et journaux, et les vérifications de démarrage peuvent monter des partitions système EFI pour un moment. La configuration qu'elle évalue n'est pas modifiée." + } + }, + { + "p": "Lancer l'évaluation démarre une exécution avec le profil choisi dans Rapport. La vue indique la date de la dernière exécution et le temps écoulé." + } + ] + }, + { + "id": "profiles", + "title": "Profils des rapports", + "intro": "Chaque profil répond à une question différente. Les vérifications et les sections sont sélectionnées avant la composition du document.", + "blocks": [ + { + "table": { + "headers": [ + "Profil", + "Ce qu'il couvre" + ], + "rows": [ + [ + "Audit complet", + "Toutes les vérifications et toute la structure disponible." + ], + [ + "Diagnostic rapide", + "Chaque vérification; le résultat s'ouvre sur les constatations critiques, les avertissements et les lectures qui n'ont pas pu être vérifiées." + ], + [ + "Inventaire", + "Une description du noeud, sans vérification et sans classification." + ], + [ + "Examen de la sécurité", + "Exposition, accès, privilèges, certificats, mises à jour, dépôts et Lynis." + ], + [ + "Assurance de sauvegarde", + "Couverture, âge, résultats, vérification, conservation et récupération des sauvegardes." + ], + [ + "Capacité et usure", + "Marge de croissance, mémoire, utilisation de l'espace et la durée de vie des disques." + ] + ] + } + }, + { + "p": "Le contenu de chaque document est décrit dans Rapports et comparaisons." + } + ] + }, + { + "id": "results", + "title": "La classification des résultats", + "blocks": [ + { + "table": { + "headers": [ + "Classement", + "Signification" + ], + "rows": [ + [ + "Critique", + "Une condition ratée qui a priorité." + ], + [ + "Avertissement", + "Une condition qui nécessite un examen, compte tenu de la preuve ou de la politique." + ], + [ + "Observation", + "Informations sur le noeud qui n'est pas déclaré comme un échec." + ], + [ + "Non vérifié", + "La source nécessaire à la vérification n'a pas pu être lue. Cela ne signifie pas que le problème est absent." + ], + [ + "Conforme", + "La condition répond au critère appliqué." + ], + [ + "Non applicable", + "Rien dans le cadre de la vérification ne s'applique." + ], + [ + "Risque accepté", + "La conclusion existe et une décision à ce sujet a été enregistrée." + ], + [ + "Exclu par la politique", + "La politique déclare que l'élément est exclu du compte." + ] + ] + } + }, + { + "p": "Les résultats peuvent être filtrés par zone : Système, Stockage, Réseau, Sécurité, Sauvegarde, Invités et Matériel. Chaque constatation conserve ses preuves, avec la source à laquelle elle a été lue." + } + ] + }, + { + "id": "unverified", + "title": "Quand une source ne peut pas être lue", + "blocks": [ + { + "table": { + "headers": [ + "Cas", + "Comportement" + ], + "rows": [ + [ + "Non vérifié", + "La vérification conserve son identité, précise dans les preuves quelle source a échoué et ne transforme pas les données manquantes en résultat conforme." + ], + [ + "Preuves incomplètes", + "Le rapport précise la source et l'heure de collecte pour distinguer un problème réel d'une lecture insuffisante." + ], + [ + "Une nouvelle exécution", + "Une fois que l'accès, le paquet ou le service est corrigé, le même profil fonctionne à nouveau et la comparaison montre si le résultat peut être vérifié." + ] + ] + } + } + ] + }, + { + "id": "lynis", + "title": "Lynis", + "blocks": [ + { + "p": "La revue de sécurité utilise le rapport Lynis de l'hôte. Si Lynis n'a jamais été exécuté ou si le rapport dépasse l'ancienneté autorisée par la politique, un dialogue propose Exécuter avec Lynis, qui prend quelques minutes de plus, ou Exécuter sans Lynis, qui utilise le rapport existant." + }, + { + "figure": { + "src": "/monitor/audit/lynis-dialog.png", + "alt": "Boîte de dialogue qui offre d'exécuter l'évaluation avec ou sans Lynis", + "caption": "Le dialogue Lynis avant un examen de sécurité." + } + } + ] + }, + { + "id": "accept", + "title": "Accepter un risque", + "blocks": [ + { + "p": "Accepter le risque consigne une décision sur un constat. Le motif est obligatoire et enregistré avec l'auteur et la date." + }, + { + "table": { + "headers": [ + "Champ", + "Possibilités" + ], + "rows": [ + [ + "Motifs", + "Texte libre requis." + ], + [ + "Cesse de s'appliquer après", + "90 jours, 180 jours, 1 année ou n'expire pas. Lorsque la période prend fin, la constatation devient active à nouveau." + ], + [ + "Me rappeler de la revoir", + "Un rappel qui rappelle la décision pendant qu'elle reste en vigueur." + ] + ] + } + }, + { + "p": "Un constat accepté reste visible avec la décision ; Rendre à nouveau actif révoque cette acceptation. Accepter un risque ne le corrige pas : la comparaison le signale comme accepté, pas comme résolu." + } + ] + }, + { + "id": "inventory", + "title": "Inventaire", + "blocks": [ + { + "list": { + "items": [ + "Identité, version Proxmox VE, noyau, abonnement et cluster.", + "CPU, mémoire, carte, BIOS, contrôleurs et IOMMU.", + "Disques, SMART, heures d'alimentation et événements enregistrés.", + "Adaptateurs, bonds, bridges, latence et connexions.", + "Stockage, invités avec leurs disques et interfaces, et sauvegardes.", + "PCI passthrough et le logiciel ProxMenux gère." + ] + } + } + ] + } + ] +} diff --git a/web/messages/fr/docs/monitor/audit-report/changes.json b/web/messages/fr/docs/monitor/audit-report/changes.json new file mode 100644 index 00000000..705df40f --- /dev/null +++ b/web/messages/fr/docs/monitor/audit-report/changes.json @@ -0,0 +1,208 @@ +{ + "meta": { + "title": "Modifications | Audit et rapports", + "description": "Journal des modifications d'Audit et rapports : changements de ProxMenux sur l'hôte, état précédent, différences et possibilité de les annuler." + }, + "header": { + "title": "Modifications", + "description": "Journal des opérations effectuées par ProxMenux sur l'hôte et, lorsque capturé, de l'état avant et après chacune.", + "section": "Audit et rapports" + }, + "sections": [ + { + "id": "purpose", + "blocks": [ + { + "calloutInfo": { + "title": "Du script exécuté à la modification effectuée", + "body": "Une longue fonction peut ne changer que deux lignes. Le journal conserve chaque opération concrète avec le script, la fonction et la version responsables, la ressource concernée, la différence et la possibilité d'annulation." + } + }, + { + "flow": { + "nodes": [ + { + "label": "Script", + "detail": "fonction + version" + }, + { + "label": "Capture", + "detail": "contenu avant" + }, + { + "label": "Opération", + "detail": "fichier · paquet · service" + }, + { + "label": "Journal", + "detail": "attribution + différence" + } + ], + "caption": "La capture est réalisée lors de l'exécution de l'opération et consolidée quand Monitor lit le journal." + } + }, + { + "figure": { + "src": "/monitor/audit/changes-view.png", + "alt": "Vue Modifications d'Audit et rapports avec les entrées regroupées par option de post-installation et par script", + "caption": "La vue Modifications, avec la différence d'un fichier édité par ProxMenux." + } + } + ] + }, + { + "id": "types", + "title": "Types d'entrées", + "intro": "Le filtre en haut sépare les entrées par type.", + "blocks": [ + { + "table": { + "headers": [ + "Type", + "Ce qu'il enregistre" + ], + "rows": [ + [ + "Configuration", + "ProxMenux a écrit, modifié ou supprimé un fichier, modifié un paramètre ou modifié un service." + ], + [ + "Installations", + "ProxMenux a ajouté un paquet ou un composant, et les paquets qui sont réellement apparus sont enregistrés." + ], + [ + "Exécutions", + "ProxMenux a exécuté une commande ; les changements dépendent de la commande elle-même." + ], + [ + "Appliqué", + "Une fonction a été appliquée avant l'existence du journal ; l'état précédent n'a pas été capturé." + ] + ] + } + } + ] + }, + { + "id": "groups", + "title": "Organisation de la vue", + "blocks": [ + { + "table": { + "headers": [ + "Chapitre", + "Contenu" + ], + "rows": [ + [ + "Optimisations post-installation", + "Regroupées selon l'option de post-installation choisie par l'utilisateur." + ], + [ + "Scripts ProxMenux", + "GPU, Coral, réseau, stockage, sécurité, utilitaires et les autres scripts instrumentés, y compris l'installateur ProxMenux et ProxMenux Monitor." + ], + [ + "Paquets et utilitaires installés", + "Logiciels installés par ProxMenux sur l'hôte." + ] + ] + } + }, + { + "p": "Dans chaque section, Par fonction regroupe les entrées sous la fonction qui les a faites." + } + ] + }, + { + "id": "entry", + "title": "Ce que chaque entrée montre", + "blocks": [ + { + "list": { + "items": [ + "Le script, la fonction et la version responsable.", + "La date et la ressource touchée.", + "L'état connu avant et après le changement.", + "Les lignes ont été ajoutées et supprimées.", + "Les paquets qui ont été effectivement ajoutés.", + "La transition d'état d'un service.", + "Annuler cette modification : Restaure exactement l'état précédent, Supprime le fichier (inexistant auparavant), Le paquet peut être désinstallé, une annulation partielle ou Impossible à annuler depuis le journal." + ] + } + } + ] + }, + { + "id": "before", + "title": "Signification de l'état précédent", + "blocks": [ + { + "p": "L'état précédent peut être un contenu capturé, un fichier créé pour la première fois ou un état inconnu. Les modifications antérieures au journal ne peuvent pas être reconstruites ; relancer la fonction capture d'abord l'état trouvé à ce moment." + } + ] + }, + { + "id": "limits", + "title": "Portée du journal", + "blocks": [ + { + "list": { + "items": [ + "Les modifications manuelles et celles d'autres logiciels ne sont pas enregistrées.", + "Seules les opérations qui passent par les primitives d'audit ProxMenux sont couvertes.", + "L'enregistrement ne bloque jamais l'opération qu'il décrit : si l'entrée ne peut pas être écrite, l'opération continue.", + "Les changements successifs à une ressource sont indiqués comme l'origine connue par rapport à l'état actuel." + ] + } + } + ] + }, + { + "id": "retention", + "title": "Preuves stockées", + "blocks": [ + { + "table": { + "headers": [ + "Élément", + "Comportement" + ], + "rows": [ + [ + "Entrées", + "Ils sont conservés sur l'hôte; rien n'est retiré automatiquement du journal." + ], + [ + "Contenu capturé", + "Un objet capturé est conservé pendant qu'une entrée y fait référence." + ], + [ + "Taille d'une capture", + "Contenu supérieur à 1 MiB n'est pas stocké entier; l'entrée enregistre que la capture a été sautée en raison de sa taille." + ], + [ + "Lecture", + "Le moniteur ne charge pas les objets stockés au-dessus de 2 MiB." + ], + [ + "Différence", + "Au maximum 400 lignes sont affichées ; une différence plus longue est signalée comme tronquée." + ], + [ + "Liste", + "L'API renvoie 200 entrées par requête par défaut, avec un maximum de 1000." + ] + ] + } + }, + { + "calloutWarning": { + "title": "Conserver le contenu n'annule pas automatiquement la modification", + "body": "Le contenu précédent peut être consulté et restauré manuellement, mais la vue Modifications n'annule pas les opérations. Une entrée d'exécution consigne la commande sans connaître tous les effets de l'outil exécuté." + } + } + ] + } + ] +} diff --git a/web/messages/fr/docs/monitor/audit-report/index.json b/web/messages/fr/docs/monitor/audit-report/index.json new file mode 100644 index 00000000..5f1b9e66 --- /dev/null +++ b/web/messages/fr/docs/monitor/audit-report/index.json @@ -0,0 +1,136 @@ +{ + "meta": { + "title": "Audit et rapports | ProxMenux Monitor", + "description": "Évaluez un nœud Proxmox VE, consignez les changements de ProxMenux et déclarez les attentes concernant ses invités et son stockage, avec des rapports imprimables." + }, + "header": { + "title": "Audit et rapports", + "description": "Évaluation du nœud, journal des changements de ProxMenux et déclaration des attentes, avec des documents imprimables ou enregistrables en PDF.", + "section": "ProxMenux Monitor" + }, + "sections": [ + { + "id": "views", + "blocks": [ + { + "calloutInfo": { + "title": "Trois vues, trois questions", + "body": "Audit et rapports distingue les faits du nœud, les interventions de ProxMenux et les attentes déclarées. Une configuration qui ne peut pas être évaluée selon un objectif déclaré est décrite sans être signalée comme une défaillance." + } + }, + { + "cards": { + "items": [ + { + "icon": "shield", + "title": "Évaluation — Comment va le nœud?", + "body": "Exécute les vérifications du profil choisi, compose l'inventaire et classe ce qui a besoin d'attention, avec la preuve de chaque résultat." + }, + { + "icon": "refresh", + "title": "Changements — Qu'a fait ProxMenux?", + "body": "Répertorie les fichiers, paquets, services et commandes modifiés par les scripts ProxMenux instrumentés, avec l'état antérieur lorsqu'il a été capturé." + }, + { + "icon": "fileText", + "title": "Politique — Qu'est - ce qui est attendu?", + "body": "Déclare quels invités nécessitent une sauvegarde ou doivent démarrer avec l'hôte, quel stockage est essentiel et les seuils des vérifications." + } + ] + } + }, + { + "flow": { + "nodes": [ + { + "label": "Évaluation", + "detail": "faits" + }, + { + "label": "Politique", + "detail": "contexte" + }, + { + "label": "Modifications", + "detail": "interventions" + } + ], + "caption": "L'évaluation fournit les faits, la politique leur donne du contexte et le journal consigne les actions de ProxMenux." + } + }, + { + "figure": { + "src": "/monitor/audit/assessment-view.png", + "alt": "Audit et rapports dans ProxMenux Monitor avec les vues Évaluation, Modifications et Politique", + "caption": "Vérification et rapport, la vue d'évaluation étant ouverte." + } + } + ] + }, + { + "id": "boundaries", + "title": "Trois fonctions différentes", + "blocks": [ + { + "table": { + "headers": [ + "Fonction", + "Ce qu'il fait" + ], + "rows": [ + [ + "Surveillance de santé", + "Observe les métriques et les événements en continu et peut déclencher des notifications." + ], + [ + "Audit et rapports", + "Exécute une évaluation à la demande, documente le nœud et compare les exécutions entre elles." + ], + [ + "Journal des modifications", + "Consigne les opérations effectuées par ProxMenux via ses primitives d'audit." + ] + ] + } + } + ] + }, + { + "id": "pages", + "title": "Pages de cette section", + "blocks": [ + { + "next": { + "items": [ + { + "label": "Évaluation et inventaire", + "href": "/docs/monitor/audit-report/assessment", + "tail": "profils, résultats, risques acceptés et inventaire." + }, + { + "label": "Modifications", + "href": "/docs/monitor/audit-report/changes", + "tail": "le journal de ce que ProxMenux a changé sur l'hôte." + }, + { + "label": "Politique", + "href": "/docs/monitor/audit-report/policy", + "tail": "invités, stockage et seuils." + }, + { + "label": "Rapports et comparaisons", + "href": "/docs/monitor/audit-report/reports", + "tail": "les six documents et l'exécution de référence." + }, + { + "label": "Portée et garanties", + "href": "/docs/monitor/audit-report/scope", + "tail": "les sources, les limites et les données stockées." + } + ] + } + } + ] + } + ] +} diff --git a/web/messages/fr/docs/monitor/audit-report/policy.json b/web/messages/fr/docs/monitor/audit-report/policy.json new file mode 100644 index 00000000..264dde50 --- /dev/null +++ b/web/messages/fr/docs/monitor/audit-report/policy.json @@ -0,0 +1,111 @@ +{ + "meta": { + "title": "Politique | Audit et rapports", + "description": "Politique du nœud dans Audit et rapports : sauvegarde, démarrage automatique et objectif de reprise de chaque invité, rôle de chaque stockage et seuils des contrôles." + }, + "header": { + "title": "Politique", + "description": "La politique déclare ce qu'une inspection ne peut déduire : le rôle de chaque invité et stockage et les seuils à appliquer aux vérifications.", + "section": "Audit et rapports" + }, + "sections": [ + { + "id": "principle", + "blocks": [ + { + "calloutInfo": { + "title": "Sans déclaration, le rapport décrit ; avec une déclaration, il évalue", + "body": "Une évaluation voit ce que l'hôte fait, pas ce qu'il est pour. Un invité sans sauvegarde dont le but n'est pas déclaré est signalé comme une observation. Si sa sauvegarde est déclarée nécessaire, la même absence est signalée comme un avertissement. Rien ne doit être déclaré." + } + }, + { + "figure": { + "src": "/monitor/audit/policy-view.png", + "alt": "Vue Politique avec les invités, le stockage et les seuils du nœud", + "caption": "La vue Politique." + } + } + ] + }, + { + "id": "guests", + "title": "Invités", + "intro": "Chaque VM et LXC du nœud comporte trois champs. Une valeur laissée par défaut prend la valeur générale, affichée à côté.", + "blocks": [ + { + "table": { + "headers": [ + "Champ", + "Valeurs", + "Effet sur l'évaluation" + ], + "rows": [ + [ + "Sauvegarde", + "Requis, Non requis, Non indiqué", + "Une sauvegarde manquante est un avertissement quand elle est requise, une observation quand elle n'est pas indiquée, et elle est laissée hors du compte quand elle n'est pas requise." + ], + [ + "Démarrage auto", + "Requis, Non requis, Non indiqué", + "Indique si l'invité doit démarrer avec l'hôte." + ], + [ + "Objectif de reprise", + "Heures", + "L'âge maximum acceptable de la dernière sauvegarde." + ] + ] + } + } + ] + }, + { + "id": "storage", + "title": "Stockage", + "blocks": [ + { + "p": "Un stockage inaccessible est déclaré critique lorsqu'il est déclaré essentiel ou sert un invité en cours d'exécution, comme avertissement lorsque son rôle n'est pas indiqué, et comme observation lorsqu'il est déclaré facultatif." + } + ], + "intro": "Chaque stockage du noeud est déclaré essentiel, facultatif ou non indiqué." + }, + { + "id": "thresholds", + "title": "Seuils", + "intro": "Un seuil vide utilise la valeur par défaut fournie, affichée comme texte indicatif.", + "blocks": [ + { + "list": { + "items": [ + "Vérification de la capacité de stockage (%) et du remplissage du thin pool (%).", + "Ratios de surallocation thin et de surallocation mémoire.", + "Intervalle du scrub ZFS (jours).", + "Limite de repli pour l'ancienneté des sauvegardes (jours) et marge sur le calendrier (ratio).", + "Avis d'expiration du certificat (jours).", + "Durée de vie des disques (heures) et nouvelle fenêtre d'erreur disque (jours).", + "Ancienneté du rapport Lynis (jours) et de l'index des paquets (jours).", + "Occupation du journal par rapport à son plafond (%).", + "Vérification de l'espace (%) et des inodes (%) du système de fichiers." + ] + } + } + ] + }, + { + "id": "save", + "title": "Comment la politique est enregistrée", + "blocks": [ + { + "p": "La déclaration est validée et enregistrée de manière atomique dans /usr/local/share/proxmenux/audit_policy.json. Chaque enregistrement porte une révision : si une autre session a changé la déclaration, le brouillon n'est pas enregistré et la vue propose de recharger la version sauvegardée." + }, + { + "calloutWarning": { + "title": "La politique n'est jamais inférée", + "body": "ProxMenux n'ajoute aucune exigence de lui-même. Un champ vide conserve la valeur par défaut ou reste non déclaré ; une déclaration partielle ne concerne que les éléments qu'elle nomme." + } + } + ] + } + ] +} diff --git a/web/messages/fr/docs/monitor/audit-report/reports.json b/web/messages/fr/docs/monitor/audit-report/reports.json new file mode 100644 index 00000000..bd443546 --- /dev/null +++ b/web/messages/fr/docs/monitor/audit-report/reports.json @@ -0,0 +1,247 @@ +{ + "meta": { + "title": "Rapports et comparaisons | Audit et rapports", + "description": "Les six documents d'Audit et rapports, leur impression ou enregistrement en PDF et la comparaison des exécutions avec une référence." + }, + "header": { + "title": "Rapports et comparaisons", + "description": "Six documents répondant à des questions différentes et la comparaison de chaque exécution avec une référence.", + "section": "Audit et rapports" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "Six documents, pas six styles", + "body": "Le moteur sélectionne les vérifications et les sections avant de composer le document. Un diagnostic rapide n'est pas une vérification complète avec moins de pages, et un inventaire ne présente aucun résultat d'évaluation. Les échantillons ci-dessous utilisent des données fictives." + } + } + ] + }, + { + "id": "documents", + "title": "Les six documents", + "blocks": [ + { + "downloads": { + "items": [ + { + "title": "Audit complet", + "body": "Documente le nœud de bout en bout sous forme de dossier technique.", + "href": "/monitor/audit/sample-audit-full-report.pdf", + "facts": [ + { + "label": "Contrôles", + "value": "Toutes les vérifications disponibles." + }, + { + "label": "Contenu", + "value": "Synthèse ; identité et cluster ; matériel ; réseau et latence ; stockage ; invités ; passthrough ; applications ; constats avec preuves ; sources et portée." + } + ] + }, + { + "title": "Diagnostic rapide", + "body": "Montre ce qui a besoin d'attention sans l'inventaire complet.", + "href": "/monitor/audit/sample-audit-diagnostic-report.pdf", + "facts": [ + { + "label": "Contrôles", + "value": "Les mêmes vérifications que la vérification complète." + }, + { + "label": "Contenu", + "value": "Identité minimale; constatations critiques; avertissements; observations pertinentes; lectures non vérifiées et mesures prioritaires. Les diagrammes, les inventaires et les longues annexes sont exclus." + } + ] + }, + { + "title": "Inventaire", + "body": "Décrit ce qui existe sur le noeud sans l'évaluer.", + "href": "/monitor/audit/sample-audit-inventory-report.pdf", + "facts": [ + { + "label": "Contrôles", + "value": "Aucune; aucune conclusion n'est classée." + }, + { + "label": "Contenu", + "value": "Identité ; cluster ; CPU et mémoire ; carte mère, BIOS et contrôleurs ; réseau ; stockage ; VM et LXC ; passthrough ; applications et éléments gérés par ProxMenux." + } + ] + }, + { + "title": "Examen de la sécurité", + "body": "Couvre l'exposition et les contrôles sur l'accès au nœud.", + "href": "/monitor/audit/sample-audit-security-report.pdf", + "facts": [ + { + "label": "Contrôles", + "value": "La zone de sécurité, plus les privilèges de conteneur, les mises à jour, les dépôts et la chaîne APT." + }, + { + "label": "Contenu", + "value": "Identité et cluster ; réseau et latence ; accès ; pare-feu ; 2FA ; certificats ; privilèges ; mises à jour ; dépôts ; état et ancienneté du rapport Lynis." + } + ] + }, + { + "title": "Assurance de sauvegarde", + "body": "Vérifier que la protection déclarée existe et que ses sauvegardes sont utilisables.", + "href": "/monitor/audit/sample-audit-backup-report.pdf", + "facts": [ + { + "label": "Contrôles", + "value": "La zone de sauvegarde, la connectivité de stockage et la livraison de notification." + }, + { + "label": "Contenu", + "value": "Couverture par invité ; objectif de reprise déclaré ; ancienneté et résultat ; destination ; conservation ; vérification ; tâches échouées ; reprise et sources incomplètes." + } + ] + }, + { + "title": "Capacité et usure", + "body": "Mesure la marge de croissance et les signes d'épuisement ou de vieillissement.", + "href": "/monitor/audit/sample-audit-capacity-report.pdf", + "facts": [ + { + "label": "Contrôles", + "value": "Les zones de stockage et de matériel, plus mémoire, échange, journal et le système de fichiers hôte." + }, + { + "label": "Contenu", + "value": "Utilisation et seuils ; thin pools ; surallocation ; mémoire ; inodes ; ZFS ; températures ; heures de fonctionnement ; erreurs SMART et durée de vie NVMe/SSD." + } + ] + } + ] + } + }, + { + "figure": { + "src": "/monitor/audit/audit-report-preview.png", + "alt": "Première page d'un rapport d'audit complet", + "caption": "Chaque document partage l'identificateur de rapport, les sections numérotées, la date, le noeud, le profil et le pied de page." + } + }, + { + "p": "Selon le profil, le document contient l'identité du nœud et la date d'évaluation, une synthèse, un résumé par domaine, la structure du matériel, du réseau et du stockage, la protection des invités, les constats avec preuves, les sources illisibles ainsi que la portée et la politique appliquées." + } + ] + }, + { + "id": "print", + "title": "Impression ou enregistrement en format PDF", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Exécuter", + "body": "L'évaluation utilise le profil choisi dans Rapport." + }, + { + "title": "Révision", + "body": "L'exécution terminée affiche ses constats, les sources qu'elle n'a pas pu lire et la politique appliquée." + }, + { + "title": "Générer le rapport", + "body": "Générer le rapport ouvre la vue préparée comme document." + }, + { + "title": "Imprimer", + "body": "Imprimer ou enregistrer en PDF ouvre le dialogue d'impression du navigateur pour choisir une imprimante ou Enregistrer en PDF." + } + ] + } + }, + { + "calloutTip": { + "title": "L'impression est un document, pas une capture d'écran", + "body": "La barre d'actions est masquée, les tableaux continuant sur la page suivante répètent leur en-tête, les blocs évitent les coupures inutiles et chaque page conserve son identification et sa numérotation." + } + } + ] + }, + { + "id": "compare", + "title": "Comparer avec une exécution de référence", + "intro": "Utiliser comme référence marque une exécution terminée. Les exécutions suivantes lui sont comparées et leurs constats sont regroupés ainsi :", + "blocks": [ + { + "table": { + "headers": [ + "Groupe", + "Signification" + ], + "rows": [ + [ + "Nouveau", + "Signalé maintenant et pas avant." + ], + [ + "Aggravés", + "Toujours signalés, mais plus graves ou plus étendus que précédemment." + ], + [ + "Améliorés", + "Toujours signalés, mais moins graves ou moins étendus que précédemment." + ], + [ + "Résolue", + "Ne sont plus signalés et personne ne les a acceptés." + ], + [ + "Acceptés", + "N'est plus compté parce qu'un risque a été accepté, pas parce que l'hôte a changé." + ], + [ + "Plus évalués", + "Présents auparavant mais absents de cette exécution ; leur disparition n'a pas été vérifiée." + ] + ] + } + }, + { + "table": { + "headers": [ + "Exécution de référence", + "Comportement" + ], + "rows": [ + [ + "Réglage", + "Toute exécution terminée peut être marquée ; aucune ne l'est automatiquement." + ], + [ + "Changer", + "Marquer une autre exécution déplace la référence sans supprimer l'historique." + ], + [ + "Comparaison", + "Sans deux exécutions sélectionnées, la comparaison utilise la référence et la dernière exécution ou celle choisie." + ], + [ + "Conservation des exécutions", + "Les 30 exécutions les plus récentes sont conservées ; la référence est toujours préservée." + ], + [ + "Sans référence", + "La vue indique qu'aucune exécution de référence n'a encore été choisie ; aucune comparaison n'est donc possible." + ] + ] + } + }, + { + "calloutWarning": { + "title": "Un rapport décrit un moment", + "body": "Une évaluation ne certifie pas une période entière. Les anciens résultats cessent de décrire l'état actuel ; la vue indique l'ancienneté de la dernière exécution et chaque source conserve son heure de collecte." + } + } + ] + } + ] +} diff --git a/web/messages/fr/docs/monitor/audit-report/scope.json b/web/messages/fr/docs/monitor/audit-report/scope.json new file mode 100644 index 00000000..11d93e1e --- /dev/null +++ b/web/messages/fr/docs/monitor/audit-report/scope.json @@ -0,0 +1,115 @@ +{ + "meta": { + "title": "Portée et garanties | Audit et rapports", + "description": "Origine des données d'Audit et rapports, limites de son champ de vision, garanties de conception et emplacement des données." + }, + "header": { + "title": "Portée et garanties", + "description": "Origine des données d'une évaluation, éléments hors de son champ de vision et emplacement des données d'Audit et rapports.", + "section": "Audit et rapports" + }, + "sections": [ + { + "id": "sees", + "title": "Ce qu'il observe", + "blocks": [ + { + "list": { + "items": [ + "Configuration et état du nœud local.", + "La configuration déclarée des VM et des LXC.", + "L'état du stockage tel que Proxmox VE le connaît.", + "L'historique disponible des sauvegardes et des vérifications.", + "Les données SMART et les événements que le moniteur a recueillis.", + "État des services, cluster, HA et sources locales." + ] + } + } + ] + }, + { + "id": "outside", + "title": "Ce qui est hors de sa vue", + "blocks": [ + { + "list": { + "items": [ + "L'intérieur des invités, au-delà de ce qu'ils déclarent à Proxmox VE.", + "Équipement réseau à l'extérieur de l'hôte.", + "Dépendances éloignées que le noeud ne peut pas observer.", + "L'état physique que le matériel ne fournit pas.", + "Le journal des modifications ne couvre pas les actions manuelles ou celles d'autres logiciels." + ] + } + }, + { + "calloutWarning": { + "title": "Une preuve manquante n'est pas une preuve d'absence", + "body": "Une source qui ne peut être lue donne un résultat non vérifié ou incomplet, jamais conforme. Le rapport énumère les sources qui n'étaient pas disponibles." + } + } + ] + }, + { + "id": "guarantees", + "title": "Garanties de conception", + "blocks": [ + { + "list": { + "items": [ + "Des identifiants stables pour les vérifications.", + "Historique des exécutions et des constats.", + "Une politique validée, enregistrée de manière atomique.", + "Risques acceptés avec une raison visible.", + "Attribution des modifications au script et à la fonction.", + "Capture de l'état avant et après, lorsque disponible.", + "Un résultat explicite lorsque quelque chose ne peut être mesuré ou capturé." + ] + } + } + ] + }, + { + "id": "storage", + "title": "Où les données sont stockées", + "blocks": [ + { + "table": { + "headers": [ + "Données", + "Emplacement" + ], + "rows": [ + [ + "Politique", + "/usr/local/share/proxmenux/audit_policy.json" + ], + [ + "Évaluations", + "La base de données d'audit de Monitor" + ], + [ + "Objets capturés", + "/usr/local/share/proxmenux/changes/objects/" + ], + [ + "Entrées en attente", + "/usr/local/share/proxmenux/changes/spool/" + ], + [ + "Journal consolidé", + "/usr/local/share/proxmenux/changes.db" + ] + ] + } + }, + { + "calloutInfo": { + "title": "Un outil d'examen, pas une certification", + "body": "Audit et rapports examine, compare et documente le nœud. Ses résultats s'interprètent selon l'objectif du système, la politique déclarée et les sources disponibles." + } + } + ] + } + ] +} diff --git a/web/messages/fr/docs/monitor/dashboard/apps.json b/web/messages/fr/docs/monitor/dashboard/apps.json new file mode 100644 index 00000000..15aff1cb --- /dev/null +++ b/web/messages/fr/docs/monitor/dashboard/apps.json @@ -0,0 +1,174 @@ +{ + "meta": { + "title": "Tableau de bord Apps : un lanceur pour tous les liens web | ProxMenux", + "description": "Utilisez le tableau de bord Apps pour ouvrir les Liens Web LXC enregistrés et les liens personnalisés, les organiser par catégorie et revenir à l'invité qui possède chaque service." + }, + "header": { + "title": "Tableau de bord : onglet Apps", + "description": "Un seul lanceur pour les interfaces web du nœud, qu'elles proviennent d'une application LXC enregistrée ou d'un lien personnalisé.", + "section": "ProxMenux Monitor · Tableau de bord" + }, + "intro": { + "title": "Un lanceur, pas un installateur d'applications", + "body": "L'onglet Apps n'installe pas de logiciel et ne découvre pas lui-même les services. Il regroupe les liens sauvegardés dans une grille de recherche. Les liens LXC se configurent dans l'onglet App de l'invité ; les liens personnalisés ajoutent services VM, proxies inverses et tableaux de bord externes." + }, + "sources": { + "heading": "Ce qui apparaît dans Apps", + "intro": "Chaque URL de lancement devient sa propre carte. La source détermine où cette carte est éditée, mais pas comment elle semble pendant l'utilisation normale.", + "colSource": "Source", + "colAppears": "Ce qui apparaît", + "colManagedFrom": "Où elle est gérée", + "rows": [ + { + "source": "Application de LXC enregistrée", + "appears": "Une carte pour chaque lien Web enregistré sur l'enregistrement de l'application.", + "managedFrom": "VMs & LXCs → modale LXC → App" + }, + { + "source": "Lien personnalisé lié à un invité", + "appears": "URL de service associée à un VM ou LXC.", + "managedFrom": "Apps → Modifier" + }, + { + "source": "Lien personnalisé sans association", + "appears": "Toute destination HTTP(S), y compris un service externe ou derrière un proxy inverse.", + "managedFrom": "Apps → Modifier" + } + ], + "relationshipTitle": "Les applications et l'onglet LXC App ont des tâches différentes", + "relationshipBody": "L'onglet App du LXC gère l'identité, les liens web et le suivi facultatif des versions. Apps utilise ces liens pour les ouvrir rapidement. Modifier une carte LXC renvoie donc à la fiche de l'invité sans dupliquer la configuration." + }, + "cards": { + "heading": "Comment utiliser une carte", + "intro": "La carte entière est la cible de lancement, tandis que ses petites commandes fournissent le contexte sans ouvrir le service.", + "items": [ + "Cliquez sur la carte pour ouvrir son URL dans un nouvel onglet de navigateur.", + "Le logo utilise le logo Web Link d'abord et revient au logo de l'application le cas échéant.", + "La puce de catégorie utilise la même couleur et la même étiquette que le lien Web correspondant dans l'onglet LXC App.", + "L'étiquette de l'invité identifie la VM ou le LXC associé. Un clic ouvre sa fenêtre : les liens LXC ouvrent App, ceux des VM État.", + "Une flèche vers le haut violet signifie que l'application spécifique ou l'image Docker a une mise à jour disponible. Ce n'est pas une mise à jour générale pour tout l'invité." + ] + }, + "toolbar": { + "heading": "Recherche, filtre et tri", + "intro": "La barre d'outils rétrécit une grande collection d'applications sans changer les enregistrements enregistrés.", + "items": [ + "La recherche correspond au nom de l'application, au nom de l'invité, au VMID et à la catégorie.", + "Le filtre de catégorie montre une catégorie à la fois ou toutes les applications.", + "Triez par Nom, ID ou Catégorie. Le tri par catégorie ajoute des titres entre les groupes de cartes.", + "L'ordre est mémorisé dans ce navigateur. Le texte de recherche et le filtre de catégorie sont réinitialisés à la prochaine visite.", + "L'onglet Apps reste disponible lorsque la grille est vide, de sorte que le premier lien personnalisé peut être ajouté sans enregistrer d'abord une application LXC." + ] + }, + "customLinks": { + "heading": "Ajout et édition de liens Web personnalisés", + "intro": "Utilisez un lien personnalisé lorsque le service n'est pas représenté par une application LXC enregistrée.", + "steps": [ + "Appuyez sur Ajouter le lien depuis la barre d'outils ou l'état vide.", + "Saisissez un nom et une URL complète http:// ou https://.", + "Ajouter un logo, choisir ou créer une catégorie et lier le lien à un VM ou LXC.", + "Enregistrez le lien. Sa carte apparaît immédiatement dans la grille.", + "Pour modifier ou supprimer un lien personnalisé, cliquez sur Modifier puis sur le crayon de sa carte." + ], + "colField": "Champ", + "colRequired": "Requis", + "colPurpose": "Objet", + "fields": [ + { + "field": "Nom", + "required": "Oui", + "purpose": "Titre de la carte et terme de recherche." + }, + { + "field": "URL", + "required": "Oui", + "purpose": "La destination complète HTTP(S) ouverte par la carte." + }, + { + "field": "URL du logo", + "required": "Non", + "purpose": "Une image à distance affichée sur la carte." + }, + { + "field": "Catégorie", + "required": "Non", + "purpose": "Ajoute un badge partagé et permet le filtrage de catégorie." + }, + { + "field": "Association à l'invité", + "required": "Non", + "purpose": "Associé le lien avec un VM ou LXC et permet le raccourci invité." + } + ], + "editTitle": "Modifier la source de la vérité", + "editBody": "Le mode édition affiche des crayons uniquement pour les liens personnalisés. Pour une carte LXC, ouvrez l'onglet App de l'invité et modifiez le lien sauvegardé." + }, + "categories": { + "heading": "Catégories et signaux de mise à jour", + "intro": "Les catégories organisent les liens ; les indicateurs de mise à jour décrivent le logiciel. Ces fonctions sont volontairement séparées.", + "items": [ + "L'enregistrement LXC assisté par catalogue peut préremplir une catégorie, mais il reste modifiable.", + "Les noms de catégorie personnalisés peuvent être créés à partir du même sélecteur, puis réutilisés par le filtre.", + "Les couleurs de catégorie sont déterministes et s'adaptent au thème clair ou sombre. Les gammes violet et rouge sont réservées aux états de mise à jour et de danger.", + "Pour Docker, ProxMenux associe la carte à son conteneur ou son image et indique les mises à jour de cette image. Celles de Docker Engine restent dans l'onglet Mises à jour du LXC." + ] + }, + "persistence": { + "heading": "Persistance et comportement de cache", + "intro": "Le tableau de bord utilise les données déjà disponibles dans Monitor sans analyser à nouveau chaque invité.", + "items": [ + "Les liens personnalisés sont enregistrés de manière atomique dans /etc/proxmenux/custom_links.json et chargés en mémoire au démarrage de Monitor.", + "Les liens LXC restent dans la fiche de leur application enregistrée dans Monitor ; le tableau de bord Apps ne les duplique pas dans le fichier des liens personnalisés.", + "Création, édition ou suppression d'un lien personnalisé rafraîchit immédiatement la liste in-memory.", + "La préférence de tri est locale au navigateur, sans synchronisation entre appareils ou utilisateurs.", + "La position supérieure des applications est contrôlée séparément par Paramètres → Ordre de navigation." + ] + }, + "troubleshooting": { + "heading": "Situations communes", + "colProblem": "Situation actuelle", + "colResolution": "Résolution", + "rows": [ + { + "problem": "Une application LXC est enregistrée mais aucune carte n'apparaît", + "resolution": "Ouvrez son onglet App et ajoutez au moins un lien Web. Le suivi des versions ne crée pas à lui seul une carte de lanceur." + }, + { + "problem": "L'URL ou le logo est faux", + "resolution": "Modifier le lien personnalisé dans les applications, ou modifier le lien Web dans l'onglet propriétaire de l'application LXC." + }, + { + "problem": "Il manque un service Docker", + "resolution": "Modifiez l'application Docker enregistrée et enregistrez le port web publié du service en tant que lien Web." + }, + { + "problem": "La flèche pourpre se réfère à la mauvaise mise à jour Docker", + "resolution": "Consultez le nom et la description du lien Web afin qu'ils puissent être adaptés au conteneur ou à l'image prévu." + }, + { + "problem": "Les applications s'ouvrent en premier lieu au lieu de Aperçu du système", + "resolution": "Le premier élément enregistré dans Paramètres → L'ordre de navigation devient l'onglet d'atterrissage. Restaurer l'ordre par défaut ou déplacer Aperçu d'abord." + } + ] + }, + "whereNext": { + "heading": "Où aller ensuite", + "items": [ + { + "label": "Onglet de l'application LXC", + "href": "/docs/monitor/dashboard/vms-lxcs/app", + "tail": "— enregistrer les applications, les liens Web et le suivi facultatif des versions." + }, + { + "label": "Onglet Mises à jour LXC", + "href": "/docs/monitor/dashboard/vms-lxcs/updates", + "tail": " — configurer et lancer les mises à jour des applications, de Docker Engine et des images." + }, + { + "label": "Onglet Paramètres", + "href": "/docs/monitor/dashboard/settings#navigation-order", + "tail": "— modifier l'ordre de navigation et l'onglet d'atterrissage." + } + ] + } +} diff --git a/web/messages/fr/docs/monitor/dashboard/hardware.json b/web/messages/fr/docs/monitor/dashboard/hardware.json new file mode 100644 index 00000000..86a0428e --- /dev/null +++ b/web/messages/fr/docs/monitor/dashboard/hardware.json @@ -0,0 +1,248 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Tableau de bord : Matériel | Documentation ProxMenux", + "description": "L'onglet Matériel inventorie la machine physique : CPU, carte mère, modules mémoire, capteurs thermiques, GPU avec surveillance par emplacement et installation du pilote en un clic, accélérateurs Coral TPU, résumé du stockage avec vitesses de liaison, listes PCI et USB, consommation, alimentations, ventilateurs et état de l'onduleur." + }, + "header": { + "title": "Tableau de bord : onglet matériel", + "description": "La machine physique en un seul écran — CPU et identité carte mère, chaque module de mémoire, capteurs thermiques dans tous les sous-systèmes, GPU avec utilisation en direct et un installateur de pilote intégré, Coral TPU, chaque PCI et périphérique USB avec son pilote de noyau, l'inventaire du disque complet avec des vitesses de liaison négociées, plus la puissance, le refroidissement et l'UPS.", + "section": "ProxMenux Monitor · Tableau de bord" + }, + "intro": { + "title": "Construit à partir d'outils standard", + "body": "La plupart de cet onglet est analysé à partir de lscpu, dmidecode, lspci, lsusb, lsblk, smartctl, nvme, sensors, nvidia-smi, intel_gpu_top, amdgpu_top, ipmitool et upsc. Les sections ne rendent que lorsque l'outil concerné renvoie des données, de sorte qu'un hôte sans UPS n'affiche pas la carte UPS et qu'un hôte sans IPMI n'affiche pas de chiffres de puissance hors bande." + }, + "thresholds": { + "title": "Couleurs et seuils appliqués ici", + "intro": "Chaque indicateur et mesure de température suit la même échelle : vert sous Avertissement, ambre entre Avertissement et Critique, rouge à partir de Critique. Valeurs recommandées fournies avec ProxMenux :", + "items": [ + "Température CPU — avertissement 80 °C, critique 90 °C.", + "Température du disque — HDD 60/65 °C · SSD 70/75 °C · NVMe 80/85 °C · SAS 55/65 °C (avertissement / critique)." + ], + "outro": "Les valeurs sont configurables par hôte. Paramètres → Seuils du moniteur de santé centralise leur réglage et explique comment les adapter." + }, + "sections": { + "heading": "Sections", + "intro": "Les sections apparaissent dans cet ordre, de haut en bas. Certaines exigent le matériel ou l'outil correspondant et sont indiquées (conditionnel) ci-dessous.", + "systemInfoTitle": "Informations système", + "systemInfoIntro": "Deux blocs côte à côte, toujours présents:", + "systemInfoItems": [ + "CPU — modèle, microarchitecture, sockets/cœurs/threads, fréquences de base et boost, capacités de virtualisation (VT-x / AMD-V) et topologie du cache.", + "Carte mère — fabricant, modèle, version et date du BIOS, UUID SMBIOS. Permet de trouver la bonne page de téléchargement du fabricant pour le firmware." + ], + "memoryTitle": "Modules de mémoire", + "memoryBody": "Une ligne par emplacement occupé selon dmidecode : étiquette, capacité du module, type (DDR4 / DDR5 / variantes ECC), vitesse configurée et nominale, fabricant, référence et numéro de série. Les emplacements vides sont grisés pour montrer les possibilités d'extension.", + "thermalTitle": "Surveillance thermique", + "thermalIntro": "Sept blocs alimentés par lm-sensors, sysfs et des collecteurs propres à chaque outil. Les capteurs hwmon de stockage sont associés au périphérique bloc physique, avec son modèle et son chemin /dev/.... Un bloc est masqué si sa catégorie ne contient aucun capteur.", + "thermalItems": [ + "CPU — température du boîtier du processeur et de chaque cœur.", + "GPU — capteurs de GPU dédié via nvidia-smi / amdgpu_top et d'iGPU Intel. Inclut le point chaud et la température de jonction mémoire si le pilote les fournit.", + "NVME — température composite du contrôleur associée à son espace de noms NVMe exact.", + "HDD — drivetemp lectures pour les dispositifs de blocs rotatifs.", + "SSD — lectures drivetemp pour les dispositifs de blocs SATA/SAS non rotatifs.", + "PCI — capteurs qui se présentent comme des dispositifs fixés par PCI (HBA, cartes réseau avec capteurs internes).", + "OTHER — chipset, VRM, capteurs ambiants qui ne s'adaptent pas ailleurs." + ] + }, + "graphics": { + "heading": "Cartes graphiques", + "intro": "Chaque contrôleur vidéo apparaît dans une carte avec fabricant, modèle, type (Intégré / PCI / BMC), adresse PCI (BDF), pilote noyau et modules. Changer de mode bascule entre partage LXC avec pilote natif et passthrough VM (vfio-pci). Changer le mode GPU (VM ↔ LXC) explique les effets sur l'hôte.", + "vfioImageAlt": "Section des cartes graphiques montrant un GPU intégré à Matrox G200EH lié à mgag200 (Ready pour LXC) et un NVIDIA Quadro P400 lié à vfio-pci (Ready pour VM passthrough)", + "vfioImageCaption": "Deux GPU détectés : la puce Matrox BMC est sur le pilote natif et prête pour LXC ; le NVIDIA Quadro P400 est lié à vfio-pci, prêt pour le passage VM.", + "lxcImageAlt": "Cartes graphiques : iGPU Intel UHD Graphics avec i915 et NVIDIA Quadro P1000 avec nvidia, toutes deux prêtes pour les conteneurs LXC", + "lxcImageCaption": "Même noeud après avoir retourné la carte NVIDIA au pilote natif — les deux GPU sont maintenant prêts pour les conteneurs LXC.", + "realtimeTitle": "Fenêtre de surveillance en temps réel", + "realtimeBody": "Un clic ouvre la surveillance du GPU par emplacement, avec une requête à l'outil du fabricant toutes les trois secondes. Elle affiche fabricant, type, emplacement PCI, pilote, modules noyau, utilisation des moteurs (Render/3D, Video, Blitter, VideoEnhance), fréquences graphique et mémoire, température, consommation si disponible, VRAM et processus actifs avec leur charge moteur. Données de /api/gpu/<slot>/realtime.", + "toolsIntro": "L'outil fournisseur utilisé par GPU:", + "headerVendor": "Fournisseur", + "headerTool": "Outil", + "headerProject": "Projet", + "tools": [ + { + "vendor": "NVIDIA", + "tool": "nvidia-smi", + "projectLabel": "developer.nvidia.com", + "projectHref": "https://developer.nvidia.com/nvidia-system-management-interface" + }, + { + "vendor": "Intel iGPU", + "tool": "intel_gpu_top (igt-gpu-tools)", + "projectLabel": "gitlab.freedesktop.org", + "projectHref": "https://gitlab.freedesktop.org/drm/igt-gpu-tools" + }, + { + "vendor": "AMD", + "tool": "amdgpu_top", + "projectLabel": "github.com/Umio-Yasuno/amdgpu_top", + "projectHref": "https://github.com/Umio-Yasuno/amdgpu_top" + }, + { + "vendor": "Matrox / ASPEED (BMC)", + "tool": "— (affichage uniquement)", + "projectLabel": "Détecté et étiqueté comme BMC; aucun bloc en temps réel." + } + ], + "nvidiaImageAlt": "Surveillance NVIDIA Quadro P1000 : fabricant NVIDIA, pilote nvidia chargé, fréquence graphique 1.26 GHz, mémoire 2.50 GHz, température 50 °C, moteurs à 0 %, aucun processus actif, mémoire totale 4096 MiB", + "nvidiaImageCaption": "NVIDIA Quadro P1000 avec pilote propriétaire : fréquences, température, barres d'utilisation des moteurs et processus actifs.", + "intelImageAlt": "Surveillance d'une iGPU Intel UHD Graphics avec i915 : consommation 11.31 W, charge vidéo 1 % et processus ffmpeg utilisant 8 MB", + "intelImageCaption": "Intel iGPU avec i915 actif. La table Active Processes reprend un travail ffmpeg en utilisant le moteur vidéo.", + "amdImageAlt": "Surveillance du GPU intégré AMD Lucienne avec amdgpu : moteurs à 0 % et amdgpu_top comme processus actif", + "amdImageCaption": "iGPU AMD surveillée avec amdgpu_top. L'outil apparaît lui-même comme processus actif car il collecte les données en direct.", + "installTitle": "Installer le pilote NVIDIA depuis la fenêtre", + "installBody": "Avec nouveau/nvidiafb sans pilote propriétaire NVIDIA, les fréquences, la consommation et la charge par processus ne sont pas disponibles. La fenêtre propose Installer les pilotes NVIDIA, qui lance le script décrit dans Installer les pilotes NVIDIA (hôte).", + "noDriverAlt": "Surveillance NVIDIA Quadro P620 avec nvidiafb et nouveau chargés, avertissement Surveillance étendue indisponible et bouton bleu Installer les pilotes NVIDIA", + "noDriverCaption": "Aucun pilote propriétaire installé : la fenêtre propose un installateur en un clic.", + "promptAlt": "Confirmation d'installation du pilote NVIDIA, avec GPU détectés, conteneurs LXC utilisant le passthrough NVIDIA et boutons Oui/Annuler", + "promptCaption": "Résumé avant installation : GPU détectés, conteneurs LXC avec passthrough NVIDIA et actions prévues. Aucune modification avant confirmation.", + "successAlt": "Sortie terminale montrant le pilote NVIDIA 580.105.08 installé avec succès et nvidia-smi signalant un Quadro P620", + "successCaption": "Installation réussie — le NVIDIA .run construit via DKMS, le service de persistance est en place, et nvidia-smi rapporte le GPU.", + "warningTitle": "Choisissez une version de pilote que votre GPU prend en charge", + "warningBody": "Les nouvelles branches NVIDIA abandonnent certaines anciennes familles GPU, comme Maxwell ou Kepler. Si nvidia-smi affiche \"No devices were found\" après l'installation ou si DKMS échoue, la branche peut être incompatible. Relancez avec une branche plus ancienne, comme legacy 470.x pour Kepler. Vérifiez la compatibilité sur la page officielle de recherche des pilotes.", + "whereGoIntro": "Où aller d'ici :", + "whereGoItems": [ + "Installer les pilotes NVIDIA (hôte) — guide complet, matrice de compatibilité du noyau, correctif NVENC facultatif et propagation aux LXC.", + "Changer le mode GPU (VM ↔ LXC) — effets de la commande Changer de mode de la carte.", + "Ajouter un GPU à une VM (passthrough) et Ajouter un GPU à un LXC — première affectation d'un GPU non associé." + ] + }, + "coral": { + "heading": "Accélérateurs Coral TPU / AI", + "subHeading": "(conditionnel)", + "intro": "Apparaît avec des appareils Google Coral ou d'autres accélérateurs IA connectés. La fenêtre affiche connexion (M.2 / mini-PCIe / USB), largeur PCIe, ID fabricant/produit, support logiciel (apex dans le noyau pour PCIe, libedgetpu en espace utilisateur pour USB), modules (gasket + apex), nœuds (/dev/apex_*), état du runtime Edge TPU, température en direct et seuils d'alerte du firmware.", + "imageAlt": "Coral Edge TPU détail modal : connexion PCIe / M.2, PCIe 5.0 lien GT/s x1, fournisseur 1ac1:089a, pilote noyau apex, gasket et apex modules chargés, /dev/apex_0 présents, Edge TPU Runtime non installé, température 53.5 °C avec seuils d'avertissement matériels", + "imageCaption": "M.2 Coral avec les modules du noyau hôte chargés, le nœud du périphérique activé et les avertissements de température du micrologiciel exposés. La ligne d'exécution devient verte une fois que le runtime Edge TPU correspondant est installé.", + "pathsIntro": "Deux chemins d'installation existent selon le facteur de forme :", + "pathsItems": [ + "M.2 / Mini-PCIe — l'hôte a besoin des modules du noyau gasket + apex construits via DKMS afin que le noeud du périphérique /dev/apex_0 apparaisse au démarrage.", + "USB Accélérateur — l'hôte n'a besoin que de l'espace utilisateur Edge TPU (libedgetpu1-std) du dépôt APT de Google." + ], + "outro": "Installer Coral TPU sur l'hôte détecte et gère les deux variantes. Contexte et runtime officiel sur coral.ai/docs. Ensuite, affectez l'appareil à un conteneur avec Ajouter Coral TPU à un LXC." + }, + "storage": { + "heading": "Résumé du stockage", + "intro": "Tous les périphériques bloc connus du noyau, regroupés par type. Chaque disque montre son nom (sda, nvme0n1, zram0…), type (SSD, HDD, NVMe SSD), modèle et lien négocié. Un clic ouvre modèle, numéro de série, capacité, interface et vitesse de liaison actuelle et maximale.", + "imageAlt": "Résumé du stockage avec onze périphériques bloc (SSD SATA, HDD SATA, SSD NVMe et zram), modèles et liens négociés ; deux NVMe en 3.0 x4 avec vitesse actuelle surlignée", + "imageCaption": "Onze appareils sur ce nœud. Les liens SATA sont affichés sous la forme SATA <version>, <Gb/s> (current: ...) ; les NVMe sous la forme <PCIe gen> x<width>.", + "nvmeBody": "Pour chaque NVMe, la ligne compare le lien négocié au maximum pris en charge. S'ils diffèrent, par exemple un SSD Gen3 x4 à 3.0 x1 dans un emplacement câblé sur une voie, la valeur actuelle apparaît en ambre. Utile pour diagnostiquer un disque lent ou une réaffectation des voies après une mise à jour BIOS.", + "nvmeModalAlt": "NVMe drive detail modal pour nvme0n1: NVMe type SSD, 953.9 capacité GB, vitesse de liaison actuelle 3.0 x1 mis en évidence en ambre, vitesse de liaison maximale 3.0 x4, modèle WDC CL SN720, numéro de série, interface PCIe/NVMe", + "nvmeModalCaption": "Détails NVMe avec lien réduit : le disque prend en charge x4, mais l'emplacement est câblé en x1.", + "outro": "Données SMART, autotests, historique et rapport PDF sont dans Tableau de bord : Stockage. Les mêmes données alimentent Santé et tests SMART des disques. Un test long lancé par le script écrit le JSON affiché dans Stockage → Historique." + }, + "pci": { + "heading": "Périphériques PCI", + "intro": "Appareils PCI identifiés par leur BDF PCI (Bus:Device.Function, par exemple 03:00.0) et classe (Contrôleur de stockage, Contrôleur USB, Carte graphique, Contrôleur réseau, Contrôleur audio…). Chaque carte montre fabricant, nom et pilote noyau associé, utiles pour diagnostiquer passthrough, groupes IOMMU ou mauvais pilote.", + "imageAlt": "PCI Devices section énumérant quinze périphériques regroupés par classe: contrôleurs de stockage sur ahci/nvme, contrôleurs USB, cartes graphiques (un sur vfio-pci, un sur le pilote natif), contrôleurs réseau sur igb / tg3, un contrôleur audio à côté d'un GPU passé", + "imageCaption": "Quinze appareils sur ce nœud. Notez que le GPU et sa fonction audio associée sont liés au vfio-pci — c'est-à-dire une carte préparée pour la transmission du VM.", + "bdfTitle": "Lecture du BDF", + "bdfBody": "03:00.0 signifie bus PCI 03, périphérique 00, fonction 0. Les GPU dédiés utilisent généralement .0 pour le GPU et .1 pour l'audio HDMI. Les deux fonctions sont transmises ensemble à la VM ; Changer le mode GPU nettoie donc aussi les associations audio orphelines en quittant le mode VM." + }, + "usb": { + "heading": "Périphériques USB", + "intro": "Appareils USB avec fabricant et produit, version USB, adresse bus:device, ID vendor:product et pilote noyau. Classement par rôle : Communications (adaptateurs Z-Wave / Zigbee), Onduleur, stockage ou HID. Les appareils sont ainsi identifiables sans comparer leurs ID.", + "imageAlt": "Appareils USB : Aeotec Z-Wave Z-Stick, coordinateur Zigbee ConBee II et onduleur Ellipse ECO, avec version USB, adresse, ID vendor:product et pilote associé", + "imageCaption": "Trois appareils USB – deux radios d'automation sur usbfs et un UPS sur usbfs (NUT lui parle par libusb)." + }, + "power": { + "heading": "Consommation d'énergie", + "subHeading": "(conditionnel)", + "intro": "Apparaît si l'hôte fournit des mesures de puissance. Deux sources indépendantes sont affichées lorsqu'elles sont disponibles :", + "items": [ + "Consommation totale ACPI / IPMI — puissance de tout le système mesurée par un capteur de carte mère ou le BMC. Courant sur les cartes serveur.", + "Puissance du processeur — compteurs Intel RAPL ou équivalent AMD. Distingue la consommation CPU du reste sur les cartes grand public sans mesure globale." + ], + "supplyImageAlt": "Consommation : 198 W au total via ACPI et deux alimentations à l'état OK, délivrant 185 W et 5 W", + "supplyImageCaption": "Carte serveur avec un capteur de puissance ACPI unique et deux PSU signalés par IPMI — le deuxième PSU est le redondant, au ralenti à 5 W.", + "cpuImageAlt": "Consommation sur une carte grand public : seulement 8.7 W de CPU via Intel RAPL", + "cpuImageCaption": "Carte grand public sans capteur global : seule la consommation CPU via RAPL est affichée." + }, + "psu": { + "heading": "Alimentations", + "subHeading": "(conditionnel)", + "body": "Sur les machines serveur à double alimentation, IPMI montre présence (PSU 1 / PSU 2 / …), tension d'entrée, puissance de sortie et état OK/défaillant. À vérifier après une coupure électrique sur un nœud à alimentations redondantes." + }, + "fans": { + "heading": "Ventilateurs système", + "subHeading": "(conditionnel)", + "body": "Vitesse de chaque ventilateur en tr/min avec mini-courbe si disponible. Sans mesures individuelles, une seule valeur de ventilateur du châssis est affichée." + }, + "ups": { + "heading": "Statut UPS", + "subHeading": "(conditionnel)", + "body": "Apparaît avec un serveur NUT (Network UPS Tools) configuré et joignable. Affiche état (secteur / batterie / charge / batterie faible), niveau de batterie, autonomie estimée, taux de charge de l'onduleur, tension d'entrée, modèle et firmware. Les données alimentent aussi Sécurité et certificats du moniteur de santé : le passage sur batterie est immédiatement signalé." + }, + "dataCollected": { + "heading": "Comment les données sont collectées", + "headerSection": "Section de l'onglet", + "headerEndpoint": "Point de terminaison", + "headerSource": "Source", + "rows": [ + { + "section": "Inventaire statique (PCI, CPU, BIOS)", + "endpoint": "/api/hardware", + "source": "lspci -vmm, /proc/cpuinfo, dmidecode; mis en cache pendant toute la durée du processus." + }, + { + "section": "Valeurs réelles du capteur", + "endpoint": "/api/hardware/live", + "source": "sensors (lm-sensors), /sys/class/hwmon et /sys/block identifient les périphériques de stockage. Les températures restent en direct ; seule la correspondance hwmon-appareil est mise en cache 60 secondes." + }, + { + "section": "Historique de température CPU", + "endpoint": "/api/temperature/history", + "source": "Série temporelle enregistrée toutes les 60 secondes par le collecteur de température et stockée dans SQLite." + }, + { + "section": "GPU métriques vivantes", + "endpoint": "/api/gpu//realtime", + "source": "NVIDIA: nvidia-smi --query-gpu=.... Intel: intel_gpu_top. AMD: sysfs /sys/class/drm/cardN." + } + ], + "codeComment1": "# Comparer l'inventaire à la vue du système d'exploitation", + "codeComment2": "# Confirmer la carte GPU que le tableau de bord voit" + }, + "whereNext": { + "heading": "Où aller ensuite", + "items": [ + { + "label": "Installer les pilotes NVIDIA (host)", + "href": "/docs/hardware/nvidia-host", + "tail": " — script lancé par le bouton d'installation de la fenêtre GPU." + }, + { + "label": "Changer le mode GPU (VM ↔ LXC)", + "href": "/docs/hardware/switch-gpu-mode", + "tail": " — effets sur l'hôte du changement de mode dans chaque carte GPU." + }, + { + "label": "Installez Coral TPU sur l'hôte", + "href": "/docs/hardware/install-coral-tpu-host", + "tail": " — installation du module noyau et du runtime Coral." + }, + { + "label": "Santé et test du disque SMART", + "href": "/docs/disk-manager/smart-disk-test", + "tail": " — script qui produit les données SMART affichées dans les détails du disque sous Stockage." + }, + { + "label": "Tableau de bord : onglet de stockage", + "href": "/docs/monitor/dashboard/storage", + "tail": "— tableau complet des attributs SMART, historique d'auto-test et rapport PDF." + }, + { + "label": "Moniteur de santé", + "href": "/docs/monitor/health-monitor", + "tail": " — catégorie CPU et température, qui utilise les mêmes capteurs." + }, + { + "label": "Référence de l’API", + "href": "/docs/monitor/api", + "tail": " — points de terminaison matériel et GPU." + }, + { + "label": "Index du tableau de bord", + "href": "/docs/monitor/dashboard", + "tail": "— les autres onglets." + } + ] + } +} diff --git a/web/messages/fr/docs/monitor/dashboard/index.json b/web/messages/fr/docs/monitor/dashboard/index.json new file mode 100644 index 00000000..4884cc4c --- /dev/null +++ b/web/messages/fr/docs/monitor/dashboard/index.json @@ -0,0 +1,101 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Tableau de bord | Documentation ProxMenux", + "description": "Le tableau de bord est l'interface principale de ProxMenux Monitor : dix onglets, dont le lanceur Apps, un en-tête global et un ordre de navigation configurable." + }, + "header": { + "title": "Tableau de bord", + "description": "La vue quotidienne de ProxMenux Monitor : dix onglets, dont le lanceur Apps, un en-tête global et un ordre de navigation configurable.", + "section": "ProxMenux Monitor" + }, + "oneHeader": { + "title": "Un en-tête, dix onglets", + "body": "L'en-tête (logo, nom du nœud, indicateur d'état, durée de fonctionnement, actualisation et thème) reste visible. L'onglet actif change toute la zone de contenu. La couleur de l'indicateur reflète la catégorie la plus grave du moniteur d'état : la même donnée est affichée sur le tableau de bord." + }, + "tabs": { + "heading": "Les dix onglets", + "intro": "Chaque onglet a sa propre page dédiée. Les pages sont ajoutées progressivement à mesure que la documentation est remplie; ci-dessous est la liste complète et la responsabilité de chacun.", + "headerTab": "onglet", + "headerOwns": "Ce que cet onglet couvre", + "rows": [ + { + "name": "Présentation du système", + "linksTo": "/docs/monitor/dashboard/system-overview", + "owns": "CPU / mémoire / widgets de température, nombre de VM et LXC actifs, graphiques historiques, stockage et résumés réseau. Onglet d'atterrissage par défaut jusqu'à ce que l'ordre de navigation soit personnalisé." + }, + { + "name": "Applications", + "linksTo": "/docs/monitor/dashboard/apps", + "owns": "Lanceur unifié de liens web LXC enregistrés et de liens personnalisés, avec catégories, recherche, raccourcis vers les invités et indicateurs de mise à jour par application." + }, + { + "name": "Stockage", + "owns": "Pools Proxmox, disques physiques, données SMART, état ZFS, usure et durée de vie, historique d'observation." + }, + { + "name": "Réseau", + "owns": "Interfaces physiques, bonds, bridges et OVS, adresses IP/MAC, graphiques RX/TX et historique RRD par interface." + }, + { + "name": "VM et LXC", + "owns": "Inventaire des invités, détails de configuration, métriques et journaux, actions de démarrage, arrêt, redémarrage et extinction." + }, + { + "name": "Matériel", + "owns": "Modèle et topologie CPU, mise en page de mémoire, topologie PCIe, GPUs avec surveillance en temps réel per-slot." + }, + { + "name": "Journaux système", + "owns": "Live journalctl avec filtres, historique des tâches Proxmox, journal de notification, paquets de journaux téléchargeables." + }, + { + "name": "Terminal", + "owns": "Shell vers l'hôte ou toute VM/CT dans le navigateur, avec xterm.js via WebSockets." + }, + { + "name": "Sécurité", + "owns": "Configuration auth, mot de passe / 2FA / API jetons, journal d'audit, panneau Fail2Ban optionnel, déploiement Secure Gateway." + }, + { + "name": "Paramètres", + "owns": "Langue de Monitor, ordre de navigation, canaux de notification, fournisseur IA, seuils de surveillance, exclusions et inventaire des optimisations après installation." + } + ] + }, + "headerAnatomy": { + "heading": "Anatomie en-tête", + "items": [ + "Logo + nom du produit sur la gauche. Le logo se transforme en une variante \"mise à jour disponible\" quand une nouvelle version de Monitor est détectée.", + "Identité du nœud : nom obtenu par pvesh get /nodes, avec hostname en solution de repli.", + "Indicateur d'état : Sain (vert), Avertissement (jaune), Critique (rouge). Un clic ouvre le moniteur d'état. Un badge bleu info apparaît si des éléments ignorés restent dans leur période de suppression.", + "Durée de fonctionnement : temps d'activité de l'hôte dans un format lisible.", + "Bouton Actualiser : relance les appels API des données en direct sans recharger toute la page.", + "Sélecteur de thème : clair, sombre ou système. Enregistré dans localStorage." + ] + }, + "whereNext": { + "heading": "Où aller ensuite", + "items": [ + { + "label": "onglet Apps", + "href": "/docs/monitor/dashboard/apps", + "tail": " — lanceur unifié de liens web et relation avec les applications LXC enregistrées." + }, + { + "label": "Onglet Aperçu du système", + "href": "/docs/monitor/dashboard/system-overview", + "tail": "— l'onglet d'atterrissage, entièrement documenté." + }, + { + "label": "Moniteur de santé", + "href": "/docs/monitor/health-monitor", + "tail": " — fenêtre de l'indicateur d'état, avec le détail des dix catégories." + }, + { + "label": "Architecture", + "href": "/docs/monitor/architecture", + "tail": "— comment le tableau de bord parle au moteur de Flask." + } + ] + } +} diff --git a/web/messages/fr/docs/monitor/dashboard/network.json b/web/messages/fr/docs/monitor/dashboard/network.json new file mode 100644 index 00000000..82828702 --- /dev/null +++ b/web/messages/fr/docs/monitor/dashboard/network.json @@ -0,0 +1,251 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Tableau de bord : onglet Réseau | Documentation ProxMenux", + "description": "L’onglet Réseau répertorie les interfaces de l’hôte : cartes physiques, ponts, agrégats, VLAN et interfaces virtuelles VM/LXC. Le détail affiche IP, MAC, état, membres de l’agrégat, trafic depuis le démarrage et historique RRD." + }, + "header": { + "title": "Tableau de bord : onglet réseau", + "description": "Les interfaces signalées par le noyau — cartes physiques, ponts, agrégats, VLAN et ports virtuels VM/LXC — sont regroupées en trois cartes. Cliquez sur une ligne pour voir les adresses, compteurs de trafic et données historiques RRD.", + "section": "ProxMenux Monitor · Tableau de bord" + }, + "intro": { + "title": "Données actuelles et historiques", + "body": "L’état actuel provient de psutil.net_if_stats() et d’ip, l’historique de bande passante du stockage RRD Proxmox via /api/network/<interface>/metrics. Les compteurs sont actualisés environ toutes les 5 secondes et les données RRD du graphique sont chargées à la demande." + }, + "topRow": { + "heading": "Rangée supérieure : quatre cartes statistiques", + "headerCard": "Carte", + "headerWhat": "Ce qu'il montre", + "rows": [ + { + "card": "Trafic réseau", + "what": "Taux agrégé RX / TX sur toutes les interfaces, formaté dans la bonne unité (bps / Kbps / Mbps / Gbps)." + }, + { + "card": "Interfaces actives", + "what": "Deux compteurs : Physical X / Y et Bridges X / Y, actifs par rapport au total. Un premier point à vérifier en cas de panne." + }, + { + "card": "État du réseau", + "what": "État rapide : Sain / Avertissement / Critique selon la liaison, l’accessibilité de la passerelle et l’intégrité du pont. Reprend la catégorie Interfaces réseau de Health Monitor." + }, + { + "card": "Latence du réseau", + "what": "Temps aller-retour vers la passerelle avec un petit graphique. Un clic ouvre le dialogue Latence réseau décrit plus bas : historique et test ping à la demande vers la passerelle, Cloudflare ou Google, avec rapport PDF téléchargeable." + } + ] + }, + "flow": { + "heading": "Diagramme de flux réseau", + "intro": "Entre la rangée supérieure et les trois cartes, Network Flow affiche la topologie en direct. Les chemins des paquets relient les cartes physiques, les ponts au centre, puis les VM et conteneurs. Les impulsions animées représentent le trafic rx/tx actuel sur chaque liaison.", + "imageAlt": "Schéma de flux réseau — NIC à gauche, hôte et ponts au milieu, VM et LXC à droite, avec impulsions animées sur chaque connexion", + "imageCaption": "Flux réseau — nœuds codés en couleurs plus comètes animées dont la direction et l'épaisseur reflètent le trafic en direct.", + "elementsTitle": "Ce que montre le diagramme", + "elementsIntro": "Chaque nœud représente une entrée du même inventaire que les cartes ci-dessous. La disposition en topologie rend leurs relations immédiatement visibles :", + "elements": [ + "Cartes réseau (orange) — interfaces physiques avec liaison active ; les inactives sont estompées.", + "Hôte (orange) — l’hôte Proxmox entre les cartes réseau et les ponts. Un point fixe non cliquable.", + "Ponts (cyan) — ponts Linux et OVS avec au moins une machine invitée active. Les ponts inutilisés sont masqués pour centrer le diagramme sur le trafic réel.", + "LXC (cyan) — conteneurs en cours d’exécution reliés à un pont.", + "VM (violet) — machines virtuelles en cours d’exécution reliées à un pont.", + "Les VM et conteneurs arrêtés sont masqués." + ], + "pulsesTitle": "Ce que l'animation encode", + "pulsesBody": "Les comètes animées qui voyagent sur chaque bord représentent un trafic en direct :", + "pulses": [ + "Direction — vers la carte réseau signifie tx de la machine invitée ; vers la machine, rx.", + "L’épaisseur du trait augmente avec le débit rx+tx de la machine invitée. Une ligne animée faible reste visible sans trafic ; elle s’épaissit lorsque le trafic augmente.", + "Lueur de la tête de comète — teinte chaude vers 1 MB/s, intense à partir de 30 MB/s. Permet de repérer la machine invitée qui utilise le plus une carte réseau.", + "Clic — tous les nœuds sauf l’hôte ouvrent le dialogue de détail d’interface décrit plus bas. Cliquer sur l’hôte n’a aucun effet ; aucun dialogue ne lui est associé ici." + ], + "useTitle": "Quand c'est utile", + "useBody": "Les cartes montrent ce qui existe ; le diagramme montre les connexions et le trafic. Il permet de repérer des machines sur un même pont, deux machines très actives partageant une carte réseau — un possible goulot d’étranglement — ou une VM saturant une liaison alors que les autres restent peu actives." + }, + "groups": { + "heading": "Trois groupes d'interface", + "intro": "Trois cartes regroupent les interfaces par rôle. Chaque en-tête indique le nombre d’interfaces actives. Une étiquette colorée identifie le type de chaque interface :", + "badges": [ + "Bleu Physical — réel NIC.", + "Vert Bridge — Pont Linux ou pont OVS (vmbr*).", + "Violet Bond — agrégat bond / LACP / active-backup.", + "Cyan VLAN — sous-interface VLAN (vmbr0.10, eno1.42, …)." + ], + "clickable": "Chaque ligne est cliquable : interfaces physiques, virtuelles, ponts et agrégats. Le détail décrit plus bas affiche informations de base, IP, compteurs et historique RX/TX du stockage RRD Proxmox.", + "physicalTitle": "Interfaces physiques", + "physicalBody": "Interfaces physiques reconnues par le noyau : eno1, enp4s0, eth0, wlp3s0, etc. Chaque appareil a une ligne avec l’étiquette bleue Physical et l’état de liaison. Les membres d’un agrégat apparaissent aussi avec une référence à leur bond.", + "bridgeTitle": "Interfaces de pont", + "bridgeBody": "Ponts Linux (vmbr0, vmbr1, …) et OVS gérés par Proxmox. Chaque ligne affiche l’étiquette verte Bridge, l’interface physique si le pont n’a qu’un port et son état. Les agrégats portent l’étiquette violette Bond, les sous-interfaces VLAN l’étiquette cyan VLAN.", + "vmTitle": "Interfaces VM / LXC", + "vmBody": "Interfaces tap* et veth* créées au démarrage des machines invitées, une par carte virtuelle. L’en-tête affiche X / Y Active et les lignes renvoient à leur VM/CT dans l’onglet VMs et LXCs. Après un arrêt, les entrées inactives disparaissent au cycle d’actualisation suivant." + }, + "drillIn": { + "heading": "Détail par interface", + "intro": "Un clic sur une ligne ouvre un dialogue avec cinq blocs :", + "headerBlock": "Bloc", + "headerContents": "Contenu", + "rows": [ + { + "block": "Informations de base", + "contents": "Nom, type (physique / pont / bond / VLAN / vm), adresse MAC, état (actif / inactif), MTU et interface physique sous-jacente pour les types virtuels." + }, + { + "block": "Membres du bond", + "contents": "Pour les bonds uniquement : chaque carte membre avec son état actif ou défaillant, le mode (active-backup / 802.3ad / balance-alb / …) et l’interface principale si elle est définie." + }, + { + "block": "Adresses IP", + "contents": "Chaque adresse IPv4 / IPv6 avec la longueur du préfixe. Les adresses link-local configurées automatiquement sont listées mais grisées." + }, + { + "block": "Graphique historique", + "contents": "Bande passante RX/TX sur la période choisie (1 heure / 24 heures / 7 jours / 30 jours / 1 an), obtenue via /api/network/<interface>/metrics (RRD Proxmox)." + }, + { + "block": "Trafic depuis le dernier démarrage", + "contents": "Total des octets et paquets RX/TX depuis le dernier démarrage de l’hôte, avec compteurs d’erreurs et de paquets abandonnés." + } + ], + "inactiveTitle": "Le détail des interfaces inactives reste accessible", + "inactiveBody": "Si l’interface est inactive, le dialogue affiche un avis « Interface inactive » sans compteurs actuels. La configuration — adresses et membres du bond — et l’historique restent visibles pour déterminer la cause et le moment de la panne." + }, + "latency": { + "heading": "Dialogue Latence réseau", + "intro": "Cliquez sur Latence réseau dans la rangée supérieure pour ouvrir son dialogue : historique, test à la demande, trois cibles et rapport PDF téléchargeable.", + "targetsTitle": "Cibles", + "targetsIntro": "La liste en haut sélectionne la cible du ping :", + "targets": [ + "Passerelle — votre routeur LAN. Teste uniquement le trajet local pour examiner les problèmes de commutateur ou de câblage sans inclure le WAN.", + "Cloudflare (1.1.1.1) — résolveur DNS public sur un réseau anycast. Teste le trajet WAN.", + "Google (8.8.8.8) — cible publique alternative pour vérifier les résultats ou en cas de problèmes régionaux de Cloudflare." + ], + "mode1Title": "Mode 1 — Vue historique", + "mode1Alt": "Dialogue de latence en mode historique, cible Passerelle, période d’une heure et mesures précédentes tracées", + "mode1Caption": "Historique de la passerelle sur la dernière heure. Le collecteur de température et de latence enregistre les mesures en base toutes les 60 secondes.", + "mode1Body1": "Mode initial du dialogue. Une seconde liste choisit la période (1 heure / 6 heures / 24 heures / 3 jours / 7 jours). Au-dessus figurent Actuel / Minimum / Moyenne / Maximum et un état Excellent / Bon / Moyen / Mauvais selon les seuils ci-dessous.", + "mode1Body2": "Source : les mesures utilisées par Health Monitor pour détecter les ralentissements persistants. Le thread _temperature_collector_loop mesure la passerelle toutes les 60 secondes et conserve l’historique localement dans SQLite.", + "mode2Title": "Mode 2 — Essai en temps réel", + "mode2Alt": "Dialogue de latence exécutant un ping en temps réel vers Cloudflare, progression à 50 % et nouvelles mesures sur le graphique", + "mode2Caption": "Test de deux minutes vers Cloudflare avec une mesure toutes les cinq secondes, tracée dès son arrivée. Arrêter termine le test plus tôt ; Tester à nouveau ajoute des mesures aux mêmes données.", + "mode2Intro": "Changer la cible en Cloudflare ou Google commence un test de ping sur demande. Comportement:", + "mode2Items": [ + "Durée — deux minutes par test avec barre de progression et secondes restantes.", + "Fréquence — une mesure toutes les cinq secondes, 24 par test.", + "Méthode — ICMP Echo Request (ping), trois pings consécutifs par mesure avec latence moyenne.", + "Stop – termine immédiatement le test ; des données partielles sont conservées.", + "Tester à nouveau — ajoute des mesures aux données existantes pour constituer un historique plus long sur plusieurs tests.", + "Indicateur d’état actuel — réévalué après chaque mesure selon les mêmes seuils Excellent / Bon / Moyen / Mauvais." + ], + "thresholdsTitle": "Seuils de performance", + "headerStatus": "État", + "headerRange": "Intervalle", + "headerImpact": "Impact pratique", + "thresholdRows": [ + { + "status": "Excellent", + "range": "< 50 ms", + "impact": "Optimisé pour les applications en temps réel, les jeux et les appels vidéo." + }, + { + "status": "Bon", + "range": "50 – 100 ms", + "impact": "Acceptable pour la plupart des applications avec un impact minimal." + }, + { + "status": "Moyen", + "range": "100 – 200 ms", + "impact": "Un retard notable. Peut affecter les applications VoIP et interactives." + }, + { + "status": "Mauvais", + "range": "> 200 ms", + "impact": "Latence importante. Enquête recommandée." + } + ], + "reportTitle": "Rapport de latence réseau (PDF)", + "reportIntro": "Les deux modes ont un bouton Rapport près du sélecteur de cible. Il génère un PDF des mesures que vous pouvez joindre à une demande d’assistance auprès de votre FAI.", + "reportPreviewAlt": "Première page PDF du rapport de latence : synthèse, jauge, statistiques, graphique et guide des seuils", + "reportPreviewCaption": "La première page contient la synthèse, la jauge, les statistiques principales, l’évolution de la latence et le guide des seuils. À partir de la page 2 figurent le tableau des mesures et la méthodologie.", + "downloadLabel": "Télécharger un exemple de rapport de latence (PDF)", + "sectionsIntro": "Le rapport comporte six sections :", + "sections": [ + "Synthèse — jauge de 0 à plus de 300 ms avec zones verte, jaune et rouge ; état Excellent / Bon / Moyen / Mauvais ; cible, mode, nombre de mesures et résumé des pertes de paquets.", + "Statistiques de latence — quatre indicateurs : actuel, minimum, moyenne et maximum ; plus le nombre de mesures, la perte moyenne de paquets et la période du test.", + "Graphique de latence — graphique en aires des mesures du test, avec repères minimum, moyenne et maximum sur l’axe vertical.", + "Seuils de performance — la même échelle à quatre niveaux, avec un point coloré par niveau.", + "Résultats détaillés — tableau numéroté avec horodatage, latence, perte de paquets et état de chaque mesure. Permet de repérer les pics brefs masqués par les moyennes.", + "Méthodologie — ICMP Echo Request, trois pings consécutifs par mesure, nom et IP de la cible et évaluation finale issue de l’état." + ], + "useCaseTitle": "Cas d’utilisation : assistance de votre FAI", + "useCaseBody": "Lancez deux minutes de test Cloudflare lorsque la connexion ralentit, prolongez avec Tester à nouveau, puis choisissez Rapport. Le PDF contient toutes les mesures et la méthodologie. Vous pouvez le joindre à une demande d’assistance avec les heures de l’incident ; le FAI décide des justificatifs nécessaires." + }, + "excluding": { + "heading": "Exclure des interfaces de la surveillance", + "body1": "Vous pouvez exclure des interfaces de la surveillance : ponts volontairement désactivés, interfaces de test ou cartes retirées encore configurées. Le réglage est conservé dans excluded_interfaces : Health Monitor ne génère ni avertissements ni notifications et ne les inclut pas dans l’état global.", + "body2": "Dans le menu contextuel, choisissez Exclure de la surveillance. L’interface reste visible avec une étiquette violette exclue. Le même menu permet de réactiver la surveillance." + }, + "dataCollected": { + "heading": "Comment les données sont collectées", + "headerSection": "Section de l'onglet", + "headerEndpoint": "Point de terminaison", + "headerSource": "Source", + "rows": [ + { + "section": "Inventaire des interfaces", + "endpoint": "/api/network", + "source": "ip -j addr + ip -j link et inspection des bonds et ponts." + }, + { + "section": "Cartes sommaires", + "endpoint": "/api/network/summary", + "source": "Synthèse de l’inventaire et nombre d’interfaces actives et inactives." + }, + { + "section": "Historique RX/TX par interface", + "endpoint": "/api/network//metrics", + "source": "Les compteurs actuels utilisent /proc/net/dev ; l’historique vient de RRD Proxmox via pvesh. Les interfaces VM/LXC utilisent les données de la machine invitée ; les interfaces physiques et ponts, celles du nœud." + }, + { + "section": "Latence: actuelle", + "endpoint": "/api/network/latency/current", + "source": "Courte série de ping vers la passerelle ou la cible configurée." + }, + { + "section": "Latence : historique", + "endpoint": "/api/network/latency/history", + "source": "Mesures enregistrées environ toutes les 60 secondes par le collecteur de température et de latence en arrière-plan." + } + ], + "codeComment1": "# Vérifier l’état des interfaces affiché dans le tableau de bord", + "codeComment2": "# Vérifier une mesure actuelle de latence de bout en bout" + }, + "whereNext": { + "heading": "Où aller ensuite", + "items": [ + { + "label": "Moniteur de santé", + "href": "/docs/monitor/health-monitor", + "tail": " — catégorie Réseau et seuils de l’historique de latence." + }, + { + "label": "Référence de l’API", + "href": "/docs/monitor/api", + "tail": " — points de terminaison réseau et latence." + }, + { + "label": "Intégrations", + "href": "/docs/monitor/integrations", + "tail": " — la collecte Prometheus expose les mêmes métriques réseau." + }, + { + "label": "Indice du tableau de bord", + "href": "/docs/monitor/dashboard", + "tail": "— les autres onglets." + }, + { + "label": "ProxMenux → Réseau", + "href": "/docs/network", + "tail": "— le côté actions: analyse de pont, noms d'interface persistants, sauvegarde & redémarrage, iperf3." + } + ] + } +} diff --git a/web/messages/fr/docs/monitor/dashboard/security.json b/web/messages/fr/docs/monitor/dashboard/security.json new file mode 100644 index 00000000..304d63dd --- /dev/null +++ b/web/messages/fr/docs/monitor/dashboard/security.json @@ -0,0 +1,246 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Tableau de bord : onglet Sécurité | Documentation ProxMenux", + "description": "L’onglet Sécurité regroupe les protections en deux colonnes : ProxMenux Monitor (authentification, SSL/HTTPS, jetons d’API, Secure Gateway) et Proxmox VE (pare-feu, Fail2Ban, audit Lynis). Découvrez l’assistant Secure Gateway, l’audit Lynis et l’installation et le réglage des règles Fail2Ban." + }, + "header": { + "title": "Tableau de bord : onglet Sécurité", + "description": "Les contrôles de sécurité sont répartis en deux blocs : la configuration de Monitor (authentification, SSL, jetons, Secure Gateway) et celle de l’hôte Proxmox surveillé (pare-feu, Fail2Ban, Lynis).", + "section": "ProxMenux Monitor · Tableau de bord" + }, + "intro": { + "title": "Deux périmètres, un onglet", + "body": "L’onglet Sécurité comporte deux sections : ProxMenux Monitor (paramètres du tableau de bord) et Proxmox VE (paramètres de l’hôte). Les cartes Fail2Ban et Lynis proposent d’installer ces outils s’ils sont absents, puis affichent leurs commandes une fois installés." + }, + "monitor": { + "heading": "ProxMenux Monitor", + "intro": "Quatre cartes permettent de gérer l’accès au tableau de bord et l’authentification." + }, + "auth": { + "heading": "Authentification", + "imageAlt": "Carte d’authentification avec l’état Activée, les boutons Déconnexion et Modifier le mot de passe, des informations sur l’authentification à deux facteurs et des boutons pour l’activer ou désactiver l’authentification", + "imageCaption": "Carte avec l’authentification activée : indicateur d’état, Modifier le mot de passe, Activer la 2FA et l’action destructive Désactiver l’authentification.", + "intro": "Cette carte gère la connexion au tableau de bord. Le premier lancement, la politique de mots de passe, la configuration TOTP et la récupération après perte de l’authentificateur sont décrits dans Accès et authentification. Cette carte permet de gérer ces paramètres au quotidien :", + "items": [ + "État de l’authentification — indicateur Activée / Désactivée / Refusée.", + "Modifier le mot de passe — mot de passe actuel + nouveau mot de passe + confirmation.", + "Activer / Désactiver l’authentification à deux facteurs — ouvre le dialogue de configuration avec code QR à l’activation et demande le mot de passe actuel à la désactivation.", + "Désactiver l’authentification — action destructive qui réaffiche le dialogue initial Protéger votre tableau de bord ? lors de la prochaine visite." + ] + }, + "ssl": { + "heading": "SSL/HTTPS", + "imageAlt": "Carte SSL/HTTPS avec l’état HTTP sans SSL, le certificat Proxmox détecté avec son sujet, son émetteur et son expiration, et les options pour utiliser ce certificat ou un certificat personnalisé", + "imageCaption": "Carte SSL/HTTPS avec HTTPS désactivé. Monitor détecte le certificat installé sur l’hôte Proxmox et permet de l’utiliser en un clic. L’option Utiliser un certificat personnalisé permet de choisir vos propres fichiers stockés ailleurs.", + "intro": "Permet d’accéder au tableau de bord par HTTPS sans proxy inverse. La carte détecte le certificat utilisé par Proxmox dans /etc/pve/local/ et affiche son sujet, son émetteur et sa date d’expiration pour vérification avant activation. Deux méthodes sont proposées :", + "items": [ + "Utiliser le certificat Proxmox — Monitor réutilise le certificat de l’hôte en un clic. Adapté si PVE et le tableau de bord utilisent déjà le même nom DNS.", + "Utiliser un certificat personnalisé — collez les chemins absolus du certificat .pem et de la clé privée .key. Ils sont validés avant le redémarrage du service. Si le chargement échoue, le tableau de bord repasse automatiquement en HTTP et reste accessible." + ], + "enabledAlt": "Carte SSL/HTTPS avec HTTPS activé, certificat actif avec les chemins pve-ssl.pem et pve-ssl.key et bouton Désactiver HTTPS", + "enabledCaption": "HTTPS actif — la carte affiche le certificat utilisé, ses chemins et l’action Désactiver HTTPS, qui rétablit HTTP sur le même port.", + "acmeTitle": "ACME / Let's Encrypt via Proxmox", + "acmeBody": "Si Let’s Encrypt est déjà configuré sur votre nœud Proxmox dans Datacenter → Certificats → ACME, le tableau de bord réutilise le certificat présenté aux navigateurs lorsque vous cliquez sur Utiliser le certificat Proxmox. Aucune configuration ACME distincte n’est nécessaire pour Monitor.", + "walkthroughLink": "Consultez HTTPS pour ProxMenux Monitor pour découvrir la détection du certificat ACME, les données écrites sur disque et l’utilisation d’une paire .pem / .key personnalisée." + }, + "apiTokens": { + "heading": "Jetons d’accès à l’API", + "emptyAlt": "Carte de jetons d’accès à l’API vide, avec des informations sur les jetons et le bouton Générer un nouveau jeton d’API", + "emptyCaption": "Carte des jetons après une nouvelle installation. L’encadré À propos des jetons d’API résume leur durée de validité, leur utilisation et leur insertion dans les en-têtes Authorization: Bearer.", + "intro": "Jetons valables un an pour les intégrations automatisées : widgets Homepage, capteurs REST Home Assistant, collecteurs Grafana, flux n8n et scripts personnalisés. La carte passe par trois états : vide → formulaire → jeton généré.", + "generateBody": "Générer un jeton. Cliquez sur Générer un nouveau jeton d’API. Saisissez un nom de jeton descriptif pour l’identifier ensuite et votre mot de passe comme confirmation supplémentaire. Si la 2FA est activée, le code TOTP actuel est également demandé.", + "generateAlt": "Formulaire de génération d’un jeton d’API avec les champs Nom du jeton et Mot de passe et les boutons Générer et Annuler", + "generateCaption": "Formulaire de génération d’un jeton d’API : saisissez un nom et confirmez avec votre mot de passe et le code TOTP si la 2FA est activée.", + "saveBody": "Enregistrez immédiatement le jeton. Sa valeur complète s’affiche une seule fois après sa création. La carte le signale par un avis orange et un bouton de copie. Vous ne pourrez pas la récupérer ensuite : seul le préfixe restera visible dans la liste des jetons actifs.", + "generatedAlt": "Jeton d’API généré avec valeur masquée, bouton de copie, instructions pour l’en-tête Authorization: Bearer et liste des jetons actifs avec leur préfixe", + "generatedCaption": "Jeton généré : la valeur s’affiche une seule fois, avec un bouton de copie et l’extrait exact Authorization: Bearer. La liste des jetons actifs conserve le nom, le préfixe et la date de création pour permettre leur révocation individuelle.", + "outro": "Chaque jeton actif possède un bouton Révoquer. La révocation l’invalide immédiatement et interrompt les intégrations qui l’utilisent. Des exemples pour Homepage, Home Assistant, n8n et Prometheus figurent dans Intégrations." + }, + "gateway": { + "heading": "Secure Gateway", + "cardAlt": "Carte Secure Gateway avant tout déploiement, avec le bouton Déployer Secure Gateway", + "cardCaption": "Carte Secure Gateway sur une nouvelle installation : un bouton lance l’assistant.", + "intro": "Accédez au tableau de bord, à l’interface web Proxmox et aux machines invitées depuis votre réseau Tailscale, sans exposer de port sur Internet. Monitor déploie sur l’hôte un conteneur LXC Alpine exécutant tailscaled comme routeur de sous-réseau. Après approbation dans la console Tailscale, vos appareils distants peuvent joindre l’adresse IP LAN de l’hôte depuis n’importe où.", + "wizardTitle": "Assistant étape par étape", + "wizardIntro": "Avant de cliquer sur Deploy Secure Gateway, générez une clé d’authentification dans la console Tailscale. L’assistant la demandera à l’étape 2.", + "step0Title": "0. Générer la clé d’authentification Tailscale", + "step0Body": "Connectez-vous à login.tailscale.com/admin/settings/keys et cliquez sur Generate auth key…. Choisissez une clé préauthentifiée pour éviter une connexion interactive depuis la passerelle. Copiez la valeur : elle ne s’affiche qu’une seule fois.", + "step0Alt": "Page Settings → Keys de la console Tailscale, avec le bouton Generate auth key mis en évidence", + "step0Caption": "Console d'administration Tailscale — Paramètres → Clés → Générer la clé auth.... Utilisez un compte Tailscale gratuit si vous n'en avez pas encore (lien à l'intérieur de l'assistant).", + "step1Title": "1. Ouvrez l'assistant", + "step1Body": "Revenez à l’onglet Sécurité et cliquez sur Deploy Secure Gateway. La première étape présente les fonctions et les prérequis.", + "step1Alt": "Introduction de l’assistant Secure Gateway : accès VPN sans redirection de ports et avec chiffrement de bout en bout", + "step1Caption": "Étape 1 — aperçu de ce que fournit la passerelle sécurisée et un rappel que vous aurez besoin d'un compte Tailscale gratuit.", + "step2Title": "2. Authentification Tailscale", + "step2Body": "Collez la clé d’authentification de l’étape 0 et choisissez un nom d’hôte. La passerelle apparaîtra sous ce nom dans la console Tailscale, généralement proxmox-gateway ou le nom de votre nœud.", + "step2Alt": "Étape de l’assistant Secure Gateway demandant la clé d’authentification Tailscale et le nom d’hôte de l’appareil, avec un lien pour générer la clé", + "step2Caption": "Étape 2 : collez la clé préauthentifiée et choisissez le nom d’hôte. Si vous avez sauté l’étape 0, le lien sous le champ ouvre la page Tailscale correspondante.", + "step3Title": "3. Portée de l'accès", + "step3Intro": "Choisissez les ressources accessibles depuis votre réseau Tailscale via la passerelle :", + "step3Items": [ + "Proxmox Only — seulement l'interface utilisateur Proxmox et le moniteur. La plus petite surface d'attaque.", + "Réseau local complet — tout le sous-réseau LAN (détecté automatiquement depuis l'interface principale de l'hôte). Permet d'atteindre le NAS, les imprimantes, les VM et tout autre périphérique LAN.", + "Sous-réseaux personnalisés — indiquez les CIDR souhaités. Pour les configurations à plusieurs VLAN où seuls certains segments doivent être accessibles." + ], + "step3Alt": "Étape Périmètre d’accès de l’assistant Secure Gateway avec les options Proxmox uniquement, Réseau local complet et Sous-réseaux personnalisés", + "step3Caption": "Étape 3 : choisissez le périmètre d’accès. Réseau local complet renseigne automatiquement le sous-réseau LAN détecté.", + "step4Title": "4. Options avancées (facultatif)", + "step4Intro": "Deux options, toutes deux désactivées par défaut :", + "step4Items": [ + "Exit Node — une fois activé et sélectionné sur un appareil distant, tout le trafic Internet de cet appareil passe par la connexion WAN de l’hôte Proxmox. En voyage, le trafic de votre téléphone utilise ainsi votre connexion domestique.", + "Accepter les routes — permet à cette passerelle de joindre les réseaux annoncés par les autres routeurs de sous-réseau Tailscale, pour les installations multisites." + ], + "step4Alt": "Étape Options avancées de Secure Gateway avec les cases Exit Node et Accept Routes", + "step4Caption": "Étape 4 : Exit Node et Accept Routes. Laissez ces deux options désactivées si vous souhaitez simplement accéder au tableau de bord depuis votre téléphone ou ordinateur portable.", + "step5Title": "5. Vérifier et déployer", + "step5Body": "Résumé final avant le déploiement. L’assistant rappelle l’étape manuelle à effectuer ensuite dans la console Tailscale : approuver la route de sous-réseau.", + "step5Alt": "Étape Vérifier et déployer de Secure Gateway avec le résumé du nom d’hôte, du mode d’accès, des réseaux, d’Exit Node et d’Accept Routes et le bouton Déployer la passerelle", + "step5Caption": "Étape 5 — examiner la configuration et le déploiement. L'avis bleu au bas annonce l'approbation de route en attente.", + "approvalTitle": "Une dernière étape manuelle dans Tailscale admin", + "approvalBody": "Après le déploiement, ouvrez login.tailscale.com/admin/machines et approuvez la route de sous-réseau annoncée par la passerelle. Sans cette approbation, les appareils distants du réseau Tailscale ne peuvent pas joindre les IP LAN via la passerelle. Tailscale signale les routes en attente en jaune sur la ligne de l’appareil : cliquez sur Edit route settings et cochez la route." + }, + "pve": { + "heading": "Proxmox VE", + "intro": "Les protections de l’hôte : pare-feu, prévention des intrusions et audit de sécurité. Les cartes Fail2Ban et Lynis proposent leur installation si nécessaire, puis affichent leurs commandes de gestion." + }, + "firewall": { + "heading": "Proxmox Firewall", + "imageAlt": "Carte du pare-feu Proxmox avec états du cluster et de l’hôte, règles d’accès rapide pour Monitor et l’interface web Proxmox, compteurs, liste des règles et bouton Ajouter une règle", + "imageCaption": "Carte du pare-feu Proxmox : interrupteurs pour le cluster et l’hôte, ports courants dans Règles d’accès rapide, compteurs dans Aperçu des règles et liste complète avec + Ajouter une règle.", + "intro": "La carte gère la configuration du pare-feu Proxmox VE. Le moteur classique utilise iptables, l’alternative utilise nftables. Elle ne gère pas les règles créées hors de Proxmox. Trois blocs :", + "items": [ + "Pare-feu du cluster + pare-feu de l’hôte — interrupteurs globaux. Le pare-feu du cluster doit être actif pour que les règles de l’hôte s’appliquent. La carte indique cette dépendance près du réglage.", + "Règles d’accès rapide — lignes prédéfinies pour 8008/TCP (Monitor) et 8006/TCP (interface web Proxmox), avec l’état autorisé, bloqué ou non protégé. L’interface Proxmox est autorisée par une macro de pare-feu intégrée qui ne peut pas être supprimée par erreur.", + "Aperçu des règles — compteurs du total des règles, des règles accept, des règles drop/reject et des ports distincts protégés. Les valeurs proviennent de /etc/pve/firewall/cluster.fw et /etc/pve/nodes/<node>/host.fw.", + "Règles du pare-feu — liste avec action, protocole, port, source et niveau. + Ajouter une règle ouvre l’éditeur dans la carte ; la corbeille supprime la règle. Les modifications sont enregistrées dans les fichiers Proxmox et apparaissent aussi dans son interface (Datacenter / Node → Firewall)." + ] + }, + "fail2ban": { + "heading": "Fail2Ban", + "subHeading": "(selon l’état)", + "whatIs": "De quoi s’agit-il ? Fail2Ban est un service libre qui détecte les échecs de connexion répétés dans les journaux et bloque l’IP au niveau du pare-feu. Il protège SSH et les formulaires web contre les attaques par force brute continues. ProxMenux configure trois jails : SSH, connexion web Proxmox (port 8006) et connexion ProxMenux Monitor (port 8008).", + "notBundled": "Fail2Ban n’est pas fourni. La carte détecte sa présence et s’adapte : s’il manque, elle propose de l’installer en un clic. Une fois installé, elle affiche l’état des jails et les IP bloquées, et permet de régler le nombre de tentatives et la durée de blocage pour chaque jail.", + "notInstalledAlt": "Carte Fail2Ban non installé avec la protection prévue pour SSH, l’interface web Proxmox et Monitor via nftables et le bouton Installer et configurer Fail2Ban", + "notInstalledCaption": "La carte Fail2Ban avant l'installation — la boîte bleue prévisualise ce que l'installation va configurer.", + "clickBody": "Cliquez sur Installer et configurer Fail2Ban pour ouvrir un dialogue de confirmation répertoriant toutes les modifications du script sur l’hôte :", + "confirmAlt": "Confirmation Fail2Ban avec mode SSH agressif, protection Proxmox sur le port 8006 et Monitor sur le port 8008, détection de nftables, réglage des journaux journald et renforcement de SSH MaxAuthTries", + "confirmCaption": "Confirmation d’installation : liste des jails, réglage de la journalisation journald pour lire les événements SSH et renforcement supplémentaire de SSH (MaxAuthTries=3).", + "confirmIntro": "Après confirmation, un panneau affiche l’installation en direct : apt, configuration des jails et tests. Le mécanisme est le même que celui de l’installateur CLI ProxMenux.", + "progressAlt": "Panneau avec journal d’installation Fail2Ban : paquet, journald MaxLevelStore pour l’authentification, jails, détection de nftables, renforcement MaxAuthTries, test fail2ban-client et message de fin", + "progressCaption": "Installation en cours : chaque étape est consignée dans le panneau. Le message Connection closed en bas marque la fin de la transmission.", + "afterInstall": "Après l’installation, la carte affiche l’état en direct : jails configurés, IP bloquées et blocages récents. Les onglets séparent Jails et IP bloquées de l’Activité récente, les N dernières entrées du journal Fail2Ban.", + "activeAlt": "Carte Fail2Ban active avec trois jails (proxmenux, proxmox, sshd), compteurs des IP bloquées, du total des blocages et des tentatives échouées et lignes avec tentatives, durée de blocage, période et roue dentée", + "activeCaption": "Fail2Ban actif : les trois jails par défaut (proxmenux, proxmox, sshd) avec leurs réglages de tentatives, durée de blocage et période de détection.", + "tuneBody": "Régler les règles du jail. Cliquez sur sa roue dentée pour modifier Max Retries, Ban Time et Find Time, la période glissante de comptage des tentatives. Un blocage permanent dure jusqu’à sa levée manuelle. Le formulaire explique les valeurs courantes.", + "configAlt": "Formulaire du jail sshd avec Max Retries, Ban Time en secondes, option Permanent Ban, Find Time, aide sur les valeurs courantes et bouton Enregistrer la configuration", + "configCaption": "Modification du jail sshd : réduisez Max Retries si vous utilisez SSH uniquement depuis votre sous-réseau, ou augmentez Ban Time pour un tableau de bord exposé sur Internet.", + "outro": "Le guide Installation, configuration et désinstallation couvre aussi l’installation manuelle, la modification de SSH MaxAuthTries et le journal proxmenux-auth.log. Consultez ProxMenux → Sécurité → Fail2Ban.", + "calloutTitle": "Sans Fail2Ban, ce mécanisme ne bloque pas les IP", + "calloutBody": "ProxMenux Monitor vérifie les IP bloquées par Fail2Ban au niveau applicatif avant de traiter les requêtes Flask. Il interroge fail2ban-client et conserve le résultat en cache pendant 30 secondes ; il ne lit pas de table SQL de blocages. Sans Fail2Ban, les échecs sont consignés dans proxmenux-auth.log, mais ce mécanisme ne bloque pas les IP." + }, + "lynis": { + "heading": "Audit de sécurité Lynis", + "subHeading": "(selon l’état)", + "whatIs": "De quoi s’agit-il ? Lynis est un outil libre d’audit de sécurité qui effectue environ 280 tests sur l’hôte : permissions, durcissement du noyau, SSH, vulnérabilités des paquets, politique cryptographique, tâches planifiées, identification des services, etc. Il produit un indice de durcissement de 0 à 100, des avertissements et des suggestions. C’est une référence courante pour évaluer les serveurs Debian.", + "whyUseful": "Pourquoi est-ce utile ? Évaluer la sécurité en lisant chaque fichier de configuration est difficile. Lynis repère les oublis courants : protections du noyau absentes, chiffrements SSH faibles, journaux non persistants ou NOPASSWD dans sudoers pour les comptes par défaut. Une nouvelle analyse après les réglages ProxMenux permet de comparer l’amélioration par un score.", + "notInstalledAlt": "Carte Lynis non installé avec bouton Installer Lynis et fonctions : indice de durcissement, détection des vulnérabilités, conformité et sources GitHub", + "notInstalledCaption": "Carte Lynis avant l'installation — la boîte bleue résume ce que l'outil fait.", + "notBundled": "Lynis n’est pas fourni non plus. ProxMenux l’installe directement depuis les sources officielles GitHub plutôt que depuis le paquet Debian.", + "confirmAlt": "Dialogue de confirmation Lynis présentant ses fonctions : indice de durcissement, détection des vulnérabilités, analyse de configuration, conformité et sources du dépôt officiel GitHub", + "confirmCaption": "Confirmation d’installation indiquant explicitement la source GitHub.", + "progressAlt": "Panneau d’installation Lynis en direct, avec installation de la dernière version, confirmation de la version 3.1.6 et message de fin", + "progressCaption": "Installation en cours : le panneau affiche le journal en direct, comme pour Fail2Ban.", + "afterInstall": "Après l’installation, la carte affiche la version et un historique d’audit vide. Cliquez sur Lancer l’audit de sécurité pour démarrer la première analyse.", + "installedAlt": "Carte Lynis après installation avec version 3.1.6, date de dernière analyse, indice de durcissement 0, avertissements 0, suggestions 0, rapport vide et bouton Lancer l’audit de sécurité", + "installedCaption": "Lynis est installé, sans audit pour le moment. Les indicateurs affichent initialement zéro.", + "runningAlt": "Carte Lynis pendant l’audit avec message d’analyse en cours, durée estimée de 2 à 5 minutes et bouton Audit en cours désactivé", + "runningCaption": "Audit en cours : le bouton affiche un indicateur de chargement et la carte précise que l’analyse peut durer de 2 à 5 minutes.", + "finishedBody": "À la fin, la carte affiche les résultats : indice de durcissement, avertissements, suggestions et liste des Rapports d’audit avec les analyses précédentes.", + "resultsAlt": "Carte Lynis avec indice 71, détail Lynis 66 et PVE 71, 3 avertissements, 40 suggestions, score adapté à Proxmox de 71 sur 100 dans la catégorie Bon, rapports téléchargeables en PDF et bouton Lancer l’audit de sécurité", + "resultsCaption": "Exemple de résultats : indice de durcissement 71/100 (Bon). La carte affiche le score brut Lynis (66) et le score adapté à Proxmox (71). L’ajustement dépend du score brut et de la proportion des constats considérés comme normaux sur Proxmox VE ; il n’ajoute pas systématiquement 11 points.", + "scoreTitle": "Score brut Lynis vs Score ajusté Proxmox", + "scoreIntro": "Les règles Lynis visent les systèmes Debian généralistes. Proxmox s’en écarte parfois pour des raisons légitimes, par exemple des services de cluster exécutés en root ou des réglages spécifiques de journald. La carte affiche les deux scores pour permettre de :", + "scoreItems": [ + "Suivre le score brut Lynis, comme le ferait un auditeur externe.", + "Suivre le score adapté à Proxmox, une référence plus pertinente pour comparer les nœuds d’un même cluster." + ], + "reportBody": "Rapport complet. Le bouton PDF de chaque audit télécharge un rapport de plusieurs pages : synthèse, informations système, état de sécurité, avertissements expliqués, suggestions classées par impact et inventaire des paquets. Vous pouvez le joindre à une revue de sécurité.", + "reportAlt": "Première page d’exemple du rapport PDF Lynis avec synthèse, indice 71 sur 100, nombre d’avertissements et de suggestions, nom d’hôte, noyau, version Lynis, date et aperçu de la sécurité", + "reportCaption": "Première page du rapport : synthèse, informations système et état de sécurité. La suite contient les avertissements détaillés, les suggestions et la liste des paquets installés. Un exemple PDF est joint pour référence.", + "runPeriodically": "Exécutez l'audit périodiquement (après les mises à niveau majeures de Proxmox, après avoir appliqué des modifications post-installation, avant d'ouvrir un chemin d'accès à distance) et gardez les rapports — la tendance compte plus que n'importe quel numéro.", + "outro": "Le guide d’installation, configuration et désinstallation et l’analyse d’un exemple de rapport figurent dans ProxMenux → Sécurité → Lynis." + }, + "dataCollected": { + "heading": "Comment les données sont collectées", + "headerCard": "Carte", + "headerEndpoint": "Point de terminaison", + "headerSource": "Source", + "rows": [ + { + "card": "Authentification, 2FA, changement de mot de passe", + "endpoint": "/api/auth/*", + "source": "Configuration locale d’authentification dans ~/.config/proxmenux-monitor/auth.json ; JWT émis par Monitor." + }, + { + "card": "SSL/HTTPS", + "endpoint": "/api/auth/ssl/*", + "source": "openssl x509 sur /etc/pve/local/pve-ssl.pem + /etc/proxmenux/ssl_config.json." + }, + { + "card": "Lister, créer et révoquer les jetons d’API", + "endpoint": "/api/auth/api-tokens", + "source": "Les rangées de jetons sont conservées localement; rien ne quitte l'hôte." + }, + { + "card": "Portail sécurisé (déploiement + statut)", + "endpoint": "/api/oci/*", + "source": "Crée un conteneur LXC Alpine avec tailscaled via pct create / pct exec." + }, + { + "card": "Statut et règles du pare-feu", + "endpoint": "/api/security/firewall/*", + "source": "pve-firewall + /etc/pve/firewall/<cluster|host>.fw." + }, + { + "card": "Fail2Ban (état disponible après installation)", + "endpoint": "/api/security/fail2ban/*", + "source": "fail2ban-client status, /var/log/fail2ban.log, /etc/fail2ban/jail.local." + }, + { + "card": "Audit Lynis (uniquement lorsqu'il est installé)", + "endpoint": "/api/security/lynis/*", + "source": "Exécute lynis audit system en arrière-plan; rapport analysé à partir de /var/log/lynis-report.dat." + } + ] + }, + "whereNext": { + "heading": "Où aller ensuite", + "items": [ + { + "label": "Accès et authentification", + "href": "/docs/monitor/access-auth", + "tail": " — configuration initiale complète, choix d’application 2FA, récupération après perte de l’authentificateur et exemples de proxy inverse." + }, + { + "label": "Intégrations", + "href": "/docs/monitor/integrations", + "tail": " — exemples de jetons d’API avec Homepage, Home Assistant, Prometheus et n8n, et configuration complète de Secure Gateway." + }, + { + "label": "Référence de l’API", + "href": "/docs/monitor/api", + "tailRich": " — tous les points de terminaison /api/auth, /api/security et /api/oci avec méthode, corps de requête et exemples curl." + }, + { + "label": "ProxMenux → Sécurité → Fail2Ban", + "href": "/docs/security/fail2ban", + "tail": " — guide d’installation, jails configurés et installation manuelle." + }, + { + "label": "ProxMenux → Sécurité → Lynis", + "href": "/docs/security/lynis", + "tail": " — exemple de rapport, interprétation du score et fréquence des audits." + } + ] + } +} diff --git a/web/messages/fr/docs/monitor/dashboard/settings.json b/web/messages/fr/docs/monitor/dashboard/settings.json new file mode 100644 index 00000000..57f5e741 --- /dev/null +++ b/web/messages/fr/docs/monitor/dashboard/settings.json @@ -0,0 +1,367 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Tableau de bord : onglet Paramètres | Documentation ProxMenux", + "description": "L’onglet Paramètres gère la langue, l’ordre de navigation, les préférences du tableau de bord, les seuils et exclusions de surveillance, les notifications, l’IA et l’inventaire des optimisations après installation." + }, + "header": { + "title": "Tableau de bord : onglet Paramètres", + "description": "Langue de Monitor, ordre de navigation, préférences du tableau de bord, exclusions de surveillance, notifications, configuration de l’IA et inventaire actuel des optimisations ProxMenux.", + "section": "ProxMenux Monitor · Tableau de bord" + }, + "intro": { + "title": "Où chaque paramètre est conservé", + "body": "Paramètres regroupe l’affichage du tableau de bord, la surveillance Health Monitor, l’envoi des alertes et les changements déjà appliqués par ProxMenux à l’hôte. Les cartes renvoient à leur documentation détaillée ; cet onglet en est le point d’accès." + }, + "interfaceLanguage": { + "heading": "Langue d'interface", + "intro": "Choisissez la langue de l’interface web du moniteur. Elle change immédiatement, sans redémarrer le service ni modifier la langue des menus shell de ProxMenux.", + "items": [ + "ProxMenux Monitor offre actuellement anglais, allemand, espagnol, français, italien, portugais, slovaque et suédois.", + "À la première visite, la langue du navigateur est utilisée si elle est prise en charge ; sinon, l’anglais.", + "Changer le choix actualise la langue de la page et la synchronise avec les autres onglets du même profil de navigateur.", + "Si une traduction manque, seul ce texte apparaît en anglais plutôt qu’une clé ou un espace réservé incorrect." + ], + "scopeTitle": "Préférence locale du navigateur", + "scopeBody": "Le choix est enregistré dans localStorage sous proxmenux-ui-language. Il concerne ce profil de navigateur et cet appareil, pas tout le nœud. Chaque administrateur peut choisir sa langue." + }, + "navigationOrder": { + "heading": "Ordre de navigation", + "intro": "Réorganisez les sept entrées principales : Aperçu, Apps, VM et LXC, Nœud, Sauvegarde, Terminal et Administration. Cliquez sur Modifier, déplacez les lignes et enregistrez.", + "items": [ + "Avec la souris, le déplacement commence à l’appui. Sur écran tactile, un appui de 250 ms le distingue du défilement.", + "Les groupes Nœud et Administration se déplacent en bloc ; leurs pages internes gardent l’ordre prévu.", + "Le menu mobile suit le même ordre enregistré.", + "Rétablir les valeurs par défaut réinitialise l’ordre en cours d’édition. Enregistrez pour appliquer le changement.", + "Les nouvelles entrées principales des versions futures sont ajoutées à la fin de l’ordre personnalisé, en conservant votre organisation." + ], + "landingTitle": "La première entrée devient l’onglet initial", + "landingBody": "Monitor ouvre la première entrée enregistrée. Pour Nœud, il ouvre Stockage ; pour Administration, Journaux système. L’ordre est conservé dans ce navigateur sous proxmenux-nav-order ; chaque appareil peut avoir sa propre organisation." + }, + "networkUnits": { + "heading": "Unités réseau", + "imageAlt": "Carte Unités réseau avec le sélecteur d’affichage sur Octets", + "imageCaption": "Choisissez les bits ou les octets par seconde pour toutes les vitesses réseau du tableau de bord.", + "body": "Affiche le débit en bits par seconde (Mbps/Gbps) ou octets par seconde (MB/s/GB/s). Les bits sont utilisés par défaut comme dans les spécifications réseau ; les transferts de fichiers utilisent souvent les octets. Graphiques, étiquettes et infobulles changent immédiatement sans rechargement." + }, + "health": { + "heading": "Moniteur de santé", + "intro": "La carte règle la durée de suppression : le délai avant qu’une alerte rejetée puisse être signalée à nouveau. Chaque catégorie — CPU, mémoire, stockage, disques, réseau, VM, services PVE, journaux, mises à jour et sécurité — a sa liste :", + "items": [ + "24 h — Par défaut pour la plupart des catégories transitoires.", + "72 h — pour ne plus recevoir ces événements pendant quelques jours.", + "168 h (1 semaine) et 720 h (1 mois) — contrôles périodiques.", + "8760 h (1 an) — une longue période sans ces alertes.", + "-1 — silence permanent jusqu’à réactivation manuelle.", + "Heures personnalisées — un nombre entier pour une durée intermédiaire." + ], + "imageAlt": "Paramètres, carte Health Monitor avec durée par catégorie et suppressions actives", + "imageCaption": "Les listes définissent la durée des futurs rejets. La section inférieure montre les alertes supprimées et permet leur réactivation.", + "editTitle": "Mode modification", + "editBody": "La carte est initialement en lecture seule. Modifier en haut à droite active les listes et boutons de réactivation. Enregistrer applique ensemble les durées et réactivations en attente ; Annuler les abandonne. Enregistrer n’est actif qu’en présence de changements.", + "activeTitle": "Suppressions actives", + "activeIntro": "Sous les durées, Suppressions actives liste les alertes supprimées temporairement —24 h, 7 jours ou autre période— et définitivement. Chaque ligne affiche :", + "activeItems": [ + "Un badge coloré : Permanent en ambre ou un décompte, comme 24 h restantes / 7 jours restants, en bleu.", + "L’identifiant d’alerte sous une forme lisible (par ex. pve_storage_full_PBS-Cloud → Stockage PVE plein : PBS-Cloud).", + "Catégorie, gravité et date à laquelle l’alerte a été rejetée.", + "Un bouton Réactiver, disponible en modification, prépare la levée de suppression lors de l’enregistrement." + ], + "activeReenableTitle": "Comment réactiver une alerte", + "activeReenableBody": "Réactiver colore la ligne en vert et barre son identifiant, sans appliquer encore le changement. Un nouveau clic permet d’Annuler. Enregistrer envoie en parallèle POST /api/health/un-acknowledge pour chaque réactivation et retire les lignes. Si le problème persiste et la catégorie permet un nouvel avis, l’alerte revient parmi les actives au prochain contrôle.", + "activePermanentNote": "Les rejets définitifs —via Définitivement ou la durée par défaut -1— ne sont annulés qu’ici. Le dialogue général ne propose pas ce bouton ; cette section réunit registre et réactivation.", + "activeAutoRefreshTitle": "Actualisation automatique", + "activeAutoRefreshBody": "La liste s’actualise après rejet ou réactivation d’une alerte dans Health Monitor, au retour sur l’onglet et lors d’un changement de visibilité. Aucun rechargement n’est nécessaire.", + "calloutTitle": "Détails dans la page Health Monitor", + "calloutBody": "L’escalade, la résolution automatique quand un appareil disparaît et la différence entre rejeter et résoudre figurent dans Health Monitor → Rejet des alertes et durée de suppression. Cette carte propose les listes et suppressions actives." + }, + "thresholds": { + "heading": "Seuils du Health Monitor", + "intro": "La carte précédente définit la durée de silence après un rejet ; celle-ci règle la valeur qui déclenche une alerte. La plupart des contrôles ont des valeurs Avertissement et Critique réglables. Le tableau explique les exceptions, dont la règle combinée du swap et le détecteur RAM actuel.", + "whatForTitle": "À quoi cela sert", + "whatForIntro": "Les valeurs par défaut sont un point de départ ; chaque environnement a ses propres conditions :", + "whatForItems": [ + "Un homelab avec un seul SSD peut avertir plus tôt, à 75/90 % par exemple, pour garder de la place aux instantanés.", + "Les seuils mémoire doivent refléter les mesures et la charge de l’hôte. La redondance Ceph ne justifie pas à elle seule des alertes moins strictes ; un ARC ZFS élevé n’équivaut pas à une mémoire de travail non récupérable.", + "Choisissez les seuils de température selon les spécifications du disque et ses conditions réelles. Le refroidissement passif ou forcé ne définit pas seul une limite sûre universellement plus basse ou haute.", + "Un hôte très virtualisé peut avoir des pics CPU pendant les compilations sans alerter à chaque pic de 80 %, mais doit signaler une saturation durable." + ], + "whatForOutro": "Les modifications prises en charge s’appliquent à l’analyse suivante. Le Health Monitor lit /usr/local/share/proxmenux/health_thresholds.json à chaque cycle sans redémarrage. Certains indicateurs, comme la température des disques, utilisent ces valeurs ; des barres de capacité gardent leurs propres limites. La ligne RAM décrit une exception actuelle.", + "coloursTitle": "Couleurs des états Avertissement et Critique", + "coloursIntro": "Les widgets utilisant Avertissement/Critique suivent les trois états ci-dessous. D’autres indicateurs, comme les barres de capacité PVE, ont leurs propres limites ; leur couleur seule n’indique pas une alerte Health Monitor.", + "headerColour": "Couleur", + "headerRange": "Intervalle", + "headerMeaning": "Signification", + "colourRows": [ + { + "colour": "Vert", + "range": "valeur < Avertissement", + "meaning": "Plage normale. Aucune alerte n’est générée." + }, + { + "colour": "Ambre", + "range": "Avertissement ≤ valeur < critique", + "meaning": "État d’avertissement. Health Monitor génère un événement WARNING ; les notifications respectent les filtres et heures silencieuses." + }, + { + "colour": "Rouge", + "range": "Valeur ≥ critique", + "meaning": "État critique. Health Monitor génère un événement CRITICAL qui ignore les heures silencieuses. Les réglages de catégorie et d’événement du canal s’appliquent toujours ; la livraison dépend aussi de sa disponibilité." + } + ], + "sectionsTitle": "Sections et valeurs par défaut recommandées", + "sectionsIntro": "Ce sont les valeurs initiales de ProxMenux jusqu’à modification. Les sections suivent charge de calcul, température et capacité de stockage, de la charge actuelle à l’espace occupé.", + "headerSection": "Chapitre", + "headerWarning": "Avertissement", + "headerCritical": "Critique", + "headerGates": "Contrôle concerné", + "thresholdRows": [ + { + "section": "Utilisation du processeur", + "warning": "85 %", + "critical": "95 %", + "gates": "Alerte de charge prolongée lorsque la moyenne CPU dépasse le seuil sur la période de contrôle." + }, + { + "section": "Mémoire", + "warning": "85 %", + "critical": "95 %", + "gates": "Pression RAM de l’hôte. Le réglage affiche Critique à 95 %, mais le détecteur actuel utilise une règle fixe de 90 % soutenus ; ce réglage ne modifie pas actuellement cette branche d’exécution." + }, + { + "section": "Swap (seuil critique uniquement)", + "warning": "—", + "critical": "80 %", + "gates": "Le CRITICAL de swap exige plus de 80 % de swap et moins de 15 % de RAM disponible sur plusieurs mesures. Le swap occupé seul ne déclenche pas cette règle." + }, + { + "section": "Température du processeur", + "warning": "80 °C", + "critical": "90 °C", + "gates": "Température du boîtier CPU ou des cœurs fournie par lm-sensors." + }, + { + "section": "Température du disque — HDD", + "warning": "60 °C", + "critical": "65 °C", + "gates": "Température HDD. Valeurs initiales : avertissement à 60 °C, critique à 65 °C. Ce sont des réglages de surveillance, pas une limite universelle du fabricant ; consultez le modèle précis." + }, + { + "section": "Température du disque — SSD", + "warning": "70 °C", + "critical": "75 °C", + "gates": "SSD SATA de 2,5 pouces ou M.2. Cette classe utilise 70/75 °C par défaut ; les limites réelles dépendent du modèle." + }, + { + "section": "Température du disque — NVMe", + "warning": "80 °C", + "critical": "85 °C", + "gates": "Température NVMe. Cette classe utilise 80/85 °C par défaut. La température de limitation du contrôleur dépend du modèle et n’est pas toujours 85 °C." + }, + { + "section": "Température du disque — SAS", + "warning": "55 °C", + "critical": "65 °C", + "gates": "Température SAS. Cette classe utilise avertissement à 55 °C et critique à 65 °C. Ce sont des valeurs de surveillance, pas la preuve d’un défaut de refroidissement à 55 °C ni une limite universelle." + }, + { + "section": "Espace disque — hôte", + "warning": "85 %", + "critical": "95 %", + "gates": "Capacité de / et de chaque point de montage de l’hôte (/var/lib/vz, /mnt/*…)." + }, + { + "section": "Espace disque — rootfs LXC", + "warning": "85 %", + "critical": "95 %", + "gates": "Disque racine par conteneur, évalué par rapport à la taille rootfs de PVE." + }, + { + "section": "Points de montage LXC", + "warning": "85 %", + "critical": "95 %", + "gates": "Capacité des montages dans les CT actifs : mp0, mp1, NFS et montages liés. Exclut rootfs." + }, + { + "section": "Stockage PVE", + "warning": "85 %", + "critical": "95 %", + "gates": "Stockages gérés par PVE : LVM, LVM-thin, ZFS-pool, RBD/Ceph et PBS. Tous ne sont pas des stockages en blocs." + }, + { + "section": "Pool ZFS", + "warning": "85 %", + "critical": "95 %", + "gates": "Pools ZFS de l’hôte, indépendamment de leur enregistrement dans PVE." + } + ], + "defaultsTitle": "Valeurs par défaut, modifications et réinitialisation", + "defaultsBody": "Chaque section part des valeurs par défaut ; seules les modifications souhaitées sont conservées. La carte montre la valeur effective : votre modification ou la valeur initiale. Réinitialiser supprime toutes les modifications de toutes les sections.", + "validationTitle": "Validation", + "validationBody": "L’enregistrement vérifie les plages autorisées et refuse Critique sous Avertissement. L’interface affiche les erreurs et le serveur valide les requêtes API avant sauvegarde." + }, + "lxcDetection": { + "heading": "Détection de mise à jour LXC", + "imageAlt": "Carte de détection des mises à jour LXC avec interrupteur pour les paquets en attente des conteneurs Debian, Ubuntu et Alpine actifs", + "imageCaption": "Interrupteur de l’analyse périodique par apt list --upgradable / apk list -u dans les CT actifs. Activé par défaut. Le réglage associé dans Notifications → Services apparaît lorsque la détection est active.", + "intro": "L’interrupteur entre Seuils et Notifications contrôle l’analyse LXC. Activé, il interroge les gestionnaires de paquets des CT actifs ; Matériel affiche les résultats et alimente lxc_updates_available. Désactivé, il arrête ses appels pct exec et supprime les entrées LXC de managed_installs.json ; /api/managed-installs cesse d’afficher cet état sans attendre 24 h.", + "whatRunsTitle": "Ce que l’analyse exécute", + "whatRunsIntro": "Pour chaque CT à l’état running avec un gestionnaire de paquets pris en charge :", + "whatRunsItems": [ + "Fraîcheur des métadonnées. Si le cache apt/apk dépasse 24 heures, une actualisation est tentée avec apt-get update -qq sur Debian/Ubuntu ou apk update sur Alpine, limitée à 60 s. En cas d’échec, la liste utilise le cache disponible et peut être périmée.", + "Liste. Exécute apt list --upgradable / apk list -u et extrait le nombre de paquets et quelques noms.", + "Éviter les doublons par CT. Une empreinte du total, des mises à jour de sécurité et des noms triés évite les avis quotidiens identiques. Un changement significatif déclenche un nouvel avis." + ], + "selfUpdateTitle": "Les CT actualisés hors apt peuvent afficher 0", + "selfUpdateBody": "La détection ne couvre que le gestionnaire de paquets du CT. Les logiciels actualisés hors apt, comme un travail plexupdate configuré ou les images obtenues par docker pull, n’entrent pas dans le compte. Zéro mise à jour apt ne prouve pas que toutes les applications sont à jour. Les paquets du système de base restent détectés.", + "refreshTitle": "Pourquoi actualiser les métadonnées après 24 h", + "refreshBody": "Un CT ancien peut avoir des métadonnées apt périmées si personne ne lance apt update. apt list --upgradable peut alors manquer des mises à jour. ProxMenux tente une actualisation après 24 heures et l’omet si le cache est plus récent.", + "toggleTitle": "Interrupteur de notification lié à la détection", + "toggleBody": "L’interrupteur lxc_updates_available par canal dans Notifications → Services n’apparaît que si la détection est active. La désactiver masque la ligne pour tous les canaux. Le choix reste dans la base et retrouve sa valeur à la réactivation.", + "purgeTitle": "Ce qui est supprimé à la désactivation", + "purgeBody": "La désactivation retire aussitôt les entrées type=lxc de /usr/local/share/proxmenux/managed_installs.json. Les compteurs de mises à jour LXC de Matériel disparaissent à l’actualisation suivante. La réactivation remplit le registre au prochain cycle, ou plus tôt par actualisation manuelle de l’API." + }, + "storageExclusions": { + "heading": "Exclusions de stockage distant", + "imageAlt": "Carte d’exclusion des stockages distants PBS-Cloud, PBS et PBS2 avec réglages État et Alertes par ligne", + "imageCaption": "Réglages État et Alertes par stockage. Tous deux désactivés, le stockage ne contribue plus au Health Monitor et n’envoie plus de notifications. Il reste visible dans Stockage avec la mention exclu.", + "intro": "Vous pouvez exclure les stockages gérés par Proxmox (NFS / CIFS / PBS / Ceph / iSCSI / etc.) au moyen de deux réglages indépendants :", + "items": [ + "État — désactiver ce réglage retire le stockage de la catégorie Stockage du Health Monitor. Utile pour les volumes d’archives généralement hors ligne ou les cibles de sauvegarde distantes allumées uniquement aux heures prévues.", + "Alertes — désactiver ce réglage empêche les notifications de ce stockage sur les canaux configurés, même si les contrôles d’état restent actifs. Utile pour consulter son état sans recevoir de notifications." + ], + "outro": "Les stockages exclus restent dans l’onglet Stockage avec le badge violet exclu, pour conserver un inventaire visible. L’état est enregistré dans la table SQLite excluded_storages." + }, + "interfaceExclusions": { + "heading": "Exclusions d'interface réseau", + "imageAlt": "Carte d’exclusion des interfaces vmbr0, vmbr1, vmbr2, bond0 et eno1 avec réglages État et Alertes par interface", + "imageCaption": "Comme pour le stockage, chaque interface possède État et Alertes. Chaque ligne montre le nom, le type (pont / agrégat / physique), l’IP et le débit du lien.", + "intro": "Le même principe s’applique aux interfaces : exclure chacune des contrôles d’état, des notifications ou des deux. Exemples courants :", + "items": [ + "Un pont de réserve volontairement désactivé.", + "Une carte réseau retirée physiquement mais encore référencée dans /etc/network/interfaces.", + "Une sous-interface VLAN utilisée uniquement pendant la maintenance.", + "Un pont de gestion dont les changements répétés d’état du lien sont connus pendant la maintenance." + ], + "outro": "L’état est enregistré dans la table SQLite excluded_interfaces. Le badge violet exclue de l’onglet Réseau garde les interfaces exclues visibles." + }, + "notifications": { + "heading": "Notifications et IA", + "body1": "Cette section active les notifications de ProxMenux Monitor et la reformulation par IA. Activer les notifications démarre l’envoi en arrière-plan, enregistre une cible webhook Proxmox VE pour intégrer ses événements et ouvre le formulaire des canaux : Telegram, Discord, courriel, Gotify et autres. La reformulation par IA figure dans une section avancée repliable du même panneau.", + "body2": "Des pages dédiées expliquent les options : canaux, événements, messages enrichis, nom affiché, envoi avec dédoublonnage, temporisation, regroupement et heures silencieuses, webhook PVE, fournisseurs d’IA et modes d’instructions :", + "items": [ + "Notifications : configuration des canaux (Telegram, Discord, Gotify, courriel et mots de passe d’application Gmail / Microsoft, ntfy, Slack, Teams et webhook générique), catégories d’événements, messages enrichis, nom affiché, envoi, webhook PVE, historique et API.", + "Assistant IA : fournisseurs (OpenAI, Anthropic, Gemini, Groq, OpenRouter, Ollama), modèles, instructions par défaut ou personnalisées, langue de sortie, niveau de détail par canal et suggestions d’IA." + ] + }, + "optimizations": { + "heading": "Optimisations ProxMenux", + "intro": "Inventaire des optimisations après installation enregistrées par ProxMenux sur l’hôte. Les options de Post-installation automatisée et Post-installation personnalisable enregistrent leur application dans /usr/local/share/proxmenux/installed_tools.json. Le moniteur lit ce registre. Une entrée ne vérifie pas à nouveau que tous les réglages sont restés identiques.", + "imageAlt": "Carte des optimisations ProxMenux avec 14 entrées : point coloré, nom et version. Elle comprend APT IPv4 Force, Bashrc Customization, Fastfetch, Log2ram SSD Protection, Memory Settings Optimization, Setting persistent network interfaces, System Limits Increase, APT Language Skip, Entropy Generation haveged avec Legacy, Kernel Panic Configuration, Logrotate Optimization, Network Optimizations, Subscription Banner Removal et VFIO IOMMU Passthrough.", + "imageCaption": "Chaque optimisation affiche nom, version et point coloré. Le compteur orange 14 actives figure en haut à droite. Les outils dont le code source est disponible sont cliquables.", + "dotsTitle": "Ce que signifient les points", + "dotsItems": [ + " Point vert : optimisation enregistrée sans mention Legacy ni mise à jour indiquée. Cliquez sur la ligne si le code source est disponible.", + " Point ambre et badge legacy : optimisation enregistrée dont le script a été renommé ou remplacé. Le code conservé s’ouvre en mode Legacy avec des touches ambre. Cela ne vérifie pas à nouveau la configuration actuelle de l’hôte." + ], + "clickTitle": "Ouvrir le code source", + "clickBody": "Cliquer affiche la fonction bash associée et le nom du script (auto_post_install.sh ou customizable_post_install.sh). Les outils actuels sont extraits des fichiers de l’hôte ; les anciens peuvent utiliser du code conservé. Coloration syntaxique et copie facilitent l’examen. Ce n’est pas un instantané garanti du code exécuté à l’installation.", + "detailAlt": "Fenêtre de code d’APT IPv4 Force montrant la fonction bash force_apt_ipv4 de customizable_post_install.sh version 1.0. Le code coloré configure /etc/apt/apt.conf.d/99-force-ipv4 avec Acquire ForceIPv4 true, enregistre l’outil et affiche un message traduit de fin de configuration APT IPv4.", + "detailCaption": "Code d’APT IPv4 Force : fonction force_apt_ipv4() de customizable_post_install.sh v1.0, avec coloration syntaxique et copie en un clic.", + "whyTitle": "Pourquoi cela est important", + "whyBody": "ProxMenux peut modifier les paramètres du noyau, dépôts, réseau, rotation des journaux et passthrough GPU. Consultez les optimisations enregistrées avant des changements manuels, surtout si un autre administrateur a installé l’hôte. La carte montre le registre et le code disponible ; elle n’audite pas tous les réglages actuels et ne garde pas un historique exact d’exécution.", + "updatesTitle": "Bannière des mises à jour disponibles", + "updatesBody": "Si la version sur disque d’une optimisation est plus récente que celle enregistrée sur l’hôte, une bannière affiche le nombre et Appliquer. Appliquer ouvre le choix des optimisations, comme Appliquer les mises à jour disponibles du menu de post-installation. Choisissez les mises à jour ; ProxMenux relance leurs fonctions et actualise le registre. La bannière disparaît quand tout est à jour.", + "updatesAlt": "Carte des optimisations ProxMenux avec bannière de mises à jour disponibles, nombre en attente et bouton Appliquer ouvrant le sélecteur", + "updatesCaption": "La bannière apparaît si au moins une optimisation possède une version plus récente sur disque. Voir Appliquer les mises à jour disponibles pour la procédure et son équivalent Path-A dans le menu du shell.", + "revertTitle": "Annuler une optimisation", + "revertBody": "Pour annuler une optimisation, utilisez l’option correspondante de Désinstaller les optimisations dans ProxMenux Scripts. La désinstallation retire son entrée d’installed_tools.json ; elle disparaît de la carte à l’actualisation suivante." + }, + "dataCollected": { + "heading": "Comment les données sont collectées", + "headerCard": "Carte", + "headerEndpoint": "Point d’accès", + "headerSource": "Source", + "rows": [ + { + "card": "Langue d'interface", + "endpoint": "localStorage", + "source": "Préférence proxmenux-ui-language du navigateur ; sans choix enregistré, sa langue sert de valeur initiale." + }, + { + "card": "Ordre de navigation", + "endpoint": "localStorage", + "source": "Préférence proxmenux-nav-order du navigateur ; elle détermine aussi l’onglet initial." + }, + { + "card": "Unités réseau", + "endpoint": "/api/settings", + "source": "Enregistré dans la table SQLite des paramètres du tableau de bord." + }, + { + "card": "Durées du Health Monitor", + "endpoint": "/api/health/settings", + "source": "Durée de suppression par catégorie dans la base du Health Monitor." + }, + { + "card": "Exclusions de stockage / interface", + "endpoint": "/api/storage/exclusions, /api/network/exclusions", + "source": "Tables SQLite excluded_storages et excluded_interfaces." + }, + { + "card": "Panneau Notifications et IA", + "endpoint": "/api/notifications/*", + "source": "Voir Notifications et Assistant IA." + }, + { + "card": "Liste des optimisations ProxMenux", + "endpoint": "/api/proxmenux/installed-tools", + "source": "Lit /usr/local/share/proxmenux/installed_tools.json, écrit par les appels à register_tool des scripts de post-installation." + }, + { + "card": "Fenêtre du code d’une optimisation", + "endpoint": "/api/proxmenux/tool-source", + "source": "Extrait la fonction bash associée d’auto_post_install.sh ou de customizable_post_install.sh sur l’hôte ; les anciens outils peuvent utiliser du code conservé." + } + ] + }, + "whereNext": { + "heading": "Pour continuer", + "items": [ + { + "label": "onglet Apps", + "href": "/docs/monitor/dashboard/apps", + "tail": " — le lanceur dont la position se règle avec l’ordre de navigation." + }, + { + "label": "Notifications", + "href": "/docs/monitor/notifications", + "tail": " — canaux, réglages par événement, options propres aux canaux, historique et envoi de test." + }, + { + "label": "Assistant IA", + "href": "/docs/monitor/ai-assistant", + "tail": " — fournisseurs, modèles, modes d’instructions, langues et détail par canal." + }, + { + "label": "Health Monitor → Rejeter les alertes et durée de suppression", + "href": "/docs/monitor/health-monitor#dismissing-alerts-and-the-suppression-duration", + "tail": " — le fonctionnement des listes de durée par catégorie." + }, + { + "label": "ProxMenux Scripts → Post-installation automatisée", + "href": "/docs/post-install/automated", + "tailRich": " et Post-installation personnalisable — les scripts qui enregistrent les optimisations dans la liste ci-dessus." + }, + { + "label": "Désinstaller les optimisations", + "href": "/docs/post-install/uninstall", + "tail": " — comment annuler une optimisation enregistrée ci-dessus." + }, + { + "label": "Indice du tableau de bord", + "href": "/docs/monitor/dashboard", + "tail": " — retour à la présentation des onglets." + } + ] + } +} diff --git a/web/messages/fr/docs/monitor/dashboard/storage.json b/web/messages/fr/docs/monitor/dashboard/storage.json new file mode 100644 index 00000000..54006e0b --- /dev/null +++ b/web/messages/fr/docs/monitor/dashboard/storage.json @@ -0,0 +1,268 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Tableau de bord : onglet Stockage | Documentation ProxMenux", + "description": "L’onglet Stockage réunit quatre vues : stockages Proxmox avec leur état, pools ZFS, disques internes avec SMART et disques USB externes. Le détail de chaque disque affiche les attributs SMART, l’usure, la durée de vie et l’historique permanent des observations." + }, + "header": { + "title": "Tableau de bord : onglet Stockage", + "description": "Le stockage de l’hôte sur un écran : NFS / CIFS / LVM / ZFS / dir Proxmox, état des pools ZFS, disques internes SATA/NVMe avec SMART et disques USB externes. Cliquez sur un disque pour voir ses attributs SMART et son historique d’observations.", + "section": "ProxMenux Monitor · Tableau de bord" + }, + "intro": { + "title": "Soutenu par trois sources", + "body": "Les stockages Proxmox viennent de pvesm status, ZFS de zpool status, les disques de lsblk + smartctl et les champs NVMe de nvme. L’onglet s’actualise environ toutes les 60 secondes ; ouvrir le détail demande une lecture SMART." + }, + "thresholds": { + "title": "Couleurs et seuils appliqués ici", + "intro": "Health Monitor classe l’état en vert sous Avertissement, orange entre Avertissement et Critique et rouge à partir de Critique. Ses valeurs par défaut suivent. Les barres du tableau de bord peuvent utiliser d’autres limites visuelles décrites plus bas.", + "items": [ + "Capacité (disques de l’hôte, stockages PVE, pools ZFS, montages LXC) — avertissement 85 %, critique 95 %.", + "Température du disque — HDD 60/65 °C · SSD 70/75 °C · NVMe 80/85 °C · SAS 55/65 °C (avertissement / critique)." + ], + "outro": "Chaque valeur est configurable par hôte. Paramètres → Seuils de Health Monitor présente les valeurs de référence et leur réglage." + }, + "topRow": { + "heading": "Rangée supérieure : aperçu du stockage", + "intro": "À l’ouverture, quatre cartes résument capacité totale, utilisation locale, utilisation distante et inventaire des disques physiques. Elles donnent une réponse rapide ; les cartes inférieures présentent les détails.", + "imageAlt": "Onglet Stockage avec quatre cartes : stockage total, utilisation locale, utilisation distante et disques physiques", + "imageCaption": "Rangée supérieure : capacité totale et nombre de disques, octets utilisés localement et à distance, répartition des disques physiques par type et état.", + "headerCard": "Carte", + "headerWhat": "Ce qu'il montre", + "totalLabel": "Stockage total", + "totalWhat": "Capacité brute totale de tous les disques physiques. Le pied indique le nombre de disques détectés.", + "localLabel": "Utilisation locale", + "localWhat": "Octets utilisés sur les stockages locaux : LVM / LVM-thin / ZFS / dir sur les disques de l’hôte. La valeur principale affiche les octets utilisés et le pied X.XX % de Y TB indique aussi le taux de remplissage.", + "remoteLabel": "Utilisation distante", + "remoteWhat": "Même format que l’utilisation locale pour les stockages distants NFS / CIFS / PBS / Ceph / iSCSI. Ils sont comptés séparément, car les pannes locales et distantes ont une portée différente et ces ressources se dimensionnent et se surveillent différemment.", + "disksLabel": "Disques physiques", + "disksIntro": "Deux lignes de ventilation pour l'inventaire :", + "disksItems": [ + "Par type — nombre de NVMe en violet, de SSD et HDD en bleu. Les types détectés sont affichés ; un hôte tout NVMe ne montre que ce nombre.", + "Par état — nombre de disques normaux en vert, en avertissement en jaune et critiques en rouge. Sans problème, seul « X normaux » apparaît ; les autres états s’affichent en cas d’incident." + ] + }, + "pveStorage": { + "heading": "Carte de stockage Proxmox", + "intro": "Une ligne par stockage de /etc/pve/storage.cfg avec type (nfs / cifs / zfspool / lvm / lvmthin / dir / pbs), nom, état actif/erreur/non surveillé, taux d’utilisation et barre colorée :", + "items": [ + "Jusqu’à 75 % — barre et valeur bleues.", + "Plus de 75 % jusqu’à 90 % — barre et valeur jaunes. Ces limites visuelles sont distinctes des seuils de Health Monitor.", + "> 90 % — barre et valeur rouges. Cette limite visuelle est distincte de l’escalade de Health Monitor.", + "Erreur — contour rouge de la ligne si le stockage est configuré mais inaccessible, par exemple serveur NFS arrêté ou identifiants CIFS expirés.", + "Exclu — contour violet et étiquette « non surveillé ». Stockages exclus par l’utilisateur, comme les volumes d’archive volontairement déconnectés." + ], + "calloutTitle": "Exclure un stockage de la surveillance", + "calloutBody": "Le menu de chaque stockage permet de le marquer exclu de la surveillance. Le réglage est conservé dans excluded_storages et appliqué par le tableau de bord et Health Monitor : aucune notification ni influence sur l’état global." + }, + "zfs": { + "heading": "Carte Pools ZFS", + "intro": "Visible uniquement si ZFS est installé et qu’un pool existe. Chaque ligne montre un pool avec état, taille, espace alloué et libre et icône d’état :", + "items": [ + "ONLINE — vert. Tout est sain.", + "DEGRADED — jaune. Le pool fournit les données, mais au moins un appareil est indisponible ; son remplacement doit être traité.", + "FAULTED / UNAVAIL / SUSPENDED — rouge. Le pool ne fournit plus de données et nécessite une intervention immédiate." + ], + "outro": "L’état ZFS et SMART de chaque disque alimente la catégorie Disques et E/S de Health Monitor." + }, + "physical": { + "heading": "Disques physiques et statut SMART", + "intro": "Disques internes (SATA / NVMe). Chaque rangée condense les champs les plus utiles en un coup d'oeil:", + "items": [ + "Chemin du périphérique — /dev/sda, /dev/nvme0n1.", + "Étiquette de type — SATA / NVMe et icône associée.", + "Étiquette système — marque orange pour les disques identifiés comme hébergeant le système. La détection utilise les montages / et /boot et applique l’étiquette System. Son absence ne prouve pas qu’un disque peut être effacé ou réutilisé sans risque.", + "Modèle — fabricant et modèle de smartctl -i.", + "Capacité — exprimée en unités lisibles.", + "Température — valeur actuelle en °C, colorée selon le type de disque ; les seuils NVMe sont plus élevés que SATA.", + "État SMART — réussi / échoué / inconnu.", + "Étiquette d’observations — si l’historique permanent disk_observations contient des entrées du disque, une étiquette bleue en indique le nombre, par exemple 3 obs.. Cliquez sur le disque pour les consulter.", + "Étiquette d’état — Sain / Avertissement / Critique selon SMART et les observations récentes." + ], + "clickHint": "Un clic sur la ligne ouvre le détail du disque décrit plus bas.", + "warningTitle": "Prudence avec les disques marqués System", + "warningBody": "Les disques marqués en orange System hébergent le système actif. L’étiquette aide à les identifier ; ProxMenux → Gestionnaire de disques → Formater / Effacer refuse les actions destructrices sur eux. Pour réutiliser un disque de démarrage, utilisez un environnement de secours externe au Proxmox en cours d’exécution." + }, + "external": { + "heading": "Stockage externe (USB)", + "body": "Les disques USB ont une carte distincte, visible lorsqu’un disque est présent. Elle affiche les mêmes champs que les disques internes et une étiquette orange USB. Comme ces disques servent souvent aux sauvegardes ou transferts occasionnels, les observations sont conservées, mais les erreurs d’E/S d’un disque USB débranché ne sont pas escaladées." + }, + "drillIn": { + "heading": "Dialogue de détail du disque", + "intro": "Cliquez sur un disque pour ouvrir quatre onglets : Aperçu · SMART · Historique · Planification. L’en-tête affiche chemin, modèle, capacité et, si nécessaire, l’étiquette orange System.", + "overviewTitle": "Onglet 1 — Aperçu", + "overviewImageAlt": "Détail du disque, onglet Aperçu avec état, indicateur circulaire d’usure et de durée de vie et principaux attributs SMART", + "overviewImageCaption": "Aperçu : identification, état, durée de vie restante avec usure actuelle et données écrites, et principaux attributs SMART.", + "overviewIntro": "Onglet initial pour consulter l’état du disque sans lancer de test. Trois blocs :", + "overviewItems": [ + "Identification — modèle, numéro de série, capacité et état Sain / Avertissement / Critique.", + "Usure et durée de vie — anneau de durée restante (97 %, 50 %, …) avec l’attribut source (Media Wearout Indicator, Percentage Used, …), barre du pourcentage consommé, projection Durée estimée en années et total des données écrites. NVMe affiche aussi Available Spare.", + "Attributs SMART : les principales valeurs sont affichées sur deux colonnes : température, heures de fonctionnement avec une durée lisible comme 3 ans et 116 jours, vitesse de rotation ou SSD, cycles de mise sous tension, état SMART, secteurs réalloués, secteurs en attente et erreurs CRC. Le tableau complet des attributs se trouve dans l’onglet SMART." + ], + "smartTitle": "Onglet 2 — SMART", + "smartImageAlt": "Détail du disque, onglet SMART avec tests court et étendu, dernier résultat et tableau complet des attributs", + "smartImageCaption": "Onglet SMART : lancez un test court ou étendu, consultez le dernier résultat et tous les attributs, puis ouvrez le rapport complet pour l’imprimer ou l’enregistrer en PDF.", + "smartIntro": "Actions disponibles en trois sections :", + "smartItems": [ + "Lancer un test SMART — deux boutons. Test court (~2 min) attend le résultat et l’affiche dans le dialogue. Test étendu (arrière-plan) peut durer des heures sur les grands disques, continue sur le serveur et notifie à la fin.", + "Dernier test — type, état (réussi / échoué) et date du dernier test.", + "Attributs SMART — tableau complet avec ID, nom, valeur, pire valeur et état correct, avertissement ou critique. SATA/SAS affiche la liste numérotée. NVMe utilise nvme smart-log : température, réserve disponible, pourcentage utilisé, unités lues/écrites, lectures/écritures hôte, temps d’occupation du contrôleur, cycles d’alimentation, arrêts non sûrs, erreurs du support, entrées du journal d’erreurs et temps de température composite en avertissement/critique." + ], + "pdfTitle": "Afficher le rapport SMART complet (PDF)", + "pdfIntro": "En bas de SMART, Afficher le rapport SMART complet ouvre un rapport imprimable. Le dialogue d’impression du navigateur permet de l’enregistrer en PDF pour l’archiver ou le partager avec le support lors d’un RMA.", + "pdfPreviewAlt": "Première page du rapport SMART avec synthèse, indicateur PASSED et informations sur le disque", + "pdfPreviewCaption": "Première page : synthèse, indicateur PASSED et informations complètes du disque. L’exemple PDF contient l’usure SSD, tous les attributs SMART et l’historique des tests.", + "pdfDownloadLabel": "Télécharger un exemple de rapport SMART (PDF)", + "pdfSectionsIntro": "Le rapport comporte six sections principales :", + "pdfSections": [ + "Synthèse — état PASSED/FAILED, évaluation claire du disque — sain, usé ou défaillant — et quatre données : date du rapport, dernier type de test, résultat et attributs vérifiés.", + "Informations sur le disque — modèle, série, capacité, type HDD/SSD/NVMe, famille, format, interface (SATA 3.3 · 6.0 Gb/s, …), TRIM, température et seuil optimal, heures de fonctionnement, cycles d’alimentation, SMART, secteurs en attente/réalloués et erreurs CRC.", + "Usure et durée de vie SSD (SSD/NVMe uniquement) — durée restante, attribut source, usure actuelle, données écrites et heures de fonctionnement.", + "Attributs SMART complets — ID, nom, valeur, pire valeur, seuil, valeur brute et état de chaque attribut. Les principaux — Reallocated Sector Ct, Power On Hours, Reported Uncorrect, UDMA CRC Error Count, Media Wearout Indicator, … — ont une brève explication sous leur ligne.", + "Dernier autotest et historique complet — dernier test avec type, résultat, message final et heures de fonctionnement à ce moment, puis tableau numéroté de tous les tests conservés.", + "Recommandations — actions selon le résultat. Pour les disques sains : disque sain / tests périodiques / stratégie de sauvegarde. Des conseils de remplacement apparaissent si les attributs sortent des limites." + ], + "pdfOutro": "Le navigateur construit le rapport imprimable ; Imprimer et Enregistrer en PDF ouvrent le dialogue d’impression. Choisissez un nom comme SMART-<short-id>.pdf. Conservez des copies datées pour comparer les changements ou les partager avec le support.", + "historyTitle": "Onglet 3 — Historique", + "historyImageAlt": "Détail du disque, onglet Historique avec les tests SMART précédents et actions de téléchargement et suppression", + "historyImageCaption": "Historique SMART du disque. Chaque ligne affiche type, date, ancienneté, repère du dernier test et actions de téléchargement de la sortie smartctl et suppression.", + "historyIntro": "Tests courts et étendus terminés et conservés pour le disque. Chaque entrée contient la sortie originale smartctl et les champs interprétés par Monitor pour le tableau de bord. Actions par ligne :", + "historyItems": [ + "Télécharger — enregistre l’instantané JSON contenant les données smartctl -a utilisées par le rapport. Utile si le support demande les champs de diagnostic originaux.", + "Supprimer — retire manuellement un test de l’historique. La conservation de Planification (5 / 10 / 20 derniers) supprime automatiquement les plus anciens." + ], + "scheduleTitle": "Onglet 4 — Planification", + "scheduleImageAlt": "Détail du disque, onglet Planification avec interrupteur des tests SMART automatiques, liste des horaires et bouton Ajouter une planification", + "scheduleImageCaption": "Planification : choisissez type, fréquence et conservation ; Monitor configure cron pour exécuter les tests automatiquement.", + "scheduleIntro": "Tests SMART automatiques via cron, sans terminal. Trois zones :", + "scheduleItems": [ + "Tests SMART automatiques — interrupteur commun à toutes les planifications du disque. Il permet de les suspendre pendant la maintenance sans effacer leur configuration.", + "Planifications configurées — une ligne par horaire avec type (court / long), expression cron lisible (« Le 1er du mois à 03:00 », « Chaque dimanche à 02:00 »), disques concernés et conservation.", + "Ajouter / Modifier une planification — type (court ~2 min / long 1–4 h), fréquence (quotidienne / hebdomadaire / mensuelle), jour du mois ou de la semaine, heure et résultats conservés (5 / 10 / 20 derniers)." + ], + "scheduleOutro": "La planification crée une entrée cron sur l’hôte qui appelle Monitor. Les résultats vont dans l’historique SMART de l’onglet 3 et la conservation supprime automatiquement les plus anciens après un nouveau test.", + "tempTitle": "Dialogue d’historique de température", + "tempIntro": "Monitor relève régulièrement les disques équipés d’un capteur de température et conserve un historique local. La valeur actuelle figure dans Aperçu ; un clic ouvre le détail de l’historique de température.", + "tempImageAlt": "Historique de température avec chemin et modèle, périodes de 1 heure, 24 heures, 7 ou 30 jours, indicateurs Actuel/Minimum/Moyenne/Maximum et courbe colorée selon les seuils du type de disque", + "tempImageCaption": "Le détail de température s’ouvre depuis Aperçu si le capteur renvoie une valeur non nulle. Le graphique utilise les seuils HDD / SSD / NVMe / SAS.", + "tempShowsTitle": "Contenu du dialogue", + "tempShowsItems": [ + "Sélecteur de période : 1 heure, 24 heures par défaut, 7 jours ou 30 jours. Chaque requête adapte la résolution pour garder le graphique lisible.", + "Quatre indicateurs : Actuel, Minimum, Moyenne et Maximum sur la période. Actuel utilise les seuils du stockage et des notifications pour distinguer une température normale, élevée ou très élevée.", + "Courbe de température dans le temps, avec ligne et zone ombrée colorées selon le type de disque :" + ], + "tempDiskTypes": [ + "HDD — seuils de température généralement plus bas.", + "SSD — seuils modérés.", + "NVMe — seuils plus élevés (NVMe est plus chaud par conception).", + "SAS — avertissement à 55 °C et critique à 65 °C ; le seuil d’avertissement diffère du HDD." + ], + "tempConfigurable": "Les quatre types se configurent dans Paramètres → Seuils de Health Monitor.", + "tempWhyTitle": "Pourquoi l’historique est utile", + "tempWhyItems": [ + "Détecter les tendances. Une lecture isolée ne révèle pas qu’un disque chauffe progressivement depuis des semaines, par exemple à cause de la ventilation, de la poussière ou d’une source de chaleur proche. Les vues sur 7 et 30 jours montrent l’évolution.", + "Relier les pics. Si une sauvegarde ou reconstruction a brièvement dépassé le seuil, les vues sur 1 et 24 heures montrent si le pic est isolé ou récurrent.", + "Régler les seuils. Avant une modification dans Paramètres → Seuils de Health Monitor, consultez le graphique de 30 jours pour connaître la plage réelle du disque." + ], + "obsTitle": "Historique des observations dans les onglets", + "obsIntro": "Les défauts peuvent apparaître progressivement. Un disque peut indiquer SMART PASSED tout en signalant des erreurs de lecture dans dmesg, des coupures SATA ou des secteurs en attente intermittents. ProxMenux conserve ces signaux et les affiche dans le dialogue avec l’état SMART actuel.", + "obsImageAlt": "Aperçu d’un disque avec SMART réussi, zéro secteur réalloué/en attente et erreur CRC, mais une observation d’erreur E/S avec message original du noyau, explication ATA, première et dernière date et compteur", + "obsImageCaption": "Un disque qui réussit SMART peut avoir des observations antérieures. La carte ajoute l’historique des signaux à l’état actuel.", + "obsWhatTitle": "Qu’est-ce qu’une observation ?", + "obsWhatIntro": "ProxMenux enregistre comme observation les événements disque du journal du noyau, de dmesg ou de SMART trop détaillés pour justifier seuls une notification. Chaque ligne affiche :", + "obsWhatItems": [ + "Type — erreur E/S, SMART, système de fichiers, pool ZFS ou connexion.", + "Message original du noyau tel qu’affiché dans dmesg, à copier dans un moteur de recherche ou une demande de support.", + "Brève explication des codes ATA connus : IDNF, adresse de secteur introuvable, secteur ou câble potentiellement défectueux ; UNC, erreur de lecture irrécupérable, secteur défectueux ; et autres codes standard.", + "Première et dernière date et nombre d’occurrences, regroupés par signature d’erreur." + ], + "obsWhyTitle": "Pourquoi ProxMenux les conserve et les affiche", + "obsWhyItems": [ + "Les défauts peuvent évoluer. Des erreurs de bus ATA, secteurs UNC ou erreurs du support peuvent précéder un état SMART FAILED. Le tampon dmesg ne les conserve pas après redémarrage ; l’historique des observations, oui.", + "SMART n’exclut pas tous les défauts. Un disque peut avoir des attributs verts et rencontrer des problèmes. Les observations conservent des symptômes supplémentaires : ICRC, IDNF, réinitialisations SATA ou baisses de vitesse.", + "Distingue l’actuel du récent. Health Monitor résout automatiquement les erreurs transitoires qui ne se reproduisent plus. L’historique permet de voir plusieurs jours après, par exemple, trois erreurs E/S survenues une nuit.", + "Alimente les notifications par niveaux. disk_io utilise la fréquence des observations pour choisir silence, WARNING ou CRITICAL sur une fenêtre glissante de 24 heures introduite en 1.2.1.2." + ], + "obsDedupTitle": "Regroupement des doublons et nouveaux avis", + "obsDedupBody1": "Les observations sont regroupées par signature, empreinte stable du type d’erreur, de l’appareil et des champs clés du message. Les répétitions augmentent occurrence_count sur la ligne existante. Une signature différente crée une autre observation et un nouvel événement pour les notifications.", + "obsDedupBody2": "Pour éviter les cascades, la première combinaison disque, signature et gravité avertit l’opérateur. La même combinaison attend 24 heures avant un nouvel avis, même si le compteur augmente. Le passage de WARNING à CRITICAL interrompt ce délai et signale l’aggravation.", + "obsDismissTitle": "Historique permanent et erreurs actives", + "obsDismissBody1": "Les observations ne peuvent être rejetées, masquées ni supprimées. Chaque signature a une carte ; une répétition augmente le compteur et actualise la dernière date. L’historique suit le numéro de série : un autre disque commence vide même sur le même port, et un renommage par le noyau conserve l’historique.", + "obsDismissBody2": "Résoudre ou rejeter une erreur active dans Health Monitor ne modifie pas ses observations. Elles subsistent après résolution automatique, pour qu’un avertissement transitoire de la semaine passée reste visible. Consultez Health Monitor pour gérer les erreurs actives." + }, + "dataCollected": { + "heading": "Comment les données sont collectées", + "headerSection": "Section de l'onglet", + "headerEndpoint": "Point de terminaison", + "headerSource": "Source", + "rows": [ + { + "section": "Cartes de synthèse supérieures", + "endpoint": "/api/storage/summary", + "source": "Agrégé de lsblk, zpool list, vgs / lvs." + }, + { + "section": "Inventaire par disque", + "endpoint": "/api/storage", + "source": "lsblk -O + smartctl -i par appareil, avec cache d’identité vidé lors des branchements à chaud." + }, + { + "section": "Stockages Proxmox", + "endpoint": "/api/proxmox-storage", + "source": "pvesh get /nodes/<node>/storage avec l'état actif/en ligne de chacun." + }, + { + "section": "Valeurs SMART actuelles", + "endpoint": "/api/storage/smart/", + "source": "smartctl -A <dev> est une requête possible ; le point de détail utilise aussi le JSON SMART complet et les données propres à NVMe." + }, + { + "section": "Historique des autotests SMART", + "endpoint": "/api/storage/smart//history", + "source": "Conservé sous /usr/local/share/proxmenux/smart/<disk>/ en instantanés JSON." + }, + { + "section": "Observations permanentes", + "endpoint": "/api/storage/observations", + "source": "Table SQLite actualisée par Health Monitor à chaque cycle et conservée après résolution des erreurs actives." + } + ], + "outro": "Vérifier la chaîne de collecte sur l'hôte:", + "codeComment1": "# Récupérer l’état actuel depuis un script", + "codeComment2": "# Comparer les données du tableau de bord à celles du système d’exploitation" + }, + "whereNext": { + "heading": "Où aller ensuite", + "items": [ + { + "label": "Moniteur de santé", + "href": "/docs/monitor/health-monitor", + "tail": " — catégorie Disques et E/S et règles de suppression." + }, + { + "label": "Référence de l’API", + "href": "/docs/monitor/api", + "tail": " — points de terminaison du stockage et de SMART." + }, + { + "label": "Notifications", + "href": "/docs/monitor/notifications", + "tailRich": " — actions déclenchées par disk_io_error, storage_unavailable et smart_test_failed." + }, + { + "label": "Indice du tableau de bord", + "href": "/docs/monitor/dashboard", + "tail": "— les autres onglets." + }, + { + "label": "ProxMenux → Gestionnaire de disques", + "href": "/docs/disk-manager", + "tail": " — actions TUI : formater, effacer, tester SMART et importer des disques dans des VM ou conteneurs." + }, + { + "label": "ProxMenux → État et tests SMART du disque", + "href": "/docs/disk-manager/smart-disk-test", + "tail": " — équivalent CLI : planifier les tests SMART, exporter le JSON affiché et consulter les types de tests et leur interprétation." + } + ] + } +} diff --git a/web/messages/fr/docs/monitor/dashboard/system-logs.json b/web/messages/fr/docs/monitor/dashboard/system-logs.json new file mode 100644 index 00000000..80cf6b27 --- /dev/null +++ b/web/messages/fr/docs/monitor/dashboard/system-logs.json @@ -0,0 +1,120 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Tableau de bord : Journaux système | Documentation ProxMenux", + "description": "L'onglet Logs système regroupe trois sources en un seul écran : journalctl en direct avec filtres et téléchargement, l'historique des tâches Proxmox (UPIDs), et le journal de notification — tous consultables, filtrés par gravité / plage de temps, et téléchargeables sous forme de paquets de texte." + }, + "header": { + "title": "Tableau de bord : Journaux système", + "description": "Trois sous-onglets sur un même écran : journal système (journalctl avec filtres), historique des tâches Proxmox et journal des notifications. Tous permettent de rechercher, filtrer et télécharger les données sous forme de fichiers texte.", + "section": "ProxMenux Monitor · Tableau de bord" + }, + "readOnly": { + "title": "En lecture seule par conception", + "body": "Cet onglet ne modifie aucun fichier journal. Les filtres sont conservés dans l'URL ou l'état de l'interface ; les téléchargements sont préparés sur le serveur. Le tableau de bord ne supprime jamais les entrées. Pour leur entretien, utilisez journalctl --vacuum-time=<N> ou logrotate sur l'hôte." + }, + "topRow": { + "heading": "Ligne supérieure : quatre compteurs", + "items": [ + "Total des entrées — nombre de lignes dans la période du filtre actif.", + "Erreurs — nombre de lignes de gravité ≤ 3 (err / crit / alert / emerg).", + "Avertissements — nombre de lignes de gravité 4 (warning).", + "Sauvegardes — nombre de tâches vzdump / PBS dans la même période." + ] + }, + "subtabs": { + "heading": "Trois sous-onglets", + "logsTitle": "Journaux", + "logsIntro": "Le journal système, obtenu sur le serveur avec journalctl. Filtres disponibles dans la barre d'outils :", + "logsFilters": [ + "Gravité — emerg / alert / crit / err / warning / notice / info / debug, ou toute combinaison.", + "Délais — dernier 5 min/ 15 min/ 1 h/ 6 h/ 24 h/ 7 d/sur mesure.", + "Recherche libre — sous-chaîne ou expression régulière (journalctl --grep).", + "Filtre par unité — limite les résultats à une unité systemd donnée (pveproxy.service, nginx.service, …)." + ], + "logsRowsAfter": "Chaque ligne affiche l'horodatage, le badge de gravité, l'unité source et le message. Les longs messages s'effondrent avec un \"show more\" bascule. L'action Download regroupe le filtre actuel dans un seul fichier .txt via GET /api/logs/download — utile quand vous voulez partager une tranche de journal avec quelqu'un.", + "logDetailsModalTitle": "Fenêtre Détails du journal", + "logDetailsBody": "Un clic sur une ligne ouvre la fenêtre Détails du journal, avec tous les champs structurés capturés par journald pour cette entrée, comme avec journalctl --output=verbose sur l'hôte.", + "logDetailsImageAlt": "Fenêtre Détails du journal — une entrée développée avec niveau, service, horodatage, source, unité systemd, identifiant du processus, nom d'hôte et message complet", + "logDetailsImageCaption": "Détails du journal — tous les champs structurés de cette entrée journald, avec le message complet non tronqué en bas. Utile pour les journaux de cron et de services lorsque la commande exécutée compte.", + "fieldsIntro": "Champs indiqués :", + "fields": [ + "Niveau — badge de gravité de couleur (INFO / AVERTISSEMENT / ERREUR / CRITIQUE).", + "Service — nom abrégé de l'unité / processus qui a émis l'entrée.", + "Timestamp — date et heure complètes de la ligne de journal.", + "Source — origine de l'entrée (journal, noyau, audit, ...).", + "Systemd Unit — l'unité réelle .service / .timer / .socket si l'entrée était associée à une.", + "Process ID — PID du processus émetteur.", + "Hostname — utile lorsque les revues sont transmises à travers les nœuds de cluster.", + "Message — message complet non tronqué dans un bloc à chasse fixe, prêt à copier." + ], + "maxLevelStoreTitle": "Journald MaxLevelStore", + "maxLevelStoreBody": "Sur une nouvelle installation Proxmox, journald utilise par défaut MaxLevelStore=warning, ce qui écarte les messages info. Monitor le détecte au démarrage et ajoute un fichier de configuration complémentaire (/etc/systemd/journald.conf.d/proxmenux-loglevel.conf) avec le seuil info, pour conserver les messages informatifs et plus graves. Cela ne comprend pas debug.", + "backupsTitle": "Sauvegardes", + "backupsBody": "Historique des tâches Proxmox limité aux sauvegardes. Une ligne par tâche (vzdump, transferts PBS, récupération de mémoire inutilisée, vérification), avec état (OK / WARNINGS / ERROR), invité concerné, stockage source, durée et UPID. Cliquez sur une ligne pour charger le journal complet via GET /api/task-log/<upid> : les mêmes données que dans Datacenter → Tâches, limitées aux sauvegardes.", + "notificationsTitle": "Notifications", + "notificationsBody1": "Toutes les notifications envoyées par Monitor : Telegram, Discord, e-mail, Gotify, ntfy, Slack, Teams et webhook. Chaque ligne indique l'horodatage, le canal, le type d'événement, la gravité, le titre et le corps générés et, si l'IA est activée, un bouton pour comparer sa reformulation à l'original.", + "notificationsBody2": "Cet onglet permet de vérifier la bonne livraison par un canal et de comparer la reformulation de l'IA au texte du modèle. Les canaux se configurent sur la page détaillée Notifications." + }, + "dataCollected": { + "heading": "Comment les données sont collectées", + "headerSubtab": "Sous-onglet", + "headerEndpoint": "Point de terminaison", + "headerSource": "Source", + "rows": [ + { + "subtab": "Journaux (filtre en direct)", + "endpoint": "/api/logs", + "source": "journalctl --output json --since <range> avec filtres de gravité, unité et recherche appliqués sur le serveur." + }, + { + "subtab": "Télécharger", + "endpoint": "/api/logs/download", + "source": "Même requête, renvoyée en texte brut pour grep / less." + }, + { + "subtab": "Sauvegardes", + "endpoint": "/api/backups", + "source": "Historique des tâches PVE filtré sur vzdump, les transferts PBS, la récupération de mémoire inutilisée et la vérification." + }, + { + "subtab": "Détails d'une tâche de sauvegarde", + "endpoint": "/api/task-log/<upid>", + "source": "Journal complet des tâches en texte clair lu à partir de /var/log/pve/tasks/<index>/<upid>." + }, + { + "subtab": "Historique des notifications", + "endpoint": "/api/notifications/history", + "source": "Table SQLite notification_history alimentée par la boucle d'envoi." + } + ], + "apiIntro": "Le filtre en direct et les téléchargements sont aussi accessibles via l'API :", + "codeComment1": "# Erreurs et événements plus graves de la dernière heure avec un mot-clé", + "codeComment2": "# Télécharger le journal complet des dernières 6 heures en texte simple", + "codeComment3": "# Rechercher la sortie complète d'une tâche spécifique par UPID" + }, + "whereNext": { + "heading": "Où aller ensuite", + "items": [ + { + "label": "Moniteur de santé", + "href": "/docs/monitor/health-monitor", + "tail": " — la catégorie Journaux système, qui détecte les événements persistants, les pics et les cascades." + }, + { + "label": "Notifications", + "href": "/docs/monitor/notifications", + "tail": " — la surveillance du journal lit la même source et transforme les correspondances en notifications." + }, + { + "label": "Référence de l’API", + "href": "/docs/monitor/api", + "tail": " — les points de terminaison logs et task-log et leurs paramètres de requête." + }, + { + "label": "Index du tableau de bord", + "href": "/docs/monitor/dashboard", + "tail": "— les autres onglets." + } + ] + } +} diff --git a/web/messages/fr/docs/monitor/dashboard/system-overview.json b/web/messages/fr/docs/monitor/dashboard/system-overview.json new file mode 100644 index 00000000..5f6424a5 --- /dev/null +++ b/web/messages/fr/docs/monitor/dashboard/system-overview.json @@ -0,0 +1,177 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Tableau de bord : Aperçu du système | Documentation ProxMenux", + "description": "Onglet initial par défaut de ProxMenux Monitor : quatre cartes (CPU, mémoire, VM et LXC actifs, température) avec actualisation en direct et mini-courbe de tendance, graphique historique et résumés du stockage et du réseau liés à leurs onglets détaillés." + }, + "header": { + "title": "Tableau de bord : onglet Aperçu du système", + "description": "L'onglet ouvert par défaut : quatre cartes de mesures en direct en haut, un graphique historique au centre et des résumés du stockage et du réseau en bas, issus des mêmes API que les onglets détaillés.", + "section": "ProxMenux Monitor · Tableau de bord" + }, + "readOnly": { + "title": "Un instantané en lecture seule", + "body": "Tous les panneaux de cet onglet sont informatifs. Les actions se trouvent dans les onglets liés : Stockage pour les disques, VMs et LXCs pour démarrer ou arrêter les invités, Sécurité pour l'authentification." + }, + "captureAlt": "Onglet Aperçu du système — quatre cartes métriques (CPU, Mémoire, VMs actifs, Température), diagramme des nœuds, et cartes de synthèse de stockage / réseau", + "captureCaption": "Aperçu du système, l'onglet initial par défaut. Les quatre cartes sont actualisées en direct, le graphique montre l'historique et les deux cartes du bas résument le stockage et le réseau.", + "topRow": { + "heading": "Ligne supérieure : cartes de mesures en direct", + "intro": "Quatre cartes en grille 2×2 sur mobile et sur une ligne sur ordinateur. Chacune est actualisée via /api/system toutes les quelques secondes.", + "headerCard": "Carte", + "headerWhat": "Ce qu'il montre", + "headerSource": "Source", + "rows": [ + { + "card": "Utilisation du processeur", + "what": "Pourcentage actuel avec une barre de progression. Mise à jour ~1 s via l'échantillonneur de signes vitaux.", + "source": "psutil.cpu_percent()" + }, + { + "card": "Utilisation de la mémoire", + "what": "Go utilisés, pourcentage et total en Go. La barre représente le pourcentage.", + "source": "psutil.virtual_memory()" + }, + { + "card": "VM active et LXC", + "what": "Nombre d'invités en cours d'exécution, répartition En cours / Arrêtés et total des VM et LXC en bas.", + "source": "/api/vms (consolidé)" + }, + { + "card": "Température", + "what": "Température CPU en °C avec état (basse / modérée / élevée) et mini-courbe des 5 dernières minutes en arrière-plan. Affiche N/A sans capteur. Cliquez pour ouvrir les détails.", + "source": "sensors / coretemp" + } + ], + "thresholdsTitle": "Couleurs et seuils appliqués ici", + "thresholdsIntro": "Anneaux, barres et mini-courbes suivent la même échelle : vert sous le seuil Avertissement, ambre entre Avertissement et Critique, rouge à partir de Critique. Valeurs recommandées fournies avec ProxMenux :", + "thresholdsItems": [ + "Utilisation CPU — avertissement 85 %, critique 95 %.", + "Mémoire — avertissement 85 %, critique 95 %. Le swap déclenche aussi le niveau Critique à 5 % d'utilisation ; un hôte Proxmox sain devrait rarement y recourir.", + "Température CPU — avertissement 80 °C, critique 90 °C." + ], + "thresholdsOutro": "Les valeurs sont configurables par hôte. Paramètres → Seuils du moniteur de santé centralise leur réglage et explique comment les adapter.", + "sparklineTitle": "La mini-courbe montre la tendance", + "sparklineBody": "La carte de température trace les 5 dernières minutes sous la valeur, avec les couleurs Avertissement/Critique définies ci-dessus. Elle permet de voir rapidement si la température de l'hôte augmente sans ouvrir les détails." + }, + "processes": { + "heading": "Processus les plus consommateurs de CPU et de mémoire", + "intro": "Les cartes CPU et Mémoire ouvrent une liste triable des 25 processus les plus consommateurs : par utilisation CPU depuis la carte CPU, ou par mémoire résidente depuis la carte Mémoire.", + "listTitle": "La boîte de dialogue liste", + "listItems": [ + "Actualisation automatique — la liste se met à jour toutes les 5 secondes tant que la fenêtre est ouverte ; les requêtes cessent à sa fermeture.", + "Filtre — la recherche limite la liste par commande, utilisateur ou PID.", + "Barre en ligne — la colonne métrique primaire dessine une petite barre à l'échelle de la valeur la plus élevée de la liste filtrée, de sorte que le classement reste visible même si aucun processus n'est proche de 100 %.", + "Disposition mobile — sous 640 px, les colonnes PID et Utilisateur sont masquées pour garder Commande, CPU % et Mémoire sans défilement horizontal." + ], + "captureListAlt": "Fenêtre des processus par mémoire — tableau trié par RSS avec PID, utilisateur, commande, CPU % et mémoire", + "captureListCaption": "La carte mémoire ouvre la liste triée par RSS (accent indigo). La carte CPU ouvre la même liste triée par l'utilisation de CPU (accent bleu).", + "detailTitle": "Détails par processus", + "detailIntro": "Cliquez sur une ligne pour ouvrir une seconde fenêtre avec les données en direct du processus, réparties en quatre sections :", + "detailItems": [ + "Aperçu — état, processus parent, nombre de threads, descripteurs de fichiers ouverts, utilisateur et groupe.", + "Ressources — CPU %, mémoire %, mémoire résidente (RSS), taille virtuelle, swap et totaux des E/S en lecture et écriture.", + "Commande — nom court, ligne de commande complète, chemin de l'exécutable et répertoire de travail.", + "Durée — horodatage de démarrage et temps d'exécution écoulé." + ], + "detailRefresh": "Les détails sont actualisés toutes les 3 secondes. Quand le processus se termine, les requêtes cessent et un bandeau ambre Ce processus est terminé apparaît. Le dernier état capturé reste visible, atténué, pour consulter ce qui se passait juste avant la fin.", + "captureDetailAlt": "Fenêtre de détails d'un processus — Aperçu, Ressources, Commande et Durée pour un PID", + "captureDetailCaption": "Boîte de dialogue de détails par processus ouverte à partir d'une ligne de liste. La couleur de l'accent correspond à la carte qui l'a ouverte (bleu pour CPU, indigo pour Mémoire)." + }, + "middle": { + "heading": "Centre : graphiques des métriques du nœud", + "body1": "Sous les cartes, NodeMetricsCharts affiche les historiques CPU, mémoire et E/S disque du stockage RRD de Proxmox via /api/node/metrics. Le sélecteur propose 1 heure / 24 heures / 7 jours / 30 jours / 1 an. La résolution diminue pour les grandes périodes afin de conserver un affichage fluide.", + "body2": "Les mêmes graphiques que l'interface web Proxmox pour un nœud, intégrés au thème sombre de Monitor et alignés avec les autres panneaux." + }, + "bottom": { + "heading": "Ligne inférieure : Sommaires de stockage et de réseau", + "storageTitle": "Carte d'aperçu du stockage", + "storageIntro": "Une vue condensée de l'état de stockage de l'hôte, divisée en trois blocs:", + "storageItems": [ + "Capacité totale du nœud — somme des stockages VM/LXC et du stockage local du système, avec une barre dégradée représentant l'espace utilisé et libre.", + "Capacité totale / Disques physiques — capacité brute et nombre de disques physiques détectés.", + "Stockage VM/LXC — espace utilisé, libre et pourcentage des stockages des invités, avec un compteur s'il y en a plusieurs.", + "Stockage local (système) — montage racine ou système de l'hôte, séparé du pool des invités." + ], + "storageDrillIn": "Les détails se trouvent dans l'onglet Stockage : SMART par disque, pools ZFS, historique des observations, etc.", + "networkTitle": "Carte d'aperçu du réseau", + "networkBody1": "La ligne supérieure montre le nombre d'interfaces actives (physiques + ponts combinés). En dessous, deux rangées de badges colorés pour les interfaces qui sont up — NIC physiques en bleu, ponts en couleur secondaire. Un sélecteur de temps en haut à droite (1 heure / 24 heures / 7 jours / 30 jours / 1 année) contrôle une petite carte de trafic RX / TX.", + "networkBody2": "Les détails par interface (IP/MAC, graphique RRD, membres du pont, mode bond, etc.) sont dans l'onglet Réseau." + }, + "refresh": { + "heading": "Modèle d'actualisation", + "intro": "Chaque panneau gère son état de chargement (loadingStates.cpu, loadingStates.storage, …) pour éviter qu'une source lente bloque les autres. Un espace réservé animé apparaît pendant le chargement. Les échecs sont gérés sans bloquer la vue : sans capteur de température, la carte affiche N/A plutôt qu'une erreur.", + "items": [ + "Cartes supérieures — actualisation toutes les 5 s environ. CPU et température reçoivent aussi des données chaque seconde depuis l'échantillonneur de signes vitaux.", + "Graphique des métriques du nœud — chargement à l'ouverture et au changement de période ou de langue. Un nouvel essai, si nécessaire, a lieu après 60 s.", + "Carte de stockage — rafraîchir chaque 60 s. Les données SMART sont mises en cache plus longtemps (l'onglet Stockage déclenche une nouvelle lecture sur demande).", + "Carte réseau — résumé toutes les 59 s et graphique du trafic toutes les 60 s pour la période sélectionnée.", + "Actualisation manuelle — le bouton Actualiser de l'en-tête recharge immédiatement tous les panneaux." + ] + }, + "dataCollected": { + "heading": "Comment les données sont collectées", + "headerCard": "Carte", + "headerEndpoint": "Point de terminaison", + "headerSource": "Source", + "rows": [ + { + "card": "Indicateur d'état de l'en-tête", + "endpoint": "/api/health", + "source": "L'état global mis en cache produit par le Health Monitor chaque cycle." + }, + { + "card": "CPU / RAM / Swap / Durée de fonctionnement", + "endpoint": "/api/system", + "source": "/proc/stat, /proc/meminfo, /proc/uptime avec prélèvement à courte fenêtre CPU." + }, + { + "card": "Informations sur l'hôte (kernel, BIOS, distro)", + "endpoint": "/api/info", + "source": "uname -a, dmidecode, version PVE. Mis en cache par processus." + }, + { + "card": "Stockage / réseau / cartes VMs", + "endpoint": "/api/storage/summary, /api/network/summary, /api/vms", + "source": "Consultez les onglets détaillés. Les cartes d'en-tête montrent une vue compacte provenant des mêmes points de terminaison." + }, + { + "card": "Fréquence d'actualisation", + "endpoint": "—", + "source": "Données système toutes les 5 s ; stockage, VM et résumé réseau toutes les 59 s. Le bouton Actualiser de l'en-tête recharge immédiatement tous les panneaux." + } + ], + "codeComment1": "# Appel alimentant l'indicateur d'état de l'en-tête", + "codeComment2": "# public, sans jeton", + "codeComment3": "# instantané authentifié utilisé par les cartes" + }, + "whereNext": { + "heading": "Où aller ensuite", + "items": [ + { + "label": "Moniteur de santé", + "href": "/docs/monitor/health-monitor", + "tail": " — la fenêtre de l'indicateur d'état de l'en-tête : dix catégories, masquage et suppression des alertes." + }, + { + "label": "Référence de l’API", + "href": "/docs/monitor/api", + "tail": " — points de terminaison system, info et health." + }, + { + "label": "Notifications", + "href": "/docs/monitor/notifications", + "tail": "— comment les mêmes statuts se transforment en Telegram / Discord / Messages électroniques." + }, + { + "label": "Index du tableau de bord", + "href": "/docs/monitor/dashboard", + "tail": " — les autres onglets du tableau de bord en un coup d'œil." + }, + { + "label": "Architecture", + "href": "/docs/monitor/architecture", + "tail": " — les threads en arrière-plan et les API qui alimentent cette vue." + } + ] + } +} diff --git a/web/messages/fr/docs/monitor/dashboard/terminal.json b/web/messages/fr/docs/monitor/dashboard/terminal.json new file mode 100644 index 00000000..6a01e643 --- /dev/null +++ b/web/messages/fr/docs/monitor/dashboard/terminal.json @@ -0,0 +1,174 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Tableau de bord : Terminal | Documentation ProxMenux", + "description": "Shell de l'hôte Proxmox dans le navigateur : jusqu'à 4 terminaux en grille, boutons de clavier pour mobiles (ESC, TAB, flèches, combinaisons Ctrl), aide-mémoire intégré avec cheat.sh et protection JWT." + }, + "header": { + "title": "Tableau de bord : onglet terminal", + "description": "Une véritable session shell sur l'hôte Proxmox depuis le navigateur : jusqu'à quatre terminaux simultanés, boutons de clavier pour mobiles et aide-mémoire des commandes, avec le même thème que le reste du tableau de bord.", + "section": "ProxMenux Monitor · Tableau de bord" + }, + "intro": { + "title": "Un vrai PTY dans le navigateur", + "body": "Le terminal crée un PTY sur le serveur via flask_terminal_routes, le relie par WebSocket à xterm.js dans le navigateur et fonctionne en tant que root, utilisateur de l'unité systemd. Comme avec ssh root@<host>, vous pouvez utiliser vim, tmux, les outils ncurses et les CLI Proxmox (qm, pct, pvesh, pvecm). Chaque PTY exporte PROXMENUX_TERMINAL=monitor. Tous ses processus enfants bash, dont un lancement ultérieur de menu, héritent de cette variable pour reconnaître le terminal de Monitor." + }, + "singleAlt": "Onglet Terminal de ProxMenux Monitor — une session affichant le résumé système de Fastfetch à la connexion", + "singleCaption": "Un terminal hôte ouvert : la barre indique le nombre (1 / 4 terminaux), + Nouveau, Rechercher, Effacer et Fermer. Les boutons de clavier pour mobiles apparaissent en dessous sur les appareils tactiles.", + "target": { + "heading": "Cible de connexion", + "body1": "L'onglet Terminal ouvre un shell sur l'hôte Proxmox lui-même — la même connexion que vous pourriez obtenir sur SSH. Chaque onglet ouvre un tout nouveau terminal hôte.", + "body2": "Pour atteindre un conteneur LXC du navigateur, utilisez le bouton dédié Console sur chaque carte CT en cours d'exécution dans l'onglet VMs & LXCs. Il ouvre un modal qui exécute pct enter <vmid> et réutilise la même barre d'outils mobile décrite ci-dessous." + }, + "menuGuard": { + "heading": "Protection de la mise à jour de menu dans ce terminal", + "body1": "Après confirmation, menu remplace sa propre arborescence de scripts et se recharge. Cela fonctionne via SSH ou la console Proxmox, mais fermerait le PTY du shell dans le navigateur et interromprait le WebSocket. Pour l'éviter, check_updates_stable, check_updates_beta et apply_release_channel lisent PROXMENUX_TERMINAL pour détecter le contexte Monitor.", + "body2": "Le dialogue oui/non est alors remplacé par un message avec la commande officielle de l'installateur : bash -c \"$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)\" pour stable et l'URL équivalente de install_proxmenux_beta.sh pour bêta. La mise à jour doit être exécutée via SSH ou la console de l'hôte Proxmox ; le terminal du navigateur sert à lire et confirmer le message." + }, + "fourTerminals": { + "heading": "Jusqu'à quatre terminaux à la fois", + "intro": "L'onglet vous permet d'ouvrir jusqu'à quatre terminaux hôtes simultanément. Chacun obtient son propre PTY et son propre WebSocket — ce sont des sessions totalement indépendantes. Deux mises en page changent avec les icônes à côté du bouton \"Nouveau\" :", + "items": [ + "Vue par onglets — un terminal visible, les autres sous forme d'onglets nommés en haut (Terminal 1, Terminal 2…). Pratique pour une tâche, les autres restant en arrière-plan.", + "Vue en grille — tous les terminaux ouverts dans une grille 2×2. Vous pouvez surveiller htop dans l'un, iftop dans un autre et modifier des fichiers dans un troisième sans changer d'onglet." + ], + "outro": "La barre indique le nombre de terminaux (1/4 terminaux, 4/4 terminaux). + Nouveau ouvre un onglet ; le petit × de son en-tête le ferme. Le grand bouton rouge Fermer en haut ferme tous les terminaux." + }, + "gridAlt": "Onglet Terminal de ProxMenux Monitor — quatre terminaux en grille avec ls, configuration réseau, iftop et menu principal ProxMenux côte à côte", + "gridCaption": "Vue en grille (4 / 4 terminaux) — quatre PTY indépendants en parallèle : liste de répertoire, /etc/network/interfaces, iftop et menu principal ProxMenux. Le sélecteur de disposition de la barre permet de passer entre grille et onglets.", + "keyboard": { + "heading": "Boutons de clavier pour mobiles", + "intro": "Les claviers de téléphone et de tablette n'offrent souvent pas ESC, TAB, les flèches ou les combinaisons de touches de modification. Elles sont nécessaires pour utiliser vim, nano, htop ou les menus TUI. Terminal affiche donc une rangée de boutons tactiles en dessous sur les petits écrans ou les appareils tactiles :", + "headerButton": "Bouton", + "headerSends": "Envoie", + "headerUse": "Utilisation typique", + "rows": [ + { + "button": "ESC", + "sends": "\\x1b", + "use": "Quitter le mode insert en vim, annuler une boîte de dialogue TUI, laisser une recherche." + }, + { + "button": "TAB", + "sends": "\\t", + "use": "Complétion des chemins et navigation entre les champs dans dialog/whiptail." + }, + { + "button": "↑ ↓ ← →", + "sends": "\\x1bO[ABCD]", + "use": "Historique Shell, mouvement de curseur, navigation de menu." + }, + { + "button": "↵ Entrée", + "sends": "\\r", + "use": "Confirmer. Certains claviers remplacent Entrée par Aller/Terminé ; ce bouton évite l'ambiguïté." + }, + { + "button": "Ctrl ▾", + "sends": "Liste déroulante", + "useRich": true + } + ], + "ctrlIntro": "Trois séquences de contrôle :", + "ctrlItems": [ + "Ctrl+C — annuler / interrompre la commande en cours d'exécution (\\x03).", + "Ctrl+X — quitter nano (\\x18).", + "Ctrl+R — recherche à rebours dans l'historique bash (\\x12)." + ], + "modalTitle": "Même barre d'outils dans la fenêtre de console LXC", + "modalBody": "La console ouverte depuis VMs et LXCs → Console affiche les mêmes boutons de clavier sous la fenêtre. À la connexion, elle saisit automatiquement pct enter <vmid> pour entrer directement dans le conteneur." + }, + "lxcAlt": "Fenêtre de console LXC de ProxMenux Monitor — Terminal: ubuntu (ID: 103), avec la même barre mobile (ESC, TAB, flèches, Entrée, Ctrl) en dessous", + "lxcCaption": "Console LXC ouverte depuis VMs et LXCs → Console. L'en-tête indique le conteneur cible (Terminal: ubuntu (ID: 103)) et la même barre tactile apparaît sous le terminal.", + "search": { + "heading": "Rechercher des commandes — aide-mémoire intégré", + "intro": "Le bouton bleu Rechercher ouvre une recherche approximative de commandes. Saisissez quelques lettres d'une commande Linux ou Proxmox (ls, tar, qm, pct, zpool, systemctl…) pour afficher des exemples avec Envoyer au terminal actif en un geste. Vous pouvez ainsi retrouver une option sans changer d'onglet.", + "modalAlt": "Fenêtre Rechercher des commandes de ProxMenux Monitor — recherche approximative de commandes Linux et Proxmox avec cheat.sh et plusieurs exemples de ls", + "modalCaption": "Recherche de ls — chaque résultat affiche la commande, sa description et une petite flèche pour l'envoyer au terminal actif. La source des données est indiquée en bas à droite (Fourni par cheat.sh).", + "aboutLabel": "À propos de cheat.sh:", + "aboutBody": "est un aide-mémoire libre maintenu par la communauté, regroupant de courts exemples pratiques pour des centaines de commandes Linux, outils d'administration et langages de programmation. Prévu pour être consulté avec curl cheat.sh/<command>, il est aussi accessible dans le navigateur. ProxMenux Monitor transmet les requêtes par un proxy côté serveur pour garder la même origine que le tableau de bord.", + "headerSource": "Source", + "headerWhen": "Quand il est utilisé", + "headerWhat": "Ce que vous voyez", + "onlineLabel": "(en ligne)", + "onlineWhen": "Lorsque l'hôte a accès à Internet et que le proxy cheat.sh répond.", + "onlineWhat": "Plusieurs exemples pratiques par commande, avec leur description au-dessus. Le point d'état de l'en-tête est vert.", + "fallbackLabel": "Solution de repli locale", + "fallbackWhen": "Lorsque cheat.sh est inaccessible (hôte hors ligne, pare-feu restrictif, panne de cheat.sh).", + "fallbackWhat": "Une liste intégrée de commandes Linux et Proxmox courantes. Le catalogue est plus petit, mais toujours disponible. Le point d'état est rouge.", + "sendingNote": "Fonctionnement de l'envoi : la flèche près du résultat transmet le texte au terminal actif (onglet sélectionné ou dernier terminal cliqué en grille). La fenêtre se ferme automatiquement pour vous permettre d'appuyer sur Entrée." + }, + "auth": { + "heading": "Authentification", + "items": [ + "Le navigateur demande d'abord un ticket à usage unique via POST /api/terminal/ticket, avec le JWT dans l'en-tête Authorization. Ce ticket est ensuite transmis à l'ouverture du WebSocket et expire après 5 secondes. Si l'authentification est activée et le ticket absent ou invalide, la connexion est fermée avant la création d'un PTY.", + "Si Monitor est derrière un proxy inverse, celui-ci doit transmettre les demandes de mise à niveau WebSocket. Exemples Nginx / Caddy / Traefik sur la page Accès et authentification." + ] + }, + "clipboard": { + "heading": "Presse-papiers, historique d'affichage et redimensionnement", + "items": [ + "Copier et coller — utilise le presse-papiers du navigateur. Sélectionnez le texte avec la souris ou le pavé tactile et utilisez le raccourci système (Cmd+C sur macOS, Ctrl+Shift+C sur Linux/Windows). Les bureaux Linux permettent aussi de coller avec le clic central.", + "Historique d'affichage — défilement à la molette ou à deux doigts. xterm.js garde les quelques milliers de dernières lignes en mémoire.", + "Redimensionnement — le terminal ajuste la taille de la fenêtre PTY quand vous redimensionnez le panneau, pour afficher correctement htop et vim.", + "Reconnexion au retour sur l'onglet — changer d'application sur téléphone ou tablette, notamment iPad, peut couper le WebSocket. Terminal détecte le changement de visibilité et se reconnecte au retour, avec un délai de 15 secondes pour les connexions VPN lentes." + ] + }, + "disconnect": { + "heading": "Causes de déconnexion", + "intro": "Les raisons les plus courantes pour lesquelles une session se termine et ce qu'il faut faire pour chacune :", + "headerCause": "Cause", + "headerFix": "Solution", + "rows": [ + { + "cause": "JWT de session expiré lors de l'ouverture ou de la reconnexion (durée de 24 h).", + "fix": "Rafraîchir la page et vous connecter à nouveau. Le terminal n'est pas conçu pour les sessions sans surveillance, donc la durée de vie du JWT correspond à la connexion régulière du tableau de bord." + }, + { + "cause": "Délai d'inactivité du proxy inverse.", + "fix": "Augmentez proxy_read_timeout dans Nginx ou son équivalent dans Caddy / Traefik (exemples dans Accès et authentification)." + }, + { + "cause": "Téléphone ou tablette en veille.", + "fix": "Au réveil de l'appareil, l'onglet se reconnecte automatiquement (délai de 15 s pour les connexions VPN). Sinon, rechargez-le." + }, + { + "cause": "Le service redémarre sur l'hôte.", + "fix": "Tout redémarrage de proxmenux-monitor.service ferme tous les PTY. Ouvrez de nouveaux terminaux une fois le tableau de bord rechargé." + } + ] + }, + "warning": { + "title": "Le terminal est un shell root sur l'hôte", + "body": "Le terminal hérite de l'utilisateur de l'unité systemd (root) et dispose de tous les privilèges sur l'hôte Proxmox. Configurez utilisateur, mot de passe et 2FA dans Accès et authentification avant d'autoriser les accès hors du réseau local. Si l'authentification est désactivée, toute personne atteignant le port 8008 peut ouvrir un shell root sans confirmation ni identifiants SSH. Pour les accès externes, utilisez Secure Gateway (Tailscale) ou un proxy inverse HTTPS au lieu de publier ce port sur Internet." + }, + "whereNext": { + "heading": "Où aller ensuite", + "items": [ + { + "label": "Accès et authentification", + "href": "/docs/monitor/access-auth", + "tail": " — exemples de proxy inverse avec les lignes de mise à niveau WebSocket nécessaires au terminal." + }, + { + "label": "Architecture", + "href": "/docs/monitor/architecture", + "tail": " — transport WebSocket (HTTP via flask-sock et HTTPS / WSS via gevent)." + }, + { + "label": "Référence de l’API", + "href": "/docs/monitor/api", + "tail": " — points de terminaison WebSocket /ws/terminal et /ws/script/, avec le reste de l'API." + }, + { + "label": "Intégrations → Portail sécurisé", + "href": "/docs/monitor/integrations", + "tail": "— lorsque vous voulez un accès terminal de l'extérieur du LAN sans exposer le port 8008." + }, + { + "label": "Index du tableau de bord", + "href": "/docs/monitor/dashboard", + "tail": "— les autres onglets." + } + ] + } +} diff --git a/web/messages/fr/docs/monitor/dashboard/vms-lxcs-app.json b/web/messages/fr/docs/monitor/dashboard/vms-lxcs-app.json new file mode 100644 index 00000000..a543e26e --- /dev/null +++ b/web/messages/fr/docs/monitor/dashboard/vms-lxcs-app.json @@ -0,0 +1,245 @@ +{ + "meta": { + "title": "Onglet App LXC : détection, liens et suivi de version | ProxMenux", + "description": "Découvrez et enregistrez les applications LXC, créez des liens web et en option suivez les versions installées et disponibles." + }, + "header": { + "title": "Onglet de l'application LXC : découverte, liens et suivi des versions", + "description": "Donnez à chaque application LXC une identité persistante, un accès web et une preuve de version optionnelle sans couplage de l'enregistrement aux mises à jour." + }, + "intro": { + "p1": "L'onglet App enregistre les applications du LXC. Une fiche peut contenir simplement un nom et un lien web, ou aussi un détecteur de version installée et une source amont.", + "p2": "La procédure qui modifie le logiciel se configure séparément dans l'onglet Mises à jour. Enregistrer une application ne lance jamais d'installateur ni de programme de mise à jour.", + "callout": "L'enregistrement, le suivi et la mise à jour des versions sont trois capacités indépendantes. Chacun peut être utilisé sans exiger les deux autres.", + "dashboardTitle": "De l'inscription au lanceur Apps", + "dashboard": "Chaque lien web enregistré ici apparaît aussi dans l'onglet Apps principal. Cette page du LXC reste la référence pour le nom, le logo, les liens et le suivi de version." + }, + "overview": { + "heading": "Ce que peut fournir une fiche d'application", + "lead": "Un seul enregistrement enregistré peut inclure:", + "items": [ + "Un nom d'affichage et un logo adapté au thème.", + "Un ou plusieurs liens Web cliquables construits à partir de l'adresse LXC, le schéma et le port sauvegardé.", + "Un détecteur optionnel pour la version actuellement installée dans le LXC.", + "Une source optionnelle GitHub, HTTP JSON ou Docker Hub pour la dernière version disponible.", + "Notifications de nouvelles versions et inclusion dans le compteur de mises à jour, par application.", + "Une section correspondante de l'onglet Mises à jour, même lorsque le suivi des versions est désactivé." + ] + }, + "discovery": { + "heading": "Découverte en cache et recherche d'applications", + "lead": "Les suggestions sont incluses dans le cache de la fenêtre de chaque LXC. L'analyse de démarrage les prépare en arrière-plan pour afficher immédiatement les résultats à l'ouverture d'App.", + "items": [ + "L'ouverture de l'onglet Application ne démarre pas une nouvelle analyse du catalogue et n'interroge pas de manière répétée le LXC.", + "Rechercher des applications lance une nouvelle détection pour ce LXC. Utilisez cette action après avoir installé un logiciel alors que ProxMenux fonctionne déjà.", + "La liste précédente reste visible pendant l'analyse. Les nouvelles correspondances sont ajoutées à la fin.", + "Si aucune nouvelle correspondance n'est trouvée, le résultat est indiqué à côté des actions et Enregistrer l'application reste disponible pour l'entrée manuelle.", + "Enregistrer, supprimer ou restaurer une application met à jour le même cache immédiatement. Commencer ou restaurer un LXC rafraîchit seulement cet invité à travers son cycle de vie existant." + ], + "callout": "Une suggestion n'est pas une fiche enregistrée. Elle reste en lecture seule jusqu'au clic sur Enregistrer et à la sauvegarde du formulaire." + }, + "registration": { + "heading": "Enregistrement d'une application", + "lead": "Une suggestion détectée et un enregistrement manuel utilisent le même éditeur:", + "steps": [ + "Cliquez sur Enregistrer pour une suggestion, ou sur Enregistrer une application pour choisir dans le catalogue ou saisir un nom personnalisé.", + "Consultez le nom et le logo proposés par le catalogue.", + "Ajouter les liens web requis. Les ports d'écoute détectés sont proposés comme raccourcis, mais aucun n'est enregistré automatiquement.", + "Laissez Suivre la version amont désactivé pour une fiche avec seulement des liens, ou activez-le et vérifiez le détecteur de version installée et la source amont.", + "Si le suivi est activé, utilisez Tester le détecteur, puis enregistrez la fiche.", + "Cliquez sur Terminé après modification. App et Mises à jour utilisent la même fiche actualisée en cache." + ] + }, + "catalog": { + "heading": "Inscription assistée par catalogue", + "lead": "Le catalogue fournit des données par défaut, mais l'enregistrement enregistré reste modifiable.", + "items": [ + "Les résultats de recherche peuvent préremplir le nom canonique, le logo et les ports web communs.", + "Les détecteurs connus utilisent les vrais noms de paquets, exécutables, fichiers, distributions Python, étiquettes OCI ou commandes, plutôt qu'une hypothèse universelle comme /root/.app.", + "Les corrections vérifiées dans les installations réelles sont prioritaires lorsque le chemin diffère des métadonnées de l'installateur.", + "Les marqueurs Proxmox VE Helper-Scripts tels que /root/.slug restent un signal de compatibilité pour les nouvelles installations d'aide, pas le seul détecteur.", + "Chaque valeur proposée peut être modifiée avant d'enregistrer pour couvrir les installateurs officiels et les installations manuelles." + ] + }, + "docker": { + "heading": "Comment les Docker LXC sont représentés", + "lead": "Si Docker est la plateforme principale d'un LXC, Docker est l'application enregistrée au niveau LXC.", + "items": [ + "Une charge de travail conteneurisée telle que Portainer, Frigate ou Vaultwarden n'est pas suggérée en tant qu'application native indépendante LXC.", + "Les services Docker en cours d'exécution avec des ports TCP publiés sont proposés comme liens web facultatifs dans l'éditeur Docker.", + "Chaque lien suggéré indique le service, le port hôte et le port conteneur. Seuls les liens qui fournissent une interface Web doivent être enregistrés.", + "Le logo général Docker est utilisé si le lien n'a pas de logo spécifique. Un logo configuré pour le lien le remplace.", + "Après l'enregistrement de Docker, Docker Engine et les mises à jour d'images sont affichées ensemble dans sa section sur l'onglet Mises à jour." + ], + "callout": "Cette structure empêche une charge de travail Docker de ressembler à un logiciel installé directement dans le LXC tout en préservant des liens rapides avec ses interfaces." + }, + "webLinks": { + "heading": "Liens et logos Web", + "lead": "Les liens Web fonctionnent avec ou sans suivi des versions.", + "items": [ + "Chaque lien stocke un schéma, un port, une description optionnelle et une URL de logo optionnelle.", + "L'URL affichée utilise l'adresse courante déjà détectée pour le LXC; l'adresse n'est pas dupliquée dans chaque enregistrement d'application.", + "Un lien sans son propre logo revient au logo du niveau de l'application.", + "Plusieurs liens peuvent représenter une interface d'administration, une API, une interface secondaire ou un autre point de terminaison de l'application.", + "Une application enregistrée avec seulement des liens apparaît aussi dans Mises à jour, où un programme personnalisé peut être configuré plus tard." + ] + }, + "tracking": { + "heading": "Suivi optionnel de la version", + "lead": "Le suivi combine un détecteur de version installé avec une source en amont optionnelle. Les deux côtés sont vérifiés indépendamment.", + "colMethod": "Méthode de détection de la version installée", + "colUse": "Utilisation", + "detectorRows": [ + { + "method": "dpkg / apk", + "use": "Lis la version de paquets installée à partir de métadonnées de paquets Debian, Ubuntu ou Alpine." + }, + { + "method": "binary", + "use": "Exécute un chemin binaire absolu ou un nom de commande avec des arguments de version." + }, + { + "method": "file + regex", + "use": "Lit un fichier réel et extrait la version avec un groupe de capture." + }, + { + "method": "docker label / docker exec", + "use": "Lit une étiquette de version OCI ou exécute une commande de version dans un conteneur Docker." + }, + { + "method": "python distribution", + "use": "Utilise importlib.metadata via l'interpréteur Python sélectionné." + }, + { + "method": "command", + "use": "Exécute une commande avancée de style argv sans shell et extrait la version de sa sortie." + }, + { + "method": "manual", + "use": "Stocke une version entrée manuellement; elle doit être modifiée après la mise à jour de l'application." + }, + { + "method": "OCI image", + "use": "Pour les conteneurs installés par OCI manager Apps. Lit les versions de l'application et de l'image dans la fiche d'installation et compare le digest installé à celui publié par le registre. Aucune configuration nécessaire." + } + ], + "sourcesHeading": "Sources de la version disponible", + "sources": [ + "GitHub dépôt : dernière version ou étiquette d'un dépôt public owner/name.", + "HTTP JSON : point de terminaison public et chemin à points comme data.version ou releases[0].tag_name.", + "Docker Hub: étiquettes en version filtrées par une expression régulière. Un aperçu en direct montre de vraies balises correspondantes avant que l'enregistrement soit enregistré.", + "Les tags mobiles comme latest, stable ou lts ne contiennent pas de version. Suivez ces images par digest dans les mises à jour d'images Docker." + ], + "regexHeading": "Écrire l'expression de capture", + "regexLead": "L'expression régulière doit renvoyer la version dans son premier groupe de capture.", + "regexRules": [ + "Correspondez au texte émis par la source binaire, le fichier, la commande ou la balise sélectionnée; ne devinez pas un chemin générique.", + "Échappez les points littéraux avec \\. pour éviter de reconnaître des caractères arbitraires.", + "Acceptez un v initial seulement si la source peut en contenir un.", + "Inclure des suffixes tels que des révisions préalables ou des révisions distro seulement lorsqu'elles sont significatives pour la comparaison.", + "Utilisez Tester le détecteur avant de sauvegarder et vérifiez la version installée affichée dans le LXC." + ], + "regexExampleLead": "Capture sémantique commune:", + "regexExample": "v?(\\d+\\.\\d+\\.\\d+)", + "regexCallout": "Une correspondance régex réussie n'est pas la preuve que le chemin du détecteur est correct. Le chemin ou le paquet doit également exister dans l'installation réelle enregistrée." + }, + "updater": { + "heading": "Le suivi et la mise à jour des versions sont indépendants", + "lead": "L'onglet Mises à jour crée une section dès qu'une fiche d'application est enregistrée.", + "items": [ + "Un enregistrement link-only montre que le suivi des versions n'est pas configuré, mais peut toujours recevoir une commande de mise à jour personnalisée.", + "Une application avec suivi mais sans méthode exécutable affiche un message neutre demandant une commande personnalisée.", + "Une application avec un wrapper Proxmox VE Helper-Scripts vérifié peut utiliser ce programme intégré même si sa fiche a commencé par un simple lien web.", + "Ajouter ou modifier un programme de mise à jour ne change ni le détecteur ni la source amont enregistrés dans App." + ] + }, + "states": { + "heading": "États de version sur la carte App", + "colState": "État", + "colDisplay": "Affichage", + "colMeaning": "Signification", + "rows": [ + { + "state": "Mise à jour disponible", + "display": "Version disponible en violet avec une icône vers le haut", + "meaning": "Les versions installées et amont diffèrent." + }, + { + "state": "À jour", + "display": "Versions installée et disponible sans alerte violette", + "meaning": "La dernière vérification n'a trouvé aucune version en amont plus récente." + }, + { + "state": "Suivi en attente", + "display": "Vérification en cours ou en attente", + "meaning": "L'enregistrement est configuré mais n'a pas encore effectué les deux vérifications." + }, + { + "state": "Suivi désactivé", + "display": "Liens Web seulement; aucun bloc de comparaison de version", + "meaning": "La fiche reste valide et peut toujours avoir un programme de mise à jour." + }, + { + "state": "Erreur de vérification", + "display": "Explication en ambre dans la carte", + "meaning": "L'état précédent reste visible tandis que l'erreur du détecteur ou de la source amont est signalée." + } + ] + }, + "management": { + "heading": "Gestion des applications sauvegardées et suggérées", + "lead": "Les actions en bas de l'onglet ont des rôles distincts :", + "items": [ + "Trouver des applications rafraîchit la découverte pour ce LXC seulement.", + "Inscrivez une autre application ouvre le catalogue et l'éditeur manuel sans rescanner le LXC.", + "Modifier révèle les actions Supprimer, Vérifier, notifications et Modifier les champs sur chaque carte.", + "Masquer retire une suggestion indésirable. Les détections masquées se restaurent dans la vue d'enregistrement.", + "Vérifier actualise les données de version de la fiche sélectionnée sans rechercher de nouvelles applications." + ] + }, + "troubleshooting": { + "heading": "Situations communes", + "colProblem": "Situation actuelle", + "colResolution": "Résolution", + "rows": [ + { + "problem": "Le logiciel a été installé après le démarrage de ProxMenux", + "resolution": "Appuyez sur Trouver des applications. L'analyse explicite met à jour les suggestions mises en cache pour ce LXC." + }, + { + "problem": "Aucune application n'a été détectée", + "resolution": "Enregistrez-le manuellement. Un nom et un lien Web suffisent; un suivi peut être ajouté plus tard." + }, + { + "problem": "Le détecteur suggéré retourne la mauvaise version", + "resolution": "Ouvrez Modifier les champs, choisissez le vrai paquet, exécutable ou chemin de fichier et testez avant de sauvegarder." + }, + { + "problem": "Une charge de travail Docker n'est pas offerte en tant qu'application LXC", + "resolution": "Enregistrez Docker et ajoutez l'interface publiée de la charge de travail comme lien web Docker. Les mises à jour d'image restent dans la section Docker." + }, + { + "problem": "Une application enregistrée n'a pas de bouton de mise à jour", + "resolution": "Ouvrez Mises à jour et configurez la méthode. Le seul suivi de version ne définit pas comment installer une mise à jour." + } + ] + }, + "figures": { + "catalog": { + "alt": "Catalogue d'enregistrement d'applications avec résultats de recherche, logos, ports et champs détecteurs", + "caption": "Les métadonnées de catalogue accélèrent l'enregistrement tandis que chaque valeur proposée reste modifiable." + }, + "webLinks": { + "alt": "Carte d'application LXC sauvegardée contenant un lien Web cliquable", + "caption": "Une fiche avec seulement des liens est valide : le suivi peut rester désactivé et un programme de mise à jour peut être ajouté séparément." + }, + "tracking": { + "alt": "Détecteur de version installé en option et champs sources en amont", + "caption": "La détection de la version installée et la source en amont sont configurées et testées séparément." + }, + "card": { + "alt": "Carte d'application sauvegardée avec versions installées et disponibles plus un lien web", + "caption": "La carte combine l'identité, les preuves de version et l'accès web sans exécuter des actions de mise à jour de cet onglet." + } + } +} diff --git a/web/messages/fr/docs/monitor/dashboard/vms-lxcs-updates.json b/web/messages/fr/docs/monitor/dashboard/vms-lxcs-updates.json new file mode 100644 index 00000000..a270ae3f --- /dev/null +++ b/web/messages/fr/docs/monitor/dashboard/vms-lxcs-updates.json @@ -0,0 +1,203 @@ +{ + "meta": { + "title": "Mises à jour LXC : système, applications et Docker | ProxMenux", + "description": "Configurer et lancer les mises à jour du système d'exploitation, des applications, de Docker Engine et des images Docker dans un LXC." + }, + "header": { + "title": "Mises à jour de LXC: OS, applications et Docker", + "description": "Examiner chaque cible de mise à jour en un seul endroit, l'exécuter de façon indépendante ou combiner des cibles sélectionnées dans une action en vrac contrôlée." + }, + "intro": { + "p1": "L'onglet Mises à jour sépare la détection des versions de leur installation. Enregistrement et suivi facultatif se trouvent dans l'onglet App ; les méthodes exécutables se gèrent ici.", + "p2": "Une application enregistrée apparaît dans Mises à jour même avec un seul lien web. Le suivi de version est facultatif ; son programme de mise à jour peut être configuré séparément.", + "callout": "L'enregistrement ne choisit aucun programme de mise à jour. Si un programme Helper-Scripts correspondant est détecté, choisissez et enregistrez Helper-Scripts ou Commande personnalisée. La détection ne garantit pas la compatibilité. Le choix appartient à chaque application, même dans un LXC partagé." + }, + "overview": { + "heading": "Que contient l'onglet", + "lead": "Chaque cible disponible a sa propre section et action:", + "items": [ + "Paquets du système pour les conteneurs Debian, Ubuntu et Alpine.", + "Une section par application enregistrée, y compris les fiches avec seulement un lien.", + "Une section Docker lorsque le Docker est enregistré, avec Docker Engine et des images marquées regroupées.", + "Une section Mise à jour groupée configurable, suivie des options de sauvegarde, redémarrage et programmation." + ] + }, + "mechanisms": { + "heading": "Comment une méthode de mise à jour est sélectionnée", + "lead": "Le chemin intégré Proxmox VE Helper-Scripts suit le mécanisme officiel update-apps. D'autres types d'installation utilisent le paquet correspondant, Docker ou chemin personnalisé.", + "officialReference": "Référence officielle : la documentation update-apps de Proxmox VE Helper-Scripts décrit les modes interactif et sans surveillance, sauvegardes, simulations, ressources temporaires de compilation, journaux et codes de sortie.", + "colSource": "Source", + "colAction": "Action affichée", + "colNotes": "Ce qui est exécuté", + "rows": [ + { + "source": "Paquets APT ou APK", + "action": "Appliquer les mises à jour du système d'exploitation", + "notes": "Mettre à jour les paquets de conteneurs. Les applications enregistrées installées sous forme de paquets dpkg ou apk sont couvertes par ce même passe." + }, + { + "source": "Proxmox VE Helper-Scripts", + "action": "Appliquer la mise à jour", + "notes": "Après sélection explicite de Helper-Scripts, lance le script officiel identifié par le wrapper /usr/bin/update validé. Un marqueur ou une correspondance du catalogue ne suffit jamais à autoriser l'exécution." + }, + { + "source": "Commande personnalisée", + "action": "Exécuter le programme de mise à jour", + "notes": "Exécute la commande enregistrée dans le LXC et remplace tout programme intégré de mise à jour de cette fiche." + }, + { + "source": "Docker Engine", + "action": "Mettre à jour Docker Engine", + "notes": "Met à jour uniquement les paquets Docker installés et leurs dépendances nécessaires. Les autres paquets système et les conteneurs restent inchangés." + }, + { + "source": "Image Docker", + "action": "Mettre à jour l’image", + "notes": "Télécharge l'image sélectionnée et recrée son groupe de services Compose ou son conteneur autonome protégé." + } + ], + "callout": "Une commande personnalisée remplace Helper-Scripts pour cette application. Les exécutions manuelles, groupées et programmées respectent le choix enregistré. Les commandes existantes et les anciennes sélections explicitement enregistrées dans les plans groupés ou les programmations actives sont conservées ; une nouvelle application n'est jamais ajoutée par une ancienne programmation." + }, + "docker": { + "heading": "Docker Engine et images Docker", + "lead": "Après enregistrement de Docker dans App, Docker Engine et l'inventaire des images apparaissent dans la même section Docker.", + "items": [ + "Le suivi de la version Docker Engine est séparé du compteur de paquets OS et a son propre bouton de mise à jour.", + "Les images locales taggées sont comparées à leur registre par digest immuable. Vérifier maintenant rafraîchit cet inventaire sans tirer des images ou redémarrer des conteneurs.", + "Les services Compose sont mis à jour depuis leur projet déclaré. Les images du même groupe sont traitées ensemble pour éviter de recréer le projet plusieurs fois.", + "Un conteneur autonome est recréé à partir de sa configuration actuelle. Le processus protégé garde les données de retour arrière et restaure le conteneur précédent si la recréation échoue.", + "Chaque image est sélectionnable séparément pour les mises à jour manuelles, groupées et programmées, sauf les dépendances Compose déclarées qui doivent suivre leur service principal." + ], + "callout": "Les conteneurs fonctionnant à l'intérieur de Docker ne sont pas présentés comme des applications indépendantes LXC. Leurs ports web publiés peuvent être enregistrés sous forme de liens sous l'enregistrement Docker, tandis que les mises à jour d'images restent dans la section Docker." + }, + "actions": { + "heading": "Actions individuelles et couleurs de statut", + "lead": "Chaque section reste actionnable indépendamment, qu'une mise à jour en vrac soit configurée ou non.", + "items": [ + "Configurer ouvre le choix du programme si aucune méthode n'est définie ; Modifier change un choix enregistré. Les boutons d'information expliquent les options, donnent la documentation officielle et un exemple de script personnalisé. Choisir une option ne l'exécute pas.", + "Sans suivi de version mais avec un programme de mise à jour, l'action neutre Exécuter le programme de mise à jour apparaît. ProxMenux n'affirme pas qu'une mise à jour est en attente.", + "Sans programme Helper-Scripts disponible, configurez une commande personnalisée. Désactiver une méthode n'en choisit pas une autre ; les sélections des plans groupés et programmations restent enregistrées et les cibles indisponibles sont signalées.", + "L'action Mise à jour de l'image s'applique uniquement à l'unité Docker sélectionnée; elle ne met pas à jour Docker Engine ou des images non liées." + ], + "statusColState": "État connu", + "statusColAppearance": "Apparence", + "statusColMeaning": "Signification", + "statusRows": [ + { + "state": "Mise à jour vérifiée disponible", + "appearance": "Texte pourpre, icône vers le haut et action pourpre", + "meaning": "Les versions installées et disponibles ou les empreintes digest des images diffèrent." + }, + { + "state": "À jour, vérifié", + "appearance": "Coche verte et action À jour en vert", + "meaning": "La dernière vérification effectuée confirme que la cible est à jour." + }, + { + "state": "Version inconnue", + "appearance": "Texte neutre et action neutre", + "meaning": "Un programme de mise à jour peut être lancé, mais les données de version manquent pour déterminer si la cible est à jour ou si une mise à jour est disponible." + } + ] + }, + "custom": { + "heading": "Commandes de mise à jour personnalisées", + "lead": "Utilisez une commande personnalisée si l'installation ne dispose pas de programme intégré vérifié ou si la procédure normale doit être remplacée.", + "items": [ + "Ouvrez Configurer si le champ est vide, ou Modifier si une méthode existe.", + "Pour une application intégrée ou Docker Engine, l'éditeur affiche la commande actuelle. Enregistrer un autre contenu en fait le remplacement explicite pour cette fiche.", + "Testez d'abord la procédure complète dans le terminal LXC. Il doit être non interactif, utiliser le répertoire de travail correct et retourner un statut de sortie non zéro en cas d'échec.", + "N'incluez pas pct exec ; ProxMenux entre déjà dans le conteneur et exécute la commande en tant que root." + ], + "exampleLead": "Exemple de procédure complète dans le conteneur:", + "example": "cd /opt/my-app && ./update.sh", + "callout": "Une commande comme myapp --version lit seulement la version ; ce n'est pas un programme de mise à jour. Les commandes sont exécutées avec les droits administrateur : examinez leur contenu comme une commande shell root." + }, + "bulk": { + "heading": "Mise à jour groupée", + "lead": "La mise à jour en vrac crée une action réutilisable pour un ensemble exact de cibles dans le LXC. Il est placé après les différentes sections de l'application et Docker et avant Options.", + "items": [ + "Les paquets système sont obligatoires. Sélectionnez au moins une application, Docker Engine ou une unité image Docker supplémentaire.", + "Applications et unités Docker se choisissent séparément. Le service principal Compose affiche les dépendances mises à jour avec lui.", + "Les cibles indisponibles ou supprimées sont marquées comme étant indisponibles et doivent être supprimées avant que la configuration puisse être enregistrée.", + "Appliquer les mises à jour est violet si une cible a une mise à jour vérifiée, vert si toutes sont vérifiées à jour et neutre si le résultat est inconnu.", + "L'élimination de la configuration en vrac ne supprime pas les méthodes de mise à jour individuelles ou les paramètres de mise à jour programmés." + ], + "callout": "La mise à jour en vrac ne remplace pas les boutons individuels. Il s'agit d'un raccourci optionnel pour une sélection qui doit fonctionner ensemble." + }, + "options": { + "heading": "Options de sauvegarde et de redémarrage", + "lead": "Les mêmes options s'appliquent aux opérations manuelles, en vrac et programmées:", + "items": [ + "Snapshot avant d'appliquer crée une sauvegarde vzdump sur le stockage sélectionné. Si la sauvegarde requise échoue, la mise à jour ne démarre pas.", + "Redémarrer après avoir appliqué redémarre le LXC seulement après un succès.", + "Les sélections sont stockées par LXC et restent indépendantes de la liste cible." + ] + }, + "scheduled": { + "heading": "Mises à jour programmées", + "lead": "Les mises à jour prévues utilisent les mêmes cibles exécutables et les mêmes options de sécurité que les actions manuelles.", + "items": [ + "Choisissez une fréquence prédéfinie ou une expression cron, puis les cibles exactes : paquets système, applications, Docker Engine, unités Docker autonomes ou groupes de services Compose.", + "Le délai après publication ne concerne que les applications sélectionnées avec suivi de version. Sans suivi, leur programme de mise à jour est lancé à chaque échéance.", + "L'état de la dernière exécution distingue succès, achèvement partiel, échec, blocage de sécurité et absence de mise à jour en attente. Après la première exécution programmée, Mises à jour → Mises à jour programmées → Afficher le journal ouvre toute la sortie du programme de mise à jour et des scripts secondaires appelés.", + "Après chaque exécution, ProxMenux vérifie le marqueur standard de redémarrage de Debian. Lorsqu'un redémarrage est nécessaire, l'onglet Mises à jour et la notification d'achèvement le disent; l'avertissement est effacé lorsque LXC démarre ou redémarre.", + "Sur l'hôte Proxmox, les journaux programmés sont stockés dans /usr/local/share/proxmenux/logs/lxc-updates/ en utilisant le nom <VMID>-scheduled-<run-id>.log. Les dix derniers journaux sont conservés par LXC et les anciens fichiers sont supprimés automatiquement.", + "Cet historique concerne les mises à jour programmées. Une mise à jour manuelle affiche sa sortie en direct dans la fenêtre d'exécution de Monitor et ne crée aucun journal programmé dans ce répertoire.", + "Les calendriers d'hôtes externes détectés à partir de Proxmox VE Helper-Scripts sont indiqués séparément, de sorte que l'automatisation du chevauchement est visible." + ], + "callout": "Testez chaque méthode manuellement avant d'activer une programmation. Les commandes programmées ne peuvent pas répondre aux questions interactives." + }, + "completion": { + "heading": "Ce qui se passe après une mise à jour", + "lead": "La simple fin de la commande du terminal ne suffit pas à considérer la mise à jour terminée.", + "items": [ + "La même exécution enregistre son résultat final et rafraîchit l'état du paquet OS, les versions app enregistrées et l'inventaire Docker selon le cas.", + "Les exécutions programmées conservent la sortie du terminal et signalent si un redémarrage reste nécessaire pour terminer l'application des changements de paquets.", + "Le cache LXC est remplacé par l'état vérifié après mise à jour, de sorte que les badges et les boutons ne conservent pas le résultat précédent.", + "Si un LXC arrêté ou restauré démarre, le cycle de vie existant rafraîchit à nouveau ce LXC. L'inventaire de Docker attend que le démon soit prêt au lieu de mettre en cache un résultat de démarrage vide comme final.", + "Les notifications activées sont émises après finalisation du résultat, y compris les échecs partiels et les résultats groupés des images Docker." + ] + }, + "troubleshooting": { + "heading": "Situations communes", + "colProblem": "Situation actuelle", + "colResolution": "Résolution", + "rows": [ + { + "problem": "Aucune méthode de mise à jour n'a été identifiée", + "resolution": "Ouvrez Configurer, ajoutez la procédure non interactive officielle et testez-la manuellement avant de la programmer." + }, + { + "problem": "Une identité Proxmox VE Helper-Scripts est affichée mais aucune action n'existe", + "resolution": "Le LXC possède d'anciennes données d'identification, mais aucun wrapper /usr/bin/update vérifié. Ajoutez une méthode personnalisée après avoir confirmé la bonne procédure." + }, + { + "problem": "Les images Docker sont temporairement vides après le démarrage ou la restauration", + "resolution": "Attendez que Docker soit prêt ou cliquez sur Vérifier maintenant. L'inventaire réessaie au démarrage et ne considère pas un résultat vide transitoire comme définitif." + }, + { + "problem": "Une cible de mise à jour groupée enregistrée n'est plus disponible", + "resolution": "Modifiez la configuration groupée, retirez la cible obsolète et choisissez son remplacement actuel s'il existe." + }, + { + "problem": "Une commande personnalisée échoue", + "resolution": "Exécutez-la dans le terminal LXC et vérifiez chemin, dépendances, options non interactives et code de sortie." + }, + { + "problem": "Une mise à jour programmée indique qu'un redémarrage est nécessaire", + "resolution": "Ouvrez Afficher le journal pour consulter l'exécution terminée, puis redémarrez ce LXC. ProxMenux efface l'avertissement lorsque l'événement de cycle de vie détecte son redémarrage." + } + ] + }, + "figures": { + "osPending": { + "alt": "Section des paquets système d'exploitation avec comptes de mise à jour en attente et de sécurité", + "caption": "La section système d'exploitation maintient les mises à jour du paquet indépendamment des actions d'application et Docker." + }, + "options": { + "alt": "Options de mise à jour LXC avec sauvegarde avant mise à jour et redémarrage après", + "caption": "Les préférences de sauvegarde et de redémarrage s'appliquent aux exécutions manuelles, en vrac et programmées." + } + } +} diff --git a/web/messages/fr/docs/monitor/dashboard/vms-lxcs.json b/web/messages/fr/docs/monitor/dashboard/vms-lxcs.json new file mode 100644 index 00000000..b3cd7448 --- /dev/null +++ b/web/messages/fr/docs/monitor/dashboard/vms-lxcs.json @@ -0,0 +1,244 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Tableau de bord : VM et LXC | Documentation ProxMenux", + "description": "Inventaire des invités avec CPU, mémoire et disque en direct. Les détails montrent configuration, ressources, sauvegardes, résultats récents du journal Proxmox, notes et Démarrer / Éteindre / Redémarrer / Forcer l'arrêt." + }, + "header": { + "title": "Tableau de bord : VM et LXC", + "description": "Inventaire complet du nœud : quatre mesures en haut, une liste triable des VM et LXC et les détails par invité avec configuration, ressources, sauvegardes, journaux et commandes Démarrer / Éteindre / Redémarrer / Forcer l'arrêt.", + "section": "ProxMenux Monitor · Tableau de bord" + }, + "intro": { + "title": "Commandes des systèmes invités", + "body": "Cet onglet contrôle le cycle de vie des invités. Les actions passent par POST /api/vms/<vmid>/control avec confirmation explicite et actualisent la ligne de l'invité. L'arrêt forcé nécessite le bouton dédié Forcer l'arrêt." + }, + "topRow": { + "heading": "Ligne supérieure : quatre cartes statistiques", + "intro": "Quatre cartes résument l'état des invités : nombres, utilisation CPU, mémoire allouée par rapport à la capacité de l'hôte et espace disque alloué.", + "imageAlt": "Onglet VMs & LXCs — rangée supérieure de quatre cartes statistiques: Total VMs & LXCs, Total CPU, Mémoire totale, Disque total", + "imageCaption": "Ligne supérieure : totaux et états En cours / Arrêtés, utilisation CPU, mémoire utilisée / allouée aux invités actifs / allouée au total avec indicateur Dans les limites, et espace disque alloué.", + "headerCard": "Carte", + "headerWhat": "Ce qu'il montre", + "totalLabel": "Nombre total de VM et LXC", + "totalWhat": "Nombre total avec deux badges — X Running (vert) et Y stoppé (rouge, seulement lorsque > 0). Le numéro que vous regardez quand quelque chose n'est pas revenu après un redémarrage.", + "cpuLabel": "CPU total", + "cpuWhat": "Utilisation CPU totale en direct des invités, en pourcentage du CPU physique de l'hôte, avec la mention « Utilisation CPU allouée ».", + "memoryLabel": "Mémoire totale", + "memoryIntro": "Trois lectures empilées verticalement:", + "memoryItems": [ + "Utilisée actuellement — valeur principale, par exemple 15.4 GB, et X.X % de Y GB par rapport à la RAM de l'hôte. La barre bleue montre le pourcentage.", + "Allouée aux actifs + Allouée totale — somme de maxmem des invités en cours et de tous les invités, arrêtés compris. La première compte maintenant, la seconde si vous les démarrez tous.", + "Dans les limites, en vert, devient Surallocation si le total alloué dépasse la RAM de l'hôte. Une surallocation maîtrisée peut fonctionner avec KSM ; l'indicateur avertit lorsque la marge diminue." + ], + "diskLabel": "Disque total", + "diskWhat": "Somme de l'espace disque alloué à tous les invités, dans l'unité appropriée (GB / TB), avec la ligne de pied de page \"Espace disque alloué\"." + }, + "inventory": { + "heading": "Liste des machines virtuelles et conteneurs", + "intro": "Une rangée par invité. La liste est une source unique de /api/vms, qui consolide qm list + pct list + pvesh /cluster/resources sur l'hôte.", + "imageAlt": "Liste des machines et conteneurs virtuels — une ligne par invité avec statut, type badge, nom, ID et inline CPU / mémoire / pourcentages de disque", + "imageCaption": "La disposition mobile optimisée de l'inventaire — les mêmes données que celles que montre la vue de bureau, replacées dans une seule colonne avec les pourcentages et les indicateurs d'état restent compacts.", + "rowsIntro": "Chaque ligne montre :", + "rows": [ + "Icône d'état — triangle vert pour En cours ou carré rouge pour Arrêté. Le reste de la ligne est atténué pour les invités arrêtés.", + "Type — LXC en cyan pour les conteneurs, VM en violet pour les machines virtuelles.", + "Nom — nom d'hôte ou nom affiché de l'invité.", + "VMID — l'ID numérique Proxmox sous le nom.", + "Mesures en ligne — trois pourcentages avec leur icône (CPU %, Mémoire %, Disque %). Chaque icône devient orange lorsque la métrique traverse un seuil d'attention (par exemple, mémoire au-dessus de 90 %), de sorte qu'un scan rapide vous indique quel invité est sous pression sans l'ouvrir." + ], + "clickHint": "Cliquez sur une ligne, que l'invité fonctionne ou soit arrêté, pour ouvrir ses détails.", + "mobileTitle": "Liste conçue pour les mobiles", + "mobileBody": "Sur mobile et dans les fenêtres étroites, type, nom, ID et trois pourcentages sont empilés en une colonne, comme sur la capture. Les vues larges répartissent les données horizontalement. Toute la ligne est cliquable pour ouvrir les détails." + }, + "drillIn": { + "heading": "Fenêtre de détails de l'invité", + "intro": "La fenêtre de détail affiche le nom de l’invité, son VMID, son type, son état et sa durée de fonctionnement. Sa navigation s’adapte à l’invité : État, Application et Mises à jour pour la gestion des applications LXC, Montages lorsqu’un LXC possède des points de montage, Journaux pour les conteneurs installés par OCI manager Apps, ainsi que Sauvegardes et Pare-feu. La barre d’actions fixe conserve les commandes de démarrage et d’arrêt et le terminal LXC dans chaque onglet.", + "statusTitle": "Onglet 1 — État", + "statusImageAlt": "Détails de l'invité — État avec CPU, mémoire et disque en direct, E/S disque et réseau, logo système et Ressources / Adresses IP", + "statusImageCaption": "État : CPU, mémoire et disque avec barres en haut ; totaux d'E/S (disque lu/écrit, réseau reçu/envoyé) ; puis Ressources avec Notes, + Info et liste des adresses IP.", + "statusIntro": "Onglet initial pour vérifier le comportement de l'invité. Trois blocs :", + "liveTitle": "1. Ligne de mesures en direct", + "liveItems": [ + "Utilisation CPU (X cœurs) — pourcentage avec barre. Le nombre de cœurs configurés dans l'en-tête précise ce que représente 100 %.", + "Mémoire — utilisée / maximale en Go avec barre.", + "Disque — utilisé / maximal pour l'image disque principale, au même format." + ], + "ioTitle": "2. Total des E/S + logo OS", + "ioItems": [ + "E/S disque — totaux des lectures (↓) et écritures (↑) depuis le démarrage. Permet de repérer une hausse soudaine des E/S par rapport au comportement habituel.", + "E/S réseau — réception (↓) et envoi (↑) cumulés, selon le même principe.", + "Logo du système — icône Debian / Ubuntu / Alpine / Windows / etc. selon le système détecté. Repère visuel pour identifier les fenêtres ouvertes." + ], + "resourcesTitle": "3. Bloc ressources", + "resourcesIntro": "Configuration selon Proxmox : cœurs CPU, mémoire (maxmem configuré) et swap. Deux sections dépliables dans l'en-tête :", + "resourcesItems": [ + "Notes — description modifiable de l'invité. Enregistrer appelle PUT /api/vms/<vmid>/config et écrit dans /etc/pve/qemu-server/<vmid>.conf ou /etc/pve/lxc/<vmid>.conf.", + "+ Info — champs supplémentaires trop verbeux pour la vue par défaut: mode bios, type de machine, état de l'agent, entrées passthrough hostpci, points de montage (CT), ordre de démarrage." + ], + "ipsTitle": "4. Adresses IP", + "ipsBody": "Chaque adresse IPv4 ou IPv6 de l'invité apparaît dans une étiquette verte. La liste est vide si l'invité est arrêté ou si une VM n'a pas l'agent QEMU ; les LXC communiquent directement leurs adresses.", + "appTitle": "Onglet 2 — App (LXC seulement)", + "appIntro": "Enregistre les applications LXC, les liens web et compare facultativement les versions. Les suggestions viennent du cache de démarrage ; Rechercher des applications relance la détection de ce LXC après une nouvelle installation.", + "appLinkLead": "Voir le", + "appLinkLabel": "page d'application dédiée", + "appLinkTail": "pour la découverte en cache, l'enregistrement assisté par catalogue, les liens web Docker et les détecteurs de versions.", + "updatesTitle": "Onglet 3 — Mises à jour (LXC seulement)", + "updatesIntro": "Sépare paquets système, applications, Docker Engine et images Docker. Chaque cible peut être exécutée seule ou choisie précisément pour une action groupée ou programmée.", + "updatesLinkLead": "Voir le", + "updatesLinkLabel": "page dédiée aux mises à jour", + "updatesLinkTail": "pour les programmes de mise à jour intégrés et personnalisés, la recréation Docker, la sélection groupée, les options de sécurité et la programmation.", + "mountsTitle": "Onglet 4 — Montages (LXC, si présents)", + "mountsImageAlt": "Détails LXC, Montages : volumes PVE, bind mounts de l'hôte ou du stockage PVE et NFS/CIFS montés dans le CT. Chaque carte indique type, capacité, octets utilisés/totaux, options et état : vert sain, ambre lecture seule/divergent, rouge inaccessible.", + "mountsImageCaption": "Montages apparaît seulement pour les LXC avec au moins un point de montage ou montage distant ajouté dans le CT. Sans montage, l'onglet est absent.", + "mountsIntro": "Proxmox montre les montages configurés en mpX, mais pas ceux ajoutés ensuite dans le CT via mount.cifs, NFS avec autofs, etc. Cet onglet réunit les deux vues : montages configurés et détectés dans le conteneur, avec état par montage et capacité quand le serveur peut la déterminer.", + "mountTypesTitle": "Types de montage détectés", + "mountTypesItems": [ + "Volume PVE — stockage géré par Proxmox, comme un sous-volume ZFS, un répertoire ou un Ceph RBD. La capacité vient des statistiques PVE et correspond à Proxmox.", + "Bind du stockage PVE — entrée mpX pointant vers un chemin d'un stockage connu de PVE.", + "Bind de l'hôte — entrée mpX vers un chemin de l'hôte (/mnt/something). La capacité vient de df sur ce chemin.", + "Montage ajouté dans le CT — existe uniquement dans son espace de noms, par exemple un partage NFS monté par le CT. La capacité est lue via pct exec <vmid> df ; depuis l'hôte, /proc/<pid>/root ne fournit pas les vraies statistiques du montage distant." + ], + "mountStateTitle": "Point par carte et avertissements", + "mountStateItems": [ + " Vert — montage sain et accessible.", + " Ambre — configuré mais non monté, lecture seule ou bind zombie. Dans ce dernier cas, la source a disparu de l'hôte mais le CT la voit toujours montée, par exemple après débranchement USB ou umount sur l'hôte.", + " Rouge — inaccessible : la sonde ne peut pas atteindre le montage, par exemple un partage NFS dont le serveur est arrêté." + ], + "mountsCalloutTitle": "Informations supplémentaires par rapport à Proxmox", + "mountsCalloutBody": "Vue des chemins lus ou écrits par le conteneur et de leur capacité. Les partages NFS/CIFS montés dans le CT, invisibles dans Proxmox, utilisent ici la même présentation et les mêmes sondes. Les montages inaccessibles et binds zombies sont signalés avant de causer des problèmes de sauvegarde.", + "logsTitle": "Onglet 5 — Journaux (conteneurs OCI uniquement)", + "logsBody": "Uniquement pour les conteneurs OCI manager Apps. Console du processus principal de l'image dans /var/log/proxmenux/oci/VMID.console.log : 100, 500 ou 1000 dernières lignes, suivi en direct pendant le fonctionnement, filtre et téléchargement. Le fichier est relu à l'ouverture, même si le conteneur est arrêté. Détails : Conteneurs OCI dans ProxMenux Monitor.", + "backupsTitle": "Onglet 6 — Sauvegardes", + "backupsImageAlt": "Per-invité fore-in modal — onglet Sauvegardes avec la liste de sauvegardes disponibles, balise de destination, tailles et le bouton Créer sauvegarde", + "backupsImageCaption": "Toutes les sauvegardes de l'invité sur les stockages Proxmox configurés, de la plus récente à la plus ancienne. L'en-tête indique leur nombre.", + "backupsIntro": "Liste les sauvegardes de l'invité sur les stockages Proxmox, de la plus récente à la plus ancienne. Le compteur du titre permet de voir si des copies existent. Chaque ligne affiche :", + "backupsItems": [ + "Horodatage — date et heure de l'exécution.", + "Destination — stockage (PBS-Cloud, PBS-Local, NFS-Backup, …), coloré selon son état.", + "Taille — taille finale sur disque de la sauvegarde." + ], + "backupsOutro": "+ Créer une sauvegarde lance une sauvegarde sur le stockage marqué « Backup target » dans Proxmox. La restauration se fait dans l'interface web Proxmox ; Monitor montre les sauvegardes récentes de l'invité et permet d'en créer.", + "firewallTitle": "Onglet 7 — Pare-feu", + "firewallIntro": "Lit le journal du pare-feu Proxmox de l'invité directement sur l'hôte, sans service ni requêtes périodiques supplémentaires. L'onglet est toujours présent ; son contenu dépend de l'activation du pare-feu et de la journalisation effective d'une règle.", + "firewallItems": [ + "Firewall désactivé — un avertissement orange indique où l’activer dans Proxmox (<Container|VM> → Firewall → Options) et rappelle qu’au moins une règle doit utiliser log: info ou un niveau supérieur pour afficher les paquets.", + "Pare-feu actif, aucun événement — rappel de la journalisation requise dans la vue vide, utile juste après activation.", + "Événements présents — panneau défilant à chasse fixe avec entrées brutes par action : ACCEPT vert, REJECT orange, DROP rouge. Le compteur de l'en-tête indique les lignes chargées." + ], + "firewallRefresh": "Actualiser charge les dernières lignes à la demande. Sans actualisation automatique, la liste reste un instantané de l'ouverture ou du dernier clic. Source : /var/log/pve-firewall.log, filtré par VMID via GET /api/vms/<vmid>/firewall/log.", + "firewallCalloutTitle": "Pourquoi l'avoir ici quand l'UI Proxmox le montre déjà ?", + "firewallCalloutBody": "Évite de passer dans Proxmox et conserve la vue du même VMID : démarrer l'invité, vérifier montages et événements du pare-feu, puis l'arrêter depuis le panneau. Les règles sont modifiées dans Proxmox ; Monitor ne les change pas.", + "actionBarTitle": "Barre d'action inférieure", + "actionBarIntro": "Toujours visible au pied du modal quel que soit l'onglet actif:", + "consoleItem": "Console, pour les LXC actifs, ouvre pct enter <vmid> dans le conteneur. Elle utilise xterm.js et WebSocket comme l'onglet Terminal, avec la barre mobile : ESC, TAB, flèches, Entrée et Ctrl+C / Ctrl+X / Ctrl+R. Elle fonctionne sur téléphone ou tablette. Pour les VM, utilisez la console Proxmox noVNC.", + "lifecycleIntro": "Quatre boutons en grille 2×2 envoient POST /api/vms/<vmid>/control avec l'action correspondante. Leur disponibilité dépend de l'état de l'invité.", + "headerButton": "Bouton", + "headerEnabled": "Activé lorsque", + "headerAction": "Action envoyée à l'hôte", + "lifecycleRows": [ + { + "button": "Démarrer", + "color": "green", + "enabled": "L'invité est arrêté.", + "action": "qm start / pct start" + }, + { + "button": "Éteindre", + "color": "blue", + "enabled": "L'invité est en cours d'exécution.", + "action": "qm shutdown / pct shutdown — arrêt propre, ACPI" + }, + { + "button": "Redémarrer", + "color": "blue", + "enabled": "L'invité est en cours d'exécution.", + "action": "qm reboot / pct reboot — redémarrage propre" + }, + { + "button": "Forcer l'arrêt", + "color": "red", + "enabled": "L'invité est en cours d'exécution.", + "action": "qm stop / pct stop — arrêt forcé" + } + ], + "forceStopTitle": "Forcer l'arrêt coupe immédiatement l'exécution", + "forceStopBody": "Forcer l'arrêt ignore la séquence d'arrêt, comme couper le courant. Utilisez Éteindre tant que l'invité répond. Forcez seulement si l'arrêt est bloqué et si vous acceptez le risque de perte de données. Le bouton rouge et son libellé limitent les clics accidentels." + }, + "dataCollected": { + "heading": "Comment les données sont collectées", + "headerSection": "Section de l'onglet", + "headerEndpoint": "Point de terminaison", + "headerSource": "Source", + "rows": [ + { + "section": "Liste des inventaires", + "endpoint": "/api/vms", + "source": "pvesh get /cluster/resources --type vm pour VM et CT." + }, + { + "section": "Panneau de détails (config, réseau, disques)", + "endpoint": "/api/vms/", + "source": "qm config <id> pour VMs / pct config <id> pour CTs." + }, + { + "section": "Tableau des paramètres par invité", + "endpoint": "/api/vms//metrics", + "source": "Les données PVE RRD (pvesh get /nodes/<node>/qemu/<id>/rrddata) sont condensées à une forme facile à tracer." + }, + { + "section": "Résultats récents du journal Proxmox", + "endpoint": "/api/vms//logs", + "source": "pvesh get /nodes/<node>/<qemu|lxc>/<vmid>/log --start 0 --limit 1000. Un échec renvoie une liste vide ; ces données ne constituent pas les journaux système complets de l'invité." + }, + { + "section": "Sauvegardes disponibles pour les invités", + "endpoint": "/api/vms//backups", + "source": "pvesm list <storage> filtré par VMID." + }, + { + "section": "Journal du pare-feu par invité (onglet Pare-feu)", + "endpoint": "/api/vms//firewall/log", + "source": "/var/log/pve-firewall.log filtré par VMID." + }, + { + "section": "Commandes d'alimentation (Démarrer / Arrêt forcé / Redémarrer / Éteindre)", + "endpoint": "/api/vms//control", + "source": "Équivalents qm start|stop|reboot|shutdown ou pct." + } + ], + "codeComment1": "# Comparer les données du tableau de bord à PVE", + "codeComment2": "# Examiner la configuration de l'invité telle que la fenêtre la voit", + "codeComment3": "# VM", + "codeComment4": "# CT" + }, + "whereNext": { + "heading": "Où aller ensuite", + "items": [ + { + "label": "Moniteur de santé", + "href": "/docs/monitor/health-monitor", + "tailRich": " — catégorie VM et conteneurs : échecs de démarrage, délais QMP dépassés et échecs d'arrêt CT." + }, + { + "label": "Notifications", + "href": "/docs/monitor/notifications", + "tailRich": "— ce que déclenchent les événements vm_*, ct_*, migration_* et backup_* en aval." + }, + { + "label": "Référence de l’API", + "href": "/docs/monitor/api", + "tailRich": " — points de terminaison des VM et des sauvegardes." + }, + { + "label": "Index du tableau de bord", + "href": "/docs/monitor/dashboard", + "tailRich": "— les autres onglets." + }, + { + "label": "ProxMenux → Créer VM", + "href": "/docs/create-vm", + "tailRich": " — création de systèmes : modèles NAS (Synology et autres), VM Linux/Windows et valeurs adaptées à Proxmox." + } + ] + } +} diff --git a/web/messages/fr/docs/monitor/health-monitor.json b/web/messages/fr/docs/monitor/health-monitor.json new file mode 100644 index 00000000..6ad87f31 --- /dev/null +++ b/web/messages/fr/docs/monitor/health-monitor.json @@ -0,0 +1,372 @@ +{ + "meta": { + "title": "Surveillance de Proxmox — CPU, mémoire, stockage, SMART, ZFS, journaux | ProxMenux", + "description": "Surveillance proactive de Proxmox VE : dix catégories toutes les cinq minutes (CPU et température, mémoire et swap, stockage, disques/SMART, réseau, VM, services, journaux, mises à jour et sécurité), quatre niveaux de gravité, périodes de mise en sourdine par catégorie, nettoyage des erreurs résolues, historique permanent des disques et notifications Telegram, Discord, Gotify ou e-mail.", + "ogTitle": "Surveillance de Proxmox — CPU, mémoire, stockage, SMART, ZFS, journaux", + "ogDescription": "Surveillance proactive de Proxmox VE dans dix catégories, avec niveaux de gravité, périodes de mise en sourdine et notifications par événement.", + "twitterTitle": "Surveillance de Proxmox | ProxMenux", + "twitterDescription": "Surveillance proactive de Proxmox VE dans dix catégories, avec niveaux de gravité et notifications." + }, + "header": { + "title": "Moniteur de santé", + "description": "Ce contrôle continu examine dix catégories de l’hôte par cycles de cinq minutes, recueille les mesures entre les cycles, déduplique les constats en événements structurés et alimente le tableau de bord, les notifications et la reformulation IA facultative depuis une source commune.", + "section": "Moniteur ProxMenux" + }, + "intro": { + "title": "Un scanner, trois consommateurs", + "body": "Un thread en arrière-plan exécute le cycle complet toutes les cinq minutes et enregistre chaque constat dans SQLite sous un error_key stable. Cela permet (1) au tableau de bord d’afficher l’état actuel, (2) au système de notifications de diffuser les nouveaux événements et (3) à l’assistant IA facultatif de reformuler les alertes clairement. Une seule configuration alimente tous ces composants." + }, + "howItWorks": { + "heading": "Comment ça marche", + "intro": "La surveillance utilise deux threads parallèles. Un collecteur de mesures léger remplit les historiques du CPU, de la mémoire et des températures. Le cycle de contrôle complet lit ces données, évalue les conditions prolongées et exécute les autres vérifications environ toutes les cinq minutes, puis enregistre les constats dans SQLite pour le tableau de bord et les notifications.", + "scannerTitle": "De l'échantillon à la découverte stockée", + "scannerCaption": "Le collecteur remplit les historiques entre les cycles : CPU toutes les 5 s, mémoire toutes les 30 s et température toutes les 15 s. Il n’évalue pas les alertes lui-même. Le cycle complet analyse les historiques et vérifie SMART, ZFS, les journaux et les services avant d’enregistrer les constats dans SQLite.", + "scannerArrowLabel": "étape", + "scannerNodes": { + "samplerLabel": "Collecteur de mesures", + "samplerDetail": "Utilisation CPU 5 s\nMémoire 30 s\nTempérature 15 s\n→ historiques", + "cycleLabel": "Cycle complet de santé", + "cycleDetail": "Toutes les 5 min\nLit les historiques\n+ contrôles directs\n(SMART, ZFS,\nservices, journaux…)", + "checksLabel": "Contrôles par catégorie", + "checksDetail": "Dix catégories\n(CPU, mémoire,\nstockage, disques,\nréseau, VM,\nles services, les registres,\nmises à jour, sécurité)", + "sqliteLabel": "SQLite", + "sqliteDetail": "table errors\n(actives +\nmasquées)\n+ disk_observations\n(historique permanent\npar disque)" + }, + "notifTitle": "Du constat enregistré à l’utilisateur", + "notifCaption": "Circuit des notifications. La même table des erreurs alimente aussi le tableau de bord (listes des alertes actives et masquées) et le nettoyage de fin de cycle qui résout automatiquement les anciennes entrées. Ces deux fonctions utilisent directement les données, sans passer par le répartiteur.", + "notifArrowLabel": "événement", + "notifNodes": { + "errorsLabel": "tableau des erreurs", + "errorsDetail": "Lignes actives +\nmasquées\nidentifiées par\nerror_key", + "dispatcherLabel": "Expéditeur de notification", + "dispatcherDetail": "Nouveaux événements\nou gravité accrue\nSelon les réglages\n+ délai minimal", + "templatesLabel": "Modèles + réécriture de l'IA", + "templatesDetail": "Modèle\npar événement\n→ reformulation IA\nfacultative en\nlangage clair", + "channelsLabel": "Canaux", + "channelsDetail": "Telegram\nDiscord\nGotify\nE-mail (SMTP)" + } + }, + "categories": { + "heading": "Les dix catégories", + "imageAlt": "Vision Health Monitor montrant les dix catégories avec leurs statuts actuels (CPU, Mémoire, Stockage, Disques, Réseau, VMs, Services, Logs, Mises à jour, Sécurité)", + "imageCaption": "Le point de vue de Health Monitor — les dix catégories avec leur statut actuel. Les catégories d'un hôte sain sont toutes OK; les avertissements et les événements critiques apparaissent en ligne avec les lignes qui les ont produits.", + "intro": "Chaque cycle exécute dix contrôles indépendants. Chacun renvoie l’un des quatre états (OK, INFO, WARNING, CRITICAL) et des données structurées : noms de périphériques, extraits de journaux et seuils exacts. Ces données apparaissent dans le tableau de bord et les notifications.", + "headerCategory": "Catégorie", + "headerChecks": "Sous-contrôles", + "headerEvents": "Événements typiques", + "rows": [ + { + "category": "CPU et température", + "checks": "Utilisation CPU avec hystérésis, température du capteur", + "events": "Utilisation CPU élevée et prolongée ; avertissements de température fondés sur les mesures des capteurs." + }, + { + "category": "Mémoire et swap", + "checks": "Utilisation RAM, utilisation swap", + "events": "Pression mémoire prolongée ; activité de l’OOM-killer ; espace swap épuisé." + }, + { + "category": "Stockage", + "checks": "Stockages Proxmox, système de fichiers racine", + "events": "Seuils d’occupation dépassés sur la racine ou un autre système de fichiers surveillé (85% avertissement / 95% critique par défaut) ; export NFS indisponible ; échec d’authentification CIFS ; pool LVM-thin plein." + }, + { + "category": "Disques & SMART", + "checks": "SMART, erreurs dmesg E/S, pools ZFS, LVM, erreurs du système de fichiers", + "events": "Échec du contrôle SMART ; secteurs réalloués ou en attente ; erreurs d’E/S ATA ; pool ZFS DEGRADED / FAULTED ; remontage ext4 en lecture seule." + }, + { + "category": "Réseau", + "checks": "Connectivité, état de liaison, latence de passerelle", + "events": "Bridge ou agrégat réseau hors service ; passerelle injoignable ; pics de latence persistants." + }, + { + "category": "Machines virtuelles et conteneurs", + "checks": "Communication QMP, démarrage VM, démarrage conteneur", + "events": "Échec du démarrage d’une VM ou de l’arrêt d’un CT ; délai du socket QMP dépassé ; configuration ou disque manquants après un clonage." + }, + { + "category": "Services PVE", + "checks": "pveproxy, pvedaemon, pvestatd, pve-cluster, mode grappe", + "events": "Le service s'est écrasé; le quorum du groupe a été perdu; pmxcfs bloqué." + }, + { + "category": "Journaux système", + "checks": "Erreurs persistantes, pics d'erreur, cascades d'erreurs, messages critiques du noyau", + "events": "Erreurs identiques répétées; éclatement soudain d'avertissements (modèle de cascade); BUG: / OOPS: / oom-killer en dmesg." + }, + { + "category": "Mises à jour du système", + "checks": "Mises à jour en attente, mises à jour de sécurité, version noyau / PVE, âge du système", + "events": "Mises à jour de sécurité ou du noyau utilisé en attente ; système non mis à jour depuis longtemps. Le bouton Mettre à jour maintenant apparaît dans l’aperçu lorsque des mises à jour sont disponibles. Il lance la procédure complète ProxMenux ; sa fermeture actualise l’état avec ?refresh=1 sans attendre le cycle suivant." + }, + { + "category": "Sécurité et certificats", + "checks": "Tentatives de connexion, certificats proches de l’expiration, état des jails Fail2Ban si installé", + "events": "Répété SSH / défaillances d'auth web; certificat PVE < 30 jours à compter de la date d'expiration; interdictions actives de Fail2Ban." + } + ] + }, + "severity": { + "heading": "Modèle de gravité", + "headerStatus": "État", + "headerColour": "Couleur", + "headerMeaning": "Signification", + "headerNotification": "Notification", + "rows": [ + { + "status": "OK", + "colour": "Vert", + "meaning": "En bonne santé. Aucune constatation dans cette catégorie.", + "notification": "Silencieux." + }, + { + "status": "INFO", + "colour": "Bleu", + "meaning": "État transitoire ou déjà résolu à signaler une fois. Sert aussi aux catégories qui ne contiennent que des alertes masquées.", + "notification": "Facultatif. Chaque type d’événement peut être activé ou désactivé par canal." + }, + { + "status": "WARNING", + "colour": "Jaune", + "meaning": "L'attention est nécessaire mais l'hôte est toujours fonctionnel. La cause est non-triviale — lire les détails.", + "notification": "Envoyée si ce type d’événement est activé pour le canal." + }, + { + "status": "CRITICAL", + "colour": "Rouge", + "meaning": "Fonctionnalité cassée ou perte de données possible. Mesures à prendre.", + "notification": "Envoyée si le type d’événement est activé pour le canal. Une alerte de température CPU CRITICAL se déclenche à nouveau même après avoir été masquée." + } + ], + "infoNote": "Une catégorie OK contenant encore des alertes masquées pendant leur période de mise en sourdine s’affiche en INFO. Cela rappelle que des alertes sont masquées.", + "unknownTitle": "UNKNOWN lorsqu’un contrôle ne peut pas aboutir", + "unknownBody": "Un contrôle indisponible renvoie UNKNOWN ; après trois cycles consécutifs, un constat persistant est enregistré. Le tableau de bord l’affiche en jaune. L’état global limite UNKNOWN à WARNING : ce seul problème ne rend pas l’hôte critique." + }, + "dashboardView": { + "heading": "La vue du tableau de bord", + "intro": "La surveillance se trouve dans l’onglet Aperçu. L’indicateur d’état de l’en-tête (Sain / Avertissement / Critique) ouvre une fenêtre avec deux listes :", + "items": [ + "Actives — catégories avec un constat non résolu. Chaque ligne se déplie pour afficher les contrôles concernés, le texte brut reason, l’identifiant du périphérique ou de la VM et, si disponible, un lien vers Stockage, Réseau, VM, Journaux ou Matériel.", + "Masquées — alertes acquittées par l’utilisateur dont la période de mise en sourdine n’est pas terminée. Chaque ligne affiche le temps restant et la durée choisie. À l’expiration, elle quitte cette liste ; si la cause persiste et que la catégorie le permet, elle revient parmi les alertes Actives." + ], + "pillTitle": "L’indicateur reflète la catégorie la plus grave", + "pillBody": "La couleur de l’en-tête reflète la gravité maximale : CRITICAL → rouge, sinon WARNING → jaune, sinon INFO → bleu, sinon vert. Le point de la favicon et le badge PWA suivent la même logique.", + "updateNowTitle": "Bouton Mettre à jour maintenant dans l’en-tête de l’aperçu", + "updateNowBody1": "Si Mises à jour système signale des mises à jour en attente, Mettre à jour maintenant apparaît près de l’indicateur. La fenêtre lance la procédure de ProxMenux → Settings post-install Proxmox → Proxmox System Update : nettoyage des dépôts, apt full-upgrade via update-pve-safe.sh, reconstruction DKMS des pilotes gérés lors d’un nouveau noyau, autoremove/autoclean et proposition de redémarrage si nécessaire. La progression s’affiche en direct.", + "updateNowBody2": "À la fin, fermer la fenêtre appelle GET /api/health/details?refresh=1 et invalide le cache du point d’accès. Les mises à jour en attente et la gravité sont recalculées depuis le nouvel état des paquets ; le badge disparaît sans attendre le prochain cycle. Le bouton est masqué si l’hôte est déjà à jour." + }, + "dismiss": { + "heading": "Masquer les alertes et choisir la durée de mise en sourdine", + "intro": "Certains événements persistent, comme Mises à jour système : mises à jour disponibles tant que l’hôte n’est pas mis à jour. Une notification toutes les cinq minutes serait inutile. Le bouton Mettre à jour maintenant de l’aperçu permet de résoudre ce cas directement. Pour les autres cas ou les mises à jour reportées, deux mécanismes liés permettent de masquer les alertes :", + "step1": "Masquer un événement dans la fenêtre. Le menu propose 24 heures, 7 jours ou Définitivement, indépendamment de la catégorie. Le choix envoie POST /api/health/acknowledge avec error_key et suppression_hours (-1 pour une durée permanente). L’événement passe dans la liste masquée avec l’horodatage acknowledged_at.", + "dropdownImageAlt": "Menu pour masquer une alerte : 24 heures, 7 jours ou définitivement", + "dropdownImageCaption": "La durée choisie ne concerne que cette alerte ; sans choix individuel, la valeur de la catégorie s’applique. Les alertes masquées définitivement portent un badge ambre Permanent et ne se déclenchent normalement plus. La température CPU critique constitue l’exception décrite plus bas.", + "step2": "Durée de mise en sourdine par catégorie. Dans Paramètres → Surveillance, ou via POST /api/health/settings, chacune des dix catégories possède une durée par défaut utilisée en l’absence de choix individuel :", + "imageAlt": "Durées de mise en sourdine par catégorie dans Paramètres → Surveillance", + "imageCaption": "Un menu par catégorie. Choisissez une durée longue pour les événements répétitifs, comme les mises à jour en attente, et courte pour ceux à réévaluer rapidement. Les mises en sourdine actives figurent dessous.", + "outro": "Pendant la mise en sourdine, le contrôle continue et met à jour last_seen, sans nouvelle notification. À l’expiration, le cycle suivant réévalue la cause : l’alerte peut se déclencher de nouveau ou disparaître si le problème est résolu.", + "activeSuppressionsTitle": "Consulter et annuler les mises en sourdine actives", + "activeSuppressionsBody": "Les alertes masquées, temporaires ou permanentes, figurent dans Paramètres → Surveillance → Mises en sourdine actives. Chaque ligne montre identifiant, catégorie, gravité, date et temps restant. Réactiver retire l’acquittement pour le prochain contrôle. Les acquittements permanents s’annulent ici ; les temporaires peuvent aussi être interrompus. Activez Modifier, sélectionnez les lignes à réactiver (bordure verte et texte barré), puis enregistrez. Annuler vide la sélection.", + "autoTitle": "Mise en sourdine automatique après changement de durée", + "autoBody": "Choisir une durée autre que les 24 h par défaut a un second effet : les futurs constats de la catégorie sont enregistrés comme déjà acquittés. Une semaine choisie pour les disques vaut donc aussi pour les nouveaux constats, sans les masquer un par un. Ils arrivent directement dans la liste masquée avec cette durée. Les catégories laissées à 24 h gardent le fonctionnement habituel : les nouveaux constats restent actifs jusqu’à votre intervention.", + "tempTitle": "Exception pour la température CPU CRITICAL", + "tempBody": "La couche de persistance prévoit une exception pour Température CPU CRITICAL : un tel enregistrement ignore l’acquittement antérieur et la mise en sourdine automatique. Cela ne signifie pas que tout contrôle de température émet un constat critique dès qu’un seuil configuré est dépassé.", + "nonDismissableTitle": "Quels constats peut-on masquer ?", + "nonDismissableBody": "La fenêtre propose Masquer uniquement si le contrôle renvoie explicitement dismissable = true. Une valeur fausse ou absente cache le bouton. La gravité seule ne détermine pas ce droit : plusieurs contrôles critiques autorisent l’acquittement. Les exemples décrivent les données actuelles ; masquer une alerte ne répare pas sa cause.", + "headerFinding": "Constatation", + "headerWhy": "Comportement de la mise en sourdine", + "rows": [ + { + "finding": "Température CPU : avertissement / critique", + "why": "L’avertissement issu des mesures de température autorise explicitement la mise en sourdine. Une règle distincte ignore l’acquittement si un enregistrement de température CPU arrive avec la gravité CRITICAL." + }, + { + "finding": "Espace critique du système de fichiers racine", + "why": "Les contrôles d’espace autorisent explicitement l’acquittement, même à un niveau critique. Cela ne libère pas d’espace et ne supprime pas le risque d’échec des écritures." + }, + { + "finding": "ZFS pool DEGRADED / FAULTED", + "why": "Les contrôles de capacité des pools ZFS autorisent l’acquittement. Les autres constats suivent leur propre indicateur. Acquitter ne répare pas un pool dégradé ou défaillant." + }, + { + "finding": "Erreurs d'entrée/sortie du disque avec SMART FAILED", + "why": "Les constats de disque enregistrés depuis le journal peuvent autoriser l’acquittement. SMART FAILED exige toujours une investigation ; le bouton dépend de l’indicateur du contrôle, pas du seul texte de l’alerte." + }, + { + "finding": "Interface réseau DOWN", + "why": "Les contrôles persistants d’interface DOWN autorisent l’acquittement. Cela ne rétablit ni bridge, ni agrégat, ni liaison physique, ni accès distant." + }, + { + "finding": "E/S sur disques sains (INFO)", + "why": "Les événements ATA ou dmesg transitoires avec un SMART sain peuvent être informatifs et se résoudre seuls. Les lignes informatives n’offrent pas forcément Masquer ; le contrôle détermine quand l’état est résolu." + } + ], + "principle": "Utilisez le bouton proposé pour le constat réel, sans déduire sa disponibilité de la catégorie ou de la gravité. L’acquittement contrôle l’affichage et les notifications. Les contrôles de retour à la normale et l’historique du disque restent distincts." + }, + "autoresolve": { + "heading": "Auto-résolution et nettoyage", + "intro": "De nombreuses alertes disparaissent lorsque leur cause cesse : une VM redémarre correctement, un disque a été retiré ou la température redevient normale. Le nettoyage à la fin de chaque cycle de cinq minutes applique ces règles :", + "headerTrigger": "Déclencheur", + "headerAction": "Action", + "rows": [ + { + "trigger": "Utilisation CPU ou température revenue à la normale.", + "action": "Marqué résolu. Ça sort de la liste Active." + }, + { + "trigger": "Pression de mémoire en dessous du seuil d'avertissement après une alerte OOM / mémoire.", + "action": "Marqué résolu." + }, + { + "trigger": "VM / CT référencé par l'erreur n'existe plus (qm status / pct status non-zéro).", + "action": "Marqué résolu comme ressource supprimée." + }, + { + "trigger": "Le disque référencé par l'erreur n'est plus présent dans /dev/.", + "action": "Marqué résolu comme dispositif enlevé. L'historique d'observation permanente est conservé (voir section suivante)." + }, + { + "trigger": "Constats issus du journal système (catégorie logs, entrées SMART, erreurs ATA ou E/S) lorsque leur période de mise en sourdine expire.", + "action": "Ils sont retirés. Chaque analyse examine les nouvelles entrées du journal à partir de ce point ; une ancienne ligne n’est pas réémise." + }, + { + "trigger": "Erreurs résolues depuis plus de sept jours.", + "action": "Supprimées de la base pour limiter la taille de la table. L’historique des notifications est indépendant et conservé plus longtemps." + } + ], + "permanentTitle": "Masquer définitivement ne signifie pas résoudre", + "permanentBody": "Une durée de catégorie de -1 (permanente) masque les futures alertes des éléments acquittés, sans ignorer le contrôle de résolution automatique. Si la cause disparaît, par exemple après suppression de la ressource ou retour sous le seuil, l’élément est toujours nettoyé automatiquement." + }, + "observations": { + "heading": "Observations des disques — l’historique permanent", + "intro": "Les événements de disque méritent d’être conservés. Un avertissement SMART sur /dev/sdh à 02 h 14 reste utile après la fin de la rafale d’E/S et la résolution automatique : le disque a désormais des antécédents. La surveillance conserve donc une table permanente distincte : disk_observations.", + "headerProperty": "Propriété", + "headerErrors": "Table errors (Actives)", + "headerObs": "Table disk_observations", + "rows": [ + { + "property": "Objet", + "errors": "Alimente la vue de santé actuelle et l’envoi des notifications.", + "obs": "Une piste d'audit permanente par disque." + }, + { + "property": "Résoudre automatiquement", + "errors": "Oui : les lignes sont retirées lorsque la cause disparaît.", + "obs": "Non — les entrées persistent à jamais à moins que l'utilisateur les rejette explicitement." + }, + { + "property": "Clé de déduplication", + "errors": "error_key (p. ex. smart_sdh).", + "obs": "(disk_registry_id, error_type, error_signature) avec signatures stables dépouillées de données volatiles." + }, + { + "property": "Emplacement d’affichage", + "errors": "Fenêtre de surveillance (listes Actives / Masquées).", + "obs": "Fiche du disque dans l’onglet Stockage, avec un badge « X obs. » par disque." + }, + { + "property": "Ce qu'il enregistre", + "errors": "Ce qui est en train d'échouer.", + "obs": "Avertissements SMART (secteurs, température, CRC, autotests échoués), erreurs d’E/S (ATA / NVMe / dm), erreurs du système de fichiers et événements de pools ZFS." + } + ], + "outro": "Une alerte peut disparaître du tableau de bord tout en restant dans l’historique du disque. Ouvrez le disque dans Stockage : sa fiche affiche le nombre d’observations en attente, leurs horodatages, leur gravité et le message brut original. Ces informations aident à décider d’un remplacement.", + "renameTitle": "Les changements de nom des périphériques sont fusionnés automatiquement", + "renameBody": "Les disques peuvent d’abord apparaître sous un nom provisoire comme ata8 ou nvme0n1p3. Les observations sont regroupées par numéro de série connu : si un événement est d’abord lié à ata8 puis le même disque identifié comme sdh, ses anciennes observations sont rattachées à sdh au cycle suivant, sans fragmenter l’historique." + }, + "notification": { + "heading": "Du constat à la notification", + "intro": "Chaque erreur active peut aussi déclencher une notification. Voici le parcours :", + "items": [ + "Le scanner enregistre le résultat avec la catégorie + gravité + détails structurés.", + "Si le type d’événement est activé dans les notifications globales et que le canal n’a pas masqué cette catégorie, un événement est mis en file.", + "Le moteur de modèles produit un titre et un corps à partir des données structurées. Si la reformulation IA est activée, cette paire est transmise au fournisseur configuré pour une version en langage clair.", + "Le canal l’envoie sous forme de message Telegram, d’encart Discord, de notification push Gotify ou d’e-mail. Le résultat est enregistré dans notification_history.", + "Masquer une alerte démarre sa période de mise en sourdine. Les nouvelles détections du même error_key ne produisent normalement aucune notification et ne sont pas automatiquement mises en attente pour la fin de cette période. La température CPU critique reste une exception." + ], + "outro": "La configuration des canaux — jeton du bot Telegram, URL des webhooks, clés IA, réglages par événement et par canal — est décrite dans Notifications et Assistant IA." + }, + "rest": { + "heading": "Points d’accès REST", + "intro": "Les actions de la fenêtre sont accessibles par API pour scripts, tableaux de bord ou bots. Si l’authentification du Monitor est activée, un jeton Bearer valide issu de la connexion ou de l’écran des jetons API est requis. Les modifications, comme acquitter, enregistrer ou nettoyer les erreurs orphelines, exigent full_admin ; read_only reçoit 403. Si l’authentification est désactivée ou refusée, ces contrôles autorisent l’accès sans jeton.", + "headerEndpoint": "Point d’accès", + "headerMethod": "Méthode", + "headerUse": "Utilisation", + "rows": [ + { + "endpoint": "/api/health", + "method": "GET", + "use": "Contrôle léger renvoyant du JSON avec status, timestamp et version. Convient aux contrôles de mots-clés Uptime Kuma ; si l’authentification du Monitor est activée, le client doit envoyer un en-tête Bearer." + }, + { + "endpoint": "/api/health/status", + "method": "GET", + "use": "État global : un niveau de gravité et un texte de synthèse. Authentification requise." + }, + { + "endpoint": "/api/health/details", + "method": "GET", + "use": "Les dix catégories avec leur état et les données structurées à l’origine de chacune." + }, + { + "endpoint": "/api/health/full", + "method": "GET", + "use": "État complet : catégories, erreurs actives, alertes masquées et réglages de mise en sourdine. Une seule requête alimente la fenêtre ; un cache d’arrière-plan de six minutes accélère la réponse." + }, + { + "endpoint": "/api/health/active-errors", + "method": "GET", + "use": "Juste la liste active. Filtré par ?category=<name>." + }, + { + "endpoint": "/api/health/dismissed", + "method": "GET", + "use": "Uniquement les alertes masquées, avec les heures restantes." + }, + { + "endpoint": "/api/health/acknowledge", + "method": "POST", + "use": "Corps: '{'\"error_key\":\"smart_sdh\"'}'. Rejeter une alerte avec la fenêtre configurée de la catégorie." + }, + { + "endpoint": "/api/health/settings", + "method": "GET / POST", + "use": "Lire ou enregistrer la durée de mise en sourdine par catégorie." + }, + { + "endpoint": "/api/health/cleanup-orphans", + "method": "POST", + "use": "Nettoyage manuel des erreurs liées à un périphérique ou une VM supprimé. Idempotent." + } + ], + "codeComment1": "# Obtenir l’état actuel pour un script", + "codeComment2": "# Rejeter une erreur spécifique", + "codeComment3": "# Définissez la suppression de la catégorie des disques à une semaine" + }, + "whereNext": { + "heading": "Où aller ensuite", + "items": [ + { + "label": "Tableau de bord", + "href": "/docs/monitor/dashboard", + "tail": " — point d’ouverture de la fenêtre de surveillance dans l’interface." + }, + { + "label": "Notifications", + "href": "/docs/monitor/notifications", + "tail": " — canaux, réglages par événement, reformulation IA et historique." + }, + { + "label": "Assistant IA", + "href": "/docs/monitor/ai-assistant", + "tail": " — fournisseur (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter), mode des instructions, niveau de détail par canal et langue." + }, + { + "label": "Architecture", + "href": "/docs/monitor/architecture", + "tailRich": " — schéma SQLite (errors, disk_observations, events) et cadence des threads d’arrière-plan." + } + ] + } +} diff --git a/web/messages/fr/docs/monitor/index.json b/web/messages/fr/docs/monitor/index.json new file mode 100644 index 00000000..511bb3e6 --- /dev/null +++ b/web/messages/fr/docs/monitor/index.json @@ -0,0 +1,151 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Tableau de bord web auto-hébergé pour Proxmox VE | ProxMenux", + "description": "ProxMenux Monitor est un tableau de bord web auto-hébergé pour Proxmox VE : mesures de l'hôte en temps réel, stockage et données SMART, réseau, VM et conteneurs, matériel, journaux, terminal web intégré, surveillance proactive de santé, notifications Telegram / Discord / e-mail, assistant IA facultatif, API REST et intégrations avec Homepage et Home Assistant.", + "ogTitle": "ProxMenux Monitor — Tableau de bord web auto-hébergé pour Proxmox VE", + "ogDescription": "Tableau de bord en temps réel Proxmox VE: métrique de l'hôte, stockage SMART, réseau, VM et conteneurs, matériel, journaux, terminal web, moniteur de santé, notifications, assistant AI, REST API.", + "twitterTitle": "ProxMenux Monitor | ProxMenux", + "twitterDescription": "Tableau de bord Proxmox VE auto-hébergé avec surveillance de santé, notifications, assistant IA et API REST." + }, + "header": { + "title": "ProxMenux Monitor", + "description": "Un tableau de bord web auto-hébergé pour Proxmox VE, distribué sous forme d'AppImage. Il s'exécute sur l'hôte comme un service systemd unique, écoute sur le port TCP 8008 et fournit l'API et l'interface utilisateur depuis un seul processus.", + "section": "ProxMenux Monitor" + }, + "atGlance": { + "title": "En un coup d'oeil", + "body": "Une seule AppImage sur l'hôte Proxmox → un serveur Flask (port 8008) collecte les données en temps réel avec psutil, pvesh, smartctl et journalctl → le tableau de bord Next.js est fourni par le même processus. Authentification facultative (mot de passe + 2FA), assistant IA facultatif, notifications facultatives et API REST pour les intégrations." + }, + "hero": { + "alt": "Tableau de bord ProxMenux Monitor — aperçu système avec widgets CPU, mémoire, température et durée de fonctionnement", + "caption": "Écran d'atterrissage par défaut — mesures au niveau de l'hôte et état de santé en un coup d'oeil." + }, + "coverage": { + "heading": "Ce que couvre le tableau de bord", + "intro": "Huit sections principales, chacune alimentée par ses propres points d'accès API :", + "tableSection": "Chapitre", + "tableWhat": "Ce qu'il montre", + "sections": [ + { + "name": "Moniteur de santé", + "description": "Alertes actives et masquées concernant le CPU, la mémoire, le stockage, les disques, le réseau, les services, les journaux, les VM, les mises à jour et la sécurité. Alimente le moteur de notification." + }, + { + "name": "Stockage", + "description": "Pools de stockage Proxmox, disques physiques (SATA / NVMe / USB), attributs SMART, état des pools ZFS, usure et durée de vie, activité d'entrée/sortie." + }, + { + "name": "Réseau", + "description": "Toutes les interfaces (physiques, liaisons, ponts, OVS), IP/MAC/état, graphiques RX/TX en temps réel, données RRD historiques par interface." + }, + { + "name": "Machines virtuelles et conteneurs", + "description": "Inventaire VM/LXC avec état, ressources et durée de fonctionnement. Le détail affiche configuration, mesures historiques, téléchargement de journaux Proxmox et actions démarrer/arrêter/redémarrer/éteindre. Les journaux dépendent du point d’accès Proxmox ; ce n’est pas une archive complète du système invité." + }, + { + "name": "Matériel", + "description": "Modèle et topologie du CPU, répartition de la mémoire, périphériques PCIe, liste des GPU avec leur pilote et surveillance en temps réel par emplacement (NVIDIA / Intel iGPU)." + }, + { + "name": "Journaux et événements", + "description": "Live journalctl avec des filtres de gravité / intervalle de temps / mots clés, historique des tâches Proxmox, journal de notification, paquets de journaux téléchargeables." + }, + { + "name": "Terminal", + "description": "Shell de l’hôte et consoles VM/CT compatibles dans le navigateur via xterm.js et WebSockets. Le mode d’authentification configuré s’applique : désactivé ou refusé, il permet aux clients ayant accès au réseau d’ouvrir une session sans connexion. Cela n’implique pas un audit de chaque commande." + }, + { + "name": "Sécurité", + "description": "Échecs d’authentification, état des jails Fail2Ban, blocages récents et intégration avec la jail [proxmenux] de l’hôte." + } + ], + "footer": "Chaque section a une page de documentation dédiée sous Tableau de bord dans la barre latérale." + }, + "howItRuns": { + "heading": "Comment ça marche", + "intro": "ProxMenux Monitor est distribué sous forme d’AppImage autonome. Une seule unité systemd (proxmenux-monitor.service) lance un processus Flask qui :", + "bullets": [ + "Écoute sur TCP 8008 sur l’hôte (HTTP).", + "Fournit les fichiers statiques du tableau de bord Next.js sous / et l'API sous /api/*, depuis le même processus.", + "Tire des données en direct avec des outils d'hôte standard: psutil, pvesh, smartctl, journalctl, zpool, ip, nvidia-smi, etc.", + "Conserve son état dans une base SQLite locale (/usr/local/share/proxmenux/health_monitor.db) : alertes masquées, observations des disques, configuration des notifications et de l'IA. L'état de l'authentification est stocké séparément dans /root/.config/proxmenux-monitor/auth.json." + ], + "footer": "Le flux de requête complet, la mise en page du fichier et l'intégration systemd sont décrits dans Architecture." + }, + "noAgent": { + "title": "Aucun agent sur les invités", + "body": "Le Monitor lit toutes les données depuis l’hôte. Aucun agent n’est nécessaire dans les VM ou les CT : les données proviennent de l’API Proxmox et des informations que le noyau de l’hôte fournit sur les systèmes invités en cours d’exécution." + }, + "access": { + "heading": "Accès au tableau de bord", + "intro": "Deux modèles d'accès sont pris en charge et l'application détecte celui qui est utilisé:", + "codeComment1": "# 1) Accès direct sur l'hôte", + "codeComment2": "# 2) Par proxy inverse (Nginx / Caddy / Traefik)", + "afterCode": "Le proxy inverse doit définir X-Forwarded-For, X-Forwarded-Proto et X-Forwarded-Host correctement et transmettre les connexions WebSocket. Sur les ports standard, le navigateur utilise son origine courante. Le backend ne fait confiance aux IP transmises qu’avec PROXMENUX_TRUST_PROXY=1 explicite ; limitez alors l’accès direct au backend.", + "footer": "La configuration du premier lancement, le mot de passe + TOTP 2FA et les extraits de proxy inverse sont couverts par Accès & Authentification." + }, + "mobile": { + "heading": "Utilisation mobile et installation d'écran d'accueil", + "intro": "Le tableau de bord s'adapte à la taille de l'écran et est proposé comme une application web progressive. Le fichier public/manifest.json fourni indique display: standalone ainsi qu'un nom d'application, une icône et une couleur de thème. Ajouter l'URL à l'écran d'accueil crée donc un lanceur autonome, sans barre d'adresse du navigateur, avec un écran de démarrage personnalisé et un thème sombre assorti au tableau de bord.", + "phoneAlt": "ProxMenux Monitor fonctionnant sur un téléphone — vue du tableau de bord principal", + "phoneCaption": "Tableau de bord principal sur un téléphone : la disposition se réorganise pour les petits écrans.", + "addHeading": "Ajouter à l'écran d'accueil", + "iosLabel": "iOS Safari:", + "iosBody": "bouton de partage → Ajouter à l'écran d'accueil. L'icône provient de /apple-touch-icon.png expédié dans le AppImage.", + "androidLabel": "Android Chrome / Edge:", + "androidBody": "menu à trois points → Installer l'application (ou Ajouter à l'écran d'accueil sur les anciennes versions).", + "afterInstall": "Une fois installé, l'ouverture de l'icône lance le tableau de bord en mode autonome avec sa propre entrée de commutateur de tâches.", + "onlineOnlyTitle": "Connexion requise", + "onlineOnlyBody": "La PWA peut être installée, mais elle ne fonctionne pas hors ligne : elle ne possède pas de service worker. Le raccourci se comporte comme une application native, mais l’appareil doit toujours pouvoir joindre l’hôte sur TCP 8008, par le réseau local, un VPN ou HTTPS via un proxy inverse, pour charger le tableau de bord." + }, + "health": { + "heading": "Surveillance de la santé et notifications", + "alt": "Écran de moniteur de santé montrant les catégories 10 suivies (CPU, mémoire, stockage, disques, réseau, services, journaux, VM, mises à jour, sécurité) avec état actuel", + "caption": "Vision du moniteur de la santé — les catégories 10 suivies, avec leur statut actuel. Des alertes actives et rejetées apparaissent ici lorsque le système en soulève.", + "body1": "Dans le tableau de bord, le moniteur de santé fonctionne en continu en arrière-plan et produit un flux structuré d'événements : température élevée du CPU, avertissements SMART des disques, dégradation des pools ZFS, processus arrêtés par manque de mémoire, défaillances VM/CT, incidents de sécurité, etc. Chaque événement possède une catégorie, un niveau de gravité (INFO / WARNING / CRITICAL) et une error_key stable pour regrouper les doublons sans saturer l'écran.", + "feedsIntro": "Les événements alimentent trois choses en même temps :", + "feedsHealth": "La vue du moniteur de santé dans le tableau de bord (listes des alertes actives et masquées).", + "feedsChannels": "Le moteur de notifications — Telegram, Discord, e-mail, Gotify, Pushover et Apprise (multicanal). Chaque canal se configure séparément et les catégories d’événements peuvent être mises en sourdine.", + "feedsAI": "L’assistant IA facultatif explique les événements en langage clair via le fournisseur choisi (OpenAI, Anthropic, Gemini, Groq, Ollama ou OpenRouter) et propose la suite si cette option est activée dans les réglages IA.", + "suppressionTitle": "Masquer une alerte plutôt que tout mettre en sourdine", + "suppressionBody": "Chaque catégorie possède sa propre durée de suppression des notifications : après avoir masqué une alerte, vous ne recevez plus de notification pour cette même alerte pendant cette période (24 heures par défaut, réglable par catégorie jusqu'à une suppression permanente). Une aggravation réelle, par exemple le franchissement du seuil critique de température du CPU, déclenche toujours une nouvelle alerte, indépendamment de cette suppression." + }, + "api": { + "heading": "REST API et intégrations", + "intro": "Les points d’accès REST exposent les mesures en JSON par HTTP/HTTPS pour Homepage, Home Assistant, Uptime Kuma et les scripts. Grafana peut utiliser l’exporteur texte Prometheus séparé sur /api/prometheus. Les requêtes peuvent être faites avec curl.", + "tokens": "Les jetons API à longue durée de vie (365 jours) sont générés à partir de Paramètres → API Tokens ou via POST /api/auth/generate-api-token.", + "bearer": "Envoyez les jetons via Authorization: Bearer …. Le point public /api/health convient aux sondes de disponibilité sans identifiants. Sous /api/auth/*, certaines routes de configuration/connexion/état sont publiques, mais celles de gestion du compte et des jetons sont protégées.", + "catalog": "Le catalogue complet des points d'accès, les conseils de rotation des jetons et les bonnes pratiques de sécurité se trouvent dans la référence API. Des exemples pour Homepage, Home Assistant, Grafana et Uptime Kuma, ainsi qu'un modèle générique cURL, sont proposés dans les intégrations." + }, + "serviceControl": { + "heading": "Contrôle des services", + "intro": "Au jour le jour, le moniteur est géré exactement comme tout autre service systemd. Il est également exposé comme deux entrées à l'intérieur du ProxMenux TUI sous Paramètres:", + "codeComment": "# Contrôle manuel", + "footer": "Voir Paramètres → ProxMenux Monitor pour activer/désactiver le service dans le menu et vérifier son état." + }, + "nextSteps": { + "heading": "Où aller ensuite", + "items": [ + { + "label": "Architecture", + "description": "— serveur Flask, unité systemd, schéma SQLite, fournisseurs d'IA et canaux de notification." + }, + { + "label": "Accès et authentification", + "description": "— premier lancement, mot de passe, TOTP 2FA, configuration du proxy inverse et intégration Fail2Ban." + }, + { + "label": "Tableau de bord", + "description": "— toutes les sections de l'interface utilisateur, avec une page pour chacune." + }, + { + "label": "Référence de l’API", + "description": "— chaque point d'accès, structure des requêtes et réponses, gestion des jetons." + }, + { + "label": "Intégrations", + "description": "— Homepage, Home Assistant, Grafana / Prometheus, Uptime Kuma et modèle générique cURL." + } + ] + } +} diff --git a/web/messages/fr/docs/monitor/integrations.json b/web/messages/fr/docs/monitor/integrations.json new file mode 100644 index 00000000..88c6973d --- /dev/null +++ b/web/messages/fr/docs/monitor/integrations.json @@ -0,0 +1,255 @@ +{ + "meta": { + "title": "Intégrations Proxmox — Homepage, Home Assistant, Grafana, Prometheus | ProxMenux Monitor", + "description": "Exemples à copier pour relier ProxMenux Monitor à Homepage, Home Assistant, Grafana via Prometheus et Uptime Kuma, avec configuration attendue, points d’accès API et en-tête d’authentification.", + "ogTitle": "Intégrations Proxmox — Homepage, Home Assistant, Grafana, Prometheus", + "ogDescription": "Guide pour relier ProxMenux Monitor à Homepage, Home Assistant, Grafana, Prometheus et Uptime Kuma.", + "twitterTitle": "Intégrations Proxmox | ProxMenux Monitor", + "twitterDescription": "Recettes pour Homepage, Home Assistant, Grafana, Prometheus et Uptime Kuma." + }, + "header": { + "title": "Intégrations", + "description": "Exemples à copier pour les outils de votre homelab : Homepage, Home Assistant, Grafana via Prometheus et Uptime Kuma. Chaque exemple montre la configuration attendue, le point d’accès du Monitor utilisé et l’en-tête d’authentification nécessaire.", + "section": "Moniteur ProxMenux" + }, + "intro": { + "title": "Ce que vous pouvez construire à partir de cette page", + "body": "Copiez chaque exemple dans l’outil choisi. Les points d’accès figurent dans la Référence de l’API ; cette page explique leur utilisation dans Homepage, Home Assistant et Grafana. Les captures montrent le résultat des configurations." + }, + "auth": { + "heading": "Authentification: la seule chose dont chaque recette ait besoin", + "intro": "La plupart de ces points d’accès exigent une authentification. Deux méthodes sont proposées.", + "optAtitle": "Option A — Jeton API (recommandé pour les intégrations)", + "optAbody1": "Ouvrez Paramètres → Sécurité → Jetons API. Choisissez Générer un jeton, nommez-le par exemple homepage, home-assistant ou prometheus, puis copiez-le : il n’est affiché qu’une fois. Sa durée par défaut est d’un an et il peut être révoqué individuellement. Utilisez-le pour les clients autres que le navigateur.", + "optAbody2": "À partir de ce moment, chaque demande est juste:", + "optBtitle": "Option B — flux de connexion (nom d'utilisateur + mot de passe)", + "optBbody": "Utile pour les scripts qui authentifient en tant qu'utilisateur humain. Le jeton retourné est de courte durée; la plupart des intégrations devraient préférer l'option A.", + "outro": "Le champ TOTP n’est requis que si la double authentification est activée. Le renouvellement et la révocation des jetons, les règles de mot de passe et le journal d’audit figurent dans Accès et authentification.", + "httpsTitle": "Utiliser HTTPS au lieu de HTTP", + "httpsIntro": "Chaque recette ci-dessous utilise http:// dans les URLs pour garder les exemples courts. Si vous avez activé TLS sur le moniteur (Paramètres → Sécurité → SSL/HTTPS), échangez http:// contre https:// dans chaque URL — c'est le seul changement. Deux notes spécifiques à certains outils:", + "httpsItems": [ + "Certificats autosignés. L’intégration Home Assistant rest: vérifie TLS par défaut. Pour le certificat autosigné du Monitor, ajoutez verify_ssl: false à chaque bloc REST près de scan_interval:, ou ajoutez son AC au magasin de certificats approuvés. Même principe pour les autres outils qui vérifient les certificats.", + "Prometheus dispose déjà de scheme: https dans l’exemple ci-dessous. Activez ou conservez https si TLS est activé sur le Monitor." + ] + }, + "homepage": { + "heading": "Homepage", + "headingHref": "https://gethomepage.dev", + "intro": "Homepage est un tableau de bord d’applications personnalisable. ProxMenux Monitor s’y connecte avec le widget intégré customapi : ajoutez un service à services.yaml, redémarrez Homepage et la carte affiche les valeurs en direct.", + "iconCalloutTitle": "Le logo officiel ProxMenux est sur dashboardicons.com", + "iconCalloutBody": "Les exemples utilisent icon: proxmenux.png. Homepage recherche les noms simples dans dashboardicons.com, une bibliothèque d’icônes pour tableaux de bord auto-hébergés. L’entrée ProxMenux est à dashboardicons.com/icons/external/proxmenux et se charge au premier affichage. Même principe pour des milliers d’outils comme Telegram, Discord, Grafana ou Tailscale : indiquez icon: <name>.png dans le service.", + "imageAlt": "Tableau de bord Homepage avec trois cartes ProxMenux Monitor (EDGE, VOID, DREAM) montrant durée de fonctionnement, CPU, RAM et température de chaque hôte", + "imageCaption": "Trois instances ProxMenux Monitor sous forme de cartes Homepage : durée de fonctionnement, CPU, RAM et température CPU lues sur /api/system de chaque hôte toutes les 10 s.", + "basicTitle": "Widget de base — pas d'authentification", + "basicIntro": "Utilisez ceci lorsque ProxMenux Monitor est sur un réseau de confiance et que vous n'avez pas encore activé l'authentification du côté Monitor. L'entrée la plus simple possible services.yaml:", + "authedTitle": "Widget authentifié", + "authedIntro": "Générez un jeton API dans Paramètres → Sécurité → API Jetons sur le moniteur, copiez-le et collez-le dans l'en-tête Authorization ci-dessous — remplacez le jeton d'exemple affiché après Bearer par celui que vous venez de copier:", + "authedOutro": "Redémarrez Homepage pour afficher les valeurs actualisées. Réutilisez le même jeton pour les widgets qui interrogent la même instance du Monitor.", + "multiTitle": "Configuration multi-widget — système, stockage, réseau", + "multiIntro": "Pour plus de détails, créez trois cartes utilisant des points d’accès distincts : système, stockage et réseau. Elles utilisent le même jeton pour cette instance du Monitor.", + "multiCalloutTitle": "Plusieurs hôtes Proxmox", + "multiCalloutBody": "Répétez le bloc pour chaque hôte afin d’obtenir les cartes illustrées. Chaque entrée utilise http://<host>:8008 de son instance. Générez et stockez un jeton par hôte : chaque installation possède sa clé de signature, donc un jeton ne fonctionne pas automatiquement ailleurs." + }, + "homeAssistant": { + "heading": "Home Assistant", + "headingHref": "https://www.home-assistant.io", + "intro": "Ces exemples utilisent l’intégration native rest de Home Assistant, sans composant HACS spécifique. Elle lit les points d’accès de la Référence de l’API et crée des capteurs et attributs pour les automatisations. La configuration fournit environ 25 capteurs pour les ressources, la santé, les VM/CT, le stockage, le réseau et les mises à jour. Ajoutez-la à configuration.yaml et rechargez ou redémarrez HA.", + "imageAlt": "Tableau de bord Home Assistant avec état de santé, jauges CPU/RAM/température, nombre de VM, occupation du stockage et compteur d’erreurs actives", + "imageCaption": "ProxMenux Monitor en tant qu'intégration de première classe Home Assistant — capteurs construits à partir de la recette YAML ci-dessous.", + "step1Title": "1 · Enregistrer le jeton API", + "step1Body": "Placez le jeton dans secrets.yaml pour le séparer de la configuration principale. Regroupez le préfixe Bearer et le jeton dans une valeur utilisable comme en-tête. Le fichier n’est pas chiffré et doit rester privé. Son emplacement dépend de l’installation, généralement /config/secrets.yaml sous HA OS ou Container.", + "step2Title": "2 · Ajouter la configuration REST", + "step2Body": "Six blocs REST couvrent les principales fonctions. Leur scan_interval suit la fréquence des changements : ressources toutes les 30 s, santé toutes les 60 s, inventaires toutes les 5 à 10 min. Collez dans configuration.yaml :", + "step3Title": "3 · Ajouter des capteurs binaires et des modèles auxiliaires", + "step3Body": "Deux capteurs binaires et deux capteurs de modèle complètent l’intégration. Ils simplifient les automatisations et les cartes conditionnelles Lovelace sans répéter des expressions Jinja partout.", + "step4Title": "4 · Recharger et vérifier", + "step4Body": "Vérifiez d’abord la syntaxe dans Outils de développement → YAML → Vérifier la configuration. Rechargez ensuite Toute la configuration YAML ou redémarrez HA. Filtrez Paramètres → Appareils et services → Entités par proxmenux. Les quelque 25 entités devraient recevoir leurs valeurs pendant un intervalle de collecte.", + "replaceTitle": "Remplacer une version antérieure de cette recette?", + "replaceBody": "Après une ancienne version, le registre peut conserver des identifiants obsolètes et les cartes signaler Entité introuvable. Retirez les anciens blocs rest: et template: de configuration.yaml, puis rechargez. Dans Paramètres → Appareils et services → Entités, filtrez par proxmenux et supprimez les anciennes entrées restaurées ou indisponibles. Ajoutez le YAML actuel et rechargez pour enregistrer les nouvelles.", + "step5Title": "5 · Tableau de bord Lovelace", + "step5Body": "Le YAML crée une carte vertical-stack regroupant logo, indicateurs, système, VM, stockage, réseau et carte conditionnelle des problèmes. Ouvrez le tableau de bord, sélectionnez le crayon, Ajouter une carte, puis Manuel en bas et collez :", + "viewTipTitle": "Vous voulez une vue complète du tableau de bord au lieu d'une seule carte ?", + "viewTipBody": "Ouvrez le menu à trois points → Éditeur de configuration brute et ajoutez une vue avec cet en-tête au-dessus de la liste cards: :", + "viewTipOutro": "Cela vous donne un onglet / vue dédié dans votre tableau de bord avec sa propre icône et son propre titre, au lieu d'une carte longue sur une vue existante.", + "altViewTitle": "Alternative — une vue de tableau de bord dédiée", + "altViewIntro": "Pour créer un onglet dans un tableau de bord existant, ajoutez une vue avec le YAML ci-dessous. Une vue est un onglet du tableau de bord et ne crée pas d’entrée dans la barre latérale. Étapes :", + "altViewSteps": [ + "Ouvrez le tableau de bord où vous voulez le nouvel onglet.", + "Cliquez sur le crayon (modifier le tableau de bord) en haut à droite.", + "Cliquez sur l'onglet + à la fin des onglets existants pour créer une nouvelle vue.", + "Dans la fenêtre, passez en haut à droite à Éditeur de code pour basculer entre l’éditeur visuel et YAML.", + "Collez le YAML ci-dessous.", + "Enregistrez. La vue ProxMenux Monitor apparaît comme onglet dans le tableau de bord avec ses cartes." + ], + "twoEditorsTitle": "Deux éditeurs YAML dans HA — choisissez le bon", + "twoEditorsIntro": "Home Assistant a deux éditeurs YAML qui ressemblent mais qui s'attendent à des formats différents:", + "twoEditorsItems": [ + "Éditeur d’une vue — accessible par + ou Modifier la vue → Éditeur de code. Attend une seule vue avec title:, path: et cards: au premier niveau, sans tiret initial.", + "Éditeur brut du tableau de bord complet — accessible par le menu à trois points. Attend toute la liste views:, chaque vue étant un élément commençant par -." + ], + "twoEditorsOutro": "Un format inadapté peut produire une Vue sans nom et cards: []. Le YAML ci-dessous est destiné à l’éditeur d’une seule vue ; copiez-le tel quel.", + "viewImageAlt": "Vue Home Assistant dédiée à ProxMenux Monitor : en-tête picture-entity, indicateurs glance et cartes système, VM, stockage et réseau sur plusieurs colonnes", + "viewImageCaption": "La vue ProxMenux Monitor sur grand écran. La disposition Masonry répartit les cartes en colonnes ; le résultat dépend du type de vue configuré.", + "twoColTipTitle": "Vous voulez une mise en page fixe à deux colonnes au lieu de la mise en page automatique ?", + "twoColTipBody": "Regroupez deux cartes, par exemple Système + VM ou Stockage + Réseau, dans un horizontal-stack pour les afficher côte à côte quelle que soit la largeur :", + "twoColTipOutro": "Sur mobile, la ligne reste comprimée. La disposition automatique HA sans horizontal-stack s’adapte mieux aux écrans étroits.", + "step6Title": "6 · Automatisations", + "step6Body": "Trois automatismes couvrant les scénarios réactifs les plus courants – remplacer notify.mobile_app_<your_phone> par le service d'avis que vous utilisez :", + "logoTitle": "À propos du logo ProxMenux", + "logoBody": "La carte picture-entity charge le logo officiel depuis dashboardicons.com, une bibliothèque gratuite pour tableaux de bord auto-hébergés. L’entrée est à dashboardicons.com/icons/external/proxmenux. Home Assistant récupère le SVG en HTTPS au premier affichage et le met en cache.", + "logoBrokenTitle": "Si la carte logo affiche une image cassée", + "logoBrokenIntro": "Certaines installations, réseaux filtrés ou extensions de blocage empêchent l’accès à jsdelivr.net lors de l’affichage. Utilisez alors une copie locale :", + "logoBrokenSteps": [ + "Téléchargez le SVG depuis cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/proxmenux.svg.", + "Enregistrez-le sur /config/www/icons/proxmenux.svg sur votre hôte HA.", + "Dans le Lovelace YAML, remplacer l'URL image: par /local/icons/proxmenux.svg. Enregistrer et recharger — l'image rend à partir du fichier local, pas besoin d'Internet." + ], + "scanTipTitle": "Règle pratique pour scan_interval", + "scanTipBody": "Commencez par interroger /api/system toutes les 30 s. /api/health/full lit généralement un résultat valable jusqu’à six minutes ; l’interroger toutes les 60 s ne contourne pas ce cache. Essayez cinq minutes pour /api/storage/summary et une heure pour /api/proxmenux/update-status. Adaptez à votre matériel et au nombre d’hôtes." + }, + "grafana": { + "heading": "Prometheus + Grafana", + "promHref": "https://prometheus.io", + "grafanaHref": "https://grafana.com", + "intro": "ProxMenux Monitor expose GET /api/prometheus au format texte Prometheus 0.0.4. Un jeton Bearer est requis si l’authentification est activée. Configurez Prometheus pour collecter les métriques, puis Grafana pour visualiser la base de séries temporelles.", + "imageAlt": "Tableau de bord Grafana avec métriques ProxMenux : jauge CPU, historique mémoire, nombre de VM actives et débit réseau", + "imageCaption": "Un tableau de bord Grafana à partir des métriques ProxMenux collectées par Prometheus : CPU, mémoire, VM actives et débit réseau. Le catalogue complet est dans Référence de l’API → Métriques Prometheus.", + "step1Title": "1 · Ajouter la tâche de collecte à Prometheus", + "step1Body": "Transmettez le jeton API par le bloc natif authorization de Prometheus, qui permet aussi de charger les identifiants depuis un fichier.", + "step1After": "Rechargez Prometheus avec kill -HUP <PID> (remplacez PID par son identifiant de processus), systemctl reload prometheus si le service le permet, ou docker compose restart prometheus en conteneur. Dans Status → Targets, proxmenux devrait passer à UP en un intervalle. Le label node=\"<hostname>\" distingue les hôtes.", + "tokenTipTitle": "Conserver le jeton dans un fichier séparé", + "tokenTipBody": "En production, séparez le jeton de la configuration. Avec credentials_file: /etc/prometheus/secrets/proxmenux.token, Prometheus le lit dans un fichier doté des permissions 0600.", + "step2Title": "2 · Vérifier la collecte avec quelques requêtes", + "step2Body": "Avant Grafana, vérifiez que Prometheus possède les données. Ouvrez http://<prometheus-host>:9090, choisissez Query et lancez l’une de ces requêtes. Des valeurs récentes de l’hôte Proxmox doivent apparaître :", + "headerQuery": "Requête", + "headerConfirms": "Ce qu'il confirme", + "verifyRows": [ + { + "query": "up{job=\"proxmenux\"}", + "confirms": "Renvoie 1 si Prometheus collecte correctement le Monitor, sinon 0. Le contrôle initial le plus rapide." + }, + { + "query": "proxmox_cpu_usage", + "confirms": "Utilisation actuelle de CPU % de l'hôte Proxmox. Doit changer si vous rafraîchissez la requête quelques secondes d'intervalle." + }, + { + "query": "proxmox_vms_running", + "confirms": "Nombre de machines invitées en cours d’exécution. Comparez avec l’interface Proxmox." + }, + { + "query": "proxmox_uptime_seconds / 86400", + "confirms": "Durée de fonctionnement de l’hôte en jours. Elle doit correspondre à uptime dans le terminal Proxmox." + } + ], + "calloutTitle": "Un 401 en ouvrant directement l’URL du point d’accès peut être normal", + "calloutBody": "Avec l’authentification activée, le lien dans Status → Targets ouvre /api/prometheus dans le navigateur sans l’en-tête Bearer de Prometheus. La réponse peut contenir '{'\"error\":\"Authentication required\"'}'. Vérifiez le véritable State: UP de la cible pour confirmer la collecte par Prometheus.", + "step3Title": "3 · Ajouter Prometheus comme source de données Grafana", + "step3Body": "Dans Grafana, ouvrez Connections → Data sources → Add new → Prometheus. Indiquez l’URL, par exemple http://prometheus.lan:9090, enregistrez et testez. Si Prometheus exige une authentification, configurez-la séparément ici. Le jeton du Monitor appartient à la tâche de collecte Prometheus.", + "step4Title": "4 · Construire des panneaux avec ces requêtes PromQL", + "step4Body": "Une sélection de départ pour les mesures habituellement suivies sur un hôte Proxmox :", + "headerPanel": "Idée de panneau", + "headerPromql": "Requête PromQL", + "panelRows": [ + { + "panel": "Jauge d’utilisation CPU par hôte", + "promql": "proxmox_cpu_usage" + }, + { + "panel": "Mesure d'utilisation de la mémoire par hôte", + "promql": "proxmox_memory_usage_percent" + }, + { + "panel": "Mémoire utilisée et totale (séries temporelles)", + "promql": "proxmox_memory_used_bytes / 1024 / 1024 / 1024" + }, + { + "panel": "VM/CT en cours d’exécution par hôte", + "promql": "proxmox_vms_running" + }, + { + "panel": "Température du processeur", + "promql": "proxmox_cpu_temperature_celsius" + }, + { + "panel": "Débit réseau RX (octets/s)", + "promql": "rate(proxmox_interface_bytes_received_total[5m])" + }, + { + "panel": "Débit réseau TX (octets/s)", + "promql": "rate(proxmox_interface_bytes_sent_total[5m])" + }, + { + "panel": "Moyenne de charge (1 m)", + "promql": "proxmox_load_average{period=\"1m\"}" + }, + { + "panel": "Espace disque utilisé % par point de montage", + "promql": "proxmox_disk_usage_percent" + }, + { + "panel": "Charge de batterie UPS", + "promql": "proxmox_ups_battery_charge_percent" + }, + { + "panel": "Température GPU par emplacement", + "promql": "proxmox_gpu_temperature_celsius" + } + ], + "outro": "Ajoutez chaque requête comme panneau Grafana, avec Stat pour les valeurs et Time series pour les tendances, puis groupez les panneaux par catégorie. Utilisez node comme variable du tableau de bord (Settings → Variables → New → Query → label_values(proxmox_cpu_usage, node)) pour filtrer par hôte." + }, + "uptimeKuma": { + "heading": "Uptime Kuma et autres vérificateurs de statut", + "href": "https://github.com/louislam/uptime-kuma", + "intro": "Pour un contrôle par mot-clé, utilisez GET /api/system-info. Cette route n’exige pas de jeton et renvoie nom d’hôte, durée de fonctionnement et santé : healthy, warning ou critical. Elle est publique, contrairement aux points d’accès détaillés protégés.", + "kumaTitle": "Uptime Kuma — moniteur de mots clés HTTP", + "kumaSteps": [ + "Dans Uptime Kuma, cliquez sur + Ajouter un nouveau moniteur.", + "Type de moniteur: HTTP(s) - Mot-clé.", + "Nom descriptif : ProxMenux Monitor — pve01.", + "URL: http://pve01.lan:8008/api/system-info.", + "Mot-clé : healthy (la valeur de health.status lorsque l'hôte est OK).", + "Intervalle de vérification : 60 secondes suffisent.", + "Enregistrez. La route system-info ne nécessite pas d’en-tête Bearer." + ], + "healthchecksTitle": "healthchecks.io / pings de tâches cron", + "healthchecksBody": "Une tâche cron peut interroger /api/system-info et tester .health.status == \"healthy\". Uniquement après réussite, elle envoie un ping de succès à son URL Healthchecks.io unique. Le service reçoit les pings des tâches ; il n’interroge pas le Monitor. Un HTTP 2xx seul ne prouve pas la bonne santé de l’hôte.", + "richTitle": "Besoin de données de santé plus riches", + "richBody": "Pour l’état complet — dix catégories, erreurs actives et alertes masquées — utilisez GET /api/health/full. Une réponse contient les données de la fenêtre du tableau de bord. Un jeton Bearer est requis si l’authentification est activée." + }, + "workflows": { + "heading": "n8n, Zapier et scripts personnalisés", + "intro": "Les workflows et scripts peuvent envoyer des notifications par POST vers /api/notifications/send, par exemple après un échec CI ou une tâche trop longue. Cet envoi direct contourne la file et le délai entre empreintes d’événements. Il conserve le format par canal, l’IA facultative et la livraison. Gérez les doublons dans l’appelant.", + "n8nBody": "Dans n8n, utilisez un nœud HTTP Request avec POST, l’URL ci-dessus et le même JSON que curl. Choisissez les identifiants génériques Header Auth : nom Authorization et valeur Bearer YOUR_API_TOKEN, en remplaçant le marqueur. Reliez un planning, webhook ou autre nœud pour déclencher la requête.", + "severityBody": "La gravité utilise INFO, WARNING ou CRITICAL en majuscules. L’objet data apporte du contexte. L’IA reçoit le titre et le message rendus avec les enrichissements pris en charge ; tous les champs ne sont pas garantis dans ses instructions ou sa sortie. Voir Notifications → Catalogue des événements." + }, + "pveWebhook": { + "heading": "Webhook natif Proxmox VE (entrant)", + "intro1": "Le système de notifications date de PVE 8.1 ; les cibles webhook natives exigent Proxmox VE 8.3 ou plus. Activer les notifications dans Paramètres tente d’enregistrer le Monitor comme cible. Les avis PVE qui y sont acheminés, comme les rapports de sauvegarde ou réplication, rejoignent son circuit d’envoi. La configuration doit être disponible et accessible en écriture.", + "intro2": "Le fonctionnement, le modèle envoyé par PVE, les entrées dans /etc/pve/notifications.cfg et le comportement en cluster figurent dans Notifications → Intégration du webhook PVE." + }, + "whereNext": { + "heading": "Où aller ensuite", + "items": [ + { + "label": "Référence de l’API", + "href": "/docs/monitor/api", + "tail": " — points d’accès avec méthode, chemin et catalogue complet des métriques Prometheus." + }, + { + "label": "Notifications", + "href": "/docs/monitor/notifications", + "tail": " — sources d’événements, canaux, circuit d’envoi et intégration du webhook PVE." + }, + { + "label": "Assistant IA", + "href": "/docs/monitor/ai-assistant", + "tail": " — reformulation facultative des modèles en langage clair avant l’envoi vers Telegram, Discord, e-mail ou Gotify." + }, + { + "label": "Accès et authentification", + "href": "/docs/monitor/access-auth", + "tail": " — création et révocation des jetons API de ces exemples, journal d’audit et configuration TLS." + } + ] + } +} diff --git a/web/messages/fr/docs/monitor/notifications.json b/web/messages/fr/docs/monitor/notifications.json new file mode 100644 index 00000000..6f27ef60 --- /dev/null +++ b/web/messages/fr/docs/monitor/notifications.json @@ -0,0 +1,535 @@ +{ + "meta": { + "title": "Notifications Proxmox — Telegram, Discord, courrier électronique, Gotify, Pushover, Apprise | ProxMenux Monitor", + "description": "Envoyez les notifications Proxmox VE vers Telegram, Discord, e-mail, Gotify, Pushover et environ 80 services via Apprise. Les événements du Health Monitor, des journaux et du webhook PVE deviennent des messages avec déduplication, délai de répétition, regroupement, IA facultative et historique.", + "ogTitle": "Notifications Proxmox — Telegram, Discord, courriel, Gotify, Pushover, Apprise", + "ogDescription": "Alertes Proxmox vers Telegram, Discord, e-mail, Gotify, Pushover et environ 80 services via Apprise, avec déduplication, délais de répétition, regroupement et IA facultative.", + "twitterTitle": "Notifications Proxmox | ProxMenux Monitor", + "twitterDescription": "Envoyer des alertes Proxmox VE à Telegram, Discord, Courriel, Gotify, Pushover et ~80 services supplémentaires via Apprise." + }, + "header": { + "title": "Notifications", + "description": "Distribue les événements du Monitor vers Telegram, Discord, e-mail, Gotify, Pushover et environ 80 services via Apprise. Déduplication, délais de répétition, regroupement, filtres par événement/canal, IA facultative et historique consultable.", + "section": "Moniteur ProxMenux" + }, + "intro": { + "title": "D'où viennent les messages", + "body": "Les notifications distribuent les événements des sources du Monitor : Health Monitor, surveillance du journal et des tâches, webhook PVE, interrogations périodiques et appels internes des scripts ProxMenux. Tous suivent le même traitement avant livraison au téléphone ou par e-mail." + }, + "howItWorks": { + "heading": "Comment ça marche", + "intro": "Les collecteurs produisent des événements structurés. Le traitement décide de leur envoi et de leur présentation, l’IA peut les réécrire, puis ils sont distribués aux canaux configurés.", + "arrowLabel": "événement", + "caption": "Vue générale. Les tentatives d’envoi réussies, regroupées ou échouées sont enregistrées dans SQLite. Les événements supprimés par le délai de répétition ne sont pas enregistrés.", + "nodes": { + "sourcesLabel": "Sources", + "sourcesDetail": "Health Monitor\nSurveillance du journal\nSurveillance des tâches\nWebhook PVE\nInterrogations périodiques\nSources internes", + "dispatchLabel": "Traitement de l’envoi", + "dispatchDetail": "Regroupement des rafales\nVérification empreinte / délai\nLimites par groupe\nContrôles par canal", + "aiLabel": "Réécriture par IA (facultatif)", + "aiDetail": "OpenAI / Anthropic\nGemini / Groq\nOpenRouter / Ollama\n(désactivé par défaut)", + "channelsLabel": "Canaux", + "channelsDetail": "Telegram\nDiscord\nCourriel (SMTP)\nGotify\nPushover\nApprise (~80 services)" + } + }, + "enabling": { + "heading": "Activer le panneau", + "intro": "Après installation, la carte affiche Désactivé et Activer les notifications. Avant ce clic, rien n’est envoyé et la configuration PVE n’est pas modifiée.", + "disabledAlt": "Carte initiale avec statut Désactivé et bouton Activer les notifications", + "disabledCaption": "Le premier état — un clic pour activer.", + "stepsIntro": "Le bouton effectue trois actions successives :", + "steps": [ + "Passe à l’état Actif et affiche le formulaire des canaux.", + "Enregistre une cible webhook dans /etc/pve/notifications.cfg. Sans HTTPS, elle utilise POST http://127.0.0.1:8008/api/notifications/webhook ; avec HTTPS, le récepteur HTTP local du port 8009. Les notifications PVE entrent dans le traitement du Monitor. Voir Intégration webhook PVE.", + "Lance le thread d’envoi en arrière-plan, qui consulte la file et traite chaque événement." + ], + "activeAlt": "Carte active avec onglets des canaux, nom d’affichage et options avancées d’IA repliables", + "activeCaption": "État actif : canaux Telegram / Gotify / Discord / e-mail / Pushover / Apprise, nom d’affichage, catégories par canal et section Avancé : amélioration par IA." + }, + "sources": { + "heading": "Sources des événements", + "intro": "Six types de sources alimentent le moteur : collecteurs en arrière-plan, récepteur webhook et sources internes. Ils produisent des objets structurés NotificationEvent.", + "headerCollector": "Collecteur", + "headerWatches": "Surveille", + "headerEvents": "Événements typiques", + "rows": [ + { + "collector": "Moniteur de santé", + "watches": "Dix catégories, toutes les 5 minutes", + "events": "new_error, error_resolved, error_escalated, health_degraded, health_persistent." + }, + { + "collector": "Surveillance du journal système", + "watches": "journalctl --follow avec motifs pour les échecs SSH/web, blocages Fail2Ban si la jail est installée, erreurs d’E/S du noyau, OOM et événements smartd.", + "events": "auth_fail, ip_block, oom_kill, disk_io_error, service_fail." + }, + { + "collector": "Surveillance des tâches", + "watches": "Consulte /var/log/pve/tasks/index pour trouver les nouveaux UPID et suivre leurs fichiers journaux.", + "events": "backup_start, backup_complete, backup_warning, backup_fail, migration_*, snapshot_complete." + }, + { + "collector": "Récepteur webhook Proxmox", + "watches": "Reçoit POST /api/notifications/webhook. Les versions PVE compatibles avec les cibles webhook peuvent y transmettre leurs notifications après configuration ; voir ci-dessous.", + "events": "Tout ce que PVE émet — y compris les événements que le moniteur manquerait autrement (HA, réplication, vzdump de l'interface graphique)." + }, + { + "collector": "Collecteur par interrogation périodique", + "watches": "Compare régulièrement les nœuds du cluster, l’expiration des certificats, le passthrough GPU et les mises à jour PVE/ProxMenux.", + "events": "node_disconnect, node_reconnect, pve_update, proxmenux_update, gpu_mode_switch, pci_passthrough_conflict." + }, + { + "collector": "Sources internes au processus", + "watches": "Appels directs des scripts ProxMenux et du Monitor (notification_manager.emit_event(...)).", + "events": "system_startup, system_shutdown, system_reboot, ai_model_migrated, événements de test personnalisés." + } + ], + "after1": "Chaque événement porte un event_type stable (le catalogue est ci-dessous), un severity (INFO, WARNING, CRITICAL), un category (utilisé pour l'enrichissement émoji et les filtres par groupe) et une charge utile data avec tout ce dont le modèle a besoin (vmid, device, source_ip, reason...).", + "after2": "Chaque event_type utilise un modèle de notification_templates.py pour produire le texte. Ce texte suit le traitement d’envoi et peut être réécrit par l’IA. La page Assistant IA décrit cette interaction." + }, + "channels": { + "heading": "Configurer les canaux", + "intro": "Six canaux : Telegram, Discord, Gotify, e-mail SMTP, Pushover et Apprise. Les cinq premiers ont leurs champs dédiés. Apprise ajoute environ 80 services via une URL, notamment ntfy, Matrix, Slack, Teams, Pushbullet, AWS SNS et Mattermost. Configuration ci-dessous.", + "credsTitle": "Stockage des identifiants", + "credsBody": "Les jetons, les clés, les URL webhook et les mots de passe SMTP sont stockés localement dans la base de données SQLite de Monitor sous /usr/local/share/proxmenux/. Les valeurs sensibles sont protégées et masquées dans l'interface. Ils ne quittent jamais l'hôte que pour atteindre leurs services respectifs. Une sauvegarde de ce répertoire suffit pour récupérer les canaux configurés." + }, + "telegram": { + "heading": "Telegram", + "intro": "Il faut un jeton de bot, réutilisable entre conversations, et un ID de conversation pour la destination privée, le groupe ou le sujet de supergroupe. Le guide intégré détaille la configuration ; les deux formes d’ID sont expliquées ici.", + "guideAlt": "Guide Telegram en quatre sections : BotFather, jeton, ID de conversation, groupes et canaux", + "guideCaption": "Le lien + guide de configuration ouvre quatre étapes pour créer le bot et configurer le canal en environ deux minutes.", + "step1Title": "1 · Créer un robot avec BotFather", + "step1Items": [ + "Ouvrez Telegram et contactez @BotFather avec la coche bleue de vérification ; attention aux copies.", + "Envoyer /newbot.", + "Choisissez un nom d'affichage (p. ex. ProxMenux Lab). Il peut être changé plus tard.", + "Choisissez un nom d'utilisateur se terminant par bot (p. ex. proxmenux_lab_bot). Il doit être unique à travers Telegram.", + "BotFather fournit un jeton tel que 123456789:ABCdef…. Il s’agit du jeton de bot : protégez-le comme un mot de passe." + ], + "step2Title": "2 · Obtenir l'identifiant de discussion", + "step2Intro": "L’ID indique où le bot publie. Sa forme dépend de la destination.", + "privateLabel": "Chat privé (vous recevez les alertes pour votre propre compte):", + "privateItems": [ + "Démarrez une conversation avec votre nouveau robot et envoyez tout message (par exemple : /start).", + "Ouvrez une conversation avec @userinfobot (ou @myidbot) et envoyez /start. Il répond avec votre ID d'utilisateur numérique — c'est-à-dire l'ID de chat. C'est un nombre positif." + ], + "privateAlt": "Formulaire de canal Telegram rempli de jeton Bot (masqué), code de discussion positif pour un chat privé et un champ d'identification du sujet en option vide", + "privateCaption": "Chat privé avec le bot — Chat ID est un nombre positif (votre identifiant utilisateur personnel).", + "groupLabel": "Groupe ou supergroupe avec des sujets:", + "groupItems": [ + "Ajouter le bot au groupe en tant que membre (et le rendre administrateur si le groupe l'exige pour poster).", + "Envoyez tout message dans le groupe.", + "Ouvrez https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates dans un navigateur. Recherchez le chat.id dans la réponse JSON — pour les groupes, c'est un nombre négatif, pour les supergroupes, il commence par -100.", + "Pour un supergroupe avec Sujets, relevez le message_thread_id voulu et placez-le dans le champ facultatif ID du sujet." + ], + "groupAlt": "Formulaire Telegram avec jeton masqué, ID négatif commençant par -100 pour un supergroupe et ID de sujet 3", + "groupCaption": "Supergroupe — Chat ID commence par -100… et l'option Topic ID cible un thread spécifique.", + "step3Title": "3 · Enregistrer et tester", + "step3Body": "Collez jeton et ID, enregistrez, puis Envoyer un test. Le message devrait arriver en une seconde. Sinon, l’Historique indique la cause : jeton invalide, bot absent du groupe ou bloqué par l’utilisateur." + }, + "discord": { + "heading": "Discord", + "intro": "Discord reçoit les messages via une URL de webhook associée au canal. Monitor a besoin de cette URL.", + "items": [ + "Dans Discord, ouvrez Paramètres du serveur → Intégrations → Webhooks.", + "Choisissez Nouveau webhook, nommez-le par exemple ProxMenux et choisissez le canal. L’avatar est facultatif.", + "Choisissez Copier l’URL du webhook. Format : https://discord.com/api/webhooks/<id>/<token>.", + "Coller dans le champ URL Webhook de l'onglet Discord dans le panneau Notifications et enregistrer." + ], + "imageAlt": "Formulaire de canal Discord avec champ URL Webhook commençant par https://discord.com/api/webhooks/", + "imageCaption": "Discord : collez l’URL obtenue dans Paramètres du serveur → Intégrations → Webhooks." + }, + "gotify": { + "heading": "Gotify", + "intro": "Gotify est un serveur de notifications auto-hébergé. Il faut son URL de base et un jeton d’application créé dans son administration.", + "items": [ + "Si nécessaire, installez Gotify selon le guide officiel d’installation.", + "Connectez-vous comme administrateur et ouvrez Applications → Créer une application. Nommez-la par exemple ProxMenux et copiez le jeton.", + "Dans Gotify, définissez URL du serveur, par exemple https://gotify.example.com, et collez le jeton.", + "Enregistrez et choisissez Envoyer un test." + ], + "imageAlt": "Formulaire Gotify avec URL https://gotify.example.com et champ de jeton avec exemple A_valid_gotify_token", + "imageCaption": "Gotify — URL du serveur de votre instance auto-installée plus le token App de l'interface utilisateur d'administration Gotify." + }, + "email": { + "heading": "E-mail (SMTP)", + "intro": "L’e-mail nécessite serveur SMTP, port, mode TLS, identifiant et mot de passe facultatifs, adresse d’envoi et au moins un destinataire.", + "imageAlt": "Formulaire SMTP : serveur, port, TLS, identifiant, mot de passe, expéditeur, destinataires séparés par des virgules et préfixe d’objet", + "imageCaption": "SMTP : serveur, port, TLS, identifiant et mot de passe facultatifs, expéditeur, destinataires et préfixe d’objet pour le filtrage.", + "appNote": "Monitor utilise SMTP avec mot de passe. Gmail peut demander un mot de passe d’application. Chez Microsoft, cela dépend du service et des règles du tenant ; un tel mot de passe ne contourne pas l’interdiction de l’authentification de base. Vérifiez la compatibilité du service.", + "gmailTitle": "Mot de passe de l'application Gmail", + "gmailIntro": "Gmail exige la validation en deux étapes pour créer un mot de passe d’application. Sinon, Mots de passe d’application n’est pas disponible.", + "gmailItems": [ + "Ouvrez myaccount.google.com/security et activez la validation en deux étapes.", + "Allez sur myaccount.google.com/apppasswords.", + "Saisissez un nom comme ProxMenux et choisissez Créer. Copiez le mot de passe de 16 caractères.", + "Renseignez Serveur smtp.gmail.com, Port 587, Mode TLS STARTTLS, Identifiant votre adresse Gmail et Mot de passe celui d’application de 16 caractères." + ], + "outlookTitle": "Mot de passe de l'application Microsoft / Outlook", + "outlookIntro": "Les mots de passe d’application Microsoft exigent la vérification en deux étapes, sans garantir la compatibilité SMTP. Si le service ou tenant exige OAuth2, le client SMTP du Monitor ne peut pas s’authentifier. Utilisez un relais adapté à cette authentification.", + "outlookItems": [ + "Ouvrez account.microsoft.com/security et activez la vérification en deux étapes.", + "Si votre compte propose Options de sécurité avancées → Mots de passe d’application, choisissez Créer un mot de passe d’application. Cela ne garantit pas l’acceptation de SMTP avec mot de passe.", + "Si Microsoft crée ce mot de passe, copiez-le et vérifiez son acceptation par le service SMTP.", + "Uniquement si SMTP avec mot de passe est autorisé, utilisez les paramètres approuvés : Serveur smtp.office365.com pour Exchange Online, Port 587, Mode TLS STARTTLS, Identifiant votre adresse et Mot de passe la valeur autorisée. Outlook.com personnel a d’autres paramètres et exigences." + ], + "relayTitle": "Relais SMTP auto-hébergé", + "relayBody": "Dirigez Monitor vers un relais SMTP contrôlé, par exemple Postfix. Le relais gère l’authentification du fournisseur. Configurez authentification et TLS selon le relais ; son caractère local ne désactive pas le chiffrement." + }, + "pushover": { + "heading": "Pushover", + "intro": "Pushover est un service de push mobile avec des applications officielles pour iOS, Android et les navigateurs de bureau. Le canal ProxMenux dédié parle directement au Pushover API, donc aucune URL Apprise n'est requise.", + "stepsTitle": "Configuration", + "steps": [ + "Créer un compte Pushover, installer l'application officielle sur les appareils qui devraient recevoir des alertes et se connecter.", + "Copiez la clé utilisateur du tableau de bord Pushover. Une clé de groupe permet de servir plusieurs personnes ou appareils.", + "Ouvrez Créer une application/un jeton API, créez ProxMenux et copiez son jeton API de 30 caractères.", + "Dans Paramètres → Notifications → Pushover, collez la clé utilisateur ou de groupe et le jeton de l'application API. Les champs périphériques et sonores sont optionnels.", + "Enregistrer les paramètres et appuyez sur Envoyer test. L'application Pushover devrait recevoir le message immédiatement." + ], + "priorityTitle": "Correspondance des priorités", + "priorityBody": "Les messages ordinaires utilisent la priorité 0. Avec Priorité haute pour les alertes critiques, les événements CRITICAL utilisent la priorité 1 et contournent les heures de silence Pushover. La priorité d’urgence 2 avec répétition et accusé de réception n’est pas utilisée.", + "secretTitle": "Protéger les deux valeurs", + "secretBody": "Clé utilisateur ou groupe et jeton API autorisent l’envoi. Monitor les protège et les masque dans l’interface. Ne publiez aucune des deux valeurs dans les captures ou journaux de support." + }, + "apprise": { + "heading": "Apprise (hub générique pour les services ~80)", + "intro": "Apprise gère environ 80 services via des URL : ntfy, Matrix, Slack, Microsoft Teams, Mattermost, Pushbullet, AWS SNS, Pushsafer, Rocket.Chat, Signal API et d’autres, sans intégration dédiée dans Monitor. Pushover est aussi possible ; son propre onglet reste plus simple pour une destination unique.", + "listIntro": "La liste complète des services pris en charge et le format exact d'URL pour chacun d'eux sont disponibles dans la documentation officielle Apprise:", + "listItems": [ + "Documentation des services Apprise — index complet.", + "Principes des URL — structure des URL Apprise." + ], + "stepsTitle": "Étapes", + "steps": [ + "Choisissez le service cible dans le wiki Apprise et copiez le modèle d'URL. Chaque page de service affiche le schéma exact à utiliser (ntfy://, matrix://, pover://, slack://...) plus les jetons, canaux ou noms d'hôte requis.", + "Remplacez les paramètres par vos identifiants. Exemples : ntfy.sh ntfy://ntfy.sh/my-topic, Pushover pover://user@token, Matrix matrix://user:pass@host:port/#room.", + "Coller l'URL finale dans le champ Apprise URL dans l'onglet Apprise du panneau Notifications et enregistrer.", + "Appuyez sur Envoyer Test pour vérifier que l'URL est accessible et que les identifiants sont acceptés." + ], + "deliveredTitle": "Ce qui est livré", + "deliveredBody": "Apprise reçoit titre, texte et gravité, adaptée aux possibilités du service (icône, priorité, couleur). Le formatage et l’IA s’exécutent avant l’envoi, comme pour Telegram ou l’e-mail.", + "fanoutTitle": "Une URL par canal Apprise", + "fanoutBody": "Un champ URL par canal Apprise. Pour plusieurs services, tels ntfy.sh et Matrix, hébergez un serveur API Apprise avec configuration étiquetée. Il distribue l’appel du Monitor aux URL de l’étiquette." + }, + "rich": { + "heading": "Messages riches, catégories et filtrage par canal", + "intro": "Trois contrôles par canal : Messages enrichis, onze Catégories de notification repliables avec interrupteurs d’événements, puis Envoyer un test.", + "imageAlt": "Catégories avec Messages enrichis en haut, sections VM/CT, sauvegardes, ressources, stockage, réseau, sécurité, cluster, services, santé et mises à jour, compteurs et bouton de test", + "imageCaption": "La flèche indique Messages enrichis. Dessous : onze catégories et leurs événements. Envoyer un test est en bas.", + "richTitle": "Messages enrichis", + "richIntro": "Avec Messages enrichis, chaque événement reçoit un emoji de catégorie et le format natif du canal, tel HTML Telegram ou carte Discord colorée. Sans cela, le même contenu part en texte simple :", + "plainHeader": "Texte simple — format enrichi désactivé", + "richHeader": "Texte enrichi — format activé", + "richOutro": "Réglage indépendant par canal : e-mail simple, Telegram et Discord enrichis, par exemple. Les canaux sans ce format, comme l’e-mail simple ou Gotify, reçoivent du texte.", + "togglesTitle": "Catégories par événement", + "togglesIntro": "Chaque canal contrôle séparément ses catégories et événements. Une catégorie désactivée supprime ses événements pour ce canal. Les réglages individuels s’appliquent aux catégories actives ; aucun interrupteur global d’événement n’existe dans le répartiteur.", + "togglesItems": [ + "Contrôle de catégorie par canal. Désactiver VM/CT supprime vm_start et ses équivalents. Stockage : <channel>.events.<group>.", + "Contrôle d’événement par canal. Dans une catégorie active, choisissez par exemple envoyer backup_complete à Discord, pas à Telegram. Stockage : <channel>.event.<event_type>." + ], + "togglesOutro": "Chaque catégorie affiche activés / total et un interrupteur pour tout le groupe, tel les sauvegardes info ou mises à jour, sans l’ouvrir." + }, + "quiet": { + "heading": "Heures de silence", + "intro": "Pendant ce créneau propre au canal, seuls les événements CRITICAL passent. INFO, WARNING et actions sont conservés sur disque puis livrés dans un résumé à la fin.", + "imageAlt": "Réglages du canal : heures de silence 22:00–07:00 et aperçu du prochain changement, puis résumé quotidien à 09:00 avec note indiquant que ce résumé ne retarde ni CRITICAL ni WARNING", + "imageCaption": "Deux réglages indépendants par canal : heures de silence en haut, résumé quotidien dessous.", + "purposeTitle": "C'est pour quoi ?", + "purposeItems": [ + "Pas d’avis de mise à jour à 03:00. Sauvegardes, mises à jour, optimisations et autres INFO ne font pas sonner le téléphone la nuit.", + "Les événements critiques restent immédiats. Seuls ceux classés CRITICAL contournent le silence. Le nom ne fixe pas la gravité : la surveillance du journal émet les blocages Fail2Ban et les arrêts/redémarrages de l’hôte en INFO, donc ils peuvent attendre.", + "Conserver les avis différés. Ils restent dans un tampon SQLite jusqu’à la fin du créneau." + ], + "howTitle": "Comment ça marche", + "howItems": [ + "Réglage par canal. Telegram peut rester silencieux de 22:00 à 07:00 tandis que l’e-mail reçoit tout, jour et nuit.", + "Début et fin dans le fuseau local : début inclus, fin exclue. Le créneau peut traverser minuit, par exemple 22:00–07:00.", + "Aperçu immédiat. Sous les champs apparaissent l’état actif et l’heure du prochain changement.", + "Pendant le créneau : CRITICAL suit l’envoi normal ; INFO et WARNING sont stockés dans la table SQLite quiet_pending.", + "À la fin : un résumé chronologique est envoyé, une ligne par événement. Le tampon n’est vidé qu’après confirmation de livraison, afin de résister aux pannes temporaires Telegram ou SMTP.", + "Résiste aux redémarrages. Le tampon reste sur disque. Le cycle suivant détecte les lignes en attente et envoie au besoin un résumé de récupération." + ], + "criticalTitle": "Ce qui compte comme CRITIQUE", + "criticalBody": "Le producteur fixe la gravité à la création. Un événement de disque, arrêt ou sécurité n’est pas automatiquement CRITICAL. La surveillance du journal émet ip_block, system_shutdown et system_reboot en INFO. Le Catalogue des événements énumère les types ; consultez le producteur et l’événement reçu pour sa gravité réelle." + }, + "digest": { + "heading": "Résumé quotidien des événements INFO", + "intro1": "Le résumé quotidien est facultatif : il rassemble les INFO admissibles, comme les mises à jour, à 09:00 ou à l’heure choisie. Résultats de sauvegarde/réplication et actions directes sont exclus. Les heures de silence diffèrent : elles retardent les messages non critiques durant un créneau.", + "intro2": "Le réglage est sous les heures de silence, dans la même carte ; voir Heures de silence. Chacun s’active séparément.", + "purposeTitle": "C'est pour quoi ?", + "purposeItems": [ + "Un bilan matinal. Un résumé à 09:00 rassemble les informations de 20 messages de la veille, sans lire 20 bulles Telegram.", + "Distinguer activité et urgence. INFO décrit les faits ; CRITICAL et WARNING appellent une action. Les INFO admissibles sont regroupés, les autres gardent leur livraison directe." + ], + "howTitle": "Comment ça marche", + "howItems": [ + "Activation par canal. Désactivé par défaut. Activez-le seulement là où vous voulez un résumé ; les autres canaux restent en direct.", + "Heure de livraison locale, 09:00 par défaut. L’envoi se déclenche à environ 60 s près.", + "Inclus : événements génériques admissibles de niveau INFO, comme mise à jour d’application disponible, mise à jour Tailscale disponible, mise à jour d’optimisation ProxMenux disponible, mises à jour de sécurité APT en attente et avis de limitation d’envoi. Résultats de sauvegarde et actions exemptées restent en direct.", + "Ce qui n'est jamais retardé:", + "Persistance. Les événements restent dans SQLite, table digest_pending, jusqu’à l’heure prévue, même après redémarrage.", + "Sans événement, sans résumé. Aucun résumé vide n’est envoyé si aucun INFO n’attend." + ], + "neverDelayedSub": [ + "Les événements CRITICAL passent toujours immédiatement.", + "Les événements WARNING passent toujours immédiatement.", + "Les actions et échecs VM/CT, débuts et résultats de sauvegarde, résultats de réplication et arrêts/redémarrages de l’hôte contournent le résumé même en INFO. Le silence peut encore retarder les événements non critiques." + ], + "comboTitle": "Combiner les heures tranquilles et le digest quotidien", + "comboBody": "Un canal peut activer les deux : silence 22:00–07:00 et résumé à 09:00. Les événements non critiques du créneau arrivent au résumé de07:00 ; les INFO admissibles hors créneau vont au résumé quotidien. CRITICAL contourne les deux ; WARNING contourne le quotidien mais attend pendant le silence. Choisissez un créneau silencieux, un résumé à heure fixe, ou les deux." + }, + "displayName": { + "heading": "Nom d’affichage", + "intro": "Chaque avis porte un nom d’affichage identifiant l’hôte, tel 🏠 home-lab au bas de l’exemple et dans le préfixe d’objet.", + "imageAlt": "Champ Nom d’affichage avec exemple amd ; un champ vide utilise le nom d’hôte système", + "imageCaption": "Laissez le nom vide pour utiliser celui du système ou saisissez un nom personnalisé.", + "outro": "Si le champ est vide, le moniteur revient au nom d'hôte du système. La redéfinition est surtout utile lorsque vous exécutez plusieurs hôtes ProxMenux qui envoient à la même discussion ou boîte de réception Telegram, une étiquette plus conviviale (home-lab, office-pve) est plus facile à lire que pve01.lan ou pmx-prod-01." + }, + "dispatch": { + "heading": "Traitement de l’envoi", + "intro": "Trois mécanismes liés sont décrits ci-dessous. L’ordre réel est regroupement, réservation/vérification du délai, limite par groupe, rendu puis contrôles de livraison par canal :", + "headerStage": "Étape", + "headerWhat": "Ce qu'il fait", + "headerTunable": "Réglable ?", + "rows": [ + { + "stage": "Déduplication par empreinte", + "what": "Une empreinte est calculée pour chaque événement (event_type + key fields from data). Les empreintes identiques sur un intervalle court sont considérées comme des doublons.", + "tunable": "Non — logique du répartiteur interne." + }, + { + "stage": "Délai de répétition", + "what": "Après livraison réussie, les répétitions sont supprimées ; l’état est dans notification_last_sent. Base pour CRITICAL, WARNING, INFO, resources et updates : 86400 s. Exceptions : 5 s pour actions VM/CT et arrêt/redémarrage, 10 s pour résultats sauvegarde/réplication, 1800–3600 s pour plusieurs états de santé. Les réglages explicites d’événement/groupe prévalent.", + "tunable": "Oui : des valeurs explicites par événement ou groupe remplacent les valeurs du répartiteur." + }, + { + "stage": "Regroupement des rafales", + "what": "Une rafale d’événements semblables, comme des tentatives SSH, devient un message burst_* avec compteur et échantillon.", + "tunable": "Non — la fenêtre et le seuil sont codés en dur par type d'événement." + } + ], + "calloutTitle": "Envoi dans un thread en arrière-plan", + "calloutBody": "La requête HTTP se termine à la mise en file ; le thread attend les réponses Telegram, SMTP ou webhook et inscrit les résultats dans l’historique." + }, + "aiRewrite": { + "heading": "Réécriture optionnelle de l'IA", + "body1": "Les événements admissibles peuvent être réécrits par un LLM. backup_complete et backup_fail sont exclus. L’IA est désactivée par défaut et s’exécute dans le thread d’envoi. En cas d’erreur ou délai dépassé, le texte du modèle est utilisé.", + "body2": "OpenAI, Anthropic, Google Gemini, Groq, OpenRouter et Ollama local sont disponibles. Par canal : détail (brief, standard, detailed), langue, mode d’instructions (default ou custom) et instructions propres. Guide et exemples : Assistant IA.", + "privacyTitle": "Note de confidentialité", + "privacyBody": "La requête IA peut inclure titre, gravité, texte, instructions système/personnelles et contexte : noms d’hôte, IP, utilisateurs, erreurs et journaux. Elle part vers le serveur choisi. Ollama reste local seulement avec serveur et modèle locaux ; serveur distant ou modèle cloud transmettent les données hors de l’hôte. Désactivez l’IA ou utilisez serveur et modèle locaux contrôlés si le contenu doit rester dans le réseau." + }, + "pveWebhook": { + "heading": "Intégration PVE webhook", + "intro1": "Proxmox utilise des cibles de notification sendmail, Gotify, SMTP et, sur les versions compatibles, webhook. Monitor enregistre une cible webhook. Les avis PVE, tels HA, réplication et sauvegardes de l’interface, rejoignent le même traitement.", + "intro2": "La cible est visible à partir du GUI Proxmox à Datacenter → Notifications → Objectifs de notification :", + "imageAlt": "Proxmox VE Modifier la boîte de dialogue Webhook montrant la cible de proxmenux-webhook créée automatiquement avec la méthode POST, URL http://127.0.0.1:8008/api/notifications/webhook et un modèle de corps JSON utilisant le titre d'échappement, message d'échappement, gravité d'échappement, horodatage d'échappement et champs json", + "imageCaption": "La cible webhook côté PVE comme Proxmox la voit (l'interface graphique se trouve dans le local configuré de l'hôte — espagnol dans cet exemple). Les mêmes champs s'appliquent dans n'importe quelle langue.", + "registeredIntro": "Ce qui est enregistré:", + "registeredItems": [ + "Méthode et URL. POST http://127.0.0.1:8008/api/notifications/webhook sans HTTPS Monitor ; avec HTTPS, récepteur HTTP local séparé sur 8009. Les deux restent sur l’hôte.", + "Modèle du corps. JSON avec aides Handlebars natives de PVE, stocké en base64 dans la configuration. Une fois décodé :", + "Matcher. Un bloc d'accompagnement matcher: proxmenux-matcher avec mode all afin que chaque notification PVE atteigne la cible.", + "Configuration privée. La configuration écrit webhook: proxmenux-webhook dans /etc/pve/priv/notifications.cfg avec le secret partagé en base64. La cible publique le référence pour envoyer X-Webhook-Secret. Le bloc n’est pas vide." + ], + "securityTitle": "Comment le récepteur est sécurisé", + "securityIntro": "Le récepteur webhook de POST /api/notifications/webhook applique différentes couches de sécurité selon l'origine de la demande:", + "securityItems": [ + "Sources locales (127.0.0.1 / ::1). Limitation du nombre de requêtes, sans contrôles distants du secret, de l’heure et des répétitions. Les adresses des interfaces de l’hôte sont aussi locales. La cible PVE automatique utilise loopback.", + "Appels distants. En plus des limites, contrôles du secret X-Webhook-Secret, de l’heure dans X-ProxMenux-Timestamp ou le JSON, des répétitions et d’une liste IP facultative. Le secret est dans SQLite et copié en base64 dans /etc/pve/priv/notifications.cfg pour l’en-tête PVE." + ], + "practiceTitle": "En pratique", + "practiceBody": "PVE utilise http://127.0.0.1:8008 sans HTTPS, sinon HTTP 8009. Les intégrations externes sur https://<monitor-host>:<port>/api/notifications/webhook doivent fournir X-Webhook-Secret et une heure actuelle, puis passer les contrôles de répétition et IP. Le secret seul ne suffit pas.", + "actionsIntro": "Le moniteur gère cette cible par trois actions sur l'onglet Paramètres :", + "actionsItems": [ + "Configurer crée l’entrée dans /etc/pve/notifications.cfg. Seules les modifications sont écrites ; les trois sauvegardes récentes restent dans /usr/local/share/proxmenux/backups/pve-notifications/. Aucune écriture sans montage de /etc/pve ; la cible est inscrite au retour de pve-cluster.", + "Nettoyer retire l’entrée en gardant la sauvegarde précédente.", + "Lire la configuration affiche cibles et règles de correspondance pour vérifier les routes PVE." + ], + "clusterTitle": "Nœuds du cluster", + "clusterBody": "/etc/pve/, URL et secret sont partagés dans le cluster. Chaque nœud appelle son propre récepteur : 127.0.0.1:8008 sans HTTPS, sinon HTTP 8009. Exécutez Monitor sur les nœuds concernés et assurez la cohérence de la cible avec chaque récepteur." + }, + "catalogue": { + "heading": "Catalogue des événements", + "intro": "Environ 70 types sont regroupés en onze catégories repliables. Chaque événement possède un interrupteur et est activé par défaut, sauf indication contraire.", + "headerGroup": "Groupe", + "headerEvents": "Événements", + "rows": [ + { + "group": "VM/CT", + "events": "vm_start, vm_start_warning, vm_stop, vm_shutdown, vm_fail, vm_restart, plus les équivalents ct_*, migration_start, migration_complete, migration_warning, migration_fail, replication_complete, replication_fail." + }, + { + "group": "Sauvegardes", + "events": "backup_start, backup_complete, backup_warning, backup_fail, snapshot_complete, snapshot_fail." + }, + { + "group": "Ressources", + "events": "cpu_high, ram_high, temp_high, load_high." + }, + { + "group": "Stockage", + "events": "disk_space_low, disk_io_error, storage_unavailable, smart_test_complete, smart_test_failed." + }, + { + "group": "Réseau", + "events": "network_down, network_latency." + }, + { + "group": "Sécurité", + "events": "auth_fail, ip_block, firewall_issue, user_permission_change." + }, + { + "group": "Cluster", + "events": "split_brain, node_disconnect, node_reconnect." + }, + { + "group": "Services", + "events": "system_startup, system_shutdown, system_reboot, system_problem, service_fail, oom_kill, system_mail." + }, + { + "group": "Moniteur de santé", + "events": "new_error, error_resolved, error_escalated, health_degraded, health_persistent, health_issue_new, health_issue_resolved." + }, + { + "group": "Mises à jour", + "events": "update_summary, update_available, pve_update, update_complete, proxmenux_update." + }, + { + "group": "Matériel / GPU", + "events": "gpu_mode_switch, gpu_passthrough_blocked, pci_passthrough_conflict, ai_model_migrated." + } + ], + "burstNote": "Les types burst_* (burst_auth_fail, burst_ip_block, burst_disk_io, etc.) remplacent les rafales par un résumé. Sans interrupteur propre, ils héritent du réglage de l’événement source.", + "backupResults": { + "heading": "Résultats de sauvegarde", + "intro": "Le rapport du travail de sauvegarde fixe résultat, titre, icône avec Messages enrichis et ligne d’état de l’e-mail.", + "headerIcon": "Icon", + "headerResult": "Résultat", + "headerWhen": "Quand", + "rows": [ + { + "icon": "💾✅", + "result": "Sauvegarde terminée", + "when": "Tous les invités ont terminé, sans avertissement dans le rapport." + }, + { + "icon": "💾⚠️", + "result": "Sauvegarde terminée avec des avertissements", + "when": "Tous les invités ont terminé, avec au moins un avertissement." + }, + { + "icon": "💾❌", + "result": "Erreur de sauvegarde signalée", + "when": "Un invité a échoué, ou le travail s'est arrêté avec une erreur." + }, + { + "icon": "💾❔", + "result": "Résultat de sauvegarde non confirmé", + "when": "Le rapport est incomplet ou n'indique pas de résultat pour chaque invité." + } + ], + "items": [ + "Le titre identifie le travail. Il indique le stockage et, pour un invité unique, son type, nom et ID. En cas d’échec, l’invité concerné est nommé.", + "Le texte détaille chaque invité : résultat, taille, durée et archive, puis totaux du travail.", + "Les mises en garde et les erreurs sont listées une fois. Les lignes répétées sont montrées une seule fois avec la cause principale d'abord; après huit lignes, le reste est compté dans une ligne de fermeture et reste dans le journal des tâches Proxmox.", + "Un travail qui échoue avant son premier invité montre la cause donnée par Proxmox, par exemple un stockage qui n'existe pas.", + "Les résumés gardent le résultat. Une sauvegarde dans le résumé du silence garde son icône. Les résultats de sauvegarde contournent le résumé quotidien." + ] + } + }, + "history": { + "heading": "Historique", + "body1": "Chaque tentative d’envoi réelle est dans notification_history : date sent_at, canal, événement, gravité, titre, texte, success et, en cas d’échec, error_message. Les rafales ont un type burst_*. Les événements supprimés par le délai ne sont pas enregistrés.", + "body2": "Paramètres → Notifications contient Historique des notifications, fermé par défaut, avec les 20 dernières entrées : résultat, canal, date, erreur et état de chaque résumé quotidien. La page ne propose pas la suppression ; Audit & Report lit les mêmes livraisons.", + "body3": "Les mêmes données sont exposées aux paramètres de requête GET /api/notifications/history avec les paramètres de requête limit, offset, severity et channel, et peuvent être effacées avec DELETE /api/notifications/history." + }, + "api": { + "heading": "Points d’accès API", + "headerEndpoint": "Point d’accès", + "headerMethod": "Méthode", + "headerUse": "Utiliser", + "rows": [ + { + "endpoint": "/api/notifications/settings", + "method": "GET / POST", + "use": "Lit ou écrit la configuration : canaux, événements, IA et nom d’affichage." + }, + { + "endpoint": "/api/notifications/test", + "method": "POST", + "use": "Envoyer une notification de test à un canal : '{'\"channel\":\"telegram\"'}'." + }, + { + "endpoint": "/api/notifications/test-ai", + "method": "POST", + "use": "Produit et réécrit un événement de test sans l’envoyer." + }, + { + "endpoint": "/api/notifications/provider-models", + "method": "POST", + "use": "Liste des modèles disponibles pour le fournisseur d'IA sélectionné." + }, + { + "endpoint": "/api/notifications/send", + "method": "POST", + "use": "Émettre un événement de l'extérieur (intégrations personnalisées)." + }, + { + "endpoint": "/api/notifications/history", + "method": "GET / DELETE", + "use": "Consulte l’historique avec filtres ou le supprime." + }, + { + "endpoint": "/api/notifications/webhook", + "method": "POST", + "use": "Reçoit les avis Proxmox. Les sources locales évitent les contrôles distants mais gardent la limitation. Les requêtes distantes passent X-Webhook-Secret, l’heure dans X-ProxMenux-Timestamp ou JSON, les contrôles de répétition et la liste IP configurée." + }, + { + "endpoint": "/api/notifications/proxmox/setup-webhook", + "method": "POST", + "use": "Enregistrer le moniteur comme cible dans /etc/pve/notifications.cfg." + }, + { + "endpoint": "/api/notifications/proxmox/cleanup-webhook", + "method": "POST", + "use": "Supprimer la cible Monitor de la configuration de notification de PVE." + }, + { + "endpoint": "/api/notifications/proxmox/read-cfg", + "method": "GET", + "use": "Affiche la configuration actuelle de la notification PVE comme PVE la voit." + } + ] + }, + "whereNext": { + "heading": "Où aller ensuite", + "items": [ + { + "label": "Assistant AI", + "href": "/docs/monitor/ai-assistant", + "tail": " — fournisseurs, modèles, modes d’instructions, langues et détail par canal." + }, + { + "label": "Moniteur de santé", + "href": "/docs/monitor/health-monitor", + "tail": "— le plus grand producteur d'événements, avec ses propres durées de suppression par catégorie." + }, + { + "label": "Architecture", + "href": "/docs/monitor/architecture", + "tailRich": " — rôle des tables SQLite notification_last_sent, notification_history et du thread d’envoi dans Monitor." + }, + { + "label": "Accès et authentification", + "href": "/docs/monitor/access-auth", + "tailRich": " — création des jetons API pour les scripts appelant /api/notifications/send." + }, + { + "label": "Tableau de bord → Logs système", + "href": "/docs/monitor/dashboard/system-logs", + "tail": " — vue directe du journal système exploité par la surveillance des événements." + } + ] + } +} diff --git a/web/messages/it/docs/monitor/access-auth.json b/web/messages/it/docs/monitor/access-auth.json new file mode 100644 index 00000000..6a69a76d --- /dev/null +++ b/web/messages/it/docs/monitor/access-auth.json @@ -0,0 +1,396 @@ +{ + "meta": { + "title": "Autenticazione della dashboard Proxmox — 2FA, token API, profilo, proxy inverso | ProxMenux Monitor", + "description": "Accesso e protezione di ProxMenux Monitor: configurazione iniziale, password con nome e avatar, profilo, TOTP 2FA, token API per script, HTTPS, esempi Nginx/Caddy/Traefik, registro di controllo e jail Fail2Ban facoltativa.", + "ogTitle": "Autenticazione Proxmox — 2FA, token API, proxy inverso", + "ogDescription": "Proteggi ProxMenux Monitor con password, TOTP 2FA, token API, HTTPS, esempi di proxy inverso e jail Fail2Ban facoltativa.", + "twitterTitle": "Autenticazione di Dashboard Proxmox | ProxMenux Monitor", + "twitterDescription": "Password + TOTP 2FA, Token API, HTTPS, Nginx/Caddy/Traefik snippets e log audit." + }, + "header": { + "title": "Accesso e autenticazione", + "description": "Accesso alla dashboard, primo avvio e livelli di protezione: password e TOTP, sessioni JWT, token API, HTTPS, proxy inversi, Secure Gateway e jail Fail2Ban facoltativa.", + "section": "Monitor di ProxMenux" + }, + "intro": { + "title": "L’autenticazione è facoltativa", + "body": "Al primo avvio la dashboard mostra la finestra «Proteggere la dashboard?», con i pulsanti Sì, imposta password e No, continua senza protezione. Scegliendo la seconda opzione, gli endpoint dell’API rimangono aperti sulla porta TCP 8008: può andare bene in una LAN di laboratorio isolata, ma è pericoloso in altri ambienti. L’autenticazione a due fattori (2FA) non fa parte di questa scelta iniziale; si configura successivamente nella scheda Sicurezza, dopo aver impostato una password." + }, + "reaching": { + "heading": "Raggiungere la dashboard", + "intro": "ProxMenux Monitor si lega a 0.0.0.0:8008. Ci sono tre modi comuni per raggiungerlo:", + "outro": "L’accesso diretto corrisponde all’unità systemd predefinita. Proxy inverso e Secure Gateway sono descritti più avanti. Per usare l’IP in X-Forwarded-For servono PROXMENUX_TRUST_PROXY=1 e un proxy sotto il tuo controllo. X-Forwarded-Proto o X-Forwarded-Host da soli non attivano tale fiducia; il frontend costruisce gli URL API dall’origine del browser." + }, + "firstLaunch": { + "heading": "Procedura al primo avvio", + "intro": "La prima volta che si apre il cruscotto, il frontend chiama GET /api/auth/status. Se la configurazione auth non è mai stata scritta (configured: false), una singola finestra di dialogo appare intitolato \"Protect Your Dashboard?\" con due scelte:", + "imageAlt": "Finestra iniziale «Proteggere la dashboard?» con opzioni per impostare una password o continuare senza protezione", + "imageCaption": "Scelta iniziale tra protezione con password e nessuna protezione. Ricompare dopo una nuova installazione o dopo aver disattivato l’autenticazione nelle impostazioni.", + "headerButton": "Pulsante", + "headerWhat": "Cosa succede?", + "headerApi": "Chiamata API", + "rows": [ + { + "button": "Sì, imposta password", + "what": "Apre un modulo con nome utente e password obbligatori, più nome visualizzato e immagine avatar facoltativi. Abilita l’autenticazione in auth.json con enabled: true e restituisce un JWT per accedere. I campi facoltativi del profilo vengono salvati con chiamate successive, descritte sotto.", + "api": "POST /api/auth/setup" + }, + { + "button": "No, continua senza protezione", + "what": "Imposta declined: true in auth.json. Gli endpoint API restano aperti finché non abiliti la protezione nelle impostazioni.", + "api": "POST /api/auth/skip" + } + ], + "twofaCalloutTitle": "2FA è configurato in seguito, non qui", + "twofaCalloutBody": "La finestra iniziale riguarda solo la password. L’autenticazione a due fattori (TOTP) si configura dopo nella scheda Sicurezza, una volta effettuato l’accesso con password. La procedura completa è più avanti.", + "createTitle": "Creare il primo utente", + "createIntro": "Sì, imposta password apre un modulo per creare l’account e compilare il profilo facoltativo, così l’avatar appare subito dopo il salvataggio. I campi sono:", + "headerField": "Campo", + "headerRequired": "Obbligatorio", + "headerNotes": "Note", + "fieldRows": [ + { + "field": "Nome utente", + "required": "Sì", + "notes": "Identificativo di accesso. Non modificabile dall’interfaccia: occorre intervenire direttamente su auth.json." + }, + { + "field": "Password", + "required": "Sì", + "notes": "Almeno 10 caratteri da almeno 3 delle 4 categorie: minuscole, maiuscole, cifre e simboli. Password ovvie come password, 12345678 e proxmenux vengono rifiutate. Le stesse regole valgono sul server: curl non può aggirarle." + }, + { + "field": "Nome visualizzato", + "required": "No", + "notes": "Nome nel menu dell’intestazione e nel profilo. Se vuoto, viene usato il nome utente. Modificabile da Avatar → Visualizza profilo." + }, + { + "field": "Immagine di Avatar", + "required": "No", + "notes": "PNG, JPEG, WebP o GIF fino a 2 MB. Visualizzato come un cerchio nell’intestazione e nel profilo. Senza immagine viene mostrata l’iniziale del nome visualizzato o del nome utente su sfondo colorato. Dal profilo puoi caricare, sostituire o rimuovere l’immagine." + } + ], + "createImageAlt": "Modulo per creare l’account con nome utente e password obbligatori, nome visualizzato e avatar facoltativi", + "createImageCaption": "Modulo del primo avvio. Nome visualizzato e avatar sono facoltativi; lasciandoli vuoti si crea l’account con un’iniziale in un cerchio nell’intestazione.", + "saveCalloutTitle": "Un salvataggio, fino a tre chiamate API", + "saveCalloutBody": "Il modulo invia prima POST /api/auth/setup con nome utente e password. Con il JWT ricevuto esegue, se compilati, PUT /api/auth/profile per il nome e POST /api/auth/profile/avatar per l’immagine. Un errore del profilo non annulla l’account: potrai completarlo in seguito.", + "avatarTitle": "Menu Avatar e pagina del profilo", + "avatarBody1": "Dopo la configurazione appare l’avatar in alto a destra, accanto al selettore del tema. Il menu apre profilo e Sicurezza e offre Esci. Puoi terminare la sessione anche dalla scheda Sicurezza.", + "avatarBody2": "Il profilo mostra avatar, nome utente in sola lettura e nome visualizzato modificabile. Caricamenti, sostituzioni e rimozioni dell’avatar sono atomici; l’intestazione si aggiorna automaticamente dopo il successo. Modulo iniziale e profilo usano gli stessi endpoint descritti sotto.", + "profileImageAlt": "Profilo con anteprima avatar, pulsanti Carica / Sostituisci / Rimuovi, nome utente in sola lettura e nome visualizzato modificabile", + "profileImageCaption": "Pagina del profilo. Il nome utente è in sola lettura; nome visualizzato e avatar sono modificabili qui senza aprire Sicurezza.", + "headerEndpoint": "Endpoint", + "headerEpWhat": "Che cosa fa", + "endpointRows": [ + { + "endpoint": "GET /api/auth/profile", + "what": "Restituisce nome utente, nome visualizzato e stato dell’avatar (has_avatar, avatar_mtime)." + }, + { + "endpoint": "PUT /api/auth/profile", + "what": "Aggiorna il nome visualizzato. Corpo della richiesta: '{' \"display_name\": \"...\" '}'." + }, + { + "endpoint": "GET /api/auth/profile/avatar", + "what": "Restituisce l’immagine PNG / JPEG / WebP / GIF con il tipo di contenuto corretto. Richiede l’header Bearer: il frontend scarica un blob e crea un URL locale per visualizzarlo." + }, + { + "endpoint": "POST /api/auth/profile/avatar", + "what": "Carica un nuovo avatar (max 2 MB). Il tipo di contenuto deve corrispondere al file. Il vecchio avatar è sostituito atomicamente." + }, + { + "endpoint": "DELETE /api/auth/profile/avatar", + "what": "Rimuove l’avatar. Nell’intestazione ricompare un’iniziale in un cerchio colorato." + } + ], + "reversibleTitle": "Puoi attivare la protezione in seguito", + "reversibleBody": "Dopo No, continua senza protezione, la finestra iniziale non ricompare. Attiva l’autenticazione dalla scheda Sicurezza oppure modifica /root/.config/proxmenux-monitor/auth.json, rimuovi il flag declined e riavvia il servizio." + }, + "password": { + "heading": "autenticazione password", + "intro": "Dopo la configurazione, le chiamate API protette richiedono un JWT in Authorization: Bearer <token>:", + "items": [ + "Token di sessione: valido 24 ore, emesso da POST /api/auth/login.", + "Token API per integrazioni: valido 365 giorni, emesso da POST /api/auth/generate-api-token. Dettagli nella sezione successiva." + ], + "loginImageAlt": "schermata di accesso mostrata dopo la configurazione dell'autenticazione — campi username e password", + "loginImageCaption": "Dopo la configurazione, l’accesso inizia da questa schermata. Con 2FA viene richiesto il codice a sei cifre dopo l’accettazione della password.", + "loginFlowTitle": "Flusso di accesso", + "twofaIntro": "Con 2FA, la prima chiamata restituisce requires_totp: true. Ripetila con il codice a sei cifre:", + "publicTitle": "Accesso pubblico e controlli protetti", + "publicIntro": "Accesso e stato dell’autenticazione sono pubblici. La creazione dell’account è possibile finché non sono salvati nome e password, anche dopo aver rifiutato la protezione. I dati di sistema richiedono autenticazione quando la protezione è attiva:", + "publicItems": [ + "/api/auth/login e /api/auth/status sono pubblici. /api/auth/setup crea il primo account e rifiuta di sovrascrivere credenziali esistenti.", + "/api/system-info è un endpoint pubblico con informazioni di base sul sistema, incluso health.status. Non richiede un token. Anche /api/auth/status è pubblico e consente di verificare la raggiungibilità." + ], + "cryptoTitle": "Crittografia e archiviazione", + "cryptoIntro": "ProxMenux Monitor è fonte aperta — nessuno di questo è segreto. Documentare lo stack qui esplicitamente è una scelta deliberata: gli operatori che memorizzano le credenziali sul loro host meritano di sapere come queste credenziali sono protette prima che decidano di fidarsi di loro. Gli algoritmi sottostanti sono gli stessi che il codice in scripts/auth_manager.py utilizza; questa sezione è un contratto, non una promessa di marketing.", + "headerAsset": "Elemento", + "headerAlgo": "Algoritmo", + "headerWhere": "Posizione", + "cryptoRows": [ + { + "asset": "Password", + "algorithm": "PBKDF2-HMAC-SHA256 con un sale casuale per password e un alto conteggio di iterazione (OWASP 2023+ baseline). Conservato come pbkdf2_sha256$<iters>$<salt>$<hash>.", + "where": "auth.json → password_hash" + }, + { + "asset": "Sessione / API JWT", + "algorithm": "Firma HS256 con un segreto per installazione generato al primo avvio (secrets.token_urlsafe, ≥48 byte). I token contengono iss=proxmenux-monitor e aud=api; ogni richiesta verifica la firma con il segreto attuale.", + "where": "Segreto: auth.json → jwt_secret. JWT: solo sul cliente." + }, + { + "asset": "metadati di token API", + "algorithm": "L’hash SHA-256 del JWT viene salvato con l’impronta signed_with del jwt_secret usato. Permette di mostrare i metadati e rilevare i token interessati da un cambio del segreto.", + "where": "auth.json → api_tokens[]" + }, + { + "asset": "Segreto TOTP della 2FA", + "algorithm": "TOTP standard (RFC 6238), con segreto in base32. Gli otto codici di recupero sono monouso e vengono salvati come hash SHA-256.", + "where": "auth.json → totp_secret + backup_codes[]" + }, + { + "asset": "Revoche", + "algorithm": "Quando un token viene revocato, il suo hash SHA-256 entra in un elenco di blocco verificato a ogni controllo. Una cache in memoria di circa 30 s evita letture ripetute del disco.", + "where": "auth.json → revoked_tokens[]" + } + ], + "authJsonTitle": "auth.json — ciò che contiene e come è protetto", + "authJsonBody": "I dati di autenticazione sono in /root/.config/proxmenux-monitor/auth.json, modalità 0600, proprietario root. Contiene hash PBKDF2 e segreti crittografici (jwt_secret, totp_secret), mai la password in chiaro. Cifra le destinazioni di backup o replica e non inserire questo file nel controllo di versione.", + "rotateTitle": "La rotazione di jwt_secret invalida tutti i JWT esistenti", + "rotateBody": "Se auth.json viene ricreato o ripristinato con un segreto diverso, cambia jwt_secret. I vecchi JWT di sessione e API falliscono con \"Invalid or expired token\". L’interfaccia li segnala come Non valido — rigenerare. Revocali e sostituiscili anche in Home Assistant, script e altri client.", + "recoverTitle": "Recuperare una password persa", + "recoverIntro": "Il recupero della password richiede accesso alla shell dell’host. ProxMenux offre una reimpostazione guidata nel menu di configurazione, senza modificare manualmente auth.json:", + "survivesTitle": "Cosa sopravvive al reset", + "survivesBody": "Viene cancellato l’accesso interattivo, mentre jwt_secret e gli api_tokens registrati restano. Home Assistant e altri script possono continuare con gli stessi token. Per azzerare tutto con un nuovo segreto, elimina auth.json e riavvia il servizio: tutti i vecchi token diventano invalidi.", + "physicalTitle": "Prerequisito di accesso fisico", + "physicalBody": "Richiede una shell root sull’host. Chi esegue menu come root controlla già la macchina; reimpostare la password non aumenta i suoi privilegi. L’accesso Monitor non protegge quindi da chi dispone già di accesso root." + }, + "twofa": { + "heading": "Autenticazione a due fattori (TOTP)", + "intro": "2FA aggiunge alla password un codice a sei cifre che cambia ogni 30 secondi, generato sul telefono o gestore di password. La sola password non basta per entrare. ProxMenux Monitor usa il protocollo standard TOTP (RFC 6238), compatibile con le app di autenticazione.", + "pickTitle": "Scegli un’app di autenticazione", + "pickIntro": "Puoi usare un’app TOTP già installata. La tabella elenca opzioni comuni: alcune gratuite, altre in abbonamento. Cambiano anche piattaforme e metodi di backup.", + "headerApp": "App", + "headerPlatforms": "Piattaforme", + "headerAppNotes": "Note", + "apps": [ + { + "name": "Google Authenticator", + "href": "https://safety.google/authentication/", + "platforms": "iOS, Android", + "notes": "Il default per molti utenti. Backup cloud opzionale di Google-account." + }, + { + "name": "Microsoft Authenticator", + "href": "https://www.microsoft.com/en-us/security/mobile-authenticator-app", + "platforms": "iOS, Android", + "notes": "Backup tramite account Microsoft. Gestisce anche le notifiche push Microsoft, se le usi al lavoro." + }, + { + "name": "Authy", + "href": "https://authy.com/", + "platforms": "iOS, Android", + "notes": "Sincronizzazione cifrata tra dispositivi. L’app desktop non è più supportata dal 19 marzo 2024." + }, + { + "name": "Apple Passwords", + "href": "https://support.apple.com/guide/passwords/welcome/mac", + "platforms": "iOS, iPadOS, macOS, visionOS, Windows (tramite iCloud)", + "notes": "Integrata nei sistemi Apple; app Passwords autonoma da iOS 18 / macOS Sequoia. Conserva TOTP con la password e sincronizza tramite Portachiavi iCloud." + }, + { + "name": "Bitwarden", + "href": "https://bitwarden.com/", + "platforms": "iOS, Android, computer, browser", + "notes": "Open source. TOTP può essere conservato con le password nell’archivio. È comodo, ma non mantiene i due fattori su dispositivi separati." + }, + { + "name": "1Password", + "href": "https://1password.com/", + "platforms": "iOS, Android, computer, browser", + "notes": "Stessa idea di Bitwarden — TOTP integrato con il caveau password. Abbonamento." + }, + { + "name": "Aegis Authenticator", + "href": "https://getaegis.app/", + "platforms": "Android", + "notes": "Open source. File di backup cifrato sul dispositivo, sotto il tuo controllo. Nessun cloud né account richiesto." + }, + { + "name": "Raivo OTP", + "href": "https://raivo-otp.com/", + "platforms": "iOS, macOS", + "notes": "Open source. Sincronizzazione iCloud facoltativa. Alternativa nell’ecosistema Apple paragonabile ad Aegis." + }, + { + "name": "Ente Auth", + "href": "https://ente.io/auth/", + "platforms": "iOS, Android, computer, web", + "notes": "Open source. Sincronizzazione cloud fra dispositivi con cifratura end-to-end." + }, + { + "name": "2FAS", + "href": "https://2fas.com/", + "platforms": "iOS, Android, estensione del browser", + "notes": "Open source. Backup cloud cifrato facoltativo; l’estensione browser può compilare automaticamente i codici." + }, + { + "name": "FreeOTP+", + "href": "https://github.com/helloworld1/FreeOTPPlus", + "platforms": "Android", + "notes": "Fork open source di FreeOTP per Android, con importazione ed esportazione. Non richiede account." + } + ], + "backupTitle": "Perché servono i backup", + "backupBody": "Se perdi il dispositivo, usa un codice di recupero salvato oppure ripristina un backup configurato in precedenza. Sincronizzazione cloud ed esportazioni variano per app: verifica che ripristinino davvero i segreti TOTP. L’accesso root all’host permette anche il recupero descritto sotto. Conserva una copia separata e sicura.", + "setupTitle": "Impostazione passo passo dal cruscotto", + "setupImageAlt": "Schermo di configurazione 2FA con codice QR e codici di backup", + "setupImageCaption": "La finestra 2FA mostra QR, segreto Base32 per inserimento manuale e otto codici di recupero monouso. Copiali prima di chiudere: non saranno mostrati di nuovo.", + "setupSteps": [ + "Installa l’app di autenticazione sul telefono o apri il gestore di password. Basta farlo una volta: la stessa app può conservare i codici di tutti i servizi protetti.", + "Accedi alla dashboard con nome utente e password.", + "Apri la scheda Sicurezza e scegli Abilita 2FA. Il dialogo mostra QR, segreto Base32 e otto codici di recupero.", + "Aggiungi la voce all’app di autenticazione:", + "Salva i codici di recupero. Conserva tutti e otto in un gestore di password, nota cifrata o copia cartacea sicura. Ciascuno funziona una volta se l’app non è disponibile.", + "Conferma inserendo il codice attuale a sei cifre dell’app nel campo \"Codice di verifica\" e invia. Cambia ogni 30 secondi: se scade mentre lo scrivi, usa il successivo.", + "Fatto. 2FA è attivo. Al prossimo accesso verrà richiesta prima la password, poi il codice attuale a sei cifre." + ], + "setupStep4Sub": [ + "Metodo semplice: nell’app scegli Aggiungi account → Scansiona QR e inquadra il codice. La voce viene nominata automaticamente, ad esempio ProxMenux Monitor (your-username), e mostra un codice a sei cifre che cambia ogni 30 secondi.", + "Alternativa manuale se non puoi scansionare, ad esempio sullo stesso telefono: Aggiungi account → Inserisci chiave di configurazione. Scegli un nome come Proxmox Monitor, incolla il segreto Base32, lascia Tipo su Basato sul tempo e salva." + ], + "testTitle": "Prova prima di uscire", + "testBody": "Mantieni la sessione attuale aperta e prova un nuovo accesso in una finestra privata subito dopo la configurazione. Se il codice fallisce, controlla gli orologi di server e telefono prima di chiudere la sessione valida. Se hai già perso l’accesso, usa un codice di recupero o modifica auth.json dalla shell dell’host.", + "lostTitle": "Autenticatore perso", + "lostIntro": "Tre metodi di recupero, dal meno al più invasivo:", + "lostItems": [ + "Usa un codice di recupero. Inserisci uno degli otto nel campo TOTP. Funziona una volta; gli altri restano validi. Dopo l’accesso, riconfigura 2FA dalle impostazioni per ottenere otto nuovi codici.", + "Ripristina l’app da cloud o backup. Con sincronizzazione configurata, installala sul nuovo dispositivo e accedi: Google, Microsoft, Authy, Apple Passwords tramite Portachiavi iCloud, Ente o 2FAS. Con un file esportato da Aegis, Raivo o FreeOTP+, installa l’app e importa il file.", + "Disattiva 2FA dalla shell dell’host. Se gli altri metodi non sono disponibili, modifica /root/.config/proxmenux-monitor/auth.json come root via SSH o console, imposta totp_enabled su false, salva e riavvia il servizio:" + ], + "lostShellOutro": "È possibile accedere solo con nome utente + password, quindi abilitare 2FA da Impostazioni.", + "disableTitle": "Disabilita 2FA", + "disableBody": "Apri Sicurezza e scegli Disattiva 2FA. POST /api/auth/totp/disable richiede password attuale e codice TOTP o di recupero valido. Elimina segreto TOTP e codici di recupero. Rimuovi la vecchia voce anche dall’app.", + "rejectedTitle": "Il codice a sei cifre viene sempre rifiutato", + "rejectedIntro": "TOTP dipende dall’ora: gli orologi di server e telefono devono differire di meno di circa 30 s. Due controlli:", + "rejectedItems": [ + "Telefono: Impostazioni → Data e ora → sincronizzazione automatica / di rete attiva.", + "Host Proxmox: timedatectl status dovrebbe mostrare \"System clock synchronized: yes\". Altrimenti esegui timedatectl set-ntp true e attendi un minuto." + ], + "rejectedOutro": "Quando gli orologi sono sincronizzati, il codice viene accettato nella successiva finestra di 30 secondi." + }, + "apiTokens": { + "heading": "Token API di lunga durata", + "intro": "Le sessioni scadono dopo 24 ore. Per Homepage, Home Assistant, Grafana o Uptime Kuma crea un token API valido 365 giorni. Il JWT usa lo stesso segreto di firma; il campo token_name permette di identificarlo e revocarlo singolarmente.", + "imageAlt": "Pannello di token API con nome, prefisso, data e scadenza", + "imageCaption": "Elenco token nelle impostazioni: nome, prefisso con ultimi quattro caratteri di identificazione, date di creazione e scadenza, revoca.", + "generateTitle": "Generare un token", + "generateIntro": "Dal cruscotto:", + "generateSteps": [ + "Apri Sicurezza → Token di accesso API.", + "Assegna un nome descrittivo, ad esempio \"Home Assistant\".", + "Reinserisci la password e, con 2FA attivo, il codice attuale a sei cifre.", + "Premi Genera token. Compare una sola volta: copialo subito." + ], + "generateCli": "Dalla riga di comando:", + "useTitle": "Usare un token", + "revokeTitle": "Revocare un token", + "revokeBody": "Ogni riga offre Revoca, che aggiunge l’hash a revoked_tokens in auth.json. Il token viene rifiutato dalla richiesta successiva.", + "cheatTitle": "Scheda di sicurezza token", + "cheatItems": [ + "Conserva i token nel sistema di segreti dell’integrazione: Homepage secrets.yaml, Home Assistant !secret o variabili d’ambiente. Non inserirli mai in Git.", + "Un token per integrazione, con il suo nome. Revocalo quando rimuovi l’integrazione.", + "Ruotare ogni 6–12 mesi. La scadenza è un limite duro, non una raccomandazione." + ], + "outro": "Indicazioni di archiviazione ed esempi: Riferimento API → Gestione token e Integrazioni." + }, + "https": { + "heading": "HTTPS", + "intro": "Due percorsi per TLS:", + "items": [ + "Proxy inverso consigliato. Termina TLS su Nginx / Caddy / Traefik e inoltra HTTP al processo Flask sulla porta 8008. Esempi sotto.", + "HTTPS diretto nell’AppImage. Configura un certificato con POST /api/ssl/configure (interfaccia: Impostazioni → SSL). HTTPS usa gevent.pywsgi con il gestore standard; flask-sock gestisce WebSocket per WSS. I percorsi sono salvati nella configurazione SSL." + ], + "calloutTitle": "Limitazioni dirette HTTPS", + "calloutBody": "Monitor può usare un certificato gestito da Proxmox o file personalizzati. Non emette certificati ACME. Per emissione e rinnovo automatici usa Proxmox ACME o un proxy Caddy, Traefik o Nginx e assicurati che i certificati rinnovati vengano caricati." + }, + "gateway": { + "heading": "Gateway sicuro (Tailscale)", + "intro": "Un proxy inverso consente l’accesso remoto. Secure Gateway evita di esporre TCP 8008: distribuisce un LXC Alpine con Tailscale come router di sottorete. L’accesso all’IP LAN dell’host dipende da rotte approvate e regole della tailnet.", + "calloutTitle": "Perché questo è conveniente", + "calloutBody": "Usa l’URL LAN http://<proxmox-lan-ip>:8008 tramite la rotta approvata. I router Tailscale usano SNAT per impostazione predefinita: Monitor vede normalmente l’IP LAN del gateway, non l’indirizzo 100.x.y.z del client. Registri e Fail2Ban identificano l’origine effettivamente ricevuta dall’host.", + "deployBody": "In una schermata scegli lo storage LXC, incolla una chiave Tailscale creata su login.tailscale.com/admin/settings/keys, scegli le sottoreti e distribuisci. Il LXC si inizializza in circa 30 secondi e si registra nella tailnet.", + "outro": "Distribuzione, rotte di sottorete, ACL Tailscale e modalità Exit Node sono descritte in Dashboard → Sicurezza → Secure Gateway, dove si trova la procedura guidata. Qui viene descritto l’accesso." + }, + "proxy": { + "heading": "Snippet del proxy inverso", + "intro": "Usa un nome host dedicato, come monitor.example.com, inoltrato alla porta 8008 dell’host Proxmox. Gli esempi seguono questo schema. Un sottopercorso come example.com/proxmenux-monitor/ richiede modifiche a frontend e proxy: rimuovere il prefisso non basta.", + "nginxTitle": "Nginx", + "caddyTitle": "Caddy", + "traefikTitle": "Traefik (etichette — Docker / Kubernetes)", + "subPathTitle": "Avanzato: distribuzione in un sottopercorso", + "subPathBody": "Il frontend attuale non ha una base per sottopercorsi e costruisce chiamate dalla radice con URL /api/*. Rimuovere un prefisso come example.com/proxmenux-monitor/ non gestisce queste chiamate né tutti i file frontend. Usa un nome host dedicato. Un sottopercorso richiede modifiche coordinate e verifiche specifiche." + }, + "audit": { + "heading": "Registro di audit", + "intro": "Errori di accesso e avvisi sui limiti vengono scritti, una riga per evento, in /var/log/proxmenux-auth.log. Questo logger non registra gli accessi riusciti:", + "outro": "Segui il registro con tail -F /var/log/proxmenux-auth.log. Una configurazione aggiuntiva di logrotate ne gestisce la rotazione; Monitor non la esegue." + }, + "fail2ban": { + "heading": "Facoltativo: jail di Fail2Ban", + "calloutTitle": "Fail2Ban non è in bundle con il Monitor", + "calloutBody": "Fail2Ban non viene installato da Monitor. Installalo da Sicurezza → Fail2Ban nel menu ProxMenux o dal pacchetto Debian. Senza di esso resta il registro, ma non il blocco automatico degli IP.", + "intro": "L’integrazione ProxMenux fornisce una jail [proxmenux] che:", + "items": [ + "Legge /var/log/proxmenux-auth.log.", + "Abbina il modello authentication failure; rhost=<ip> con un filtro dedicato.", + "Blocca normalmente l’IP responsabile nel firewall del kernel.", + "L’hook Flask before_request confronta le richieste con l’elenco di blocco, in cache per 30 s. Dietro un proxy inverso, il blocco per IP richiede anche PROXMENUX_TRUST_PROXY=1 e un proxy controllato che imposti header affidabili." + ], + "outro": "Configurazione, durata dei blocchi e sblocco: Sicurezza → Fail2Ban." + }, + "troubleshoot": { + "heading": "Risoluzione dei problemi", + "noScreenTitle": "Lo schermo del primo lancio non appare mai", + "noScreenBody": "L’autenticazione è già configurata (configured: true) oppure è stata saltata. Per ricominciare:", + "noScreenOutro": "Cancella autenticazione, segreti TOTP e token API. Salva prima una copia di auth.json se vuoi conservarli.", + "tokenTitle": "HTTP 401 su ogni richiesta da un token API funzionante", + "tokenBody": "Token scaduto (365 d limit) o entrato nell'elenco revoked_tokens. Generare uno nuovo in Impostazioni e aggiornare l'integrazione. Per verificare:", + "tokenOutro": "Token scaduti o revocati restituiscono '{'\"error\":\"Invalid or expired token\"'}'.", + "no2faTitle": "Non è possibile accedere dopo aver abilitato 2FA, nessun autenticatore a portata di mano", + "no2faBody": "Utilizzare un codice di backup nel campo TOTP. Se questi sono andati, modificare /root/.config/proxmenux-monitor/auth.json da una shell host, impostare totp_enabled a false, riavviare il servizio.", + "wsTitle": "Il proxy inverso funziona ma la scheda terminale si disconnette ogni minuto", + "wsBody": "Timeout di inattività WebSocket del proxy. Aumenta il limite di lettura (Nginx: proxy_read_timeout 86400s; Traefik: idleTimeout nell’entry point o middleware). Per Nginx verifica proxy_set_header Upgrade $http_upgrade e Connection \"upgrade\"." + }, + "whereNext": { + "heading": "Prossimi passi", + "items": [ + { + "label": "Riferimento API → Gestione token", + "href": "/docs/monitor/api", + "tail": " — creare, elencare e revocare token API; sicurezza e archiviazione dei segreti." + }, + { + "label": "Integrazioni", + "href": "/docs/monitor/integrations", + "tail": " — Homepage, Home Assistant, Grafana / Prometheus, Uptime Kuma ed esempi cURL." + }, + { + "label": "Dashboard → Sicurezza → Secure Gateway", + "href": "/docs/monitor/dashboard/security", + "tail": " — distribuire il LXC gateway Tailscale: rotte di sottorete, ACL e modalità Exit Node." + }, + { + "label": "Sicurezza → Fail2Ban", + "href": "/docs/security/fail2ban", + "tail": " — installare e configurare la jail facoltativa." + }, + { + "label": "Impostazioni → ProxMenux Monitor", + "href": "/docs/settings/proxmenux-monitor", + "tail": " — avviare e fermare il servizio systemd dalla TUI ProxMenux." + } + ] + } +} diff --git a/web/messages/it/docs/monitor/ai-assistant.json b/web/messages/it/docs/monitor/ai-assistant.json new file mode 100644 index 00000000..c60581f6 --- /dev/null +++ b/web/messages/it/docs/monitor/ai-assistant.json @@ -0,0 +1,342 @@ +{ + "meta": { + "title": "Assistente IA Proxmox — OpenAI, Claude, Gemini, Groq, Ollama | ProxMenux Monitor", + "description": "L’assistente IA facoltativo riscrive le notifiche Proxmox VE in un linguaggio chiaro. Sei provider: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter e Ollama. L’interfaccia offre tredici lingue, tre livelli di dettaglio per canale, prompt personalizzati con una raccolta della comunità e contesto con tempo di attività, ricorrenza e dati SMART.", + "ogTitle": "Assistente AI Proxmox — OpenAI, Claude, Gemini, Groq, Ollama", + "ogDescription": "Riscrivi le notifiche Proxmox VE in un linguaggio chiaro con OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter o Ollama locale.", + "twitterTitle": "Assistente IA per Proxmox | ProxMenux Monitor", + "twitterDescription": "Riscrivi le notifiche Proxmox VE in un linguaggio chiaro con OpenAI, Anthropic, Gemini, Groq, OpenRouter o Ollama locale." + }, + "header": { + "title": "Assistente AI", + "description": "La riscrittura IA facoltativa trasforma le notifiche idonee in messaggi chiari, con dettaglio per canale, tredici lingue nell’interfaccia, prompt personalizzati, raccolta pubblica della comunità e contesto aggiuntivo. I rapporti backup_complete e backup_fail escludono completamente l’IA.", + "section": "Monitor di ProxMenux" + }, + "intro": { + "title": "Off per impostazione predefinita, singolo interruttore per abilitare", + "body": "La riscrittura IA è disattivata per impostazione predefinita. Attivala in Impostazioni → Notifiche → Avanzate: miglioramento IA. Se il contesto aggiuntivo o la riscrittura falliscono, viene inviato il modello originale. Ogni riscrittura ha un tempo limite di 25 secondi; allo scadere si usa il modello senza attendere indefinitamente." + }, + "howItWorks": { + "heading": "Come funziona", + "intro": "Gli eventi inviati da Monitor seguono lo stesso processo. La riscrittura IA è una fase facoltativa tra il testo del modello e l’invio al canale. Un evento attraversa quattro passaggi:", + "steps": [ + "Evento e modello. Un evento arriva da uno dei sei raccoglitori. notification_templates.py lo formatta come testo semplice strutturato, che il canale invierebbe senza riscrittura IA.", + "Arricchimento del contesto. Il sistema di invio aggiunge i segnali pertinenti all’evento: tempo di attività per guasti critici del sistema, frequenza degli eventi, dati SMART per i dischi, corrispondenze nel database degli errori noti e righe di log.", + "Creazione del prompt. Il prompt di sistema unisce modello e impostazioni del canale: lingua, dettaglio, regole emoji dei Messaggi arricchiti e suggerimenti IA se attivi. In modalità personalizzata, il tuo prompt sostituisce completamente quello di sistema. Il messaggio utente contiene testo del modello e blocchi di contesto.", + "Chiamata al provider. Groq, OpenAI, Anthropic, Gemini, Ollama o OpenRouter restituisce titolo e testo riscritti. Il sistema di invio analizza la risposta, sostituisce questi contenuti per il canale e li passa all’adattatore di consegna." + ], + "notesIntro": "Tre dettagli che vale la pena tenere a prima di leggere il resto di questa pagina:", + "notes": [ + "L’IA non crea eventi. Ogni evento nasce da un segnale reale: controllo di integrità, riga di log, webhook PVE, ecc. Il testo viene prodotto dal modello prima di arrivare all’IA, che traduce e riformatta senza monitorare il sistema.", + "L'AI funziona per canale. Telegram e Discord possono usare una breve riscrittura mentre l'Email riceve un report dettagliato — stesso evento, forma diversa, tutti da una chiamata del fornitore per canale.", + "In caso di errore si usa il modello. Se il provider restituisce un errore 5xx, supera il tempo limite, produce un formato errato o rifiuta la richiesta, il sistema registra l’errore e invia il testo originale del modello per quel canale." + ] + }, + "enabling": { + "heading": "Abilitare il pannello", + "intro": "La configurazione AI vive nella parte inferiore del pannello Notifiche all'interno della scheda Impostazioni, come un blocco pieghevole Advanced: AI Enhancement. Fare clic sull'intestazione per espandere:", + "collapsedAlt": "Intestazione AI avanzata collassata con indicatore chevron", + "collapsedCaption": "Chiuso per impostazione predefinita; un clic espande il pannello.", + "panelAlt": "Pannello IA aperto con interruttore principale, provider Google Gemini, chiave API nascosta, modello gemini-2.5-flash, prompt predefinito, lingua inglese, dettaglio per Telegram, Discord, Gotify ed e-mail, suggerimenti IA e test di connessione", + "panelCaption": "Il pannello completo AI Enhancement — ogni controllo documentato in questa pagina mappa a uno dei campi sopra.", + "outro": "Dall’alto: interruttore Messaggi migliorati con IA, scelta del provider e finestra informativa, chiave API o URL Ollama, elenco dei modelli caricato dopo la chiave, modalità Predefinita / Personalizzata, lingua, dettaglio per canale, Suggerimenti IA e pulsante Verifica connessione che invia un messaggio di prova al provider per verificare le credenziali." + }, + "context": { + "heading": "Quale contesto riceve l'AI", + "intro": "Prima della costruzione del prompt, il dispacciatore passa una routine di arricchimento del contesto che decide quali segnali aggiuntivi sono rilevanti per l'evento a portata di mano. L'obiettivo è quello di dare al LLM abbastanza informazioni per produrre un messaggio utile, senza inondarlo (e il portafoglio) con rumore che non si applica. Cinque blocchi di contesto possono essere aggiunti al messaggio utente:", + "headerBlock": "Blocco", + "headerWhen": "Quando viene iniettato", + "headerWhat": "Che cosa porta", + "rows": [ + { + "block": "Tempo di attività sistema", + "when": "Solo per guasti critici del sistema: crash, panic, oom, kernel, split_brain, quorum_lost, node_offline, node_fail, system_fail, boot_fail. Viene omesso per errori dei dischi, avvisi e operazioni ordinarie per mantenere il prompt conciso.", + "what": "Una linea come System uptime: 14 days (stable system). Consente al LLM di distinguere i problemi di avvio da guasti di lunga durata." + }, + { + "block": "Frequenza dell'evento", + "when": "Sempre, quando il Monitor ha visto la stessa impronta.", + "what": "Numero di occorrenze, data e ora della prima rilevazione e tipo di andamento facoltativo: ricorrente, isolato o picco. Il modello distingue così un problema ricorrente da uno visto per la prima volta." + }, + { + "block": "Dati SMART", + "when": "Solo per eventi relativi al disco (tipo di evento contiene disk, smart, storage, io_error, o il corpo menziona /dev/sd, ata, i/o error).", + "what": "Uscita di smartctl per il dispositivo interessato — salute generale (PASSED / FAILED) più gli attributi rilevanti per la modalità di guasto." + }, + { + "block": "Database degli errori noti", + "when": "Quando il testo o i log corrispondono a uno schema di errore specifico di Proxmox incluso in Monitor.", + "what": "Un blocco KNOWN PROXMOX ERROR DETECTED con la causa abbinata e una soluzione concreta. Il prompt istruisce il LLM a tradurre questo verbatim — nessun parafrasamento della correzione raccomandata." + }, + { + "block": "Log di sistema", + "when": "Quando il raccoglitore originario ha acquisito righe di log per l’evento, soprattutto nel monitoraggio dei log e delle attività.", + "what": "Estratti originali di journalctl. Il prompt chiede al modello di estrarre ID, date e ore e indizi sulla causa principale, ignorando le voci non pertinenti." + } + ], + "afterBlocks": "Una volta che questi blocchi sono uniti, il messaggio utente inviato al LLM ha questa forma:", + "calloutTitle": "Nessuna telemetria oltre l'evento stesso", + "calloutBody": "Monitor invia solo i dati disponibili per l’evento corrente: nessuna telemetria generale, serie storica di metriche o esportazione dell’inventario. I cinque blocchi indicati sono il limite del contenuto inviato per una riscrittura IA." + }, + "tokens": { + "heading": "Tokens — che cosa sono e come sono consumati", + "intro1": "I provider commerciali fatturano i token. Un token equivale indicativamente a quattro caratteri inglesi o tre quarti di una parola. La frase inglese \"Backup completed on storage local-bak\" contiene circa otto token. Dieci righe di log possono richiedere 200–400 token, secondo la densità tecnica.", + "intro2": "Due cose sono fatturate su ogni chiamata:", + "items": [ + "Token in ingresso: prompt di sistema e messaggio utente con gravità, titolo, testo del modello e contesto aggiuntivo. La quantità dipende da prompt ed evento. Ogni canale riscritto può consumare i propri token; i rapporti di backup completato o fallito escludono l’IA.", + "Token in uscita: la risposta del modello. Monitor li limita con max_tokens. Il tetto è un limite, non un consumo fisso: se il modello produce 250 token con un limite di 1500, paghi per 250." + ], + "capsIntro": "Questi sono i limiti effettivi applicati dal sistema di invio, definiti in AI_DETAIL_TOKENS in notification_templates.py:", + "headerLevel": "Livello di dettaglio", + "headerCap": "Limite di uscita (token)", + "headerConsumption": "Tipico consumo reale", + "capRows": [ + { + "level": "breve", + "cap": "500", + "consumption": "Token di uscita 50-200 per eventi brevi." + }, + { + "level": "standard", + "cap": "1500", + "consumption": "200–700 token in uscita per eventi tipici con poco contesto." + }, + { + "level": "dettagliato", + "cap": "3000", + "consumption": "Token di uscita 500-2000 per report e-mail completi con tabelle di log e SMART." + } + ], + "customNote": "La modalità con prompt personalizzato limita l’uscita a 500 token, indipendentemente dal livello di dettaglio. Il prompt è sotto il tuo controllo e il limite evita risposte eccessive.", + "sizingTitle": "Pratico dimensionamento", + "sizingBody": "Stima il consumo come eventi riscritti × canali IA × token in ingresso e uscita per chiamata. Esempio: 50 eventi × un canale × (500 in ingresso + 300 in uscita) = 40.000 token al giorno. Consumi e costi dipendono da modello, contesto, cache e limiti del provider. Dettaglio per canale spiega come usare brief nelle chat invece di standard, mantenendo e-mail dettagliate." + }, + "providers": { + "heading": "Fornitori di AI", + "intro": "Monitor integra sei provider. Il menu li mostra tutti e il pulsante informativo accanto apre una finestra con una breve descrizione di ciascuno. Di seguito trovi URL per la chiave API, descrizioni dell’interfaccia e note dal codice.", + "imageAlt": "Finestra informativa dei sei provider IA: Groq, OpenAI, Anthropic Claude, Google Gemini, Ollama e OpenRouter, con icona, breve descrizione e nota sulle API compatibili con OpenAI", + "imageCaption": "In-app modal — sei carte, una per fornitore, con le stesse descrizioni documentate di seguito.", + "groq": { + "heading": "Groq", + "tagline": "Molto veloce, generoso tier libero (30 req/min). Ideale per iniziare.", + "items": [ + "Chiave API: console.groq.com/keys", + "Esempi dall’elenco di modelli incluso: allam-2-7b, qwen/qwen3.8-27b, openai/gpt-oss-20b, groq/compound-mini.", + "Raccomandazione inclusa: openai/gpt-oss-20b. Verifica la disponibilità per il tuo account tramite il selettore del provider e il test di connessione." + ] + }, + "openai": { + "heading": "OpenAI", + "tagline": "Standard di settore. Molto accurato e ampiamente usato.", + "items": [ + "Chiave API: platform.openai.com/api-keys", + "Esempi dall’elenco di modelli incluso: gpt-4.1-nano, gpt-4.1-mini, gpt-4o-mini, gpt-4.1, gpt-4o, gpt-5-nano.", + "Raccomandazione inclusa: gpt-4.1-nano. L’adattatore gestisce anche i requisiti dei modelli di ragionamento; la lista include gpt-5-nano, quindi questi modelli non sono esclusi in generale." + ], + "baseUrlTitle": "URL di base compatibile con OpenAI", + "baseUrlBody": "Il provider OpenAI accetta un URL di base personalizzato per endpoint compatibili, come BytePlus / ByteDance (Kimi K2.5), LocalAI, LM Studio, vLLM, Together AI e Fireworks AI, che usano il formato /v1/chat/completions. Imposta l’URL nella scheda OpenAI accanto alla chiave API." + }, + "anthropic": { + "heading": "Anthropic (Claude)", + "tagline": "Eccellente per la scrittura e la traduzione. Veloce ed economico.", + "items": [ + "Chiave API: console.anthropic.com/settings/keys", + "Esempi dall’elenco di modelli incluso: claude-haiku-4-5-20251001, claude-sonnet-4-6, claude-opus-4-6.", + "Raccomandazione inclusa: claude-haiku-4-5-20251001. Questa versione precisa è configurata come consigliata; le vecchie voci Claude 3.5 non sono più nella lista inclusa." + ] + }, + "gemini": { + "heading": "Google Gemini", + "tagline": "Piano gratuito disponibile, buon rapporto qualità/prezzo.", + "items": [ + "Chiave API: aistudio.google.com/app/apikey", + "Esempi dall’elenco di modelli incluso: gemini-2.5-flash-lite, gemini-2.5-flash, gemini-3-flash-preview.", + "Raccomandato: gemini-2.5-flash-lite — flash e flash-lite passano costantemente il verificatore. Le varianti pro rifiutano il thinkingBudget=0 impostando il Monitor utilizza e sono overkill per questo carico di lavoro." + ] + }, + "openrouter": { + "heading": "OpenRouter", + "tagline": "Aggregatore con accesso a oltre 100 modelli tramite una sola chiave API. Massima flessibilità.", + "items": [ + "Chiave API: openrouter.ai/keys", + "Esempi dall’elenco di modelli incluso: meta-llama/llama-3.3-70b-instruct, meta-llama/llama-3.1-70b-instruct, meta-llama/llama-3.1-8b-instruct, anthropic/claude-haiku-4.5, google/gemini-2.5-flash-lite, openai/gpt-4o-mini, mistralai/mistral-medium-3.", + "Raccomandato: meta-llama/llama-3.3-70b-instruct — stesso modello della voce Groq ma percorso attraverso OpenRouter, che significa una singola chiave per tutti i modelli elencati." + ] + }, + "ollama": { + "heading": "Ollama (locale)", + "tagline": "Usa i modelli esposti dal server Ollama configurato. I modelli locali vengono eseguiti lì; i modelli cloud inoltrano le richieste a un provider esterno. L’esecuzione locale evita costi di API ospitate, ma usa hardware ed elettricità tuoi.", + "items": [ + "Nessuna chiave API. Impostare il campo Ollama URL sul server (default http://localhost:11434 o qualsiasi host esegue l'istanza Ollama).", + "Modelli non filtrati. Monitor legge i modelli scaricati con ollama pull <model>. L’elenco viene caricato da GET /api/tags sul server Ollama.", + "Installazione: ollama.com/download — Linux, macOS e Windows. Scegli un modello che rientri nella RAM e abbia una finestra di contesto sufficiente per i blocchi di log aggiunti dal sistema di invio." + ] + } + }, + "models": { + "heading": "Perché questi modelli specifici", + "intro": "La scelta dei modelli commerciali usa il catalogo incluso verified_ai_models.json e i controlli di disponibilità degli adattatori. Questi convertono la richiesta interna system_prompt + user_message + max_tokens nel formato di ciascuna API. Il catalogo contiene voci testate e aggiunte manuali; non garantisce accesso attuale né lo stesso test di verifica per ogni modello.", + "consequencesIntro": "Due conseguenze che meritano di essere consapevoli di:", + "consequences": [ + "La raccomandazione inclusa è un punto di partenza per le notifiche. Valuta qualità linguistica, latenza e costo con i tuoi eventi e il tuo account; non è una classifica universale.", + "Puoi scegliere un altro modello elencato secondo quota e preferenze. Verifica la disponibilità con il test di connessione: essere in lista non garantisce l’accesso attuale." + ], + "ollamaTitle": "Ollama è l'eccezione", + "ollamaBody": "La lista Ollama non è filtrata dal catalogo commerciale: mostra i modelli del server. Per l’esecuzione locale scegli un modello locale compatibile con RAM e contesto dei log. I modelli cloud restano remoti anche tramite un server Ollama locale." + }, + "defaultPrompt": { + "heading": "Prompt predefinito", + "intro": "In modalità Predefinita, Monitor usa il prompt di sistema seguente. Prima della chiamata sostituisce i segnaposto: '{'language'}', '{'detail_level'}', '{'emoji_instructions'}', '{'suggestions_addon'}'. Seguono le varianti per canali formattati o semplici e l’aggiunta per i suggerimenti IA.", + "showFullSummary": "Mostra il prompt completo del sistema predefinito", + "passagesIntro": "Due varianti di testo vengono scelte in base al controllo Messaggi arricchiti di ogni canale:", + "passages": [ + "Rich on → un blocco emoji viene iniettato elencando le icone che l'LLM può utilizzare, più una regola hostname (il LLM deve mantenere il prefisso hostname dal titolo verbatim) e una manciata di esempi formattati (avvio di backup, completo di backup, aggiornamenti, avvio VM, degradato di salute). Questo è ciò che produce i messaggi prefissi emoji su Telegram e Discord.", + "Rich off → un blocco a una linea dice al LLM di utilizzare solo ASCII normale — senza emoji, senza simboli Unicode. Utilizzato per e-mail e qualsiasi canale in cui la formattazione del rumore fa male alle regole di inbox o alla leggibilità." + ], + "suggestionsPlaceholder": "E il segnaposto '{'suggestions_addon'}' è vuoto a meno che non si abilitano suggerimenti AI (sezione successiva), nel qual caso questo blocco viene iniettato:", + "showAddonSummary": "Mostra il componente dei suggerimenti IA" + }, + "customPrompt": { + "heading": "Modalità prompt personalizzato", + "intro": "La modalità Personalizzata sostituisce tutto il prompt di sistema con il tuo testo. Viene salvato nelle impostazioni SQLite e inviato senza modifiche a ogni chiamata IA. Puoi così scegliere tono, struttura e obiettivi diversi.", + "imageAlt": "Prompt personalizzato con area di testo per le regole di traduzione, pulsanti Esporta e Importa e collegamento ai prompt della comunità", + "imageCaption": "Custom Prompt — grande area di testo con il prompt dell'utente, più Export, Import e un collegamento alla galleria della comunità su GitHub.", + "changesTitle": "Cosa cambia in modalità personalizzata", + "changes": [ + "Il prompt predefinito viene sostituito interamente. Le mappe Proxmox, le regole di gestione del contesto e le istruzioni emoji sono sparite. Se si desidera mantenere uno qualsiasi di loro, incollarli nel prompt — il bundle EXAMPLE_CUSTOM_PROMPT mostrato di seguito è un punto di partenza.", + "Il selettore linguistico viene ignorato. Il prompt predefinito ha un segnaposto '{'language'}'; il prompt personalizzato non lo fa. Se si desidera l'output in una lingua specifica, dichiararlo all'interno del prompt (\"Traduzione in spagnolo\", \"Output tutto in francese\").", + "Il limite personalizzato resta fisso a 500 token, indipendentemente dal dettaglio salvato per canale. La modalità predefinita usa 500 / 1500 / 3000. Modificare il prompt non aumenta il limite: chiedi risposte più brevi o usa un dettaglio predefinito adeguato.", + "I marcatori di uscita restano obbligatori. Includi [TITLE] e [BODY] nel formato di risposta. Il parser ne estrae il contenuto; se manca un marcatore, restituisce il modello originale.", + "Le regole emoji dei messaggi Rich non vengono iniettate automaticamente. Se si desidera emojis, indicare il prompt di utilizzarli. Se vuoi un testo normale, diglielo. La funzione di attivazione passa solo i blocchi in bundle del prompt predefinito, non la stringa personalizzata." + ], + "starterTitle": "Avvio del prompt", + "starterIntro": "Il campo Prompt personalizzato contiene inizialmente un esempio minimo che puoi adattare:", + "showStarterSummary": "Mostra il prompt personalizzato starter", + "shareTitle": "Condividere i prompt con la comunità", + "shareIntro": "Il pulsante Esporta salva il prompt in un file (.txt / .md) da conservare come backup o condividere. Importa carica un file. Il terzo pulsante apre la raccolta pubblica della comunità su GitHub:", + "shareLinkLabel": "github.com/MacRimi/ProxMenux/discussions — Condividi prompt personalizzati per notifiche IA", + "shareOutro": "Sfoglia la discussione per vedere i prompt di altri amministratori: avvisi molto brevi, rapporti tecnici dettagliati e varianti linguistiche. Se sei soddisfatto della tua versione, condividila con un paragrafo che ne spieghi l’obiettivo. Sono graditi anche riscontri su cosa funziona e cosa no." + }, + "suggestions": { + "heading": "Suggerimenti IA (BETA)", + "intro": "I suggerimenti IA permettono di aggiungere un consiglio breve e pratico in fondo al testo. Richiedono modalità Predefinita, IA e Suggerimenti IA attivi. Il prompt chiede di ometterlo se causa o soluzione non sono chiare.", + "formatIntro": "Quando viene aggiunto un consiglio, segue questo formato:", + "rulesIntro": "Le regole incluse nel componente, visibili nel blocco espandibile della sezione Prompt predefinito:", + "rules": [ + "Il suggerimento è incluso solo se il contesto del journal o il database degli errori noti indica chiaramente una correzione specifica.", + "Il prompt chiede un consiglio sotto i 100 caratteri; il parser non ne verifica separatamente la lunghezza.", + "Il prompt richiede un comando o percorso preciso e chiede al modello di evitare consigli generici.", + "Se un errore noto fornisce una soluzione, il LLM deve usare quella soluzione, non inventarne una nuova.", + "Il prompt chiede di omettere il consiglio se i dati non supportano una soluzione concreta." + ], + "betaTitle": "Perché BETA", + "betaBody": "La qualità dei consigli dipende dal modello scelto e dal contesto dei log. Un modello come Claude 3.5 Haiku, GPT-4.1 Mini o Llama 3.3 70B, con dati smartctl e log, può dare consigli utili. Un piccolo modello Ollama locale con un evento di una riga può produrre un risultato poco utile o nessun consiglio. Disattiva i suggerimenti se disturbano e riattivali quando vuoi." + }, + "detailLevel": { + "heading": "Livello di dettaglio per canale", + "intro": "Telegram, Discord, Gotify ed e-mail hanno ciascuno una scelta del dettaglio. Tre valori regolano i limiti dei token e le istruzioni del prompt predefinito:", + "headerLevel": "Livello", + "headerLabel": "Etichetta UI", + "headerCap": "Limite di uscita", + "headerProduce": "Che cosa il prompt chiede al LLM di produrre", + "rows": [ + { + "level": "breve", + "label": "2–3 righe, solo l’essenziale", + "cap": "500 token", + "produce": "\"Cosa è successo + dove\". Nient'altro." + }, + { + "level": "standard", + "label": "Concisa con contesto di base", + "cap": "1500 token", + "produce": "3–6 righe: cosa, dove, causa, dispositivi coinvolti." + }, + { + "level": "dettagliato", + "label": "Dettagli tecnici completi", + "cap": "3000 token", + "produce": "Rapporto completo: cosa, dove, causa, dispositivi coinvolti, log, dati SMART e cronologia." + } + ], + "defaultsIntro": "Impostazioni predefinite alla prima installazione:", + "defaults": [ + "Telegram, Discord, Gotify — standard.", + "Email — detailed. Email è il canale in cui si desidera in genere l'immagine completa per l'archiviazione." + ], + "emailTitle": "Il livello di dettaglio e-mail aggiunge l'originale", + "emailBody": "Se il formattatore IA restituisce un risultato per l’e-mail in detailed e il testo originale supera 50 caratteri, lo aggiunge dopo 40 trattini e Original message:. I dettagli restano disponibili per ricerche future. Se l’IA viene saltata o fallisce, può essere inviato solo il modello originale." + }, + "language": { + "heading": "Lingua", + "intro": "Il selettore offre tredici lingue. Salva ai_language, usato dal prompt predefinito in \"translate alerts into '{'language'}'\". L’elenco:", + "list": "Inglese (en), slovacco (sk), spagnolo (es), francese (fr), tedesco (de), portoghese (pt), italiano (it), russo (ru), svedese (sv), norvegese (no), giapponese (ja), cinese (zh), olandese (nl).", + "rulesIntro": "Due importanti regole prese direttamente dal prompt:", + "rules": [ + "Tradurre: etichette, descrizioni, stati e unità, per esempio GB → Go in francese.", + "Non tradurre: nomi host, IP, percorsi, ID VM/CT, nomi dei dispositivi come /dev/sdX, identificatori tecnici. Questi rimangono verbatim indipendentemente dalla lingua." + ], + "customNote": "Il prompt personalizzato non usa il selettore della lingua. Se vuoi una lingua specifica, dichiarala nel prompt." + }, + "templates": { + "heading": "Una nota sui modelli", + "body1": "L’IA riceve il testo già prodotto da un modello, non dati grezzi. Tipi come vm_start, auth_fail e health_degraded hanno modelli in notification_templates.py. L’IA riscrive i testi idonei; backup_complete e backup_fail mantengono rapporti deterministici senza IA.", + "body2": "Due implicazioni pratiche: l'IA non vede mai un hostname o VMID che deve inventare — quei campi sono posti dal modello prima della riscrittura. E se l'IA è disabilitata, il corpo modello è quello che viene inviato direttamente. La pagina Notifications documenta la pipeline di spedizione in pieno ed è la giusta cross-referenza per tutto ciò che accade ad un evento prima che raggiunga questo livello." + }, + "privacy": { + "heading": "Privacy e flusso dati", + "intro": "Con la riscrittura AI abilitata, il Monitor invia il corpo di notifica reso più i blocchi di contesto arricchiti al provider configurato. Ciò può includere nomi host, IP, nomi utente, percorsi di dispositivo, linee di registro di giornale e attributi SMART per il dispositivo interessato. Se questo lascia l'host dipende da quale fornitore hai scelto:", + "headerProvider": "Fornitore", + "headerDestination": "Destinazione dei dati", + "rows": [ + { + "provider": "Ollama", + "destination": "I modelli locali vengono eseguiti sull’host Ollama configurato. Se è il nodo Proxmox, le richieste restano lì. I modelli cloud inoltrano le richieste all’esterno anche tramite un server Ollama locale." + }, + { + "provider": "OpenAI", + "destination": "api.openai.com per impostazione predefinita o l’URL di base personalizzato. Si applica la politica sui dati del gestore effettivo dell’endpoint." + }, + { + "provider": "Anthropic", + "destination": "api.anthropic.com." + }, + { + "provider": "Google Gemini", + "destination": "generativelanguage.googleapis.com." + }, + { + "provider": "Groq", + "destination": "api.groq.com." + }, + { + "provider": "OpenRouter", + "destination": "openrouter.ai inoltra al provider del modello scelto nel campo model. Due passaggi invece di uno." + } + ], + "calloutTitle": "Se i contenuti degli eventi non possono lasciare la rete", + "calloutBody": "Usa un endpoint ospitato localmente con un modello locale, come Ollama o un server compatibile OpenAI, oppure disattiva l’IA. I modelli cloud Ollama non elaborano i dati localmente. Il sistema non anonimizza nomi host o IP: crea il prompt dal contenuto reale dell’evento." + }, + "whereNext": { + "heading": "Come proseguire", + "items": [ + { + "label": "Notifiche", + "href": "/docs/monitor/notifications", + "tail": "— la pipeline di spedizione, i canali, le regolazioni per evento e l'integrazione PVE webhook che circonda questo strato." + }, + { + "label": "Monitoraggio integrità", + "href": "/docs/monitor/health-monitor", + "tail": "— il più grande produttore singolo di eventi l'AI finisce per riscrivere, con le proprie durate di soppressione per categoria." + }, + { + "label": "Architettura", + "href": "/docs/monitor/architecture", + "tail": "— dove l'AI Enhancer si inserisce nel più ampio processo Monitor (è un modulo, non un servizio separato)." + } + ], + "communityLabel": "Prompt della comunità su GitHub", + "communityTail": "— navigare, condividere, chiedere." + } +} diff --git a/web/messages/it/docs/monitor/api-reference.json b/web/messages/it/docs/monitor/api-reference.json new file mode 100644 index 00000000..4e8b149d --- /dev/null +++ b/web/messages/it/docs/monitor/api-reference.json @@ -0,0 +1,760 @@ +{ + "meta": { + "title": "API Proxmox Monitor — Riferimento per le integrazioni | ProxMenux", + "description": "Endpoint HTTP di ProxMenux Monitor per Home Assistant, Homepage, Grafana, Prometheus, n8n e pannelli personalizzati. Consultazione dello stato e operazioni documentate: controllo VM, avvio backup, notifiche e conferma degli avvisi.", + "ogTitle": "API Proxmox Monitor — Riferimento per le integrazioni", + "ogDescription": "Endpoint di ProxMenux Monitor per Home Assistant, Homepage, Grafana, Prometheus, n8n e pannelli personalizzati.", + "twitterTitle": "Monitor Proxmox API | ProxMenux", + "twitterDescription": "Endpoint per Home Assistant, Homepage, Grafana, Prometheus, n8n e pannelli personalizzati." + }, + "header": { + "title": "Riferimento API", + "description": "Endpoint HTTP per leggere lo stato e invocare azioni documentate: sensori Home Assistant, schede Homepage, pannelli Grafana, raccolta Prometheus, flussi n8n e script personalizzati. Include categorie, metriche esportate ed esempi curl.", + "section": "ProxMenux Monitor" + }, + "intro": { + "title": "A cosa serve questa pagina", + "body": "Questa pagina raccoglie endpoint per integrazioni: lettura dei dati, avvio di backup, notifiche personalizzate e conferma degli avvisi. L’API usa il processo Flask del pannello su TCP 8008. Indirizzo di ascolto e TLS sono descritti in Accesso e autenticazione." + }, + "headerEndpoint": "Endpoint", + "headerMethod": "Metodo", + "headerUse": "Uso", + "auth": { + "heading": "Autenticazione", + "intro": "Con autenticazione attiva, gli endpoint protetti richiedono un token JWT Bearer nell’intestazione:", + "tokensIntro": "Due modi per ottenere il token:", + "items": [ + "Token API, consigliati per le integrazioni. Valgono 365 giorni e si creano in Sicurezza → Token API. Hanno un nome e si revocano singolarmente. Usa read_only per i dati e full_admin solo per azioni amministrative necessarie.", + "Accesso, JWT di 24 ore. POST /api/auth/login con utente, password e TOTP se richiesto dalla 2FA. Il JWT scade dopo 24 ore; gli script devono autenticarsi di nuovo." + ], + "flowLink": "Accesso, password, 2FA, registro di audit e TLS sono descritti in Accesso e autenticazione.", + "rows": [ + { + "endpoint": "/api/auth/login", + "method": "POST", + "use": "Campi del corpo (schema): '{'\"username\",\"password\",\"totp_token?\"'}'. Restituisce un JWT di 24 ore." + }, + { + "endpoint": "/api/auth/api-tokens", + "method": "GET", + "use": "Elenca i token API (solo metadati — nomi, prefissi, date; mai il segreto reale)." + }, + { + "endpoint": "/api/auth/generate-api-token", + "method": "POST", + "use": "Crea un token API di 365 giorni con sessione autenticata. Campi: password, token_name?, totp_token?, scope?. Password e TOTP richiesto sono ricontrollati. scope vale read_only per impostazione predefinita; full_admin va scelto esplicitamente. Il segreto è restituito una sola volta." + }, + { + "endpoint": "/api/auth/api-tokens/", + "method": "DELETE", + "use": "Revocare un token specifico API dal suo ID." + } + ] + }, + "conventions": { + "heading": "Convenzioni", + "items": [ + "La maggior parte usa JSON. Alcuni download restituiscono testo semplice; /api/prometheus usa il formato testuale Prometheus 0.0.4 anziché OpenMetrics. Controlla il tipo di risposta della singola rotta.", + "Molte scritture restituiscono '{'\"success\": true, ...'}'. Gli errori variano; un formato comune è '{'\"success\": false, \"error\": \"'<'reason'>'\"'}'. Controlla stato HTTP e campi: alcune richieste di autenticazione usano HTTP 200 con success false.", + "I parametri dipendono dall’endpoint. Usa limit, offset, since e filtri di categoria solo dove supportati.", + "I formati temporali variano: timestamp Unix, stringhe ISO-8601 e date systemd. Non presumere la stessa unità né un fuso esplicito per tutti i campi." + ] + }, + "system": { + "heading": "Sistema e hardware", + "rows": [ + { + "endpoint": "/api/system", + "method": "GET", + "use": "Valori attuali di CPU, memoria, swap, tempo di attività e carico." + }, + { + "endpoint": "/api/info", + "method": "GET", + "use": "Informazioni statiche dell’host: nome, kernel, versione PVE, modello CPU e distribuzione." + }, + { + "endpoint": "/api/system-info", + "method": "GET", + "use": "Dati di sistema estesi usati nell’intestazione: metriche generali e ora di avvio." + }, + { + "endpoint": "/api/hardware", + "method": "GET", + "use": "Inventario hardware dettagliato: dispositivi PCI, GPU e sensori." + }, + { + "endpoint": "/api/hardware/live", + "method": "GET", + "use": "Valori attuali dei sensori che cambiano rapidamente." + }, + { + "endpoint": "/api/temperature/history", + "method": "GET", + "use": "Serie temporali delle temperature CPU e package." + }, + { + "endpoint": "/api/gpu//realtime", + "method": "GET", + "use": "Metriche attuali delle GPU NVIDIA, Intel e AMD per posizione PCI." + } + ] + }, + "actions": { + "heading": "Azioni di sistema", + "intro": "Queste azioni asincrone usano unità systemd temporanee. Con autenticazione attiva, le scritture richiedono full_admin; read_only può consultare .../status. L’avvio accettato restituisce HTTP 202 e stato; consulta .../status per l’avanzamento. Controllo ospiti e backup usano risposte diverse, descritte sotto.", + "shapeTitle": "Forma di risposta comune", + "shapeIntro": "Le azioni di sistema asincrone condividono questo oggetto JSON di stato. Controllo ospiti e backup hanno formati diversi:", + "shapeCode": "{\n \"unit\": \"proxmenux-action-pve-update.service\",\n \"state\": \"idle | running | success | failed | cancelled\",\n \"started_at\": \"Sat 2026-08-01 11:01:32 CEST\",\n \"finished_at\": null,\n \"exit_code\": null,\n \"result\": null\n}", + "concurrencyTitle": "Concorrenza e cancellazione", + "concurrencyBody": "Avviare di nuovo la stessa azione attiva restituisce HTTP 409. Si annulla solo con una rotta DELETE documentata, come per l’aggiornamento PVE. Lo stato passa a cancelled conservando le date. Gli stati finali restano nella memoria del processo e possono perdersi al riavvio di Monitor.", + "rows": [ + { + "endpoint": "/api/system/power/reboot", + "method": "POST", + "use": "Avvia il riavvio dell’host Proxmox. La connessione HTTP può chiudersi quando systemd inizia l’arresto." + }, + { + "endpoint": "/api/system/power/reboot/status", + "method": "GET", + "use": "Stato del riavvio attuale o precedente." + }, + { + "endpoint": "/api/system/power/shutdown", + "method": "POST", + "use": "Spegne l’host Proxmox, ad esempio in risposta al segnale di arresto dell’UPS." + }, + { + "endpoint": "/api/system/power/shutdown/status", + "method": "GET", + "use": "Stato dell’arresto attuale o precedente." + }, + { + "endpoint": "/api/system/pve-update/run", + "method": "POST", + "use": "Avvia l’aggiornamento PVE usato da Aggiorna ora di Health Monitor e dal menu della shell; delega a update-pve-safe.sh." + }, + { + "endpoint": "/api/system/pve-update/status", + "method": "GET", + "use": "Stato dell’aggiornamento PVE attuale o precedente." + }, + { + "endpoint": "/api/system/pve-update", + "method": "DELETE", + "use": "Annulla un aggiornamento PVE in corso con SIGTERM." + }, + { + "endpoint": "/api/proxmenux/self-update/run", + "method": "POST", + "use": "Aggiorna ProxMenux con l’installer del canale stabile o beta configurato. Usa un’unità systemd separata per continuare durante il riavvio di proxmenux-monitor eseguito dall’installer." + }, + { + "endpoint": "/api/proxmenux/self-update/status", + "method": "GET", + "use": "Stato dell’aggiornamento ProxMenux attuale o precedente." + }, + { + "endpoint": "/api/vms//control", + "method": "POST", + "use": "Invia un comando di controllo VM o LXC. action accetta start, stop, shutdown o reboot. La risposta riuscita restituisce una task PVE confermata, senza indicarne il completamento. Consulta l’endpoint control-task dell’ospite per l’esito." + }, + { + "endpoint": "/api/vms//backup", + "method": "POST", + "use": "Crea un backup vzdump di VM o LXC. Campi facoltativi da adattare allo storage: storage (destinazione PVE), mode (snapshot, suspend o stop), compress (zstd, lzo, gzip o none), protected (true o false), notes, notification (auto, always, failure o never) e pbs_change_detection (default, legacy o data). Restituisce l’UPID della task PVE." + }, + { + "endpoint": "/api/vms//backups", + "method": "GET", + "use": "Elenca i backup precedenti di una VM o di un LXC negli storage raggiungibili." + } + ], + "syncVsAsyncTitle": "Due tipi di azioni", + "syncVsAsyncBody": "Alimentazione e aggiornamenti host usano unità systemd temporanee con .../status. Solo l’aggiornamento PVE ha qui una rotta DELETE di annullamento. Il controllo VM/LXC restituisce una task da seguire; il backup un UPID di lavoro in background. Accettazione non significa completamento. Autenticazione e permessi dipendono dalla rotta.", + "curlTitle": "Esempio curl", + "curlBody": "Avvia un aggiornamento PVE e ne segue il completamento, come un’automazione Home Assistant o un playbook Ansible.", + "curlCode": "TOKEN=\n\ncurl -sSf -X POST \\\n -H \"Authorization: Bearer $TOKEN\" \\\n https://:8008/api/system/pve-update/run\n\nwhile true; do\n state=$(curl -sSf -H \"Authorization: Bearer $TOKEN\" \\\n https://:8008/api/system/pve-update/status | jq -r .state)\n [ \"$state\" != \"running\" ] && break\n sleep 30\ndone\necho \"final state: $state\"", + "haTitle": "Esempio per Home Assistant", + "haBody": "Un sensore rest consulta lo stato e rest_command avvia l’aggiornamento. Usali con un pulsante del pannello e le automazioni desiderate:", + "haCode": "# configuration.yaml\nsensor:\n - platform: rest\n resource: https://pve.local:8008/api/system/pve-update/status\n name: pve_update_state\n value_template: \"{{ value_json.state }}\"\n scan_interval: 60\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\nrest_command:\n pve_update:\n url: https://pve.local:8008/api/system/pve-update/run\n method: POST\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\n # Start VM 100 (works for LXC too — same endpoint)\n vm_100_start:\n url: https://pve.local:8008/api/vms/100/control\n method: POST\n content_type: 'application/json'\n payload: '{\"action\": \"start\"}'\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\n # Backup VM 100 to the 'pbs-main' storage\n vm_100_backup:\n url: https://pve.local:8008/api/vms/100/backup\n method: POST\n content_type: 'application/json'\n payload: '{\"storage\": \"pbs-main\", \"mode\": \"snapshot\", \"compress\": \"zstd\"}'\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"" + }, + "health": { + "heading": "Monitoraggio integrità", + "rows": [ + { + "endpoint": "/api/health", + "method": "GET", + "use": "Controllo leggero che restituisce JSON con status, timestamp e version. Adatto ai controlli per parola chiave di Uptime Kuma; con autenticazione attiva, il client deve inviare l’intestazione Bearer." + }, + { + "endpoint": "/api/health/status", + "method": "GET", + "use": "Stato generale: un livello di gravità e un riepilogo." + }, + { + "endpoint": "/api/health/details", + "method": "GET", + "use": "Le dieci categorie con stato e dati strutturati di ogni controllo." + }, + { + "endpoint": "/api/health/full", + "method": "GET", + "use": "Dati completi: categorie, errori attivi, avvisi ignorati e impostazioni di silenziamento. Usa risultati in background di meno di sei minuti; altrimenti, o con aggiornamento forzato, esegue un nuovo controllo." + }, + { + "endpoint": "/api/health/active-errors", + "method": "GET", + "use": "Elenco attivo, filtrabile con ?category=<name>." + }, + { + "endpoint": "/api/health/dismissed", + "method": "GET", + "use": "Avvisi ignorati con le ore di silenziamento rimanenti." + }, + { + "endpoint": "/api/health/settings", + "method": "GET", + "use": "Durata del silenziamento impostata per categoria." + }, + { + "endpoint": "/api/health/remote-storages", + "method": "GET", + "use": "Inventario degli storage remoti definiti in Proxmox, con stato di disponibilità." + }, + { + "endpoint": "/api/health/interfaces", + "method": "GET", + "use": "Interfacce di rete con tipo (bridge / bond / fisica), IP e velocità del collegamento." + }, + { + "endpoint": "/api/health/acknowledge", + "method": "POST", + "use": "Corpo: '{'\"error_key\":\"smart_sdh\"'}'. Silenzia un avviso per la durata impostata nella categoria." + }, + { + "endpoint": "/api/health/cleanup-orphans", + "method": "POST", + "use": "Pulizia manuale degli errori relativi a dispositivi o VM rimossi. Idempotente." + } + ], + "outro": "Formati delle risposte e categorie sono descritti in Health Monitor." + }, + "storage": { + "heading": "Archiviazione", + "rows": [ + { + "endpoint": "/api/storage", + "method": "GET", + "use": "Dischi visibili all’host: dispositivi a blocchi, pool ZFS e LVM." + }, + { + "endpoint": "/api/storage/summary", + "method": "GET", + "use": "Riepilogo compatto utilizzato da schede di dashboard." + }, + { + "endpoint": "/api/proxmox-storage", + "method": "GET", + "use": "Storage definiti in /etc/pve/storage.cfg, con stato di disponibilità e spazio libero." + }, + { + "endpoint": "/api/storage/observations", + "method": "GET", + "use": "Cronologia persistente: avvisi SMART, errori I/O ed eventi ZFS. Resta disponibile dopo la risoluzione automatica degli avvisi." + }, + { + "endpoint": "/api/storage/smart/", + "method": "GET", + "use": "Attributi attuali SMART per un disco." + }, + { + "endpoint": "/api/storage/smart//latest", + "method": "GET", + "use": "Più recente SMART auto-test per il disco." + }, + { + "endpoint": "/api/storage/smart//history", + "method": "GET", + "use": "Elenco dei rapporti SMART memorizzati per il disco." + }, + { + "endpoint": "/api/storage/smart//history/", + "method": "GET", + "use": "Legge un rapporto SMART specifico salvato." + }, + { + "endpoint": "/api/storage/smart//test", + "method": "POST", + "use": "Avvia un autotest SMART. Schema del corpo: '{'\"type\":\"short\"|\"long\"'}'." + }, + { + "endpoint": "/api/storage/smart/schedules", + "method": "GET", + "use": "Elenca i test SMART attualmente programmati." + }, + { + "endpoint": "/api/storage/smart/tools", + "method": "GET", + "use": "Verifica se smartctl e gli strumenti associati sono installati." + } + ] + }, + "network": { + "heading": "Rete", + "rows": [ + { + "endpoint": "/api/network", + "method": "GET", + "use": "Tutte le interfacce con lo stato del collegamento e gli indirizzi." + }, + { + "endpoint": "/api/network/summary", + "method": "GET", + "use": "Vista compatta utilizzata dal cruscotto." + }, + { + "endpoint": "/api/network//metrics", + "method": "GET", + "use": "RX/TX per interfaccia, contatori di errori e serie temporali RRD." + }, + { + "endpoint": "/api/network/latency/current", + "method": "GET", + "use": "Ultima misurazione di latenza verso il gateway." + }, + { + "endpoint": "/api/network/latency/history", + "method": "GET", + "use": "Serie temporale di latenza gateway." + } + ] + }, + "vms": { + "heading": "VM e container", + "rows": [ + { + "endpoint": "/api/vms", + "method": "GET", + "use": "VM e CT del nodo locale con stato, vmid e nome." + }, + { + "endpoint": "/api/vms/", + "method": "GET", + "use": "Dettagli completi di un ospite: configurazione, rete e dischi." + }, + { + "endpoint": "/api/vms//metrics", + "method": "GET", + "use": "Serie temporali di CPU, memoria e I/O disco di un ospite (RRD)." + }, + { + "endpoint": "/api/vms//logs", + "method": "GET", + "use": "Log delle attività recenti di questo ospite." + }, + { + "endpoint": "/api/vms//backups", + "method": "GET", + "use": "Backup conservati per questo ospite." + }, + { + "endpoint": "/api/vms//control", + "method": "POST", + "use": "Scegli un’azione dello schema: '{'\"action\":\"start|stop|reboot|shutdown\"'}'. Controlla l’alimentazione dell’ospite." + }, + { + "endpoint": "/api/vms//backup", + "method": "POST", + "use": "Avvia vzdump per l’ospite. Il corpo indica storage e modalità (snapshot / suspend / stop)." + }, + { + "endpoint": "/api/vms//config", + "method": "PUT", + "use": "Aggiorna la descrizione (note) di una VM o di un CT. Questo endpoint non modifica altre chiavi di configurazione." + }, + { + "endpoint": "/api/node/metrics", + "method": "GET", + "use": "Metriche aggregate del nodo in serie RRD." + } + ] + }, + "backups": { + "heading": "Backup", + "rows": [ + { + "endpoint": "/api/backups", + "method": "GET", + "use": "Backup trovati negli storage dir, NFS, CIFS e PBS interrogati tramite il nodo locale. Non esamina tutti i nodi del cluster." + }, + { + "endpoint": "/api/backup-storages", + "method": "GET", + "use": "Storage indicati come destinazioni di backup, con spazio libero." + } + ] + }, + "logs": { + "heading": "Log, attività, eventi", + "rows": [ + { + "endpoint": "/api/logs", + "method": "GET", + "use": "Le voci del diario filtrate. Query: ?level=&service=&limit=." + }, + { + "endpoint": "/api/logs/download", + "method": "GET", + "use": "Esporta l’intervallo filtrato come testo semplice." + }, + { + "endpoint": "/api/events", + "method": "GET", + "use": "Flusso di eventi interno — lo stesso che alimenta le notifiche." + }, + { + "endpoint": "/api/task-log/", + "method": "GET", + "use": "Log completo in testo semplice di una task Proxmox identificata dall’UPID." + } + ] + }, + "notifications": { + "heading": "Notifiche e IA", + "intro": "Invio, canali e riformulazione con IA sono descritti in Notifiche e Assistente IA.", + "rows": [ + { + "endpoint": "/api/notifications", + "method": "GET", + "use": "Notifiche recenti mostrate nel pannello." + }, + { + "endpoint": "/api/notifications/download", + "method": "GET", + "use": "Esporta le notifiche come testo." + }, + { + "endpoint": "/api/notifications/status", + "method": "GET", + "use": "Stato dell’invio: processo in background attivo, lunghezza della coda e ultimo invio." + }, + { + "endpoint": "/api/notifications/settings", + "method": "GET", + "use": "Legge la configurazione delle notifiche: canali, controlli per evento, riformulazione IA e nome visualizzato." + }, + { + "endpoint": "/api/notifications/history", + "method": "GET", + "use": "Cronologia degli invii. Parametri: ?limit=&offset=&severity=&channel=." + }, + { + "endpoint": "/api/notifications/history", + "method": "DELETE", + "use": "Svuota la tabella della cronologia degli invii." + }, + { + "endpoint": "/api/notifications/test", + "method": "POST", + "use": "Invia una notifica di prova a un canale. Corpo: '{'\"channel\":\"telegram\"'}'." + }, + { + "endpoint": "/api/notifications/send", + "method": "POST", + "use": "Genera un evento personalizzato. Corpo: '{'\"event_type\":\"custom\",\"severity\":\"WARNING\",\"title\":\"...\",\"body\":\"...\",\"data\":'{''}''}'." + }, + { + "endpoint": "/api/notifications/test-ai", + "method": "POST", + "use": "Verifica la connessione al provider IA. Campi del corpo (schema): '{'\"provider\",\"api_key\",\"model\",\"ollama_url?\"'}'." + }, + { + "endpoint": "/api/notifications/provider-models", + "method": "POST", + "use": "Elenca i modelli disponibili per il fornitore AI selezionato." + }, + { + "endpoint": "/api/notifications/proxmox/setup-webhook", + "method": "POST", + "use": "Registrare il Monitor come obiettivo webhook in /etc/pve/notifications.cfg." + }, + { + "endpoint": "/api/notifications/proxmox/cleanup-webhook", + "method": "POST", + "use": "Rimuovere l'obiettivo Monitor dalla configurazione di notifica di PVE." + }, + { + "endpoint": "/api/notifications/proxmox/read-cfg", + "method": "GET", + "use": "Leggi l'attuale notifications.cfg di PVE come la vede PVE." + } + ] + }, + "security": { + "heading": "Sicurezza (lettura)", + "rows": [ + { + "endpoint": "/api/security/firewall/status", + "method": "GET", + "use": "Stato firewall PVE e regole attive." + }, + { + "endpoint": "/api/security/fail2ban/details", + "method": "GET", + "use": "Stato del jail Fail2Ban; richiede il componente opzionale installato." + }, + { + "endpoint": "/api/security/fail2ban/activity", + "method": "GET", + "use": "Eventi recenti Fail2Ban: blocchi, sblocchi e avvii del jail." + }, + { + "endpoint": "/api/security/lynis/status", + "method": "GET", + "use": "Stato di Lynis: installazione e data dell’ultima analisi." + }, + { + "endpoint": "/api/security/lynis/report", + "method": "GET", + "use": "Ultimo rapporto Lynis: avvisi, suggerimenti e indice di hardening." + }, + { + "endpoint": "/api/security/tools", + "method": "GET", + "use": "Rileva quali strumenti di sicurezza opzionali (Fail2Ban, Lynis) sono installati." + } + ] + }, + "proxmenuxIntegration": { + "heading": "Integrazione ProxMenux", + "rows": [ + { + "endpoint": "/api/proxmenux/update-status", + "method": "GET", + "use": "Disponibilità di aggiornamenti ProxMenux Monitor, versione installata e più recente." + }, + { + "endpoint": "/api/proxmenux/installed-tools", + "method": "GET", + "use": "Elenco di ogni ottimizzazione post-installazione ProxMenux attualmente registrata sull'host (da /usr/local/share/proxmenux/installed_tools.json)." + }, + { + "endpoint": "/api/proxmenux/tool-source/", + "method": "GET", + "use": "Codice della funzione post-installazione associata, estratto dagli script attuali dell’host o da codice precedente conservato. Non garantisce una copia del codice eseguito in origine." + } + ] + }, + "prometheus": { + "heading": "Metriche Prometheus", + "intro": "L’endpoint autenticato GET /api/prometheus restituisce il formato testuale Prometheus 0.0.4. Ogni metrica include node=\"<hostname>\" e un timestamp esplicito. Usa Prometheus o un database temporale compatibile per raccoglierle.", + "exportedTitle": "metriche esportate", + "headerGroup": "Gruppo", + "headerMetric": "Metrica", + "headerDesc": "Descrizione", + "groups": [ + { + "group": "Sistema", + "metrics": [ + { + "metric": "proxmox_cpu_usage", + "desc": "Percentuale di utilizzo CPU, tipo gauge." + }, + { + "metric": "proxmox_memory_total_bytes", + "desc": "Memoria fisica totale in byte." + }, + { + "metric": "proxmox_memory_used_bytes", + "desc": "Memoria utilizzata in byte." + }, + { + "metric": "proxmox_memory_usage_percent", + "desc": "Percentuale di utilizzo della memoria." + }, + { + "metric": "proxmox_load_average", + "desc": "Media del carico di sistema. Etichetta period=\"1m\" | \"5m\" | \"15m\"." + } + ] + }, + { + "group": "Tempo di attività", + "metrics": [ + { + "metric": "proxmox_uptime_seconds", + "desc": "Secondi dall’ultimo avvio." + } + ] + }, + { + "group": "Hardware", + "metrics": [ + { + "metric": "proxmox_cpu_temperature_celsius", + "desc": "Temperatura del package CPU." + }, + { + "metric": "proxmox_disk_temperature_celsius", + "desc": "Temperatura per disco. Etichetta disk." + }, + { + "metric": "proxmox_fan_speed_rpm", + "desc": "Velocità delle ventole. Etichetta fan." + } + ] + }, + { + "group": "Spazio disco", + "metrics": [ + { + "metric": "proxmox_disk_total_bytes", + "desc": "Capacità totale per voce disco esportata. Etichetta disk." + }, + { + "metric": "proxmox_disk_used_bytes", + "desc": "Capacità utilizzata per voce disco esportata." + }, + { + "metric": "proxmox_disk_usage_percent", + "desc": "Percentuale utilizzata per voce disco esportata." + } + ] + }, + { + "group": "Rete", + "metrics": [ + { + "metric": "proxmox_network_bytes_sent_total", + "desc": "Totale dei byte inviati, tipo counter." + }, + { + "metric": "proxmox_network_bytes_received_total", + "desc": "Totale dei byte ricevuti, tipo counter." + }, + { + "metric": "proxmox_interface_bytes_sent_total", + "desc": "Byte inviati per interfaccia. Etichetta interface." + }, + { + "metric": "proxmox_interface_bytes_received_total", + "desc": "Byte ricevuti per interfaccia." + } + ] + }, + { + "group": "VMs / CTs", + "metrics": [ + { + "metric": "proxmox_vms_total", + "desc": "Numero totale di VM e LXC." + }, + { + "metric": "proxmox_vms_running", + "desc": "Numero di ospiti in esecuzione." + }, + { + "metric": "proxmox_vms_stopped", + "desc": "Numero di ospiti fermati." + }, + { + "metric": "proxmox_vm_status", + "desc": "Stato per VM/CT: 1 in esecuzione, 0 altrimenti. Etichette node, vmid e name." + }, + { + "metric": "proxmox_vm_cpu_usage", + "desc": "Utilizzo CPU per VM/CT, con le stesse etichette." + }, + { + "metric": "proxmox_vm_memory_used_bytes / _max_bytes", + "desc": "Memoria utilizzata e massimo configurato per VM/CT." + } + ] + }, + { + "group": "GPU", + "metrics": [ + { + "metric": "proxmox_gpu_temperature_celsius", + "desc": "Temperatura GPU. Etichette slot e vendor; gpu include anche il nome della GPU." + }, + { + "metric": "proxmox_gpu_utilization_percent", + "desc": "Percentuale di utilizzo della GPU." + }, + { + "metric": "proxmox_gpu_memory_total_bytes", + "desc": "Memoria totale della GPU." + }, + { + "metric": "proxmox_gpu_power_draw_watts", + "desc": "Potenza assorbita dalla GPU in watt." + }, + { + "metric": "proxmox_gpu_clock_speed_mhz", + "desc": "Frequenza del core GPU." + }, + { + "metric": "proxmox_gpu_memory_clock_mhz", + "desc": "Frequenza della memoria GPU." + } + ] + }, + { + "group": "UPS", + "metrics": [ + { + "metric": "proxmox_ups_battery_charge_percent", + "desc": "Percentuale di carica della batteria." + }, + { + "metric": "proxmox_ups_load_percent", + "desc": "Carico corrente sull'UPS." + }, + { + "metric": "proxmox_ups_runtime_seconds", + "desc": "Autonomia stimata della batteria." + }, + { + "metric": "proxmox_ups_input_voltage_volts", + "desc": "Tensione di ingresso." + } + ] + } + ], + "scrapeTitle": "Configurazione di raccolta Prometheus", + "scrapeIntro": "Con autenticazione attiva, aggiungi un token API nell’intestazione Bearer della configurazione di raccolta Prometheus:", + "perHostTitle": "Raccolta per host", + "perHostBody": "Ogni istanza esporta le metriche del proprio host. In un cluster configura Prometheus per interrogare ogni nodo. L’etichetta node distingue le serie in Grafana (proxmox_vms_running'{'node=\"pve01\"'}')." + }, + "puttingItTogether": { + "heading": "Combinare le integrazioni", + "body": "Vedi Integrazioni per collegare gli endpoint a sensori Home Assistant, schede Homepage, pannelli Grafana, flussi n8n e altri strumenti. Include configurazioni tipiche copiabili per ogni piattaforma. Questa pagina raccoglie il catalogo degli endpoint." + }, + "whereNext": { + "heading": "Come proseguire", + "items": [ + { + "label": "Accesso e autenticazione", + "href": "/docs/monitor/access-auth", + "tail": " — creazione di token, registro di audit, jail Fail2Ban opzionale e TLS." + }, + { + "label": "Notifiche", + "href": "/docs/monitor/notifications", + "tailRich": " — contenuto di data per evento nelle chiamate a /api/notifications/send." + }, + { + "label": "Assistente IA", + "href": "/docs/monitor/ai-assistant", + "tailRich": " — funzionamento di /api/notifications/test-ai e /api/notifications/provider-models." + }, + { + "label": "Monitoraggio integrità", + "href": "/docs/monitor/health-monitor", + "tailRich": " — formato delle risposte di /api/health/* e significato delle dieci categorie." + } + ] + } +} diff --git a/web/messages/it/docs/monitor/architecture.json b/web/messages/it/docs/monitor/architecture.json new file mode 100644 index 00000000..ba32fbd8 --- /dev/null +++ b/web/messages/it/docs/monitor/architecture.json @@ -0,0 +1,303 @@ +{ + "meta": { + "title": "Architettura di ProxMenux Monitor — AppImage, Flask, SQLite, WebSocket | ProxMenux", + "description": "Struttura di ProxMenux Monitor: AppImage, blueprint Flask, attività in background, dati da psutil, pvesh, smartctl e journalctl, archiviazione SQLite, terminale WebSocket, provider IA, canali di notifica, proxy inverso e Fail2Ban opzionale.", + "ogTitle": "ProxMenux Monitor Architettura", + "ogDescription": "Dentro ProxMenux Monitor: AppImage, blueprint Flask, attività in background, SQLite, WebSocket, provider IA e canali di notifica.", + "twitterTitle": "ProxMenux Monitor Architettura", + "twitterDescription": "AppImage, Flask, SQLite, WebSocket, provider IA e canali di notifica: dentro Monitor." + }, + "header": { + "title": "Architettura", + "description": "Come viene distribuito ProxMenux Monitor, cosa contiene l’AppImage e come le richieste del browser passano da Flask agli strumenti dell’host e all’archivio SQLite.", + "section": "ProxMenux Monitor" + }, + "intro": { + "title": "Un processo, molte responsabilità", + "body": "Un processo Python ascolta su TCP 8008. Serve la versione statica Next.js, espone l’API REST, gestisce il terminale WebSocket, esegue Health Monitor e invia notifiche. Non richiede un server web separato, un broker di messaggi o un database esterno." + }, + "requestFlow": { + "heading": "Percorso di una richiesta", + "intro": "Una richiesta di dati tipica segue questo percorso; le preferenze del browser possono essere gestite localmente:", + "diagramCaption": "Le rotte protette verificano JWT con autenticazione attiva. Rotte principali e blueprint restituiscono dati in cache o appena raccolti. Il controllo Fail2Ban opzionale consulta la lista dei blocchi in cache. Le intestazioni IP inoltrate sono attendibili solo con PROXMENUX_TRUST_PROXY=1; altrimenti usa l’indirizzo della connessione. Lo stato persistente include SQLite e file JSON come auth.json.", + "diagramArrowLabel": "HTTP / WS", + "nodes": { + "clientLabel": "Cliente", + "clientDetail": "Browser o PWA\n+ proxy opzionale\nNginx / Caddy /\nTraefik", + "flaskLabel": "Flask :8008", + "flaskDetail": "Blueprint\nMiddleware JWT\nControllo Fail2Ban\n(se installato)", + "hostLabel": "Strumenti dell’host", + "hostDetail": "psutil\npvesh\nsmartctl\njournalctl", + "stateLabel": "Stato locale", + "stateDetail": "SQLite DB\n+ auth.json" + }, + "threadsIntro": "Il processo esegue anche thread in background. Questi esempi raccolgono dati, aggiornano cache e SQLite e inviano notifiche. Esistono altre attività; l’invio dipende dalla relativa attivazione:", + "headerThread": "Thread", + "headerCadence": "Cadenza", + "headerJob": "Attività pianificata", + "rows": [ + { + "thread": "_temperature_collector_loop", + "cadence": "60 s", + "job": "Salva temperatura CPU e campioni di latenza nel database storico, così i grafici hanno dati anche senza browser connessi." + }, + { + "thread": "_health_collector_loop", + "cadence": "5 min", + "job": "Esegue il ciclo Health Monitor delle dieci categorie, salva errori e osservazioni sui dischi, gestisce gli avvisi ignorati e passa i nuovi eventi al motore di notifica." + }, + { + "thread": "_vital_signs_sampler", + "cadence": "CPU 5 s; temperatura 15 s; memoria 30 s", + "job": "Campiona CPU, memoria e temperatura CPU per gli indicatori e il rilevamento di condizioni prolungate, indipendentemente dal controllo generale di cinque minuti." + }, + { + "thread": "notification_manager.start()", + "cadence": "Basato su eventi", + "job": "Avvia gli osservatori di journal, attività e hook (JournalWatcher, TaskWatcher, ProxmoxHookWatcher) e invia ai canali configurati, con riformulazione IA opzionale." + } + ] + }, + "systemd": { + "heading": "Unità systemd", + "intro": "L’installer crea l’unità /etc/systemd/system/proxmenux-monitor.service. Configurazione predefinita:", + "items": [ + "User=root: il servizio usa privilegi root per SMART, pvesh e gestione ZFS. I processi del terminale web ereditano questi permessi.", + "Restart=on-failure con attesa di dieci secondi: il servizio riparte automaticamente dopo un’uscita con errore.", + "After=network.target: ordina l’avvio dopo quel target; non garantisce IP assegnato, DNS o connettività esterna." + ], + "inspectTitle": "Esaminare l’unità attuale" + }, + "appimage": { + "heading": "Cosa contiene l’AppImage", + "intro": "L’AppImage contiene un filesystem montato all’esecuzione. AppRun alla radice prepara l’ambiente e avvia flask_server.py:", + "consequencesIntro": "Due conseguenze di questo layout:", + "consequences": [ + "Ambiente Python incluso. Interprete e pacchetti sono nell’AppImage, senza installazione nel Python di sistema. L’app usa comunque interfacce del kernel e strumenti esterni dell’host.", + "Client hardware inclusi. Sono presenti ipmitool, lm-sensors e upsc. Le letture richiedono hardware compatibile, accesso ai sensori e, per l’UPS, un server NUT configurato." + ] + }, + "flask": { + "heading": "Struttura dell’applicazione Flask", + "intro": "flask_server.py crea un’istanza Flask(__name__) con CORS limitato, registra direttamente nove blueprint e inizializza il terminale. La tabella mostra moduli principali; registra anche audit, backup VM e PBS. I precaricamenti PVE si eseguono solo sugli host PVE.", + "headerBlueprint": "Blueprint / modulo", + "headerPrefix": "Prefisso delle rotte", + "headerOwns": "Responsabilità", + "rows": [ + { + "blueprint": "flask_server.py", + "prefix": [ + "/api/system", + "/api/storage", + "/api/network", + "/api/vms", + "/api/hardware", + "/api/logs", + "/api/prometheus" + ], + "owns": "Endpoint principali, web statico e controllo Fail2Ban opzionale se il jail proxmenux è presente sull’host." + }, + { + "blueprint": "flask_auth_routes.py", + "prefix": [ + "/api/auth/*" + ], + "owns": "Accesso, emissione JWT, configurazione e verifica TOTP, cambio password e token API." + }, + { + "blueprint": "flask_health_routes.py", + "prefix": [ + "/api/health/*" + ], + "owns": "Controlli di stato, dettagli, errori attivi e ignorati e impostazioni di silenziamento. Le rotte protette richiedono autenticazione quando attiva." + }, + { + "blueprint": "flask_terminal_routes.py", + "prefix": [ + "/api/terminal/* + WS" + ], + "owns": "Assegna un PTY per sessione e lo collega via WebSocket a xterm.js nel browser." + }, + { + "blueprint": "flask_notification_routes.py", + "prefix": [ + "/api/notifications/*" + ], + "owns": "Creazione, lettura, modifica e rimozione dei canali; prove, IA, cronologia e invii manuali." + }, + { + "blueprint": "flask_security_routes.py", + "prefix": [ + "/api/security/*" + ], + "owns": "Errori di accesso e, con Fail2Ban installato, stato del jail, blocchi e sblocco manuale." + }, + { + "blueprint": "flask_proxmenux_routes.py", + "prefix": [ + "/api/proxmenux/*" + ], + "owns": "Legge le ottimizzazioni ProxMenux registrate sull’host." + }, + { + "blueprint": "flask_oci_routes.py", + "prefix": [ + "/api/oci/*" + ], + "owns": "Funzioni di distribuzione di applicazioni OCI e container su Proxmox VE 9.1+." + } + ], + "endpointsLink": "Gli endpoint di integrazione e i loro formati sono descritti in Riferimento API." + }, + "dataSources": { + "heading": "Fonti dati", + "intro": "I dati dell’host provengono soprattutto da librerie standard, file e comandi amministrativi. Alcuni dati degli ospiti dipendono anche da QEMU Guest Agent o da comandi nel CT:", + "headerSource": "Fonte", + "headerUsedFor": "Usato per", + "rows": [ + { + "source": "psutil", + "usedFor": "Carico CPU, memoria, swap, utilizzo dei montaggi, contatori di rete e processi." + }, + { + "source": "pvesh / qm / pct", + "usedFor": "Informazioni del nodo Proxmox, inventario e configurazione VM/CT, storage e cronologia delle attività." + }, + { + "source": "smartctl", + "usedFor": "Attributi SATA/NVMe, stato SMART, usura, vita utile, modello e numero di serie." + }, + { + "source": "zpool / zfs", + "usedFor": "Stato del pool (ONLINE / DEGRADED / FAULTED / UNAVAIL), avanzamento dello scrub e utilizzo dei dataset." + }, + { + "source": "journalctl", + "usedFor": "Log di sistema, processi terminati per OOM, errori ATA/NVMe/dm, sicurezza e unità di servizio personalizzate." + }, + { + "source": "ip / iproute2", + "usedFor": "Interfacce, indirizzi, bridge, bond e dispositivi gestiti da OVS." + }, + { + "source": "nvidia-smi · intel_gpu_top", + "usedFor": "Dati GPU disponibili su utilizzo, VRAM, temperatura e codifica/decodifica. I campi dipendono da produttore, strumento e driver." + }, + { + "source": "lspci · lscpu · dmidecode", + "usedFor": "Topologia PCIe, modello e topologia CPU, scheda madre e BIOS." + }, + { + "source": "ipmitool · sensors", + "usedFor": "Sensori fuori banda, ventole e temperature della scheda madre, se l’hardware li supporta." + }, + { + "source": "upsc (NUT)", + "usedFor": "Stato batteria, carico e autonomia UPS con un server NUT configurato." + } + ], + "cacheTitle": "Cache per ridurre le richieste all’host", + "cacheBody": "I risultati costosi di smartctl -a e pvesh get sono conservati temporaneamente nel processo Flask per ridurre le richieste a dischi e API del cluster. La durata varia: secondi per le metriche e minuti per SMART." + }, + "persistence": { + "heading": "Persistenza", + "intro": "Diversi file di stato hanno contenuti e requisiti di accesso differenti:", + "headerPath": "Path", + "headerOwner": "Proprietario", + "headerContents": "Contenuto", + "rows": [ + { + "path": "/usr/local/share/proxmenux/health_monitor.db", + "owner": "root:root", + "contents": "Database SQLite. Tabelle: errors, events, disk_registry, disk_observations, user_settings, notification_history, excluded_storages, excluded_interfaces. Modalità journal WAL." + }, + { + "path": "/usr/local/share/proxmenux/.notification_key", + "owner": "root 0600", + "contents": "Chiave principale di 32 byte per i segreti di notifica ENC2. Usa sale casuale per valore, chiavi derivate e MAC. I vecchi valori XOR sono supportati per la migrazione." + }, + { + "path": "/root/.config/proxmenux-monitor/auth.json", + "owner": "root:root", + "contents": "Configurazione di accesso: attivazione, utente, hash password PBKDF2-HMAC-SHA256 con salt, segreto TOTP, codici di recupero, chiave JWT dell’installazione, metadati dei token API e hash di revoca. I vecchi hash SHA-256 vengono migrati all’accesso riuscito." + }, + { + "path": "/var/log/proxmenux-auth.log", + "owner": "root:root", + "contents": "Log di autenticazione in testo semplice, indipendente da Fail2Ban. Se il jail [proxmenux] è installato e attivo, legge il file per rilevare errori di accesso ripetuti. Senza quel jail, il log resta consultabile." + } + ], + "backupTitle": "Salvare auth.json prima della reinstallazione", + "backupBody": "Sostituire l’AppImage normalmente conserva /root/.config/proxmenux-monitor/auth.json e /usr/local/share/proxmenux/health_monitor.db. Conserva auth.json con jwt_secret per mantenere validità e metadati dei token. Il database conserva separatamente stato e notifiche. Salva .notification_key insieme per ripristinare i segreti dei canali; il solo database non ripristina l’autenticazione API." + }, + "health": { + "heading": "Ciclo Health Monitor", + "intro": "Circa ogni cinque minuti, il processo in background invoca health_monitor.py per i controlli delle dieci categorie del pannello:", + "items": [ + "Servizi PVE critici (pveproxy, pvedaemon, pvestatd, pve-cluster).", + "Storage Proxmox: pvesh get /storage e disponibilità di ciascuno.", + "Dischi e filesystem: SMART, errori I/O in dmesg, stato ZFS e capacità dei montaggi.", + "VM e CT: errori di avvio, arresti anomali, errori QMP e problemi di spegnimento.", + "Rete: stato di bridge e bond, collegamenti e latenza verso il gateway.", + "Aggiornamenti: pacchetti in attesa e patch di sicurezza.", + "Log: schemi persistenti, picchi e sequenze a cascata nel journal di sistema.", + "Memoria: interventi dell’OOM killer e pressione RAM prolungata.", + "Temperatura: letture CPU e dischi rispetto alle soglie di monitoraggio; i sensori disponibili dipendono dall’hardware.", + "Sicurezza: errori di accesso, blocchi e stato del jail Fail2Ban." + ], + "afterIntro": "I risultati usano error_key, categoria e gravità stabili. Le righe in errors vengono aggiornate con last_seen e contatori, senza duplicarle. L’invio delle notifiche ha anche impronte e intervalli propri.", + "cycleEnd": "La pulizia può risolvere errori obsoleti con la durata del silenziamento per categoria e regole di stato, rimuovere voci orfane di risorse eliminate e cancellare events oltre 30 giorni. Le categorie sono in Pannello → Health Monitor." + }, + "notifications": { + "heading": "Motore di notifica", + "intro": "notification_manager.py coordina l’invio: carica i canali, gestisce la coda e offre un’API Python per Flask e Health Monitor e un ingresso CLI per gli hook .sh di ProxMenux.", + "items": [ + "Gli osservatori generano eventi: JournalWatcher segue il journal, TaskWatcher consulta le attività Proxmox, ProxmoxHookWatcher riceve hook di backup, replica e snapshot e PollingCollector gestisce fonti lente.", + "I modelli trasformano eventi in titolo e testo. Il provider IA configurato (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter) può riformularli in linguaggio naturale. Entrambe le versioni sono salvate in notification_history.", + "I canali inviano tramite servizi come Telegram, Discord, email, Gotify, Pushover e Apprise. Le implementazioni in notification_channels.py condividono create_channel() / send().", + "Cifratura. Le impostazioni sensibili (telegram.bot_token, discord.webhook_url, pushover.user_key, pushover.api_token, ai_api_key_*, email.password) vengono cifrate con la chiave di .notification_key prima del salvataggio e mascherate nell’interfaccia." + ], + "linksFooter": "Controlli per evento, opzioni dei canali e IA sono descritti in Impostazioni → Notifiche e Impostazioni → Assistente IA." + }, + "websocket": { + "heading": "Terminale WebSocket", + "intro": "La scheda Terminale collega un client leggero xterm.js a un PTY del server via WebSocket. Esistono due modalità:", + "items": [ + "Modalità HTTP, predefinita: il server Flask integrato con flask-sock gestisce il passaggio al protocollo WebSocket.", + "Modalità HTTPS / WSS: usa gevent.pywsgi.WSGIServer con geventwebsocket.handler.WebSocketHandler per WebSocket su TLS." + ], + "outro": "I processi del terminale ereditano User=root. Con autenticazione attiva, WebSocket richiede un ticket breve monouso ottenuto dall’endpoint autenticato con permessi amministrativi. Se l’autenticazione è disattivata o rifiutata, la connessione segue quella modalità senza autenticazione.", + "proxyNote": "Con un proxy inverso, abilita WebSocket e le intestazioni Upgrade e Connection. Il terminale richiede questo inoltro." + }, + "proxy": { + "heading": "Proxy inverso e Fail2Ban", + "intro": "La scelta dell’IP client e il blocco applicativo opzionale dipendono da queste impostazioni e componenti:", + "items": [ + "Scelta dell’IP client. Il controllo before_request e il log di accesso si fidano di X-Forwarded-For, poi X-Real-IP, solo con PROXMENUX_TRUST_PROXY=1. Altrimenti usano request.remote_addr. Le intestazioni inoltrate non sono accettate automaticamente.", + "Fail2Ban applicativo opzionale. Una connessione proxy può mostrare l’IP del proxy come origine TCP. Con l’IP client attendibile e il jail proxmenux attivo, Flask rifiuta gli IP bloccati con HTTP 403. La lista resta in cache per 30 secondi e si aggiorna alle richieste dopo la scadenza, senza timer dedicato." + ], + "calloutTitle": "Fail2Ban non è incluso", + "calloutBody": "Fail2Ban non è incluso né installato automaticamente. Si può installare da Sicurezza di Monitor o Sicurezza → Fail2Ban in ProxMenux Scripts. Senza fail2ban-client o il jail proxmenux, questo controllo non blocca richieste. Resta valida la politica di autenticazione configurata.", + "outro": "Esempi Nginx/Caddy/Traefik e guida del jail sono in Accesso e autenticazione e Sicurezza → Fail2Ban." + }, + "whereNext": { + "heading": "Come proseguire", + "items": [ + { + "label": "Accesso e autenticazione", + "href": "/docs/monitor/access-auth", + "tail": " — primo avvio, password e TOTP 2FA, esempi di proxy inverso e jail Fail2Ban." + }, + { + "label": "Riferimento API", + "href": "/docs/monitor/api", + "tail": " — endpoint di integrazione, gestione token e convenzioni di autenticazione." + }, + { + "label": "Impostazioni → ProxMenux Monitor", + "href": "/docs/settings/proxmenux-monitor", + "tail": " — controllo del servizio e verifica dello stato nel menu testuale ProxMenux." + } + ] + } +} diff --git a/web/messages/it/docs/monitor/audit-report/assessment.json b/web/messages/it/docs/monitor/audit-report/assessment.json new file mode 100644 index 00000000..f052a9eb --- /dev/null +++ b/web/messages/it/docs/monitor/audit-report/assessment.json @@ -0,0 +1,218 @@ +{ + "meta": { + "title": "Valutazione e inventario | Audit e report", + "description": "Valutazione in Audit e report: profili dei rapporti, classificazione dei risultati, rischi accettati, fonti illeggibili, Lynis e inventario del nodo." + }, + "header": { + "title": "Valutazione e inventario", + "description": "La valutazione ispeziona il nodo, mantiene i suoi risultati e risponde a diverse domande a seconda del profilo del report.", + "section": "Audit e report" + }, + "sections": [ + { + "id": "read-only", + "blocks": [ + { + "calloutInfo": { + "title": "Una valutazione ispeziona senza modificare la configurazione", + "body": "Legge la configurazione e lo stato dell'host. Scrive risultati, rapporti e log; i controlli di avvio possono montare brevemente le partizioni di sistema EFI. La configurazione valutata non viene modificata." + } + }, + { + "p": "Esegui valutazione avvia un'esecuzione con il profilo selezionato in Rapporto. La vista mostra la data dell'ultima esecuzione e il tempo trascorso." + } + ] + }, + { + "id": "profiles", + "title": "Profili report", + "intro": "Ogni profilo risponde a una domanda diversa. I controlli e le sezioni vengono selezionati prima che il documento sia composto.", + "blocks": [ + { + "table": { + "headers": [ + "Profilo", + "Che cosa copre" + ], + "rows": [ + [ + "Audit completo", + "Tutti i controlli e tutta la struttura disponibile." + ], + [ + "Diagnosi rapida", + "Ogni controllo; il risultato si apre con i risultati critici, gli avvisi e le letture che non potrebbero essere verificate." + ], + [ + "Inventario", + "Una descrizione del nodo, senza controlli né classificazione." + ], + [ + "Verifica sicurezza", + "Esposizione, accesso, privilegi, certificati, aggiornamenti, repository e Lynis." + ], + [ + "Affidabilità backup", + "Copertura, età, risultati, verifica, ritenzione e recupero dei backup." + ], + [ + "Capacità e usura", + "Margine di crescita, memoria, uso dello spazio e la durata dei dischi." + ] + ] + } + }, + { + "p": "Il contenuto di ogni documento è descritto in Rapporti e confronti." + } + ] + }, + { + "id": "results", + "title": "Come vengono classificati i risultati", + "blocks": [ + { + "table": { + "headers": [ + "Classificazione", + "Significato" + ], + "rows": [ + [ + "Critico", + "Una condizione fallita che ha priorità." + ], + [ + "Avvertenza", + "Una condizione che ha bisogno di una revisione, date le prove o la politica." + ], + [ + "Osservazione", + "Informazioni sul nodo che non viene segnalato come un fallimento." + ], + [ + "Non verificato", + "La fonte richiesta dal controllo non è stata leggibile. Questo non significa che il problema sia assente." + ], + [ + "Conforme", + "La condizione soddisfa il criterio applicato." + ], + [ + "Non applicabile", + "Non si applica nulla nell'ambito del controllo." + ], + [ + "Rischio accettato", + "Il ritrovamento esiste e una decisione su di esso è stata registrata." + ], + [ + "Escluso dalla politica", + "La politica dichiara che l'elemento è lasciato fuori dal conteggio." + ] + ] + } + }, + { + "p": "I risultati si possono filtrare per area: Sistema, Archiviazione, Rete, Sicurezza, Backup, Guest e Hardware. Ogni risultato conserva le evidenze con la fonte da cui sono state lette." + } + ] + }, + { + "id": "unverified", + "title": "Quando una fonte non può essere letta", + "blocks": [ + { + "table": { + "headers": [ + "Caso", + "Comportamento" + ], + "rows": [ + [ + "Non verificato", + "Il controllo conserva la propria identità, indica nelle evidenze quale fonte ha fallito e non trasforma i dati mancanti in un risultato conforme." + ], + [ + "Evidenze incomplete", + "Il rapporto indica la fonte e il momento della raccolta per distinguere un problema reale da una lettura insufficiente." + ], + [ + "Una nuova esecuzione", + "Una volta corretto l'accesso, il pacchetto o il servizio, lo stesso profilo viene eseguito di nuovo e il confronto mostra se il risultato potrebbe essere verificato." + ] + ] + } + } + ] + }, + { + "id": "lynis", + "title": "Lynis", + "blocks": [ + { + "p": "La verifica di sicurezza usa il rapporto Lynis dell'host. Se Lynis non è mai stato eseguito o il rapporto supera l'età consentita dalla politica, una finestra propone Esegui con Lynis, che richiede alcuni minuti in più, oppure Esegui senza Lynis, che usa il rapporto esistente." + }, + { + "figure": { + "src": "/monitor/audit/lynis-dialog.png", + "alt": "Dialogo che offre di eseguire la valutazione con o senza Lynis", + "caption": "La finestra Lynis prima di una verifica di sicurezza." + } + } + ] + }, + { + "id": "accept", + "title": "Accettare un rischio", + "blocks": [ + { + "p": "Accetta rischio registra una decisione su un risultato. Il motivo è obbligatorio e viene salvato con autore e data." + }, + { + "table": { + "headers": [ + "Campo", + "Opzioni" + ], + "rows": [ + [ + "Motivo", + "Testo libero, obbligatorio." + ], + [ + "Scadenza", + "90 giorni, 180 giorni, 1 anno o non scade. Quando il periodo termina il risultato diventa nuovamente attivo." + ], + [ + "Promemoria revisione", + "Un promemoria che riporta la decisione all'attenzione mentre rimane in vigore." + ] + ] + } + }, + { + "p": "Un risultato accettato rimane visibile con la decisione; Riporta ad attivo revoca l'accettazione. Accettare un rischio non lo corregge: il confronto lo mostra come accettato, non come risolto." + } + ] + }, + { + "id": "inventory", + "title": "Inventario", + "blocks": [ + { + "list": { + "items": [ + "Identità, versione Proxmox VE, kernel, abbonamento e cluster.", + "CPU, memoria, scheda, BIOS, controller e IOMMU.", + "Disco, SMART, ore di alimentazione e eventi registrati.", + "Adattatori, bond, bridge, latenza e connessioni.", + "Stoccaggio, ospiti con i loro dischi e interfacce, e backup.", + "PCI passthrough e il software ProxMenux gestisce." + ] + } + } + ] + } + ] +} diff --git a/web/messages/it/docs/monitor/audit-report/changes.json b/web/messages/it/docs/monitor/audit-report/changes.json new file mode 100644 index 00000000..275460e7 --- /dev/null +++ b/web/messages/it/docs/monitor/audit-report/changes.json @@ -0,0 +1,208 @@ +{ + "meta": { + "title": "Modifiche | Audit e report", + "description": "Registro delle modifiche di Audit e report: interventi di ProxMenux sull'host, stato precedente, differenze e possibilità di annullamento." + }, + "header": { + "title": "Modifiche", + "description": "Registro delle operazioni eseguite da ProxMenux sull'host e, quando acquisito, dello stato prima e dopo ogni operazione.", + "section": "Audit e report" + }, + "sections": [ + { + "id": "purpose", + "blocks": [ + { + "calloutInfo": { + "title": "Dallo script eseguito alla modifica effettuata", + "body": "Una funzione lunga può modificare solo due righe. Il registro conserva ogni operazione concreta con script, funzione e versione responsabili, risorsa interessata, differenze e possibilità di annullamento." + } + }, + { + "flow": { + "nodes": [ + { + "label": "Script", + "detail": "funzione + versione" + }, + { + "label": "Acquisizione", + "detail": "contenuto prima" + }, + { + "label": "Operazione", + "detail": "file · pacchetto · servizio" + }, + { + "label": "Registro", + "detail": "attribuzione + differenza" + } + ], + "caption": "L'acquisizione avviene durante l'operazione e viene consolidata quando Monitor legge il registro." + } + }, + { + "figure": { + "src": "/monitor/audit/changes-view.png", + "alt": "Vista Modifiche di Audit e report con voci raggruppate per opzione post-installazione e script", + "caption": "La vista Modifiche con le differenze di un file modificato da ProxMenux." + } + } + ] + }, + { + "id": "types", + "title": "Tipi di voce", + "intro": "Il filtro in alto separa le voci per genere.", + "blocks": [ + { + "table": { + "headers": [ + "Tipo", + "Cosa registra" + ], + "rows": [ + [ + "Configurazione", + "ProxMenux ha scritto, modificato o rimosso un file, ha cambiato un'impostazione o modificato un servizio." + ], + [ + "Installazioni", + "ProxMenux ha aggiunto un pacchetto o un componente, e i pacchetti che sono effettivamente apparsi sono registrati." + ], + [ + "Esecuzioni", + "ProxMenux ha eseguito un comando; le modifiche dipendono dal comando stesso." + ], + [ + "Applicato", + "Una funzione è stata applicata prima che esistesse il registro; lo stato precedente non è stato acquisito." + ] + ] + } + } + ] + }, + { + "id": "groups", + "title": "Come è organizzata la vista", + "blocks": [ + { + "table": { + "headers": [ + "Sezione", + "Contenuto" + ], + "rows": [ + [ + "Ottimizzazioni post-installazione", + "Gruppo dell'opzione post-installazione selezionata dall'utente." + ], + [ + "Script ProxMenux", + "GPU, Coral, rete, archiviazione, sicurezza, utilità e altri script con strumentazione di audit, inclusi il programma di installazione di ProxMenux e ProxMenux Monitor." + ], + [ + "Pacchetti e utilità installati", + "Software installato da ProxMenux sull'host." + ] + ] + } + }, + { + "p": "All'interno di ogni sezione, Per funzione raggruppa le voci sotto la funzione che li ha fatti." + } + ] + }, + { + "id": "entry", + "title": "Cosa mostra ogni voce", + "blocks": [ + { + "list": { + "items": [ + "Lo script, la funzione e la versione responsabile.", + "La data e la risorsa interessata.", + "Lo stato conosciuto prima e dopo il cambiamento.", + "Le linee aggiunte e rimosse.", + "I pacchetti che sono stati effettivamente aggiunti.", + "Il cambiamento di stato di un servizio.", + "Annullamento: Ripristina esattamente lo stato precedente, Elimina il file (prima non esisteva), Il pacchetto può essere disinstallato, un annullamento parziale oppure Non annullabile dal registro." + ] + } + } + ] + }, + { + "id": "before", + "title": "Cosa significa lo stato precedente", + "blocks": [ + { + "p": "Lo stato precedente può essere contenuto acquisito, un file creato per la prima volta o uno stato sconosciuto. Le modifiche precedenti al registro non possono essere ricostruite; eseguendo nuovamente la funzione viene acquisito prima lo stato trovato in quel momento." + } + ] + }, + { + "id": "limits", + "title": "Ambito del registro", + "blocks": [ + { + "list": { + "items": [ + "Le modifiche manuali e le modifiche apportate da altri software non sono registrate.", + "Solo le operazioni che attraversano i primitivi di audit ProxMenux sono coperte.", + "La registrazione non blocca mai l'operazione che descrive: se l'entrata non può essere scritta, l'operazione continua.", + "Le modifiche successive alla stessa risorsa sono mostrate confrontando lo stato iniziale noto con quello attuale." + ] + } + } + ] + }, + { + "id": "retention", + "title": "Prove memorizzate", + "blocks": [ + { + "table": { + "headers": [ + "Elemento", + "Comportamento" + ], + "rows": [ + [ + "Voci", + "Le voci sono conservate sull'host; nulla viene eliminato automaticamente dal registro." + ], + [ + "Contenuto catturato", + "Un oggetto catturato viene mantenuto mentre una voce si riferisce ad esso." + ], + [ + "Dimensione di una cattura", + "I contenuti sopra 1 MiB non sono memorizzati in tutto; la voce riporta che la cattura è stata ignorata a causa della sua dimensione." + ], + [ + "Lettura", + "Il Monitor non carica oggetti memorizzati sopra 2 MiB." + ], + [ + "Differenza", + "Vengono mostrate al massimo 400 righe; le differenze più lunghe sono contrassegnate come troncate." + ], + [ + "Elenco", + "L'API restituisce 200 voci per richiesta per impostazione predefinita, fino a un massimo di 1000." + ] + ] + } + }, + { + "calloutWarning": { + "title": "Conservare il contenuto non significa annullare automaticamente", + "body": "Il contenuto precedente può essere ispezionato e ripristinato manualmente, ma la vista Modifiche non annulla le operazioni. Una voce di esecuzione registra il comando senza conoscere tutti gli effetti dello strumento eseguito." + } + } + ] + } + ] +} diff --git a/web/messages/it/docs/monitor/audit-report/index.json b/web/messages/it/docs/monitor/audit-report/index.json new file mode 100644 index 00000000..daeca1ef --- /dev/null +++ b/web/messages/it/docs/monitor/audit-report/index.json @@ -0,0 +1,136 @@ +{ + "meta": { + "title": "Audit e report | ProxMenux Monitor", + "description": "Valuta un nodo Proxmox VE, registra le modifiche di ProxMenux e dichiara le aspettative per i sistemi guest e la archiviazione, con report stampabili." + }, + "header": { + "title": "Audit e report", + "description": "Valutazione del nodo, registro delle modifiche di ProxMenux e dichiarazione delle aspettative, con documenti stampabili o salvabili in PDF.", + "section": "ProxMenux Monitor" + }, + "sections": [ + { + "id": "views", + "blocks": [ + { + "calloutInfo": { + "title": "Tre viste, tre domande", + "body": "Audit e report distingue i dati del nodo, gli interventi di ProxMenux e le aspettative dichiarate. Una configurazione non valutabile rispetto a uno scopo dichiarato viene descritta senza essere segnalata come errore." + } + }, + { + "cards": { + "items": [ + { + "icon": "shield", + "title": "Valutazione — come sta il nodo?", + "body": "Esegue i controlli del profilo scelto, compone l'inventario e classifica ciò che ha bisogno di attenzione, con la prova di ogni risultato." + }, + { + "icon": "refresh", + "title": "Cambiamenti — cosa ha fatto ProxMenux?", + "body": "Elenca file, pacchetti, servizi e comandi modificati dagli script ProxMenux dotati di strumentazione di audit, con lo stato precedente quando acquisito." + }, + { + "icon": "fileText", + "title": "Politica — cosa ci si aspetta?", + "body": "Dichiara quali sistemi guest richiedono un backup o devono avviarsi con l'host, quale archiviazione è essenziale e le soglie dei controlli." + } + ] + } + }, + { + "flow": { + "nodes": [ + { + "label": "Valutazione", + "detail": "fatti" + }, + { + "label": "Politica", + "detail": "contesto" + }, + { + "label": "Modifiche", + "detail": "interventi" + } + ], + "caption": "La valutazione fornisce i dati, la politica dà loro contesto e il registro documenta gli interventi di ProxMenux." + } + }, + { + "figure": { + "src": "/monitor/audit/assessment-view.png", + "alt": "Audit e report in ProxMenux Monitor con le viste Valutazione, Modifiche e Politica", + "caption": "Audit & Report, con la vista di valutazione aperta." + } + } + ] + }, + { + "id": "boundaries", + "title": "Tre funzioni diverse", + "blocks": [ + { + "table": { + "headers": [ + "Funzione", + "Che cosa fa" + ], + "rows": [ + [ + "Monitoraggio dello stato", + "Osserva metriche ed eventi continuamente e può generare notifiche." + ], + [ + "Audit e report", + "Esegue una valutazione su richiesta, documenta il nodo e confronta le esecuzioni tra loro." + ], + [ + "Registro delle modifiche", + "Registra le operazioni eseguite da ProxMenux tramite le sue primitive di audit." + ] + ] + } + } + ] + }, + { + "id": "pages", + "title": "Pagine di questa sezione", + "blocks": [ + { + "next": { + "items": [ + { + "label": "Valutazione e inventario", + "href": "/docs/monitor/audit-report/assessment", + "tail": "profili, risultati, rischi accettati e inventario." + }, + { + "label": "Modifiche", + "href": "/docs/monitor/audit-report/changes", + "tail": "il diario di ciò che ProxMenux ha cambiato sull'host." + }, + { + "label": "Politica", + "href": "/docs/monitor/audit-report/policy", + "tail": "sistemi guest, archiviazione e soglie." + }, + { + "label": "Rapporti e confronti", + "href": "/docs/monitor/audit-report/reports", + "tail": "i sei documenti e l'esecuzione di riferimento." + }, + { + "label": "Ambito e garanzie", + "href": "/docs/monitor/audit-report/scope", + "tail": "fonti, limiti e dati memorizzati." + } + ] + } + } + ] + } + ] +} diff --git a/web/messages/it/docs/monitor/audit-report/policy.json b/web/messages/it/docs/monitor/audit-report/policy.json new file mode 100644 index 00000000..6784bfc2 --- /dev/null +++ b/web/messages/it/docs/monitor/audit-report/policy.json @@ -0,0 +1,111 @@ +{ + "meta": { + "title": "Politica | Audit e report", + "description": "Politica del nodo in Audit e report: backup, avvio automatico e obiettivo di ripristino di ogni guest, ruolo di ogni archiviazione e soglie dei controlli." + }, + "header": { + "title": "Politica", + "description": "La politica dichiara ciò che nessuna ispezione può dedurre: lo scopo di ogni guest e archiviazione e le soglie applicate dai controlli.", + "section": "Audit e report" + }, + "sections": [ + { + "id": "principle", + "blocks": [ + { + "calloutInfo": { + "title": "Senza dichiarazione il rapporto descrive; con una dichiarazione valuta", + "body": "Una valutazione vede cosa fa l'host, non a cosa serve. Un guest senza backup e senza scopo dichiarato viene segnalato come osservazione. Se il backup è dichiarato obbligatorio, la stessa assenza diventa un avviso. Non è obbligatorio dichiarare nulla." + } + }, + { + "figure": { + "src": "/monitor/audit/policy-view.png", + "alt": "Vista Politica con guest, archiviazione e soglie del nodo", + "caption": "La vista politica." + } + } + ] + }, + { + "id": "guests", + "title": "Guest", + "intro": "Ogni VM e LXC del nodo ha tre campi. Un valore lasciato come predefinito prende il valore generale, mostrato accanto ad esso.", + "blocks": [ + { + "table": { + "headers": [ + "Campo", + "Valori", + "Effetti sulla valutazione" + ], + "rows": [ + [ + "Backup", + "Richiesto, Non richiesto, Non dichiarato", + "Un backup mancante è un avviso quando è necessario, un'osservazione quando non è indicato, e viene lasciato fuori dal conteggio quando non è richiesto." + ], + [ + "Avvio automatico", + "Richiesto, Non richiesto, Non dichiarato", + "Indica se il guest deve avviarsi insieme all'host." + ], + [ + "Obiettivo di ripristino", + "Ore", + "L'età massima accettabile dell'ultimo backup." + ] + ] + } + } + ] + }, + { + "id": "storage", + "title": "Archiviazione", + "blocks": [ + { + "p": "Un deposito irraggiungibile è segnalato come critico quando è dichiarato essenziale o serve un ospite in esecuzione, come un avvertimento quando il suo ruolo non è dichiarato, e come osservazione quando è dichiarato facoltativo." + } + ], + "intro": "Ogni archiviazione del nodo è dichiarata Essenziale, Facoltativa o Non dichiarata." + }, + { + "id": "thresholds", + "title": "Soglie", + "intro": "Una soglia vuota usa il valore predefinito incluso, mostrato come segnaposto.", + "blocks": [ + { + "list": { + "items": [ + "Controllo della capacità di archiviazione (%) e del riempimento del thin pool (%).", + "Rapporto di overprovisioning thin e rapporto di sovrallocazione della memoria.", + "Intervallo di scrub ZFS (giorni).", + "Limite alternativo dell'età del backup (giorni) e margine sulla pianificazione (rapporto).", + "Avviso di scadenza del certificato (giorni).", + "Durata del servizio del disco (ore) e finestra di errore del disco recente (giorni).", + "Età del rapporto Lynis (giorni) e degli indici dei pacchetti (giorni).", + "Utilizzo del journal rispetto al limite (%).", + "Controllo dello spazio (%) e degli inode (%) del filesystem." + ] + } + } + ] + }, + { + "id": "save", + "title": "Come si salva la politica", + "blocks": [ + { + "p": "La dichiarazione viene convalidata e salvata atomicamente in /usr/local/share/proxmenux/audit_policy.json. Ogni salvataggio include una revisione: se un'altra sessione ha modificato la dichiarazione, la bozza non viene salvata e la vista propone di ricaricare la versione salvata." + }, + { + "calloutWarning": { + "title": "La politica non è mai rinviata", + "body": "ProxMenux non aggiunge requisiti autonomamente. Un campo vuoto mantiene il valore predefinito o rimane non dichiarato; una dichiarazione parziale riguarda solo gli elementi indicati." + } + } + ] + } + ] +} diff --git a/web/messages/it/docs/monitor/audit-report/reports.json b/web/messages/it/docs/monitor/audit-report/reports.json new file mode 100644 index 00000000..682b062e --- /dev/null +++ b/web/messages/it/docs/monitor/audit-report/reports.json @@ -0,0 +1,247 @@ +{ + "meta": { + "title": "Rapporti e confronti | Audit e report", + "description": "I sei documenti di Audit e report, la stampa o il salvataggio in PDF e il confronto delle esecuzioni con un'esecuzione di riferimento." + }, + "header": { + "title": "Rapporti e confronti", + "description": "Sei documenti per domande diverse e il confronto di ogni esecuzione con un'esecuzione di riferimento.", + "section": "Audit e report" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "Sei documenti, non sei stili", + "body": "Il motore seleziona i controlli e le sezioni prima di comporre il documento. Una diagnosi rapida non è un controllo completo con meno pagine, e un inventario non presenta risultati di valutazione. I documenti del campione qui sotto usano i dati fittizi." + } + } + ] + }, + { + "id": "documents", + "title": "I sei documenti", + "blocks": [ + { + "downloads": { + "items": [ + { + "title": "Audit completo", + "body": "Documenta tutto il nodo come registro tecnico.", + "href": "/monitor/audit/sample-audit-full-report.pdf", + "facts": [ + { + "label": "Controlli", + "value": "Tutti i controlli disponibili." + }, + { + "label": "Contenuto", + "value": "Sintesi; identità e cluster; hardware; rete e latenza; archiviazione; guest; passthrough; applicazioni; risultati con evidenze; fonti e ambito." + } + ] + }, + { + "title": "Diagnosi rapida", + "body": "Mostra ciò che ha bisogno di attenzione senza l'inventario completo.", + "href": "/monitor/audit/sample-audit-diagnostic-report.pdf", + "facts": [ + { + "label": "Controlli", + "value": "Gli stessi controlli dell'audit completo." + }, + { + "label": "Contenuto", + "value": "Identità minima; risultati critici; avvisi; osservazioni pertinenti; letture non verificate e azioni prioritarie. Diagrammi, inventario e allegati lunghi sono esclusi." + } + ] + }, + { + "title": "Inventario", + "body": "Descrive ciò che esiste sul nodo senza valutarlo.", + "href": "/monitor/audit/sample-audit-inventory-report.pdf", + "facts": [ + { + "label": "Controlli", + "value": "Nessuno; nessun risultato è classificato." + }, + { + "label": "Contenuto", + "value": "Identità; cluster; CPU e memoria; scheda, BIOS e controller; rete; storage; VM e LXC; passthrough; applicazioni ed elementi gestiti da ProxMenux." + } + ] + }, + { + "title": "Verifica sicurezza", + "body": "Copre l'esposizione e i controlli sull'accesso al nodo.", + "href": "/monitor/audit/sample-audit-security-report.pdf", + "facts": [ + { + "label": "Controlli", + "value": "L'area di sicurezza, oltre ai privilegi dei container, agli aggiornamenti, ai repository e alla catena APT." + }, + { + "label": "Contenuto", + "value": "Identità e cluster; rete e latenza; accesso; firewall; 2FA; certificati; privilegi; aggiornamenti; repository; stato ed età del rapporto Lynis." + } + ] + }, + { + "title": "Affidabilità backup", + "body": "Controlla che la protezione dichiarata esista e che i suoi backup siano utilizzabili.", + "href": "/monitor/audit/sample-audit-backup-report.pdf", + "facts": [ + { + "label": "Controlli", + "value": "L'area di backup, oltre alla connettività di archiviazione e alla consegna delle notifiche." + }, + { + "label": "Contenuto", + "value": "Copertura per ospite; obiettivo dichiarato di recupero; età e risultato; destinazione; conservazione; verifica; lavori falliti; recupero e fonti incomplete." + } + ] + }, + { + "title": "Capacità e usura", + "body": "Misura il margine di crescita e i segni di esaurimento o invecchiamento.", + "href": "/monitor/audit/sample-audit-capacity-report.pdf", + "facts": [ + { + "label": "Controlli", + "value": "Le aree di archiviazione e hardware, oltre a memoria, swap, journal e il filesystem host." + }, + { + "label": "Contenuto", + "value": "Utilizzo e soglie; thin pool; overprovisioning; memoria; inode; ZFS; temperature; ore di funzionamento; errori SMART e vita utile NVMe/SSD." + } + ] + } + ] + } + }, + { + "figure": { + "src": "/monitor/audit/audit-report-preview.png", + "alt": "Prima pagina di un rapporto completo di audit", + "caption": "Ogni documento condivide l'identificatore del rapporto, le sezioni numerate, la data, il nodo, il profilo e il piè di pagina." + } + }, + { + "p": "In base al profilo, il documento include identità del nodo e data della valutazione, sintesi, riepilogo per area, struttura di hardware, rete e archiviazione, protezione dei guest, risultati con evidenze, fonti illeggibili e ambito e politica applicati." + } + ] + }, + { + "id": "print", + "title": "Stampa o salvataggio come PDF", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Esegui", + "body": "La valutazione usa il profilo selezionato in Rapporto." + }, + { + "title": "Verifica", + "body": "L'esecuzione completata mostra risultati, fonti non leggibili e politica applicata." + }, + { + "title": "Genera report", + "body": "Genera rapporto apre la vista preparata come documento." + }, + { + "title": "Stampa", + "body": "Stampa o salva come PDF apre la finestra di stampa del browser per scegliere una stampante o Salva come PDF." + } + ] + } + }, + { + "calloutTip": { + "title": "La stampa è un documento, non uno screenshot", + "body": "La barra delle azioni è nascosta, le tabelle che continuano sulla pagina successiva ripetono l'intestazione, i blocchi evitano interruzioni inutili e ogni pagina conserva identificazione e numerazione." + } + } + ] + }, + { + "id": "compare", + "title": "Confronto con un'esecuzione di riferimento", + "intro": "Usa come riferimento contrassegna un'esecuzione completata. Le successive vengono confrontate con essa e i risultati vengono raggruppati in:", + "blocks": [ + { + "table": { + "headers": [ + "Gruppo", + "Significato" + ], + "rows": [ + [ + "Nuovo", + "Segnalato ora e non prima." + ], + [ + "Peggiorati", + "Ancora segnalati, ma più gravi o con effetti più estesi di prima." + ], + [ + "Migliorati", + "Ancora segnalati, ma meno gravi o con effetti meno estesi di prima." + ], + [ + "Risolto", + "Non sono più segnalati e nessuno li ha accettati." + ], + [ + "Accettati", + "Non più contato perché è stato accettato un rischio, non perché l'host è cambiato." + ], + [ + "Non più valutati", + "Presenti prima ma assenti da questa esecuzione; non è stato verificato che siano scomparsi." + ] + ] + } + }, + { + "table": { + "headers": [ + "Esecuzione di riferimento", + "Comportamento" + ], + "rows": [ + [ + "Impostarlo", + "Qualsiasi esecuzione terminata può essere contrassegnata; nessuna è contrassegnata automaticamente." + ], + [ + "Cambiarlo", + "Contrassegnare un'altra esecuzione cambia il riferimento senza eliminare la cronologia." + ], + [ + "Comparazione", + "Se non vengono selezionate due esecuzioni, il confronto usa quella di riferimento e quella selezionata o più recente." + ], + [ + "Conservazione delle esecuzioni", + "Vengono conservate le 30 esecuzioni più recenti; quella di riferimento non viene mai eliminata." + ], + [ + "Senza un riferimento", + "La vista indica che non è ancora stata scelta un'esecuzione di riferimento, quindi manca una base per il confronto." + ] + ] + } + }, + { + "calloutWarning": { + "title": "Un rapporto descrive un momento", + "body": "Una valutazione non certifica un intero periodo. I risultati vecchi non descrivono più lo stato attuale; la vista mostra l'età dell'ultima esecuzione e ogni fonte conserva il momento della raccolta." + } + } + ] + } + ] +} diff --git a/web/messages/it/docs/monitor/audit-report/scope.json b/web/messages/it/docs/monitor/audit-report/scope.json new file mode 100644 index 00000000..dc02d56a --- /dev/null +++ b/web/messages/it/docs/monitor/audit-report/scope.json @@ -0,0 +1,115 @@ +{ + "meta": { + "title": "Ambito e garanzie | Audit e report", + "description": "Origine dei dati di Audit e report, limiti del suo ambito, garanzie di progettazione e posizione dei dati." + }, + "header": { + "title": "Ambito e garanzie", + "description": "Da dove provengono i dati di una valutazione, cosa rimane fuori dal suo ambito e dove Audit e report conserva i dati.", + "section": "Audit e report" + }, + "sections": [ + { + "id": "sees", + "title": "Cosa osserva", + "blocks": [ + { + "list": { + "items": [ + "La configurazione e lo stato del nodo locale.", + "La configurazione dichiarata delle VM e dei LXC.", + "Lo stato della archiviazione come rilevato da Proxmox VE.", + "La cronologia disponibile dei backup e delle verifiche.", + "Dati SMART e gli eventi che il Monitor ha raccolto.", + "Lo stato dei servizi, cluster, HA e fonti locali." + ] + } + } + ] + }, + { + "id": "outside", + "title": "Che cosa è fuori dalla sua vista", + "blocks": [ + { + "list": { + "items": [ + "L'interno degli ospiti, oltre quello che dichiarano a Proxmox VE.", + "Apparecchiature di rete al di fuori dell'host.", + "Dipendenze remote che il nodo non può osservare.", + "Stato fisico che l'hardware non rende disponibile.", + "Il registro delle modifiche non include azioni manuali o di altri programmi." + ] + } + }, + { + "calloutWarning": { + "title": "Le prove mancanti non sono prove di assenza", + "body": "Una fonte che non può essere letta dà un risultato non verificato o incompleto, mai conformante. Il rapporto elenca le fonti che non erano disponibili." + } + } + ] + }, + { + "id": "guarantees", + "title": "Garanzie del design", + "blocks": [ + { + "list": { + "items": [ + "Identificatori stabili per i controlli.", + "Cronologia delle esecuzioni e dei risultati.", + "Una politica validata, salvata atomicamente.", + "Rischi accettati con un motivo, visibile.", + "Attribuzione di modifiche allo script e alla funzione.", + "Acquisizione dello stato prima e dopo, quando disponibile.", + "Un risultato esplicito quando qualcosa non può essere misurato o catturato." + ] + } + } + ] + }, + { + "id": "storage", + "title": "Dove vengono memorizzati i dati", + "blocks": [ + { + "table": { + "headers": [ + "Dati", + "Percorso" + ], + "rows": [ + [ + "Politica", + "/usr/local/share/proxmenux/audit_policy.json" + ], + [ + "Valutazioni", + "Il database di audit del Monitor" + ], + [ + "Oggetti catturati", + "/usr/local/share/proxmenux/changes/objects/" + ], + [ + "Voci in attesa", + "/usr/local/share/proxmenux/changes/spool/" + ], + [ + "Registro consolidato", + "/usr/local/share/proxmenux/changes.db" + ] + ] + } + }, + { + "calloutInfo": { + "title": "Uno strumento di verifica, non una certificazione", + "body": "Audit e report valuta, confronta e documenta il nodo. I risultati si interpretano considerando lo scopo del sistema, la politica dichiarata e le fonti disponibili." + } + } + ] + } + ] +} diff --git a/web/messages/it/docs/monitor/dashboard/apps.json b/web/messages/it/docs/monitor/dashboard/apps.json new file mode 100644 index 00000000..adee7abc --- /dev/null +++ b/web/messages/it/docs/monitor/dashboard/apps.json @@ -0,0 +1,174 @@ +{ + "meta": { + "title": "Pannello Apps: un lanciatore per tutti i collegamenti web | ProxMenux", + "description": "Utilizzare il cruscotto Apps per aprire i Link Web registrati LXC e link personalizzati, organizzarli per categoria, e saltare indietro all'ospite che possiede ogni servizio." + }, + "header": { + "title": "Dashboard: scheda Apps", + "description": "Un singolo lanciatore per le interfacce web che si utilizzano attraverso il nodo, se provengono da un'applicazione LXC registrata o da un collegamento Web personalizzato.", + "section": "ProxMenux Monitor · Dashboard" + }, + "intro": { + "title": "Un lanciatore, non un installatore di applicazione", + "body": "La scheda Apps non installa software né scopre servizi. Raggruppa i collegamenti salvati in una griglia ricercabile. I link LXC si configurano nella scheda App del guest; i link personalizzati includono servizi VM, proxy inversi e pannelli esterni." + }, + "sources": { + "heading": "Cosa appare in Apps", + "intro": "Ogni URL avviabile diventa la propria carta. La fonte determina dove la carta viene modificata, ma non come sembra durante l'uso normale.", + "colSource": "Fonte", + "colAppears": "Che cosa appare", + "colManagedFrom": "Dove è gestito", + "rows": [ + { + "source": "Applicazione registrata LXC", + "appears": "Una scheda per ogni collegamento Web salvato sul record di applicazione.", + "managedFrom": "VM & LXCs → LXC modal → App" + }, + { + "source": "Collegamento personalizzato legato ad un ospite", + "appears": "Un URL di servizio associato a una specifica VM o LXC.", + "managedFrom": "Apps → Modifica" + }, + { + "source": "Collegamento personalizzato senza associazione", + "appears": "Qualsiasi destinazione HTTP(S), incluso un servizio esterno o pubblicato tramite proxy inverso.", + "managedFrom": "Apps → Modifica" + } + ], + "relationshipTitle": "App e la scheda App LXC hanno diversi lavori", + "relationshipBody": "La scheda App del LXC gestisce identità, link web e tracciamento opzionale della versione. Apps usa questi link per aprirli rapidamente. Modificare una scheda LXC riporta quindi al record del guest senza duplicare la configurazione." + }, + "cards": { + "heading": "Come utilizzare una carta", + "intro": "L'intera carta è l'obiettivo di lancio, mentre i suoi controlli più piccoli forniscono contesto senza aprire il servizio.", + "items": [ + "Fare clic sulla scheda per aprire il suo URL in una nuova scheda del browser.", + "Il logo utilizza prima il logo Web Link e torna al logo dell'applicazione quando necessario.", + "Il chip di categoria utilizza lo stesso colore ed etichetta del corrispondente collegamento Web nella scheda App LXC.", + "L'etichetta del guest identifica la VM o il LXC associato. Un clic apre la sua finestra: i link LXC aprono App, quelli VM Stato.", + "Una freccia verso l'alto viola significa che l'applicazione specifica o l'immagine Docker ha un aggiornamento disponibile. Non è un numero di aggiornamento generale per l'intero ospite." + ] + }, + "toolbar": { + "heading": "Cerca, filtra e ordina", + "intro": "La barra degli strumenti restringe una grande collezione di applicazioni senza cambiare i record salvati.", + "items": [ + "La ricerca corrisponde al nome dell'applicazione, al nome degli ospiti, alla VMID e alla categoria.", + "Il filtro categoria mostra una categoria alla volta o tutte le applicazioni.", + "Ordina per Nome, ID o Categoria. L'ordinazione per categoria aggiunge titoli tra i gruppi di schede.", + "L'ordine viene ricordato in questo browser. Testo di ricerca e filtro categoria vengono azzerati tornando alla pagina.", + "La scheda App rimane disponibile quando la griglia è vuota, quindi il primo link personalizzato può essere aggiunto senza prima registrare un'applicazione LXC." + ] + }, + "customLinks": { + "heading": "Aggiungere e modificare link web personalizzati", + "intro": "Utilizzare un link personalizzato quando il servizio non è rappresentato da un'applicazione LXC registrata.", + "steps": [ + "Premi Aggiungi link nella barra degli strumenti o nella vista vuota.", + "Inserisci un nome e un URL completo http:// o https://.", + "A richiesta aggiungere un logo, scegliere o creare una categoria, e legare il link a un VM o LXC.", + "Salva il collegamento. La scheda appare subito nella griglia.", + "Per modificare o rimuovere un link personalizzato scegli Modifica e usa la matita sulla scheda." + ], + "colField": "Campo", + "colRequired": "Obbligatorio", + "colPurpose": "Scopo", + "fields": [ + { + "field": "Nome", + "required": "Sì", + "purpose": "Il titolo della carta e il termine di ricerca." + }, + { + "field": "URL", + "required": "Sì", + "purpose": "La destinazione completa HTTP(S) aperta dalla scheda." + }, + { + "field": "URL logo", + "required": "No", + "purpose": "Un'immagine remota mostrata sulla scheda." + }, + { + "field": "Categoria", + "required": "No", + "purpose": "Aggiunge un badge condiviso e consente di filtrare la categoria." + }, + { + "field": "Associazione al guest", + "required": "No", + "purpose": "Associa il collegamento con un VM o LXC e consente la scorciatoia degli ospiti." + } + ], + "editTitle": "Modificare la fonte della verità", + "editBody": "La modalità modifica mostra matite solo per i link personalizzati. Per una scheda di applicazione LXC apri la scheda App del guest e modifica il link salvato." + }, + "categories": { + "heading": "Categorie e segnali di aggiornamento", + "intro": "Le categorie organizzano i link; gli indicatori di aggiornamento descrivono lo stato del software. Sono intenzionalmente separati.", + "items": [ + "La registrazione LXC, assistita da un catalogo, può preriempire una categoria, ma rimane modificabile.", + "I nomi di categoria personalizzati possono essere creati dallo stesso selettore e poi riutilizzati dal filtro.", + "I colori della categoria sono deterministici e si adattano al tema chiaro o scuro. Gamma viola e rossa sono riservati per gli stati di aggiornamento e pericolo.", + "Per Docker, ProxMenux associa la scheda al container o all'immagine e mostra gli aggiornamenti dell'immagine. Quelli di Docker Engine rimangono nella scheda Aggiornamenti del LXC." + ] + }, + "persistence": { + "heading": "Persistenza e comportamento della cache", + "intro": "Il pannello usa i dati già disponibili di Monitor senza analizzare di nuovo ogni guest.", + "items": [ + "I link personalizzati vengono salvati atomicamente in /etc/proxmenux/custom_links.json e caricati in memoria all'avvio di Monitor.", + "I link LXC registrati rimangono parte del record Monitor salvato della loro applicazione; il cruscotto Apps non li duplica nel file di collegamento personalizzato.", + "Creare, modificare o cancellare un link personalizzato aggiorna immediatamente la lista in memoria.", + "La preferenza di ordinamento è locale al browser e non si sincronizza tra dispositivi o utenti.", + "La posizione di Apps nella navigazione principale si configura separatamente in Impostazioni → Ordine di navigazione." + ] + }, + "troubleshooting": { + "heading": "Situazioni comuni", + "colProblem": "Situazione", + "colResolution": "Risoluzione", + "rows": [ + { + "problem": "Un'applicazione LXC è registrata ma nessuna scheda appare", + "resolution": "Aprire la scheda App e aggiungere almeno un collegamento Web. Il tracciamento della versione da solo non crea una carta di lancio." + }, + { + "problem": "L'URL o il logo è sbagliato", + "resolution": "Modificare il link personalizzato in Apps, o modificare il collegamento Web nella scheda app LXC." + }, + { + "problem": "Manca un servizio Docker", + "resolution": "Modificare l'applicazione Docker registrata e salvare la porta web pubblicata del servizio come Web Link." + }, + { + "problem": "La freccia viola si riferisce all'aggiornamento sbagliato Docker", + "resolution": "Rivedere il nome e la descrizione del Web Link in modo che possano essere abbinati al contenitore o all'immagine." + }, + { + "problem": "Apps si apre prima di Panoramica del sistema", + "resolution": "Il primo elemento salvato in Impostazioni → ordine di navigazione diventa la scheda di atterraggio. Ripristinare l'ordine predefinito o spostare Panoramica prima." + } + ] + }, + "whereNext": { + "heading": "Dove proseguire", + "items": [ + { + "label": "scheda App LXC", + "href": "/docs/monitor/dashboard/vms-lxcs/app", + "tail": "— registrare le applicazioni, i Link Web e il monitoraggio delle versioni facoltative." + }, + { + "label": "scheda Aggiornamenti LXC", + "href": "/docs/monitor/dashboard/vms-lxcs/updates", + "tail": " — configura ed esegui aggiornamenti di applicazioni, Docker Engine e immagini." + }, + { + "label": "Scheda delle impostazioni", + "href": "/docs/monitor/dashboard/settings#navigation-order", + "tail": " — cambia l'ordine di navigazione e la scheda iniziale." + } + ] + } +} diff --git a/web/messages/it/docs/monitor/dashboard/hardware.json b/web/messages/it/docs/monitor/dashboard/hardware.json new file mode 100644 index 00000000..039d5771 --- /dev/null +++ b/web/messages/it/docs/monitor/dashboard/hardware.json @@ -0,0 +1,248 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Pannello: Hardware | Documentazione ProxMenux", + "description": "La scheda Hardware inventaria la macchina fisica: CPU e scheda madre, moduli di memoria, sensori termici, GPU con monitoraggio per slot e installazione driver in un clic, acceleratori Coral TPU, riepilogo storage con velocità dei collegamenti, elenchi PCI e USB, consumo, alimentatori, ventole e UPS." + }, + "header": { + "title": "Pannello: Hardware", + "description": "La macchina fisica in uno schermo — CPU e l'identità della scheda madre, ogni modulo di memoria, sensori termici in tutti i sottosistemi, GPU con l'utilizzo dal vivo e un installatore driver integrato, Coral TPUs, ogni dispositivo PCI e USB con il suo driver del kernel, l'inventario del disco completo con velocità di collegamento negoziate, più potenza, raffreddamento e UPS.", + "section": "ProxMenux Monitor · Dashboard" + }, + "intro": { + "title": "Costruito con strumenti standard", + "body": "La maggior parte dei dati proviene da lscpu, dmidecode, lspci, lsusb, lsblk, smartctl, nvme, sensors, nvidia-smi, intel_gpu_top, amdgpu_top, ipmitool e upsc. Le sezioni appaiono solo quando lo strumento pertinente restituisce dati: senza UPS non appare la scheda UPS e senza IPMI non appaiono i dati di potenza fuori banda." + }, + "thresholds": { + "title": "Colori e soglie di stato applicate qui", + "intro": "Ogni indicatore e lettura di temperatura usa la stessa scala: verde sotto Avviso, ambra tra Avviso e Critico, rosso da Critico in poi. Valori predefiniti consigliati di ProxMenux:", + "items": [ + "Temperatura CPU — avviso 80 °C, critico 90 °C.", + "Temperatura del disco — HDD 60/65 °C · SSD 70/75 °C · NVMe 80/85 °C · SAS 55/65 °C (avvertimento / critico)." + ], + "outro": "Ogni valore è configurabile per host. Impostazioni → Soglie del monitor di integrità centralizza le impostazioni e spiega come regolarle." + }, + "sections": { + "heading": "Sezioni", + "intro": "Le sezioni appaiono in questo ordine, dall’alto in basso. Alcune richiedono lo hardware o lo strumento corrispondente e sono indicate come (condizionale).", + "systemInfoTitle": "Informazioni sistema", + "systemInfoIntro": "Due blocchi affiancati, sempre presenti:", + "systemInfoItems": [ + "CPU — modello, microarchitettura, socket/core/thread, frequenze base e boost, funzionalità di virtualizzazione (VT-x / AMD-V) e topologia della cache.", + "Scheda madre — produttore, modello, versione e data BIOS, UUID SMBIOS. Aiuta a trovare la pagina corretta del produttore per gli aggiornamenti firmware." + ], + "memoryTitle": "Moduli memoria", + "memoryBody": "Una riga per slot occupato da dmidecode: etichetta, capacità del modulo, tipo (DDR4 / DDR5 / varianti ECC), velocità configurata e nominale, produttore, codice prodotto e numero di serie. Gli slot vuoti sono attenuati per mostrare le possibilità di espansione.", + "thermalTitle": "Monitoraggio termico", + "thermalIntro": "Sette blocchi con dati da lm-sensors, sysfs e lettori specifici per strumento. I sensori hwmon di storage sono associati al dispositivo a blocchi fisico, con modello e percorso /dev/.... Un blocco si nasconde se la categoria non contiene sensori.", + "thermalItems": [ + "CPU — temperatura del package e di ogni core.", + "GPU — sensori di GPU dedicata tramite nvidia-smi / amdgpu_top e iGPU Intel. Include hot spot e temperatura di giunzione della memoria quando il driver li espone.", + "NVME — temperatura composita del controller associata al namespace NVMe esatto.", + "HDD — Letture drivetemp per dispositivi di blocco rotazionale.", + "SSD — Letture drivetemp per dispositivi di blocco SATA/SAS non-rotazionali.", + "PCI — sensori di dispositivi collegati a PCI, come HBA e schede di rete con sensori interni.", + "OTHER — chipset, VRM, sensori ambientali che non si adattano altrove." + ] + }, + "graphics": { + "heading": "Schede grafiche", + "intro": "Ogni controller video appare in una scheda con produttore, modello, tipo (Integrata / PCI / BMC), indirizzo PCI (BDF), driver del kernel e moduli. Cambia modalità alterna condivisione LXC con driver nativo e passthrough VM (vfio-pci). Cambia modalità GPU (VM ↔ LXC) spiega gli effetti sull'host.", + "vfioImageAlt": "Schede grafiche: Matrox G200EH integrata associata a mgag200, pronta per LXC, e NVIDIA Quadro P400 associata a vfio-pci, pronta per passthrough VM", + "vfioImageCaption": "Due GPU rilevate: il chip BMC Matrox usa il driver nativo ed è pronto per LXC; NVIDIA Quadro P400 è associata a vfio-pci, pronta per passthrough VM.", + "lxcImageAlt": "Schede grafiche: iGPU Intel UHD Graphics con i915 e NVIDIA Quadro P1000 con nvidia, entrambe pronte per container LXC", + "lxcImageCaption": "Stesso nodo dopo aver cambiato la scheda NVIDIA al driver nativo — entrambe le GPU ora pronte per contenitori LXC.", + "realtimeTitle": "Finestra di monitoraggio in tempo reale", + "realtimeBody": "Un clic apre il monitoraggio per slot, che interroga lo strumento del produttore ogni tre secondi. Mostra produttore, tipo, slot PCI, driver, moduli del kernel, utilizzo dei motori (Render/3D, Video, Blitter, VideoEnhance), frequenze grafiche e di memoria, temperatura, consumo se disponibile, VRAM e processi attivi con carico per processo. Dati da /api/gpu/<slot>/realtime.", + "toolsIntro": "Lo strumento del fornitore utilizzato per GPU:", + "headerVendor": "Produttore", + "headerTool": "Strumento", + "headerProject": "Progetto", + "tools": [ + { + "vendor": "NVIDIA", + "tool": "nvidia-smi", + "projectLabel": "developer.nvidia.com", + "projectHref": "https://developer.nvidia.com/nvidia-system-management-interface" + }, + { + "vendor": "Intel iGPU", + "tool": "intel_gpu_top (igt-gpu-tools)", + "projectLabel": "gitlab.freedesktop.org", + "projectHref": "https://gitlab.freedesktop.org/drm/igt-gpu-tools" + }, + { + "vendor": "AMD", + "tool": "amdgpu_top", + "projectLabel": "github.com/Umio-Yasuno/amdgpu_top", + "projectHref": "https://github.com/Umio-Yasuno/amdgpu_top" + }, + { + "vendor": "Matrox / ASPEED (BMC)", + "tool": "— (solo visualizzazione)", + "projectLabel": "Rilevato e identificato come BMC; nessun monitoraggio in tempo reale." + } + ], + "nvidiaImageAlt": "Monitoraggio NVIDIA Quadro P1000: produttore NVIDIA, driver nvidia caricato, frequenza grafica 1.26 GHz, memoria 2.50 GHz, temperatura 50 °C, motori allo 0 %, nessun processo attivo, memoria totale 4096 MiB", + "nvidiaImageCaption": "NVIDIA Quadro P1000 con driver proprietario: frequenze, temperatura, barre di utilizzo dei motori e processi attivi.", + "intelImageAlt": "Monitoraggio iGPU Intel UHD Graphics con i915: consumo 11.31 W, carico video 1 % e processo ffmpeg che usa 8 MB", + "intelImageCaption": "Intel iGPU con i915 attivo. La tabella dei processi attivi raccoglie un lavoro ffmpeg utilizzando il motore video.", + "amdImageAlt": "Monitoraggio GPU integrata AMD Lucienne con amdgpu: motori allo 0 % e amdgpu_top come processo attivo", + "amdImageCaption": "iGPU AMD monitorata con amdgpu_top. Lo strumento appare come processo attivo perché acquisisce i dati in tempo reale.", + "installTitle": "Installare il driver NVIDIA dalla finestra", + "installBody": "Con nouveau/nvidiafb senza driver proprietario NVIDIA, non sono disponibili frequenze, consumo e carico per processo. La finestra offre Installa driver NVIDIA, che esegue lo script di Installa driver NVIDIA (host).", + "noDriverAlt": "Monitoraggio NVIDIA Quadro P620 con nvidiafb e nouveau caricati, avviso Monitoraggio esteso non disponibile e pulsante blu Installa driver NVIDIA", + "noDriverCaption": "Driver proprietario non ancora installato: la finestra offre un installatore in un clic.", + "promptAlt": "Conferma di installazione del driver NVIDIA con GPU rilevate, container LXC con passthrough NVIDIA e pulsanti Sì/Annulla", + "promptCaption": "Riepilogo prima dell'installazione: GPU rilevate, container LXC con passthrough NVIDIA e azioni previste. Nessuna modifica prima della conferma.", + "successAlt": "Uscita terminale che mostra il driver NVIDIA 580.105.08 installato con successo e nvidia-smi segnalando un Quadro P620", + "successCaption": "Installazione di successo — il NVIDIA .run costruito tramite DKMS, il servizio di persistenza è in atto, e nvidia-smi segnala il GPU.", + "warningTitle": "Scegli una versione del driver supportata dalla GPU", + "warningBody": "I nuovi rami NVIDIA abbandonano il supporto per famiglie GPU precedenti, come Maxwell o Kepler. Se nvidia-smi mostra \"No devices were found\" dopo l'installazione o DKMS fallisce, il ramo può essere incompatibile. Ripeti con un ramo precedente, come legacy 470.x per Kepler. Verifica la compatibilità nella pagina ufficiale di ricerca dei driver.", + "whereGoIntro": "Dove andare da qui:", + "whereGoItems": [ + "Installa driver NVIDIA (host) — guida completa, matrice di compatibilità del kernel, patch NVENC opzionale e propagazione ai LXC.", + "Cambia modalità GPU (VM ↔ LXC) — effetti del comando Cambia modalità nella scheda.", + "Aggiungi GPU a VM (passthrough) e Aggiungi GPU a LXC — prima assegnazione di una GPU non associata." + ] + }, + "coral": { + "heading": "Coral TPU / Acceleratori AI", + "subHeading": "(condizionale)", + "intro": "Appare con dispositivi Google Coral o altri acceleratori AI collegati. Ogni finestra mostra connessione (M.2 / mini-PCIe / USB), larghezza PCIe, ID produttore/prodotto, supporto software (apex nel kernel per PCIe, libedgetpu in spazio utente per USB), moduli (gasket + apex), nodi (/dev/apex_*), stato del runtime Edge TPU, temperatura in tempo reale e soglie di avviso del firmware.", + "imageAlt": "Coral Edge TPU dettaglio modale: connessione PCIe/M.2, collegamento PCIe 5.0 GT/s x1, fornitore 1ac1:089a, driver del kernel apex, Moduli gasket e apex caricati, /dev/apex_0 presente, Edge TPU Runtime non installato, temperatura 53.5 °C con soglie di avviso hardware", + "imageCaption": "M.2 Coral con i moduli del kernel host caricati, il nodo del dispositivo e gli avvisi di temperatura del firmware esposti. La linea runtime diventa verde una volta installato il runtime Edge TPU corrispondente.", + "pathsIntro": "Esistono due percorsi di installazione a seconda del fattore forma:", + "pathsItems": [ + "M.2 / Mini-PCIe — l'host ha bisogno dei moduli del kernel gasket + apex costruiti tramite DKMS così il nodo del dispositivo /dev/apex_0 appare all'avvio.", + "USB Accelerator — l'host ha solo bisogno del runtime user-space Edge TPU (libedgetpu1-std) del repository APT di Google." + ], + "outro": "Installa Coral TPU sull'host rileva e gestisce entrambe le varianti. Informazioni e runtime ufficiale sono su coral.ai/docs. Poi assegna il dispositivo a un container con Aggiungi Coral TPU a LXC." + }, + "storage": { + "heading": "Riepilogo storage", + "intro": "Tutti i dispositivi a blocchi noti al kernel, raggruppati per tipo. Ogni disco mostra nome (sda, nvme0n1, zram0…), tipo (SSD, HDD, NVMe SSD), modello e collegamento negoziato. Un clic apre modello, numero di serie, capacità, interfaccia e velocità attuale e massima.", + "imageAlt": "Riepilogo storage con undici dispositivi a blocchi (SSD SATA, HDD SATA, SSD NVMe e zram), modelli e velocità negoziate; due NVMe in 3.0 x4 con velocità attuale evidenziata", + "imageCaption": "Undici dispositivi su questo nodo. I collegamenti SATA appaiono come SATA <version>, <Gb/s> (current: ...); gli NVMe come <PCIe gen> x<width>.", + "nvmeBody": "Per ogni NVMe la riga confronta il collegamento negoziato con il massimo supportato. Se differiscono, per esempio un SSD Gen3 x4 a 3.0 x1 in uno slot con una sola linea, il valore attuale appare in ambra. Aiuta a diagnosticare dischi lenti o cambiamenti delle linee dopo un aggiornamento BIOS.", + "nvmeModalAlt": "Dettagli NVMe di nvme0n1: NVMe SSD, 953.9 GB, collegamento attuale 3.0 x1 in ambra, massimo 3.0 x4, WDC CL SN720, numero di serie e interfaccia PCIe/NVMe", + "nvmeModalCaption": "Dettagli NVMe con collegamento ridotto: il disco supporta x4, ma lo slot è cablato x1.", + "outro": "Dati SMART, autotest, cronologia e rapporto PDF sono in Pannello: Storage. Gli stessi dati alimentano Integrità e test SMART dei dischi. Un test lungo dallo script scrive il JSON mostrato da Monitor in Storage → Cronologia." + }, + "pci": { + "heading": "Dispositivi PCI", + "intro": "Dispositivi PCI identificati dal BDF PCI (Bus:Device.Function, ad esempio 03:00.0) e classe (Controller di storage, Controller USB, Scheda grafica, Controller di rete, Controller audio…). Ogni scheda mostra produttore, nome e driver del kernel associato, utili per diagnosticare passthrough, gruppi IOMMU o driver errati.", + "imageAlt": "PCI Dispositivi elenco quindici dispositivi raggruppati per classe: controller di archiviazione su ahci/nvme, controller USB, schede grafiche (uno su vfio-pci, uno sul driver nativo), controllori di rete su igb / tg3, un controller audio accanto a un GPU", + "imageCaption": "Quindici dispositivi su questo nodo. Notare il GPU e la sua funzione audio compagno sia legato a vfio-pci — che è una scheda preparata per il passaggio VM.", + "bdfTitle": "Leggere il BDF", + "bdfBody": "03:00.0 indica bus PCI 03, dispositivo 00, funzione 0. Le GPU dedicate usano di solito .0 per la GPU e .1 per l'audio HDMI. Entrambe le funzioni si passano insieme alla VM; Cambia modalità GPU pulisce quindi anche le associazioni audio orfane quando si esce dalla modalità VM." + }, + "usb": { + "heading": "Dispositivi USB", + "intro": "Dispositivi USB con produttore e prodotto, versione USB, indirizzo bus:device, ID vendor:product e driver del kernel. Sono classificati per ruolo: Comunicazioni (adattatori Z-Wave / Zigbee), UPS, storage o HID. Si identificano così senza confrontare gli ID.", + "imageAlt": "Dispositivi USB: Aeotec Z-Wave Z-Stick, coordinatore Zigbee ConBee II e UPS Ellipse ECO, con versione USB, indirizzo, ID vendor:product e driver associato", + "imageCaption": "Tre dispositivi USB — due radio home-automazione su usbfs e un UPS su usbfs (NUT parla con libusb)." + }, + "power": { + "heading": "Consumo energetico", + "subHeading": "(condizionale)", + "intro": "Appare se l'host fornisce telemetria di potenza. Mostra due fonti indipendenti quando disponibili:", + "items": [ + "Consumo totale ACPI / IPMI — potenza di tutto il sistema misurata da un sensore della scheda madre o dal BMC. Tipico delle schede server.", + "Consumo del package CPU — contatori Intel RAPL o equivalente AMD. Distingue il consumo CPU dal resto sulle schede consumer prive di sensore totale." + ], + "supplyImageAlt": "Consumo: 198 W totali via ACPI e due alimentatori con stato OK e potenza di uscita di 185 W e 5 W", + "supplyImageCaption": "Scheda server con un sensore ACPI e due alimentatori via IPMI: il secondo è ridondante, a riposo con 5 W.", + "cpuImageAlt": "Consumo su scheda consumer: solo 8.7 W di CPU tramite Intel RAPL", + "cpuImageCaption": "Scheda consumer senza sensore totale: mostra solo il consumo CPU tramite RAPL." + }, + "psu": { + "heading": "Alimentatori", + "subHeading": "(condizionale)", + "body": "Sulle macchine server con doppi alimentatori, IPMI mostra presenza (PSU 1 / PSU 2 / …), tensione di ingresso, potenza di uscita e stato OK/guasto. Da controllare dopo un'interruzione elettrica sui nodi con alimentatori ridondanti." + }, + "fans": { + "heading": "Ventole sistema", + "subHeading": "(condizionale)", + "body": "RPM di ogni ventola con minigrafico, se supportato. Senza dati individuali mostra una sola lettura della ventola del telaio." + }, + "ups": { + "heading": "Stato UPS", + "subHeading": "(condizionale)", + "body": "Appare con un server NUT (Network UPS Tools) configurato e raggiungibile. Mostra stato (rete / batteria / ricarica / batteria scarica), carica della batteria, autonomia stimata, percentuale di carico, tensione di ingresso, modello e firmware. I dati alimentano anche Sicurezza e certificati del monitor di integrità: il passaggio a batteria viene segnalato subito." + }, + "dataCollected": { + "heading": "Come vengono raccolti i dati", + "headerSection": "Sezione della scheda", + "headerEndpoint": "Endpoint", + "headerSource": "Fonte", + "rows": [ + { + "section": "inventario statico (PCI, CPU, BIOS)", + "endpoint": "/api/hardware", + "source": "lspci -vmm, /proc/cpuinfo, dmidecode; cache per la durata del processo." + }, + { + "section": "Valori del sensore dal vivo", + "endpoint": "/api/hardware/live", + "source": "sensors (lm-sensors), /sys/class/hwmon e /sys/block identificano i dispositivi di storage. Le temperature restano in tempo reale; solo la mappatura hwmon-dispositivo è in cache per 60 secondi." + }, + { + "section": "Storia della temperatura CPU", + "endpoint": "/api/temperature/history", + "source": "Serie temporale registrata ogni 60 secondi dal collettore di temperatura e salvata in SQLite." + }, + { + "section": "metriche live GPU", + "endpoint": "/api/gpu//realtime", + "source": "NVIDIA: nvidia-smi --query-gpu=.... Intel: intel_gpu_top. AMD: sysfs /sys/class/drm/cardN." + } + ], + "codeComment1": "# Confronta l'inventario con la vista del sistema operativo", + "codeComment2": "# Confermare la scheda GPU che il cruscotto vede" + }, + "whereNext": { + "heading": "Dove proseguire", + "items": [ + { + "label": "Installare driver NVIDIA (Host)", + "href": "/docs/hardware/nvidia-host", + "tail": " — script eseguito dal pulsante di installazione della finestra GPU." + }, + { + "label": "Cambia modalità GPU (VM ↔ LXC)", + "href": "/docs/hardware/switch-gpu-mode", + "tail": "— che cosa fa l'interruttore in linea su ogni scheda GPU all'host." + }, + { + "label": "Installare Coral TPU sull'host", + "href": "/docs/hardware/install-coral-tpu-host", + "tail": " — installazione del modulo kernel e del runtime Coral." + }, + { + "label": "Integrità e test disco SMART", + "href": "/docs/disk-manager/smart-disk-test", + "tail": " — script che produce i dati SMART nei dettagli del disco nella scheda Storage." + }, + { + "label": "Dashboard: scheda di stoccaggio", + "href": "/docs/monitor/dashboard/storage", + "tail": " — tabella completa degli attributi SMART, cronologia degli autotest e rapporto PDF." + }, + { + "label": "Monitoraggio integrità", + "href": "/docs/monitor/health-monitor", + "tail": " — categoria CPU e Temperatura, che usa gli stessi sensori." + }, + { + "label": "Riferimento API", + "href": "/docs/monitor/api", + "tail": " — endpoint di hardware e GPU." + }, + { + "label": "Indice del pannello", + "href": "/docs/monitor/dashboard", + "tail": "— le altre schede." + } + ] + } +} diff --git a/web/messages/it/docs/monitor/dashboard/index.json b/web/messages/it/docs/monitor/dashboard/index.json new file mode 100644 index 00000000..8345b722 --- /dev/null +++ b/web/messages/it/docs/monitor/dashboard/index.json @@ -0,0 +1,101 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Dashboard | Documentazione ProxMenux", + "description": "Il pannello è l'interfaccia principale di ProxMenux Monitor: dieci schede, incluso il lanciatore Apps, un'intestazione globale e un ordine di navigazione configurabile." + }, + "header": { + "title": "Dashboard", + "description": "La vista quotidiana di ProxMenux Monitor: dieci schede, incluso il lanciatore Apps, un'intestazione globale e un ordine di navigazione configurabile.", + "section": "ProxMenux Monitor" + }, + "oneHeader": { + "title": "Un'intestazione, dieci schede", + "body": "L'intestazione (logo, nome del nodo, indicatore di stato, tempo di attività, aggiornamento e tema) rimane visibile. La scheda attiva cambia l'intera area dei contenuti. Il colore indica la categoria peggiore del monitoraggio dello stato: lo stesso dato visualizzato nel pannello." + }, + "tabs": { + "heading": "Le dieci schede", + "intro": "Ogni scheda ha una propria pagina dedicata. Le pagine sono aggiunte in modo incrementale come la documentazione è riempita in; di seguito è l'elenco completo e ciò che ciascuno è responsabile.", + "headerTab": "Scheda", + "headerOwns": "Di cosa si occupa", + "rows": [ + { + "name": "Panoramica sistema", + "linksTo": "/docs/monitor/dashboard/system-overview", + "owns": "CPU / widget di memoria / temperatura, conteggio attivo VM & LXC, grafici metrici storici, sommari di archiviazione e rete. Scheda di atterraggio predefinita fino a quando l'ordine di navigazione è personalizzato." + }, + { + "name": "Applicazioni", + "linksTo": "/docs/monitor/dashboard/apps", + "owns": "Lanciatore unificato di collegamenti web LXC registrati e collegamenti personalizzati, con categorie, ricerca, scorciatoie ai guest e indicatori di aggiornamento per applicazione." + }, + { + "name": "Archiviazione", + "owns": "Pool Proxmox, dischi fisici, dati SMART, stato ZFS, usura e durata utile, cronologia delle osservazioni." + }, + { + "name": "Rete", + "owns": "Interfacce fisiche, bond, bridge e OVS, indirizzi IP/MAC, grafici RX/TX e cronologia RRD per interfaccia." + }, + { + "name": "VM e LXC", + "owns": "Inventario dei guest, dettagli di configurazione, metriche e log, azioni di avvio, arresto, riavvio e spegnimento." + }, + { + "name": "Hardware", + "owns": "Modello e topologia CPU, layout di memoria, topologia PCIe, GPU con monitoraggio in tempo reale per-slot." + }, + { + "name": "Log di sistema", + "owns": "Live journalctl con filtri, cronologia delle attività Proxmox, registro delle notifiche, pacchetti di log scaricabili." + }, + { + "name": "Terminale", + "owns": "Shell dell'host o di qualsiasi VM/CT nel browser, con xterm.js tramite WebSocket." + }, + { + "name": "Sicurezza", + "owns": "Impostazione dell'auth, password / Token 2FA / API, log di audit, pannello Fail2Ban opzionale, distribuzione Secure Gateway." + }, + { + "name": "Impostazioni", + "owns": "Lingua di Monitor, ordine di navigazione, canali di notifica, provider IA, soglie di stato, esclusioni e inventario delle ottimizzazioni post-installazione." + } + ] + }, + "headerAnatomy": { + "heading": "Struttura dell'intestazione", + "items": [ + "Logo + nome del prodotto a sinistra. Il logo si trasforma in una variante \"aggiornamento disponibile\" quando viene rilevata una nuova versione Monitor.", + " Identità del nodo: nome ottenuto da pvesh get /nodes, con hostname come alternativa.", + " Indicatore di stato: Regolare (verde), Avviso (giallo), Critico (rosso). Un clic apre il monitoraggio dello stato. Un badge blu info appare se gli elementi ignorati sono ancora nel periodo di soppressione.", + " Tempo di attività: durata di funzionamento dell'host in formato leggibile.", + " Pulsante Aggiorna: ripete le chiamate API dei dati in tempo reale senza ricaricare l'intera pagina.", + " Selettore del tema: chiaro, scuro o sistema. Salvato in localStorage." + ] + }, + "whereNext": { + "heading": "Dove proseguire", + "items": [ + { + "label": "Scheda Apps", + "href": "/docs/monitor/dashboard/apps", + "tail": " — lanciatore unificato di collegamenti web e relazione con le applicazioni LXC registrate." + }, + { + "label": "Scheda Panoramica del sistema", + "href": "/docs/monitor/dashboard/system-overview", + "tail": "— la scheda di atterraggio, completamente documentata." + }, + { + "label": "Monitoraggio integrità", + "href": "/docs/monitor/health-monitor", + "tail": " — finestra dell'indicatore di stato, con dettagli delle dieci categorie." + }, + { + "label": "Architettura", + "href": "/docs/monitor/architecture", + "tail": "— come il cruscotto parla al backend Flask." + } + ] + } +} diff --git a/web/messages/it/docs/monitor/dashboard/network.json b/web/messages/it/docs/monitor/dashboard/network.json new file mode 100644 index 00000000..c3dadb78 --- /dev/null +++ b/web/messages/it/docs/monitor/dashboard/network.json @@ -0,0 +1,251 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Dashboard: scheda Rete | Documentazione ProxMenux", + "description": "La scheda Rete elenca le interfacce dell’host: schede fisiche, bridge, bond, VLAN e interfacce virtuali VM/LXC. Il dettaglio mostra IP, MAC, stato, membri del bond, traffico dall’avvio e storico RRD." + }, + "header": { + "title": "Dashboard: scheda di rete", + "description": "Le interfacce rilevate dal kernel — schede fisiche, bridge, bond, VLAN e porte virtuali VM/LXC — sono raggruppate in tre schede. Fai clic su una riga per vedere indirizzi, contatori del traffico e dati storici RRD.", + "section": "ProxMenux Monitor · Dashboard" + }, + "intro": { + "title": "Dati attuali e storici", + "body": "Lo stato attuale proviene da psutil.net_if_stats() e ip, lo storico della banda dall’archivio RRD Proxmox tramite /api/network/<interface>/metrics. I contatori si aggiornano circa ogni 5 secondi e i dati RRD del grafico vengono caricati su richiesta." + }, + "topRow": { + "heading": "Riga superiore: quattro schede statistiche", + "headerCard": "Scheda", + "headerWhat": "Cosa mostra", + "rows": [ + { + "card": "Traffico rete", + "what": "Velocità RX/TX complessiva di tutte le interfacce, espressa nell’unità appropriata (bps / Kbps / Mbps / Gbps)." + }, + { + "card": "Interfacce attive", + "what": "Due contatori: Physical X / Y e Bridges X / Y, attive rispetto al totale. Un primo controllo quando qualcosa smette di funzionare." + }, + { + "card": "Stato rete", + "what": "Stato rapido: Regolare / Avviso / Critico in base a collegamento, raggiungibilità del gateway e integrità del bridge. Rispecchia la categoria Interfacce di rete di Health Monitor." + }, + { + "card": "Latenza rete", + "what": "Tempo di andata e ritorno verso il gateway con un piccolo grafico. Un clic apre la finestra Latenza di rete descritta sotto: storico e test ping su richiesta verso gateway, Cloudflare o Google, con rapporto PDF scaricabile." + } + ] + }, + "flow": { + "heading": "Schema di flusso di rete", + "intro": "Tra la riga superiore e le tre schede, Network Flow mostra la topologia in tempo reale. I percorsi dei pacchetti collegano le schede fisiche, i bridge al centro e infine VM e container. Gli impulsi animati rappresentano il traffico rx/tx attuale di ogni collegamento.", + "imageAlt": "Schema di flusso di rete — NIC a sinistra, host e ponti nel mezzo, VM e LXC a destra, con impulsi animati su ogni connessione", + "imageCaption": "Flusso di rete — nodi colorati più comete animate la cui direzione e spessore riflettono il traffico dal vivo.", + "elementsTitle": "Cosa mostra il diagramma", + "elementsIntro": "Ogni nodo rappresenta una voce dello stesso inventario delle schede sottostanti. La disposizione come topologia rende subito visibili le relazioni:", + "elements": [ + "Schede di rete (ambra) — interfacce fisiche con collegamento attivo; quelle inattive appaiono attenuate.", + "Host (ambra) — l’host Proxmox tra schede di rete e bridge. Un punto fisso non cliccabile.", + "Bridge (ciano) — bridge Linux e OVS con almeno un guest attivo. Quelli inutilizzati sono nascosti per concentrare il diagramma sul traffico effettivo.", + "LXC (ciano) — container in esecuzione collegati a un bridge.", + "VM (viola) — macchine virtuali in esecuzione collegate a un bridge.", + "Le VM e i container arrestati sono nascosti." + ], + "pulsesTitle": "Cosa codifica l'animazione", + "pulsesBody": "Le comete animate che viaggiano lungo ogni bordo rappresentano il traffico dal vivo:", + "pulses": [ + "Direzione — verso la scheda di rete significa tx del guest; verso il guest, rx.", + "Lo spessore della linea cresce con la velocità rx+tx del guest. Senza traffico resta una linea animata tenue; con molto traffico diventa spessa.", + "Bagliore della testa della cometa — tonalità calda intorno a 1 MB/s, intensa da 30 MB/s. Aiuta a individuare il guest che occupa maggiormente una scheda di rete.", + "Clic — tutti i nodi tranne l’host aprono la finestra di dettaglio dell’interfaccia descritta sotto. Fare clic sull’host non ha effetto: questa vista non prevede una finestra per esso." + ], + "useTitle": "Quando è utile", + "useBody": "Le schede mostrano cosa esiste; il diagramma mostra come è collegato e dove passa il traffico. Puoi individuare guest sullo stesso bridge, due guest molto attivi sulla stessa scheda — un possibile collo di bottiglia — o una VM che satura un collegamento mentre le altre sono inattive." + }, + "groups": { + "heading": "Tre gruppi di interfaccia", + "intro": "Tre schede raggruppano le interfacce per funzione. Ogni intestazione indica quante sono attive. Un’etichetta colorata identifica il tipo di ogni interfaccia:", + "badges": [ + "Blu Physical — NIC reale.", + "Verde Bridge — bridge Linux o OVS (vmbr*).", + "Viola Bond — aggregazione bond / LACP / active-backup.", + "Ciano VLAN — sottointerfaccia VLAN (vmbr0.10, eno1.42, …)." + ], + "clickable": "Ogni riga è cliccabile: interfacce fisiche, virtuali, bridge e bond. Il dettaglio descritto sotto mostra dati di base, IP, contatori e storico RX/TX dall’archivio RRD Proxmox.", + "physicalTitle": "Interfacce fisiche", + "physicalBody": "Interfacce fisiche riconosciute dal kernel: eno1, enp4s0, eth0, wlp3s0, ecc. Ogni dispositivo ha una riga con etichetta blu Physical e stato del collegamento. Compaiono anche i membri di un bond, con riferimento al bond di appartenenza.", + "bridgeTitle": "Interfacce bridge", + "bridgeBody": "Bridge Linux (vmbr0, vmbr1, …) e OVS gestiti da Proxmox. Ogni riga mostra l’etichetta verde Bridge, l’interfaccia fisica se c’è una sola porta e lo stato. I bond hanno l’etichetta viola Bond, le sottointerfacce VLAN quella ciano VLAN.", + "vmTitle": "Interfacce VM / LXC", + "vmBody": "Interfacce tap* e veth* create all’avvio dei guest, una per scheda virtuale. L’intestazione mostra X / Y Active e le righe rimandano alla VM/CT nella scheda VM e LXC. Dopo l’arresto, le voci inattive scompaiono al successivo aggiornamento." + }, + "drillIn": { + "heading": "Dettaglio per interfaccia", + "intro": "Un clic su una riga apre una finestra con cinque sezioni:", + "headerBlock": "Blocco", + "headerContents": "Contenuto", + "rows": [ + { + "block": "Informazioni di base", + "contents": "Nome, tipo (fisica / bridge / bond / VLAN / vm), indirizzo MAC, stato (attivo / inattivo), MTU e interfaccia fisica sottostante per i tipi virtuali." + }, + { + "block": "Membri del bond", + "contents": "Solo per i bond: ogni scheda membro con stato attivo o guasto, modalità del bond (active-backup / 802.3ad / balance-alb / …) e interfaccia principale se configurata." + }, + { + "block": "Indirizzi IP", + "contents": "Ogni indirizzo IPv4 / IPv6 con la lunghezza del prefisso. Gli indirizzi link-locali configurati automaticamente sono elencati ma grigiati." + }, + { + "block": "Grafico storico", + "contents": "Banda RX/TX nell’intervallo scelto (1 ora / 24 ore / 7 giorni / 30 giorni / 1 anno), ottenuta da /api/network/<interface>/metrics (RRD Proxmox)." + }, + { + "block": "Traffico dall'ultimo avvio", + "contents": "Totale di byte e pacchetti RX/TX dall’ultimo avvio dell’host, con contatori di errori e pacchetti scartati." + } + ], + "inactiveTitle": "Il dettaglio delle interfacce inattive resta accessibile", + "inactiveBody": "Se l’interfaccia è inattiva, la finestra mostra l’avviso «Interfaccia inattiva» senza contatori attuali. Configurazione — indirizzi e membri del bond — e storico restano visibili per capire cosa è fallito e quando." + }, + "latency": { + "heading": "Finestra Latenza di rete", + "intro": "Fai clic su Latenza di rete nella riga superiore per aprire la finestra: storico, test su richiesta, tre destinazioni e rapporto PDF scaricabile.", + "targetsTitle": "Destinazioni", + "targetsIntro": "Il menu in alto seleziona la destinazione del ping:", + "targets": [ + "Gateway — il router LAN. Verifica solo il tratto locale per analizzare problemi di switch o cablaggio senza includere la WAN.", + "Cloudflare (1.1.1.1) — resolver DNS pubblico su rete anycast. Verifica il tratto WAN.", + "Google (8.8.8.8) — destinazione pubblica alternativa per confrontare i risultati o in caso di problemi regionali Cloudflare." + ], + "mode1Title": "Modalità 1 — Vista storica", + "mode1Alt": "Finestra di latenza in modalità storica, destinazione Gateway, intervallo di un’ora e misurazioni precedenti tracciate", + "mode1Caption": "Storico del gateway nell’ultima ora. Il processo di raccolta di temperatura e latenza salva le misurazioni nel database ogni 60 secondi.", + "mode1Body1": "Modalità iniziale della finestra. Un secondo menu sceglie l’intervallo (1 ora / 6 ore / 24 ore / 3 giorni / 7 giorni). Sopra compaiono Attuale / Minimo / Media / Massimo e uno stato Eccellente / Buono / Discreto / Scarso secondo le soglie seguenti.", + "mode1Body2": "Fonte: le misurazioni usate da Health Monitor per rilevare rallentamenti persistenti. Il thread in background _temperature_collector_loop misura il gateway ogni 60 secondi e conserva lo storico in un database SQLite locale.", + "mode2Title": "Modalità 2 — Test in tempo reale", + "mode2Alt": "Finestra di latenza con ping in tempo reale verso Cloudflare, avanzamento al 50% e nuove misurazioni nel grafico", + "mode2Caption": "Test di due minuti verso Cloudflare con una lettura ogni cinque secondi, subito aggiunta al grafico. Interrompi termina prima; Ripeti test aggiunge misurazioni allo stesso insieme di dati.", + "mode2Intro": "Attivare l'obiettivo di Cloudflare o Google avvia un test di ping on-demand. Comportamento:", + "mode2Items": [ + "Durata — due minuti per test, con barra di avanzamento e secondi rimanenti.", + "Frequenza — una lettura ogni cinque secondi, 24 per test.", + "Metodo — ICMP Echo Request (ping), tre ping consecutivi per misurazione con latenza media.", + "Stop — termina immediatamente il test; i dati parziali vengono conservati.", + "Ripeti test — aggiunge misurazioni ai dati esistenti per costruire uno storico più lungo con più esecuzioni.", + "Indicatore di stato attuale — aggiornato dopo ogni misurazione con le stesse soglie Eccellente / Buono / Discreto / Scarso." + ], + "thresholdsTitle": "Soglie di prestazione", + "headerStatus": "Stato", + "headerRange": "Intervallo", + "headerImpact": "Impatto pratico", + "thresholdRows": [ + { + "status": "Eccellente", + "range": "< 50 ms", + "impact": "Perfetto per applicazioni in tempo reale, giochi e videochiamate." + }, + { + "status": "Buono", + "range": "50 – 100 ms", + "impact": "Accettabile per la maggior parte delle applicazioni con impatto minimo." + }, + { + "status": "Discreto", + "range": "100 – 200 ms", + "impact": "Ritardo notevole. Può influenzare VoIP e applicazioni interattive." + }, + { + "status": "Scarso", + "range": "> 200 ms", + "impact": "Latenza significativa. Si consiglia un'indagine." + } + ], + "reportTitle": "Rapporto sulla latenza di rete (PDF)", + "reportIntro": "Entrambe le modalità hanno un pulsante Rapporto accanto alla destinazione. Genera un PDF delle misurazioni da allegare a una richiesta di assistenza al provider Internet.", + "reportPreviewAlt": "Prima pagina PDF del rapporto di latenza: sintesi, indicatore, statistiche, grafico e guida alle soglie", + "reportPreviewCaption": "La prima pagina contiene sintesi, indicatore, statistiche principali, andamento della latenza e guida alle soglie. Dalla pagina 2 seguono la tabella delle misurazioni e la metodologia.", + "downloadLabel": "Scarica un rapporto di latenza di esempio (PDF)", + "sectionsIntro": "La relazione ha sei sezioni:", + "sections": [ + "Sintesi — indicatore da 0 a oltre 300 ms con zone verde, gialla e rossa; stato Eccellente / Buono / Discreto / Scarso; destinazione, modalità, numero di misurazioni e riepilogo della perdita di pacchetti.", + "Statistiche di latenza — quattro indicatori per valore attuale, minimo, media e massimo, oltre a numero di misurazioni, perdita media di pacchetti e periodo del test.", + "Grafico di latenza — grafico ad area delle misurazioni durante il test, con riferimenti di minimo, media e massimo sull’asse verticale.", + "Soglie di prestazione — la stessa scala a quattro livelli descritta sopra, con un punto colorato per livello.", + "Risultati dettagliati — tabella numerata con data e ora, latenza, perdita di pacchetti e stato di ogni misurazione. Rivela picchi brevi nascosti dalle medie.", + "Metodologia — ICMP Echo Request, tre ping consecutivi per misurazione, nome e IP della destinazione e valutazione finale derivata dallo stato." + ], + "useCaseTitle": "Caso d’uso: assistenza del provider Internet", + "useCaseBody": "Esegui due minuti di test Cloudflare quando la connessione è lenta, prolunga con Ripeti test e seleziona Rapporto. Il PDF contiene tutte le misurazioni e la metodologia. Puoi allegarlo a una richiesta di assistenza con gli orari del problema; il provider decide quali prove richiedere." + }, + "excluding": { + "heading": "Escludere interfacce dal monitoraggio", + "body1": "Puoi escludere interfacce dal monitoraggio: bridge disattivati volontariamente, interfacce di test o schede rimosse ancora configurate. L’impostazione è salvata in excluded_interfaces: Health Monitor non genera avvisi o notifiche e non le include nello stato generale.", + "body2": "Nel menu contestuale scegli Escludi dal monitoraggio. L’interfaccia resta visibile con etichetta viola esclusa. Puoi riattivare il monitoraggio dallo stesso menu." + }, + "dataCollected": { + "heading": "Come vengono raccolti i dati", + "headerSection": "Sezione della scheda", + "headerEndpoint": "Endpoint", + "headerSource": "Fonte", + "rows": [ + { + "section": "Inventario di interfaccia", + "endpoint": "/api/network", + "source": "ip -j addr + ip -j link e analisi di bond e bridge." + }, + { + "section": "Carte di sintesi", + "endpoint": "/api/network/summary", + "source": "Riepilogo dell’inventario e conteggio delle interfacce attive e inattive." + }, + { + "section": "Storico RX/TX per interfaccia", + "endpoint": "/api/network//metrics", + "source": "I contatori attuali usano /proc/net/dev; lo storico proviene da RRD Proxmox tramite pvesh. Le interfacce VM/LXC usano i dati del guest; quelle fisiche e i bridge, i dati del nodo." + }, + { + "section": "Latenza: corrente", + "endpoint": "/api/network/latency/current", + "source": "Breve serie di ping verso il gateway o la destinazione configurata." + }, + { + "section": "Latenza: storica", + "endpoint": "/api/network/latency/history", + "source": "Misurazioni salvate circa ogni 60 secondi dal processo in background di raccolta di temperatura e latenza." + } + ], + "codeComment1": "# Verifica lo stato delle interfacce mostrato nella dashboard", + "codeComment2": "# Verifica una misurazione attuale della latenza end-to-end" + }, + "whereNext": { + "heading": "Per approfondire", + "items": [ + { + "label": "Monitoraggio integrità", + "href": "/docs/monitor/health-monitor", + "tail": " — categoria Rete e soglie dello storico della latenza." + }, + { + "label": "Riferimento API", + "href": "/docs/monitor/api", + "tail": " — endpoint di rete e latenza." + }, + { + "label": "Integrazioni", + "href": "/docs/monitor/integrations", + "tail": " — la raccolta Prometheus espone le stesse metriche di rete." + }, + { + "label": "Indice Dashboard", + "href": "/docs/monitor/dashboard", + "tail": "— le altre schede." + }, + { + "label": "ProxMenux → Rete", + "href": "/docs/network", + "tail": "— il lato delle azioni: analisi del ponte, nomi di interfaccia persistenti, backup e riavvio, iperf3." + } + ] + } +} diff --git a/web/messages/it/docs/monitor/dashboard/security.json b/web/messages/it/docs/monitor/dashboard/security.json new file mode 100644 index 00000000..964d48ea --- /dev/null +++ b/web/messages/it/docs/monitor/dashboard/security.json @@ -0,0 +1,246 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Dashboard: scheda Sicurezza | Documentazione ProxMenux", + "description": "La scheda Sicurezza riunisce i controlli di protezione in due colonne: ProxMenux Monitor (autenticazione, SSL/HTTPS, token API, Secure Gateway) e Proxmox VE (firewall, Fail2Ban, audit Lynis). Include la procedura guidata di Secure Gateway, l’audit Lynis e l’installazione e la configurazione delle regole di Fail2Ban." + }, + "header": { + "title": "Dashboard: scheda di sicurezza", + "description": "I controlli di sicurezza sono divisi in due blocchi: la configurazione di Monitor (autenticazione, SSL, token, Secure Gateway) e quella dell’host Proxmox monitorato (firewall, Fail2Ban, Lynis).", + "section": "ProxMenux Monitor · Dashboard" + }, + "intro": { + "title": "Due ambiti, una scheda", + "body": "La scheda Sicurezza ha due sezioni: ProxMenux Monitor (impostazioni della dashboard) e Proxmox VE (impostazioni dell’host). Le schede Fail2Ban e Lynis propongono l’installazione se gli strumenti mancano e mostrano i relativi controlli dopo l’installazione." + }, + "monitor": { + "heading": "ProxMenux Monitor", + "intro": "Quattro schede consentono di gestire l’accesso alla dashboard e l’autenticazione." + }, + "auth": { + "heading": "Autenticazione", + "imageAlt": "Scheda di autenticazione con stato Attivata, pulsanti Esci e Cambia password, informazioni sull’autenticazione a due fattori e pulsanti per attivarla o disattivare l’autenticazione", + "imageCaption": "Scheda con autenticazione attiva: indicatore di stato, Cambia password, Attiva 2FA e l’azione distruttiva Disattiva autenticazione.", + "intro": "La scheda gestisce l’accesso alla dashboard. Il primo avvio, i criteri per le password, la configurazione TOTP e il recupero dopo la perdita dell’autenticatore sono descritti in Accesso e autenticazione. Qui puoi gestire queste impostazioni nell’uso quotidiano:", + "items": [ + "Stato autenticazione — indicatore Attivata / Disattivata / Rifiutata.", + "Cambia password — password attuale + nuova password + conferma.", + "Attiva / Disattiva autenticazione a due fattori — apre la configurazione con codice QR all’attivazione e richiede la password attuale alla disattivazione.", + "Disattiva autenticazione — azione distruttiva che alla visita successiva ripropone la finestra iniziale Proteggere la dashboard?." + ] + }, + "ssl": { + "heading": "SSL/HTTPS", + "imageAlt": "Scheda SSL/HTTPS con stato HTTP senza SSL, certificato Proxmox rilevato con soggetto, emittente e scadenza, pulsante Usa certificato Proxmox e opzione Usa certificato personalizzato", + "imageCaption": "Scheda SSL/HTTPS con HTTPS disattivato. Monitor rileva il certificato installato sull’host Proxmox e permette di usarlo con un clic. Se hai altri file, puoi scegliere Usa certificato personalizzato.", + "intro": "Rende disponibile la dashboard via HTTPS senza proxy inverso. La scheda rileva il certificato usato da Proxmox in /etc/pve/local/ e mostra soggetto, emittente e scadenza per verificarlo prima dell’attivazione. HTTPS può essere attivato in due modi:", + "items": [ + "Usa certificato Proxmox — Monitor riutilizza il certificato dell’host con un clic. Adatto se PVE e la dashboard usano già lo stesso nome DNS.", + "Usa certificato personalizzato — incolla i percorsi assoluti del certificato .pem e della chiave privata .key. Vengono convalidati prima del riavvio del servizio. Se il caricamento fallisce, la dashboard torna automaticamente a HTTP e resta accessibile." + ], + "enabledAlt": "Scheda SSL/HTTPS con HTTPS attivato, certificato attivo con i percorsi di pve-ssl.pem e pve-ssl.key e pulsante Disattiva HTTPS", + "enabledCaption": "HTTPS attivo — la scheda mostra il certificato in uso, i percorsi dei file e l’azione Disattiva HTTPS, che ripristina HTTP sulla stessa porta.", + "acmeTitle": "ACME / Let's Encrypt tramite Proxmox", + "acmeBody": "Se Let’s Encrypt è già configurato sul nodo Proxmox in Datacenter → Certificati → ACME, la dashboard riutilizza il certificato presentato ai browser quando scegli Usa certificato Proxmox. Non serve configurare ACME separatamente per Monitor.", + "walkthroughLink": "Consulta HTTPS per ProxMenux Monitor per la procedura di rilevamento del certificato ACME, i dati scritti su disco e l’uso di una coppia .pem / .key personalizzata." + }, + "apiTokens": { + "heading": "Token di accesso API", + "emptyAlt": "Scheda dei token di accesso API vuota, con informazioni sui token e pulsante Genera nuovo token API", + "emptyCaption": "Scheda dei token dopo una nuova installazione. Il riquadro Informazioni sui token API riepiloga durata, utilizzo e inserimento nelle intestazioni Authorization: Bearer.", + "intro": "Token validi un anno per integrazioni automatiche: widget Homepage, sensori REST Home Assistant, raccolta dati Grafana, flussi n8n e script personalizzati. La scheda presenta tre stati: vuota → modulo → token generato.", + "generateBody": "Genera un token. Fai clic su Genera nuovo token API. Inserisci un nome del token descrittivo per riconoscerlo nell’elenco e la password come conferma aggiuntiva. Se la 2FA è attiva, serve anche il codice TOTP attuale.", + "generateAlt": "Modulo di generazione del token API con campi Nome del token e Password e pulsanti Genera token e Annulla", + "generateCaption": "Modulo Genera token API: inserisci un nome e conferma con la password e, se la 2FA è attiva, il codice TOTP.", + "saveBody": "Salva subito il token. Il valore completo appare una sola volta dopo la creazione. La scheda lo segnala con un avviso arancione e un pulsante di copia. Non potrai recuperarlo in seguito: l’elenco dei token attivi mostrerà solo il prefisso.", + "generatedAlt": "Token API generato con valore mascherato, pulsante di copia, istruzioni per l’intestazione Authorization: Bearer ed elenco dei token attivi con prefisso", + "generatedCaption": "Token generato: il valore appare una sola volta con pulsante di copia e frammento esatto Authorization: Bearer. Sotto, l’elenco dei token attivi mostra nome, prefisso e data di creazione per revocarli singolarmente.", + "outro": "Ogni token attivo ha un pulsante Revoca. La revoca lo invalida subito e interrompe le integrazioni che lo usano. Trovi esempi per Homepage, Home Assistant, n8n e Prometheus in Integrazioni." + }, + "gateway": { + "heading": "Secure Gateway", + "cardAlt": "Scheda Secure Gateway prima del primo deployment, con il pulsante Distribuisci Secure Gateway", + "cardCaption": "Scheda Secure Gateway in una nuova installazione: un pulsante avvia la procedura guidata.", + "intro": "Accedi alla dashboard, all’interfaccia web Proxmox e alle macchine guest dalla rete Tailscale, senza esporre porte a Internet. Monitor distribuisce sull’host un container LXC Alpine con tailscaled come router di sottorete. Dopo l’approvazione nella console Tailscale, i dispositivi remoti possono raggiungere l’IP LAN dell’host ovunque si trovino.", + "wizardTitle": "Procedura guidata", + "wizardIntro": "Prima di fare clic su Deploy Secure Gateway, genera una chiave di autenticazione nella console Tailscale. La procedura la richiederà al passaggio 2.", + "step0Title": "0. Generare la chiave di autenticazione Tailscale", + "step0Body": "Accedi a login.tailscale.com/admin/settings/keys e fai clic su Generate auth key…. Scegli una chiave preautenticata per evitare l’accesso interattivo a Tailscale dal gateway. Copia il valore: viene mostrato una sola volta.", + "step0Alt": "Pagina Settings → Keys della console Tailscale, con il pulsante Generate auth key evidenziato", + "step0Caption": "Console di amministrazione di Tailscale — Impostazioni → Chiavi → Generare chiave auth.... Utilizzare un account Tailscale gratuito se non ne hai ancora uno (link all'interno della procedura guidata).", + "step1Title": "1. Apri la procedura guidata", + "step1Body": "Torna alla scheda Sicurezza e fai clic su Deploy Secure Gateway. Il primo passaggio presenta funzioni e requisiti.", + "step1Alt": "Introduzione della procedura Secure Gateway: accesso VPN senza inoltro di porte e con crittografia end-to-end", + "step1Caption": "Passo 1 — panoramica di ciò che fornisce Secure Gateway e un promemoria che avrete bisogno di un account Tailscale gratuito.", + "step2Title": "2. Autenticazione Tailscale", + "step2Body": "Incolla la chiave di autenticazione del passaggio 0 e scegli un nome host. Il gateway apparirà con questo nome nella console Tailscale, in genere proxmox-gateway o il nome del nodo.", + "step2Alt": "Passaggio della procedura Secure Gateway con campi per la chiave di autenticazione Tailscale e il nome host del dispositivo e link per generare la chiave", + "step2Caption": "Passaggio 2: incolla la chiave preautenticata e scegli il nome host. Se hai saltato il passaggio 0, il link sotto il campo apre la relativa pagina Tailscale.", + "step3Title": "3. Ambito di accesso", + "step3Intro": "Scegli le risorse raggiungibili dalla tua rete Tailscale tramite il gateway:", + "step3Items": [ + "Proxmox Only — solo l'interfaccia utente Proxmox e il monitor. Superficie di attacco più piccola.", + "Intera rete locale — tutta la sottorete LAN, rilevata automaticamente dall’interfaccia principale dell’host. Permette di raggiungere NAS, stampanti, VM e qualsiasi altro dispositivo LAN.", + "Sottoreti personalizzate — indica i CIDR desiderati. Per configurazioni con più VLAN in cui vuoi rendere accessibili solo alcuni segmenti." + ], + "step3Alt": "Passaggio Ambito di accesso della procedura Secure Gateway con le opzioni Solo Proxmox, Intera rete locale e Sottoreti personalizzate", + "step3Caption": "Passaggio 3: scegli l’ambito di accesso. Intera rete locale inserisce automaticamente la sottorete LAN rilevata.", + "step4Title": "4. Opzioni avanzate (opzionale)", + "step4Intro": "Due opzioni, entrambe disattivate per impostazione predefinita:", + "step4Items": [ + "Exit Node — dopo l’attivazione e la selezione su un dispositivo remoto, tutto il suo traffico Internet esce dalla WAN dell’host Proxmox. Utile in viaggio per usare la connessione di casa dal telefono.", + "Accetta route — permette al gateway di raggiungere le reti annunciate da altri router di sottorete Tailscale, per configurazioni con più sedi." + ], + "step4Alt": "Passaggio Opzioni avanzate di Secure Gateway con le caselle Exit Node e Accept Routes", + "step4Caption": "Passaggio 4: Exit Node e Accept Routes. Lascia entrambe disattivate se vuoi solo accedere alla dashboard dal telefono o dal portatile.", + "step5Title": "5. Verifica e distribuisci", + "step5Body": "Riepilogo finale prima del deployment. La procedura ricorda il passaggio manuale ancora necessario nella console Tailscale: approvare la route di sottorete.", + "step5Alt": "Passaggio Verifica e distribuisci di Secure Gateway con riepilogo di nome host, modalità di accesso, reti, Exit Node e Accept Routes e pulsante Distribuisci gateway", + "step5Caption": "Passo 5 — rivedere la configurazione e distribuire. L'avviso blu in fondo segnala l'approvazione del percorso in sospeso.", + "approvalTitle": "Un ultimo passo manuale in Tailscale admin", + "approvalBody": "Dopo il deployment, apri login.tailscale.com/admin/machines e approva la route di sottorete annunciata dal gateway. Fino ad allora, i dispositivi remoti della rete Tailscale non potranno raggiungere gli IP LAN tramite il gateway. Tailscale segnala le route in attesa con un avviso giallo nella riga del dispositivo: fai clic su Edit route settings e seleziona la route." + }, + "pve": { + "heading": "Proxmox VE", + "intro": "Le protezioni dell’host: firewall, prevenzione delle intrusioni e audit di sicurezza. Le schede Fail2Ban e Lynis propongono l’installazione se mancano, poi mostrano i controlli di gestione." + }, + "firewall": { + "heading": "Proxmox Firewall", + "imageAlt": "Scheda firewall Proxmox con stato di cluster e host, regole di accesso rapido per Monitor e interfaccia web Proxmox, contatori, elenco delle regole e pulsante Aggiungi regola", + "imageCaption": "Scheda firewall Proxmox: interruttori per cluster e host, porte comuni in Regole di accesso rapido, contatori in Riepilogo regole ed elenco completo con + Aggiungi regola.", + "intro": "La scheda gestisce la configurazione del firewall Proxmox VE. Il backend classico usa iptables, quello alternativo usa nftables. Non gestisce regole arbitrarie create fuori da Proxmox. Tre sezioni:", + "items": [ + "Firewall del cluster + firewall dell’host — interruttori globali. Il firewall del cluster deve essere attivo affinché le regole dell’host abbiano effetto. La scheda indica questa dipendenza accanto all’impostazione.", + "Regole di accesso rapido — righe predefinite per 8008/TCP (Monitor) e 8006/TCP (interfaccia web Proxmox), con stato consentito, bloccato o non protetto. L’interfaccia Proxmox è consentita tramite una macro firewall integrata che non può essere eliminata per errore.", + "Riepilogo regole — contatori delle regole totali, accept, drop/reject e delle porte distinte protette. I valori provengono da /etc/pve/firewall/cluster.fw e /etc/pve/nodes/<node>/host.fw.", + "Regole firewall — elenco con azione, protocollo, porta, origine e livello. + Aggiungi regola apre l’editor nella scheda; il cestino elimina la regola. Le modifiche vengono salvate nei file Proxmox e compaiono anche nella sua interfaccia (Datacenter / Node → Firewall)." + ] + }, + "fail2ban": { + "heading": "Fail2Ban", + "subHeading": "(in base allo stato)", + "whatIs": "Che cos’è. Fail2Ban è un servizio open source che rileva nei registri i tentativi di accesso falliti ripetuti e blocca l’IP nel firewall. Protegge SSH e i moduli web dagli attacchi continui di forza bruta. ProxMenux configura tre jail: SSH, accesso web Proxmox (porta 8006) e accesso ProxMenux Monitor (porta 8008).", + "notBundled": "Fail2Ban non è incluso. La scheda ne rileva la presenza e si adatta: se manca, propone l’installazione con un clic. Una volta installato, mostra lo stato dei jail e gli IP bloccati e permette di regolare il numero di tentativi e la durata del blocco per ciascun jail.", + "notInstalledAlt": "Scheda Fail2Ban non installato con descrizione della protezione per SSH, interfaccia web Proxmox e Monitor tramite nftables e pulsante Installa e configura Fail2Ban", + "notInstalledCaption": "Scheda Fail2Ban prima dell'installazione — la scatola blu prevede ciò che l'installazione configura.", + "clickBody": "Fai clic su Installa e configura Fail2Ban per aprire una finestra di conferma con tutte le modifiche che lo script apporterà all’host:", + "confirmAlt": "Conferma Fail2Ban con modalità SSH aggressiva, protezione Proxmox sulla porta 8006 e Monitor sulla porta 8008, rilevamento nftables, impostazioni dei registri journald e protezione SSH MaxAuthTries", + "confirmCaption": "Conferma di installazione: elenco dei jail, livello di registrazione journald adattato per leggere gli eventi SSH e ulteriore protezione SSH (MaxAuthTries=3).", + "confirmIntro": "Dopo la conferma, un pannello mostra il registro di installazione in tempo reale: apt, configurazione dei jail e test. Usa lo stesso meccanismo dell’installer CLI ProxMenux.", + "progressAlt": "Pannello con registro di installazione Fail2Ban: pacchetto, journald MaxLevelStore per l’autenticazione, jail, rilevamento nftables, protezione MaxAuthTries, test di comunicazione fail2ban-client e messaggio finale", + "progressCaption": "Installazione in corso: il pannello registra ogni passaggio. Il messaggio Connection closed in fondo indica la fine della trasmissione.", + "afterInstall": "Dopo l’installazione, la scheda mostra lo stato in tempo reale: jail configurati, IP bloccati e blocchi recenti. Le schede separano Jail e IP bloccati da Attività recente, le ultime N voci del registro Fail2Ban.", + "activeAlt": "Scheda Fail2Ban attiva con tre jail (proxmenux, proxmox, sshd), conteggi di IP bloccati, blocchi totali e tentativi falliti e righe con tentativi, durata del blocco, intervallo e ingranaggio", + "activeCaption": "Fail2Ban attivo: i tre jail predefiniti (proxmenux, proxmox, sshd) con impostazioni per tentativi, durata del blocco e intervallo di rilevamento.", + "tuneBody": "Regola il jail. Fai clic sull’ingranaggio per modificare Max Retries, Ban Time e Find Time, l’intervallo mobile in cui si contano i tentativi. Un blocco permanente dura fino alla rimozione manuale. Il modulo spiega i valori comuni.", + "configAlt": "Modulo del jail sshd con Max Retries, Ban Time in secondi, opzione Permanent Ban, Find Time, suggerimenti sui valori comuni e pulsante Salva configurazione", + "configCaption": "Modifica del jail sshd: riduci Max Retries se accedi a SSH solo dalla tua sottorete, oppure aumenta Ban Time per la dashboard esposta a Internet.", + "outro": "La guida Installazione, configurazione e disinstallazione include anche l’installazione manuale, la modifica di SSH MaxAuthTries e il registro proxmenux-auth.log. Vedi ProxMenux → Sicurezza → Fail2Ban.", + "calloutTitle": "Senza Fail2Ban, questo meccanismo non blocca gli IP", + "calloutBody": "ProxMenux Monitor controlla gli IP bloccati da Fail2Ban a livello applicativo prima di elaborare le richieste Flask. Interroga fail2ban-client e conserva il risultato in cache per 30 secondi; non legge una tabella SQL dei blocchi. Senza Fail2Ban, gli accessi falliti sono registrati in proxmenux-auth.log, ma questo meccanismo non blocca gli IP." + }, + "lynis": { + "heading": "Audit di sicurezza Lynis", + "subHeading": "(in base allo stato)", + "whatIs": "Che cos’è. Lynis è uno strumento open source di audit della sicurezza che esegue circa 280 test sull’host: permessi, protezione del kernel, SSH, vulnerabilità dei pacchetti, criteri crittografici, attività pianificate, identificazione dei servizi e altro. Produce un indice di sicurezza da 0 a 100, avvisi e suggerimenti. È un riferimento comune per valutare i server Debian.", + "whyUseful": "Perché è utile. Valutare la sicurezza leggendo ogni file di configurazione è difficile. Lynis rileva problemi spesso trascurati: protezioni del kernel mancanti, cifrari SSH deboli, registri non persistenti o NOPASSWD in sudoers per gli account predefiniti. Ripetere l’analisi dopo le modifiche ProxMenux permette di confrontare il miglioramento tramite un punteggio.", + "notInstalledAlt": "Scheda Lynis non installato con pulsante Installa Lynis e funzioni: indice di sicurezza, rilevamento delle vulnerabilità, conformità e codice GitHub", + "notInstalledCaption": "carta Lynis prima dell'installazione — la scatola blu riassume ciò che lo strumento fa.", + "notBundled": "Anche Lynis non è incluso. ProxMenux lo installa direttamente dal codice ufficiale GitHub anziché dal pacchetto Debian.", + "confirmAlt": "Finestra di conferma Lynis con le funzioni: indice di sicurezza, rilevamento delle vulnerabilità, analisi della configurazione, verifica di conformità e codice dal repository ufficiale GitHub", + "confirmCaption": "Conferma dell’installazione che indica esplicitamente l’origine GitHub.", + "progressAlt": "Pannello di installazione Lynis in tempo reale, con installazione della versione più recente, conferma della versione 3.1.6 e messaggio finale", + "progressCaption": "Installazione in corso: il pannello mostra il registro in tempo reale, come per Fail2Ban.", + "afterInstall": "Dopo l’installazione, la scheda mostra la versione e una cronologia degli audit vuota. Fai clic su Esegui audit di sicurezza per avviare la prima analisi.", + "installedAlt": "Scheda Lynis dopo l’installazione con versione 3.1.6, data dell’ultima analisi, indice di sicurezza 0, avvisi 0, suggerimenti 0, rapporto vuoto e pulsante Esegui audit di sicurezza", + "installedCaption": "Lynis è installato, senza audit ancora eseguiti. Gli indicatori mostrano inizialmente zero.", + "runningAlt": "Scheda Lynis durante l’audit con messaggio di analisi in corso, durata stimata di 2–5 minuti e pulsante Audit in corso disabilitato", + "runningCaption": "Audit in corso: il pulsante mostra un indicatore di caricamento e la scheda avvisa che l’analisi può richiedere da 2 a 5 minuti.", + "finishedBody": "Al termine, la scheda mostra i risultati: indice di sicurezza, avvisi, suggerimenti ed elenco dei Rapporti di audit con le analisi precedenti.", + "resultsAlt": "Scheda Lynis con indice 71, dettaglio Lynis 66 e PVE 71, 3 avvisi, 40 suggerimenti, punteggio adattato a Proxmox di 71 su 100 nella fascia Buono, rapporti con download PDF e pulsante Esegui audit di sicurezza", + "resultsCaption": "Risultati di esempio: indice di sicurezza 71/100 (Buono). La scheda mostra il punteggio originale Lynis (66) e quello adattato a Proxmox (71). L’adattamento dipende dal punteggio originale e dalla quota dei rilievi considerati normali su Proxmox VE; non aggiunge 11 punti fissi.", + "scoreTitle": "Punteggio originale Lynis e punteggio adattato a Proxmox", + "scoreIntro": "Le regole Lynis sono pensate per sistemi Debian generici. Proxmox se ne discosta in alcuni casi per motivi validi, come servizi del cluster eseguiti come root o impostazioni specifiche di journald. La scheda mostra entrambi i punteggi per:", + "scoreItems": [ + "Seguire il punteggio originale Lynis come farebbe un revisore esterno.", + "Seguire il punteggio adattato a Proxmox, un riferimento più appropriato per confrontare i nodi dello stesso cluster." + ], + "reportBody": "Rapporto completo. Il pulsante PDF di ogni audit scarica un rapporto di più pagine: sintesi, informazioni di sistema, stato della sicurezza, avvisi spiegati, suggerimenti ordinati per impatto e inventario dei pacchetti. Puoi allegarlo a una revisione della sicurezza.", + "reportAlt": "Prima pagina di esempio del PDF Lynis con sintesi, indice 71 su 100, conteggi di avvisi e suggerimenti, nome host, kernel, versione Lynis, data e panoramica della sicurezza", + "reportCaption": "Prima pagina del rapporto: sintesi, informazioni di sistema e stato della sicurezza. Seguono avvisi dettagliati, suggerimenti e pacchetti installati. È allegato un PDF di esempio come riferimento.", + "runPeriodically": "Eseguire l'audit periodicamente (dopo i principali aggiornamenti di Proxmox, dopo aver applicato tweaks post-install, prima di aprire un percorso di accesso remoto) e mantenere i rapporti — la tendenza conta più di qualsiasi singolo numero.", + "outro": "La guida a installazione, configurazione e disinstallazione e l’analisi di un rapporto di esempio sono in ProxMenux → Sicurezza → Lynis." + }, + "dataCollected": { + "heading": "Come vengono raccolti i dati", + "headerCard": "Scheda", + "headerEndpoint": "Endpoint", + "headerSource": "Fonte", + "rows": [ + { + "card": "Autenticazione, 2FA, cambio password", + "endpoint": "/api/auth/*", + "source": "Configurazione locale di autenticazione in ~/.config/proxmenux-monitor/auth.json; JWT emessi da Monitor." + }, + { + "card": "SSL/HTTPS", + "endpoint": "/api/auth/ssl/*", + "source": "openssl x509 su /etc/pve/local/pve-ssl.pem + /etc/proxmenux/ssl_config.json." + }, + { + "card": "Elencare, generare e revocare token API", + "endpoint": "/api/auth/api-tokens", + "source": "I dati dei token restano sul sistema locale; nulla lascia l’host." + }, + { + "card": "Gateway sicuro (deploy + stato)", + "endpoint": "/api/oci/*", + "source": "Crea un container LXC Alpine con tailscaled tramite pct create / pct exec." + }, + { + "card": "Stato e regole Firewall", + "endpoint": "/api/security/firewall/*", + "source": "pve-firewall + /etc/pve/firewall/<cluster|host>.fw." + }, + { + "card": "Fail2Ban (solo quando installato)", + "endpoint": "/api/security/fail2ban/*", + "source": "fail2ban-client status, /var/log/fail2ban.log, /etc/fail2ban/jail.local." + }, + { + "card": "Lynis audit (solo quando installato)", + "endpoint": "/api/security/lynis/*", + "source": "Esegue lynis audit system in background e analizza il rapporto in /var/log/lynis-report.dat." + } + ] + }, + "whereNext": { + "heading": "Per approfondire", + "items": [ + { + "label": "Accesso e autenticazione", + "href": "/docs/monitor/access-auth", + "tail": " — configurazione iniziale completa, scelta dell’app 2FA, recupero dopo la perdita dell’autenticatore ed esempi di proxy inverso." + }, + { + "label": "Integrazioni", + "href": "/docs/monitor/integrations", + "tail": " — esempi di token API con Homepage, Home Assistant, Prometheus e n8n e configurazione completa di Secure Gateway." + }, + { + "label": "Riferimento API", + "href": "/docs/monitor/api", + "tailRich": " — tutti gli endpoint /api/auth, /api/security e /api/oci con metodo, corpo della richiesta ed esempi curl." + }, + { + "label": "ProxMenux → Sicurezza → Fail2Ban", + "href": "/docs/security/fail2ban", + "tail": " — guida all’installazione, jail configurati e installazione manuale." + }, + { + "label": "ProxMenux → Sicurezza → Lynis", + "href": "/docs/security/lynis", + "tail": " — rapporto di esempio, interpretazione del punteggio e quando ripetere l’audit." + } + ] + } +} diff --git a/web/messages/it/docs/monitor/dashboard/settings.json b/web/messages/it/docs/monitor/dashboard/settings.json new file mode 100644 index 00000000..eab32cb0 --- /dev/null +++ b/web/messages/it/docs/monitor/dashboard/settings.json @@ -0,0 +1,367 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Dashboard: scheda Impostazioni | Documentazione ProxMenux", + "description": "La scheda Impostazioni gestisce lingua, ordine di navigazione, preferenze della dashboard, soglie ed esclusioni dal monitoraggio, notifiche, IA e inventario delle ottimizzazioni dopo l’installazione." + }, + "header": { + "title": "Dashboard: scheda Impostazioni", + "description": "Lingua di Monitor, ordine di navigazione, preferenze della dashboard, esclusioni dal monitoraggio, notifiche, configurazione IA e inventario attuale delle ottimizzazioni ProxMenux.", + "section": "ProxMenux Monitor · Dashboard" + }, + "intro": { + "title": "Dove viene salvata ogni impostazione", + "body": "Impostazioni riunisce presentazione della dashboard, monitoraggio Health Monitor, invio degli avvisi e modifiche già applicate da ProxMenux all’host. Le schede rimandano alla propria documentazione dettagliata; qui trovi il punto di accesso." + }, + "interfaceLanguage": { + "heading": "Lingua di interfaccia", + "intro": "Scegli la lingua dell’interfaccia web di Monitor. Cambia subito, senza riavviare il servizio né modificare la lingua dei menu di terminale ProxMenux.", + "items": [ + "ProxMenux Monitor offre attualmente inglese, tedesco, spagnolo, francese, italiano, portoghese, slovacco e svedese.", + "Alla prima visita usa la lingua del browser, se supportata; altrimenti l’inglese.", + "La scelta aggiorna la lingua della pagina e la sincronizza con le altre schede dello stesso profilo del browser.", + "Se manca una traduzione, solo quel testo appare in inglese anziché come chiave o segnaposto non valido." + ], + "scopeTitle": "Preferenza locale del browser", + "scopeBody": "La scelta è salvata in localStorage sotto proxmenux-ui-language. Vale per questo profilo del browser e dispositivo, non per l’intero nodo. Ogni amministratore può scegliere la propria lingua." + }, + "navigationOrder": { + "heading": "Ordine di navigazione", + "intro": "Riordina le sette voci principali: Panoramica, App, VM e LXC, Nodo, Backup, Terminale e Amministrazione. Premi Modifica, trascina le righe e salva.", + "items": [ + "Con il mouse il trascinamento inizia alla pressione. Su schermi touch serve una pressione di 250 ms per distinguerlo dallo scorrimento.", + "I gruppi Nodo e Amministrazione si spostano interi; le pagine interne mantengono l’ordine stabilito.", + "Il menu mobile segue lo stesso ordine salvato.", + "Ripristina predefiniti reimposta l’ordine in modifica. Salva per applicare il cambiamento.", + "Le nuove schede principali delle versioni future vengono aggiunte alla fine dell’ordine personalizzato, conservando la tua disposizione." + ], + "landingTitle": "La prima voce diventa la scheda iniziale", + "landingBody": "Monitor apre la prima voce salvata. Con Nodo apre Archiviazione; con Amministrazione, Registri di sistema. L’ordine è salvato nel browser sotto proxmenux-nav-order, quindi ogni dispositivo può avere la propria disposizione." + }, + "networkUnits": { + "heading": "Unità rete", + "imageAlt": "Scheda Unità di rete con il selettore di visualizzazione su Byte", + "imageCaption": "Scegli tra bit al secondo e byte al secondo per ogni velocità di rete visualizzata nel cruscotto.", + "body": "Mostra la velocità in bit al secondo (Mbps/Gbps) o byte al secondo (MB/s/GB/s). I bit sono predefiniti, come nelle specifiche di schede e provider; i trasferimenti di file usano spesso byte. Grafici, etichette e suggerimenti cambiano subito senza ricaricare." + }, + "health": { + "heading": "Monitoraggio integrità", + "intro": "La scheda imposta la durata del silenziamento: quanto attendere prima di segnalare nuovamente un avviso ignorato. Ogni categoria — CPU, memoria, storage, dischi, rete, VM, servizi PVE, registri, aggiornamenti e sicurezza — ha il proprio menu:", + "items": [ + "24 h — default per la maggior parte delle categorie transitorie.", + "72 h — per silenziare questi eventi per qualche giorno.", + "168 h (1 settimana) e 720 h (1 mese) — controlli periodici.", + "8760 h (1 anno) — silenziamento per un lungo periodo.", + "-1 — silenzio permanente fino a quando non si riattiva manualmente.", + "Ore personalizzate — un numero intero per un valore intermedio." + ], + "imageAlt": "Impostazioni, scheda Health Monitor con durata per categoria e silenziamenti attivi", + "imageCaption": "I menu definiscono la durata dei silenziamenti futuri. La sezione inferiore mostra gli avvisi silenziati e permette di riattivarli.", + "editTitle": "Modalità di modifica", + "editBody": "La scheda è inizialmente in sola lettura. Modifica in alto a destra attiva menu e pulsanti di riattivazione. Salva applica insieme durate e riattivazioni in attesa; Annulla le scarta. Salva è attivo solo se ci sono modifiche.", + "activeTitle": "Silenziamenti attivi", + "activeIntro": "Sotto le durate, Silenziamenti attivi elenca gli avvisi silenziati temporaneamente —24 h, 7 giorni o altro periodo— e quelli permanenti. Ogni riga mostra:", + "activeItems": [ + "Un badge colorato: Permanente in ambra oppure un conto alla rovescia, come 24 h rimanenti / 7 giorni rimanenti, in blu.", + "L’identificatore dell’avviso in forma leggibile (ad es. pve_storage_full_PBS-Cloud → Storage PVE pieno: PBS-Cloud).", + "Categoria, gravità e data e ora in cui l’avviso è stato ignorato.", + "Un pulsante Riattiva in modifica prepara la rimozione del silenziamento al salvataggio." + ], + "activeReenableTitle": "Come riattivare un avviso", + "activeReenableBody": "Riattiva in modifica colora la riga di verde e barra l’identificatore, senza applicare ancora il cambio. Premi di nuovo per Annullare. Salva invia in parallelo POST /api/health/un-acknowledge per ogni riattivazione e rimuove le righe. Se il problema persiste e la categoria consente nuovi avvisi, torna tra gli attivi al prossimo controllo.", + "activePermanentNote": "I silenziamenti permanenti —con Permanente o durata predefinita -1— si annullano solo qui. La finestra generale non offre quel pulsante; questa sezione riunisce elenco e riattivazione.", + "activeAutoRefreshTitle": "Aggiornamento automatico", + "activeAutoRefreshBody": "L’elenco si aggiorna ignorando o riattivando un avviso in Health Monitor, tornando alla scheda e quando cambia la visibilità. Non serve ricaricare.", + "calloutTitle": "Dettagli nella pagina Health Monitor", + "calloutBody": "Escalation, risoluzione automatica quando scompare un dispositivo e differenza tra ignorare e risolvere sono descritte in Health Monitor → Ignorare avvisi e durata del silenziamento. Questa scheda offre menu e silenziamenti attivi." + }, + "thresholds": { + "heading": "Soglie di Health Monitor", + "intro": "La scheda precedente imposta il silenzio dopo aver ignorato un avviso; questa regola il valore che attiva un avviso. La maggior parte dei controlli ha valori Avviso e Critico modificabili. La tabella spiega eccezioni come la regola combinata dello swap e il rilevatore RAM attuale.", + "whatForTitle": "A cosa serve", + "whatForIntro": "I valori predefiniti sono un punto di partenza, ma ogni ambiente ha condizioni proprie:", + "whatForItems": [ + "Un homelab con un solo SSD può avvisare prima, per esempio al 75/90%, per lasciare spazio agli snapshot.", + "Le soglie di memoria devono riflettere misurazioni e carico dell’host. La ridondanza Ceph non giustifica da sola avvisi meno severi; l’uso elevato di ARC ZFS non equivale a memoria di lavoro non recuperabile.", + "Scegli le soglie di temperatura secondo le specifiche del disco e le condizioni reali. Il raffreddamento passivo o forzato non determina da solo un limite sicuro universalmente più basso o alto.", + "Un host molto virtualizzato può avere picchi CPU durante le compilazioni senza avvisare a ogni picco dell’80%, ma deve segnalare una saturazione prolungata." + ], + "whatForOutro": "Le modifiche supportate valgono dall’analisi successiva. Health Monitor legge /usr/local/share/proxmenux/health_thresholds.json a ogni ciclo senza riavvio. Alcuni indicatori, come la temperatura dei dischi, usano questi valori; alcune barre di capacità hanno limiti propri. La riga RAM descrive un’eccezione attuale.", + "coloursTitle": "Colori degli stati Avviso e Critico", + "coloursIntro": "I widget che usano Avviso/Critico seguono i tre stati sotto. Altri indicatori, come le barre di capacità PVE, hanno limiti propri; il loro colore da solo non dimostra un avviso Health Monitor.", + "headerColour": "Colore", + "headerRange": "Intervallo", + "headerMeaning": "Significato", + "colourRows": [ + { + "colour": "Verde", + "range": "valore < Avviso", + "meaning": "Intervallo normale. Nessun avviso viene generato." + }, + { + "colour": "Ambra", + "range": "Avviso ≤ valore < Critico", + "meaning": "Stato di avviso. Health Monitor genera un evento WARNING; le notifiche rispettano filtri e orari silenziosi." + }, + { + "colour": "Rosso", + "range": "Valore ≥ Critico", + "meaning": "Stato critico. Health Monitor genera un evento CRITICAL che ignora gli orari silenziosi. Le impostazioni di categoria ed evento del canale restano valide; la consegna dipende anche dalla sua disponibilità." + } + ], + "sectionsTitle": "Sezioni e valori predefiniti consigliati", + "sectionsIntro": "Sono i valori iniziali ProxMenux fino a modifica. Le sezioni seguono carico di calcolo, temperatura e capacità di archiviazione, dal carico attuale allo spazio occupato.", + "headerSection": "Sezione", + "headerWarning": "Avviso", + "headerCritical": "Critico", + "headerGates": "Controllo interessato", + "thresholdRows": [ + { + "section": "Utilizzo CPU", + "warning": "85 %", + "critical": "95 %", + "gates": "Avviso di carico prolungato quando la CPU media supera la soglia nel periodo di controllo." + }, + { + "section": "Memoria", + "warning": "85 %", + "critical": "95 %", + "gates": "Pressione RAM dell’host. Il valore configurabile mostra Critico al 95%, ma il rilevatore attuale usa una regola fissa del 90% prolungato; cambiare l’impostazione non modifica attualmente quel ramo." + }, + { + "section": "Swap (solo soglia critica)", + "warning": "—", + "critical": "80 %", + "gates": "Il CRITICAL di swap richiede oltre l’80% di swap e meno del 15% di RAM disponibile su più misurazioni. Lo swap occupato da solo non attiva la regola." + }, + { + "section": "Temperatura CPU", + "warning": "80 °C", + "critical": "90 °C", + "gates": "Temperatura del package CPU o dei core da lm-sensors." + }, + { + "section": "Temperatura del disco — HDD", + "warning": "60 °C", + "critical": "65 °C", + "gates": "Temperatura HDD. Valori iniziali: avviso a 60 °C, critico a 65 °C. Sono valori di monitoraggio, non un limite universale del produttore; consulta le specifiche del modello." + }, + { + "section": "Temperatura del disco — SSD", + "warning": "70 °C", + "critical": "75 °C", + "gates": "SSD SATA da 2,5 pollici o M.2. Questa classe usa 70/75 °C come valori iniziali; i limiti reali dipendono dal modello." + }, + { + "section": "Temperatura del disco — NVMe", + "warning": "80 °C", + "critical": "85 °C", + "gates": "Temperatura NVMe. Questa classe usa 80/85 °C come valori iniziali. La temperatura di limitazione del controller dipende dal modello e non è sempre 85 °C." + }, + { + "section": "Temperatura del disco — SAS", + "warning": "55 °C", + "critical": "65 °C", + "gates": "Temperatura SAS. Questa classe usa avviso a 55 °C e critico a 65 °C. Sono valori di monitoraggio, non prova di un guasto di raffreddamento a 55 °C né un limite universale." + }, + { + "section": "Spazio su disco — host", + "warning": "85 %", + "critical": "95 %", + "gates": "Capacità di / e di ogni punto di montaggio dell’host (/var/lib/vz, /mnt/*…)." + }, + { + "section": "Spazio disco — LXC rootfs", + "warning": "85 %", + "critical": "95 %", + "gates": "Disco root di ciascun container, valutato rispetto alla dimensione rootfs indicata da PVE." + }, + { + "section": "Punti di montaggio LXC", + "warning": "85 %", + "critical": "95 %", + "gates": "Capacità dei montaggi nei CT attivi: mp0, mp1, NFS e bind mount. Esclude rootfs." + }, + { + "section": "Storage PVE", + "warning": "85 %", + "critical": "95 %", + "gates": "Storage gestiti da PVE: LVM, LVM-thin, ZFS-pool, RBD/Ceph e PBS. Non sono tutti backend a blocchi." + }, + { + "section": "Pool ZFS", + "warning": "85 %", + "critical": "95 %", + "gates": "Pool ZFS dell’host, indipendentemente dalla registrazione in PVE." + } + ], + "defaultsTitle": "Valori predefiniti, modifiche e ripristino", + "defaultsBody": "Ogni sezione parte dai valori predefiniti; salvi solo le modifiche desiderate. La scheda mostra il valore effettivo: la modifica o il valore iniziale. Ripristina elimina tutte le modifiche di tutte le sezioni.", + "validationTitle": "Validazione", + "validationBody": "Il salvataggio verifica gli intervalli ammessi e rifiuta Critico sotto Avviso. L’interfaccia mostra gli errori e il server valida nuovamente le richieste API prima di salvare." + }, + "lxcDetection": { + "heading": "Rilevamento aggiornamenti LXC", + "imageAlt": "Scheda di rilevamento aggiornamenti LXC con interruttore per cercare pacchetti in attesa nei container Debian, Ubuntu e Alpine attivi", + "imageCaption": "Interruttore dell’analisi periodica con apt list --upgradable / apk list -u nei CT attivi. È acceso per impostazione predefinita. L’opzione in Notifiche → Servizi appare mentre il rilevamento è attivo.", + "intro": "L’interruttore tra Soglie e Notifiche controlla l’analisi LXC. Attivo, interroga i gestori di pacchetti dei CT in esecuzione; Hardware mostra i risultati e alimenta lxc_updates_available. Disattivo, ferma le chiamate pct exec e rimuove le voci LXC da managed_installs.json; /api/managed-installs smette di riportare lo stato senza attendere 24 ore.", + "whatRunsTitle": "Cosa esegue l’analisi", + "whatRunsIntro": "Per ogni CT in stato running con un gestore di pacchetti supportato:", + "whatRunsItems": [ + "Aggiornamento dei metadati. Se la cache apt/apk supera 24 ore, tenta apt-get update -qq su Debian/Ubuntu o apk update su Alpine con limite di 60 s. Se fallisce, l’elenco usa la cache disponibile e può essere obsoleto.", + "Elenco. Esegue apt list --upgradable / apk list -u ed estrae numero di pacchetti e alcuni nomi.", + "Evitare duplicati per CT. Un’impronta di totale, aggiornamenti di sicurezza e nomi ordinati evita avvisi quotidiani identici. Un cambiamento significativo genera un nuovo avviso." + ], + "selfUpdateTitle": "I CT aggiornati fuori apt possono indicare 0", + "selfUpdateBody": "Il rilevamento copre solo il gestore di pacchetti del CT. Software aggiornato fuori apt, come un’attività plexupdate configurata o immagini ottenute con docker pull, non rientra nel conteggio. Zero aggiornamenti apt non prova che tutte le app siano aggiornate. I pacchetti del sistema base restano rilevati.", + "refreshTitle": "Perché aggiornare i metadati dopo 24 ore", + "refreshBody": "Un CT attivo da tempo può avere metadati apt vecchi se nessuno esegue apt update. apt list --upgradable può quindi perdere nuovi aggiornamenti. ProxMenux tenta il rinnovo dopo 24 ore e lo salta se la cache è più recente.", + "toggleTitle": "Opzione di notifica legata al rilevamento", + "toggleBody": "L’opzione lxc_updates_available per canale in Notifiche → Servizi appare solo con rilevamento attivo. Disattivandolo, la riga scompare da tutti i canali. La preferenza resta nel database e ritorna al valore precedente alla riattivazione.", + "purgeTitle": "Cosa viene rimosso disattivando il rilevamento", + "purgeBody": "Disattivandolo si rimuovono subito le voci type=lxc da /usr/local/share/proxmenux/managed_installs.json. I contatori degli aggiornamenti LXC in Hardware spariscono al prossimo aggiornamento. Riattivandolo, il ciclo successivo ripopola il registro, o prima tramite aggiornamento manuale dell’API." + }, + "storageExclusions": { + "heading": "Esclusioni storage remoto", + "imageAlt": "Scheda esclusioni degli storage remoti PBS-Cloud, PBS e PBS2 con controlli Stato e Avvisi per riga", + "imageCaption": "Controlli Stato e Avvisi per storage. Con entrambi spenti, lo storage non contribuisce a Health Monitor e non invia notifiche. Resta visibile in Archiviazione, indicato come escluso.", + "intro": "Puoi escludere gli storage gestiti da Proxmox (NFS / CIFS / PBS / Ceph / iSCSI / ecc.) con due controlli indipendenti:", + "items": [ + "Stato — disattivando questo controllo, lo storage non contribuisce più alla categoria Archiviazione di Health Monitor. Utile per volumi di archivio solitamente offline o destinazioni di backup remote accese solo secondo un programma.", + "Avvisi — disattivandolo, gli avvisi di questo storage non passano più ai canali configurati, anche con i controlli di stato attivi. Utile per vedere lo stato nel pannello senza ricevere notifiche." + ], + "outro": "Gli storage esclusi restano nella scheda Archiviazione con il badge viola escluso, mantenendo visibile l’inventario. Lo stato è salvato nella tabella SQLite excluded_storages." + }, + "interfaceExclusions": { + "heading": "Esclusioni interfacce rete", + "imageAlt": "Scheda esclusioni delle interfacce vmbr0, vmbr1, vmbr2, bond0 ed eno1 con controlli Stato e Avvisi per interfaccia", + "imageCaption": "Come per gli storage, ogni interfaccia offre Stato e Avvisi. Ogni riga mostra nome, tipo (bridge / bond / fisica), IP e velocità del collegamento.", + "intro": "Lo stesso principio vale per le interfacce: escludere ciascuna dai controlli di stato, dalle notifiche o da entrambi. Esempi comuni:", + "items": [ + "Un bridge di riserva disattivato intenzionalmente.", + "Una scheda di rete rimossa fisicamente ma ancora presente in /etc/network/interfaces.", + "Una sottointerfaccia VLAN usata solo durante la manutenzione.", + "Un bridge di gestione con cambi ripetuti e noti dello stato del collegamento durante la manutenzione." + ], + "outro": "Lo stato è salvato nella tabella SQLite excluded_interfaces. Il badge viola esclusa nella scheda Rete mantiene visibili le interfacce escluse." + }, + "notifications": { + "heading": "Notifiche e IA", + "body1": "Qui si attivano le notifiche di ProxMenux Monitor e la riformulazione con IA. Attiva notifiche avvia l’invio in background, registra una destinazione webhook Proxmox VE per riceverne gli eventi e apre i canali: Telegram, Discord, email, Gotify e altri. La riformulazione con IA è in una sezione avanzata espandibile dello stesso pannello.", + "body2": "Le opzioni sono spiegate in pagine dedicate: canali, controlli per evento, messaggi formattati, nome visualizzato, invio con deduplicazione, attesa, raggruppamento e ore silenziose, webhook PVE, provider IA e modalità delle istruzioni:", + "items": [ + "Notifiche: configurazione dei canali (Telegram, Discord, Gotify, email e password per app Gmail / Microsoft, ntfy, Slack, Teams e webhook generico), categorie di eventi, messaggi formattati, nome visualizzato, invio, webhook PVE, cronologia e API.", + "Assistente IA: provider (OpenAI, Anthropic, Gemini, Groq, OpenRouter, Ollama), modelli, istruzioni predefinite o personalizzate, lingua di uscita, dettaglio per canale e suggerimenti IA." + ] + }, + "optimizations": { + "heading": "Ottimizzazioni ProxMenux", + "intro": "Inventario delle ottimizzazioni successive all’installazione registrate da ProxMenux sull’host. Le opzioni di Post-installazione automatica e Post-installazione personalizzabile registrano l’applicazione in /usr/local/share/proxmenux/installed_tools.json. Monitor legge questo registro. Una voce non verifica di nuovo che tutte le impostazioni siano rimaste invariate.", + "imageAlt": "Scheda ottimizzazioni ProxMenux con 14 voci: punto colorato, nome e versione. Include APT IPv4 Force, Bashrc Customization, Fastfetch, Log2ram SSD Protection, Memory Settings Optimization, Setting persistent network interfaces, System Limits Increase, APT Language Skip, Entropy Generation haveged con Legacy, Kernel Panic Configuration, Logrotate Optimization, Network Optimizations, Subscription Banner Removal e VFIO IOMMU Passthrough.", + "imageCaption": "Ogni ottimizzazione mostra nome, versione e punto colorato. In alto a destra compare il contatore arancione 14 attive. Gli strumenti con sorgente disponibile sono apribili.", + "dotsTitle": "Cosa significano i puntini", + "dotsItems": [ + " Punto verde: ottimizzazione registrata senza indicazione Legacy né aggiornamento disponibile. Apri la riga se il sorgente è disponibile.", + " Punto ambra e badge legacy: ottimizzazione registrata il cui script è stato rinominato o sostituito. Il sorgente conservato si apre in modalità Legacy con dettagli ambra. Non verifica nuovamente la configurazione attuale dell’host." + ], + "clickTitle": "Aprire il codice sorgente", + "clickBody": "Un clic mostra la funzione bash associata e il nome dello script (auto_post_install.sh o customizable_post_install.sh). Gli strumenti attuali usano file dell’host; quelli precedenti possono usare sorgente conservato. Evidenziazione della sintassi e Copia aiutano l’esame. Non è una copia garantita del codice eseguito all’installazione.", + "detailAlt": "Finestra del sorgente APT IPv4 Force con la funzione bash force_apt_ipv4 da customizable_post_install.sh versione 1.0. Il codice evidenziato configura /etc/apt/apt.conf.d/99-force-ipv4 con Acquire ForceIPv4 true, registra lo strumento e mostra un messaggio tradotto di configurazione APT IPv4 completata.", + "detailCaption": "Codice di APT IPv4 Force: funzione force_apt_ipv4() di customizable_post_install.sh v1.0, con evidenziazione della sintassi e copia con un clic.", + "whyTitle": "Perché questo è importante", + "whyBody": "ProxMenux può modificare parametri del kernel, repository, rete, rotazione dei log e passthrough GPU. Consulta le ottimizzazioni registrate prima di modifiche manuali, specie se un altro amministratore ha preparato l’host. La scheda mostra registro e sorgente disponibile; non controlla ogni impostazione attuale né conserva una cronologia esatta delle esecuzioni.", + "updatesTitle": "Banner degli aggiornamenti disponibili", + "updatesBody": "Se la versione su disco di un’ottimizzazione supera quella registrata sull’host, appare un banner con il numero e Applica. Applica apre il selettore, come Applica aggiornamenti disponibili nel menu post-installazione. Scegli cosa aggiornare: ProxMenux esegue di nuovo le funzioni e aggiorna il registro. Quando tutto è aggiornato, il banner scompare.", + "updatesAlt": "Scheda ottimizzazioni ProxMenux con banner degli aggiornamenti disponibili, numero in attesa e pulsante Applica per selezionarli", + "updatesCaption": "Il banner appare se almeno un’ottimizzazione ha una versione più recente su disco. Vedi Applica aggiornamenti disponibili per la procedura e l’equivalente Path-A nel menu della shell.", + "revertTitle": "Annullare un’ottimizzazione", + "revertBody": "Per annullare un’ottimizzazione, usa l’opzione corrispondente in Disinstalla ottimizzazioni dal menu ProxMenux Scripts. La disinstallazione rimuove la voce da installed_tools.json e la scheda non la mostra al prossimo aggiornamento." + }, + "dataCollected": { + "heading": "Come vengono raccolti i dati", + "headerCard": "Scheda", + "headerEndpoint": "Endpoint", + "headerSource": "Fonte", + "rows": [ + { + "card": "Lingua di interfaccia", + "endpoint": "localStorage", + "source": "Preferenza del browser proxmenux-ui-language; senza una scelta salvata, usa inizialmente la lingua del browser." + }, + { + "card": "Ordine di navigazione", + "endpoint": "localStorage", + "source": "Preferenza del browser proxmenux-nav-order; determina anche la scheda iniziale." + }, + { + "card": "Unità rete", + "endpoint": "/api/settings", + "source": "Salvato nella tabella SQLite delle impostazioni del pannello." + }, + { + "card": "Durate di Health Monitor", + "endpoint": "/api/health/settings", + "source": "Durata del silenziamento per categoria nel database di Health Monitor." + }, + { + "card": "Esclusioni di storage/interfaccia", + "endpoint": "/api/storage/exclusions, /api/network/exclusions", + "source": "Tabelle SQLite excluded_storages e excluded_interfaces." + }, + { + "card": "Pannello Notifiche e IA", + "endpoint": "/api/notifications/*", + "source": "Vedi Notifiche e Assistente IA." + }, + { + "card": "Elenco ottimizzazioni ProxMenux", + "endpoint": "/api/proxmenux/installed-tools", + "source": "Legge /usr/local/share/proxmenux/installed_tools.json, scritto dalle chiamate a register_tool negli script post-installazione." + }, + { + "card": "Finestra del codice di ottimizzazione", + "endpoint": "/api/proxmenux/tool-source", + "source": "Estrae la funzione bash associata da auto_post_install.sh o customizable_post_install.sh sull’host; gli strumenti precedenti possono usare codice conservato." + } + ] + }, + "whereNext": { + "heading": "Come proseguire", + "items": [ + { + "label": "Scheda Apps", + "href": "/docs/monitor/dashboard/apps", + "tail": " — il pannello di avvio la cui posizione si modifica con l’ordine di navigazione." + }, + { + "label": "Notifiche", + "href": "/docs/monitor/notifications", + "tail": " — canali, controlli per evento, impostazioni specifiche per canale, cronologia e invio di prova." + }, + { + "label": "Assistente IA", + "href": "/docs/monitor/ai-assistant", + "tail": " — provider, modelli, modalità delle istruzioni, lingue e dettaglio per canale." + }, + { + "label": "Health Monitor → Silenziare gli avvisi e durata del silenziamento", + "href": "/docs/monitor/health-monitor#dismissing-alerts-and-the-suppression-duration", + "tail": " — come funzionano i menu di durata per categoria." + }, + { + "label": "ProxMenux Scripts → Post-installazione automatica", + "href": "/docs/post-install/automated", + "tailRich": " e Post-installazione personalizzabile: gli script che registrano le ottimizzazioni nell’elenco precedente." + }, + { + "label": "Disinstalla ottimizzazioni", + "href": "/docs/post-install/uninstall", + "tail": " — come annullare un’ottimizzazione elencata sopra." + }, + { + "label": "Indice Dashboard", + "href": "/docs/monitor/dashboard", + "tail": " — torna alla panoramica delle schede." + } + ] + } +} diff --git a/web/messages/it/docs/monitor/dashboard/storage.json b/web/messages/it/docs/monitor/dashboard/storage.json new file mode 100644 index 00000000..b4d979cf --- /dev/null +++ b/web/messages/it/docs/monitor/dashboard/storage.json @@ -0,0 +1,268 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Dashboard: scheda Archiviazione | Documentazione ProxMenux", + "description": "La scheda Archiviazione riunisce quattro viste: storage Proxmox con stato, pool ZFS, dischi interni con SMART e unità USB esterne. Il dettaglio di ogni disco mostra attributi SMART, usura, durata e storico permanente delle osservazioni." + }, + "header": { + "title": "Dashboard: scheda Archiviazione", + "description": "Tutto lo storage dell’host in una schermata: NFS / CIFS / LVM / ZFS / dir Proxmox, stato dei pool ZFS, dischi interni SATA/NVMe con SMART e unità USB esterne. Fai clic su un disco per vedere attributi SMART e storico delle osservazioni.", + "section": "ProxMenux Monitor · Dashboard" + }, + "intro": { + "title": "Supportato da tre fonti", + "body": "Gli storage Proxmox provengono da pvesm status, ZFS da zpool status, i dischi da lsblk + smartctl e i campi NVMe da nvme. La scheda si aggiorna circa ogni 60 secondi; aprire il dettaglio richiede una lettura SMART." + }, + "thresholds": { + "title": "Colori e soglie di stato applicate qui", + "intro": "Health Monitor classifica lo stato come verde sotto Avviso, ambra tra Avviso e Critico e rosso da Critico in poi. Seguono i valori predefiniti. Le barre della dashboard possono usare altri limiti visivi descritti sotto.", + "items": [ + "Capacità (dischi host, storage PVE, pool ZFS, montaggi LXC) — avviso 85%, critico 95%.", + "Temperatura del disco — HDD 60/65 °C · SSD 70/75 °C · NVMe 80/85 °C · SAS 55/65 °C (avvertimento / critico)." + ], + "outro": "Ogni valore è configurabile per host. Impostazioni → Soglie di Health Monitor riporta i valori di riferimento e spiega come modificarli." + }, + "topRow": { + "heading": "Riga superiore: riepilogo dello storage", + "intro": "All’apertura, quattro schede riepilogano capacità totale, uso locale, uso remoto e inventario dei dischi fisici. Offrono risposte rapide; le schede sottostanti contengono i dettagli.", + "imageAlt": "Scheda Archiviazione con quattro schede: capacità totale, uso locale, uso remoto e dischi fisici", + "imageCaption": "Riga superiore: capacità totale e numero di dischi, byte usati localmente e da remoto e dischi fisici per tipo con riepilogo dello stato.", + "headerCard": "Scheda", + "headerWhat": "Cosa mostra", + "totalLabel": "Capacità totale", + "totalWhat": "Capacità grezza totale di tutti i dischi fisici. Il piè di pagina indica quanti dischi sono stati rilevati.", + "localLabel": "Uso locale", + "localWhat": "Byte usati sullo storage locale: LVM / LVM-thin / ZFS / dir sui dischi dell’host. Il valore principale mostra i byte usati e il piè di pagina X.XX % di Y TB indica anche la percentuale di occupazione.", + "remoteLabel": "Uso remoto", + "remoteWhat": "Stesso formato dell’uso locale per storage remoti NFS / CIFS / PBS / Ceph / iSCSI. Sono conteggiati separatamente perché i guasti locali e remoti hanno effetti diversi e queste risorse si dimensionano e monitorano diversamente.", + "disksLabel": "Dischi fisici", + "disksIntro": "Due linee di ripartizione per l'inventario:", + "disksItems": [ + "Per tipo — numero di NVMe in viola, SSD e HDD in blu. Compaiono i tipi rilevati; un host con soli NVMe mostra solo quel conteggio.", + "Per stato — numero di dischi normali in verde, con avviso in giallo e critici in rosso. Senza problemi compare solo «X normali»; gli altri stati appaiono in presenza di problemi." + ] + }, + "pveStorage": { + "heading": "Scheda di stoccaggio Proxmox", + "intro": "Una riga per storage di /etc/pve/storage.cfg con tipo (nfs / cifs / zfspool / lvm / lvmthin / dir / pbs), nome, stato attivo/errore/non monitorato, percentuale d’uso e barra colorata:", + "items": [ + "Fino al 75% — barra e valore blu.", + "Oltre il 75% fino al 90% — barra e valore gialli. Questi limiti visivi sono distinti dalle soglie di Health Monitor.", + "> 90% — barra e valore rossi. Questo limite visivo è distinto dall’escalation di Health Monitor.", + "Errore — bordo rosso della riga se lo storage è configurato ma non raggiungibile, per esempio server NFS fermo o credenziali CIFS scadute.", + "Escluso — bordo viola ed etichetta «non monitorato». Storage esclusi dall’utente, come volumi di archivio mantenuti scollegati." + ], + "calloutTitle": "Escludere uno storage dal monitoraggio", + "calloutBody": "Il menu di ogni storage permette di marcarlo come escluso dal monitoraggio. L’impostazione è salvata in excluded_storages e rispettata da dashboard e Health Monitor: nessuna notifica né effetto sullo stato generale." + }, + "zfs": { + "heading": "Scheda Pool ZFS", + "intro": "Compare solo se ZFS è installato e c’è almeno un pool. Ogni riga mostra un pool con stato, dimensione, spazio allocato e libero e icona di stato:", + "items": [ + "ONLINE — verde. Tutto sano.", + "DEGRADED — giallo. Il pool fornisce dati, ma almeno un dispositivo non è disponibile; occorre gestirne la sostituzione.", + "FAULTED / UNAVAIL / SUSPENDED — rosso. Il pool non fornisce dati e richiede intervento immediato." + ], + "outro": "Lo stato ZFS e SMART di ogni disco contribuisce alla categoria Dischi e I/O di Health Monitor." + }, + "physical": { + "heading": "Dischi fisici e stato SMART", + "intro": "Disco interno (SATA / NVMe). Ogni riga condensa i campi più utili a colpo d'occhio:", + "items": [ + "Percorso del dispositivo — /dev/sda, /dev/nvme0n1.", + "Etichetta del tipo — SATA / NVMe e relativa icona.", + "Etichetta di sistema — indicatore arancione dei dischi identificati come dischi del sistema operativo. Il rilevamento usa i montaggi / e /boot e assegna System. L’assenza dell’etichetta non dimostra che il disco possa essere cancellato o riutilizzato senza rischi.", + "Modello — produttore e modello da smartctl -i.", + "Capacità — espressa in unità leggibili.", + "Temperatura — valore attuale in °C, colorato secondo il tipo di disco; NVMe usa soglie più alte di SATA.", + "Stato SMART — superato / fallito / sconosciuto.", + "Etichetta delle osservazioni — se lo storico permanente disk_observations contiene voci per il disco, un’etichetta blu ne indica il numero, come 3 obs.. Fai clic sul disco per esaminarle.", + "Etichetta di stato — Regolare / Avviso / Critico, secondo SMART e le osservazioni recenti." + ], + "clickHint": "Un clic sull’intera riga apre il dettaglio del disco descritto sotto.", + "warningTitle": "Attenzione ai dischi con etichetta System", + "warningBody": "I dischi con etichetta arancione System ospitano il sistema attivo. L’etichetta aiuta a identificarli; ProxMenux → Gestione dischi → Formatta / Cancella rifiuta le azioni distruttive su di essi. Per riutilizzare il disco di avvio, usa un ambiente di ripristino esterno al Proxmox in esecuzione." + }, + "external": { + "heading": "Storage esterno (USB)", + "body": "Le unità USB hanno una scheda dedicata, visibile quando almeno una è presente. Mostra gli stessi campi dei dischi interni e l’etichetta arancione USB. Poiché spesso si collegano solo per backup o trasferimenti occasionali, le osservazioni sono conservate, ma gli errori I/O di un’unità USB scollegata non vengono escalati." + }, + "drillIn": { + "heading": "Finestra di dettaglio del disco", + "intro": "Un clic sul disco apre quattro schede: Panoramica · SMART · Cronologia · Pianificazione. L’intestazione mostra percorso, modello, capacità e, se applicabile, l’etichetta arancione System.", + "overviewTitle": "Scheda 1 — Panoramica", + "overviewImageAlt": "Dettaglio del disco, scheda Panoramica con stato, indicatore circolare di usura e durata e attributi SMART principali", + "overviewImageCaption": "Panoramica: identificazione, stato, vita residua con usura attuale e dati scritti e attributi SMART principali.", + "overviewIntro": "Scheda iniziale per consultare lo stato del disco senza eseguire test. Tre sezioni:", + "overviewItems": [ + "Identificazione — modello, numero di serie, capacità e stato Regolare / Avviso / Critico.", + "Usura e durata — anello della vita residua (97%, 50%, …) con attributo sorgente (Media Wearout Indicator, Percentage Used, …), barra della percentuale consumata, previsione Vita stimata in anni e dati totali scritti. NVMe mostra anche Available Spare.", + "Attributi SMART: i valori principali sono mostrati su due colonne: temperatura, ore di accensione con una durata leggibile come 3 anni e 116 giorni, velocità di rotazione oppure SSD, cicli di accensione, stato SMART, settori riallocati, settori in attesa ed errori CRC. La tabella completa degli attributi si trova nella scheda SMART." + ], + "smartTitle": "Scheda 2 — SMART", + "smartImageAlt": "Dettaglio del disco, scheda SMART con test breve ed esteso, ultimo risultato e tabella completa degli attributi", + "smartImageCaption": "Scheda SMART: avvia test brevi o estesi, consulta l’ultimo risultato e tutti gli attributi e apri il rapporto completo per stamparlo o salvarlo in PDF.", + "smartIntro": "Azioni disponibili in tre sezioni:", + "smartItems": [ + "Esegui test SMART — due pulsanti. Test breve (~2 min) attende il risultato e lo mostra nella finestra. Test esteso (background) può durare ore sui dischi grandi, continua sul server e notifica al termine.", + "Ultimo test — tipo, stato (superato / fallito) e data e ora dell’ultima esecuzione.", + "Attributi SMART — tabella completa con ID, nome, valore, valore peggiore e stato regolare, avviso o critico. SATA/SAS mostra l’elenco numerato. NVMe usa nvme smart-log: temperatura, riserva disponibile, percentuale usata, unità lette/scritte, letture/scritture host, tempo di occupazione del controller, cicli di accensione, arresti non sicuri, errori del supporto, voci del registro errori e tempo con temperatura composita in avviso/critico." + ], + "pdfTitle": "Visualizza il rapporto SMART completo (PDF)", + "pdfIntro": "In fondo a SMART, Visualizza rapporto SMART completo apre un rapporto stampabile. Usa la finestra di stampa del browser per salvarlo in PDF, archiviarlo o condividerlo con il supporto per un RMA.", + "pdfPreviewAlt": "Prima pagina del rapporto SMART con sintesi, indicatore PASSED e informazioni sul disco", + "pdfPreviewCaption": "Prima pagina: sintesi, indicatore PASSED e informazioni complete del disco. Il PDF di esempio include usura SSD, tutti gli attributi SMART e cronologia dei test.", + "pdfDownloadLabel": "Scarica un rapporto SMART di esempio (PDF)", + "pdfSectionsIntro": "Il rapporto ha sei sezioni principali:", + "pdfSections": [ + "Sintesi — stato PASSED/FAILED, valutazione chiara del disco — regolare, usurato o guasto — e quattro dati: data del rapporto, ultimo tipo di test, risultato e attributi controllati.", + "Informazioni sul disco — modello, serie, capacità, tipo HDD/SSD/NVMe, famiglia, formato, interfaccia (SATA 3.3 · 6.0 Gb/s, …), TRIM, temperatura e soglia ottimale, ore e cicli di accensione, SMART, settori in attesa/riallocati ed errori CRC.", + "Usura e durata SSD (solo SSD/NVMe) — vita residua, attributo sorgente, usura attuale, dati scritti e ore di accensione.", + "Attributi SMART completi — ID, nome, valore, valore peggiore, soglia, valore grezzo e stato di ogni attributo. I principali — Reallocated Sector Ct, Power On Hours, Reported Uncorrect, UDMA CRC Error Count, Media Wearout Indicator, … — hanno una breve spiegazione sotto la riga.", + "Ultimo autotest e cronologia completa — ultimo test con tipo, risultato, messaggio finale e ore di accensione al momento, più tabella numerata di tutti i test conservati.", + "Raccomandazioni — azioni secondo il risultato. Per dischi regolari: disco sano / test periodici / strategia di backup. Se gli attributi superano i limiti, compaiono indicazioni per la sostituzione." + ], + "pdfOutro": "Il browser crea il rapporto stampabile; Stampa e Salva come PDF aprono entrambi la finestra di stampa. Scegli un nome come SMART-<short-id>.pdf. Conserva copie datate per confrontare i cambiamenti o condividerle con il supporto.", + "historyTitle": "Scheda 3 — Cronologia", + "historyImageAlt": "Dettaglio del disco, scheda Cronologia con test SMART precedenti e azioni di download ed eliminazione", + "historyImageCaption": "Cronologia SMART del disco. Ogni riga mostra tipo, data e ora, anzianità, indicatore dell’ultimo test e azioni di download dell’output smartctl ed eliminazione.", + "historyIntro": "Test brevi ed estesi completati e conservati per il disco. Ogni voce contiene l’output originale smartctl e i campi interpretati da Monitor per la dashboard. Azioni per riga:", + "historyItems": [ + "Scarica — salva lo snapshot JSON con i dati smartctl -a usati dal rapporto. Utile se il supporto richiede i campi diagnostici originali.", + "Elimina — rimuove manualmente un test dalla cronologia. La conservazione in Pianificazione (ultimi 5 / 10 / 20) elimina automaticamente i più vecchi." + ], + "scheduleTitle": "Scheda 4 — Pianificazione", + "scheduleImageAlt": "Dettaglio del disco, scheda Pianificazione con interruttore per test SMART automatici, elenco dei piani e pulsante Aggiungi pianificazione", + "scheduleImageCaption": "Pianificazione: scegli tipo, frequenza e conservazione; Monitor configura cron per eseguire i test automaticamente.", + "scheduleIntro": "Test SMART automatici tramite cron, senza terminale. Tre aree:", + "scheduleItems": [ + "Test SMART automatici — interruttore generale di tutti i piani del disco. Permette di sospenderli durante la manutenzione senza cancellarne la configurazione.", + "Piani configurati — una riga per piano con tipo (breve / lungo), espressione cron leggibile («Il giorno 1 del mese alle 03:00», «Ogni domenica alle 02:00»), dischi inclusi e conservazione.", + "Aggiungi / Modifica pianificazione — tipo (breve ~2 min / lungo 1–4 h), frequenza (giornaliera / settimanale / mensile), giorno del mese o settimana, ora e risultati conservati (ultimi 5 / 10 / 20)." + ], + "scheduleOutro": "Il piano crea una voce cron sull’host che richiama Monitor. I risultati vanno nello storico SMART della scheda 3 e la conservazione elimina automaticamente i più vecchi al termine di un nuovo test.", + "tempTitle": "Finestra dello storico della temperatura", + "tempIntro": "Monitor raccoglie periodicamente le letture dei dischi con sensore di temperatura e le salva in uno storico locale. Il valore attuale appare in Panoramica; un clic apre lo storico della temperatura.", + "tempImageAlt": "Storico della temperatura con percorso e modello, intervalli di 1 ora, 24 ore, 7 o 30 giorni, indicatori Attuale/Minimo/Media/Massimo e grafico a linee colorato secondo le soglie del tipo di disco", + "tempImageCaption": "Il dettaglio della temperatura si apre da Panoramica se il sensore restituisce un valore diverso da zero. Il grafico usa le soglie HDD / SSD / NVMe / SAS.", + "tempShowsTitle": "Contenuto della finestra", + "tempShowsItems": [ + "Selettore dell’intervallo: 1 ora, 24 ore predefinite, 7 giorni o 30 giorni. Ogni richiesta adatta la risoluzione per mantenere il grafico leggibile.", + "Quattro indicatori: Attuale, Minimo, Media e Massimo nell’intervallo. Attuale usa le soglie dello storage e delle notifiche per distinguere temperatura normale, elevata o molto alta.", + "Grafico a linee della temperatura nel tempo, con linea e area colorate secondo il tipo di disco:" + ], + "tempDiskTypes": [ + "HDD — soglie tipicamente più fresche.", + "SSD — soglie moderate.", + "NVMe — soglie più elevate (NVMe funziona più caldo per design).", + "SAS — avviso a 55 °C e critico a 65 °C, con soglia di avviso diversa da HDD." + ], + "tempConfigurable": "I quattro tipi si configurano in Impostazioni → Soglie di Health Monitor.", + "tempWhyTitle": "Perché lo storico è utile", + "tempWhyItems": [ + "Rilevare tendenze. Una lettura isolata non rivela che un disco si scalda da settimane, per esempio per ventilazione difettosa, polvere o calore vicino. Le viste di 7 e 30 giorni mostrano l’evoluzione.", + "Correlare i picchi. Se un backup o una ricostruzione ha superato brevemente la soglia, le viste di 1 e 24 ore mostrano se il picco è isolato o ricorrente.", + "Regolare le soglie. Prima di modificarle in Impostazioni → Soglie di Health Monitor, consulta il grafico di 30 giorni per conoscere l’intervallo operativo reale del disco." + ], + "obsTitle": "Storico delle osservazioni nelle schede", + "obsIntro": "I guasti possono svilupparsi gradualmente. Un disco può indicare SMART PASSED e registrare errori di lettura in dmesg, perdere collegamenti SATA o mostrare settori in attesa intermittenti. ProxMenux conserva questi segnali e li mostra nella finestra accanto allo stato SMART attuale.", + "obsImageAlt": "Panoramica di un disco con SMART superato e zero settori riallocati/in attesa ed errori CRC, ma un’osservazione di errore I/O con messaggio originale del kernel, spiegazione ATA, prima e ultima data e conteggio", + "obsImageCaption": "Un disco che supera SMART può avere osservazioni precedenti. La scheda aggiunge lo storico dei segnali allo stato attuale.", + "obsWhatTitle": "Che cos’è un’osservazione", + "obsWhatIntro": "ProxMenux registra come osservazione gli eventi disco rilevati nei registri del kernel, dmesg o SMART troppo specifici per una notifica singola. Ogni riga mostra:", + "obsWhatItems": [ + "Tipo — errore I/O, SMART, filesystem, pool ZFS o connessione.", + "Messaggio originale del kernel da dmesg, da copiare in un motore di ricerca o richiesta di supporto.", + "Breve spiegazione dei codici ATA noti: IDNF, indirizzo del settore non trovato, possibile settore o cavo difettoso; UNC, errore di lettura irrecuperabile, settore difettoso; e altri codici standard.", + "Prima e ultima data e numero di occorrenze, raggruppate per firma dell’errore." + ], + "obsWhyTitle": "Perché ProxMenux le registra e mostra", + "obsWhyItems": [ + "I guasti possono evolvere. Errori del bus ATA, settori UNC o errori del supporto possono apparire prima di SMART FAILED. Il buffer dmesg non li conserva dopo il riavvio; lo storico delle osservazioni sì.", + "SMART non esclude ogni guasto. Un disco può avere attributi verdi e presentare problemi. Le osservazioni conservano altri sintomi, come ICRC, IDNF, reset dei collegamenti SATA o riduzioni di velocità.", + "Distingue il presente dal recente. Health Monitor risolve automaticamente gli errori transitori che non si ripresentano. Lo storico permette di vedere giorni dopo, per esempio, tre errori I/O di una notte.", + "Alimenta le notifiche per livelli. disk_io usa la frequenza delle osservazioni per scegliere silenzio, WARNING o CRITICAL su una finestra mobile di 24 ore introdotta in 1.2.1.2." + ], + "obsDedupTitle": "Raggruppamento dei duplicati e nuovi avvisi", + "obsDedupBody1": "Le osservazioni sono raggruppate per firma, un’impronta stabile di tipo di errore, dispositivo e campi chiave del messaggio. Le ripetizioni incrementano occurrence_count nella riga esistente. Una firma diversa crea un’altra osservazione ed è un nuovo evento per le notifiche.", + "obsDedupBody2": "Per evitare notifiche a cascata, la prima combinazione di disco, firma e gravità avvisa l’operatore. La stessa combinazione attende 24 ore prima di un nuovo avviso, anche se il conteggio aumenta. Il passaggio da WARNING a CRITICAL interrompe l’attesa e segnala il peggioramento.", + "obsDismissTitle": "Storico permanente ed errori attivi", + "obsDismissBody1": "Le osservazioni non possono essere ignorate, nascoste o eliminate. Ogni firma ha una scheda; una ripetizione aumenta il conteggio e aggiorna l’ultima data. Lo storico segue il numero di serie: un altro disco inizia vuoto anche sulla stessa porta e un cambio di nome del kernel conserva lo storico.", + "obsDismissBody2": "Risolvere o ignorare un errore attivo in Health Monitor non modifica le osservazioni. Restano dopo la risoluzione automatica, così un avviso transitorio della settimana scorsa è ancora visibile. Vedi Health Monitor per gestire gli errori attivi." + }, + "dataCollected": { + "heading": "Come vengono raccolti i dati", + "headerSection": "Sezione della scheda", + "headerEndpoint": "Endpoint", + "headerSource": "Fonte", + "rows": [ + { + "section": "Schede di riepilogo superiori", + "endpoint": "/api/storage/summary", + "source": "Aggregato da lsblk, zpool list, vgs / lvs." + }, + { + "section": "Inventario per disco", + "endpoint": "/api/storage", + "source": "lsblk -O + smartctl -i per dispositivo, con cache dell’identità svuotata agli eventi hotplug." + }, + { + "section": "Storage Proxmox", + "endpoint": "/api/proxmox-storage", + "source": "pvesh get /nodes/<node>/storage con lo stato attivo/online di ciascuno." + }, + { + "section": "Valori SMART attuali", + "endpoint": "/api/storage/smart/", + "source": "smartctl -A <dev> è una delle interrogazioni disponibili; l’endpoint di dettaglio usa anche il JSON SMART completo e dati specifici NVMe." + }, + { + "section": "Cronologia degli autotest SMART", + "endpoint": "/api/storage/smart//history", + "source": "Salvato in /usr/local/share/proxmenux/smart/<disk>/ come snapshot JSON." + }, + { + "section": "Osservazioni permanenti", + "endpoint": "/api/storage/observations", + "source": "Tabella SQLite aggiornata da Health Monitor a ogni ciclo e conservata dopo la risoluzione degli errori attivi." + } + ], + "outro": "Verificare la catena di raccolta sull'host:", + "codeComment1": "# Ottieni lo stato attuale da uno script", + "codeComment2": "# Confronta i dati della dashboard con quelli del sistema operativo" + }, + "whereNext": { + "heading": "Per approfondire", + "items": [ + { + "label": "Monitoraggio integrità", + "href": "/docs/monitor/health-monitor", + "tail": " — categoria Dischi e I/O e regole di soppressione." + }, + { + "label": "Riferimento API", + "href": "/docs/monitor/api", + "tail": " — endpoint di storage e SMART." + }, + { + "label": "Notifiche", + "href": "/docs/monitor/notifications", + "tailRich": " — azioni successive attivate da disk_io_error, storage_unavailable e smart_test_failed." + }, + { + "label": "Indice Dashboard", + "href": "/docs/monitor/dashboard", + "tail": "— le altre schede." + }, + { + "label": "ProxMenux → Gestore dischi", + "href": "/docs/disk-manager", + "tail": " — azioni TUI: formattare, cancellare, eseguire test SMART e importare dischi in VM o container." + }, + { + "label": "ProxMenux → Stato e test SMART del disco", + "href": "/docs/disk-manager/smart-disk-test", + "tail": " — equivalente CLI: pianificare test SMART, esportare il JSON mostrato e consultare tipi di test e interpretazione dei risultati." + } + ] + } +} diff --git a/web/messages/it/docs/monitor/dashboard/system-logs.json b/web/messages/it/docs/monitor/dashboard/system-logs.json new file mode 100644 index 00000000..056b6ced --- /dev/null +++ b/web/messages/it/docs/monitor/dashboard/system-logs.json @@ -0,0 +1,120 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Pannello: Log di sistema | Documentazione ProxMenux", + "description": "La scheda System Logs consolida tre sorgenti in una schermata: live journalctl con filtri e download, cronologia delle attività Proxmox (UPID), e registro di notifica — tutti ricercabili, filtrabili per gravità / intervallo di tempo e scaricabili come pacchetti di testo." + }, + "header": { + "title": "Pannello: Log di sistema", + "description": "Tre sottoschede in una schermata: journal di sistema (journalctl con filtri), cronologia delle attività Proxmox e registro delle notifiche. Tutte consentono di cercare, filtrare e scaricare i dati come pacchetti di testo.", + "section": "ProxMenux Monitor · Dashboard" + }, + "readOnly": { + "title": "sola lettura per design", + "body": "Questa scheda non modifica i file di log. I filtri risiedono nell'URL o nello stato dell'interfaccia; i file da scaricare sono preparati sul server. Il pannello non elimina mai le voci: per la manutenzione usa journalctl --vacuum-time=<N> o logrotate sull'host." + }, + "topRow": { + "heading": "Riga superiore: quattro contatori", + "items": [ + "Voci totali — numero di record nel periodo del filtro attivo.", + "Errori — numero di voci con gravità ≤ 3 (err / crit / alert / emerg).", + "Avvisi — numero di voci con gravità 4 (warning).", + "Backup — numero di voci di attività vzdump / PBS nello stesso periodo." + ] + }, + "subtabs": { + "heading": "Tre sottoschede", + "logsTitle": "Log", + "logsIntro": "Il journal di sistema, letto sul server con journalctl. Filtri disponibili nella barra degli strumenti:", + "logsFilters": [ + "Gravità — emerg / alert / crit / err / warning / notice / info / debug, o qualsiasi combinazione.", + "Time range — ultima 5 min / 15 min / 1 h / 6 h / 24 h / 7 d / personalizzato.", + "Ricerca libera — sottostringa o espressione regolare (journalctl --grep).", + "Filtro per unità — limita a una specifica unità systemd (pveproxy.service, nginx.service, …)." + ], + "logsRowsAfter": "Ogni riga mostra timestamp, tasso di gravità, unità sorgente e il messaggio. I messaggi lunghi crollano con un \"mostra di più\". L'azione Download raggruppa il filtro corrente in un unico file .txt tramite GET /api/logs/download — utile quando si desidera condividere una fetta di giornale con qualcuno.", + "logDetailsModalTitle": "Finestra Dettagli del log", + "logDetailsBody": "Un clic su una riga apre Dettagli del log con tutti i campi strutturati acquisiti da journald per quella voce, come eseguendo journalctl --output=verbose sull'host.", + "logDetailsImageAlt": "Finestra Dettagli del log — singola voce del journal con livello, servizio, data e ora, origine, unità systemd, ID del processo, nome host e messaggio completo", + "logDetailsImageCaption": "Dettagli del log — tutti i campi strutturati di questa voce journald, con il messaggio completo non troncato in fondo. Utile per i log di cron e dei servizi quando conta la riga di comando eseguita.", + "fieldsIntro": "Campi indicati:", + "fields": [ + "Level — distintivo di gravità colorato (INFO / ATTENZIONE / ERROR / CRITICAL).", + "Service — nome corto dell'unità / processo che ha emesso l'ingresso.", + "Timestamp — data e ora completi della linea di registro.", + "Source — origine dell'entrata (giornale, kernel, audit, ...).", + "Systemd Unit — l'unità effettiva .service / .timer / .socket se l'ingresso è associato a uno.", + "Process ID — PID del processo di emissione.", + "Hostname — utile quando le riviste vengono inoltrate attraverso nodi di cluster.", + "Messaggio — messaggio completo non troncato in un blocco a spaziatura fissa, pronto da copiare." + ], + "maxLevelStoreTitle": "Journald MaxLevelStore", + "maxLevelStoreBody": "Su una nuova installazione Proxmox, journald usa per impostazione predefinita MaxLevelStore=warning, scartando i messaggi info. Monitor lo rileva all'avvio e aggiunge una configurazione complementare (/etc/systemd/journald.conf.d/proxmenux-loglevel.conf) con soglia info, per conservare messaggi informativi e più gravi. Questo non include debug.", + "backupsTitle": "Backup", + "backupsBody": "Cronologia delle attività Proxmox limitata ai backup. Una riga per attività (vzdump, trasferimenti PBS, Garbage Collect, Verify), con stato (OK / WARNINGS / ERROR), guest interessato, storage di origine, durata e UPID. Fai clic su una riga per caricare il log completo tramite GET /api/task-log/<upid>: gli stessi dati esposti da Proxmox in Datacenter → Tasks, limitati ai backup.", + "notificationsTitle": "Notifiche", + "notificationsBody1": "Tutte le notifiche inviate da Monitor: Telegram, Discord, e-mail, Gotify, ntfy, Slack, Teams e webhook. Ogni riga mostra data e ora, canale, tipo di evento, gravità, titolo e corpo generati e, se l'IA è attiva, un comando per confrontare la sua riscrittura con l'originale.", + "notificationsBody2": "Usa questa scheda per verificare che un canale recapiti le notifiche e confrontare la riscrittura AI con il modello di base. I canali si configurano nella pagina dettagliata Notifiche." + }, + "dataCollected": { + "heading": "Come vengono raccolti i dati", + "headerSubtab": "Sottoscheda", + "headerEndpoint": "Endpoint", + "headerSource": "Fonte", + "rows": [ + { + "subtab": "Registri (filtro in tempo reale)", + "endpoint": "/api/logs", + "source": "journalctl --output json --since <range> con filtri per gravità, unità e ricerca applicati sul server." + }, + { + "subtab": "Scarica", + "endpoint": "/api/logs/download", + "source": "La stessa query, restituita come testo semplice per grep / less." + }, + { + "subtab": "Backup", + "endpoint": "/api/backups", + "source": "Cronologia delle attività PVE filtrata per vzdump, trasferimenti PBS, Garbage Collect e Verify." + }, + { + "subtab": "Dettagli di un'attività di backup", + "endpoint": "/api/task-log/<upid>", + "source": "Log completo dell'attività in testo semplice, letto da /var/log/pve/tasks/<index>/<upid>." + }, + { + "subtab": "Cronologia delle notifiche", + "endpoint": "/api/notifications/history", + "source": "Tabella SQLite notification_history alimentata dal ciclo di invio." + } + ], + "apiIntro": "Il filtro in tempo reale e i download sono accessibili anche tramite API:", + "codeComment1": "# Errori ed eventi più gravi dell'ultima ora con una parola chiave", + "codeComment2": "# Scarica il journal completo delle ultime 6 ore come testo semplice", + "codeComment3": "# Cerca l'output completo di un'attività specifica tramite UPID" + }, + "whereNext": { + "heading": "Dove proseguire", + "items": [ + { + "label": "Monitoraggio integrità", + "href": "/docs/monitor/health-monitor", + "tail": " — la categoria Log di sistema, che rileva eventi persistenti, picchi e sequenze a cascata." + }, + { + "label": "Notifiche", + "href": "/docs/monitor/notifications", + "tail": " — il monitoraggio del journal legge la stessa fonte e trasforma le corrispondenze in notifiche." + }, + { + "label": "Riferimento API", + "href": "/docs/monitor/api", + "tail": " — gli endpoint logs e task-log con i rispettivi parametri di query." + }, + { + "label": "Indice del pannello", + "href": "/docs/monitor/dashboard", + "tail": "— le altre schede." + } + ] + } +} diff --git a/web/messages/it/docs/monitor/dashboard/system-overview.json b/web/messages/it/docs/monitor/dashboard/system-overview.json new file mode 100644 index 00000000..a2ed2e0d --- /dev/null +++ b/web/messages/it/docs/monitor/dashboard/system-overview.json @@ -0,0 +1,177 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Pannello: Panoramica del sistema | Documentazione ProxMenux", + "description": "La scheda iniziale predefinita di ProxMenux Monitor: quattro schede (CPU, memoria, VM e LXC attivi, temperatura) con aggiornamenti in tempo reale e minigrafico di tendenza, grafico storico e riepiloghi di storage e rete con link alle rispettive schede." + }, + "header": { + "title": "Pannello: Panoramica del sistema", + "description": "La scheda aperta per impostazione predefinita: quattro schede con metriche in tempo reale in alto, grafico storico al centro e riepiloghi di storage e rete in basso, dalle stesse API delle rispettive schede.", + "section": "ProxMenux Monitor · Dashboard" + }, + "readOnly": { + "title": "Un'istantanea di sola lettura", + "body": "Tutti i pannelli di questa scheda sono informativi. Le azioni si trovano nelle schede collegate: Storage per gestire i dischi, VM e LXC per avviare o fermare i guest e Sicurezza per configurare l'autenticazione." + }, + "captureAlt": "Scheda Panoramica di sistema — quattro schede metriche (CPU, Memoria, VM attive, Temperatura), grafico metrico nodo e schede di sommario di Storage / Network", + "captureCaption": "Panoramica del sistema, la scheda iniziale predefinita. Le quattro schede si aggiornano in tempo reale, il grafico mostra lo storico e le due schede in basso riepilogano storage e rete.", + "topRow": { + "heading": "Riga superiore: schede con metriche in tempo reale", + "intro": "Quattro schede in una griglia 2×2 su mobile e in una riga su desktop. Ciascuna si aggiorna da /api/system ogni pochi secondi.", + "headerCard": "Scheda", + "headerWhat": "Cosa mostra", + "headerSource": "Fonte", + "rows": [ + { + "card": "Utilizzo CPU", + "what": "Percentuale attuale con barra di avanzamento. Si aggiorna ogni ~1 s tramite il campionatore dei parametri vitali.", + "source": "psutil.cpu_percent()" + }, + { + "card": "Utilizzo memoria", + "what": "GB usati, percentuale e GB totali. La barra rappresenta la percentuale.", + "source": "psutil.virtual_memory()" + }, + { + "card": "VM e LXC attivi", + "what": "Numero di guest in esecuzione, con ripartizione In esecuzione / Arrestati e totali di VM e LXC in fondo.", + "source": "/api/vms (consolidato)" + }, + { + "card": "Temperatura", + "what": "Temperatura CPU in °C con stato (bassa / moderata / alta) e minigrafico degli ultimi 5 minuti sullo sfondo. Mostra N/A senza sensore. Un clic apre i dettagli.", + "source": "sensors / coretemp" + } + ], + "thresholdsTitle": "Colori e soglie di stato applicate qui", + "thresholdsIntro": "Anelli, barre e minigrafici usano la stessa scala: verde sotto Avviso, ambra tra Avviso e Critico, rosso da Critico in poi. Valori predefiniti consigliati inclusi in ProxMenux:", + "thresholdsItems": [ + "Utilizzo CPU — avviso 85 %, critico 95 %.", + "Memoria — avviso 85 %, critico 95 %. Anche lo swap attiva Critico al 5 % di utilizzo; un host Proxmox sano dovrebbe usarlo raramente.", + "Temperatura CPU — avviso 80 °C, critico 90 °C." + ], + "thresholdsOutro": "Ogni valore è configurabile per host. Impostazioni → Soglie del monitor di integrità centralizza le impostazioni e spiega come regolarle.", + "sparklineTitle": "Il minigrafico mostra la tendenza", + "sparklineBody": "La scheda della temperatura traccia gli ultimi 5 minuti sotto il valore, con colori di linea e sfumatura legati alle soglie Avviso/Critico descritte sopra. Permette di vedere subito se la temperatura dell'host sale senza aprire i dettagli." + }, + "processes": { + "heading": "Processi con maggiore utilizzo di CPU e memoria", + "intro": "Le schede Utilizzo CPU e Memoria aprono un elenco ordinabile dei 25 processi principali: per utilizzo CPU dalla scheda CPU e per memoria residente dalla scheda Memoria.", + "listTitle": "La finestra di dialogo elenco", + "listItems": [ + "Aggiornamento automatico — l'elenco si aggiorna ogni 5 secondi finché la finestra è aperta e interrompe le richieste alla chiusura.", + "Filtro — la ricerca limita l'elenco per comando, utente o PID.", + "Barra nella riga — la colonna della metrica principale disegna una piccola barra scalata al massimo valore nell'elenco filtrato. La graduatoria resta evidente anche se nessun processo si avvicina al 100 %.", + "Disposizione mobile — sotto 640 px le colonne PID e Utente si nascondono, così Comando, CPU % e Memoria restano visibili senza scorrimento orizzontale." + ], + "captureListAlt": "Finestra dei processi per memoria — tabella ordinata per RSS con PID, utente, comando, CPU % e memoria", + "captureListCaption": "La scheda Memoria apre l'elenco ordinato per RSS (colore indaco). La scheda CPU apre lo stesso elenco ordinato per utilizzo CPU (colore blu).", + "detailTitle": "Dettaglio del processo", + "detailIntro": "Un clic su una riga apre una seconda finestra con i dati in tempo reale del processo, organizzati in quattro sezioni:", + "detailItems": [ + "Panoramica — stato, processo padre, numero di thread, descrittori di file aperti, utente e gruppo.", + "Risorse — CPU %, memoria %, memoria residente (RSS), dimensione virtuale, swap e totali I/O di lettura e scrittura.", + "Comando — nome breve, riga di comando completa, percorso dell'eseguibile e directory di lavoro.", + "Durata — data e ora di avvio e tempo di esecuzione trascorso." + ], + "detailRefresh": "I dettagli si aggiornano ogni 3 secondi. Quando il processo termina, le richieste cessano e appare l'avviso ambra Questo processo è terminato. L'ultimo stato acquisito resta visibile ma attenuato, per vedere cosa accadeva prima della fine.", + "captureDetailAlt": "Dettagli del processo — Panoramica, Risorse, Comando e Durata per un PID", + "captureDetailCaption": "Dettagli di un processo aperti da una riga dell'elenco. Il colore corrisponde alla scheda usata per aprirli: blu per CPU, indaco per Memoria." + }, + "middle": { + "heading": "Centro: grafici delle metriche del nodo", + "body1": "Sotto le schede, NodeMetricsCharts mostra grafici storici di CPU, memoria e I/O disco dal database RRD di Proxmox tramite /api/node/metrics. Il selettore offre 1 ora / 24 ore / 7 giorni / 30 giorni / 1 anno. La risoluzione diminuisce con periodi più ampi per mantenere fluido il grafico.", + "body2": "Sono gli stessi grafici dell'interfaccia web Proxmox per un nodo, integrati nel tema scuro di Monitor e allineati agli altri pannelli." + }, + "bottom": { + "heading": "Riga inferiore: riepiloghi di storage e rete", + "storageTitle": "Scheda Panoramica dello storage", + "storageIntro": "Vista compatta dello stato dello storage dell'host, suddivisa in tre blocchi:", + "storageItems": [ + "Capacità totale del nodo — somma degli storage VM/LXC e dello storage locale del sistema, con una barra sfumata dello spazio usato e libero.", + "Capacità totale / Dischi fisici — capacità grezza e numero dei dischi fisici rilevati.", + "Storage VM/LXC — spazio usato, libero e percentuale degli storage dei guest, con un contatore quando sono più di uno.", + "Storage locale (sistema) — filesystem root o di sistema montato sull'host, separato dal pool dei guest." + ], + "storageDrillIn": "I dettagli sono nella scheda Storage: SMART per disco, pool ZFS, cronologia delle osservazioni e altro.", + "networkTitle": "Scheda panoramica della rete", + "networkBody1": "In alto appare il numero delle interfacce attive, fisiche e bridge insieme. Sotto, due righe di etichette colorate indicano le interfacce up: NIC fisiche in blu, bridge con un colore secondario. Il selettore in alto a destra (1 ora / 24 ore / 7 giorni / 30 giorni / 1 anno) controlla un piccolo grafico del traffico RX / TX.", + "networkBody2": "I dettagli per interfaccia (IP/MAC, grafico RRD, membri del bridge, modalità bond e altro) sono nella scheda Rete." + }, + "refresh": { + "heading": "Modello di aggiornamento", + "intro": "Ogni pannello gestisce il proprio stato di caricamento (loadingStates.cpu, loadingStates.storage, …), così una sorgente lenta non blocca le altre. Durante il caricamento mostra un segnaposto pulsante. Gli errori sono gestiti senza interrompere la vista: senza sensore di temperatura mostra N/A invece di un errore.", + "items": [ + "Schede superiori — aggiornamento ogni ~5 s. CPU e temperatura ricevono anche dati ogni secondo dal campionatore dei parametri vitali.", + "Grafico delle metriche del nodo — carica all'apertura e al cambio di periodo o lingua. Se necessario, riprova dopo 60 s.", + "Scheda Storage — aggiornamento ogni ~60 s. I dati SMART restano in cache più a lungo; la scheda Storage richiede una nuova lettura quando serve.", + "Scheda Rete — riepilogo ogni 59 s e grafico del traffico ogni 60 s nel periodo attivo.", + "Aggiornamento manuale — il pulsante Aggiorna nell'intestazione ricarica subito tutti i pannelli." + ] + }, + "dataCollected": { + "heading": "Come vengono raccolti i dati", + "headerCard": "Scheda", + "headerEndpoint": "Endpoint", + "headerSource": "Fonte", + "rows": [ + { + "card": "Indicatore di stato nell'intestazione", + "endpoint": "/api/health", + "source": "Lo stato complessivo prodotto dal monitor di integrità a ogni ciclo e conservato in cache." + }, + { + "card": "CPU / RAM / Swap / Tempo di attività", + "endpoint": "/api/system", + "source": "/proc/stat, /proc/meminfo, /proc/uptime, con campionamento CPU su un breve intervallo." + }, + { + "card": "Informazioni sull'host (kernel, BIOS, distribuzione)", + "endpoint": "/api/info", + "source": "uname -a, dmidecode, versione PVE. Conservati in cache per processo." + }, + { + "card": "Carte di archiviazione / rete / VM", + "endpoint": "/api/storage/summary, /api/network/summary, /api/vms", + "source": "Vedere le schede dedicate per ciascuno. Le schede di intestazione mostrano una vista compattata dagli stessi endpoint." + }, + { + "card": "Frequenza di aggiornamento", + "endpoint": "—", + "source": "Dati di sistema ogni 5 s; storage, VM e riepilogo di rete ogni 59 s. Il pulsante Aggiorna nell'intestazione ricarica subito tutti i pannelli." + } + ], + "codeComment1": "# Chiamata che alimenta lo indicatore di stato nell'intestazione", + "codeComment2": "# pubblico, senza token", + "codeComment3": "# Istantanea autenticata utilizzata dalle carte" + }, + "whereNext": { + "heading": "Dove proseguire", + "items": [ + { + "label": "Monitoraggio integrità", + "href": "/docs/monitor/health-monitor", + "tail": " — la finestra dell'indicatore di stato nell'intestazione: dieci categorie, avvisi ignorati e soppressione." + }, + { + "label": "Riferimento API", + "href": "/docs/monitor/api", + "tail": " — endpoint system, info e health." + }, + { + "label": "Notifiche", + "href": "/docs/monitor/notifications", + "tail": "— come gli stessi stati si trasformano in messaggi Telegram / Discord / Email." + }, + { + "label": "Indice del pannello", + "href": "/docs/monitor/dashboard", + "tail": " — le altre schede del pannello a colpo d'occhio." + }, + { + "label": "Architettura", + "href": "/docs/monitor/architecture", + "tail": " — i thread in background e le API che alimentano questa vista." + } + ] + } +} diff --git a/web/messages/it/docs/monitor/dashboard/terminal.json b/web/messages/it/docs/monitor/dashboard/terminal.json new file mode 100644 index 00000000..1431254d --- /dev/null +++ b/web/messages/it/docs/monitor/dashboard/terminal.json @@ -0,0 +1,174 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Pannello: Terminale | Documentazione ProxMenux", + "description": "Shell dell'host Proxmox nel browser: fino a 4 terminali in griglia, pulsanti tastiera per dispositivi mobili (ESC, TAB, frecce, combinazioni Ctrl), prontuario di comandi integrato con cheat.sh e protezione JWT." + }, + "header": { + "title": "Pannello: Terminale", + "description": "Una vera sessione shell sull'host Proxmox dal browser. Fino a quattro terminali contemporaneamente, pulsanti tastiera per dispositivi mobili e prontuario dei comandi integrato, con lo stesso tema del resto del pannello.", + "section": "ProxMenux Monitor · Dashboard" + }, + "intro": { + "title": "Un vero PTY nel browser", + "body": "Il terminale crea un PTY sul server tramite flask_terminal_routes, lo collega via WebSocket a xterm.js nel browser e viene eseguito come root, utente dell'unità systemd. Come con ssh root@<host>, puoi usare vim, tmux, strumenti ncurses e le CLI Proxmox (qm, pct, pvesh, pvecm). Ogni PTY esporta PROXMENUX_TERMINAL=monitor, ereditata da tutti i processi figli bash, incluso un successivo avvio di menu, per riconoscere il terminale di Monitor." + }, + "singleAlt": "Scheda Terminale di ProxMenux Monitor — sessione singola con il riepilogo di sistema Fastfetch allo accesso", + "singleCaption": "Un terminale host aperto — la barra degli strumenti sopra mostra il conteggio (1 / 4 terminali), + Nuovo, Ricerca, Cancellazione e Chiudere. Gli helper della tastiera mobile appaiono sotto il terminale su dispositivi touch.", + "target": { + "heading": "Obiettivo di connessione", + "body1": "La scheda Terminale apre una shell sullo host Proxmox stesso, come uno accesso SSH. Ogni scheda apre un nuovo terminale dell'host.", + "body2": "Per accedere a un container LXC dal browser, usa Console sulla scheda di ogni CT in esecuzione nella scheda VM e LXC. Apre una finestra che esegue pct enter <vmid> e usa la stessa barra per dispositivi mobili descritta sotto." + }, + "menuGuard": { + "heading": "Protezione durante l'aggiornamento di menu in questo terminale", + "body1": "Dopo la conferma, menu sostituisce il proprio albero di script e si ricarica. Questo funziona tramite SSH o console Proxmox, ma nel browser chiuderebbe il PTY della shell e interromperebbe il WebSocket. Per evitarlo, check_updates_stable, check_updates_beta e apply_release_channel leggono PROXMENUX_TERMINAL e riconoscono il contesto Monitor.", + "body2": "Il dialogo sì/no viene quindi sostituito da un messaggio con il comando ufficiale di installazione: bash -c \"$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)\" per stable e l'URL equivalente di install_proxmenux_beta.sh per beta. Lo aggiornamento si esegue tramite SSH o console dell'host Proxmox; il terminale del browser serve solo a leggere e confermare il messaggio." + }, + "fourTerminals": { + "heading": "Fino a quattro terminali contemporaneamente", + "intro": "La scheda consente di aprire fino a quattro terminali host contemporaneamente. Ognuno ottiene il proprio PTY e il proprio WebSocket — sono sessioni completamente indipendenti. Due layout passano con le icone accanto al pulsante \"Nuovo\":", + "items": [ + "Vista a schede — un terminale visibile, gli altri come schede con nome in alto (Terminale 1, Terminale 2…). Utile per un'attività con le altre in secondo piano.", + "Vista a griglia — tutti i terminali aperti in una griglia 2×2. Puoi osservare htop in uno, iftop in un altro e modificare file in un terzo senza cambiare scheda." + ], + "outro": "La barra indica il conteggio (1/4 terminali, 4/4 terminali). + Nuovo apre una scheda; la piccola × nell'intestazione la chiude. Il grande pulsante rosso Chiudi in alto chiude tutti i terminali." + }, + "gridAlt": "Scheda terminale ProxMenux Monitor — visualizzazione griglia con quattro terminali host che eseguono ls, configurazione di rete, iftop e il menu principale ProxMenux fianco a fianco", + "gridCaption": "Vista a griglia (4 / 4 terminali) — quattro PTY indipendenti in parallelo: elenco directory, /etc/network/interfaces, iftop e menu principale ProxMenux. Il selettore di disposizione nella barra alterna griglia e schede.", + "keyboard": { + "heading": "Pulsanti tastiera per dispositivi mobili", + "intro": "Le tastiere di telefoni e tablet spesso non offrono ESC, TAB, frecce o combinazioni con modificatori. Servono per usare vim, nano, htop e menu TUI. Terminale aggiunge quindi una riga di pulsanti tattili sotto il terminale quando lo schermo è piccolo o il dispositivo supporta il tocco:", + "headerButton": "Pulsante", + "headerSends": "Invia", + "headerUse": "Uso tipico", + "rows": [ + { + "button": "ESC", + "sends": "\\x1b", + "use": "Esce dalla modalità di inserimento di vim, annulla un dialogo TUI o chiude una ricerca." + }, + { + "button": "TAB", + "sends": "\\t", + "use": "Completamento dei percorsi e navigazione tra campi in dialog/whiptail." + }, + { + "button": "↑ ↓ ← →", + "sends": "\\x1bO[ABCD]", + "use": "Cronologia della shell, movimento del cursore e navigazione dei menu." + }, + { + "button": "↵ Invio", + "sends": "\\r", + "use": "Conferma. Alcune tastiere sullo schermo sostituiscono Invio con Vai/Fine; questo pulsante evita ambiguità." + }, + { + "button": "Ctrl ▾", + "sends": "Menu a discesa", + "useRich": true + } + ], + "ctrlIntro": "Tre sequenze di controllo:", + "ctrlItems": [ + "Ctrl+C — annullare / interrompere il comando in esecuzione (\\x03).", + "Ctrl+X — esce da nano (\\x18).", + "Ctrl+R — ricerca a ritroso nella cronologia bash (\\x12)." + ], + "modalTitle": "Stessa barra nella finestra della console LXC", + "modalBody": "La console aperta da VM e LXC → Console mostra gli stessi pulsanti tastiera sotto la finestra. Alla connessione inserisce automaticamente pct enter <vmid> per entrare direttamente nel container." + }, + "lxcAlt": "Finestra console LXC di ProxMenux Monitor — Terminal: ubuntu (ID: 103), con la stessa barra per dispositivi mobili (ESC, TAB, frecce, Invio, Ctrl) sotto il terminale", + "lxcCaption": "Console LXC aperta da VM e LXC → Console. L'intestazione mostra il container di destinazione (Terminal: ubuntu (ID: 103)) e sotto il terminale appare la stessa barra tattile.", + "search": { + "heading": "Cerca comandi — prontuario integrato", + "intro": "Il pulsante blu Cerca apre una ricerca approssimativa dei comandi. Digita alcune lettere di un comando Linux o Proxmox (ls, tar, qm, pct, zpool, systemctl…) per vedere esempi con Invia al terminale attivo in un tocco. Puoi così ritrovare un'opzione senza cambiare scheda.", + "modalAlt": "Finestra Cerca comandi di ProxMenux Monitor — ricerca approssimativa di comandi Linux e Proxmox tramite cheat.sh, con vari esempi di ls", + "modalCaption": "Ricerca di ls — ogni risultato mostra comando, descrizione e una piccola freccia di invio al terminale attivo. In basso a destra è indicata la fonte dei dati (Fornito da cheat.sh).", + "aboutLabel": "Informazioni su cheat.sh:", + "aboutBody": "è un prontuario open source curato dalla comunità, con esempi brevi e pratici per centinaia di comandi Linux, strumenti di amministrazione e linguaggi di programmazione. Progettato per essere consultato con curl cheat.sh/<command>, è accessibile anche dal browser. ProxMenux Monitor inoltra le query tramite proxy sul server per mantenere la stessa origine del pannello.", + "headerSource": "Fonte", + "headerWhen": "Quando viene usato", + "headerWhat": "Cosa vedi", + "onlineLabel": "(in linea)", + "onlineWhen": "Quando l'host ha accesso a Internet e il proxy cheat.sh risponde.", + "onlineWhat": "Vari esempi pratici per comando, con la descrizione sopra. Il punto di stato nell'intestazione è verde.", + "fallbackLabel": "Alternativa locale", + "fallbackWhen": "Quando cheat.sh non è raggiungibile (host offline, firewall restrittivo o interruzione del servizio cheat.sh).", + "fallbackWhat": "Un elenco incluso di comandi Linux e Proxmox comuni. Il catalogo è più piccolo ma sempre disponibile. Il punto di stato è rosso.", + "sendingNote": "Come funziona l'invio: la freccia accanto al risultato invia il testo al terminale attivo (la scheda selezionata o l'ultimo terminale cliccato nella griglia). La finestra si chiude automaticamente per consentire di premere Invio." + }, + "auth": { + "heading": "Autenticazione", + "items": [ + "Il browser richiede prima un ticket monouso tramite POST /api/terminal/ticket, autenticato con JWT nell'intestazione Authorization. Poi invia il ticket all'apertura del WebSocket. Scade dopo 5 secondi; se l'autenticazione è attiva e il ticket manca o non è valido, la connessione si chiude prima di creare un PTY.", + "Se Monitor si trova dietro un proxy inverso, questo deve inoltrare gli upgrade WebSocket. Esempi per Nginx / Caddy / Traefik nella pagina Accesso e autenticazione." + ] + }, + "clipboard": { + "heading": "Appunti, cronologia dello schermo e ridimensionamento", + "items": [ + "Copia e incolla — usa gli appunti del browser. Seleziona il testo con mouse o trackpad e usa la scorciatoia del sistema (Cmd+C su macOS, Ctrl+Shift+C su Linux/Windows). I desktop Linux supportano anche l'incollaggio con clic centrale.", + "Cronologia dello schermo — scorrimento con rotella o due dita. xterm.js conserva in memoria le ultime migliaia di righe.", + "Ridimensionamento — il terminale adatta la dimensione della finestra PTY quando ridimensioni il pannello, per visualizzare correttamente htop e vim.", + "Riconnessione al ritorno alla scheda — cambiare app su telefono o tablet, soprattutto iPad, può interrompere il WebSocket. Terminale rileva il cambio di visibilità e si riconnette al ritorno, con un timeout di 15 secondi per VPN lente." + ] + }, + "disconnect": { + "heading": "Cause di disconnessione", + "intro": "Le cause più comuni della fine di una sessione e come risolverle:", + "headerCause": "Causa", + "headerFix": "Soluzione", + "rows": [ + { + "cause": "JWT di sessione scaduto all'apertura o riconnessione di un terminale (durata di 24 ore).", + "fix": "Aggiorna la pagina e accedi di nuovo. Il terminale non è progettato per sessioni non assistite, quindi la durata di JWT corrisponde al normale login del cruscotto." + }, + { + "cause": "Timeout di inattività del proxy inverso.", + "fix": "Aumenta proxy_read_timeout in Nginx o il valore equivalente in Caddy / Traefik (esempi in Accesso e autenticazione)." + }, + { + "cause": "Telefono o tablet in sospensione.", + "fix": "Al risveglio del dispositivo la scheda si riconnette automaticamente (timeout di 15 secondi per i percorsi VPN). In caso contrario, ricaricala." + }, + { + "cause": "Il servizio si riavvia sull'host.", + "fix": "Ogni riavvio di proxmenux-monitor.service chiude tutti i PTY. Apri nuovi terminali quando il pannello ha terminato il caricamento." + } + ] + }, + "warning": { + "title": "Il terminale è una shell root sull'host", + "body": "Il terminale eredita l'utente dell'unità systemd (root) e ha pieni privilegi sull'host Proxmox. Configura nome utente, password e 2FA in Accesso e autenticazione prima di consentire accessi fuori dalla rete locale. Con autenticazione disattivata, chi raggiunge la porta 8008 può aprire una shell root senza altre conferme o credenziali SSH. Per accessi esterni usa Secure Gateway (Tailscale) o un proxy inverso HTTPS invece di pubblicare la porta su Internet." + }, + "whereNext": { + "heading": "Dove proseguire", + "items": [ + { + "label": "Accesso e autenticazione", + "href": "/docs/monitor/access-auth", + "tail": " — esempi per proxy inversi con le righe di upgrade WebSocket necessarie per il terminale." + }, + { + "label": "Architettura", + "href": "/docs/monitor/architecture", + "tail": " — trasporto WebSocket (HTTP tramite flask-sock e HTTPS / WSS tramite gevent)." + }, + { + "label": "Riferimento API", + "href": "/docs/monitor/api", + "tail": " — endpoint WebSocket /ws/terminal e /ws/script/, insieme al resto dell'API." + }, + { + "label": "Integrazioni → Secure Gateway", + "href": "/docs/monitor/integrations", + "tail": "— quando si desidera l'accesso terminale da fuori della LAN senza esporre la porta 8008." + }, + { + "label": "Indice del pannello", + "href": "/docs/monitor/dashboard", + "tail": "— le altre schede." + } + ] + } +} diff --git a/web/messages/it/docs/monitor/dashboard/vms-lxcs-app.json b/web/messages/it/docs/monitor/dashboard/vms-lxcs-app.json new file mode 100644 index 00000000..1741f274 --- /dev/null +++ b/web/messages/it/docs/monitor/dashboard/vms-lxcs-app.json @@ -0,0 +1,245 @@ +{ + "meta": { + "title": "Scheda App LXC: scoperta, collegamenti e tracciamento versione | ProxMenux", + "description": "Scoprire e registrare le applicazioni LXC, creare collegamenti web e seguire in modo facoltativo le versioni installate e disponibili." + }, + "header": { + "title": "Scheda App LXC: scoperta, collegamenti e tracciamento versione", + "description": "Dare ad ogni applicazione LXC un'identità persistente, l'accesso al web e le prove della versione facoltativa senza accoppiare la registrazione agli aggiornamenti." + }, + "intro": { + "p1": "La scheda App registra le applicazioni di un LXC. Un record può contenere solo nome e link web, oppure anche un rilevatore della versione installata e una fonte upstream.", + "p2": "La procedura che modifica il software si configura nella scheda Aggiornamenti. Salvare un'app non esegue mai un installatore o un programma di aggiornamento.", + "callout": "Registrazione, tracciamento delle versioni e aggiornamento sono tre funzioni indipendenti. Ciascuna è utilizzabile senza richiedere le altre due.", + "dashboardTitle": "Dalla registrazione al lanciatore Apps", + "dashboard": "Ogni link web salvato qui appare anche come scheda nella scheda Apps principale. Questa pagina LXC resta il riferimento per nome, logo, link e tracciamento delle versioni." + }, + "overview": { + "heading": "Cosa può offrire un record di applicazione", + "lead": "Un singolo record salvato può includere:", + "items": [ + "Un nome visualizzato e un logo adattato al tema.", + "Uno o più link web cliccabili costruiti dall'indirizzo LXC, schema e porta salvata.", + "Un rilevatore opzionale per la versione attualmente installata all'interno del LXC.", + "Una sorgente opzionale GitHub, HTTP JSON o Docker Hub per l'ultima versione disponibile.", + "Notifiche di rilascio per applicazione e preferenze di inclusione del contatore di aggiornamento.", + "Una sezione corrispondente sulla scheda Aggiornamenti, anche quando il monitoraggio della versione è disabilitato." + ] + }, + "discovery": { + "heading": "Ricerca in cache e Trova applicazioni", + "lead": "I suggerimenti sono inclusi nella cache della finestra di ogni LXC. La scansione iniziale li prepara in background per mostrarli subito quando si apre App.", + "items": [ + "L'apertura della scheda App non avvia una nuova scansione del catalogo e non interroga ripetutamente il LXC.", + "Trova applicazioni avvia una nuova ricerca per quel LXC. Usalo dopo aver installato software mentre ProxMenux è già in esecuzione.", + "L'elenco precedente resta visibile durante la scansione. Le nuove corrispondenze si aggiungono alla fine.", + "Se non ci sono nuove corrispondenze, il risultato appare accanto alle azioni e Registra applicazione resta disponibile per l'inserimento manuale.", + "Salvare, rimuovere o ripristinare un'app aggiorna immediatamente la stessa cache. Avviare o ripristinare un LXC rinfresca solo l'ospite attraverso il suo evento ciclo di vita esistente." + ], + "callout": "Un suggerimento non è una registrazione. Resta in sola lettura finché non premi Registra e salvi il modulo." + }, + "registration": { + "heading": "Registrazione di un'applicazione", + "lead": "Un suggerimento rilevato e un record manuale usano lo stesso editor:", + "steps": [ + "Registra un suggerimento oppure usa Registra applicazione per scegliere dal catalogo o inserire un nome personalizzato.", + "Rivedere il nome e il logo proposti dal catalogo.", + "Aggiungi i link web richiesti. Le porte di ascolto rilevate vengono offerte come scorciatoie, ma nessuna viene salvata automaticamente.", + "Traccia versione upstream può restare disattivato per record con soli link. Se lo attivi, verifica il rilevatore della versione installata e la fonte upstream.", + "Se il tracciamento è attivo, usa Prova rilevatore e salva il record.", + "Premi Fine dopo la modifica. App e Aggiornamenti usano lo stesso record aggiornato in cache." + ] + }, + "catalog": { + "heading": "Registrazione assistita da catalogo", + "lead": "Il catalogo fornisce i default, ma il record salvato rimane modificabile.", + "items": [ + "I risultati della ricerca possono precompilare nome canonico, logo e porte web comuni.", + "I rilevatori noti usano veri nomi di pacchetti, binari, file, distribuzioni Python, etichette OCI o comandi, invece di un'ipotesi universale come /root/.app.", + "Gli override di runtime verificati hanno la precedenza quando un'installazione utilizza un percorso che differisce dai metadati dell'installatore.", + "I marcatori Proxmox VE Helper-Scripts come /root/.slug rimangono un segnale di compatibilità per le nuove installazioni di helper, non l'unico rilevatore.", + "Ogni valore proposto può essere modificato prima di salvare per coprire installatori ufficiali e installazioni manuali." + ] + }, + "docker": { + "heading": "Come vengono rappresentati i Docker LXC", + "lead": "Per un LXC la cui piattaforma primaria è Docker, Docker è l'applicazione registrata a livello LXC.", + "items": [ + "Un carico di lavoro containerizzato come Portainer, Frigate o Vaultwarden non è suggerito come un'applicazione indipendente LXC nativo.", + "I servizi Docker in esecuzione con porte TCP pubblicate sono proposti come link web opzionali nell'editor Docker.", + "Ogni link suggerito mostra servizio, porta dell'host e porta del container. Salva solo quelli che offrono un'interfaccia web.", + "Il logo globale Docker viene utilizzato quando un link non ha un logo specifico. Un logo per-link lo sovrascrive quando uno è configurato.", + "Dopo che Docker è registrato, Docker Engine e gli aggiornamenti delle immagini vengono visualizzati insieme nella sua sezione sulla scheda Aggiornamenti." + ], + "callout": "Questa struttura previene un carico di lavoro Docker dall'aspetto di un software installato direttamente nel LXC preservando i collegamenti rapidi alle sue interfacce." + }, + "webLinks": { + "heading": "Link web e loghi", + "lead": "I link web funzionano con o senza tracciamento della versione.", + "items": [ + "Ogni link memorizza uno schema, la porta, la descrizione facoltativa e l'URL del logo opzionale.", + "L'URL visualizzato utilizza l'indirizzo corrente già rilevato per il LXC; l'indirizzo non viene duplicato in ogni record di app.", + "Un link senza il proprio logo rientra nel logo dell'app.", + "Più link possono rappresentare interfaccia amministrativa, API, interfaccia secondaria o un altro endpoint della stessa app.", + "Una app con soli link appare anche in Aggiornamenti, dove puoi configurare in seguito un programma personalizzato." + ] + }, + "tracking": { + "heading": "Tracciamento versione opzionale", + "lead": "Il tracciamento combina un rilevatore della versione installata con una fonte upstream opzionale. I due lati sono controllati separatamente.", + "colMethod": "Metodo per la versione installata", + "colUse": "Uso", + "detectorRows": [ + { + "method": "dpkg / apk", + "use": "Legge la versione del pacchetto installato dai metadati del pacchetto Debian, Ubuntu o Alpine." + }, + { + "method": "binary", + "use": "Esegue un percorso binario assoluto o un nome di comando con argomenti di versione." + }, + { + "method": "file + regex", + "use": "Legge un file reale ed estrae la versione con un gruppo di cattura." + }, + { + "method": "docker label / docker exec", + "use": "Legge un'etichetta di versione OCI o esegue un comando di versione all'interno di un contenitore Docker." + }, + { + "method": "python distribution", + "use": "Utilizza importlib.metadata attraverso l'interprete Python selezionato." + }, + { + "method": "command", + "use": "Esegue un comando avanzato in stile argv senza una shell ed estrae la versione dalla sua uscita." + }, + { + "method": "manual", + "use": "Conserva una versione inserita manualmente; deve essere modificata dopo l'aggiornamento dell'app." + }, + { + "method": "OCI image", + "use": "Per container installati da OCI manager Apps. Legge le versioni di app e immagine dal record di installazione e confronta il digest installato con quello pubblicato dal registro. Non richiede configurazione." + } + ], + "sourcesHeading": "Fonti della versione disponibile", + "sources": [ + "GitHub repository: ultima release o tag da un repository pubblico owner/name.", + "HTTP JSON: un endpoint pubblico più un percorso punteggiato come data.version o releases[0].tag_name.", + "Docker Hub: tag con versione filtrati tramite espressione regolare. Un'anteprima mostra i tag reali corrispondenti prima del salvataggio.", + "latest, stable e lts sono tag mobili senza versione. Traccia queste immagini tramite digest negli aggiornamenti delle immagini Docker." + ], + "regexHeading": "Scrivere l'espressione di cattura", + "regexLead": "L'espressione regolare deve restituire la versione nel primo gruppo di cattura.", + "regexRules": [ + "Abbina il testo emesso dalla sorgente binaria, file, comando o tag selezionata; non indovinare un percorso generico.", + "Usa \\. per i punti letterali, così non corrispondono a caratteri arbitrari.", + "Consenti una v iniziale solo se la fonte può includerla.", + "Includere suffissi come prerelease o revisioni distro solo quando sono significativi per il confronto.", + "Usa Prova rilevatore prima di salvare e verifica che la versione installata mostrata corrisponda al LXC." + ], + "regexExampleLead": "cattura semantica comune:", + "regexExample": "v?(\\d+\\.\\d+\\.\\d+)", + "regexCallout": "Una corrispondenza regex riuscita non dimostra che il percorso del rilevatore sia corretto. Il percorso o pacchetto deve esistere nell'installazione reale da registrare." + }, + "updater": { + "heading": "Il monitoraggio delle versioni e l'aggiornamento sono indipendenti", + "lead": "La scheda Aggiornamenti crea una sezione app non appena viene salvato un record.", + "items": [ + "Un record di collegamento mostra che il tracciamento della versione non è configurato, ma può ancora ricevere un comando di aggiornamento personalizzato.", + "Un'applicazione con monitoraggio ma senza un metodo eseguibile mostra un messaggio neutro che chiede un comando personalizzato.", + "Una app con wrapper Proxmox VE Helper-Scripts verificato può usare il programma integrato anche se la registrazione è partita da un link web.", + "Aggiungere o modificare un programma di aggiornamento non cambia rilevatore o fonte upstream salvati in App." + ] + }, + "states": { + "heading": "Stati di versione nella scheda App", + "colState": "Stato", + "colDisplay": "Visualizzazione", + "colMeaning": "Significato", + "rows": [ + { + "state": "Aggiornamento disponibile", + "display": "Versione disponibile in viola con icona a freccia verso l'alto", + "meaning": "Le versioni installate e a monte differiscono." + }, + { + "state": "Aggiornata", + "display": "Versioni installata e disponibile senza avviso viola", + "meaning": "L'ultimo controllo non ha trovato una versione upstream più recente." + }, + { + "state": "Monitoraggio in attesa", + "display": "Controllo o stato in sospeso", + "meaning": "Il record è configurato ma non ha ancora completato entrambi i controlli." + }, + { + "state": "Tracciamento disattivato", + "display": "Solo link web; nessun blocco di confronto versione", + "meaning": "Il record resta valido e può avere un programma di aggiornamento." + }, + { + "state": "Errore di verifica", + "display": "Spiegazione ambra all'interno della scheda", + "meaning": "Lo stato precedente resta visibile mentre viene segnalato l'errore del rilevatore o della fonte upstream." + } + ] + }, + "management": { + "heading": "Gestione delle applicazioni salvate e suggerite", + "lead": "Le azioni in fondo alla scheda hanno ruoli distinti:", + "items": [ + "Trova applicazioni aggiorna la ricerca solo per questo LXC.", + "Registra altra applicazione apre catalogo ed editor manuale senza una nuova scansione del LXC.", + "Modifica mostra su ogni scheda Rimuovi, Verifica, notifiche e Modifica campi.", + "Nascondi rimuove un suggerimento indesiderato. Le rilevazioni nascoste si ripristinano nella vista di registrazione.", + "Verifica aggiorna i dati di versione della app salvata scelta; non cerca nuove app." + ] + }, + "troubleshooting": { + "heading": "Situazioni comuni", + "colProblem": "Situazione", + "colResolution": "Risoluzione", + "rows": [ + { + "problem": "Il software è stato installato dopo l'avvio di ProxMenux", + "resolution": "Premere Trova applicazioni. La scansione esplicita aggiorna i suggerimenti in cache per quel LXC." + }, + { + "problem": "Nessun'applicazione è stata rilevata", + "resolution": "Registralo manualmente. Un nome e un link web sono sufficienti; il tracciamento può essere aggiunto in seguito." + }, + { + "problem": "Il rivelatore suggerito restituisce la versione sbagliata", + "resolution": "Apri Modifica campi, seleziona il pacchetto, binario o percorso reale e prova il rilevatore prima di salvare." + }, + { + "problem": "Un carico di lavoro Docker non è offerto come app LXC", + "resolution": "Registrare Docker e aggiungere l'interfaccia pubblicata del carico di lavoro come collegamento web Docker. Gli aggiornamenti delle immagini rimangono nella sezione Docker." + }, + { + "problem": "Un'app salvata non ha nessun pulsante di aggiornamento", + "resolution": "Aprire la scheda Aggiornamenti e configurare il suo metodo di aggiornamento. Il tracciamento della versione da solo non definisce come viene installato un aggiornamento." + } + ] + }, + "figures": { + "catalog": { + "alt": "Catalogo di registrazione con risultati di ricerca, loghi, porte e campi del rilevatore", + "caption": "Catalogo metadati accelera la registrazione mentre ogni valore proposto rimane modificabile." + }, + "webLinks": { + "alt": "Scheda di applicazione LXC salvata contenente un link web cliccabile", + "caption": "Un record con soli link è valido: il tracciamento può restare disattivato e il programma di aggiornamento si aggiunge separatamente." + }, + "tracking": { + "alt": "Campi opzionali del rilevatore della versione installata e della fonte upstream", + "caption": "Il rilevamento della versione installata e la fonte upstream si configurano e provano separatamente." + }, + "card": { + "alt": "Scheda di applicazione salvata con versioni installate e disponibili più un link web", + "caption": "La scheda combina identità, prove di versione e accesso web senza eseguire azioni di aggiornamento da questa scheda." + } + } +} diff --git a/web/messages/it/docs/monitor/dashboard/vms-lxcs-updates.json b/web/messages/it/docs/monitor/dashboard/vms-lxcs-updates.json new file mode 100644 index 00000000..99980f86 --- /dev/null +++ b/web/messages/it/docs/monitor/dashboard/vms-lxcs-updates.json @@ -0,0 +1,203 @@ +{ + "meta": { + "title": "Aggiornamenti LXC: OS, applicazioni e Docker | ProxMenux", + "description": "Configura ed esegui aggiornamenti del sistema operativo, delle applicazioni, di Docker Engine e delle immagini Docker in un container LXC." + }, + "header": { + "title": "Aggiornamenti LXC: OS, applicazioni e Docker", + "description": "Verificare ogni obiettivo di aggiornamento in un unico luogo, eseguirlo in modo indipendente, o combinare obiettivi selezionati in un'azione di massa controllata." + }, + "intro": { + "p1": "La scheda Aggiornamenti separa il rilevamento delle versioni dalla loro installazione. Registrazione e tracciamento opzionale sono nella scheda App; i metodi eseguibili si gestiscono qui.", + "p2": "Un'app salvata appare in Aggiornamenti anche con un solo link web. Il tracciamento delle versioni è opzionale e il programma di aggiornamento può essere configurato separatamente.", + "callout": "Registrare un'app non seleziona il programma di aggiornamento. Se viene rilevato un programma Helper-Scripts corrispondente, scegli e salva Helper-Scripts o Comando personalizzato. Il rilevamento non garantisce la compatibilità. La scelta è per app, anche quando più app condividono un LXC." + }, + "overview": { + "heading": "Cosa contiene la scheda", + "lead": "Ogni target disponibile ha la sua sezione e azione:", + "items": [ + "Pacchetti del sistema per container Debian, Ubuntu e Alpine.", + "Una sezione per ogni applicazione registrata, inclusi i record con soli link.", + "Una sezione Docker quando Docker è registrato, con Docker Engine e immagini contrassegnate raggruppate insieme.", + "Una sezione Aggiornamento in blocco configurabile, seguita da opzioni di backup, riavvio e pianificazione." + ] + }, + "mechanisms": { + "heading": "Come viene selezionato un metodo di aggiornamento", + "lead": "Il percorso integrato Proxmox VE Helper-Scripts segue il meccanismo ufficiale update-apps . Altri tipi di installazione utilizzano il pacchetto corrispondente, Docker o percorso personalizzato.", + "officialReference": "Riferimento ufficiale: la documentazione update-apps di Proxmox VE Helper-Scripts descrive modalità interattiva e non presidiata, backup, simulazioni, risorse temporanee di compilazione, log e codici di uscita.", + "colSource": "Fonte", + "colAction": "Azione visualizzata", + "colNotes": "Cosa viene eseguito", + "rows": [ + { + "source": "Pacchetti APT o APK", + "action": "Applicare aggiornamenti del sistema operativo", + "notes": "Aggiorna i pacchetti container. Le app registrate installate come pacchetti dpkg o apk sono coperte da questo stesso passaggio." + }, + { + "source": "Proxmox VE Helper-Scripts", + "action": "Applica aggiornamento", + "notes": "Dopo la scelta esplicita di Helper-Scripts esegue lo script ufficiale identificato dal wrapper /usr/bin/update convalidato. Un marcatore o una corrispondenza nel catalogo da soli non abilitano mai l'esecuzione." + }, + { + "source": "Comando personalizzato", + "action": "Esegui programma di aggiornamento", + "notes": "Esegue il comando salvato nel LXC e sostituisce qualsiasi programma integrato di aggiornamento di quel record." + }, + { + "source": "Docker Engine", + "action": "Aggiorna Docker Engine", + "notes": "Aggiorna solo i pacchetti Docker installati e le dipendenze necessarie. Non modifica altri pacchetti del sistema o i container." + }, + { + "source": "Immagine Docker", + "action": "Aggiorna immagine", + "notes": "Scarica l'immagine selezionata e ricrea il gruppo di servizi Compose o il container autonomo protetto." + } + ], + "callout": "Un comando personalizzato sostituisce Helper-Scripts per quell'app. Le esecuzioni manuali, in blocco e pianificate rispettano la scelta salvata. Restano i comandi esistenti e le vecchie selezioni salvate esplicitamente nei piani in blocco o nelle pianificazioni attive; una nuova app non viene mai inclusa da una vecchia pianificazione." + }, + "docker": { + "heading": "Docker Engine e immagini Docker", + "lead": "Dopo che Docker è registrato sulla scheda App, il suo motore e l'inventario delle immagini appaiono all'interno della stessa sezione Docker.", + "items": [ + "Il monitoraggio della versione Docker Engine è separato dal contatore del pacchetto OS e ha il suo pulsante di aggiornamento.", + "Le immagini locali dotate di tag vengono confrontate con quelle del rispettivo registro tramite il digest immutabile. Controlla ora aggiorna questo inventario senza scaricare immagini né riavviare i container.", + "I servizi Compose sono aggiornati dal progetto dichiarato. Le immagini dello stesso gruppo sono gestite insieme per evitare di ricreare il progetto più volte.", + "Un contenitore standalone è ricreato dalla sua configurazione attuale. Il flusso protetto mantiene i dati di rollback e ripristina il contenitore precedente se la ricreazione fallisce.", + "Ogni immagine è selezionabile separatamente per aggiornamenti manuali, in blocco e pianificati, tranne le dipendenze Compose dichiarate che devono seguire il servizio principale." + ], + "callout": "I contenitori che funzionano all'interno di Docker non sono indicati come applicazioni LXC indipendenti. Le loro porte web pubblicate possono essere salvate come link sotto la registrazione Docker, mentre gli aggiornamenti delle immagini rimangono nella sezione Docker." + }, + "actions": { + "heading": "Azioni individuali e colori di stato", + "lead": "Ogni sezione rimane utilizzabile in modo indipendente, indipendentemente dal fatto che sia configurato o meno un aggiornamento collettivo.", + "items": [ + "Configura apre la scelta del programma quando non è definito un metodo; Modifica cambia una scelta salvata. I pulsanti informativi spiegano le opzioni, collegano la documentazione ufficiale e mostrano un esempio di script personalizzato. Selezionare non esegue l'opzione.", + "Con tracciamento versione disattivato ma programma disponibile, appare l'azione neutra Esegui programma di aggiornamento. ProxMenux non afferma che ci sia un aggiornamento in attesa.", + "Senza un programma Helper-Scripts disponibile, configura un comando personalizzato. Disattivare un metodo non ne seleziona un altro; i piani e le pianificazioni conservano le scelte e segnalano gli obiettivi non disponibili.", + "Aggiorna immagine agisce solo sull'unità Docker selezionata; non aggiorna Docker Engine né immagini non correlate." + ], + "statusColState": "Stato conosciuto", + "statusColAppearance": "Aspetto", + "statusColMeaning": "Significato", + "statusRows": [ + { + "state": "Aggiornamento verificato disponibile", + "appearance": "Testo viola, icona con freccia verso l’alto e azione viola", + "meaning": "Le versioni installate e disponibili o i digest delle immagini differiscono." + }, + { + "state": "Aggiornato e verificato", + "appearance": "Segno di spunta verde e azione Aggiornato in verde", + "meaning": "L'ultimo controllo completato conferma che l'obiettivo è attuale." + }, + { + "state": "Versione sconosciuta", + "appearance": "Testo neutro e azione neutrale", + "meaning": "Il programma di aggiornamento è eseguibile, ma mancano dati di versione per stabilire se il target è aggiornato o ha un aggiornamento disponibile." + } + ] + }, + "custom": { + "heading": "Comandi di aggiornamento personalizzati", + "lead": "Usa un comando personalizzato quando manca un programma integrato verificato o quando occorre sostituire la procedura normale.", + "items": [ + "Apri Configura se il campo è vuoto, oppure Modifica se esiste già un metodo.", + "Per un'app integrata o Docker Engine, l'editor mostra il comando attuale. Salvare un contenuto diverso lo rende la sostituzione esplicita per quel record.", + "Testare prima la procedura completa nel terminale LXC. Deve essere non interattivo, utilizzare la directory di lavoro corretta e restituire uno stato di uscita non zero su guasto.", + "Non includere pct exec; ProxMenux entra già nel contenitore ed esegue il comando come root." + ], + "exampleLead": "Esempio di una procedura completa di in-container:", + "example": "cd /opt/my-app && ./update.sh", + "callout": "Un comando come myapp --version legge solo una versione; non è un programma di aggiornamento. I comandi hanno privilegi amministrativi: esamina il contenuto come un comando di shell root." + }, + "bulk": { + "heading": "Aggiornamento in blocco", + "lead": "La funzione in blocco crea un'azione riutilizzabile per un insieme preciso di obiettivi nel LXC. Si trova dopo le sezioni delle app e Docker e prima di Opzioni.", + "items": [ + "I pacchetti del sistema sono obbligatori. Seleziona almeno un'app, Docker Engine o un'unità di immagine Docker aggiuntiva.", + "App e unità Docker si selezionano singolarmente. Il servizio principale Compose mostra le dipendenze aggiornate insieme a esso.", + "Gli obiettivi rimossi o non disponibili sono contrassegnati come obsoleti e vanno rimossi prima di salvare.", + "Applica aggiornamenti è viola se un obiettivo ha un aggiornamento verificato, verde se tutti risultano aggiornati e neutro se il risultato è sconosciuto.", + "Rimuovere la configurazione di massa non rimuove i singoli metodi di aggiornamento o le impostazioni di aggiornamento programmate." + ], + "callout": "Aggiornamento Bulk non sostituisce i singoli pulsanti. È una scorciatoia opzionale per una selezione che dovrebbe funzionare insieme." + }, + "options": { + "heading": "Opzioni di backup e riavvio", + "lead": "Le stesse opzioni valgono per esecuzioni manuali, in blocco e pianificate:", + "items": [ + "Snapshot prima di applicare crea un backup vzdump sullo storage selezionato. Se il backup richiesto fallisce, l'aggiornamento non inizia.", + "Riavvia dopo l'applicazione riavvia il LXC solo dopo un'esecuzione riuscita.", + "Le selezioni sono memorizzate per LXC e rimangono indipendenti dall'elenco di destinazione." + ] + }, + "scheduled": { + "heading": "Aggiornamenti pianificati", + "lead": "Gli aggiornamenti programmati utilizzano gli stessi obiettivi eseguibili e le opzioni di sicurezza delle azioni manuali.", + "items": [ + "Scegliere un'espressione preimpostata o cron, quindi selezionare obiettivi esatti: pacchetti OS, app individuali, Docker Engine, unità Docker standalone o gruppi di servizi Compose.", + "Il ritardo dopo il rilascio vale solo per app selezionate con tracciamento versione. Le app senza tracciamento eseguono il programma a ogni scadenza.", + "Lo stato dell'ultima esecuzione distingue successo, completamento parziale, errore, sospensione di sicurezza e nessun aggiornamento in attesa. Dopo la prima esecuzione pianificata, Aggiornamenti → Aggiornamenti pianificati → Visualizza log apre l'output completo del programma di aggiornamento e degli script secondari invocati.", + "Dopo ogni esecuzione, ProxMenux controlla il marcatore standard Debian di riavvio richiesto. La scheda Aggiornamenti e la notifica finale segnalano quando serve riavviare; l'avviso si cancella quando quel LXC viene avviato o riavviato.", + "Sull'host Proxmox, i log in esecuzione programmata vengono memorizzati in /usr/local/share/proxmenux/logs/lxc-updates/ utilizzando il nome <VMID>-scheduled-<run-id>.log. Gli ultimi dieci registri sono conservati per LXC e i file più vecchi vengono rimossi automaticamente.", + "Questa storia conservata si applica agli aggiornamenti programmati. Un aggiornamento manuale visualizza la sua uscita dal vivo nella finestra di esecuzione Monitor e non crea un registro in esecuzione programmata in quella directory.", + "Le pianificazioni esterne sull'host rilevate da Proxmox VE Helper-Scripts sono mostrate separatamente per evidenziare automazioni sovrapposte." + ], + "callout": "Eseguire manualmente ogni metodo selezionato prima di attivare un programma. I comandi programmati non possono rispondere alle richieste." + }, + "completion": { + "heading": "Cosa succede dopo un aggiornamento", + "lead": "L'aggiornamento non è considerato finito quando il comando terminale semplicemente esce.", + "items": [ + "Lo stesso run registra il suo risultato finale e aggiorna lo stato del pacchetto OS, le versioni delle app registrate e l'inventario Docker come applicabile.", + "Le esecuzioni pianificate conservano l'output del terminale e indicano se serve ancora un riavvio per completare le modifiche ai pacchetti.", + "La cache LXC viene sostituita con lo stato post-aggiornamento verificato, quindi i badge e i pulsanti non conservano il risultato precedente.", + "Quando parte un LXC fermato o ripristinato, l'evento del ciclo di vita aggiorna di nuovo i dati. L'inventario Docker attende che il demone sia pronto senza salvare come definitivo un risultato iniziale vuoto.", + "Le notifiche abilitate vengono emesse dall'esecuzione finalizzata, compresi i guasti parziali e i risultati delle immagini raggruppati Docker." + ] + }, + "troubleshooting": { + "heading": "Situazioni comuni", + "colProblem": "Situazione", + "colResolution": "Risoluzione", + "rows": [ + { + "problem": "Nessun metodo di aggiornamento è stato identificato", + "resolution": "Apri Configura, aggiungi la procedura ufficiale non interattiva e provala manualmente prima di pianificarla." + }, + { + "problem": "Viene mostrata una identità Proxmox VE Helper-Scripts ma non esiste azione", + "resolution": "Il LXC ha dati di identificazione legacy ma nessun wrapper /usr/bin/update verificato. Aggiungere un metodo personalizzato solo dopo aver confermato la procedura corretta." + }, + { + "problem": "Le immagini Docker sono temporaneamente vuote dopo l'avvio o il ripristino", + "resolution": "Attendi che Docker sia pronto o premi Controlla ora. Il rilevamento riprova durante l'avvio e non considera definitivo un risultato vuoto transitorio." + }, + { + "problem": "Un obiettivo di massa salvato non è più disponibile", + "resolution": "Modifica la configurazione in blocco, rimuovi il target obsoleto e seleziona il sostituto attuale, se esiste." + }, + { + "problem": "Un comando personalizzato fallisce", + "resolution": "Eseguilo nel terminale LXC e verifica percorso, dipendenze, opzioni non interattive e codice di uscita." + }, + { + "problem": "Un aggiornamento programmato dice che è necessario un riavvio", + "resolution": "Apri Visualizza log per esaminare l'esecuzione completata, poi riavvia quel LXC. ProxMenux cancella l'avviso quando l'evento del ciclo di vita rileva il nuovo avvio." + } + ] + }, + "figures": { + "osPending": { + "alt": "Sezione pacchetti di sistema operativo con conteggi di aggiornamento in sospeso e di sicurezza", + "caption": "La sezione del sistema operativo mantiene gli aggiornamenti dei pacchetti indipendenti dalle azioni di applicazione e Docker." + }, + "options": { + "alt": "Opzioni di aggiornamento LXC con backup pre-update e riavvio post-update", + "caption": "Le preferenze di backup e riavvio valgono per esecuzioni manuali, in blocco e pianificate." + } + } +} diff --git a/web/messages/it/docs/monitor/dashboard/vms-lxcs.json b/web/messages/it/docs/monitor/dashboard/vms-lxcs.json new file mode 100644 index 00000000..5676aba9 --- /dev/null +++ b/web/messages/it/docs/monitor/dashboard/vms-lxcs.json @@ -0,0 +1,244 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Pannello: VM e LXC | Documentazione ProxMenux", + "description": "Inventario dei guest con CPU, memoria e disco in tempo reale. I dettagli includono configurazione, risorse, backup, risultati recenti del log Proxmox, note e Avvia / Spegni / Riavvia / Forza arresto." + }, + "header": { + "title": "Pannello: VM e LXC", + "description": "Inventario completo dei guest del nodo: quattro metriche in alto, elenco ordinabile di VM e LXC e dettagli per guest con configurazione, risorse, backup, log e comandi Avvia / Spegni / Riavvia / Forza arresto.", + "section": "ProxMenux Monitor · Dashboard" + }, + "intro": { + "title": "Controlli dei sistemi guest", + "body": "Questa scheda controlla il ciclo di vita dei guest. Le azioni passano da POST /api/vms/<vmid>/control con conferma esplicita e aggiornano la riga del guest. L'arresto forzato richiede il pulsante dedicato Forza arresto." + }, + "topRow": { + "heading": "Riga superiore: quattro schede statistiche", + "intro": "Quattro schede riepilogano lo stato dei guest: totali, uso CPU, memoria assegnata rispetto alla capacità dell'host e spazio disco assegnato.", + "imageAlt": "scheda VM & LXCs — riga superiore di quattro schede statistiche: Total VMs & LXCs, Totale CPU, Memoria totale, Disco totale", + "imageCaption": "Riga superiore: totali e stati In esecuzione / Arrestati, uso CPU, memoria usata / assegnata ai guest attivi / assegnata totale con indicatore Entro i limiti e spazio disco assegnato.", + "headerCard": "Scheda", + "headerWhat": "Cosa mostra", + "totalLabel": "Totale VM e LXC", + "totalWhat": "Conto totale con due distintivi — X Running (verde) e Y Stopped (rosso, solo quando > 0). Il numero che guardi quando qualcosa non e' tornato dopo un riavvio.", + "cpuLabel": "CPU totale", + "cpuWhat": "Utilizzo CPU totale in tempo reale dei guest, come percentuale della CPU fisica dell'host, con il testo “Utilizzo CPU assegnata”.", + "memoryLabel": "Memoria totale", + "memoryIntro": "Tre letture impilate verticalmente:", + "memoryItems": [ + "Usata attualmente — valore principale, come 15.4 GB, e X.X % di Y GB rispetto alla RAM dell'host. La barra blu indica la percentuale.", + "Assegnata agli attivi + Assegnata totale — somma di maxmem dei guest in esecuzione e di tutti, inclusi quelli arrestati. La prima conta ora, la seconda quando li avvii tutti insieme.", + "Entro i limiti, verde, diventa Sovra-allocata se il totale supera la RAM dell'host. Una sovra-allocazione controllata può funzionare con KSM; lo indicatore avverte quando il margine diminuisce." + ], + "diskLabel": "Spazio disco totale", + "diskWhat": "Somma di spazio su disco assegnato a tutti gli ospiti, nell'unità appropriata (GB / TB), con la linea di piè di pagina \"Allocated disk space\"." + }, + "inventory": { + "heading": "Elenco di macchine virtuali e container", + "intro": "Una fila per ospite. L'elenco è basato su /api/vms, che consolida qm list + pct list + pvesh /cluster/resources sull'host.", + "imageAlt": "Elenco macchine e contenitori virtuali — una riga per ospite con stato, tipo distintivo, nome, ID e in linea CPU / percentuali di memoria / disco", + "imageCaption": "Il layout ottimizzato per dispositivi mobili dell'inventario — gli stessi dati mostrati dalla vista desktop, riprodotto in una singola colonna con le percentuali e gli indicatori di stato mantenuti compatti.", + "rowsIntro": "Ogni riga mostra:", + "rows": [ + "Icona di stato — triangolo verde per In esecuzione o quadrato rosso per Arrestato. Il resto della riga si attenua per i guest arrestati.", + "Tipo — LXC in ciano per container, VM in viola per macchine virtuali.", + "Nome — hostname o nome visualizzato del guest.", + "VMID — l'ID numerico Proxmox sotto il nome.", + "Inline metrics — tre percentuali con la loro icona (CPU %, Memory %, Disk %). Ogni icona gira arancione quando la metrica attraversa una soglia di attenzione (ad esempio la memoria sopra il 90 %), quindi una scansione rapida ti dice quale ospite è sotto pressione senza aprirlo." + ], + "clickHint": "Un clic su una riga apre i dettagli, sia per guest attivi sia per guest arrestati.", + "mobileTitle": "L'elenco è costruito mobile-first", + "mobileBody": "Su telefoni e finestre strette, tipo, nome, ID e tre percentuali si impilano in una colonna, come nella schermata. Le viste ampie li distribuiscono in orizzontale. In ogni caso tutta la riga è selezionabile per aprire i dettagli." + }, + "drillIn": { + "heading": "Finestra dei dettagli del guest", + "intro": "La finestra mostra nome, VMID, tipo, stato e tempo di attività. Le schede si adattano al guest: Stato, App e Aggiornamenti per applicazioni LXC, Montaggi se presenti, Log per container OCI manager Apps, Backup e Firewall. La barra fissa mantiene disponibili controlli del ciclo di vita e terminale LXC.", + "statusTitle": "Tab 1 — Stato", + "statusImageAlt": "Dettagli del guest — Stato con CPU, memoria e disco in tempo reale, I/O disco e rete, logo del sistema e Risorse / Indirizzi IP", + "statusImageCaption": "Stato: CPU, memoria e disco con barre in alto; totali I/O (disco letto/scritto, rete ricevuta/inviata); poi Risorse con Note, + Info ed elenco degli indirizzi IP.", + "statusIntro": "La scheda iniziale permette di verificare lo stato del guest. Tre blocchi:", + "liveTitle": "1. Riga delle metriche in tempo reale", + "liveItems": [ + "Utilizzo CPU (X core) — percentuale con barra. I core configurati nell'intestazione spiegano a cosa corrisponde il 100 %.", + "Memoria — usata / massima in GB con barra.", + "Disco — usato / massimo per l'immagine del disco principale, nello stesso formato." + ], + "ioTitle": "2. Totale I/O + logo OS", + "ioItems": [ + "I/O disco — letture (↓) e scritture (↑) totali dall'avvio. Aiuta a individuare aumenti improvvisi di I/O rispetto all'attività abituale del guest.", + "I/O rete — download (↓) e upload (↑) totali, con lo stesso principio.", + "Logo del sistema — icona Debian / Ubuntu / Alpine / Windows / ecc. secondo il sistema rilevato. Aiuta a identificare le finestre aperte." + ], + "resourcesTitle": "3. Blocco risorse", + "resourcesIntro": "Configurazione secondo Proxmox: core CPU, memoria (maxmem configurato) e swap. Due sezioni espandibili nell'intestazione:", + "resourcesItems": [ + "Note — descrizione modificabile del guest. Salvare richiama PUT /api/vms/<vmid>/config e scrive in /etc/pve/qemu-server/<vmid>.conf o /etc/pve/lxc/<vmid>.conf.", + "+ Info — campi extra troppo verbosi per la visualizzazione predefinita: modalità bios, tipo macchina, stato agente, voci passanti hostpci, punti di montaggio (CT), ordine di avvio." + ], + "ipsTitle": "4. Indirizzi IP", + "ipsBody": "Ogni indirizzo IPv4 o IPv6 del guest appare in una etichetta verde. L'elenco è vuoto se il guest è fermo o se una VM non ha l'agente QEMU; i LXC comunicano gli indirizzi direttamente.", + "appTitle": "Tab 2 — App (solo LXC)", + "appIntro": "Registra app LXC, salva link web e confronta opzionalmente le versioni. I suggerimenti sono in cache dall'avvio; Trova applicazioni ripete la ricerca per questo LXC dopo nuove installazioni.", + "appLinkLead": "Vedere la", + "appLinkLabel": "pagina app dedicata", + "appLinkTail": "per la ricerca in cache, la registrazione assistita da catalogo, i collegamenti web Docker e i rivelatori di versione.", + "updatesTitle": "Tab 3 — Aggiornamenti (solo LXC)", + "updatesIntro": "Pacchetti del sistema, app, Docker Engine e immagini Docker restano obiettivi distinti. Ciascuno si esegue da solo o si seleziona per un'azione in blocco o pianificata.", + "updatesLinkLead": "Vedere la", + "updatesLinkLabel": "pagina dedicata agli aggiornamenti", + "updatesLinkTail": "per programmi di aggiornamento integrati e personalizzati, ricreazione Docker, selezione in blocco, opzioni di sicurezza e pianificazione.", + "mountsTitle": "Scheda 4 — Montaggi (solo LXC, se presenti)", + "mountsImageAlt": "Dettagli LXC, Montaggi: volumi PVE, bind mount dell'host o dello storage PVE e NFS/CIFS montati nel CT. Ogni scheda mostra tipo, capacità, byte usati/totali, opzioni e stato: verde sano, ambra sola lettura/divergente, rosso non raggiungibile.", + "mountsImageCaption": "La scheda Montaggi compare solo per i container LXC e solo se esiste almeno un punto di montaggio o un montaggio remoto temporaneo. Un CT senza montaggi non mostra questa scheda.", + "mountsIntro": "Proxmox mostra i montaggi configurati come mpX, ma non quelli aggiunti nel CT con mount.cifs, NFS tramite autofs e altri. Questa scheda unisce entrambe le viste: montaggi configurati e rilevati nel container, con stato per montaggio e capacità quando il server la può ricavare.", + "mountTypesTitle": "Tipi di montaggio rilevati", + "mountTypesItems": [ + "Volume PVE — storage gestito da Proxmox, come subvolume ZFS, directory o Ceph RBD. La capacità deriva dalle statistiche PVE e coincide con Proxmox.", + "Bind da storage PVE — voce mpX che punta a un percorso di uno storage noto a PVE.", + "Bind dall'host — voce mpX con un percorso dell'host (/mnt/something). La capacità viene da df su quel percorso.", + "Montaggio temporaneo nel CT — esiste solo nel namespace dei montaggi del container, come una condivisione NFS montata dal CT stesso. La capacità viene letta tramite pct exec <vmid> df, l’unico modo per rilevarla: dall’host, /proc/<pid>/root non espone le statistiche effettive del montaggio remoto." + ], + "mountStateTitle": "Punto di stato e avvisi per scheda", + "mountStateItems": [ + " Verde — montaggio sano e raggiungibile.", + " Ambra — configurato ma non montato, sola lettura o bind zombie. La sorgente sull'host è stata rimossa ma il CT la vede ancora montata, ad esempio dopo aver scollegato un disco USB o eseguito umount sull'host.", + " Rosso — non raggiungibile: la verifica non raggiunge il montaggio, per esempio una condivisione NFS con server inattivo." + ], + "mountsCalloutTitle": "Informazioni aggiuntive rispetto a Proxmox", + "mountsCalloutBody": "Una vista dei percorsi da cui il container legge o su cui scrive, con la relativa capacità. Le condivisioni NFS o CIFS montate all’interno del CT, invisibili all’interfaccia web Proxmox, compaiono con la stessa presentazione e gli stessi controlli degli altri punti di montaggio. I montaggi remoti non più raggiungibili e i bind mount non più validi vengono segnalati prima che causino problemi durante un backup.", + "logsTitle": "Tab 5 — Log (solo contenitori OCI)", + "logsBody": "Solo per container OCI manager Apps. Mostra la console del processo principale dell'immagine da /var/log/proxmenux/oci/VMID.console.log: ultime 100, 500 o 1000 righe, aggiornamento in tempo reale durante il funzionamento, filtro e download. Rilegge il file all'apertura, anche a container fermo. Dettagli: Container OCI in ProxMenux Monitor.", + "backupsTitle": "Tab 6 — Backup", + "backupsImageAlt": "Dettagli del guest — Backup con elenco delle copie disponibili, destinazioni, dimensioni e pulsante Crea backup", + "backupsImageCaption": "Tutti i backup del guest sugli storage Proxmox configurati, dal più recente. L'intestazione indica il numero.", + "backupsIntro": "Elenca i backup del guest sugli storage Proxmox, dal più recente. Il contatore nel titolo permette di vedere se esistono backup. Ogni riga mostra:", + "backupsItems": [ + "Data e ora — momento dell'esecuzione.", + "Destinazione — storage (PBS-Cloud, PBS-Local, NFS-Backup, …), colorato secondo lo stato.", + "Dimensione — dimensione finale del backup su disco." + ], + "backupsOutro": "+ Crea backup avvia un backup sullo storage indicato come “Backup target” in Proxmox. Il ripristino si esegue nell'interfaccia web Proxmox; Monitor mostra i backup recenti del guest e permette di crearne.", + "firewallTitle": "Scheda 7 — Firewall", + "firewallIntro": "Legge il log firewall Proxmox del guest direttamente dall'host, senza servizi aggiuntivi né richieste periodiche. La scheda è sempre presente; il contenuto dipende dalla attivazione del firewall e dalla registrazione dei pacchetti da parte di una regola.", + "firewallItems": [ + "Firewall disattivato — avviso ambra con il percorso per attivarlo in Proxmox (<Container|VM> → Firewall → Options) e il requisito di almeno una regola con log: info o superiore per mostrare i pacchetti.", + "Firewall attivo, nessun evento — la vista vuota ricorda il requisito di registrazione, utile subito dopo la attivazione.", + "Eventi presenti — pannello a spaziatura fissa scorrevole con voci originali per azione: ACCEPT verde, REJECT arancione, DROP rosso. Il contatore nell'intestazione indica le voci caricate." + ], + "firewallRefresh": "Aggiorna carica le ultime voci su richiesta. Senza aggiornamento automatico, l'elenco mostra il momento dell'apertura o dell'ultimo clic. La fonte è /var/log/pve-firewall.log, filtrata per VMID tramite GET /api/vms/<vmid>/firewall/log.", + "firewallCalloutTitle": "Perché è qui quando l'UI Proxmox lo mostra già?", + "firewallCalloutBody": "Evita di passare a Proxmox e mantiene la vista dello stesso VMID: avvia il guest, controlla montaggi ed eventi firewall, poi fermalo dal pannello. Le regole si modificano in Proxmox; Monitor non le cambia.", + "actionBarTitle": "Barra di azione inferiore", + "actionBarIntro": "Sempre visibile ai piedi del modale indipendentemente da quale scheda è attiva:", + "consoleItem": "Console, solo per LXC attivi, apre pct enter <vmid> nel container. Usa xterm.js e WebSocket come la scheda Terminale, con la barra per dispositivi mobili: ESC, TAB, frecce, Invio e Ctrl+C / Ctrl+X / Ctrl+R. Funziona da telefono o tablet. Per le VM usa la console Proxmox noVNC.", + "lifecycleIntro": "Quattro pulsanti in griglia 2×2 inviano POST /api/vms/<vmid>/control con la action corrispondente. Si abilitano in base allo stato del guest.", + "headerButton": "Pulsante", + "headerEnabled": "Abilitato quando", + "headerAction": "Azione inviata all'host", + "lifecycleRows": [ + { + "button": "Avvia", + "color": "green", + "enabled": "Il guest è arrestato.", + "action": "qm start / pct start" + }, + { + "button": "Spegni", + "color": "blue", + "enabled": "Il guest è in esecuzione.", + "action": "qm shutdown / pct shutdown — spegnimento ordinato, ACPI" + }, + { + "button": "Riavvia", + "color": "blue", + "enabled": "Il guest è in esecuzione.", + "action": "qm reboot / pct reboot — riavvio ordinato" + }, + { + "button": "Forza arresto", + "color": "red", + "enabled": "Il guest è in esecuzione.", + "action": "qm stop / pct stop — spegnimento forzato" + } + ], + "forceStopTitle": "Forza arresto interrompe subito l'esecuzione", + "forceStopBody": "Forza arresto salta lo spegnimento, come togliere l'alimentazione. Usa Spegni finché il guest risponde. Forza solo se lo spegnimento si blocca e accetti il rischio di perdita dei dati. Il pulsante rosso e l'etichetta aiutano a evitare clic accidentali." + }, + "dataCollected": { + "heading": "Come vengono raccolti i dati", + "headerSection": "Sezione della scheda", + "headerEndpoint": "Endpoint", + "headerSource": "Fonte", + "rows": [ + { + "section": "Elenco dell'inventario", + "endpoint": "/api/vms", + "source": "pvesh get /cluster/resources --type vm per VM e CT." + }, + { + "section": "Pannello dettagli (configura, rete, dischi)", + "endpoint": "/api/vms/", + "source": "qm config <id> per VM / pct config <id> per CT." + }, + { + "section": "Grafico delle metriche del guest", + "endpoint": "/api/vms//metrics", + "source": "Dati RRD PVE (pvesh get /nodes/<node>/qemu/<id>/rrddata) adattati alla visualizzazione in grafico." + }, + { + "section": "Risultati recenti del log Proxmox", + "endpoint": "/api/vms//logs", + "source": "pvesh get /nodes/<node>/<qemu|lxc>/<vmid>/log --start 0 --limit 1000. Se il comando fallisce restituisce uno elenco vuoto; non fornisce tutti i log interni del guest." + }, + { + "section": "Backup disponibili per gli ospiti", + "endpoint": "/api/vms//backups", + "source": "pvesm list <storage> filtrato da VMID." + }, + { + "section": "Log firewall del guest (scheda Firewall)", + "endpoint": "/api/vms//firewall/log", + "source": "/var/log/pve-firewall.log filtrato da VMID." + }, + { + "section": "Pulsanti di alimentazione (Start / Stop / Reboot / Shutdown)", + "endpoint": "/api/vms//control", + "source": "qm start|stop|reboot|shutdown o equivalenti pct." + } + ], + "codeComment1": "# Confronta i dati del pannello con PVE", + "codeComment2": "# Esamina la configurazione del guest come nella finestra", + "codeComment3": "# VM", + "codeComment4": "# CT" + }, + "whereNext": { + "heading": "Dove proseguire", + "items": [ + { + "label": "Monitoraggio integrità", + "href": "/docs/monitor/health-monitor", + "tailRich": " — categoria VM e Container: avvio fallito, timeout QMP ed errori di arresto CT." + }, + { + "label": "Notifiche", + "href": "/docs/monitor/notifications", + "tailRich": " — cosa attivano gli eventi vm_*, ct_*, migration_* e backup_* nelle fasi successive." + }, + { + "label": "Riferimento API", + "href": "/docs/monitor/api", + "tailRich": " — endpoint di VM e backup." + }, + { + "label": "Indice del pannello", + "href": "/docs/monitor/dashboard", + "tailRich": "— le altre schede." + }, + { + "label": "ProxMenux → Creare VM", + "href": "/docs/create-vm", + "tailRich": " — creazione dei sistemi: modelli NAS (Synology e altri), VM Linux/Windows e impostazioni adatte a Proxmox." + } + ] + } +} diff --git a/web/messages/it/docs/monitor/health-monitor.json b/web/messages/it/docs/monitor/health-monitor.json new file mode 100644 index 00000000..d7e71d7b --- /dev/null +++ b/web/messages/it/docs/monitor/health-monitor.json @@ -0,0 +1,372 @@ +{ + "meta": { + "title": "Monitoraggio Proxmox — CPU, memoria, archiviazione, SMART, ZFS, log | ProxMenux", + "description": "Monitoraggio proattivo di Proxmox VE: dieci categorie ogni cinque minuti (CPU e temperatura, memoria e swap, archiviazione, dischi/SMART, rete, VM, servizi, log, aggiornamenti e sicurezza), quattro livelli di gravità, silenziamento per categoria, pulizia degli errori risolti, cronologia permanente dei dischi e notifiche Telegram, Discord, Gotify o e-mail.", + "ogTitle": "Monitoraggio Proxmox — CPU, memoria, archiviazione, SMART, ZFS, log", + "ogDescription": "Monitoraggio proattivo di Proxmox VE in dieci categorie, con livelli di gravità, durata del silenziamento e notifiche per evento.", + "twitterTitle": "Monitoraggio dello stato di Proxmox | ProxMenux", + "twitterDescription": "Monitoraggio proattivo di Proxmox VE in dieci categorie, con livelli di gravità e notifiche." + }, + "header": { + "title": "Monitoraggio integrità", + "description": "Il controllo continuo esamina dieci categorie dello stato dell’host ogni cinque minuti, raccoglie misure tra i cicli, deduplica i rilevamenti in eventi strutturati e alimenta dashboard, notifiche e riscrittura IA facoltativa da un’unica fonte.", + "section": "Monitor di ProxMenux" + }, + "intro": { + "title": "Uno scanner, tre consumatori", + "body": "Un thread in background esegue il ciclo completo ogni cinque minuti e salva ogni rilevamento in SQLite con un error_key stabile. Così (1) la dashboard mostra lo stato attuale, (2) il sistema di notifiche distribuisce i nuovi eventi e (3) l’assistente IA facoltativo riscrive gli avvisi in linguaggio semplice. Un’unica configurazione alimenta tutti questi componenti." + }, + "howItWorks": { + "heading": "Come funziona", + "intro": "Il monitor usa due thread paralleli. Un campionatore di metriche leggero riempie i buffer di CPU, memoria e temperatura. Il ciclo completo di controllo legge i buffer, valuta le condizioni prolungate ed esegue gli altri controlli circa ogni cinque minuti, poi salva i rilevamenti in SQLite per dashboard e notifiche.", + "scannerTitle": "Dal campione al ritrovamento memorizzato", + "scannerCaption": "Il campionatore riempie i buffer tra i cicli: CPU ogni 5 s, memoria ogni 30 s e temperatura ogni 15 s. Non valuta gli avvisi. Il ciclo completo analizza i buffer ed esegue i controlli più pesanti su SMART, ZFS, log e servizi prima di salvare i rilevamenti in SQLite.", + "scannerArrowLabel": "passo", + "scannerNodes": { + "samplerLabel": "Campionatore di metriche", + "samplerDetail": "Uso CPU 5 s\nMemoria 30 s\nTemperatura 15 s\n→ buffer storici", + "cycleLabel": "ciclo completo di salute", + "cycleDetail": "Ogni 5 min\nLegge i buffer\n+ controlli diretti\n(SMART, ZFS,\nservizi, log…)", + "checksLabel": "Controlli per categoria", + "checksDetail": "Dieci categorie\n(CPU, memoria,\narchiviazione, dischi,\nrete, VM,\nservizi, log,\naggiornamenti, sicurezza)", + "sqliteLabel": "SQLite", + "sqliteDetail": "tabella errors\n(attivi +\nsilenziati)\n+ disk_observations\n(cronologia permanente\nper disco)" + }, + "notifTitle": "Dal rilevamento salvato all’utente", + "notifCaption": "Percorso delle notifiche. La stessa tabella degli errori alimenta anche la dashboard (elenchi degli avvisi attivi e silenziati) e la pulizia a fine ciclo che risolve automaticamente le voci obsolete. Entrambe leggono i dati direttamente, senza passare dal dispatcher.", + "notifArrowLabel": "evento", + "notifNodes": { + "errorsLabel": "errori tabella", + "errorsDetail": "Righe attive +\nsilenziate\nidentificate da\nerror_key", + "dispatcherLabel": "Inviatore di notifica", + "dispatcherDetail": "Eventi nuovi +\naggravati in coda\nSecondo le opzioni\n+ intervallo minimo", + "templatesLabel": "Modelli + riscrittura AI", + "templatesDetail": "Modello\nper evento\n→ riscrittura IA\nfacoltativa in\nlinguaggio semplice", + "channelsLabel": "Canali", + "channelsDetail": "Telegram\nDiscord\nGotify\nPosta elettronica (SMTP)" + } + }, + "categories": { + "heading": "Le dieci categorie", + "imageAlt": "Vista del monitor di stato con le dieci categorie e i relativi stati: CPU, memoria, archiviazione, dischi, rete, VM, servizi, log, aggiornamenti e sicurezza", + "imageCaption": "Salute Monitor vista — le dieci categorie con il loro stato attuale. Le categorie su un host sano mostrano tutto OK; gli avvisi e gli eventi critici appaiono in linea con le righe che li hanno prodotti.", + "intro": "Ogni ciclo esegue dieci controlli indipendenti. Ciascuno restituisce uno dei quattro stati (OK, INFO, WARNING, CRITICAL) e dati strutturati, come nomi dei dispositivi, estratti dei log e soglie precise, mostrati nella dashboard e nelle notifiche.", + "headerCategory": "Categoria", + "headerChecks": "Sottocontrolli", + "headerEvents": "Eventi tipici", + "rows": [ + { + "category": "CPU e temperatura", + "checks": "CPU utilizzo con isteresi, temperatura del sensore", + "events": "Uso elevato e prolungato della CPU; avvisi di temperatura basati sulle letture campionate." + }, + { + "category": "Memoria e swap", + "checks": "RAM utilizzo, utilizzo swap", + "events": "Pressione prolungata sulla memoria; attività dell’OOM-killer; esaurimento dello swap." + }, + { + "category": "Archiviazione", + "checks": "Archivi Proxmox, filesystem radice", + "events": "Soglie di spazio superate sulla radice o su altri filesystem monitorati (85% avviso / 95% critico per impostazione predefinita); esportazione NFS offline; autenticazione CIFS fallita; pool LVM-thin pieno." + }, + { + "category": "Disco e SMART", + "checks": "SMART, errori I/O in dmesg, pool ZFS, LVM, errori del filesystem", + "events": "Controllo SMART fallito; settori riallocati o in attesa; errori I/O ATA; pool ZFS DEGRADED / FAULTED; ext4 rimontato in sola lettura." + }, + { + "category": "Rete", + "checks": "Connettività, stato collegamento, latenza gateway", + "events": "Bridge o bond down; gateway irraggiungibile; persistenti picchi di latenza." + }, + { + "category": "VM e container", + "checks": "Comunicazione QMP, avvio VM, avvio container", + "events": "Avvio della VM fallito; arresto del CT fallito; timeout del socket QMP; configurazione o disco mancanti dopo una clonazione." + }, + { + "category": "Servizi PVE", + "checks": "pveproxy, pvedaemon, pvestatd, pve-cluster, modalità cluster", + "events": "Servizio arrestato in modo anomalo; quorum del cluster perso; pmxcfs bloccato." + }, + { + "category": "Log di sistema", + "checks": "Errori persistenti, punte di errore, cascata di errore, messaggi critici del kernel", + "events": "Errori identici ripetuti; improvvisa scoppio di avvisi (modello cascata); BUG: / OOPS: / oom-killer in dmesg." + }, + { + "category": "Aggiornamenti di sistema", + "checks": "Aggiornamenti di attesa, aggiornamenti di sicurezza, versione kernel / PVE, età del sistema", + "events": "Aggiornamenti di sicurezza o del kernel in uso in attesa; sistema non aggiornato da molto tempo. Nell’intestazione della panoramica appare Aggiorna ora quando ci sono aggiornamenti. Avvia l’intera procedura ProxMenux; alla chiusura aggiorna lo stato con ?refresh=1 senza attendere il ciclo successivo." + }, + { + "category": "Sicurezza e certificati", + "checks": "Tentativi di accesso, certificati in scadenza, stato delle jail Fail2Ban se installato", + "events": "Ripetuti errori di autenticazione SSH o web; certificato PVE in scadenza tra meno di 30 giorni; blocchi Fail2Ban attivi." + } + ] + }, + "severity": { + "heading": "Modello di gravità", + "headerStatus": "Stato", + "headerColour": "Colore", + "headerMeaning": "Significato", + "headerNotification": "Notifica", + "rows": [ + { + "status": "OK", + "colour": "Verde", + "meaning": "Stato regolare. Nessun rilevamento in questa categoria.", + "notification": "Silenzioso." + }, + { + "status": "INFO", + "colour": "Blu", + "meaning": "Condizione transitoria o già risolta degna di nota una volta. Utilizzato anche per le categorie che hanno solo elementi abbandonati rimasti.", + "notification": "Facoltativa. Ogni tipo di evento può essere attivato o disattivato per ciascun canale." + }, + { + "status": "WARNING", + "colour": "Giallo", + "meaning": "L'attenzione è necessaria ma l'host è ancora funzionale. Causa non banale — leggere i dettagli.", + "notification": "Inviata quando il tipo di evento è attivo per il canale." + }, + { + "status": "CRITICAL", + "colour": "Rosso", + "meaning": "Funzionalità rotta o perdita di dati possibile. Azione richiesta.", + "notification": "Inviata se il tipo di evento è attivo per il canale. Un avviso di temperatura CPU CRITICAL si riattiva per sicurezza anche se era stato silenziato." + } + ], + "infoNote": "Una categoria OK con eventi ancora nel periodo di silenziamento appare come INFO, per ricordare che alcuni avvisi sono stati silenziati.", + "unknownTitle": "UNKNOWN quando un controllo non può essere completato", + "unknownBody": "Un controllo non disponibile restituisce UNKNOWN; dopo tre cicli consecutivi viene salvato un rilevamento persistente. La dashboard lo mostra in giallo. Lo stato complessivo limita UNKNOWN a WARNING: il solo controllo non disponibile non rende critico l’host." + }, + "dashboardView": { + "heading": "La vista del cruscotto", + "intro": "Il monitor si trova nella scheda Panoramica. L’indicatore nell’intestazione (Regolare / Avviso / Critico) apre una finestra con due elenchi:", + "items": [ + "Attivi — categorie con rilevamenti irrisolti. Espandendo una riga si vedono i controlli coinvolti, il testo originale reason, l’ID del dispositivo o della VM e, se disponibile, un collegamento ad Archiviazione, Rete, VM, Log o Hardware.", + "Silenziati — elementi riconosciuti dall’utente e ancora nel periodo di silenziamento. Ogni riga mostra tempo restante e durata scelta. Alla scadenza esce dall’elenco; se la causa persiste e la categoria lo supporta, torna tra gli Attivi." + ], + "pillTitle": "L’indicatore riflette la categoria più grave", + "pillBody": "Il colore dell’intestazione riflette la gravità massima: CRITICAL → rosso, altrimenti WARNING → giallo, altrimenti INFO → blu, altrimenti verde. La stessa logica controlla il punto della favicon e il badge PWA.", + "updateNowTitle": "Pulsante Aggiorna ora nell’intestazione della panoramica", + "updateNowBody1": "Se Aggiornamenti di sistema segnala aggiornamenti in attesa, appare Aggiorna ora accanto all’indicatore. La finestra esegue la procedura di ProxMenux → Settings post-install Proxmox → Proxmox System Update: pulizia dei repository, apt full-upgrade tramite update-pve-safe.sh, ricompilazione DKMS dei driver gestiti con un nuovo kernel, autoremove/autoclean e richiesta di riavvio se cambia il kernel. La finestra mostra l’avanzamento in tempo reale.", + "updateNowBody2": "Al termine, chiudere la finestra richiama GET /api/health/details?refresh=1 e invalida la cache dell’endpoint. Aggiornamenti in attesa e gravità vengono ricalcolati dal nuovo stato dei pacchetti: il badge scompare senza attendere il ciclo successivo. Se l’host è già aggiornato, il pulsante resta nascosto." + }, + "dismiss": { + "heading": "Silenziare gli avvisi e scegliere la durata", + "intro": "Alcuni eventi persistono, come Aggiornamenti di sistema: aggiornamenti disponibili finché non aggiorni l’host. Non serve una notifica ogni cinque minuti. Il pulsante Aggiorna ora nella panoramica risolve direttamente questo caso. Per gli altri casi o gli aggiornamenti rimandati sono disponibili due meccanismi collegati per silenziare gli avvisi:", + "step1": "Silenziare un singolo evento nella finestra. Il menu offre 24 ore, 7 giorni o Permanentemente, indipendentemente dalla categoria. La scelta invia POST /api/health/acknowledge con error_key e suppression_hours (-1 per permanente). L’evento passa tra i silenziati con data acknowledged_at.", + "dropdownImageAlt": "Menu per silenziare un avviso: 24 ore, 7 giorni o permanentemente", + "dropdownImageCaption": "La durata scelta vale solo per questo avviso; senza scelta individuale si usa il valore della categoria. Gli avvisi silenziati permanentemente hanno un’etichetta ambra Permanente e normalmente non si riattivano. La temperatura critica della CPU è l’eccezione descritta sotto.", + "step2": "Durata del silenziamento per categoria. In Impostazioni → Monitoraggio, o tramite POST /api/health/settings, ciascuna delle dieci categorie ha una durata predefinita usata senza scelta individuale:", + "imageAlt": "Durata del silenziamento per categoria in Impostazioni → Monitoraggio", + "imageCaption": "Un menu per categoria. Scegli una durata lunga per eventi ripetitivi, come aggiornamenti in attesa, e breve per quelli da rivalutare presto. Sotto sono elencati i silenziamenti attivi.", + "outro": "Durante il silenziamento il controllo continua e aggiorna last_seen, senza nuove notifiche. Alla scadenza il ciclo successivo rivaluta la causa: l’avviso può riattivarsi oppure sparire se il problema è risolto.", + "activeSuppressionsTitle": "Rivedere e annullare i silenziamenti attivi", + "activeSuppressionsBody": "Gli avvisi silenziati, temporanei o permanenti, sono in Impostazioni → Monitoraggio → Silenziamenti attivi. Ogni riga mostra identificatore, categoria, gravità, data e tempo restante. Riattiva rimuove il riconoscimento per il prossimo controllo. Da qui si annullano i silenziamenti permanenti e si interrompono quelli temporanei. Attiva Modifica, scegli le righe da riattivare (bordo verde e testo barrato), poi salva. Annulla svuota la selezione.", + "autoTitle": "Silenziamento automatico al cambiare la durata", + "autoBody": "Scegliere una durata diversa dalle 24 ore predefinite ha un secondo effetto: i nuovi rilevamenti della categoria vengono salvati già riconosciuti. Una settimana scelta per i dischi vale quindi anche per i nuovi avvisi, senza silenziarli singolarmente. Appaiono direttamente tra i silenziati con la durata scelta. Le categorie lasciate a 24 ore mantengono il comportamento normale: i nuovi rilevamenti restano attivi finché intervieni.", + "tempTitle": "Eccezione per temperatura CPU CRITICAL", + "tempBody": "La persistenza prevede una regola speciale per Temperatura CPU CRITICAL: un tale record ignora il riconoscimento precedente e il silenziamento automatico. Ciò non significa che ogni controllo di temperatura generi un record critico al superamento di una soglia configurata.", + "nonDismissableTitle": "Quali rilevamenti si possono silenziare?", + "nonDismissableBody": "La finestra mostra Silenzia solo se il controllo restituisce esplicitamente dismissable = true. Un valore falso o assente nasconde il pulsante. La gravità non determina questo permesso: diversi controlli critici consentono il riconoscimento. Gli esempi descrivono i dati attuali; silenziare un avviso non ne risolve la causa.", + "headerFinding": "Rilevamento", + "headerWhy": "Comportamento del silenziamento", + "rows": [ + { + "finding": "Temperatura CPU: avviso / critica", + "why": "L’avviso basato sui campioni di temperatura consente esplicitamente il silenziamento. Una regola separata ignora il riconoscimento se arriva un record di temperatura CPU con gravità CRITICAL." + }, + { + "finding": "Spazio critico del filesystem radice", + "why": "I controlli dello spazio consentono il silenziamento anche con utilizzo critico. Riconoscere l’avviso non libera spazio né elimina il rischio di scritture fallite." + }, + { + "finding": "ZFS pool DEGRADED / FAULTED", + "why": "I controlli di capacità dei pool ZFS consentono il silenziamento. Gli altri rilevamenti seguono il proprio indicatore. Il riconoscimento non ripara un pool degradato o guasto." + }, + { + "finding": "Errori del disco I/O con SMART FAILED", + "why": "I rilevamenti del disco salvati dal journal possono consentire il silenziamento. SMART FAILED richiede comunque un’indagine; il pulsante dipende dall’indicatore del controllo, non dal solo testo dell’avviso." + }, + { + "finding": "Interfaccia di rete DOWN", + "why": "I controlli persistenti di interfaccia DOWN consentono il silenziamento. Questo non ripristina bridge, bond, collegamento fisico o accesso remoto." + }, + { + "finding": "Eventi I/O su dischi sani (INFO)", + "why": "Gli eventi ATA o dmesg transitori con SMART sano possono essere informativi e risolversi da soli. Le righe informative possono non offrire Silenzia; il controllo stabilisce quando la condizione è risolta." + } + ], + "principle": "Usa il pulsante mostrato per il rilevamento effettivo, senza dedurne la disponibilità dalla categoria o gravità. Il riconoscimento controlla presentazione e notifiche. I controlli di ripristino e la cronologia del disco restano separati." + }, + "autoresolve": { + "heading": "Autorisoluzione e pulizia", + "intro": "Molti avvisi devono sparire quando cessa la causa: una VM torna ad avviarsi, un disco viene rimosso o la temperatura torna normale. La pulizia alla fine di ogni ciclo di cinque minuti applica queste regole:", + "headerTrigger": "Trigger", + "headerAction": "Azione", + "rows": [ + { + "trigger": "Uso CPU o temperatura tornati alla normalità.", + "action": "Segnato risolto. Esce dalla lista attiva." + }, + { + "trigger": "Pressione di memoria indietro sotto la soglia di avvertimento dopo un OOM / avviso di memoria.", + "action": "Segnato risolto." + }, + { + "trigger": "VM / CT richiamato dall'errore non esiste più (qm status / pct status non zero).", + "action": "Segnato risolto come risorsa rimosso." + }, + { + "trigger": "Il disco richiamato dall'errore non è più presente in /dev/.", + "action": "Segnato risolto come dispositivo rimosso. La storia dell'osservazione permanente è conservata (vedi sezione successiva)." + }, + { + "trigger": "Rilevamenti dal journal di sistema (categoria logs, voci SMART, errori ATA o I/O) alla scadenza del silenziamento.", + "action": "Vengono rimossi. Ogni scansione esamina le nuove voci del journal da quel momento; la stessa vecchia riga non viene emessa di nuovo." + }, + { + "trigger": "Errori risolti da oltre sette giorni.", + "action": "Eliminati dal database per contenere la tabella. La cronologia delle notifiche è indipendente e viene conservata più a lungo." + } + ], + "permanentTitle": "Silenziare permanentemente non significa risolvere", + "permanentBody": "Una durata di categoria pari a -1 (permanente) silenzia i futuri avvisi degli elementi riconosciuti, senza saltare il controllo di risoluzione automatica. Se la causa scompare, per esempio dopo la rimozione della risorsa o il rientro sotto soglia, l’elemento viene comunque ripulito automaticamente." + }, + "observations": { + "heading": "Osservazioni dei dischi — la cronologia permanente", + "intro": "Gli eventi dei dischi meritano di essere conservati. Un avviso SMART su /dev/sdh alle 02:14 resta utile dopo la fine della raffica di I/O e la risoluzione automatica: il disco ha ormai dei precedenti. Per questo il monitor mantiene una tabella permanente separata: disk_observations.", + "headerProperty": "Proprietà", + "headerErrors": "Tabella errors (Attiva)", + "headerObs": "Tabella disk_observations", + "rows": [ + { + "property": "Scopo", + "errors": "Alimenta la vista dello stato attuale e l’invio delle notifiche.", + "obs": "Registro di controllo permanente per disco." + }, + { + "property": "Risoluzione automatica", + "errors": "Sì — le righe sono cancellate quando la condizione scompare.", + "obs": "No: le voci restano finché l’utente non le archivia esplicitamente." + }, + { + "property": "Chiave di deduplicazione", + "errors": "error_key (es. smart_sdh).", + "obs": "(disk_registry_id, error_type, error_signature) con firme stabili spogliate di dati volatili." + }, + { + "property": "Dove appare", + "errors": "Finestra del monitor (elenchi Attivi / Silenziati).", + "obs": "Scheda del disco nella sezione Archiviazione, con un indicatore «X obs.» per disco." + }, + { + "property": "Cosa registra", + "errors": "Qualunque cosa stia attualmente fallendo.", + "obs": "Avvisi SMART (settori, temperatura, CRC, test automatici falliti), errori I/O (ATA / NVMe / dm), errori del filesystem ed eventi dei pool ZFS." + } + ], + "outro": "Un avviso può sparire dalla dashboard mentre l’incidente resta nella cronologia del disco. Aprendo il disco in Archiviazione, la scheda mostra il numero di osservazioni pendenti con date, gravità e messaggi originali non elaborati. Aiuta a decidere se sostituire l’unità.", + "renameTitle": "Le variazioni del nome del dispositivo vengono unite automaticamente", + "renameBody": "I dischi possono apparire inizialmente con nomi provvisori come ata8 o nvme0n1p3. Le osservazioni vengono raggruppate per numero di serie noto: se un evento è registrato come ata8 e il disco poi identificato come sdh, al ciclo seguente le vecchie osservazioni vengono associate a sdh, mantenendo unita la cronologia." + }, + "notification": { + "heading": "Dal rilevamento alla notifica", + "intro": "Ogni errore attivo può anche generare una notifica. Il percorso:", + "items": [ + "Lo scanner registra il risultato con la categoria + gravità + dettagli strutturati.", + "Se il tipo di evento è attivo nelle notifiche globali e il canale non ha silenziato la categoria, l’evento viene messo in coda.", + "Il motore dei modelli produce titolo e corpo dai dati strutturati. Se la riscrittura IA è attiva, la coppia passa anche al fornitore configurato per una versione in linguaggio semplice.", + "Il canale invia un messaggio Telegram, un embed Discord, una notifica push Gotify o un’e-mail. L’esito è salvato in notification_history.", + "Silenziare un avviso avvia il periodo di sospensione. Durante quel periodo nuove rilevazioni dello stesso error_key normalmente non generano notifiche né vengono accodate per la scadenza. Resta l’eccezione per la temperatura critica della CPU." + ], + "outro": "La configurazione dei canali — token del bot Telegram, URL webhook, chiavi IA, opzioni per evento e per canale — è descritta in Notifiche e Assistente IA." + }, + "rest": { + "heading": "Endpoint REST", + "intro": "Le azioni della finestra sono disponibili via API per script, dashboard o bot. Con autenticazione del Monitor attiva serve un token Bearer valido, ottenuto con l’accesso o nella schermata dei token API. Le modifiche, come riconoscere avvisi, salvare o pulire errori orfani, richiedono full_admin; read_only riceve 403. Con autenticazione disattivata o rifiutata, questi controlli consentono accesso senza token.", + "headerEndpoint": "Endpoint", + "headerMethod": "Metodo", + "headerUse": "Uso", + "rows": [ + { + "endpoint": "/api/health", + "method": "GET", + "use": "Controllo leggero che restituisce JSON con status, timestamp e version. Adatto ai controlli per parola chiave Uptime Kuma; con autenticazione del Monitor attiva il client deve inviare un’intestazione Bearer." + }, + { + "endpoint": "/api/health/status", + "method": "GET", + "use": "Stato complessivo: un livello di gravità e una sintesi. Richiede autenticazione." + }, + { + "endpoint": "/api/health/details", + "method": "GET", + "use": "Tutte le dieci categorie con i rispettivi stati e i dati strutturati che li hanno prodotti." + }, + { + "endpoint": "/api/health/full", + "method": "GET", + "use": "Vista completa: categorie, errori attivi, silenziati e impostazioni personalizzate. Alimenta la finestra con una sola richiesta e usa una cache in background di sei minuti per risposte rapide." + }, + { + "endpoint": "/api/health/active-errors", + "method": "GET", + "use": "Solo la lista attiva. Filtrabile da ?category=<name>." + }, + { + "endpoint": "/api/health/dismissed", + "method": "GET", + "use": "Solo l’elenco dei silenziati, con le ore restanti." + }, + { + "endpoint": "/api/health/acknowledge", + "method": "POST", + "use": "Corpo: '{'\"error_key\":\"smart_sdh\"'}'. Silenzia un avviso per la durata configurata della categoria." + }, + { + "endpoint": "/api/health/settings", + "method": "GET / POST", + "use": "Leggere o salvare la durata del silenziamento per categoria." + }, + { + "endpoint": "/api/health/cleanup-orphans", + "method": "POST", + "use": "Pulizia manuale degli errori di dispositivi o VM rimossi. Idempotente." + } + ], + "codeComment1": "# Ottenere lo stato attuale per uno script", + "codeComment2": "# Silenziare un errore specifico", + "codeComment3": "# Imposta a una settimana la sospensione della categoria dischi" + }, + "whereNext": { + "heading": "Come proseguire", + "items": [ + { + "label": "Dashboard", + "href": "/docs/monitor/dashboard", + "tail": " — da qui si apre la finestra del monitor nell’interfaccia." + }, + { + "label": "Notifiche", + "href": "/docs/monitor/notifications", + "tail": " — canali, opzioni per evento, riscrittura IA e cronologia." + }, + { + "label": "Assistente AI", + "href": "/docs/monitor/ai-assistant", + "tail": " — fornitore (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter), modalità del prompt, dettaglio per canale e lingua." + }, + { + "label": "Architettura", + "href": "/docs/monitor/architecture", + "tailRich": " — schema SQLite (errors, disk_observations, events) e frequenza dei thread in background." + } + ] + } +} diff --git a/web/messages/it/docs/monitor/index.json b/web/messages/it/docs/monitor/index.json new file mode 100644 index 00000000..43abfbc5 --- /dev/null +++ b/web/messages/it/docs/monitor/index.json @@ -0,0 +1,151 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Dashboard Web self-hosted per Proxmox VE | ProxMenux", + "description": "ProxMenux Monitor è un dashboard web self-hosted per Proxmox VE: parametri host in tempo reale, archiviazione e dati SMART, rete, VM e contenitori, hardware, log, un terminale web integrato, un monitoraggio dello stato proattivo, notifiche a Telegram / Discord / Email, un assistente AI opzionale, un REST API e integrazioni con strumenti come Homepage e Home Assistant.", + "ogTitle": "ProxMenux Monitor: dashboard Web self-hosted per Proxmox VE", + "ogDescription": "Dashboard Proxmox VE in tempo reale: parametri host, archiviazione SMART, rete, VM e contenitori, hardware, log, terminale web, Health Monitor, notifiche, assistente AI, REST API.", + "twitterTitle": "ProxMenux Monitor | ProxMenux", + "twitterDescription": "Dashboard Proxmox VE self-hosted con Health Monitor, notifiche, assistente AI e REST API." + }, + "header": { + "title": "ProxMenux Monitor", + "description": "Una dashboard web per Proxmox VE sul proprio host, distribuita come AppImage. Funziona come singolo servizio systemd, ascolta sulla porta TCP 8008 e serve API e interfaccia dallo stesso processo.", + "section": "ProxMenux Monitor" + }, + "atGlance": { + "title": "In sintesi", + "body": "Singolo AppImage sull'host Proxmox → Flask backend (porta 8008) che raccoglie dati in tempo reale tramite psutil, pvesh, smartctl, journalctl → Dashboard Next.js servito dallo stesso processo. Autenticazione opzionale (password + 2FA), assistente AI opzionale, notifiche opzionali, REST API per integrazioni." + }, + "hero": { + "alt": "ProxMenux Monitor dashboard: schermata di panoramica del sistema con CPU, widget di memoria, temperatura e tempo di attività", + "caption": "Schermata di destinazione predefinita: parametri a livello di host e stato di integrità a colpo d'occhio." + }, + "coverage": { + "heading": "Cosa copre il dashboard", + "intro": "Otto sezioni principali, ciascuna con i propri endpoint API:", + "tableSection": "Sezione", + "tableWhat": "Cosa mostra", + "sections": [ + { + "name": "Monitoraggio dello stato", + "description": "Avvisi attivi e ignorati su CPU, memoria, archiviazione, dischi, rete, servizi, log, VM, aggiornamenti e sicurezza. Gestisce il motore di notifica." + }, + { + "name": "Archiviazione", + "description": "Pool di archiviazione Proxmox, dischi fisici (SATA / NVMe / USB), attributi SMART, stato dei pool ZFS, usura e vita utile, attività I/O." + }, + { + "name": "Rete", + "description": "Tutte le interfacce (fisiche, bond, bridge, OVS), IP/MAC/stato, grafici RX/TX in tempo reale, dati RRD storici per interfaccia." + }, + { + "name": "VM e contenitori", + "description": "Inventario VM/LXC con stato, risorse e tempo di attività. I dettagli mostrano configurazione, metriche storiche, download dei log Proxmox e azioni avvio/arresto/riavvio/spegnimento. I log dipendono dall’endpoint Proxmox; non è un archivio completo del sistema guest." + }, + { + "name": "Hardware", + "description": "CPU modello e topologia, layout della memoria, dispositivi PCIe, elenco GPU con driver e monitoraggio in tempo reale per slot (NVIDIA / Intel iGPU)." + }, + { + "name": "Registri ed eventi", + "description": "journalctl in tempo reale con filtri di gravità/intervallo di tempo/parole chiave, cronologia delle attività Proxmox, registro delle notifiche, pacchetti di registri scaricabili." + }, + { + "name": "Terminale", + "description": "Shell host e console VM/CT supportate nel browser tramite xterm.js e WebSocket. Segue l’autenticazione configurata: se disabilitata o rifiutata, i client con accesso di rete possono aprire sessioni senza login. Non implica un audit di ogni comando." + }, + { + "name": "Sicurezza", + "description": "Tentativi di autenticazione falliti, stato dei jail di Fail2Ban, blocchi recenti e integrazione con il jail [proxmenux] dell’host." + } + ], + "footer": "Ogni sezione ha una pagina di documentazione dedicata sotto Dashboard nella barra laterale." + }, + "howItRuns": { + "heading": "Come funziona", + "intro": "ProxMenux Monitor viene distribuito come AppImage autonoma. Una singola unità systemd (proxmenux-monitor.service) avvia un processo Flask che:", + "bullets": [ + "Ascolta su TCP 8008 sull'host (HTTP).", + "Serve la dashboard Next.js come file statici in / e l’API in /api/* dallo stesso processo.", + "Estrae dati in tempo reale con strumenti host standard: psutil, pvesh, smartctl, journalctl, zpool, ip, nvidia-smi, ecc.", + "Salva lo stato in un database SQLite locale (/usr/local/share/proxmenux/health_monitor.db): avvisi ignorati, osservazioni dei dischi, configurazioni notifiche e AI. L’autenticazione è conservata separatamente in /root/.config/proxmenux-monitor/auth.json." + ], + "footer": "Il flusso completo della richiesta, il layout del file e l'integrazione di systemd sono descritti in Architettura." + }, + "noAgent": { + "title": "Nessun agente sui guest", + "body": "Il Monitor legge tutti i dati dall’host. Non occorre installare agenti nelle VM o nei CT: i dati provengono dall’API di Proxmox e dalle informazioni che il kernel dell’host rende disponibili sui sistemi guest in esecuzione." + }, + "access": { + "heading": "Accesso al dashboard", + "intro": "Sono supportati due modelli di accesso e l'applicazione rileva quale è in uso:", + "codeComment1": "# 1) Accesso diretto sull'host", + "codeComment2": "# 2) Tramite proxy inverso (Nginx / Caddy / Traefik)", + "afterCode": "Il proxy inverso deve impostare X-Forwarded-For, X-Forwarded-Proto e X-Forwarded-Host correttamente e inoltrare gli upgrade WebSocket. Sulle porte standard il browser usa l’origine attuale. Il backend considera attendibili gli IP inoltrati solo con PROXMENUX_TRUST_PROXY=1 esplicito; limita l’accesso diretto al backend quando lo abiliti.", + "footer": "La configurazione al primo avvio, la password + TOTP 2FA e gli snippet proxy inverso sono trattati in Accesso e autenticazione." + }, + "mobile": { + "heading": "Utilizzo mobile e installazione dalla schermata iniziale", + "intro": "La dashboard è reattiva e viene fornita come app Web progressiva. Il pacchetto public/manifest.json dichiara display: standalone con il nome dell'app, l'icona e il colore del tema, quindi l'aggiunta dell'URL alla schermata iniziale produce un vero launcher autonomo: nessuna barra degli indirizzi del browser, splash personalizzato, tema scuro abbinato al dashboard.", + "phoneAlt": "ProxMenux Monitor in esecuzione su un telefono: visualizzazione dashboard principale", + "phoneCaption": "Dashboard principale su un telefono: il layout si adatta per le finestre di piccole dimensioni.", + "addHeading": "Aggiungi alla schermata iniziale", + "iosLabel": "iOS Safari:", + "iosBody": "pulsante di condivisione → Aggiungi alla schermata principale. L'icona proviene da /apple-touch-icon.png fornito in AppImage.", + "androidLabel": "Android Chrome/Edge:", + "androidBody": "menu a tre punti → Installa app (o Aggiungi alla schermata Home su versioni precedenti).", + "afterInstall": "Una volta installata, aprendo l'icona si avvia la dashboard in modalità autonoma con la propria voce di commutazione attività.", + "onlineOnlyTitle": "Richiede una connessione", + "onlineOnlyBody": "La PWA è installabile, ma non funziona offline: non include un service worker. Il collegamento si comporta come un’app nativa, ma il dispositivo deve comunque poter raggiungere l’host sulla porta TCP 8008, tramite LAN, VPN o HTTPS con proxy inverso, per caricare la dashboard." + }, + "health": { + "heading": "Il monitoraggio dello stato e le notifiche", + "alt": "Schermata Health Monitor che mostra le 10 categorie tracciate (CPU, memoria, archiviazione, dischi, rete, servizi, registri, VM, aggiornamenti, sicurezza) con lo stato corrente", + "caption": "Vista Health Monitor: le categorie 10 monitorate, con il loro stato attuale. Gli avvisi attivi e ignorati vengono visualizzati qui quando il sistema ne genera qualcuno.", + "body1": "Il Health Monitor lavora continuamente in background e genera eventi strutturati: temperatura CPU elevata, avvisi SMART, degrado dei pool ZFS, terminazioni OOM, guasti VM/CT e incidenti di sicurezza. Ogni evento ha categoria, gravità (INFO / WARNING / CRITICAL) e una error_key stabile per raggruppare i duplicati senza riempire lo schermo.", + "feedsIntro": "Gli eventi alimentano tre cose contemporaneamente:", + "feedsHealth": "La vista Monitoraggio integrità nel dashboard (elenchi attivi + ignorati).", + "feedsChannels": "Il motore di notifica — Telegram, Discord, Email, Gotify, Pushover e Apprise (multicanale). Ogni canale è configurato in modo indipendente e le categorie per evento possono essere silenziate.", + "feedsAI": "L'assistente AI opzionale: se abilitato, il provider configurato (OpenAI, Anthropic, Gemini, Groq, Ollama o OpenRouter) spiega gli eventi in arrivo in un linguaggio semplice e, se abilitato nelle impostazioni AI, propone i passaggi successivi.", + "suppressionTitle": "Sopprimere singoli avvisi anziché silenziare tutto", + "suppressionBody": "Ogni categoria ha la propria Durata di soppressione: una volta ignorato un avviso, lo stesso avviso viene silenziato per quella finestra (predefinito 24 ore, configurabile per categoria fino a permanente). Escalation reali – ad es. CPU temperatura che supera la soglia critica: riattivazione sempre indipendentemente dalla soppressione." + }, + "api": { + "heading": "REST API e integrazioni", + "intro": "Gli endpoint REST espongono dati di monitoraggio JSON via HTTP/HTTPS per Homepage, Home Assistant, Uptime Kuma e script. Grafana può usare l’esportatore testuale Prometheus separato su /api/prometheus. Le richieste possono usare curl.", + "tokens": "I token API a lunga durata (365 giorni) vengono generati in Impostazioni → Token di accesso API o tramite POST /api/auth/generate-api-token.", + "bearer": "Invia i token con Authorization: Bearer …. L’endpoint pubblico /api/health serve ai controlli di disponibilità senza credenziali. Sotto /api/auth/* ci sono rotte pubbliche di configurazione/login/stato e rotte protette per account e token; non sono tutte anonime.", + "catalog": "Catalogo degli endpoint, rotazione dei token e sicurezza sono nel Riferimento API; esempi per Homepage, Home Assistant, Grafana, Uptime Kuma e cURL sono in Integrazioni." + }, + "serviceControl": { + "heading": "Controllo del servizio", + "intro": "Giorno per giorno, il Monitor è gestito esattamente come qualsiasi altro servizio systemd. Viene inoltre esposto come due voci all'interno della TUI ProxMenux in Impostazioni:", + "codeComment": "# Controllo manuale", + "footer": "Vedi Impostazioni → ProxMenux Monitor per l'attivazione/disattivazione del menu e il flusso di verifica dello stato." + }, + "nextSteps": { + "heading": "Dove proseguire", + "items": [ + { + "label": "Architettura", + "description": "— Flask backend, unità systemd, schema SQLite, fornitori di intelligenza artificiale, canali di notifica." + }, + { + "label": "Accesso e autenticazione", + "description": "— primo avvio, impostazione della password, TOTP 2FA, configurazione proxy inverso, integrazione Fail2Ban." + }, + { + "label": "Dashboard", + "description": "— ogni sezione dell’interfaccia, una pagina per ciascuna." + }, + { + "label": "Riferimento API", + "description": "— ogni endpoint, forma di richiesta/risposta e gestione dei token." + }, + { + "label": "Integrazioni", + "description": "— Homepage, Home Assistant, Grafana / Prometheus, Uptime Kuma e modello cURL generico." + } + ] + } +} diff --git a/web/messages/it/docs/monitor/integrations.json b/web/messages/it/docs/monitor/integrations.json new file mode 100644 index 00000000..87ce408f --- /dev/null +++ b/web/messages/it/docs/monitor/integrations.json @@ -0,0 +1,255 @@ +{ + "meta": { + "title": "Integrazioni Proxmox — Homepage, Home Assistant, Grafana, Prometheus | ProxMenux Monitor", + "description": "Esempi da copiare per collegare ProxMenux Monitor a Homepage, Home Assistant, Grafana tramite Prometheus e Uptime Kuma, con configurazione richiesta, endpoint API e intestazione di autenticazione.", + "ogTitle": "Integrazioni Proxmox — Homepage, Home Assistant, Grafana, Prometheus", + "ogDescription": "Guida per collegare ProxMenux Monitor a Homepage, Home Assistant, Grafana, Prometheus e Uptime Kuma.", + "twitterTitle": "Integrazioni Proxmox | ProxMenux Monitor", + "twitterDescription": "Ricette per Homepage, Home Assistant, Grafana, Prometheus e Uptime Kuma." + }, + "header": { + "title": "Integrazioni", + "description": "Esempi da copiare per gli strumenti del tuo homelab: Homepage, Home Assistant, Grafana tramite Prometheus e Uptime Kuma. Ogni esempio mostra la configurazione richiesta, l’endpoint del Monitor utilizzato e l’intestazione di autenticazione necessaria.", + "section": "Monitor di ProxMenux" + }, + "intro": { + "title": "Cosa puoi costruire da questa pagina", + "body": "Copia ogni esempio nello strumento scelto. Gli endpoint sono descritti nel Riferimento API; questa pagina spiega come usarli in Homepage, Home Assistant e Grafana. Le immagini mostrano il risultato delle configurazioni." + }, + "auth": { + "heading": "Autenticazione: l'unica cosa che ogni ricetta ha bisogno", + "intro": "La maggior parte degli endpoint utilizzati da queste integrazioni sono autenticati. Hai due modi per soddisfare questo requisito.", + "optAtitle": "Opzione A — Token API (consigliato per le integrazioni)", + "optAbody1": "Apri Impostazioni → Sicurezza → Token API. Premi Genera token, assegna un nome come homepage, home-assistant o prometheus e copialo: appare una sola volta. Scade dopo un anno per impostazione predefinita ed è revocabile singolarmente. Usalo per i client esterni al browser.", + "optAbody2": "Da quel punto ogni richiesta è solo:", + "optBtitle": "Opzione B — flusso di login (username + password)", + "optBbody": "Utile per script che si autenticano come un utente. Il token restituito dura poco; per la maggior parte delle integrazioni scegli l’opzione A.", + "outro": "Il campo TOTP è obbligatorio solo se sull’account è attiva la 2FA. Rotazione e revoca dei token, criteri delle password e registro di controllo sono descritti in Accesso e autenticazione.", + "httpsTitle": "Utilizzando HTTPS invece di HTTP", + "httpsIntro": "Gli esempi usano http:// per brevità. Se hai attivato TLS sul Monitor (Impostazioni → Sicurezza → SSL/HTTPS), sostituisci http:// con https:// in ogni URL. Due note per alcuni strumenti:", + "httpsItems": [ + "Certificati autofirmati. L’integrazione Home Assistant rest: verifica TLS per impostazione predefinita. Per un certificato autofirmato del Monitor aggiungi verify_ssl: false a ogni blocco REST accanto a scan_interval:, oppure importa la CA del Monitor tra i certificati attendibili. Lo stesso vale per altri strumenti che verificano i certificati.", + "Prometheus include già scheme: https nell’esempio sotto. Attiva o mantieni https se TLS è attivo sul Monitor." + ] + }, + "homepage": { + "heading": "Homepage", + "headingHref": "https://gethomepage.dev", + "intro": "Homepage è una dashboard di applicazioni statica e personalizzabile. ProxMenux Monitor si collega con il widget integrato customapi: aggiungi un servizio a services.yaml, riavvia Homepage e la scheda mostra i valori aggiornati.", + "iconCalloutTitle": "Il logo ufficiale ProxMenux è su dashboardicons.com", + "iconCalloutBody": "Gli esempi usano icon: proxmenux.png. Homepage cerca automaticamente i nomi semplici su dashboardicons.com, una raccolta di icone per dashboard autogestite. La voce ProxMenux è su dashboardicons.com/icons/external/proxmenux e viene caricata alla prima visualizzazione. Funziona anche per migliaia di strumenti come Telegram, Discord, Grafana e Tailscale: indica icon: <name>.png nel servizio.", + "imageAlt": "Homepage cruscotto che mostra tre schede ProxMenux Monitor (EDGE, VOID, DREAM) con uptime, CPU, RAM e temperatura per ogni host Proxmox", + "imageCaption": "Tre istanze ProxMenux Monitor come schede Homepage: uptime, CPU, RAM e temperatura CPU letti da /api/system di ogni host ogni 10 s.", + "basicTitle": "widget di base — nessuna autenticazione", + "basicIntro": "Utilizzare questo quando ProxMenux Monitor è su una rete di fiducia e non hai ancora abilitato l'autenticazione sul lato Monitor. La voce services.yaml più semplice:", + "authedTitle": "widget autenticato", + "authedIntro": "Generare un token API in Impostazioni → Sicurezza → Token API sul Monitor, copiarlo e incollarlo nell'intestazione Authorization di seguito — sostituire il token di esempio mostrato dopo Bearer con quello appena copiato:", + "authedOutro": "Riavvia Homepage per visualizzare i valori aggiornati. Riutilizza lo stesso token nei widget che interrogano la stessa istanza del Monitor.", + "multiTitle": "Configurazione multi-widget — sistema, archiviazione, rete", + "multiIntro": "Per più dettagli crea tre schede con endpoint diversi: sistema, archiviazione e rete. Usa lo stesso token per questa istanza del Monitor.", + "multiCalloutTitle": "Più host Proxmox", + "multiCalloutBody": "Ripeti il blocco per ogni host per ottenere le schede mostrate. Ogni voce usa http://<host>:8008 della propria istanza. Genera e conserva un token per host: le installazioni separate hanno chiavi di firma proprie, quindi non presumere che un token valga anche altrove." + }, + "homeAssistant": { + "heading": "Home Assistant", + "headingHref": "https://www.home-assistant.io", + "intro": "Gli esempi usano l’integrazione rest di Home Assistant senza richiedere un componente HACS dedicato. Legge gli endpoint nel Riferimento API e crea sensori e attributi per le automazioni. La configurazione offre circa 25 sensori per risorse, stato, VM/CT, archiviazione, rete e aggiornamenti. Aggiungila a configuration.yaml e ricarica o riavvia HA.", + "imageAlt": "Dashboard Home Assistant con stato, indicatori CPU/RAM/temperatura, numero di VM, spazio occupato ed errori attivi", + "imageCaption": "ProxMenux Monitor come integrazione Home Assistant di prima classe — sensori costruiti dalla ricetta YAML qui sotto.", + "step1Title": "1 · Conservare il token API", + "step1Body": "Salva il token in secrets.yaml per separarlo dalla configurazione principale. Includi prefisso Bearer e token in un unico valore da usare come intestazione. Il file non è cifrato e deve restare privato. La posizione dipende dall’installazione, in genere /config/secrets.yaml su HA OS o Container.", + "step2Title": "2 · Aggiungere la configurazione REST", + "step2Body": "Sei blocchi REST coprono le aree principali. Il loro scan_interval segue la frequenza delle modifiche: risorse ogni 30 s, stato ogni 60 s, inventari ogni 5–10 minuti. Incolla in configuration.yaml:", + "step3Title": "3 · Aggiungi sensori binari e helper per modelli", + "step3Body": "Due sensori binari e due sensori basati su modello completano l’integrazione, semplificando automazioni e schede condizionali Lovelace senza ripetere espressioni Jinja ovunque.", + "step4Title": "4 · Ricarica e verifica", + "step4Body": "Verifica prima la sintassi in Strumenti per sviluppatori → YAML → Controlla configurazione. Ricarica poi Tutta la configurazione YAML o riavvia HA. In Impostazioni → Dispositivi e servizi → Entità filtra per proxmenux. Le circa 25 entità dovrebbero ricevere valori entro un intervallo di lettura.", + "replaceTitle": "Sostituzione di una versione precedente di questa ricetta?", + "replaceBody": "Dopo una versione precedente, il registro può conservare ID obsoleti e le schede mostrare Entità non trovata. Rimuovi i vecchi blocchi rest: e template: da configuration.yaml e ricarica. In Impostazioni → Dispositivi e servizi → Entità filtra per proxmenux ed elimina le vecchie voci ripristinate o non disponibili. Aggiungi il nuovo YAML e ricarica per registrare le nuove.", + "step5Title": "5 · Dashboard Lovelace", + "step5Body": "Il YAML crea una scheda vertical-stack con logo, indicatori, sistema, VM, archiviazione, rete e problemi condizionali. Apri la dashboard, premi la matita, Aggiungi scheda, poi Manuale in fondo e incolla:", + "viewTipTitle": "Lo vuoi come una vista completa del cruscotto invece di una singola carta?", + "viewTipBody": "Apri il menu a tre punti → Editor di configurazione grezza e aggiungi una vista con questa intestazione sopra l’elenco cards::", + "viewTipOutro": "Questo ti dà una scheda/vista dedicata nel tuo cruscotto con la sua icona e titolo, invece di una lunga scheda su una vista esistente.", + "altViewTitle": "Alternativa — una vista dedicata del cruscotto", + "altViewIntro": "Per creare una scheda in una dashboard esistente, aggiungi una vista con il YAML sotto. Una vista è una scheda della dashboard e non crea una voce nella barra laterale. Passaggi:", + "altViewSteps": [ + "Apri il cruscotto dove vuoi la nuova scheda.", + "Premi la matita (modifica dashboard) in alto a destra.", + "Fare clic sulla scheda + alla fine delle schede esistenti per creare una nuova vista.", + "Nella finestra scegli Editor di codice in alto a destra per passare dall’editor visivo a YAML.", + "Incolla la YAML qui sotto.", + "Salva. La vista ProxMenux Monitor appare come scheda nella dashboard con le sue carte." + ], + "twoEditorsTitle": "Due editor YAML in HA — scegli quello giusto", + "twoEditorsIntro": "Home Assistant ha due editor YAML simili nell’aspetto ma con formati di input diversi:", + "twoEditorsItems": [ + "Editor della singola vista — da + o Modifica vista → Editor di codice. Richiede una vista con title:, path: e cards: al livello principale, senza trattino iniziale.", + "Editor grezzo dell’intera dashboard — dal menu a tre punti. Richiede l’intero elenco views:, con ogni vista come elemento preceduto da -." + ], + "twoEditorsOutro": "Il formato sbagliato può produrre una Vista senza nome e cards: []. Il YAML sotto è per l’editor di una singola vista: copialo esattamente.", + "viewImageAlt": "Vista Home Assistant per ProxMenux Monitor: intestazione picture-entity, indicatori glance e schede sistema, VM, archiviazione e rete su più colonne", + "viewImageCaption": "La vista ProxMenux Monitor su schermo ampio. Il layout Masonry distribuisce le schede in colonne; il risultato dipende dal tipo di vista configurato.", + "twoColTipTitle": "Vuoi un layout fisso a due colonne invece del layout auto?", + "twoColTipBody": "Raggruppa due schede, come Sistema + VM o Archiviazione + Rete, in un horizontal-stack per mostrarle affiancate a qualsiasi larghezza:", + "twoColTipOutro": "Sul telefono la riga resta compressa. Il layout automatico HA senza horizontal-stack si adatta meglio agli schermi stretti.", + "step6Title": "6 · Automazioni", + "step6Body": "Tre automazioni per gli scenari reattivi più comuni: sostituisci notify.mobile_app_<your_phone> con il servizio di notifica che usi.", + "logoTitle": "Informazioni sul logo ProxMenux", + "logoBody": "La scheda picture-entity carica il logo ufficiale da dashboardicons.com, una raccolta gratuita per dashboard autogestite. La voce è su dashboardicons.com/icons/external/proxmenux. Home Assistant scarica lo SVG via HTTPS alla prima visualizzazione e lo memorizza nella cache.", + "logoBrokenTitle": "Se la scheda logo mostra un'immagine rotta", + "logoBrokenIntro": "Alcune installazioni, reti filtrate o blocchi dei contenuti impediscono l’accesso a jsdelivr.net durante la visualizzazione. Usa una copia locale:", + "logoBrokenSteps": [ + "Scarica la SVG da cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/proxmenux.svg.", + "Salvalo in /config/www/icons/proxmenux.svg sull’host HA.", + "Nel Lovelace YAML, sostituire l'URL image: con /local/icons/proxmenux.svg. Salvare e ricaricare — l'immagine rende dal file locale, nessun Internet necessario." + ], + "scanTipTitle": "Regola pratica per scan_interval", + "scanTipBody": "Inizia leggendo /api/system ogni 30 s. /api/health/full usa normalmente un risultato valido fino a sei minuti; leggerlo ogni 60 s non aggira la cache. Prova cinque minuti per /api/storage/summary e un’ora per /api/proxmenux/update-status. Adatta gli intervalli all’hardware e al numero di host." + }, + "grafana": { + "heading": "Prometheus + Grafana", + "promHref": "https://prometheus.io", + "grafanaHref": "https://grafana.com", + "intro": "ProxMenux Monitor espone GET /api/prometheus nel formato testuale Prometheus 0.0.4. Con autenticazione attiva serve un token Bearer. Configura Prometheus per raccogliere le metriche e Grafana per visualizzare il database di serie temporali.", + "imageAlt": "Dashboard Grafana con metriche ProxMenux: indicatore CPU, andamento memoria, numero di VM in esecuzione e traffico di rete", + "imageCaption": "Una dashboard Grafana con i dati ProxMenux raccolti da Prometheus: CPU, memoria, VM in esecuzione e traffico di rete. Il catalogo completo è in Riferimento API → Metriche Prometheus.", + "step1Title": "1 · Aggiungi il job di raccolta a Prometheus", + "step1Body": "Passa il token API tramite il blocco nativo authorization di Prometheus, che consente anche credenziali da file.", + "step1After": "Ricarica Prometheus con kill -HUP <PID> (sostituisci PID con il suo ID processo), systemctl reload prometheus se supportato o docker compose restart prometheus per il container. In Status → Targets, proxmenux dovrebbe diventare UP entro un intervallo. L’etichetta node=\"<hostname>\" distingue gli host.", + "tokenTipTitle": "Conserva il token in un file separato", + "tokenTipBody": "In produzione separa il token dalla configurazione. Con credentials_file: /etc/prometheus/secrets/proxmenux.token, Prometheus lo legge da un file con permessi 0600.", + "step2Title": "2 · Verifica la raccolta con alcune query", + "step2Body": "Prima di Grafana verifica che Prometheus abbia i dati. Apri http://<prometheus-host>:9090, scegli Query ed esegui una di queste query. Dovresti ottenere valori aggiornati dell’host Proxmox:", + "headerQuery": "Query", + "headerConfirms": "Cosa conferma", + "verifyRows": [ + { + "query": "up{job=\"proxmenux\"}", + "confirms": "Restituisce 1 se Prometheus raccoglie correttamente i dati del Monitor, altrimenti 0. Il controllo iniziale più rapido." + }, + { + "query": "proxmox_cpu_usage", + "confirms": "Uso attuale della CPU dell’host Proxmox in percentuale. Il valore dovrebbe cambiare ripetendo la query dopo alcuni secondi." + }, + { + "query": "proxmox_vms_running", + "confirms": "Numero di ospiti in esecuzione. Confronta con quello che vedi nell'UI Proxmox." + }, + { + "query": "proxmox_uptime_seconds / 86400", + "confirms": "Host uptime in giorni. Dovrebbe corrispondere al valore che si vede in uptime sulla shell Proxmox." + } + ], + "calloutTitle": "Un 401 aprendo direttamente l’URL dell’endpoint può essere normale", + "calloutBody": "Con autenticazione attiva, il collegamento in Status → Targets apre /api/prometheus nel browser senza l’intestazione Bearer di Prometheus. La risposta può contenere '{'\"error\":\"Authentication required\"'}'. Controlla il vero State: UP del target per confermare la raccolta di Prometheus.", + "step3Title": "3 · Aggiungi Prometheus come sorgente dati Grafana", + "step3Body": "In Grafana apri Connections → Data sources → Add new → Prometheus. Imposta l’URL, ad esempio http://prometheus.lan:9090, salva e prova. Se Prometheus richiede autenticazione, configurala qui separatamente. Il token del Monitor appartiene al job di raccolta Prometheus.", + "step4Title": "4 · Costruire pannelli con queste query PromQL", + "step4Body": "Una selezione iniziale delle metriche tipiche di un host Proxmox:", + "headerPanel": "Idea del pannello", + "headerPromql": "Query PromQL", + "panelRows": [ + { + "panel": "Misuratore di utilizzo CPU per host", + "promql": "proxmox_cpu_usage" + }, + { + "panel": "Misuratore di utilizzo della memoria per host", + "promql": "proxmox_memory_usage_percent" + }, + { + "panel": "Memoria utilizzata vs totale (serie temporali)", + "promql": "proxmox_memory_used_bytes / 1024 / 1024 / 1024" + }, + { + "panel": "VM/CT in esecuzione per host", + "promql": "proxmox_vms_running" + }, + { + "panel": "Temperatura CPU", + "promql": "proxmox_cpu_temperature_celsius" + }, + { + "panel": "Traffico di rete RX (byte/s)", + "promql": "rate(proxmox_interface_bytes_received_total[5m])" + }, + { + "panel": "Traffico di rete TX (byte/s)", + "promql": "rate(proxmox_interface_bytes_sent_total[5m])" + }, + { + "panel": "Media del carico (1m)", + "promql": "proxmox_load_average{period=\"1m\"}" + }, + { + "panel": "Percentuale di spazio usato per punto di montaggio", + "promql": "proxmox_disk_usage_percent" + }, + { + "panel": "Livello di carica della batteria UPS", + "promql": "proxmox_ups_battery_charge_percent" + }, + { + "panel": "Temperatura GPU per slot", + "promql": "proxmox_gpu_temperature_celsius" + } + ], + "outro": "Aggiungi ogni query come pannello Grafana, con Stat per i valori e Time series per le tendenze, e raggruppa per categoria. Usa node come variabile della dashboard (Settings → Variables → New → Query → label_values(proxmox_cpu_usage, node)) per filtrare per host." + }, + "uptimeKuma": { + "heading": "Uptime Kuma e altri controlli di stato", + "href": "https://github.com/louislam/uptime-kuma", + "intro": "Per un controllo per parola chiave usa GET /api/system-info. La route non richiede token e restituisce nome host, uptime e stato come healthy, warning o critical. È pubblica, a differenza degli endpoint di stato dettagliati protetti.", + "kumaTitle": "Uptime Kuma — Monitor di parole chiave HTTP", + "kumaSteps": [ + "In Uptime Kuma, fare clic su + Aggiungi nuovo monitor.", + "Tipo di monitor: HTTP(s) - Parola chiave.", + "Nome descrittivo: ProxMenux Monitor — pve01.", + "URL: http://pve01.lan:8008/api/system-info.", + "Parola chiave: healthy (il valore di health.status quando l'host è OK).", + "Intervallo di controllo: 60 secondi sono sufficienti.", + "Salva. La route system-info non richiede un’intestazione Bearer." + ], + "healthchecksTitle": "healthchecks.io / ping da attività cron", + "healthchecksBody": "Un’attività cron può leggere /api/system-info e verificare .health.status == \"healthy\". Solo dopo il successo invia un ping alla propria URL Healthchecks.io. Il servizio riceve ping dalle attività e non interroga il Monitor. Un HTTP 2xx da solo non dimostra che l’host sia sano.", + "richTitle": "Vuoi dati più dettagliati sullo stato?", + "richBody": "Per lo stato completo — dieci categorie, errori attivi e silenziati — usa GET /api/health/full. Restituisce in una risposta i dati della finestra della dashboard e richiede un token Bearer con autenticazione attiva." + }, + "workflows": { + "heading": "n8n, Zapier e script personalizzati", + "intro": "Workflow e script possono inviare notifiche con POST a /api/notifications/send, per esempio dopo un errore CI o un’attività troppo lunga. L’invio diretto salta coda e intervallo tra impronte degli eventi. Mantiene formato per canale, IA facoltativa e consegna. Gestisci gli eventuali duplicati nel chiamante.", + "n8nBody": "In n8n usa un nodo HTTP Request con POST, URL sopra e lo stesso JSON di curl. Scegli credenziali generiche Header Auth: nome Authorization e valore Bearer YOUR_API_TOKEN, sostituendo il segnaposto. Collega una pianificazione, webhook o altro nodo per avviare la richiesta.", + "severityBody": "La gravità usa INFO, WARNING o CRITICAL in maiuscolo. L’oggetto data fornisce contesto. L’IA usa titolo e messaggio prodotti con gli arricchimenti supportati; non tutti i campi sono garantiti nel prompt o nell’output. Vedi Notifiche → Catalogo eventi." + }, + "pveWebhook": { + "heading": "Webhook nativo Proxmox VE (in ingresso)", + "intro1": "Il sistema di notifiche risale a PVE 8.1; i target webhook nativi richiedono Proxmox VE 8.3 o successivo. Abilita notifiche nelle impostazioni tenta di registrare il Monitor come destinazione. Gli avvisi PVE instradati lì, come rapporti di backup o replica, entrano nel suo flusso di invio. La configurazione deve essere disponibile e scrivibile.", + "intro2": "Funzionamento, modello inviato da PVE, voci in /etc/pve/notifications.cfg e comportamento in cluster sono in Notifiche → Integrazione webhook PVE." + }, + "whereNext": { + "heading": "Come proseguire", + "items": [ + { + "label": "Riferimento API", + "href": "/docs/monitor/api", + "tail": " — endpoint con metodo, percorso e catalogo completo delle metriche Prometheus." + }, + { + "label": "Notifiche", + "href": "/docs/monitor/notifications", + "tail": " — fonti di eventi, canali, flusso di invio e integrazione webhook PVE." + }, + { + "label": "Assistente AI", + "href": "/docs/monitor/ai-assistant", + "tail": " — riscrittura facoltativa dei modelli in linguaggio semplice prima dell’invio a Telegram, Discord, e-mail o Gotify." + }, + { + "label": "Accesso e autenticazione", + "href": "/docs/monitor/access-auth", + "tail": " — creazione e revoca dei token API degli esempi, registro di controllo e configurazione TLS." + } + ] + } +} diff --git a/web/messages/it/docs/monitor/notifications.json b/web/messages/it/docs/monitor/notifications.json new file mode 100644 index 00000000..2db7ab04 --- /dev/null +++ b/web/messages/it/docs/monitor/notifications.json @@ -0,0 +1,535 @@ +{ + "meta": { + "title": "Notifiche Proxmox — Telegram, Discord, Email, Gotify, Pushover, Apprise | ProxMenux Monitor", + "description": "Invia notifiche Proxmox VE tramite Telegram, Discord, email, Gotify, Pushover e circa 80 servizi Apprise. Monitor unifica eventi di integrità, registro di sistema e webhook PVE, con deduplicazione, intervalli fra invii, riepiloghi, riscrittura IA facoltativa e cronologia.", + "ogTitle": "Notifiche Proxmox — Telegram, Discord, Email, Gotify, Pushover, Apprise", + "ogDescription": "Avvisi Proxmox VE sui sei canali, con servizi aggiuntivi Apprise, deduplicazione, intervalli fra invii, aggregazione e riscrittura IA facoltativa.", + "twitterTitle": "Notifiche Proxmox | ProxMenux Monitor", + "twitterDescription": "Invia avvisi Proxmox VE a Telegram, Discord, Email, Gotify, Pushover e ~80 servizi extra via Apprise." + }, + "header": { + "title": "Notifiche", + "description": "Distribuisce gli eventi raccolti da Monitor ai canali configurati: Telegram, Discord, email, Gotify, Pushover e circa 80 servizi tramite Apprise. Offre deduplicazione, intervalli fra invii, raggruppamento degli eventi ravvicinati, filtri per evento e canale, riscrittura IA facoltativa e cronologia consultabile.", + "section": "ProxMenux Monitor" + }, + "intro": { + "title": "Da dove provengono i messaggi", + "body": "Le notifiche utilizzano gli eventi già prodotti da Health Monitor, osservatori del registro e delle attività Proxmox, webhook PVE, controlli periodici e script ProxMenux. Non effettuano una scansione separata: gli eventi attraversano lo stesso processo di invio verso i canali configurati." + }, + "howItWorks": { + "heading": "Come funziona", + "intro": "Raccoglitori indipendenti producono eventi strutturati. Il processo di invio stabilisce se inviarli e in quale forma; può riscriverli con un LLM e li distribuisce ai canali configurati.", + "arrowLabel": "evento", + "caption": "Ogni tentativo effettivo di invio, riuscito o fallito, viene registrato nella cronologia SQLite. Un gruppo aggregato compare come una voce; gli eventi soppressi dall’intervallo fra invii non vengono registrati.", + "nodes": { + "sourcesLabel": "Fonti", + "sourcesDetail": "Health Monitor\nMonitor del registro\nMonitor delle attività\nWebhook PVE\nControlli periodici\nEventi interni", + "dispatchLabel": "Processo di invio", + "dispatchDetail": "Aggregazione eventi ravvicinati\nControlli impronta/intervallo\nLimiti di frequenza per gruppo\nControlli per canale", + "aiLabel": "Riscrittura con IA (facoltativa)", + "aiDetail": "OpenAI / Anthropic\nGemini / Groq\nOpenRouter / Ollama\n(disattivata inizialmente)", + "channelsLabel": "Canali", + "channelsDetail": "Telegram\nDiscord\nEmail (SMTP)\nGotify\nPushover\nApprise (~80 servizi)" + } + }, + "enabling": { + "heading": "Abilitare il pannello", + "intro": "All’inizio, la scheda Notifiche nelle Impostazioni mostra Disattivate e il pulsante Abilita notifiche. Finché non lo premi non invia messaggi né modifica la configurazione PVE.", + "disabledAlt": "Scheda Notifiche disattivata con il pulsante per abilitarla", + "disabledCaption": "Il primo stato — un clic per abilitare.", + "stepsIntro": "Premere il pulsante fa tre cose in sequenza:", + "steps": [ + "Passa allo stato Attive e mostra il modulo dei canali.", + "Registra il destinatario webhook in /etc/pve/notifications.cfg. Senza HTTPS usa POST http://127.0.0.1:8008/api/notifications/webhook; con HTTPS usa il listener HTTP locale separato sulla porta 8009. Le notifiche PVE entrano così nel processo di Monitor. Vedi Integrazione webhook PVE.", + "Avvia il thread di invio in background, che legge la coda ed elabora gli eventi." + ], + "activeAlt": "Notifiche attive: schede dei canali, nome visualizzato e sezione espandibile per la riscrittura IA", + "activeCaption": "Stato attivo: schede Telegram, Gotify, Discord, email, Pushover e Apprise, nome visualizzato, categorie per canale e sezione Avanzate: miglioramento IA." + }, + "sources": { + "heading": "Fonti di evento", + "intro": "Sei tipi di fonti alimentano le notifiche: raccoglitori in background, ricevitore webhook ed eventi interni al processo. Producono oggetti NotificationEvent strutturati.", + "headerCollector": "Raccoglitore", + "headerWatches": "Cosa controlla", + "headerEvents": "Eventi tipici", + "rows": [ + { + "collector": "Monitoraggio integrità", + "watches": "Dieci categorie, ogni 5 minuti", + "events": "new_error, error_resolved, error_escalated, health_degraded, health_persistent." + }, + { + "collector": "Monitoraggio del registro di sistema", + "watches": "Segue journalctl --follow e riconosce errori di autenticazione SSH/web, blocchi Fail2Ban se la jail è installata, errori I/O, OOM ed eventi smartd.", + "events": "auth_fail, ip_block, oom_kill, disk_io_error, service_fail." + }, + { + "collector": "Monitoraggio delle attività", + "watches": "Controlla /var/log/pve/tasks/index per trovare nuovi UPID e segue i rispettivi file di registro.", + "events": "backup_start, backup_complete, backup_warning, backup_fail, migration_*, snapshot_complete." + }, + { + "collector": "Webhook Proxmox", + "watches": "Riceve POST /api/notifications/webhook. Le versioni PVE con destinatari webhook possono inoltrare qui le notifiche dopo la configurazione; vedi sotto.", + "events": "Qualsiasi cosa emette PVE — compresi gli eventi che il Monitor altrimenti perderebbe (HA, replica, vzdump dalla GUI)." + }, + { + "collector": "Collettore di polling", + "watches": "Confronti periodici: nodi del cluster disponibili, scadenza certificati, assegnazione GPU e aggiornamenti PVE/ProxMenux.", + "events": "node_disconnect, node_reconnect, pve_update, proxmenux_update, gpu_mode_switch, pci_passthrough_conflict." + }, + { + "collector": "Emettitori di processo", + "watches": "Chiamate dirette da ProxMenux scripts e dal Monitor stesso (notification_manager.emit_event(...)).", + "events": "system_startup, system_shutdown, system_reboot, ai_model_migrated, eventi di test personalizzati." + } + ], + "after1": "Ogni evento ha un event_type stabile, una severity (INFO, WARNING, CRITICAL), una category per emoji e filtri e dati data per il modello, come vmid, device, source_ip e reason.", + "after2": "Il modello di ciascun event_type in notification_templates.py produce il testo inviato. La riscrittura IA facoltativa usa questo testo. La pagina Assistente IA spiega l’interazione fra modello e riscrittura." + }, + "channels": { + "heading": "Configurazione dei canali", + "intro": "Sei canali sono attualmente supportati: Telegram, Discord, Gotify, Email (SMTP), Pushover e Apprise. I primi cinque sono integrazioni native con i propri campi di configurazione. Apprise è un hub generico che aggiunge circa 80 servizi aggiuntivi (ntfy, Matrix, Slack, Teams, Pushbullet, AWS SNS, Mattermost...) attraverso un unico campo URL. Sono tutti documentati passo dopo passo.", + "credsTitle": "Dove sono salvate le credenziali", + "credsBody": "Token, chiavi, URL webhook e password SMTP vengono memorizzati localmente nel database SQLite del Monitor sotto /usr/local/share/proxmenux/. I valori sensibili sono protetti e mascherati nell'interfaccia. Non lasciano mai l'host tranne che per raggiungere i loro rispettivi servizi. Un backup di quella directory è sufficiente per recuperare i canali configurati." + }, + "telegram": { + "heading": "Telegram", + "intro": "Servono un token del bot, riutilizzabile fra chat, e un ID chat, che identifica conversazione privata, gruppo o supergruppo. La guida integrata spiega i passaggi; seguono i formati di destinazione.", + "guideAlt": "Finestra della guida alla configurazione di un bot Telegram, con quattro sezioni numerate: creazione del bot con BotFather, recupero del token del bot, recupero del proprio ID chat e configurazione per gruppi o canali", + "guideCaption": "Il collegamento + guida alla configurazione nella scheda Telegram apre la finestra con i quattro passaggi per configurare il canale.", + "step1Title": "1 · Creare un bot con BotFather", + "step1Items": [ + "Aprire Telegram e avviare una chat con @BotFather (quello con la spunta di verifica blu — le copie sono comuni).", + "Invia /newbot.", + "Scegli un nome di visualizzazione (ad es. ProxMenux Lab). Può essere cambiato più tardi.", + "Scegli un nome utente univoco in Telegram che finisca in bot, per esempio proxmenux_lab_bot.", + "BotFather risponde con il token, per esempio 123456789:ABCdef…. Trattalo come una password." + ], + "step2Title": "2 · Ottieni l'ID Chat", + "step2Intro": "L’ID chat indica dove invia il bot. Il formato dipende dalla destinazione.", + "privateLabel": "chat privata (ricevi gli avvisi sul tuo account):", + "privateItems": [ + "Inizia una chat con il tuo nuovo bot e invia qualsiasi messaggio (ad es. /start).", + "Aprire una chat con @userinfobot (o @myidbot) e inviare /start. Risponde con il tuo ID utente numerico — questo è l'ID Chat. È un numero positivo." + ], + "privateAlt": "Modulo Telegram con token nascosto, ID chat positivo e ID argomento facoltativo vuoto", + "privateCaption": "chat privata con il bot — Chat ID è un numero positivo (il tuo ID utente personale).", + "groupLabel": "Gruppo o supergruppo con argomenti:", + "groupItems": [ + "Aggiungi il bot al gruppo; rendilo amministratore solo se necessario per inviare messaggi.", + "Invia qualsiasi messaggio nel gruppo.", + "Aprire https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates in un browser. Cercare chat.id nella risposta JSON — per i gruppi è un numero negativo, per i supergruppi inizia con -100.", + "Nei supergruppi con Argomenti, annota anche il message_thread_id della destinazione e inseriscilo nel campo facoltativo ID argomento." + ], + "groupAlt": "Modulo Telegram per un supergruppo: token nascosto, ID chat negativo con prefisso -100 e ID argomento 3", + "groupCaption": "Supergruppo: l’ID chat inizia con -100…; ID argomento seleziona una conversazione specifica.", + "step3Title": "3 · Salva e prova", + "step3Body": "Inserisci token e ID chat, salva e premi Invia prova. Se non arriva, consulta la cronologia per l’errore: token non valido, bot assente dal gruppo o bloccato, ecc." + }, + "discord": { + "heading": "Discord", + "intro": "I canali Discord accettano messaggi in arrivo tramite un Webhook URL legato ad un singolo canale. Il Monitor ha bisogno di quell'URL e nient'altro.", + "items": [ + "In Discord apri il server e vai a Impostazioni del server → Integrazioni → Webhook.", + "Premi Nuovo webhook, assegna un nome come ProxMenux e scegli il canale. L’avatar è facoltativo.", + "Premi Copia URL webhook: il formato è https://discord.com/api/webhooks/<id>/<token>.", + "Incollalo nel campo URL Webhook della scheda Discord nel pannello delle notifiche e salva." + ], + "imageAlt": "Modulo canale Discord con campo URL Webhook a partire da https://discord.com/api/webhooks/", + "imageCaption": "Discord: copia l’URL da Impostazioni del server → Integrazioni → Webhook." + }, + "gotify": { + "heading": "Gotify", + "intro": "Gotify è un server di notifiche push ospitato da te. Servono il suo URL e un token applicazione generato nell’interfaccia amministrativa.", + "items": [ + "Se non hai già un Gotify istanza, installarne uno — vedi guida di installazione ufficiale.", + "Accedi a Gotify come amministratore, apri Applicazioni → Crea applicazione, chiamala ProxMenux e copia il token.", + "Nella scheda Gotify del pannello Notifiche, impostare Server URL all'URL di base dell'istanza (ad es. https://gotify.example.com) e incollare il Token App.", + "Salva e premi Invia prova." + ], + "imageAlt": "Modulo canale Gotify con campo URL Server impostato su https://gotify.example.com e un campo App Token con segnaposto A_valid_gotify_token", + "imageCaption": "Gotify — URL del server dell'istanza self-hosted più il Token App dall'interfaccia utente di amministrazione Gotify." + }, + "email": { + "heading": "Posta elettronica (SMTP)", + "intro": "Per l’email servono server SMTP, porta, modalità TLS, eventuali credenziali, indirizzo mittente e almeno un destinatario.", + "imageAlt": "Modulo email: server SMTP, porta, TLS, utente, password, mittente, destinatari separati da virgola e prefisso oggetto", + "imageCaption": "Configura server SMTP, porta e TLS, eventuali credenziali, mittente, destinatari separati da virgola e prefisso dell’oggetto per filtrare gli avvisi.", + "appNote": "Monitor usa autenticazione SMTP con password. Gmail può richiedere una password per app. Per Microsoft dipende dal servizio e dalle regole del tenant: una password per app non aggira il blocco dell’autenticazione Basic. Verifica il metodo consentito.", + "gmailTitle": "password dell'app Gmail", + "gmailIntro": "Le password per app Gmail richiedono verifica in due passaggi attiva. Senza questa, la pagina Password per le app non è disponibile.", + "gmailItems": [ + "Apri myaccount.google.com/security e attiva Verifica in due passaggi.", + "Vai a myaccount.google.com/apppasswords.", + "Inserisci un nome, per esempio ProxMenux, premi Crea e copia la password di 16 caratteri.", + "Imposta Server smtp.gmail.com, Porta 587, Modalità TLS STARTTLS, Nome utente con l’indirizzo Gmail e Password con i 16 caratteri generati." + ], + "outlookTitle": "Microsoft / password app Outlook", + "outlookIntro": "Microsoft richiede verifica in due passaggi per le password per app, ma ciò non garantisce compatibilità SMTP. Se il servizio o tenant impone OAuth2, il client SMTP di Monitor basato su password non può autenticarsi. Usa un relay con l’autenticazione richiesta a monte.", + "outlookItems": [ + "Apri account.microsoft.com/security e attiva la verifica in due passaggi.", + "Se disponibile, apri Opzioni di sicurezza avanzate → Password per le app → Crea una nuova password per app. La sua presenza non prova che il servizio accetti SMTP con password.", + "Se Microsoft genera una password per app, copiala e verifica che il servizio SMTP la accetti.", + "Solo se è consentito SMTP con password, usa i parametri approvati: Server smtp.office365.com per Exchange Online, Porta 587, Modalità TLS STARTTLS, Nome utente con l’indirizzo email e Password con la credenziale consentita. Outlook.com personale ha requisiti differenti; non presumere che funzioni." + ], + "relayTitle": "Relay SMTP gestito da te", + "relayBody": "Puoi usare un relay SMTP sotto il tuo controllo, come Postfix, che gestisca l’autenticazione a monte. Imposta credenziali e TLS di Monitor in base al relay: usare un relay locale non disattiva di per sé la cifratura." + }, + "pushover": { + "heading": "Pushover", + "intro": "Pushover è un servizio push per iOS, Android e browser desktop. Il canale ProxMenux usa direttamente l’API Pushover, senza richiedere un URL Apprise.", + "stepsTitle": "Impostazione", + "steps": [ + "Crea un account Pushover, installa l'app ufficiale sui dispositivi che devono ricevere avvisi e accedere.", + "Copia la chiave utente dal pannello Pushover. Usa una chiave di gruppo se più persone o dispositivi devono ricevere lo stesso avviso.", + "Apri Crea applicazione/token API, crea ProxMenux e copia il token API di 30 caratteri.", + "In Impostazioni → Notifiche → Pushover inserisci chiave utente/gruppo e token API. Dispositivo e suono sono facoltativi.", + "Salva e premi Invia prova. Verifica la ricezione nell’app Pushover." + ], + "priorityTitle": "Corrispondenza delle priorità", + "priorityBody": "Normalmente usa priorità Pushover 0. Con Alta priorità per avvisi critici, gli eventi CRITICAL usano 1 e superano il silenzio configurato dall’utente in Pushover. Non usa la priorità di emergenza 2, che richiederebbe ripetizioni e conferma di ricezione.", + "secretTitle": "Proteggere entrambi i valori", + "secretBody": "Chiave utente/gruppo e token API autorizzano entrambi gli invii. ProxMenux li protegge e li nasconde nell’interfaccia; non pubblicarli in schermate o registri di assistenza." + }, + "apprise": { + "heading": "Apprise: accesso a circa 80 servizi", + "intro": "Apprise è una libreria open source che integra circa 80 servizi tramite URL. Il canale permette di raggiungere ntfy, Matrix, Slack, Microsoft Teams, Mattermost, Pushbullet, AWS SNS, Pushsafer, Rocket.Chat, Signal API e altri senza un’integrazione ProxMenux dedicata. Supporta anche Pushover, che dispone però di una scheda nativa più semplice per un solo destinatario.", + "listIntro": "L'elenco completo dei servizi supportati e l'esatto formato URL per ciascuno è disponibile nella documentazione ufficiale Apprise:", + "listItems": [ + "Documentazione dei servizi Apprise: indice completo dei servizi supportati.", + "Nozioni di base sugli URL: struttura degli URL Apprise." + ], + "stepsTitle": "Passi", + "steps": [ + "Scegli il servizio nella wiki Apprise e copia il suo modello URL. La pagina indica schema (ntfy://, matrix://, pover://, slack://…), token, canali e nomi host necessari.", + "Compila i segnaposto con le tue credenziali. Ad esempio, un argomento ntfy.sh sembra ntfy://ntfy.sh/my-topic; un URL Pushover assomiglia a pover://user@token; un URL Matrix assomiglia a matrix://user:pass@host:port/#room.", + "Incolla l'URL finale nel campo Apprise URL nella scheda Apprise del pannello Notifiche e salva.", + "Premi Invia prova per verificare raggiungibilità e credenziali." + ], + "deliveredTitle": "Cosa viene consegnato", + "deliveredBody": "Apprise riceve titolo, testo e gravità (info/success/warning/failure), convertita nel formato del servizio: icona, priorità o colore. Formattazione e riscrittura IA avvengono prima dell’invio, come negli altri canali.", + "fanoutTitle": "Un URL per canale Apprise", + "fanoutBody": "Monitor accetta un URL Apprise. Per distribuire a più servizi, per esempio ntfy.sh e Matrix, puoi usare un server API Apprise con configurazione per tag: Monitor chiama il suo endpoint e il server distribuisce ai destinatari del tag." + }, + "rich": { + "heading": "Messaggi formattati, categorie e filtri per canale", + "intro": "Ogni canale offre Messaggi formattati, undici Categorie di notifica espandibili con interruttori per evento e Invia prova in fondo.", + "imageAlt": "Categorie di notifica con formattazione, gruppi VM/CT, backup, risorse, archiviazione, rete, sicurezza, cluster, servizi, Health Monitor e aggiornamenti, contatori e pulsante di prova", + "imageCaption": "La freccia indica Messaggi formattati del canale. Sotto ci sono undici categorie con opzioni per evento e Invia prova.", + "richTitle": "Messaggi formattati", + "richIntro": "Con Messaggi formattati, il titolo include l’emoji della categoria e il testo usa la formattazione del canale, come HTML Telegram o riquadro Discord con colore di gravità. Disattivandolo si invia lo stesso contenuto come testo semplice.", + "plainHeader": "Testo semplice: formattazione disattivata", + "richHeader": "Formattato: formattazione attiva", + "richOutro": "L’opzione è indipendente per canale: per esempio email semplice e Telegram/Discord formattati. I canali senza formattazione in linea, come email semplice e Gotify, ricevono comunque testo.", + "togglesTitle": "Categorie per evento", + "togglesIntro": "Ogni canale controlla indipendentemente categorie e singoli eventi. Disattivare una categoria sopprime i suoi eventi in quel canale; le opzioni individuali valgono nelle categorie attive. Non esiste un filtro globale principale degli eventi nel processo di invio.", + "togglesItems": [ + "Categoria per canale. Disattivare VM/CT sopprime vm_start e gli eventi correlati del canale. Le preferenze sono in <channel>.events.<group>.", + "Evento per canale. In una categoria attiva puoi inviare backup_complete a Discord ma non a Telegram. La preferenza è in <channel>.event.<event_type>." + ], + "togglesOutro": "Ogni categoria mostra eventi attivi/totali e un interruttore per attivarli o disattivarli insieme, per esempio backup info o aggiornamenti, senza aprire la sezione." + }, + "quiet": { + "heading": "Orario silenzioso", + "intro": "In questa fascia oraria del canale passano subito solo eventi CRITICAL. INFO, WARNING e azioni vengono salvati e inviati in un unico riepilogo alla fine della fascia.", + "imageAlt": "Impostazioni del canale: orario silenzioso 22:00–07:00 con anteprima della transizione e riepilogo giornaliero alle 09:00; la nota su CRITICAL/WARNING riguarda il riepilogo", + "imageCaption": "Orario silenzioso in alto e riepilogo giornaliero sotto, indipendenti per ogni canale.", + "purposeTitle": "A cosa serve", + "purposeItems": [ + "Niente avvisi di aggiornamento alle 03:00. La fascia silenziosa rinvia le notifiche INFO, come backup riusciti e aggiornamenti.", + "Le urgenze restano immediate. Solo gli eventi effettivamente CRITICAL superano l’orario silenzioso. Il nome non basta: il monitor del registro emette blocchi Fail2Ban e avvisi di spegnimento/riavvio come INFO, quindi possono attendere.", + "I messaggi restano salvati. Gli eventi rinviati rimangono nel buffer SQLite fino alla fine della fascia." + ], + "howTitle": "Come funziona", + "howItems": [ + "Opzione per canale. Telegram può restare silenzioso 22:00–07:00 mentre l’email continua gli invii 24/7.", + "Ora iniziale e finale nel fuso orario locale: inizio incluso e fine esclusa. Può attraversare mezzanotte, per esempio 22:00–07:00.", + "Anteprima in tempo reale: mostra se la fascia è attiva e quando cambierà stato.", + "Durante la fascia: CRITICAL continua l’invio normale. INFO e WARNING vanno nel buffer persistente quiet_pending del database SQLite.", + "Quando la finestra si chiude: viene inviata una singola notifica raggruppata con tutto ciò che si accumula: una linea per evento bufferizzato, in ordine cronologico. Il buffer viene sgomberato solo dopo che il canale conferma la consegna, quindi un'interruzione Telegram / SMTP transitoria non perde il contesto della notte.", + "Dopo un riavvio. Il buffer resta su disco. Se Monitor riparte dopo la chiusura della fascia, il ciclo successivo recupera le righe pendenti in un riepilogo." + ], + "criticalTitle": "Quali eventi sono CRITICAL", + "criticalBody": "La fonte assegna la gravità a ogni evento. Un evento disco, spegnimento o sicurezza non è automaticamente CRITICAL. Il monitor del registro emette ip_block, system_shutdown e system_reboot come INFO. Il Catalogo eventi elenca i tipi; verifica la gravità effettiva nell’evento ricevuto e nel produttore." + }, + "digest": { + "heading": "Riepilogo giornaliero eventi INFO", + "intro1": "Il riepilogo giornaliero è facoltativo: raccoglie eventi INFO idonei, come aggiornamenti disponibili, e li invia alle 09:00 o all’ora scelta. Risultati di backup/replica e azioni immediate ne sono esclusi. L’orario silenzioso rinvia invece i messaggi non critici in una fascia quotidiana.", + "intro2": "Si trova sotto l’orario silenzioso nella stessa scheda del canale; vedi Orario silenzioso. Le due funzioni si attivano indipendentemente.", + "purposeTitle": "A cosa serve", + "purposeItems": [ + "Un riepilogo al mattino. Se controlli l’host una volta al giorno, puoi leggere alle 09:00 un unico riepilogo invece di 20 notifiche separate.", + "Separare informazioni e urgenze. Il riepilogo raccoglie gli eventi INFO idonei; CRITICAL e WARNING non attendono il riepilogo." + ], + "howTitle": "Come funziona", + "howItems": [ + "Attivazione per canale. Disattivato inizialmente. Attivalo solo sui canali dove desideri un riepilogo; gli altri mantengono gli invii immediati.", + "Ora di invio nel fuso locale, inizialmente 09:00. Puoi cambiarla; il processo invia entro circa 60 secondi dal minuto impostato.", + "Nel riepilogo: eventi generici idonei di livello INFO, come aggiornamenti applicazioni, aggiornamenti Tailscale, aggiornamenti ottimizzazioni ProxMenux, aggiornamenti di sicurezza APT e avvisi di limite di frequenza. Risultati backup e altre azioni escluse restano immediati.", + "Che cosa non è mai ritardato:", + "Persistenza. Gli eventi restano in SQLite, nella tabella digest_pending, fino all’ora scelta e sopravvivono ai riavvii di Monitor.", + "Nessun evento, nessun riepilogo. Non invia messaggi vuoti quando non ci sono eventi INFO da riepilogare." + ], + "neverDelayedSub": [ + "Gli eventi CRITICAL vanno sempre attraverso immediatamente.", + "Gli eventi WARNING passano sempre immediatamente.", + "Avvio, arresto, spegnimento, riavvio ed errori VM/CT, avvio e risultati backup, risultati replica, spegnimento e riavvio host non entrano nel riepilogo, anche se INFO. L’orario silenzioso può comunque rinviare quelli non critici." + ], + "comboTitle": "Combinare orario silenzioso e riepilogo giornaliero", + "comboBody": "Puoi attivare entrambi: silenzio 22:00–07:00 e riepilogo 09:00. I messaggi non critici durante il silenzio escono nel riepilogo delle 07:00; gli INFO idonei fuori fascia entrano in quello giornaliero. CRITICAL supera entrambi; WARNING supera il riepilogo ma attende nel silenzio. Scegli una fascia silenziosa, un riepilogo a orario fisso o entrambi." + }, + "displayName": { + "heading": "Nome visualizzato", + "intro": "Il nome visualizzato identifica l’host di origine. Compare nei messaggi formattati, per esempio 🏠 home-lab, e nel prefisso dell’oggetto email.", + "imageAlt": "Mostra il campo Nome con il valore amd indicato come esempio, etichetta Nome mostrato nelle notifiche - modifica per personalizzare o lasciare vuoto per utilizzare il nome host del sistema", + "imageCaption": "Lascia il campo vuoto per usare il nome host oppure inserisci un’etichetta personalizzata.", + "outro": "Se il campo è vuoto, il Monitor ritorna al nome host del sistema. L'override è per lo più utile quando si esegue diversi host ProxMenux che inviano alla stessa chat o casella di posta elettronica Telegram — un'etichetta più amichevole (home-lab, office-pve) è più facile da leggere rispetto a pve01.lan o pmx-prod-01." + }, + "dispatch": { + "heading": "Processo di invio", + "intro": "La tabella descrive tre meccanismi correlati. Il flusso reale inizia con l’aggregazione degli eventi ravvicinati, poi controlli di invio/intervallo, limiti per gruppo, formattazione e controlli per canale.", + "headerStage": "Fase", + "headerWhat": "Che cosa fa", + "headerTunable": "Configurabile?", + "rows": [ + { + "stage": "Deduplicazione per impronta", + "what": "Calcola un’impronta dell’evento (event_type + key fields from data). Impronte identiche ravvicinate sono considerate duplicati.", + "tunable": "No — logica interna del dispacciatore." + }, + { + "stage": "Intervallo fra invii", + "what": "Dopo un invio riuscito, sopprime le ripetizioni e salva lo stato in notification_last_sent. Valori base: 86 400 s per CRITICAL, WARNING, INFO, resources e updates. Eccezioni: 5 s per azioni VM/CT e spegnimento/riavvio host, 10 s per risultati backup/replica, 1 800–3 600 s per varie categorie di integrità. Impostazioni esplicite per evento/gruppo prevalgono.", + "tunable": "Sì: le impostazioni esplicite dell’intervallo per evento o gruppo sostituiscono i valori predefiniti del processo di invio." + }, + { + "stage": "Aggregazione eventi ravvicinati", + "what": "Più eventi dello stesso tipo in un intervallo breve, come tentativi SSH ripetuti, vengono uniti in un messaggio burst_* con conteggio ed esempio.", + "tunable": "No: finestra e soglia sono definite nel codice per tipo di evento." + } + ], + "calloutTitle": "Gli invii avvengono in background", + "calloutBody": "Un thread dedicato elabora gli invii. La richiesta HTTP che produce l’evento termina quando lo mette in coda, senza attendere Telegram, SMTP o webhook. Il risultato di ogni invio viene registrato nella cronologia." + }, + "aiRewrite": { + "heading": "Riscrittura IA facoltativa", + "body1": "Gli eventi idonei possono essere riscritti da un LLM. I risultati backup (backup_complete e backup_fail) sono esclusi. IA è disattivata inizialmente e, se attiva, lavora nel thread di invio. Se la chiamata fallisce o scade, usa il testo originale del modello.", + "body2": "Sei fornitori: OpenAI, Anthropic, Google Gemini, Groq, OpenRouter e Ollama. Ogni canale sceglie dettaglio (brief, standard, detailed), lingua, modalità del prompt (default/custom) e prompt personalizzato. Vedi Assistente IA per configurazione ed esempi.", + "privacyTitle": "Nota sulla privacy", + "privacyBody": "Le richieste IA possono includere titolo, gravità, testo, prompt e contesto: nomi host, IP, utenti, errori e righe del registro. Vanno all’endpoint scelto. Ollama resta locale solo con server e modello entrambi locali; server remoti o modelli cloud inviano dati fuori dall’host. Per mantenerli nella rete, disattiva la riscrittura o usa endpoint e modello locali controllati." + }, + "pveWebhook": { + "heading": "Integrazione PVE webhook", + "intro1": "Proxmox dispone di destinatari sendmail, Gotify, SMTP e webhook dove supportato. Abilitare le notifiche Monitor registra un destinatario webhook. Gli eventi PVE, come HA, replica e report backup GUI, possono così usare lo stesso processo di invio.", + "intro2": "L'obiettivo è visibile dalla GUI Proxmox a Datacenter → Notifiche → Obiettivi di notifica:", + "imageAlt": "Webhook Proxmox con destinatario proxmenux-webhook, metodo POST, URL locale 8008 e modello JSON con escape dei valori e campi json", + "imageCaption": "L'obiettivo PVE-side webhook come Proxmox lo vede (la GUI è nel locale configurato dell'host — lo spagnolo in questo esempio). Gli stessi campi si applicano in qualsiasi lingua.", + "registeredIntro": "Cosa viene registrato:", + "registeredItems": [ + "Metodo e URL. POST http://127.0.0.1:8008/api/notifications/webhook senza HTTPS Monitor. Con HTTPS usa il listener HTTP locale separato sulla porta 8009. Entrambi restano sullo stesso host.", + "Modello del corpo. Usa gli helper Handlebars di PVE. PVE lo salva codificato in base64; il contenuto JSON è:", + "Matcher. Un compagno blocco matcher: proxmenux-matcher con mode all così ogni notifica PVE raggiunge l'obiettivo.", + "Configurazione privata. Crea il blocco webhook: proxmenux-webhook in /etc/pve/priv/notifications.cfg con il segreto condiviso in base64. Il destinatario pubblico lo usa per X-Webhook-Secret. Il blocco non è vuoto." + ], + "securityTitle": "Come il ricevitore è protetto", + "securityIntro": "Il ricevitore webhook a POST /api/notifications/webhook applica diversi livelli di sicurezza a seconda di dove proviene la richiesta:", + "securityItems": [ + "Fonti locali (127.0.0.1/::1). Applica limiti di frequenza, saltando controlli remoti su segreto, timestamp e ripetizioni. Anche gli indirizzi assegnati alle interfacce dell’host sono considerati locali. Il destinatario PVE automatico usa loopback.", + "Richieste remote. Oltre ai limiti, verifica il segreto X-Webhook-Secret, il timestamp in X-ProxMenux-Timestamp o JSON, le ripetizioni e l’eventuale lista IP. Il segreto è in SQLite e viene copiato in base64 in /etc/pve/priv/notifications.cfg per l’intestazione PVE." + ], + "practiceTitle": "In pratica", + "practiceBody": "PVE usa http://127.0.0.1:8008 senza HTTPS, oppure HTTP 8009 con HTTPS Monitor. Per chiamare https://<monitor-host>:<port>/api/notifications/webhook dall’esterno, invia X-Webhook-Secret e timestamp attuale e rispetta controlli IP e ripetizioni. Il solo segreto non basta.", + "actionsIntro": "Il Monitor gestisce questo obiettivo attraverso tre azioni nella scheda Impostazioni:", + "actionsItems": [ + "Setup — viene eseguito automaticamente quando si abilitano le notifiche. Crea l'ingresso in /etc/pve/notifications.cfg. Il file è scritto solo quando il suo contenuto deve cambiare, e una copia del precedente è conservata in /usr/local/share/proxmenux/backups/pve-notifications/ (le tre più recenti). Nulla è scritto mentre /etc/pve non è montato: un Monitor che inizia durante un riavvio di pve-cluster registra l'ingresso una volta tornato.", + "Pulizia: rimuove la voce e conserva il backup precedente.", + "Leggi configurazione: mostra destinatari e regole PVE correnti, per verificare il percorso effettivo quando sono configurati più invii." + ], + "clusterTitle": "Nodi di cluster", + "clusterBody": "/etc/pve/ è condiviso nel cluster, inclusi URL e segreto. Ogni nodo chiama il proprio listener: 127.0.0.1:8008 senza HTTPS o HTTP 8009 con HTTPS. Esegui Monitor su ogni nodo interessato e mantieni il destinatario condiviso coerente con tutti i listener." + }, + "catalogue": { + "heading": "Catalogo eventi", + "intro": "Circa settanta tipi di eventi sono raggruppati in undici categorie UI. Il pannello Notifiche rende una sezione pieghevole per gruppo con una toggle per ogni evento al suo interno. Ogni evento è attivato per impostazione predefinita se non esplicitamente contrassegnato altrimenti.", + "headerGroup": "Gruppo", + "headerEvents": "Eventi", + "rows": [ + { + "group": "VM/CT", + "events": "vm_start, vm_start_warning, vm_stop, vm_shutdown, vm_fail, vm_restart, oltre agli equivalenti ct_*, migration_start, migration_complete, migration_warning, migration_fail, replication_complete, replication_fail." + }, + { + "group": "Backup", + "events": "backup_start, backup_complete, backup_warning, backup_fail, snapshot_complete, snapshot_fail." + }, + { + "group": "Risorse", + "events": "cpu_high, ram_high, temp_high, load_high." + }, + { + "group": "Archiviazione", + "events": "disk_space_low, disk_io_error, storage_unavailable, smart_test_complete, smart_test_failed." + }, + { + "group": "Rete", + "events": "network_down, network_latency." + }, + { + "group": "Sicurezza", + "events": "auth_fail, ip_block, firewall_issue, user_permission_change." + }, + { + "group": "Cluster", + "events": "split_brain, node_disconnect, node_reconnect." + }, + { + "group": "Servizi", + "events": "system_startup, system_shutdown, system_reboot, system_problem, service_fail, oom_kill, system_mail." + }, + { + "group": "Monitoraggio integrità", + "events": "new_error, error_resolved, error_escalated, health_degraded, health_persistent, health_issue_new, health_issue_resolved." + }, + { + "group": "Aggiornamenti", + "events": "update_summary, update_available, pve_update, update_complete, proxmenux_update." + }, + { + "group": "Hardware / GPU", + "events": "gpu_mode_switch, gpu_passthrough_blocked, pci_passthrough_conflict, ai_model_migrated." + } + ], + "burstNote": "Gli eventi aggregati burst_*, come burst_auth_fail, burst_ip_block e burst_disk_io, sostituiscono più eventi con un riepilogo. Non hanno interruttori propri: ereditano lo stato dell’evento di origine.", + "backupResults": { + "heading": "Risultati di backup", + "intro": "La notifica descrive il risultato del backup riportato da Proxmox. Il risultato determina titolo, icona dei Messaggi formattati e riga di stato nell’email.", + "headerIcon": "Icon", + "headerResult": "Risultato", + "headerWhen": "Quando", + "rows": [ + { + "icon": "💾✅", + "result": "Backup completato", + "when": "Tutti i guest sono terminati e il report non contiene avvisi." + }, + { + "icon": "💾⚠️", + "result": "Backup completato con avvisi", + "when": "Ogni ospite ha finito e il rapporto porta almeno una linea di avvertimento." + }, + { + "icon": "💾❌", + "result": "Errore di backup segnalato", + "when": "Un guest è fallito o il processo è terminato con errore." + }, + { + "icon": "💾❔", + "result": "Esito di backup non confermato", + "when": "Il rapporto è incompleto o non dichiara un risultato per ogni ospite." + } + ], + "items": [ + "Il titolo identifica il processo. Include archiviazione e, con un solo guest, tipo, nome e ID. Se fallisce, identifica il guest coinvolto.", + "Il corpo elenca ogni ospite con il proprio risultato, dimensione, durata e archivio, seguito da una linea con i totali del lavoro.", + "Avvisi ed errori compaiono una sola volta. La causa principale è prima. Oltre otto righe, conta le altre in fondo; restano nel registro attività Proxmox.", + "Se fallisce prima del primo guest, mostra il motivo riportato da Proxmox, per esempio archiviazione inesistente.", + "I riepiloghi preservano il risultato. Nel riepilogo dell’orario silenzioso, il backup mantiene la propria icona. I risultati backup non entrano nel riepilogo giornaliero." + ] + } + }, + "history": { + "heading": "Cronologia", + "body1": "Ogni tentativo effettivo è registrato in notification_history: data sent_at, canale, evento, gravità, titolo, testo, esito success ed eventuale error_message. Un gruppo aggregato compare come una riga burst_*. Gli eventi soppressi dall’intervallo fra invii non generano tentativi né righe.", + "body2": "Impostazioni → Notifiche include la sezione Cronologia notifiche, inizialmente chiusa, con gli ultimi 20 invii, esito, canale, data, errore e risultato dei riepiloghi. Non offre cancellazione: Audit e report legge la stessa cronologia per verificare gli invii.", + "body3": "Gli stessi dati sono esposti a GET /api/notifications/history con parametri di query opzionali limit, offset, severity e channel e possono essere cancellati con DELETE /api/notifications/history." + }, + "api": { + "heading": "Endpoint API", + "headerEndpoint": "Endpoint", + "headerMethod": "Metodo", + "headerUse": "Usa", + "rows": [ + { + "endpoint": "/api/notifications/settings", + "method": "GET / POST", + "use": "Legge o salva configurazione di canali, eventi, riscrittura IA e nome visualizzato." + }, + { + "endpoint": "/api/notifications/test", + "method": "POST", + "use": "Invia una notifica di prova a un canale: '{'\"channel\":\"telegram\"'}'." + }, + { + "endpoint": "/api/notifications/test-ai", + "method": "POST", + "use": "Genera e riscrive un evento di esempio senza inviarlo." + }, + { + "endpoint": "/api/notifications/provider-models", + "method": "POST", + "use": "Elenca i modelli disponibili per il fornitore AI selezionato." + }, + { + "endpoint": "/api/notifications/send", + "method": "POST", + "use": "Emettere un evento dall'esterno (integrazione personalizzata)." + }, + { + "endpoint": "/api/notifications/history", + "method": "GET / DELETE", + "use": "Leggi la storia con i filtri; cancellala." + }, + { + "endpoint": "/api/notifications/webhook", + "method": "POST", + "use": "Riceve notifiche Proxmox. Gli indirizzi locali saltano i controlli remoti ma hanno limiti di frequenza. Per richieste remote verifica X-Webhook-Secret, timestamp in X-ProxMenux-Timestamp o JSON, ripetizioni ed eventuale lista IP." + }, + { + "endpoint": "/api/notifications/proxmox/setup-webhook", + "method": "POST", + "use": "Registrare il Monitor come obiettivo in /etc/pve/notifications.cfg." + }, + { + "endpoint": "/api/notifications/proxmox/cleanup-webhook", + "method": "POST", + "use": "Rimuovere l'obiettivo Monitor dalla configurazione di notifica di PVE." + }, + { + "endpoint": "/api/notifications/proxmox/read-cfg", + "method": "GET", + "use": "Mostra la configurazione di notifica PVE corrente come PVE lo vede." + } + ] + }, + "whereNext": { + "heading": "Prossime letture", + "items": [ + { + "label": "Assistente AI", + "href": "/docs/monitor/ai-assistant", + "tail": " — fornitori, modelli, modalità del prompt, lingue e dettaglio per canale." + }, + { + "label": "Monitoraggio integrità", + "href": "/docs/monitor/health-monitor", + "tail": "— il più grande produttore unico di eventi, con le proprie durate di soppressione per categoria." + }, + { + "label": "Architettura", + "href": "/docs/monitor/architecture", + "tailRich": " — collocazione delle tabelle SQLite notification_last_sent, notification_history e del thread di invio nell’architettura Monitor." + }, + { + "label": "Accesso e autenticazione", + "href": "/docs/monitor/access-auth", + "tailRich": " — generazione di token API per gli script che chiamano /api/notifications/send." + }, + { + "label": "Dashboard → Log di sistema", + "href": "/docs/monitor/dashboard/system-logs", + "tail": " — visualizzazione in tempo reale del registro usato dal relativo monitor." + } + ] + } +} diff --git a/web/messages/pt/docs/monitor/access-auth.json b/web/messages/pt/docs/monitor/access-auth.json new file mode 100644 index 00000000..596573f4 --- /dev/null +++ b/web/messages/pt/docs/monitor/access-auth.json @@ -0,0 +1,396 @@ +{ + "meta": { + "title": "Autenticação do painel Proxmox — 2FA, tokens API, perfil, proxy inverso | ProxMenux Monitor", + "description": "Acesso e proteção do ProxMenux Monitor: configuração inicial, palavra-passe com nome e avatar, perfil, TOTP 2FA, tokens API para scripts, HTTPS, exemplos Nginx/Caddy/Traefik, registo de auditoria e jail Fail2Ban opcional.", + "ogTitle": "Autenticação Proxmox — 2FA, tokens API, proxy inverso", + "ogDescription": "Proteja o ProxMenux Monitor com palavra-passe, TOTP 2FA, tokens API, HTTPS, exemplos de proxy inverso e jail Fail2Ban opcional.", + "twitterTitle": "Autenticação do painel Proxmox | ProxMenux Monitor", + "twitterDescription": "Senha + TOTP 2FA, API tokens, HTTPS, Nginx/Caddy/Traefik snippets e log de auditoria." + }, + "header": { + "title": "Acesso e autenticação", + "description": "Acesso ao painel, primeiro arranque e camadas de proteção: palavra-passe e TOTP, sessões JWT, tokens API, HTTPS, proxies inversos, Secure Gateway e jail Fail2Ban opcional.", + "section": "Monitor do ProxMenux" + }, + "intro": { + "title": "A autenticação é opcional", + "body": "No primeiro acesso, o painel apresenta a caixa de diálogo «Proteger o painel?», com os botões Sim, configurar palavra-passe e Não, continuar sem proteção. Ao escolher a segunda opção, os endpoints da API ficam abertos em TCP 8008: pode ser adequado numa LAN de laboratório isolada, mas é perigoso noutros ambientes. A autenticação de dois fatores (2FA) não faz parte desta escolha inicial; é configurada mais tarde no separador Segurança, depois de definir uma palavra-passe." + }, + "reaching": { + "heading": "Alcançar o painel", + "intro": "ProxMenux Monitor liga-se a 0.0.0.0:8008. Há três maneiras comuns de alcançá-lo:", + "outro": "O acesso direto corresponde à unidade systemd predefinida. O proxy inverso e o Secure Gateway são descritos abaixo. Os IP em X-Forwarded-For exigem PROXMENUX_TRUST_PROXY=1 e um proxy sob o seu controlo. X-Forwarded-Proto ou X-Forwarded-Host não ativam essa confiança por si só; o frontend constrói os URL API a partir da origem do navegador." + }, + "firstLaunch": { + "heading": "Procedimento do primeiro arranque", + "intro": "A primeira vez que você abre o painel, o frontend chama GET /api/auth/status. Se a configuração de autenticação nunca foi escrita (configured: false), aparece uma única janela intitulada \"Proteger o seu painel?\" com duas opções:", + "imageAlt": "Diálogo inicial «Proteger o painel?» com opções para configurar palavra-passe ou continuar sem proteção", + "imageCaption": "Escolha inicial entre proteção por palavra-passe e nenhuma proteção. Volta a aparecer após nova instalação ou desativação da autenticação nas definições.", + "headerButton": "Botão", + "headerWhat": "O que acontece?", + "headerApi": "Chamada API", + "rows": [ + { + "button": "Sim, configurar senha", + "what": "Abre um formulário com nome de utilizador e palavra-passe obrigatórios, além de nome de apresentação e imagem de avatar opcionais. Ativa a autenticação em auth.json com enabled: true e devolve um JWT para iniciar sessão. Os campos opcionais do perfil são guardados por chamadas posteriores, descritas abaixo.", + "api": "POST /api/auth/setup" + }, + { + "button": "Não, continue sem proteção", + "what": "Marca declined: true em auth.json. Cada endpoint API é acessível publicamente até que você mude de ideia a partir de Configurações.", + "api": "POST /api/auth/skip" + } + ], + "twofaCalloutTitle": "O 2FA é configurado mais tarde, não aqui", + "twofaCalloutBody": "O diálogo inicial decide apenas a palavra-passe. A autenticação de dois fatores (TOTP) é configurada depois no separador Segurança, após iniciar sessão com palavra-passe. O procedimento completo aparece mais abaixo.", + "createTitle": "Criando o primeiro usuário", + "createIntro": "Sim, configurar palavra-passe abre um formulário para criar a conta e preencher o perfil opcional, permitindo mostrar o avatar assim que guardar. Os campos são:", + "headerField": "Campo", + "headerRequired": "Requerido", + "headerNotes": "Notas", + "fieldRows": [ + { + "field": "Nome de usuário", + "required": "Sim", + "notes": "Identificador de início de sessão. Não pode ser alterado pela interface; requer editar auth.json diretamente." + }, + { + "field": "Senha", + "required": "Sim", + "notes": "Pelo menos 10 caracteres de 3 das 4 categorias: minúsculas, maiúsculas, algarismos e símbolos. Palavras-passe óbvias como password, 12345678 e proxmenux são rejeitadas. As mesmas regras são impostas no servidor, pelo que curl não as pode contornar." + }, + { + "field": "Nome de exibição", + "required": "Não", + "notes": "Nome apresentado no menu do cabeçalho e no perfil. Se vazio, usa o nome de utilizador. Pode alterá-lo em Avatar → Ver perfil." + }, + { + "field": "Imagem do Avatar", + "required": "Não", + "notes": "PNG, JPEG, WebP ou GIF até 2 MB. Desenhado como um círculo no cabeçalho e na página de perfil. Quando vazio, o cabeçalho mostra a primeira letra do nome de exibição (ou nome de usuário) em um círculo colorido. Pode ser carregado, substituído ou removido mais tarde da página de perfil." + } + ], + "createImageAlt": "Formulário de criação da conta com nome de utilizador e palavra-passe obrigatórios, nome de apresentação e avatar opcionais", + "createImageCaption": "Formulário do primeiro arranque. Nome e avatar são opcionais; sem eles, a conta é criada e o cabeçalho mostra uma inicial num círculo.", + "saveCalloutTitle": "Um guardar, até três chamadas API", + "saveCalloutBody": "O formulário envia primeiro POST /api/auth/setup com utilizador e palavra-passe. Com o novo JWT, envia PUT /api/auth/profile para o nome e POST /api/auth/profile/avatar para a imagem, se preenchidos. Uma falha no perfil não anula a conta; pode completá-lo mais tarde.", + "avatarTitle": "Página de menu e perfil do Avatar", + "avatarBody1": "Depois de configurar a autenticação, o avatar aparece no canto superior direito, junto ao seletor de tema. O menu contém perfil, Segurança e Terminar sessão. Também pode terminar a sessão no separador Segurança.", + "avatarBody2": "O perfil mostra o avatar, o utilizador apenas para leitura e o nome de apresentação editável. Os carregamentos, substituições e remoções do avatar são atómicos; o cabeçalho atualiza-se automaticamente após sucesso. O formulário inicial e o perfil usam os mesmos endpoints descritos abaixo.", + "profileImageAlt": "Perfil com pré-visualização do avatar, botões Carregar / Substituir / Remover, utilizador apenas para leitura e nome editável", + "profileImageCaption": "A página dedicada ao perfil. O nome de usuário é somente para leitura; o nome de exibição e o avatar podem ser editados daqui sem tocar na aba Segurança.", + "headerEndpoint": "Endpoint", + "headerEpWhat": "O que ele faz", + "endpointRows": [ + { + "endpoint": "GET /api/auth/profile", + "what": "Retorna o nome de usuário atual, o nome de exibição e se um avatar está definido (has_avatar, avatar_mtime)." + }, + { + "endpoint": "PUT /api/auth/profile", + "what": "Atualiza o nome de apresentação. Corpo do pedido: '{' \"display_name\": \"...\" '}'." + }, + { + "endpoint": "GET /api/auth/profile/avatar", + "what": "Devolve a imagem PNG / JPEG / WebP / GIF com o tipo de conteúdo correto. Exige o cabeçalho Bearer; o frontend obtém um blob e cria um URL de objeto local para o apresentar." + }, + { + "endpoint": "POST /api/auth/profile/avatar", + "what": "Envia um novo avatar (max 2 MB). O tipo de conteúdo deve corresponder ao ficheiro. O velho avatar é substituído atomicamente." + }, + { + "endpoint": "DELETE /api/auth/profile/avatar", + "what": "Remove o avatar. O cabeçalho volta a mostrar uma inicial num círculo colorido." + } + ], + "reversibleTitle": "Pode ativar a proteção mais tarde", + "reversibleBody": "Depois de Não, continuar sem proteção, o diálogo inicial não volta a aparecer. Ative a autenticação no separador Segurança ou edite /root/.config/proxmenux-monitor/auth.json, remova o indicador declined e reinicie o serviço." + }, + "password": { + "heading": "Autenticação de senha", + "intro": "Após configurar a proteção, as chamadas API protegidas exigem um JWT em Authorization: Bearer <token>:", + "items": [ + "Token de sessão: válido por 24 horas, emitido por POST /api/auth/login.", + "Token API para integrações: válido por 365 dias, emitido por POST /api/auth/generate-api-token. Detalhes na secção seguinte." + ], + "loginImageAlt": "A tela de login mostrada após a autenticação está configurada — campos de nome de usuário e senha", + "loginImageCaption": "Uma vez configurada a autenticação, cada visita ao painel começa aqui. Com o 2FA ativado, a tela pede o código 6 dígitos em um segundo passo após a senha ser aceita.", + "loginFlowTitle": "Fluxo de login", + "twofaIntro": "Com 2FA ativo, a primeira chamada devolve requires_totp: true. Repita-a com o código de seis dígitos:", + "publicTitle": "Acesso público e verificações protegidas", + "publicIntro": "O início de sessão e o estado da autenticação são públicos. Pode criar a conta enquanto não houver utilizador e palavra-passe guardados, mesmo após recusar a proteção. Os dados do sistema exigem autenticação quando a proteção está ativa:", + "publicItems": [ + "/api/auth/login e /api/auth/status são públicos. /api/auth/setup cria a primeira conta e recusa substituir credenciais existentes.", + "/api/system-info é um endpoint público com informações básicas do sistema, incluindo health.status. Não exige token. /api/auth/status também é público e permite verificar a disponibilidade." + ], + "cryptoTitle": "Criptografia e armazenamento", + "cryptoIntro": "ProxMenux Monitor é código aberto — nada disso é secreto. Documentar a pilha aqui explicitamente é uma escolha deliberada: operadores que armazenam credenciais em seu host merecem saber como essas credenciais são protegidas antes de decidirem confiar nelas. Os algoritmos abaixo são os mesmos que o código em scripts/auth_manager.py usa; esta seção é um contrato, não uma promessa de marketing.", + "headerAsset": "Elemento", + "headerAlgo": "Algoritmo", + "headerWhere": "Localização", + "cryptoRows": [ + { + "asset": "Senha", + "algorithm": "PBKDF2-HMAC-SHA256 com salt aleatório por palavra-passe e muitas iterações, segundo a referência OWASP 2023+. Guardado como pbkdf2_sha256$<iters>$<salt>$<hash>.", + "where": "auth.json → password_hash" + }, + { + "asset": "Sessão / API JWT", + "algorithm": "Assinatura HS256 com segredo próprio da instalação, gerado no primeiro arranque (secrets.token_urlsafe, ≥48 bytes). Os tokens incluem iss=proxmenux-monitor e aud=api; cada pedido verifica a assinatura com o segredo atual.", + "where": "Segredo: auth.json → jwt_secret. JWT em si: apenas no cliente." + }, + { + "asset": "Metadados de token API", + "algorithm": "O hash SHA-256 do JWT é guardado com a impressão digital signed_with do jwt_secret utilizado. Permite apresentar os metadados e detetar tokens afetados pela substituição do segredo.", + "where": "auth.json → api_tokens[]" + }, + { + "asset": "Segredo TOTP de 2FA", + "algorithm": "TOTP padrão (RFC 6238), com segredo codificado em base32. Os oito códigos de recuperação são de utilização única e guardados como hashes SHA-256.", + "where": "auth.json → totp_secret + backup_codes[]" + }, + { + "asset": "Revogação", + "algorithm": "Quando um token é revogado, o hash SHA-256 entra numa lista de bloqueio consultada em cada verificação. Uma cache em memória de cerca de 30 s evita leituras repetidas do disco.", + "where": "auth.json → revoked_tokens[]" + } + ], + "authJsonTitle": "auth.json — o que contém e como está protegido", + "authJsonBody": "Os dados de autenticação ficam em /root/.config/proxmenux-monitor/auth.json, modo 0600, proprietário root. Contém hashes PBKDF2 e segredos criptográficos (jwt_secret, totp_secret), nunca a palavra-passe em claro. Cifre os destinos de cópia ou replicação e nunca inclua este ficheiro no controlo de versões.", + "rotateTitle": "A rotação do jwt_secret invalida todos os JWTs existentes", + "rotateBody": "Se auth.json for recriado ou restaurado com outro segredo, jwt_secret muda. Os JWT antigos de sessão e API falham com \"Invalid or expired token\". A interface assinala-os com Inválido — gerar novamente. Revogue e substitua os tokens também no Home Assistant, scripts e outros clientes.", + "recoverTitle": "Recuperar uma senha perdida", + "recoverIntro": "Não há fluxo online de \"esquecimento de senha\" — por design, já que o painel é executado no próprio host do operador e o caminho de recuperação é o acesso de shell a esse host. ProxMenux envia uma reinicialização guiada dentro do menu de configuração para que você não tenha que editar manualmente auth.json:", + "survivesTitle": "O que sobrevive ao reset", + "survivesBody": "O início de sessão interativo é apagado, mas jwt_secret e os api_tokens registados são conservados. O Home Assistant e os outros scripts mantêm os tokens. Para recomeçar com novo segredo, elimine auth.json e reinicie o serviço: todos os tokens antigos tornam-se inválidos.", + "physicalTitle": "Pré-requisito de acesso físico", + "physicalBody": "Exige uma shell root no anfitrião. Quem executa menu como root já controla a máquina; repor a palavra-passe não aumenta privilégios. A autenticação do Monitor não protege contra quem já tem acesso root." + }, + "twofa": { + "heading": "Autenticação de Dois Fatores (TOTP)", + "intro": "2FA adiciona um segundo fator em cima de sua senha: um código 6 dígitos que gira cada 30 segundos, gerado em um telefone ou gerenciador de senha que você controla. Mesmo que alguém obtenha a senha, ainda não pode entrar sem o código do seu dispositivo. ProxMenux Monitor implementa o protocolo padrão TOTP (RFC 6238), então qualquer aplicativo autenticador funciona.", + "pickTitle": "Escolha uma aplicação de autenticação", + "pickIntro": "Pode utilizar uma aplicação TOTP existente. A tabela apresenta opções comuns: algumas gratuitas, outras por subscrição. As plataformas e os métodos de cópia de segurança também variam.", + "headerApp": "Aplicativo", + "headerPlatforms": "Plataformas", + "headerAppNotes": "Notas", + "apps": [ + { + "name": "Google Authenticator", + "href": "https://safety.google/authentication/", + "platforms": "iOS, Android", + "notes": "O padrão para muitos usuários. Opcional backup na nuvem da conta Google." + }, + { + "name": "Microsoft Authenticator", + "href": "https://www.microsoft.com/en-us/security/mobile-authenticator-app", + "platforms": "iOS, Android", + "notes": "Backup da conta Microsoft. Também lida com notificações do MS push se você usá-las no trabalho." + }, + { + "name": "Authy", + "href": "https://authy.com/", + "platforms": "iOS, Android", + "notes": "Sincronização cifrada entre dispositivos. A aplicação para computador deixou de ser suportada em 19 de março de 2024." + }, + { + "name": "Apple Passwords", + "href": "https://support.apple.com/guide/passwords/welcome/mac", + "platforms": "iOS, iPadOS, macOS, visionOS, Windows (através do iCloud)", + "notes": "Incluída nos sistemas Apple; aplicação Passwords independente desde iOS 18 / macOS Sequoia. Guarda TOTP junto da palavra-passe e sincroniza através do Porta-chaves iCloud." + }, + { + "name": "Bitwarden", + "href": "https://bitwarden.com/", + "platforms": "iOS, Android, desktop, navegador", + "notes": "Código aberto. O TOTP pode ficar junto das palavras-passe no cofre. É prático, mas não mantém os dois fatores em dispositivos separados." + }, + { + "name": "1Password", + "href": "https://1password.com/", + "platforms": "iOS, Android, desktop, navegador", + "notes": "A mesma idéia que Bitwarden — TOTP integrado com o cofre de senha. Assinatura." + }, + { + "name": "Aegis Authenticator", + "href": "https://getaegis.app/", + "platforms": "Android", + "notes": "Código aberto. Arquivo de backup criptografado no dispositivo que você controla. Nenhuma nuvem, nenhuma conta necessária." + }, + { + "name": "Raivo OTP", + "href": "https://raivo-otp.com/", + "platforms": "iOS, macOS", + "notes": "Código aberto. Sincronização iCloud opcional. Alternativa do ecossistema Apple comparável ao Aegis." + }, + { + "name": "Ente Auth", + "href": "https://ente.io/auth/", + "platforms": "iOS, Android, computador, web", + "notes": "Código aberto. Sincronização em nuvem criptografada de ponta a ponta entre dispositivos." + }, + { + "name": "2FAS", + "href": "https://2fas.com/", + "platforms": "iOS, Android, extensão do navegador", + "notes": "Código aberto. Backup encriptado opcional na nuvem; extensão do navegador pode preencher automaticamente códigos." + }, + { + "name": "FreeOTP+", + "href": "https://github.com/helloworld1/FreeOTPPlus", + "platforms": "Android", + "notes": "Derivação de código aberto do FreeOTP para Android, com importação e exportação. Não exige conta." + } + ], + "backupTitle": "Porque são importantes as cópias de segurança", + "backupBody": "Se perder o dispositivo, use um código de recuperação guardado ou restaure uma cópia configurada previamente. A sincronização na nuvem e as exportações variam por aplicação: verifique se restauram os segredos TOTP. O acesso root ao anfitrião também permite a recuperação descrita abaixo. Guarde uma cópia separada e segura.", + "setupTitle": "Configuração passo a passo do painel", + "setupImageAlt": "Tela de configuração 2FA com código QR e códigos de backup", + "setupImageCaption": "O diálogo 2FA mostra um QR, o segredo Base32 para introdução manual e oito códigos de recuperação de utilização única. Copie-os antes de fechar: não serão apresentados novamente.", + "setupSteps": [ + "Instale o aplicativo autenticador no telefone (ou abra o gerenciador de senhas). Um dos aplicativos da tabela acima. Você só precisa fazer isso uma vez — o mesmo aplicativo irá conter códigos para cada serviço que você protege.", + "Fazer login no painel com seu nome de usuário e senha.", + "Abra o separador Segurança e escolha Ativar 2FA. O diálogo mostra QR, segredo Base32 e oito códigos de recuperação.", + "Adicione a entrada ao aplicativo autenticador:", + "Guarde os códigos de recuperação. Conserve os oito num gestor de palavras-passe, nota cifrada ou cópia impressa segura. Cada um funciona uma vez se a aplicação estiver indisponível.", + "Confirme com o código atual de seis dígitos da aplicação no campo \"Código de verificação\" e envie. Muda a cada 30 segundos; se expirar durante a escrita, use o seguinte.", + "Concluído. 2FA está ativo. O próximo início de sessão pede primeiro a palavra-passe e depois o código atual de seis dígitos." + ], + "setupStep4Sub": [ + "Método simples: na aplicação, escolha Adicionar conta → Ler código QR e aponte a câmara ao QR. A entrada recebe um nome como ProxMenux Monitor (your-username) e mostra um código de seis dígitos renovado a cada 30 segundos.", + "Alternativa manual, se não puder ler o QR, por exemplo no mesmo telefone: Adicionar conta → Introduzir chave de configuração. Escolha um nome como Proxmox Monitor, cole o segredo Base32, mantenha Tipo em Baseado no tempo e guarde." + ], + "testTitle": "Teste antes de sair", + "testBody": "Mantenha a sessão atual aberta e teste outro início de sessão numa janela privada imediatamente após configurar. Se o código falhar, verifique os relógios do servidor e do telefone antes de terminar a sessão válida. Se já perdeu o acesso, use um código de recuperação ou edite auth.json na shell do anfitrião.", + "lostTitle": "Autenticador perdido", + "lostIntro": "Três métodos de recuperação, do menos ao mais intrusivo:", + "lostItems": [ + "Use um código de recuperação. Introduza um dos oito no campo TOTP. Funciona uma vez; os restantes continuam válidos. Depois de entrar, configure novamente 2FA nas definições para obter oito códigos novos.", + "Restaure a aplicação da nuvem ou de uma cópia. Com sincronização configurada, instale-a no novo dispositivo e inicie sessão: Google, Microsoft, Authy, Apple Passwords via Porta-chaves iCloud, Ente ou 2FAS. Com um ficheiro exportado por Aegis, Raivo ou FreeOTP+, instale a aplicação e importe o ficheiro.", + "Desativar 2FA do shell do host. Quando as opções anteriores não estiverem disponíveis, edite /root/.config/proxmenux-monitor/auth.json no host Proxmox (você precisa de acesso raiz SSH ou console), defina totp_enabled para false, salve e reinicie o serviço:" + ], + "lostShellOutro": "Você pode fazer login com nome de usuário + senha apenas, em seguida, habilitar de configurações 2FA.", + "disableTitle": "Desativar 2FA", + "disableBody": "Abra Segurança e escolha Desativar 2FA. POST /api/auth/totp/disable exige palavra-passe atual e código TOTP ou de recuperação válido. Elimina o segredo TOTP e os códigos. Remova também a entrada antiga da aplicação.", + "rejectedTitle": "O código de seis dígitos é sempre rejeitado", + "rejectedIntro": "O TOTP depende da hora: os relógios do servidor e do telefone devem diferir menos de cerca de 30 s. Duas verificações:", + "rejectedItems": [ + "Telefone: Definições → Data e hora → ativar sincronização automática / de rede.", + "Anfitrião Proxmox: timedatectl status deve mostrar \"System clock synchronized: yes\". Caso contrário, execute timedatectl set-ntp true e aguarde um minuto." + ], + "rejectedOutro": "Depois de sincronizar os relógios, o código é aceite na janela seguinte de 30 segundos." + }, + "apiTokens": { + "heading": "Tokens API de longa duração", + "intro": "As sessões expiram após 24 horas. Para Homepage, Home Assistant, Grafana ou Uptime Kuma, crie um token API válido por 365 dias. O JWT usa o mesmo segredo; o campo token_name permite identificá-lo e revogá-lo individualmente.", + "imageAlt": "Painel de tokens API com nome, prefixo, data de criação e validade", + "imageCaption": "Lista nas definições: nome, prefixo com os quatro últimos caracteres de identificação, datas de criação e validade, ação de revogação.", + "generateTitle": "Gerar um token", + "generateIntro": "Do painel:", + "generateSteps": [ + "Abra Segurança → Tokens de acesso API.", + "Introduza um nome descritivo, por exemplo \"Home Assistant\".", + "Volta a inserir a tua senha. Se 2FA está ligado, também o código atual 6 dígitos.", + "Clique em Gerar token. Aparece uma única vez: copie-o imediatamente." + ], + "generateCli": "Da linha de comando:", + "useTitle": "Usar um token", + "revokeTitle": "Revogar um token", + "revokeBody": "Cada linha oferece Revogar, que adiciona o hash a revoked_tokens em auth.json. O token é rejeitado no pedido seguinte.", + "cheatTitle": "Resumo de segurança dos tokens", + "cheatItems": [ + "Guarde os tokens no sistema de segredos da integração: Homepage secrets.yaml, Home Assistant !secret ou variáveis de ambiente. Nunca os inclua no Git.", + "Um token por integração, com o seu nome. Revogue-o ao remover essa integração.", + "Rodar cada 6–12 meses. A expiração é um limite difícil, não uma recomendação." + ], + "outro": "Recomendações de armazenamento e exemplos: Referência API → Gestão de tokens e Integrações." + }, + "https": { + "heading": "HTTPS", + "intro": "Dois caminhos para o TLS:", + "items": [ + "Proxy inverso (recomendado). Terminar TLS em Nginx / Caddy / Traefik e encaminhar HTTP na porta 8008 para o processo Flask. Excertos abaixo.", + "HTTPS direto na AppImage. Configure um certificado com POST /api/ssl/configure (interface: Definições → SSL). HTTPS usa gevent.pywsgi com o handler padrão; flask-sock trata WebSocket para WSS. Os caminhos ficam na configuração SSL." + ], + "calloutTitle": "Limitações diretas do HTTPS", + "calloutBody": "O Monitor pode usar um certificado gerido pelo Proxmox ou ficheiros próprios. Não emite certificados ACME. Para emissão e renovação automáticas, use Proxmox ACME ou um proxy Caddy, Traefik ou Nginx e garanta que os certificados renovados são carregados." + }, + "gateway": { + "heading": "Gateway seguro (Tailscale)", + "intro": "Um proxy inverso permite acesso remoto. Secure Gateway evita expor TCP 8008: cria um LXC Alpine com Tailscale como router de sub-rede. O acesso ao IP LAN do anfitrião depende das rotas aprovadas e regras da tailnet.", + "calloutTitle": "Por que isto é conveniente", + "calloutBody": "Use o URL LAN http://<proxmox-lan-ip>:8008 pela rota aprovada. Os routers Tailscale usam SNAT por predefinição: o Monitor costuma ver o IP LAN do gateway, não o endereço 100.x.y.z do cliente. Registos e Fail2Ban identificam a origem realmente recebida pelo anfitrião.", + "deployBody": "Num ecrã, escolha o armazenamento LXC, cole uma chave Tailscale criada em login.tailscale.com/admin/settings/keys, escolha as sub-redes e implemente. O LXC inicia em cerca de 30 segundos e regista-se na tailnet.", + "outro": "Implementação, rotas de sub-rede, ACL Tailscale e modo Exit Node estão em Painel → Segurança → Secure Gateway, juntamente com o assistente. Aqui descreve-se o acesso." + }, + "proxy": { + "heading": "Exemplos de proxy inverso", + "intro": "Use um nome de anfitrião dedicado, como monitor.example.com, encaminhado para a porta 8008 do Proxmox. Os exemplos seguem esse modelo. Um subcaminho como example.com/proxmenux-monitor/ exige alterações no frontend e proxy; retirar o prefixo não basta.", + "nginxTitle": "Nginx", + "caddyTitle": "Caddy", + "traefikTitle": "Traefik (etiquetas — Docker / Kubernetes)", + "subPathTitle": "Avançado: implementação num subcaminho", + "subPathBody": "O frontend atual não tem uma base de subcaminho e cria chamadas desde a raiz com URL /api/*. Retirar um prefixo como example.com/proxmenux-monitor/ não resolve essas chamadas nem todos os recursos do frontend. Use um nome dedicado. Um subcaminho exige alterações coordenadas e testes específicos." + }, + "audit": { + "heading": "Registo de auditoria", + "intro": "Falhas de início de sessão e avisos de limitação são escritos, uma linha por evento, em /var/log/proxmenux-auth.log. Este logger não regista acessos bem-sucedidos:", + "outro": "Siga-o da maneira habitual: tail -F /var/log/proxmenux-auth.log. O arquivo é rodado pelo logrotate se for adicionado um drop-in de configuração; o próprio Monitor não o roda." + }, + "fail2ban": { + "heading": "Opcional: jail do Fail2Ban", + "calloutTitle": "O Fail2Ban não está empacotado com o Monitor", + "calloutBody": "Fail2Ban não é instalado pelo próprio ProxMenux Monitor. Instale-o via Segurança → Fail2Ban no menu ProxMenux (ou com o pacote Debian padrão). Sem ele, o Monitor ainda grava o registro de auditoria acima — ele apenas não bane automaticamente os infratores reincidentes.", + "intro": "A integração ProxMenux inclui uma jail [proxmenux] que:", + "items": [ + "Lê-se /var/log/proxmenux-auth.log.", + "Corresponde ao padrão authentication failure; rhost=<ip> com um filtro dedicado.", + "Bane o IP ofensivo no nível de firewall do kernel por padrão.", + "O hook Flask before_request verifica os pedidos com a lista de bloqueios, em cache durante 30 s. Atrás de um proxy inverso, o bloqueio por IP também exige PROXMENUX_TRUST_PROXY=1 e um proxy controlado que defina cabeçalhos fiáveis." + ], + "outro": "Configuração, duração dos bloqueios e desbloqueio: Segurança → Fail2Ban." + }, + "troubleshoot": { + "heading": "Resolução de Problemas", + "noScreenTitle": "O ecrã do primeiro lançamento nunca aparece", + "noScreenBody": "Ou a autenticação já está configurada (configured: true) ou alguém já escolheu Skip. Para começar de novo:", + "noScreenOutro": "Apaga autenticação, segredos TOTP e tokens API. Faça primeiro uma cópia de auth.json se pretende conservá-los.", + "tokenTitle": "HTTP 401 em todos os pedidos de um token API que funcionava", + "tokenBody": "Token expirou (limite 365 d) ou entrou na lista revoked_tokens. Gere um novo em Configurações e atualize a integração. Verificar:", + "tokenOutro": "Os tokens expirados ou revogados retornam '{'\"error\":\"Invalid or expired token\"'}'.", + "no2faTitle": "Não é possível iniciar sessão após activar o 2FA, sem autenticador à mão", + "no2faBody": "Use um código de backup no campo TOTP. Se esses forem idos, edite /root/.config/proxmenux-monitor/auth.json de uma shell host, definir totp_enabled para false, reiniciar o serviço.", + "wsTitle": "O 'proxy' inverso funciona, mas a página do terminal desliga- se a cada minuto", + "wsBody": "Tempo limite de inatividade WebSocket do proxy. Aumente o limite de leitura (Nginx: proxy_read_timeout 86400s; Traefik: idleTimeout no ponto de entrada ou middleware). No Nginx, confirme proxy_set_header Upgrade $http_upgrade e Connection \"upgrade\"." + }, + "whereNext": { + "heading": "Para onde seguir", + "items": [ + { + "label": "Referência API → Gestão de tokens", + "href": "/docs/monitor/api", + "tail": " — criar, listar e revogar tokens API; segurança e armazenamento de segredos." + }, + { + "label": "Integrações", + "href": "/docs/monitor/integrations", + "tail": " — Homepage, Home Assistant, Grafana / Prometheus, Uptime Kuma e exemplos cURL." + }, + { + "label": "Painel → Segurança → Gateway seguro", + "href": "/docs/monitor/dashboard/security", + "tail": " — implementar o LXC Tailscale: rotas de sub-rede, ACL e modo Exit Node." + }, + { + "label": "Segurança → Fail2Ban", + "href": "/docs/security/fail2ban", + "tail": " — instalar e configurar a jail opcional." + }, + { + "label": "Configurações → ProxMenux Monitor", + "href": "/docs/settings/proxmenux-monitor", + "tail": " — iniciar e parar o serviço systemd pela TUI do ProxMenux." + } + ] + } +} diff --git a/web/messages/pt/docs/monitor/ai-assistant.json b/web/messages/pt/docs/monitor/ai-assistant.json new file mode 100644 index 00000000..9882a503 --- /dev/null +++ b/web/messages/pt/docs/monitor/ai-assistant.json @@ -0,0 +1,342 @@ +{ + "meta": { + "title": "Assistente de IA Proxmox — OpenAI, Claude, Gemini, Groq, Ollama | ProxMenux Monitor", + "description": "O assistente de IA opcional reformula as notificações Proxmox VE em linguagem clara. Seis fornecedores: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter e Ollama. A interface oferece treze idiomas, três níveis de detalhe por canal, prompts personalizados com uma biblioteca comunitária e contexto com tempo de atividade, recorrência e dados SMART.", + "ogTitle": "Assistente de IA Proxmox — OpenAI, Claude, Gemini, Groq, Ollama", + "ogDescription": "Reescreva notificações Proxmox VE em linguagem simples com OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter ou local Ollama.", + "twitterTitle": "Assistente de IA Proxmox | ProxMenux Monitor", + "twitterDescription": "Reescreva notificações Proxmox VE em linguagem simples com OpenAI, Anthropic, Gemini, Groq, OpenRouter ou Ollama local." + }, + "header": { + "title": "Assistente de IA", + "description": "A reformulação opcional por IA transforma as notificações elegíveis em mensagens claras, com detalhe por canal, treze idiomas na interface, prompts personalizados, biblioteca comunitária pública e contexto adicional. Os relatórios backup_complete e backup_fail não passam pela IA.", + "section": "Monitor do ProxMenux" + }, + "intro": { + "title": "Desligado por omissão, comutador único para activar", + "body": "A reformulação por IA vem desativada. Ative-a em Definições → Notificações → Avançado: melhoria por IA. Se o enriquecimento ou a reformulação falhar, é enviado o modelo original. Cada reformulação tem um limite de espera de 25 segundos; ao atingi-lo, utiliza-se o modelo sem esperar indefinidamente." + }, + "howItWorks": { + "heading": "Como funciona", + "intro": "Os eventos enviados pelo Monitor seguem o mesmo processo. A reformulação por IA é uma etapa opcional entre o texto do modelo e o envio ao canal. Um evento passa por quatro passos:", + "steps": [ + "Evento + modelo. Um evento chega de um dos seis coletores e é renderizado em um corpo estruturado de texto simples por notification_templates.py. Este é o corpo que o canal enviaria se a IA reescrever estivesse desligada.", + "Aprimoramento de contexto. O expedidor inspeciona o evento e, condicionalmente, adiciona os sinais extras relevantes — tempo de funcionamento do sistema (somente para falhas críticas do sistema), frequência do evento, dados do SMART (somente para eventos em disco), correspondências de banco de dados de erros conhecidos e linhas de diário.", + "Construção do prompt. O prompt de sistema combina o modelo e as definições do canal: idioma, detalhe, regras emoji das Mensagens enriquecidas e sugestões de IA, se ativas. No modo personalizado, o seu prompt substitui todo o prompt de sistema. A mensagem do utilizador contém o texto do modelo e os blocos de contexto.", + "Chamada ao fornecedor. Groq, OpenAI, Anthropic, Gemini, Ollama ou OpenRouter devolve título e texto reformulados. O módulo de envio analisa a resposta, substitui esses conteúdos para o canal e entrega-os ao adaptador de envio." + ], + "notesIntro": "Três detalhes que valem a pena manter antes de ler o resto desta página:", + "notes": [ + "A IA não produz eventos. Cada evento nasce de um sinal real (Scan Health Monitor, linha de diário, PVE webhook, etc.) e é renderizado em um corpo modelado antes que a IA o veja. A IA é um tradutor e re-formatador, não um observador.", + "A IA é executada por canal. Telegram e Discord podem usar uma breve reescrita enquanto o Email recebe um relatório detalhado — mesmo evento, forma diferente, tudo de uma chamada de provedor por canal.", + "Em caso de falha utiliza-se o modelo. Se o fornecedor devolver um erro 5xx, exceder o tempo limite, produzir uma resposta inválida ou recusar o pedido, o módulo regista o erro e envia o texto original do modelo para esse canal." + ] + }, + "enabling": { + "heading": "Habilitando o painel", + "intro": "A configuração de IA fica no fundo do painel Notificações, no separador Definições, no bloco recolhível Avançado: melhoria por IA. Clique no título para o expandir:", + "collapsedAlt": "Cabeçalho AI Avançado Recolher com indicador chevron", + "collapsedCaption": "Recolhido por predefinição; um clique expande o painel.", + "panelAlt": "Painel IA expandido com interruptor principal, fornecedor Google Gemini, chave API oculta, modelo gemini-2.5-flash, prompt predefinido, idioma inglês, detalhe para Telegram, Discord, Gotify e e-mail, sugestões IA e teste de ligação", + "panelCaption": "O painel IA completo: cada controlo descrito nesta página corresponde a um dos campos acima.", + "outro": "De cima para baixo: interruptor Mensagens melhoradas por IA, fornecedor e janela informativa, chave API ou URL Ollama, lista de modelos carregada após a chave, modo Predefinido / Personalizado, idioma, detalhe por canal, Sugestões de IA e botão Testar ligação que envia uma mensagem de teste ao fornecedor para validar as credenciais." + }, + "context": { + "heading": "Qual o contexto que a IA recebe", + "intro": "Antes que o prompt seja construído, o despachante caminha uma rotina de enriquecimento de contexto que decide quais sinais extras são relevantes para o evento em questão. O objetivo é dar ao LLM informações suficientes para produzir uma mensagem útil, sem alagá-la (e sua carteira) com ruído que não se aplica. Cinco blocos de contexto podem ser adicionados à mensagem do usuário:", + "headerBlock": "Bloco", + "headerWhen": "Quando é injetado", + "headerWhat": "O que carrega", + "rows": [ + { + "block": "Tempo de atividade do sistema", + "when": "Apenas para falhas críticas do sistema: crash, panic, oom, kernel, split_brain, quorum_lost, node_offline, node_fail, system_fail, boot_fail. Omite-se em erros de disco, avisos e operações de rotina para manter o prompt conciso.", + "what": "Uma linha como System uptime: 14 days (stable system). Permite ao LLM distinguir problemas de inicialização de falhas de longo prazo." + }, + { + "block": "Frequência do evento", + "when": "Sempre, quando o Monitor já viu a mesma impressão digital antes.", + "what": "Número de ocorrências, data da primeira deteção e padrão opcional: recorrente, isolado ou pico. O modelo utiliza estes dados para distinguir um problema recorrente de uma primeira ocorrência." + }, + { + "block": "Dados SMART", + "when": "Apenas para eventos relacionados ao disco (tipo evento contém disk, smart, storage, io_error, ou o corpo menciona /dev/sd, ata, i/o error).", + "what": "Saída de smartctl para o dispositivo afetado — saúde geral (PASSED / FAILED) mais os atributos relevantes para o modo de falha." + }, + { + "block": "Base de dados de erros conhecidos", + "when": "Quando o contexto do corpo ou diário corresponde a um padrão de erro específico do Proxmox enviado com o Monitor.", + "what": "Um bloco KNOWN PROXMOX ERROR DETECTED com a causa identificada e uma solução concreta. O prompt pede uma tradução fiel, sem reformular a correção recomendada." + }, + { + "block": "Registos de diários", + "when": "Quando o coletor de origem capturou linhas de log para o evento, sobretudo na monitorização dos logs e das tarefas.", + "what": "Excertos crus journalctl. O prompt diz ao LLM para extrair IDs, timestamps e dicas de causa-root, e ignorar entradas não relacionadas." + } + ], + "afterBlocks": "Uma vez que estes blocos são unidos, a mensagem de usuário enviada para o LLM tem esta forma:", + "calloutTitle": "Nenhuma telemetria além do próprio evento", + "calloutBody": "O Monitor só envia o que tem à mão para o evento atual — nenhuma telemetria em todo o sistema, nenhuma série métrica histórica, nenhum depósito de inventário. Os cinco blocos acima são o limite superior do que deixa o hospedeiro em uma única reescrita de IA." + }, + "tokens": { + "heading": "Tokens — o que são e como são consumidos", + "intro1": "Os fornecedores comerciais cobram por token. Um token corresponde aproximadamente a quatro caracteres ingleses ou três quartos de uma palavra. A frase inglesa \"Backup completed on storage local-bak\" tem cerca de oito tokens. Dez linhas de log podem ocupar 200–400 tokens, conforme o conteúdo técnico.", + "intro2": "Duas coisas são cobradas em cada chamada:", + "items": [ + "Tokens de entrada: prompt de sistema e mensagem do utilizador, com gravidade, título, texto do modelo e contexto adicional. A quantidade depende do prompt e do evento. Cada canal reformulado pode consumir os seus tokens; os relatórios de cópia concluída ou falhada não passam pela IA.", + "Tokens de saída: a resposta do modelo. O Monitor limita-os com max_tokens. O valor é um limite, não um consumo fixo: se o modelo produzir 250 tokens com limite de 1500, paga por 250." + ], + "capsIntro": "Estes são os limites aplicados pelo módulo de envio, definidos em AI_DETAIL_TOKENS em notification_templates.py:", + "headerLevel": "Nível de detalhe", + "headerCap": "Limite de saída (tokens)", + "headerConsumption": "Consumo real típico", + "capRows": [ + { + "level": "breve", + "cap": "500", + "consumption": "Tokens de saída 50-200 para eventos curtos." + }, + { + "level": "padrão", + "cap": "1500", + "consumption": "200–700 tokens de saída para eventos habituais com pouco contexto." + }, + { + "level": "detalhado", + "cap": "3000", + "consumption": "Tokens de saída 500-2000 para relatórios completos de e-mail com logs e tabelas SMART." + } + ], + "customNote": "O modo de prompt personalizado limita a saída a 500 tokens, independentemente do detalhe. O prompt é controlado por si e o limite evita respostas excessivas.", + "sizingTitle": "Tamanho prático", + "sizingBody": "Estime o consumo: eventos reformulados × canais IA × tokens de entrada e saída por chamada. Exemplo: 50 eventos × um canal × (500 de entrada + 300 de saída) = 40.000 tokens por dia. O consumo e custo reais dependem do modelo, contexto, cache e limites do fornecedor. Detalhe por canal explica o uso de brief no chat em vez de standard, mantendo e-mails detalhados." + }, + "providers": { + "heading": "Prestadores de IA", + "intro": "Seis fornecedores estão ligados ao Monitor. O dropdown do provedor na UI mostra todos eles; um botão de informação ao lado dele abre um modal com uma descrição de uma linha para cada um. Abaixo está a referência completa, com o URL para obter uma chave API, a descrição mostrada na UI e as notas relevantes do codebase.", + "imageAlt": "AI Providers Information modal que enumera os seis fornecedores apoiados — Groq, OpenAI, Anthropic Claude, Google Gemini, Ollama, OpenRouter — cada uma com o seu ícone e a sua descrição de uma linha, bem como uma descrição especial OpenAI- Nota compatível com APIs para OpenAI", + "imageCaption": "O modal no aplicativo — seis cartões, um por provedor, com as mesmas descrições documentadas abaixo.", + "groq": { + "heading": "Groq", + "tagline": "Nível livre muito rápido e generoso (30 req/min). Ideal para começar.", + "items": [ + "Chave API: console.groq.com/keys", + "Exemplos da lista de modelos incluída: allam-2-7b, qwen/qwen3.8-27b, openai/gpt-oss-20b, groq/compound-mini.", + "Recomendação incluída: openai/gpt-oss-20b. Verifique a disponibilidade para a sua conta no seletor do fornecedor e no teste de ligação." + ] + }, + "openai": { + "heading": "OpenAI", + "tagline": "Padrão industrial. Muito preciso e amplamente utilizado.", + "items": [ + "Chave API: platform.openai.com/api-keys", + "Exemplos da lista de modelos incluída: gpt-4.1-nano, gpt-4.1-mini, gpt-4o-mini, gpt-4.1, gpt-4o, gpt-5-nano.", + "Recomendação incluída: gpt-4.1-nano. O adaptador também trata requisitos dos modelos de raciocínio; a lista inclui gpt-5-nano, pelo que esses modelos não são excluídos em geral." + ], + "baseUrlTitle": "URL base compatível com OpenAI", + "baseUrlBody": "O fornecedor OpenAI aceita um URL base personalizado para serviços compatíveis, como BytePlus / ByteDance (Kimi K2.5), LocalAI, LM Studio, vLLM, Together AI e Fireworks AI, que utilizam o formato /v1/chat/completions. Defina o URL no separador OpenAI junto à chave API." + }, + "anthropic": { + "heading": "Anthropic (Claude)", + "tagline": "Excelente para escrever e traduzir. Rápido e económico.", + "items": [ + "Chave API: console.anthropic.com/settings/keys", + "Exemplos da lista de modelos incluída: claude-haiku-4-5-20251001, claude-sonnet-4-6, claude-opus-4-6.", + "Recomendação incluída: claude-haiku-4-5-20251001. Esta versão exata está configurada como recomendada; as antigas entradas Claude 3.5 já não constam da lista incluída." + ] + }, + "gemini": { + "heading": "Google Gemini", + "tagline": "Plano gratuito disponível, boa relação qualidade/preço.", + "items": [ + "Chave API: aistudio.google.com/app/apikey", + "Exemplos da lista de modelos incluída: gemini-2.5-flash-lite, gemini-2.5-flash, gemini-3-flash-preview.", + "Recomendado: gemini-2.5-flash-lite — flash e flash-lite passam o verificador de forma consistente. As variantes pro rejeitam a configuração thinkingBudget=0 que o Monitor usa e são exageradas para esta carga de trabalho." + ] + }, + "openrouter": { + "heading": "OpenRouter", + "tagline": "Agregador com acesso a modelos 100+ usando uma única chave API. Máxima flexibilidade.", + "items": [ + "Chave API: openrouter.ai/keys", + "Exemplos da lista de modelos incluída: meta-llama/llama-3.3-70b-instruct, meta-llama/llama-3.1-70b-instruct, meta-llama/llama-3.1-8b-instruct, anthropic/claude-haiku-4.5, google/gemini-2.5-flash-lite, openai/gpt-4o-mini, mistralai/mistral-medium-3.", + "Recomendado: meta-llama/llama-3.3-70b-instruct — mesmo modelo da entrada Groq, mas roteado através de OpenRouter, o que significa uma única chave para todos os modelos listados." + ] + }, + "ollama": { + "heading": "Ollama (local)", + "tagline": "Utiliza os modelos do servidor Ollama configurado. Os modelos locais executam-se nesse servidor; os modelos cloud encaminham pedidos para um fornecedor externo. A execução local evita custos de API alojada, mas utiliza o seu hardware e eletricidade.", + "items": [ + "Nenhuma chave API. Defina o campo Ollama URL para o seu servidor (padrão http://localhost:11434 ou qualquer máquina roda sua instância Ollama).", + "Modelos: não filtrados. O Monitor lê quaisquer modelos que você extraiu no lado Ollama via ollama pull <model>. O menu suspenso é preenchido em GET /api/tags em seu servidor Ollama.", + "Instalação: ollama.com/download — Linux, macOS e Windows. Escolha um modelo que caiba na RAM e tenha contexto suficiente para os blocos de log adicionados pelo módulo de envio." + ] + } + }, + "models": { + "heading": "Por que esses modelos específicos", + "intro": "A seleção comercial utiliza o catálogo incluído verified_ai_models.json e as verificações dos adaptadores. Estes convertem o pedido interno system_prompt + user_message + max_tokens para cada API. O catálogo contém entradas testadas e adições manuais; não garante acesso atual da conta nem a passagem de todas as entradas pelo mesmo verificador.", + "consequencesIntro": "Duas consequências que merecem ser conscientes:", + "consequences": [ + "A recomendação incluída é um ponto de partida para notificações. Avalie qualidade linguística, latência e custo com os seus eventos e conta; não é uma classificação universal.", + "Pode escolher outro modelo da lista conforme a quota ou preferências. Verifique a disponibilidade com o teste de ligação; constar da lista não garante acesso atual." + ], + "ollamaTitle": "Ollama é a exceção", + "ollamaBody": "A lista Ollama não é filtrada pelo catálogo comercial; mostra os modelos do servidor. Para execução local, escolha um modelo local que caiba na RAM e tenha contexto para os logs. Os modelos cloud são remotos, mesmo através de um servidor Ollama local." + }, + "defaultPrompt": { + "heading": "Solicitação padrão", + "intro": "Com o modo prompt definido para Default, o monitor usa o prompt do sistema abaixo. O prompt é modelado em tempo de execução: '{'language'}', '{'detail_level'}', '{'emoji_instructions'}' e '{'suggestions_addon'}' são substituídos antes da chamada. As variantes para canais ricos vs simples e o suplemento de Sugestões de IA são mostrados imediatamente após.", + "showFullSummary": "Mostrar o prompt completo do sistema por omissão", + "passagesIntro": "Duas variantes de texto são escolhidas conforme a opção Mensagens enriquecidas de cada canal:", + "passages": [ + "Rich on → um bloco emoji é injetado listando os ícones que o LLM pode usar, além de uma regra hostname (o LLM deve manter o prefixo hostname do título verbatim) e um punhado de exemplos formatados (início de backup, backup completo, atualizações, VM start, saúde degradada). Isto é o que produz as mensagens emoji-prefixadas em Telegram e Discord.", + "Rich off → um bloco de uma linha diz ao LLM para usar ASCII simples apenas — sem emojis, sem símbolos Unicode. Usado para email e qualquer canal onde a formatação do ruído fere as regras da caixa de entrada ou a legibilidade." + ], + "suggestionsPlaceholder": "E o placeholder '{'suggestions_addon'}' está vazio a menos que você habilite as Sugestões de IA (próxima seção), caso em que este bloco é injetado:", + "showAddonSummary": "Mostrar o addon de Sugestões de IA" + }, + "customPrompt": { + "heading": "Modo de prompt personalizado", + "intro": "O modo Personalizado substitui todo o prompt de sistema pelo seu texto. É guardado nas definições SQLite e enviado sem alterações em cada chamada IA. Permite escolher outro tom, estrutura ou foco.", + "imageAlt": "Prompt personalizado com área de texto para regras de tradução, botões Exportar e Importar e ligação aos prompts comunitários", + "imageCaption": "Prompt personalizado — área de texto grande com o prompt do usuário, além de Export, Import e um link para a galeria comunitária em GitHub.", + "changesTitle": "O que muda quando o Personalizado está ligado", + "changes": [ + "O prompt padrão é substituído por completo. Os mapeamentos do Proxmox, as regras de contexto e as instruções emoji desapareceram. Se você quiser manter qualquer um deles, cole-os em seu prompt – o pacote EXAMPLE_CUSTOM_PROMPT mostrado abaixo é um ponto de partida.", + "O seletor de idioma é ignorado. O prompt predefinido contém '{'language'}', mas o personalizado não. Indique o idioma no texto, por exemplo «Traduzir para espanhol» ou «Escrever tudo em francês».", + "O limite personalizado é fixo: 500 tokens, independentemente do detalhe guardado por canal. O modo predefinido utiliza 500 / 1500 / 3000. Alterar o prompt não aumenta o limite; peça respostas mais curtas ou escolha um detalhe predefinido adequado.", + "Os marcadores de saída continuam obrigatórios. Inclua [TITLE] e [BODY] na resposta. O analisador extrai o conteúdo; se faltar um marcador, devolve o modelo original.", + "As regras de emoji de mensagens ricas não são auto-injetadas. Se quer emojis, diga ao prompt para usá-los. Se queres texto simples, diz-lhe para não o fazer. A opção apenas fecha os blocos empacotados do prompt padrão, não o seu texto personalizado." + ], + "starterTitle": "Prompt inicial", + "starterIntro": "O campo Prompt personalizado vem preenchido com um exemplo mínimo que pode adaptar:", + "showStarterSummary": "Mostrar o prompt personalizado inicial", + "shareTitle": "Partilhar prompts com a comunidade", + "shareIntro": "O botão Exportar guarda o prompt num ficheiro (.txt / .md) para cópia de segurança ou partilha. Importar carrega um ficheiro. O terceiro botão abre a galeria comunitária pública no GitHub:", + "shareLinkLabel": "github.com/MacRimi/ProxMenux/discussions — Compartilhe prompts personalizados para notificações de IA", + "shareOutro": "Consulte a discussão para ver os prompts de outros administradores: alertas curtos, relatórios técnicos detalhados e variantes linguísticas. Se gostar da sua adaptação, partilhe-a com um parágrafo sobre o objetivo. Também são bem-vindos comentários sobre o que funciona ou não." + }, + "suggestions": { + "heading": "Sugestões de IA (BETA)", + "intro": "As sugestões IA permitem adicionar uma dica curta e prática ao fim do texto. Exigem modo Predefinido, IA e Sugestões de IA ativos. O prompt pede para omitir a dica se a causa ou solução não for clara.", + "formatIntro": "Quando uma dica é adicionada, segue este formato exato:", + "rulesIntro": "As regras colocadas no addon (visível no bloco dobrável sob a seção de prompt padrão acima):", + "rules": [ + "A dica será incluída somente se o contexto do diário ou o banco de dados de Erros Conhecidos apontar claramente para uma correção específica.", + "O prompt pede uma dica com menos de 100 caracteres; o analisador não verifica esse limite separadamente.", + "O prompt exige um comando ou caminho concreto e pede ao modelo para evitar conselhos genéricos.", + "Se um Erro Conhecido fornece uma solução, o LLM deve usar essa solução, não inventar uma nova.", + "O prompt pede para omitir a dica se os dados não sustentarem uma correção concreta." + ], + "betaTitle": "POR QUE BETA", + "betaBody": "A qualidade das dicas depende do modelo e do contexto dos logs. Um modelo como Claude 3.5 Haiku, GPT-4.1 Mini ou Llama 3.3 70B, com dados smartctl e logs, pode dar dicas úteis. Um pequeno modelo Ollama local com um evento de uma linha pode dar um resultado pouco útil ou omitir a dica. Desative as sugestões se incomodarem e volte a ativá-las quando quiser." + }, + "detailLevel": { + "heading": "Nível de detalhe por canal", + "intro": "Cada um dos quatro canais (Telegram, Discord, Gotify, Email) tem seu próprio nível de detalhes. Três valores estão disponíveis, mapeados para token caps de saída específicos e para instruções específicas no prompt padrão:", + "headerLevel": "Nível", + "headerLabel": "Rótulo UI", + "headerCap": "Limite de saída", + "headerProduce": "O que o prompt pede ao LLM para produzir", + "rows": [ + { + "level": "breve", + "label": "2–3 linhas, apenas o essencial", + "cap": "500 tokens", + "produce": "\"O que aconteceu + onde\". Mais nada." + }, + { + "level": "padrão", + "label": "Conciso com o contexto básico", + "cap": "1500 tokens", + "produce": "3–6 linhas: o que aconteceu, onde, causa e dispositivos afetados." + }, + { + "level": "detalhado", + "label": "Detalhes técnicos completos", + "cap": "3000 tokens", + "produce": "Relatório completo: o que, onde, causa, afetado, logs, dados SMART, histórico." + } + ], + "defaultsIntro": "Predefinições na primeira instalação:", + "defaults": [ + "Telegram, Discord, Gotify — standard.", + "Email — detailed. Email é o canal onde você normalmente quer a imagem completa para arquivo." + ], + "emailTitle": "Nível de detalhes de e- mail adiciona o original", + "emailBody": "Se o formatador IA devolver um resultado para e-mail em detailed e o texto original tiver mais de 50 caracteres, acrescenta-o após 40 traços e Original message:. Os detalhes ficam disponíveis para pesquisas. Se a IA for ignorada ou falhar, pode ser enviado apenas o modelo original." + }, + "language": { + "heading": "Idioma", + "intro": "O seletor oferece treze idiomas. Guarda ai_language, utilizado no prompt predefinido em \"translate alerts into '{'language'}'\". A lista:", + "list": "Inglês (en), eslovaco (sk), espanhol (es), francês (fr), alemão (de), português (pt), italiano (it), russo (ru), sueco (sv), norueguês (no), japonês (ja), chinês (zh), neerlandês (nl).", + "rulesIntro": "Duas regras importantes tomadas diretamente do prompt:", + "rules": [ + "Traduzir: rótulos, descrições, estados e unidades, por exemplo GB → Go em francês.", + "Não traduz: nomes de máquinas, IPs, caminhos, IDs VM/CT, nomes de dispositivos como /dev/sdX, identificadores técnicos. Estes permanecem verbatim independentemente da linguagem." + ], + "customNote": "Modo de prompt personalizado não utilizar o seletor de idiomas. Se você mudar para Custom e quiser um idioma de saída específico, declare-o dentro de seu prompt." + }, + "templates": { + "heading": "Uma nota sobre modelos", + "body1": "A IA recebe o texto já produzido pelo modelo, não dados brutos. Tipos como vm_start, auth_fail e health_degraded têm modelos em notification_templates.py. A IA reformula os textos elegíveis; backup_complete e backup_fail mantêm relatórios determinísticos sem IA.", + "body2": "Os nomes de máquina e VMID já são preenchidos pelo modelo antes da reformulação. Com IA desativada, o texto do modelo é enviado diretamente. A página Notificações documenta todo o processo de envio e o que acontece antes desta etapa." + }, + "privacy": { + "heading": "Privacidade e fluxo de dados", + "intro": "Com a reescrita de IA habilitada, o Monitor envia o corpo de notificação renderizado mais os blocos de contexto enriquecidos para o provedor configurado. Isso pode incluir nomes de host, IPs, nomes de usuário, caminhos do dispositivo, linhas de registro de diário e atributos SMART para o dispositivo afetado. Se isso deixa a máquina depende de qual provedor você escolheu:", + "headerProvider": "Provedor", + "headerDestination": "Destino dos dados", + "rows": [ + { + "provider": "Ollama", + "destination": "Os modelos locais executam-se no host Ollama configurado. Se for o nó Proxmox, os pedidos permanecem nele. Os modelos cloud encaminham pedidos para fora do host, mesmo através de um servidor Ollama local." + }, + { + "provider": "OpenAI", + "destination": "api.openai.com por predefinição ou o URL base personalizado. Aplica-se a política de dados do operador real do serviço." + }, + { + "provider": "Anthropic", + "destination": "api.anthropic.com." + }, + { + "provider": "Google Gemini", + "destination": "generativelanguage.googleapis.com." + }, + { + "provider": "Groq", + "destination": "api.groq.com." + }, + { + "provider": "OpenRouter", + "destination": "openrouter.ai, que remete para o fornecedor do modelo subjacente escolhido no campo model. Dois saltos em vez de um." + } + ], + "calloutTitle": "Se o conteúdo do evento não puder sair da rede", + "calloutBody": "Utilize um serviço alojado localmente com um modelo local, como Ollama ou um servidor compatível com OpenAI, ou desative a IA. Os modelos cloud Ollama não processam os dados localmente. O módulo não anonimiza nomes de máquina ou IP; utiliza o conteúdo real do evento." + }, + "whereNext": { + "heading": "Para onde seguir", + "items": [ + { + "label": "Notificações", + "href": "/docs/monitor/notifications", + "tail": " — processo de envio, canais, opções por evento e integração do webhook PVE que envolve esta etapa." + }, + { + "label": "Monitor de Saúde", + "href": "/docs/monitor/health-monitor", + "tail": " — o maior produtor único de eventos que a IA acaba por reescrever, com as suas próprias durações de supressão por categoria." + }, + { + "label": "Arquitetura", + "href": "/docs/monitor/architecture", + "tail": " — quando o AI Enhancer se encaixa no processo Monitor mais amplo (é um módulo, não um serviço separado)." + } + ], + "communityLabel": "Prompts comunitários no GitHub", + "communityTail": " — navegar, partilhar, perguntar." + } +} diff --git a/web/messages/pt/docs/monitor/api-reference.json b/web/messages/pt/docs/monitor/api-reference.json new file mode 100644 index 00000000..33b4bed5 --- /dev/null +++ b/web/messages/pt/docs/monitor/api-reference.json @@ -0,0 +1,760 @@ +{ + "meta": { + "title": "API Proxmox Monitor — Referência de integração | ProxMenux", + "description": "Endpoints HTTP do ProxMenux Monitor para Home Assistant, Homepage, Grafana, Prometheus, n8n e painéis próprios. Consulta de estado e operações documentadas: controlo de VM, início de cópias, notificações e confirmação de alertas.", + "ogTitle": "API Proxmox Monitor — Referência de integração", + "ogDescription": "Endpoints do ProxMenux Monitor para Home Assistant, Homepage, Grafana, Prometheus, n8n e painéis próprios.", + "twitterTitle": "Monitor Proxmox API | ProxMenux", + "twitterDescription": "Endpoints para Home Assistant, Homepage, Grafana, Prometheus, n8n e painéis próprios." + }, + "header": { + "title": "Referência da API", + "description": "Endpoints HTTP para consultar estado e executar ações documentadas: sensores Home Assistant, cartões Homepage, painéis Grafana, recolha Prometheus, fluxos n8n e scripts próprios. Inclui categorias, métricas exportadas e exemplos curl.", + "section": "ProxMenux Monitor" + }, + "intro": { + "title": "Para que serve esta página", + "body": "Esta página reúne endpoints para integrações: leitura de dados, início de cópias, notificações próprias e confirmação de alertas. A API usa o processo Flask do painel na porta TCP 8008. O endereço de escuta e TLS são descritos em Acesso e autenticação." + }, + "headerEndpoint": "Endpoint", + "headerMethod": "Método", + "headerUse": "Utilização", + "auth": { + "heading": "Autenticação", + "intro": "Com autenticação ativa, os endpoints protegidos esperam um token JWT Bearer no cabeçalho:", + "tokensIntro": "Duas formas de obter o token:", + "items": [ + "Tokens API, recomendados para integrações. Válidos por 365 dias, criados em Segurança → Tokens API. Têm nome e revogação individual. Use read_only para dados e full_admin apenas para ações administrativas necessárias.", + "Início de sessão, JWT de 24 horas. POST /api/auth/login com utilizador, palavra-passe e TOTP se exigido pela 2FA. O JWT expira após 24 horas; os scripts devem voltar a autenticar-se." + ], + "flowLink": "Acesso, palavras-passe, 2FA, auditoria e TLS são descritos em Acesso e autenticação.", + "rows": [ + { + "endpoint": "/api/auth/login", + "method": "POST", + "use": "Campos do corpo (esquema): '{'\"username\",\"password\",\"totp_token?\"'}'. Devolve um JWT de 24 horas." + }, + { + "endpoint": "/api/auth/api-tokens", + "method": "GET", + "use": "Listar os tokens API (apenas metadados — nomes, prefixos, datas; nunca o segredo real)." + }, + { + "endpoint": "/api/auth/generate-api-token", + "method": "POST", + "use": "Cria um token API de 365 dias numa sessão autenticada. Campos: password, token_name?, totp_token?, scope?. Palavra-passe e TOTP exigido são verificados de novo. scope usa read_only por predefinição; full_admin exige escolha explícita. O segredo é devolvido uma só vez." + }, + { + "endpoint": "/api/auth/api-tokens/", + "method": "DELETE", + "use": "Revogar um token API específico pelo seu ID." + } + ] + }, + "conventions": { + "heading": "Convenções", + "items": [ + "A maioria usa JSON. Algumas transferências devolvem texto simples; /api/prometheus usa o formato de exposição Prometheus 0.0.4 em vez de OpenMetrics. Verifique o tipo de resposta de cada rota.", + "Muitas operações devolvem '{'\"success\": true, ...'}'. Os erros variam; um formato habitual é '{'\"success\": false, \"error\": \"'<'reason'>'\"'}'. Verifique estado HTTP e campos: alguns desafios de autenticação usam HTTP 200 com success false.", + "Os parâmetros dependem do endpoint. Use limit, offset, since e filtros de categoria apenas quando suportados.", + "Os formatos de tempo variam: marcas Unix, cadeias ISO-8601 e datas systemd. Não presuma a mesma unidade nem um fuso horário explícito em todos os campos." + ] + }, + "system": { + "heading": "Sistema e hardware", + "rows": [ + { + "endpoint": "/api/system", + "method": "GET", + "use": "Valores atuais de CPU, memória, swap, tempo de atividade e carga." + }, + { + "endpoint": "/api/info", + "method": "GET", + "use": "Informações estáticas do host: hostname, kernel, versão PVE, modelo CPU, distro." + }, + { + "endpoint": "/api/system-info", + "method": "GET", + "use": "Dados alargados usados no cabeçalho: métricas gerais e hora de arranque." + }, + { + "endpoint": "/api/hardware", + "method": "GET", + "use": "Inventário detalhado de hardware: dispositivos PCI, GPU e sensores." + }, + { + "endpoint": "/api/hardware/live", + "method": "GET", + "use": "Valores atuais de sensores que variam rapidamente." + }, + { + "endpoint": "/api/temperature/history", + "method": "GET", + "use": "Séries temporais das temperaturas da CPU e do encapsulamento." + }, + { + "endpoint": "/api/gpu//realtime", + "method": "GET", + "use": "Métricas atuais de GPU NVIDIA, Intel e AMD por posição PCI." + } + ] + }, + "actions": { + "heading": "Ações do sistema", + "intro": "Estas ações assíncronas usam unidades systemd temporárias. Com autenticação ativa, as escritas exigem full_admin; read_only pode consultar .../status. O início aceite devolve HTTP 202 e estado; consulte .../status para o progresso. Controlo de hóspedes e cópias usam respostas diferentes, descritas abaixo.", + "shapeTitle": "Forma de resposta comum", + "shapeIntro": "As ações de sistema assíncronas partilham este objeto JSON de estado. Controlo de hóspedes e cópias usam formatos diferentes:", + "shapeCode": "{\n \"unit\": \"proxmenux-action-pve-update.service\",\n \"state\": \"idle | running | success | failed | cancelled\",\n \"started_at\": \"Sat 2026-08-01 11:01:32 CEST\",\n \"finished_at\": null,\n \"exit_code\": null,\n \"result\": null\n}", + "concurrencyTitle": "Concurrência e cancelamento", + "concurrencyBody": "Iniciar outra execução da mesma ação ativa devolve HTTP 409. Só se pode cancelar com uma rota DELETE documentada, como na atualização PVE. O estado passa a cancelled e preserva as datas. Os estados finais ficam na memória do processo e podem perder-se ao reiniciar o Monitor.", + "rows": [ + { + "endpoint": "/api/system/power/reboot", + "method": "POST", + "use": "Inicia o reinício do anfitrião Proxmox. A ligação HTTP pode fechar quando systemd inicia o encerramento." + }, + { + "endpoint": "/api/system/power/reboot/status", + "method": "GET", + "use": "Estado do reinício atual ou anterior." + }, + { + "endpoint": "/api/system/power/shutdown", + "method": "POST", + "use": "Desliga o anfitrião Proxmox, por exemplo em resposta ao sinal de encerramento da UPS." + }, + { + "endpoint": "/api/system/power/shutdown/status", + "method": "GET", + "use": "Estado do encerramento atual ou anterior." + }, + { + "endpoint": "/api/system/pve-update/run", + "method": "POST", + "use": "Inicia a atualização PVE usada por Atualizar agora do Health Monitor e pelo menu da shell; delega em update-pve-safe.sh." + }, + { + "endpoint": "/api/system/pve-update/status", + "method": "GET", + "use": "Estado da atualização PVE atual ou anterior." + }, + { + "endpoint": "/api/system/pve-update", + "method": "DELETE", + "use": "Cancela uma atualização PVE em curso com SIGTERM." + }, + { + "endpoint": "/api/proxmenux/self-update/run", + "method": "POST", + "use": "Atualiza o ProxMenux com o instalador do canal estável ou beta configurado. Uma unidade systemd própria permite continuar durante o reinício de proxmenux-monitor feito pelo instalador." + }, + { + "endpoint": "/api/proxmenux/self-update/status", + "method": "GET", + "use": "Estado da atualização ProxMenux atual ou anterior." + }, + { + "endpoint": "/api/vms//control", + "method": "POST", + "use": "Envia um comando de controlo de VM ou LXC. action aceita start, stop, shutdown ou reboot. A resposta bem-sucedida devolve uma tarefa PVE confirmada, sem indicar que terminou. Consulte o endpoint control-task do hóspede para o resultado." + }, + { + "endpoint": "/api/vms//backup", + "method": "POST", + "use": "Cria uma cópia vzdump de VM ou LXC. Campos opcionais a adaptar ao armazenamento: storage (destino PVE), mode (snapshot, suspend ou stop), compress (zstd, lzo, gzip ou none), protected (true ou false), notes, notification (auto, always, failure ou never) e pbs_change_detection (default, legacy ou data). Devolve o UPID da tarefa PVE." + }, + { + "endpoint": "/api/vms//backups", + "method": "GET", + "use": "Listar backups anteriores para um VM ou LXC em todos os armazenamentos alcançáveis." + } + ], + "syncVsAsyncTitle": "Dois tipos de ações", + "syncVsAsyncBody": "Energia e atualizações do anfitrião usam unidades systemd temporárias com .../status. Só a atualização PVE tem aqui uma rota DELETE para cancelar. O controlo VM/LXC devolve uma tarefa a acompanhar; a cópia um UPID de trabalho em segundo plano. Aceitação não significa conclusão. Autenticação e permissões dependem da rota.", + "curlTitle": "Exemplo curl", + "curlBody": "Inicia uma atualização PVE e acompanha até terminar, como uma automação Home Assistant ou um playbook Ansible.", + "curlCode": "TOKEN=\n\ncurl -sSf -X POST \\\n -H \"Authorization: Bearer $TOKEN\" \\\n https://:8008/api/system/pve-update/run\n\nwhile true; do\n state=$(curl -sSf -H \"Authorization: Bearer $TOKEN\" \\\n https://:8008/api/system/pve-update/status | jq -r .state)\n [ \"$state\" != \"running\" ] && break\n sleep 30\ndone\necho \"final state: $state\"", + "haTitle": "Exemplo para Home Assistant", + "haBody": "Um sensor rest consulta o estado e rest_command inicia a atualização. Use-os com um botão do painel e as automações pretendidas:", + "haCode": "# configuration.yaml\nsensor:\n - platform: rest\n resource: https://pve.local:8008/api/system/pve-update/status\n name: pve_update_state\n value_template: \"{{ value_json.state }}\"\n scan_interval: 60\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\nrest_command:\n pve_update:\n url: https://pve.local:8008/api/system/pve-update/run\n method: POST\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\n # Start VM 100 (works for LXC too — same endpoint)\n vm_100_start:\n url: https://pve.local:8008/api/vms/100/control\n method: POST\n content_type: 'application/json'\n payload: '{\"action\": \"start\"}'\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\n # Backup VM 100 to the 'pbs-main' storage\n vm_100_backup:\n url: https://pve.local:8008/api/vms/100/backup\n method: POST\n content_type: 'application/json'\n payload: '{\"storage\": \"pbs-main\", \"mode\": \"snapshot\", \"compress\": \"zstd\"}'\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"" + }, + "health": { + "heading": "Monitor de Saúde", + "rows": [ + { + "endpoint": "/api/health", + "method": "GET", + "use": "Verificação leve que devolve JSON com status, timestamp e version. Serve para palavras-chave do Uptime Kuma; com autenticação ativa, o cliente deve enviar o cabeçalho Bearer." + }, + { + "endpoint": "/api/health/status", + "method": "GET", + "use": "Estado global: um nível de gravidade e um resumo." + }, + { + "endpoint": "/api/health/details", + "method": "GET", + "use": "As dez categorias com estado e dados estruturados de cada verificação." + }, + { + "endpoint": "/api/health/full", + "method": "GET", + "use": "Dados completos: categorias, erros ativos, alertas dispensados e definições de silenciamento. Usa resultados de fundo com menos de seis minutos; caso contrário, ou numa atualização forçada, faz nova verificação." + }, + { + "endpoint": "/api/health/active-errors", + "method": "GET", + "use": "Lista ativa, filtrada por ?category=<name>." + }, + { + "endpoint": "/api/health/dismissed", + "method": "GET", + "use": "Alertas dispensados com as horas de silenciamento restantes." + }, + { + "endpoint": "/api/health/settings", + "method": "GET", + "use": "Duração do silenciamento configurada por categoria." + }, + { + "endpoint": "/api/health/remote-storages", + "method": "GET", + "use": "Inventário de armazenamentos remotos definidos por Proxmox, com estado online." + }, + { + "endpoint": "/api/health/interfaces", + "method": "GET", + "use": "Interfaces de rede com tipo (bridge / bond / física), IP e velocidade da ligação." + }, + { + "endpoint": "/api/health/acknowledge", + "method": "POST", + "use": "Corpo: '{'\"error_key\":\"smart_sdh\"'}'. Silencia um alerta durante o período configurado para a categoria." + }, + { + "endpoint": "/api/health/cleanup-orphans", + "method": "POST", + "use": "Limpeza manual de erros cujo dispositivo subjacente ou VM desapareceu. Idempotente." + } + ], + "outro": "Os formatos das respostas e as categorias são descritos em Health Monitor." + }, + "storage": { + "heading": "Armazenamento", + "rows": [ + { + "endpoint": "/api/storage", + "method": "GET", + "use": "Discos visíveis pelo anfitrião: dispositivos de blocos, pools ZFS e LVM." + }, + { + "endpoint": "/api/storage/summary", + "method": "GET", + "use": "Resumo compacto usado nos cartões do painel." + }, + { + "endpoint": "/api/proxmox-storage", + "method": "GET", + "use": "Armazenamentos definidos por Proxmox de /etc/pve/storage.cfg com estado online e espaço livre." + }, + { + "endpoint": "/api/storage/observations", + "method": "GET", + "use": "Histórico persistente: avisos SMART, erros de E/S e eventos ZFS. Mantém-se após a resolução automática dos alertas." + }, + { + "endpoint": "/api/storage/smart/", + "method": "GET", + "use": "Atributos SMART atuais para um disco." + }, + { + "endpoint": "/api/storage/smart//latest", + "method": "GET", + "use": "Mais recente SMART auto-teste para o disco." + }, + { + "endpoint": "/api/storage/smart//history", + "method": "GET", + "use": "Lista de relatórios SMART armazenados para o disco." + }, + { + "endpoint": "/api/storage/smart//history/", + "method": "GET", + "use": "Leia um relatório SMART armazenado específico." + }, + { + "endpoint": "/api/storage/smart//test", + "method": "POST", + "use": "Inicia um autoteste SMART. Esquema do corpo: '{'\"type\":\"short\"|\"long\"'}'." + }, + { + "endpoint": "/api/storage/smart/schedules", + "method": "GET", + "use": "Listar os testes SMART programados atualmente." + }, + { + "endpoint": "/api/storage/smart/tools", + "method": "GET", + "use": "Verifica se smartctl e as ferramentas associadas estão instalados." + } + ] + }, + "network": { + "heading": "Rede", + "rows": [ + { + "endpoint": "/api/network", + "method": "GET", + "use": "Todas as interfaces com o estado de ligação e endereços." + }, + { + "endpoint": "/api/network/summary", + "method": "GET", + "use": "Visualização compacta usada pelo painel." + }, + { + "endpoint": "/api/network//metrics", + "method": "GET", + "use": "RX/TX por interface, contadores de erros e séries temporais RRD." + }, + { + "endpoint": "/api/network/latency/current", + "method": "GET", + "use": "Última medição de latência até ao gateway." + }, + { + "endpoint": "/api/network/latency/history", + "method": "GET", + "use": "Série temporal de latência do gateway." + } + ] + }, + "vms": { + "heading": "VMs e contêineres", + "rows": [ + { + "endpoint": "/api/vms", + "method": "GET", + "use": "VM e CT do nó local com estado, vmid e nome." + }, + { + "endpoint": "/api/vms/", + "method": "GET", + "use": "Detalhes completos de um sistema convidado: configuração, rede e discos." + }, + { + "endpoint": "/api/vms//metrics", + "method": "GET", + "use": "Séries temporais de CPU, memória e E/S de disco de um sistema convidado (RRD)." + }, + { + "endpoint": "/api/vms//logs", + "method": "GET", + "use": "Registos de tarefas recentes desse hóspede." + }, + { + "endpoint": "/api/vms//backups", + "method": "GET", + "use": "Cópias de segurança guardadas para este sistema convidado." + }, + { + "endpoint": "/api/vms//control", + "method": "POST", + "use": "Escolha uma ação do esquema: '{'\"action\":\"start|stop|reboot|shutdown\"'}'. Controla a alimentação do sistema convidado." + }, + { + "endpoint": "/api/vms//backup", + "method": "POST", + "use": "Inicia vzdump para o hóspede. O corpo indica armazenamento e modo (snapshot / suspend / stop)." + }, + { + "endpoint": "/api/vms//config", + "method": "PUT", + "use": "Atualizar o campo de descrição (notas) de um VM / CT. Outras chaves de configuração não são modificáveis a partir deste endpoint." + }, + { + "endpoint": "/api/node/metrics", + "method": "GET", + "use": "Métricas agregadas do nó em séries RRD." + } + ] + }, + "backups": { + "heading": "Cópias de segurança", + "rows": [ + { + "endpoint": "/api/backups", + "method": "GET", + "use": "Cópias encontradas nos armazenamentos dir, NFS, CIFS e PBS consultados através do nó local. Não percorre todos os nós do cluster." + }, + { + "endpoint": "/api/backup-storages", + "method": "GET", + "use": "Armazenamentos indicados como destinos de cópias, com espaço livre." + } + ] + }, + "logs": { + "heading": "Registos, tarefas, eventos", + "rows": [ + { + "endpoint": "/api/logs", + "method": "GET", + "use": "Entradas filtradas no diário. Consulta: ?level=&service=&limit=." + }, + { + "endpoint": "/api/logs/download", + "method": "GET", + "use": "Exporta o intervalo filtrado como texto simples." + }, + { + "endpoint": "/api/events", + "method": "GET", + "use": "Fluxo de eventos internos — o mesmo que alimenta notificações." + }, + { + "endpoint": "/api/task-log/", + "method": "GET", + "use": "Registo completo em texto simples de uma tarefa Proxmox identificada por UPID." + } + ] + }, + "notifications": { + "heading": "Notificações e IA", + "intro": "Envio, canais e reformulação com IA são descritos em Notificações e Assistente de IA.", + "rows": [ + { + "endpoint": "/api/notifications", + "method": "GET", + "use": "Notificações recentes apresentadas no painel." + }, + { + "endpoint": "/api/notifications/download", + "method": "GET", + "use": "Exporta as notificações como texto." + }, + { + "endpoint": "/api/notifications/status", + "method": "GET", + "use": "Estado do envio: processo de fundo ativo, tamanho da fila e último envio." + }, + { + "endpoint": "/api/notifications/settings", + "method": "GET", + "use": "Lê a configuração das notificações: canais, controlos por evento, reformulação IA e nome apresentado." + }, + { + "endpoint": "/api/notifications/history", + "method": "GET", + "use": "Histórico de envio. Parâmetros: ?limit=&offset=&severity=&channel=." + }, + { + "endpoint": "/api/notifications/history", + "method": "DELETE", + "use": "Limpa a tabela do histórico de envio." + }, + { + "endpoint": "/api/notifications/test", + "method": "POST", + "use": "Envia uma notificação de teste a um canal. Corpo: '{'\"channel\":\"telegram\"'}'." + }, + { + "endpoint": "/api/notifications/send", + "method": "POST", + "use": "Emite um evento personalizado. Corpo: '{'\"event_type\":\"custom\",\"severity\":\"WARNING\",\"title\":\"...\",\"body\":\"...\",\"data\":'{''}''}'." + }, + { + "endpoint": "/api/notifications/test-ai", + "method": "POST", + "use": "Testa a ligação ao fornecedor de IA. Campos do corpo (esquema): '{'\"provider\",\"api_key\",\"model\",\"ollama_url?\"'}'." + }, + { + "endpoint": "/api/notifications/provider-models", + "method": "POST", + "use": "Listar modelos disponíveis para o fornecedor de IA selecionado." + }, + { + "endpoint": "/api/notifications/proxmox/setup-webhook", + "method": "POST", + "use": "Registar o Monitor como alvo webhook em /etc/pve/notifications.cfg." + }, + { + "endpoint": "/api/notifications/proxmox/cleanup-webhook", + "method": "POST", + "use": "Remova o alvo Monitor da configuração de notificação do PVE." + }, + { + "endpoint": "/api/notifications/proxmox/read-cfg", + "method": "GET", + "use": "Leia o notifications.cfg atual do PVE como ele vê." + } + ] + }, + "security": { + "heading": "Segurança (leitura)", + "rows": [ + { + "endpoint": "/api/security/firewall/status", + "method": "GET", + "use": "Estado de firewall PVE e regras ativas." + }, + { + "endpoint": "/api/security/fail2ban/details", + "method": "GET", + "use": "Estado do jail Fail2Ban; exige esse componente opcional instalado." + }, + { + "endpoint": "/api/security/fail2ban/activity", + "method": "GET", + "use": "Eventos recentes Fail2Ban: bloqueios, desbloqueios e arranques do jail." + }, + { + "endpoint": "/api/security/lynis/status", + "method": "GET", + "use": "Estado do Lynis: instalação e data da última análise." + }, + { + "endpoint": "/api/security/lynis/report", + "method": "GET", + "use": "Último relatório Lynis: avisos, sugestões e índice de reforço da segurança." + }, + { + "endpoint": "/api/security/tools", + "method": "GET", + "use": "Detecte quais ferramentas de segurança opcionais (Fail2Ban, Lynis) estão instaladas." + } + ] + }, + "proxmenuxIntegration": { + "heading": "Integração ProxMenux", + "rows": [ + { + "endpoint": "/api/proxmenux/update-status", + "method": "GET", + "use": "Disponibilidade de atualização do ProxMenux Monitor, versão instalada e mais recente." + }, + { + "endpoint": "/api/proxmenux/installed-tools", + "method": "GET", + "use": "Lista de cada otimização pós-instalação ProxMenux atualmente registrada no host (de /usr/local/share/proxmenux/installed_tools.json)." + }, + { + "endpoint": "/api/proxmenux/tool-source/", + "method": "GET", + "use": "Código da função pós-instalação associada, extraído dos scripts atuais do anfitrião ou de código antigo preservado. Não garante uma cópia do código executado originalmente." + } + ] + }, + "prometheus": { + "heading": "Métricas Prometheus", + "intro": "O endpoint autenticado GET /api/prometheus devolve o formato de texto Prometheus 0.0.4. Cada métrica inclui node=\"<hostname>\" e uma marca temporal explícita. Recolha com Prometheus ou outra base temporal compatível.", + "exportedTitle": "métricas exportadas", + "headerGroup": "Grupo", + "headerMetric": "Métrica", + "headerDesc": "Descrição", + "groups": [ + { + "group": "Sistema", + "metrics": [ + { + "metric": "proxmox_cpu_usage", + "desc": "Percentagem de utilização da CPU, tipo gauge." + }, + { + "metric": "proxmox_memory_total_bytes", + "desc": "Memória física total em bytes." + }, + { + "metric": "proxmox_memory_used_bytes", + "desc": "Memória utilizada em bytes." + }, + { + "metric": "proxmox_memory_usage_percent", + "desc": "Percentagem de utilização da memória." + }, + { + "metric": "proxmox_load_average", + "desc": "Média de carga do sistema. Rótulo period=\"1m\" | \"5m\" | \"15m\"." + } + ] + }, + { + "group": "Tempo de atividade", + "metrics": [ + { + "metric": "proxmox_uptime_seconds", + "desc": "Segundos desde o último arranque." + } + ] + }, + { + "group": "Hardware", + "metrics": [ + { + "metric": "proxmox_cpu_temperature_celsius", + "desc": "Temperatura do encapsulamento da CPU." + }, + { + "metric": "proxmox_disk_temperature_celsius", + "desc": "Temperatura por disco. Rótulo disk." + }, + { + "metric": "proxmox_fan_speed_rpm", + "desc": "Velocidades das ventoinhas. Rótulo fan." + } + ] + }, + { + "group": "Espaço em disco", + "metrics": [ + { + "metric": "proxmox_disk_total_bytes", + "desc": "Capacidade total de cada entrada de disco exportada. Rótulo disk." + }, + { + "metric": "proxmox_disk_used_bytes", + "desc": "Capacidade utilizada de cada entrada de disco exportada." + }, + { + "metric": "proxmox_disk_usage_percent", + "desc": "Percentagem utilizada de cada entrada de disco exportada." + } + ] + }, + { + "group": "Rede", + "metrics": [ + { + "metric": "proxmox_network_bytes_sent_total", + "desc": "Total de bytes enviados, tipo counter." + }, + { + "metric": "proxmox_network_bytes_received_total", + "desc": "Total de bytes recebidos, tipo counter." + }, + { + "metric": "proxmox_interface_bytes_sent_total", + "desc": "Bytes enviados por interface. Rótulo interface." + }, + { + "metric": "proxmox_interface_bytes_received_total", + "desc": "Bytes recebidos por interface." + } + ] + }, + { + "group": "VMs / CTs", + "metrics": [ + { + "metric": "proxmox_vms_total", + "desc": "Número total de VMs e LXCs." + }, + { + "metric": "proxmox_vms_running", + "desc": "Número de sistemas convidados em execução." + }, + { + "metric": "proxmox_vms_stopped", + "desc": "Número de convidados parados." + }, + { + "metric": "proxmox_vm_status", + "desc": "Estado por VM/CT: 1 em execução, 0 nos restantes estados. Rótulos node, vmid e name." + }, + { + "metric": "proxmox_vm_cpu_usage", + "desc": "Utilização de CPU por VM/CT, com os mesmos rótulos." + }, + { + "metric": "proxmox_vm_memory_used_bytes / _max_bytes", + "desc": "Memória utilizada e máximo configurado por VM/CT." + } + ] + }, + { + "group": "GPU", + "metrics": [ + { + "metric": "proxmox_gpu_temperature_celsius", + "desc": "Temperatura GPU. Rótulos slot e vendor; gpu inclui também o nome da GPU." + }, + { + "metric": "proxmox_gpu_utilization_percent", + "desc": "Percentagem de utilização da GPU." + }, + { + "metric": "proxmox_gpu_memory_total_bytes", + "desc": "Memória total da GPU." + }, + { + "metric": "proxmox_gpu_power_draw_watts", + "desc": "Potência consumida pela GPU em watts." + }, + { + "metric": "proxmox_gpu_clock_speed_mhz", + "desc": "Frequência do núcleo da GPU." + }, + { + "metric": "proxmox_gpu_memory_clock_mhz", + "desc": "Frequência da memória da GPU." + } + ] + }, + { + "group": "UPS", + "metrics": [ + { + "metric": "proxmox_ups_battery_charge_percent", + "desc": "Percentagem de carga da bateria." + }, + { + "metric": "proxmox_ups_load_percent", + "desc": "Carga actual na UPS." + }, + { + "metric": "proxmox_ups_runtime_seconds", + "desc": "Autonomia estimada em bateria." + }, + { + "metric": "proxmox_ups_input_voltage_volts", + "desc": "Tensão de entrada." + } + ] + } + ], + "scrapeTitle": "Configuração de recolha do Prometheus", + "scrapeIntro": "Com autenticação ativa, adicione um token API ao cabeçalho Bearer da configuração de recolha Prometheus:", + "perHostTitle": "Recolha por anfitrião", + "perHostBody": "Cada instância exporta métricas do seu anfitrião. Num cluster, configure Prometheus para consultar cada nó. O rótulo node distingue as séries no Grafana (proxmox_vms_running'{'node=\"pve01\"'}')." + }, + "puttingItTogether": { + "heading": "Combinar as integrações", + "body": "Consulte Integrações para ligar os endpoints a sensores Home Assistant, cartões Homepage, painéis Grafana, fluxos n8n e outras ferramentas. Inclui configurações habituais copiáveis de cada plataforma. Esta página reúne o catálogo de endpoints." + }, + "whereNext": { + "heading": "Para continuar", + "items": [ + { + "label": "Acesso e autenticação", + "href": "/docs/monitor/access-auth", + "tail": " — criação de tokens, registo de auditoria, jail Fail2Ban opcional e TLS." + }, + { + "label": "Notificações", + "href": "/docs/monitor/notifications", + "tailRich": " — conteúdo de data por evento ao chamar /api/notifications/send." + }, + { + "label": "Assistente de IA", + "href": "/docs/monitor/ai-assistant", + "tailRich": " — funcionamento de /api/notifications/test-ai e /api/notifications/provider-models." + }, + { + "label": "Monitor de Saúde", + "href": "/docs/monitor/health-monitor", + "tailRich": " — formato das respostas de /api/health/* e significado das dez categorias." + } + ] + } +} diff --git a/web/messages/pt/docs/monitor/architecture.json b/web/messages/pt/docs/monitor/architecture.json new file mode 100644 index 00000000..ec6c53ad --- /dev/null +++ b/web/messages/pt/docs/monitor/architecture.json @@ -0,0 +1,303 @@ +{ + "meta": { + "title": "Arquitetura do ProxMenux Monitor — AppImage, Flask, SQLite, WebSocket | ProxMenux", + "description": "Construção do ProxMenux Monitor: estrutura AppImage, blueprints Flask, tarefas de fundo, dados de psutil, pvesh, smartctl e journalctl, armazenamento SQLite, terminal WebSocket, fornecedores IA, canais de notificação, proxy inverso e Fail2Ban opcional.", + "ogTitle": "Arquitetura ProxMenux Monitor", + "ogDescription": "Dentro do ProxMenux Monitor: AppImage, blueprints Flask, tarefas de fundo, SQLite, WebSocket, fornecedores IA e canais de notificação.", + "twitterTitle": "Arquitetura ProxMenux Monitor", + "twitterDescription": "AppImage, Flask, SQLite, WebSocket, fornecedores de IA e canais de notificação — dentro do Monitor." + }, + "header": { + "title": "Arquitetura", + "description": "Como se distribui o ProxMenux Monitor, o que contém o AppImage e como os pedidos do navegador passam pelo Flask até às ferramentas do anfitrião e ao armazenamento SQLite.", + "section": "ProxMenux Monitor" + }, + "intro": { + "title": "Um processo, muitas responsabilidades", + "body": "Um processo Python escuta em TCP 8008. Serve a versão estática Next.js, disponibiliza a API REST, gere o terminal WebSocket, executa Health Monitor e envia notificações. Não exige servidor web separado, intermediário de mensagens ou base de dados externa." + }, + "requestFlow": { + "heading": "Percurso de um pedido", + "intro": "Um pedido de dados típico segue este percurso; as preferências do navegador podem ser tratadas localmente:", + "diagramCaption": "As rotas protegidas validam JWT com autenticação ativa. Rotas principais e blueprints devolvem dados em cache ou acabados de recolher. A verificação Fail2Ban opcional consulta a lista de bloqueios em cache. Cabeçalhos IP reencaminhados só são aceites com PROXMENUX_TRUST_PROXY=1; caso contrário, usa-se o endereço da ligação. O estado persistente inclui SQLite e ficheiros JSON como auth.json.", + "diagramArrowLabel": "HTTP / WS", + "nodes": { + "clientLabel": "Cliente", + "clientDetail": "Navegador ou PWA\n+ proxy opcional\nNginx / Caddy /\nTraefik", + "flaskLabel": "Flask :8008", + "flaskDetail": "Blueprints\nMiddleware JWT\nVerificação Fail2Ban\n(se instalado)", + "hostLabel": "Ferramentas do anfitrião", + "hostDetail": "psutil\npvesh\nsmartctl\njournalctl", + "stateLabel": "Estado local", + "stateDetail": "SQLite DB\n+ auth.json" + }, + "threadsIntro": "O processo executa também threads em segundo plano. Estes exemplos recolhem dados, atualizam caches e SQLite e enviam notificações. Existem outras tarefas; o envio depende de estar ativado:", + "headerThread": "Thread", + "headerCadence": "Cadência", + "headerJob": "Tarefa agendada", + "rows": [ + { + "thread": "_temperature_collector_loop", + "cadence": "60 s", + "job": "Guarda temperatura CPU e amostras de latência na base histórica, mantendo dados para os gráficos sem navegador ligado." + }, + { + "thread": "_health_collector_loop", + "cadence": "5 min", + "job": "Executa o ciclo Health Monitor de dez categorias, guarda erros e observações de discos, mantém as dispensas e passa novos eventos ao motor de notificações." + }, + { + "thread": "_vital_signs_sampler", + "cadence": "CPU 5 s; temperatura 15 s; memória 30 s", + "job": "Recolhe CPU, memória e temperatura CPU para indicadores e deteção de condições prolongadas, independentemente da análise geral de cinco minutos." + }, + { + "thread": "notification_manager.start()", + "cadence": "orientado por eventos", + "job": "Inicia os observadores de journal, tarefas e hooks (JournalWatcher, TaskWatcher, ProxmoxHookWatcher) e envia para os canais configurados, com reformulação IA opcional." + } + ] + }, + "systemd": { + "heading": "Unidade systemd", + "intro": "O instalador cria a unidade /etc/systemd/system/proxmenux-monitor.service. Configuração predefinida:", + "items": [ + "User=root: o serviço usa privilégios root para SMART, pvesh e gestão ZFS. Os processos do terminal web herdam estas permissões.", + "Restart=on-failure com espera de dez segundos: o serviço reinicia automaticamente após uma saída com erro.", + "After=network.target: ordena o arranque após esse alvo; não garante IP atribuído, DNS ou ligação externa." + ], + "inspectTitle": "Consultar a unidade atual" + }, + "appimage": { + "heading": "Qual a composição de AppImage", + "intro": "O AppImage contém um sistema de ficheiros montado ao executar. AppRun na raiz prepara o ambiente e inicia flask_server.py:", + "consequencesIntro": "Duas consequências deste layout:", + "consequences": [ + "Ambiente Python incluído. O interpretador e os pacotes estão no AppImage, sem instalação no Python do sistema. A aplicação continua a usar interfaces do kernel e ferramentas externas do anfitrião.", + "Clientes de hardware incluídos. Contém ipmitool, lm-sensors e upsc. As leituras dependem do hardware compatível, acesso aos sensores e, para a UPS, de um servidor NUT configurado." + ] + }, + "flask": { + "heading": "Estrutura da aplicação Flask", + "intro": "flask_server.py cria uma instância Flask(__name__) com CORS limitado, regista diretamente nove blueprints e inicia o terminal. A tabela destaca módulos principais; regista também auditoria, cópias VM e PBS. As pré-cargas PVE só funcionam em anfitriões PVE.", + "headerBlueprint": "Blueprint / módulo", + "headerPrefix": "Prefixo das rotas", + "headerOwns": "Responsabilidade", + "rows": [ + { + "blueprint": "flask_server.py", + "prefix": [ + "/api/system", + "/api/storage", + "/api/network", + "/api/vms", + "/api/hardware", + "/api/logs", + "/api/prometheus" + ], + "owns": "Endpoints principais, web estática e verificação Fail2Ban opcional quando o jail proxmenux existe no anfitrião." + }, + { + "blueprint": "flask_auth_routes.py", + "prefix": [ + "/api/auth/*" + ], + "owns": "Início de sessão, emissão JWT, configuração e verificação TOTP, alteração de palavra-passe e tokens API." + }, + { + "blueprint": "flask_health_routes.py", + "prefix": [ + "/api/health/*" + ], + "owns": "Verificações de estado, detalhes, erros ativos e dispensados e definições de silenciamento. As rotas protegidas exigem autenticação quando ativa." + }, + { + "blueprint": "flask_terminal_routes.py", + "prefix": [ + "/api/terminal/* + WS" + ], + "owns": "Atribui um PTY por sessão e liga-o por WebSocket ao xterm.js do navegador." + }, + { + "blueprint": "flask_notification_routes.py", + "prefix": [ + "/api/notifications/*" + ], + "owns": "Criar, consultar, editar e remover canais; testes, IA, histórico e envios manuais." + }, + { + "blueprint": "flask_security_routes.py", + "prefix": [ + "/api/security/*" + ], + "owns": "Falhas de acesso e, com Fail2Ban instalado, estado do jail, bloqueios e desbloqueio manual." + }, + { + "blueprint": "flask_proxmenux_routes.py", + "prefix": [ + "/api/proxmenux/*" + ], + "owns": "Lê as otimizações ProxMenux registadas no anfitrião." + }, + { + "blueprint": "flask_oci_routes.py", + "prefix": [ + "/api/oci/*" + ], + "owns": "Funções de implementação de aplicações OCI e contentores no Proxmox VE 9.1+." + } + ], + "endpointsLink": "Os endpoints de integração e os formatos são descritos em Referência da API." + }, + "dataSources": { + "heading": "Fontes de dados", + "intro": "Os dados do anfitrião vêm sobretudo de bibliotecas padrão, ficheiros e comandos de administração. Alguns dados dos sistemas convidados dependem também do QEMU Guest Agent ou de comandos no CT:", + "headerSource": "Origem", + "headerUsedFor": "Usado para", + "rows": [ + { + "source": "psutil", + "usedFor": "Carga CPU, memória, swap, ocupação das montagens, contadores de rede e processos." + }, + { + "source": "pvesh / qm / pct", + "usedFor": "Informações do nó Proxmox, inventário e configuração VM/CT, armazenamento e histórico de tarefas." + }, + { + "source": "smartctl", + "usedFor": "Atributos SATA/NVMe, estado SMART, desgaste, vida útil, modelo e número de série." + }, + { + "source": "zpool / zfs", + "usedFor": "Estado do pool (ONLINE / DEGRADED / FAULTED / UNAVAIL), progresso do scrub e utilização dos datasets." + }, + { + "source": "journalctl", + "usedFor": "Registos do sistema, processos terminados por OOM, erros ATA/NVMe/dm, segurança e unidades de serviço próprias." + }, + { + "source": "ip / iproute2", + "usedFor": "Interfaces, endereços, bridges, bonds e dispositivos geridos por OVS." + }, + { + "source": "nvidia-smi · intel_gpu_top", + "usedFor": "Dados GPU disponíveis de utilização, VRAM, temperatura e codificação/descodificação. Os campos dependem do fabricante, ferramenta e controlador." + }, + { + "source": "lspci · lscpu · dmidecode", + "usedFor": "Topologia PCIe, modelo e topologia CPU, placa principal e BIOS." + }, + { + "source": "ipmitool · sensors", + "usedFor": "Sensores fora de banda, ventoinhas e temperaturas da placa, quando o hardware permite." + }, + { + "source": "upsc (NUT)", + "usedFor": "Estado da bateria, carga e autonomia UPS com um servidor NUT configurado." + } + ], + "cacheTitle": "Cache para reduzir consultas ao anfitrião", + "cacheBody": "Os resultados dispendiosos de smartctl -a e pvesh get ficam temporariamente no processo Flask para reduzir consultas aos discos e à API do cluster. A duração depende da fonte: segundos para métricas e minutos para SMART." + }, + "persistence": { + "heading": "Persistência", + "intro": "Vários ficheiros de estado têm conteúdos e requisitos de acesso diferentes:", + "headerPath": "Path", + "headerOwner": "Proprietário", + "headerContents": "Conteúdo", + "rows": [ + { + "path": "/usr/local/share/proxmenux/health_monitor.db", + "owner": "root:root", + "contents": "Base SQLite. Tabelas: errors, events, disk_registry, disk_observations, user_settings, notification_history, excluded_storages, excluded_interfaces. Registo em modo WAL." + }, + { + "path": "/usr/local/share/proxmenux/.notification_key", + "owner": "root 0600", + "contents": "Chave principal de 32 bytes para segredos de notificação ENC2. Usa salt aleatório por valor, chaves derivadas e MAC. Os valores XOR antigos são suportados para migração." + }, + { + "path": "/root/.config/proxmenux-monitor/auth.json", + "owner": "root:root", + "contents": "Configuração de acesso: ativação, utilizador, hash PBKDF2-HMAC-SHA256 da palavra-passe com salt, segredo TOTP, códigos de recuperação, chave JWT da instalação, metadados dos tokens API e hashes de revogação. Hashes SHA-256 antigos migram após um início de sessão bem-sucedido." + }, + { + "path": "/var/log/proxmenux-auth.log", + "owner": "root:root", + "contents": "Registo de autenticação em texto simples, independente do Fail2Ban. Se o jail [proxmenux] estiver instalado e ativo, lê o ficheiro para detetar falhas repetidas. Sem esse jail, o registo continua disponível para consulta." + } + ], + "backupTitle": "Guardar auth.json antes de reinstalar", + "backupBody": "Substituir o AppImage normalmente preserva /root/.config/proxmenux-monitor/auth.json e /usr/local/share/proxmenux/health_monitor.db. Guarde auth.json com jwt_secret para manter validade e metadados dos tokens. A base guarda separadamente estado e notificações. Guarde .notification_key com ela para restaurar segredos dos canais; a base isolada não restaura a autenticação API." + }, + "health": { + "heading": "Ciclo Health Monitor", + "intro": "Aproximadamente a cada cinco minutos, o processo de fundo chama health_monitor.py para verificar as dez categorias do painel:", + "items": [ + "Serviços PVE críticos (pveproxy, pvedaemon, pvestatd, pve-cluster).", + "Armazenamentos Proxmox: pvesh get /storage e disponibilidade de cada um.", + "Discos e sistemas de ficheiros: SMART, erros de E/S no dmesg, estado ZFS e capacidade das montagens.", + "VM e CT: falhas de arranque, paragens inesperadas, erros QMP e falhas de encerramento.", + "Rede: estado de bridges e bonds, ligações e latência até ao gateway.", + "Atualizações: pacotes pendentes e correções de segurança.", + "Registos: padrões persistentes, picos e cascatas no journal do sistema.", + "Memória: intervenções do OOM killer e pressão RAM prolongada.", + "Temperatura: leituras CPU e discos face aos limites de monitorização; os sensores disponíveis dependem do hardware.", + "Segurança: falhas de acesso, bloqueios e estado do jail Fail2Ban." + ], + "afterIntro": "Os resultados usam error_key, categoria e gravidade estáveis. As linhas de errors recebem last_seen e contagens, sem duplicação. O envio de notificações tem também impressões e intervalos próprios.", + "cycleEnd": "A limpeza pode resolver erros antigos com a duração de silenciamento por categoria e regras de estado, retirar registos órfãos de recursos removidos e apagar events com mais de 30 dias. As categorias estão em Painel → Health Monitor." + }, + "notifications": { + "heading": "Motor de notificação", + "intro": "notification_manager.py coordena o envio: carrega canais, gere a fila e disponibiliza uma API Python para Flask e Health Monitor e uma entrada CLI para os hooks .sh do ProxMenux.", + "items": [ + "Os observadores geram eventos: JournalWatcher acompanha o journal, TaskWatcher consulta tarefas Proxmox, ProxmoxHookWatcher recebe hooks de cópias, replicação e snapshots e PollingCollector gere fontes lentas.", + "Os modelos convertem eventos em título e texto. O fornecedor IA configurado (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter) pode reformulá-los em linguagem natural. Ambas as versões ficam em notification_history.", + "Os canais enviam por serviços como Telegram, Discord, email, Gotify, Pushover e Apprise. As implementações em notification_channels.py partilham create_channel() / send().", + "Cifragem. As definições sensíveis (telegram.bot_token, discord.webhook_url, pushover.user_key, pushover.api_token, ai_api_key_*, email.password) são cifradas com a chave de .notification_key antes de guardar e apresentadas de forma mascarada." + ], + "linksFooter": "Controlos por evento, opções dos canais e IA são descritos em Definições → Notificações e Definições → Assistente de IA." + }, + "websocket": { + "heading": "Terminal WebSocket", + "intro": "A aba Terminal liga um cliente leve xterm.js a um PTY do servidor por WebSocket. Existem dois modos:", + "items": [ + "Modo HTTP, predefinido: o servidor Flask incluído e flask-sock tratam a mudança de protocolo para WebSocket.", + "Modo HTTPS / WSS: usa gevent.pywsgi.WSGIServer com geventwebsocket.handler.WebSocketHandler para WebSocket sobre TLS." + ], + "outro": "Os processos do terminal herdam User=root. Com autenticação ativa, WebSocket exige um ticket breve de uso único obtido pelo endpoint autenticado com permissões administrativas. Se a autenticação estiver desativada ou recusada, a ligação segue esse modo sem autenticação.", + "proxyNote": "Num proxy inverso, permita WebSocket e os cabeçalhos Upgrade e Connection. O terminal precisa desse encaminhamento." + }, + "proxy": { + "heading": "Proxy inverso e Fail2Ban", + "intro": "A escolha do IP do cliente e o bloqueio opcional na aplicação dependem destas definições e componentes:", + "items": [ + "Escolha do IP do cliente. A verificação before_request e o registo de acesso só aceitam X-Forwarded-For, depois X-Real-IP, com PROXMENUX_TRUST_PROXY=1. Caso contrário, usam request.remote_addr. Cabeçalhos reencaminhados não são aceites automaticamente.", + "Fail2Ban opcional na aplicação. Uma ligação proxy pode apresentar o IP do proxy como origem TCP. Com o IP fiável do cliente e o jail proxmenux ativo, Flask rejeita IP bloqueados com HTTP 403. A lista fica em cache por 30 segundos e renova-se ao processar pedidos após expirar, sem temporizador dedicado." + ], + "calloutTitle": "Fail2Ban não está incluído", + "calloutBody": "Fail2Ban não está incluído nem se instala automaticamente. Pode ser instalado em Segurança do Monitor ou Segurança → Fail2Ban no ProxMenux Scripts. Sem fail2ban-client ou o jail proxmenux, esta verificação não bloqueia pedidos. A autenticação segue a política configurada.", + "outro": "Os exemplos Nginx/Caddy/Traefik e o guia do jail estão em Acesso e autenticação e Segurança → Fail2Ban." + }, + "whereNext": { + "heading": "Para continuar", + "items": [ + { + "label": "Acesso e autenticação", + "href": "/docs/monitor/access-auth", + "tail": " — primeiro arranque, palavra-passe e TOTP 2FA, exemplos de proxy inverso e jail Fail2Ban." + }, + { + "label": "Referência da API", + "href": "/docs/monitor/api", + "tail": " — endpoints de integração, gestão de tokens e convenções de autenticação." + }, + { + "label": "Configurações → ProxMenux Monitor", + "href": "/docs/settings/proxmenux-monitor", + "tail": " — controlo do serviço e verificação do estado no menu de texto ProxMenux." + } + ] + } +} diff --git a/web/messages/pt/docs/monitor/audit-report/assessment.json b/web/messages/pt/docs/monitor/audit-report/assessment.json new file mode 100644 index 00000000..05cf4f0b --- /dev/null +++ b/web/messages/pt/docs/monitor/audit-report/assessment.json @@ -0,0 +1,218 @@ +{ + "meta": { + "title": "Avaliação e inventário | Auditoria e relatórios", + "description": "Avaliação de Auditoria e relatórios: perfis dos relatórios, classificação dos resultados, riscos aceites, fontes ilegíveis, Lynis e inventário do nó." + }, + "header": { + "title": "Avaliação e inventário", + "description": "A avaliação inspeciona o nó, mantém seus achados e responde a diferentes perguntas dependendo do perfil do relatório.", + "section": "Auditoria e relatórios" + }, + "sections": [ + { + "id": "read-only", + "blocks": [ + { + "calloutInfo": { + "title": "Uma avaliação inspeciona; não altera a configuração", + "body": "Lê a configuração e o estado da máquina. Ele escreve seus resultados, relatórios e registros, e as verificações de inicialização podem montar partições do sistema EFI por um momento. A configuração que avalia não é modificada." + } + }, + { + "p": "Executar avaliação inicia uma execução com o perfil escolhido em Relatório. A vista mostra a data da última execução e o tempo decorrido." + } + ] + }, + { + "id": "profiles", + "title": "Perfis de relatórios", + "intro": "Cada perfil responde a uma pergunta diferente. Os controlos e secções são seleccionados antes da composição do documento.", + "blocks": [ + { + "table": { + "headers": [ + "Perfil", + "O que cobre" + ], + "rows": [ + [ + "Auditoria completa", + "Todas as verificações e toda a estrutura disponível." + ], + [ + "Diagnóstico rápido", + "Cada verificação; o resultado se abre com os achados críticos, as advertências e as leituras que não puderam ser verificadas." + ], + [ + "Inventário", + "Uma descrição do nó, sem verificações e sem classificação." + ], + [ + "Revisão da segurança", + "Exposição, acesso, privilégios, certificados, atualizações, repositórios e Lynis." + ], + [ + "Garantia de backup", + "Cobertura, idade, resultados, verificação, retenção e recuperação dos backups." + ], + [ + "Capacidade e desgaste", + "Margem de crescimento, memória, uso do espaço e a vida útil dos discos." + ] + ] + } + }, + { + "p": "O conteúdo de cada documento está descrito em Relatórios e comparações." + } + ] + }, + { + "id": "results", + "title": "Como os resultados são classificados", + "blocks": [ + { + "table": { + "headers": [ + "Classificação", + "Significado" + ], + "rows": [ + [ + "Crítico", + "Uma condição falhada que tem prioridade." + ], + [ + "Aviso", + "Uma condição que precisa de uma revisão, dada a evidência ou a política." + ], + [ + "Observação", + "Informações sobre o nó que não é relatado como uma falha." + ], + [ + "Não verificado", + "Não foi possível ler a fonte necessária à verificação. Isto não significa que o problema não exista." + ], + [ + "Conforme", + "A condição preenche o critério aplicado." + ], + [ + "Não aplicável", + "Não se aplica nada no âmbito do controlo." + ], + [ + "Risco aceite", + "A descoberta existe e uma decisão sobre ela foi registrada." + ], + [ + "Excluído pela política", + "A política declara que o elemento está fora da contagem." + ] + ] + } + }, + { + "p": "Os achados podem ser filtrados por área: Sistema, Armazenamento, Rede, Segurança, Backup, Convidados e Hardware. Cada achado mantém sua evidência, com a fonte da qual foi lido." + } + ] + }, + { + "id": "unverified", + "title": "Quando uma fonte não pode ser lida", + "blocks": [ + { + "table": { + "headers": [ + "Caso", + "Comportamento" + ], + "rows": [ + [ + "Não verificado", + "A verificação mantém a sua identidade, indica nas evidências qual a fonte que falhou e não transforma dados em falta num resultado conforme." + ], + [ + "Evidência incompleta", + "O relatório indica a fonte e a hora da recolha para distinguir um problema real de uma leitura insuficiente." + ], + [ + "Uma nova execução", + "Uma vez que o acesso, pacote ou serviço é corrigido, o mesmo perfil é executado novamente e a comparação mostra se o resultado pode ser verificado." + ] + ] + } + } + ] + }, + { + "id": "lynis", + "title": "Lynis", + "blocks": [ + { + "p": "A revisão de segurança utiliza o relatório Lynis do anfitrião. Se Lynis nunca foi executado ou o relatório ultrapassa a antiguidade permitida pela política, um diálogo oferece Executar com Lynis, que demora alguns minutos mais, ou Executar sem Lynis, que utiliza o relatório existente." + }, + { + "figure": { + "src": "/monitor/audit/lynis-dialog.png", + "alt": "Janela que se oferece para executar a avaliação com ou sem Lynis", + "caption": "O diálogo Lynis antes de uma revisão de segurança." + } + } + ] + }, + { + "id": "accept", + "title": "Aceitar um risco", + "blocks": [ + { + "p": "Aceitar risco regista uma decisão sobre uma conclusão. A justificação é obrigatória e é guardada com o autor e a data." + }, + { + "table": { + "headers": [ + "Campo", + "Opções" + ], + "rows": [ + [ + "Justificação", + "Texto livre, necessário." + ], + [ + "Deixa de aplicar-se após", + "90 dias, 180 dias, 1 ano ou não expirar. Quando o período termina o achado torna-se ativo novamente." + ], + [ + "Lembrar-me de rever", + "Um lembrete que traz a decisão de volta à atenção enquanto ela permanece em vigor." + ] + ] + } + }, + { + "p": "Uma conclusão aceite continua visível com a decisão; Voltar a ativo revoga a aceitação. Aceitar um risco não o corrige: a comparação apresenta-o como aceite, não como resolvido." + } + ] + }, + { + "id": "inventory", + "title": "Inventário", + "blocks": [ + { + "list": { + "items": [ + "Identidade, versão Proxmox VE, kernel, assinatura e cluster.", + "CPU, memória, placa, BIOS, controladores e IOMMU.", + "Discos, SMART, horas de energia e eventos gravados.", + "Adaptadores, bonds, bridges, latência e ligações.", + "Armazenamento, hóspedes com seus discos e interfaces e backups.", + "A passagem PCI e o software ProxMenux gerenciam." + ] + } + } + ] + } + ] +} diff --git a/web/messages/pt/docs/monitor/audit-report/changes.json b/web/messages/pt/docs/monitor/audit-report/changes.json new file mode 100644 index 00000000..323ee1bf --- /dev/null +++ b/web/messages/pt/docs/monitor/audit-report/changes.json @@ -0,0 +1,208 @@ +{ + "meta": { + "title": "Alterações | Auditoria e relatórios", + "description": "Registo de alterações de Auditoria e relatórios: o que o ProxMenux alterou no anfitrião, estado anterior, diferenças e possibilidade de anular." + }, + "header": { + "title": "Alterações", + "description": "Registo das operações realizadas pelo ProxMenux no anfitrião e, quando capturado, do estado anterior e posterior de cada uma.", + "section": "Auditoria e relatórios" + }, + "sections": [ + { + "id": "purpose", + "blocks": [ + { + "calloutInfo": { + "title": "Do script executado à alteração efetuada", + "body": "Uma função longa pode alterar apenas duas linhas. O registo guarda cada operação concreta com o script, função e versão responsáveis, recurso afetado, diferenças e possibilidade de anular." + } + }, + { + "flow": { + "nodes": [ + { + "label": "Script", + "detail": "função + versão" + }, + { + "label": "Capturar", + "detail": "conteúdo antes" + }, + { + "label": "Operação", + "detail": "arquivo · pacote · serviço" + }, + { + "label": "Registo", + "detail": "atribuição + diferença" + } + ], + "caption": "A captura é feita durante a operação e é consolidada quando o Monitor lê o registo." + } + }, + { + "figure": { + "src": "/monitor/audit/changes-view.png", + "alt": "Vista Alterações de Auditoria e relatórios com entradas agrupadas por opção pós-instalação e script", + "caption": "A visão Mudanças, com a diferença de um arquivo editado por ProxMenux." + } + } + ] + }, + { + "id": "types", + "title": "Tipos de entrada", + "intro": "O filtro no topo separa as entradas por tipo.", + "blocks": [ + { + "table": { + "headers": [ + "Tipo", + "O que grava" + ], + "rows": [ + [ + "Configuração", + "ProxMenux escreveu, editou ou removeu um arquivo, alterou uma configuração ou alterou um serviço." + ], + [ + "Instalações", + "ProxMenux adicionou um pacote ou componente, e os pacotes que realmente apareceram são gravados." + ], + [ + "Execuções", + "O ProxMenux executou um comando; as alterações dependem do próprio comando." + ], + [ + "Aplicado", + "Uma função foi aplicada antes de existir o registo; o estado anterior não foi capturado." + ] + ] + } + } + ] + }, + { + "id": "groups", + "title": "Como se organiza a visão", + "blocks": [ + { + "table": { + "headers": [ + "Secção", + "Conteúdo" + ], + "rows": [ + [ + "Otimizações pós-instalação", + "Agrupado pela opção pós-instalação selecionada pelo usuário." + ], + [ + "Scripts do ProxMenux", + "GPU, Coral, rede, armazenamento, segurança, utilitários e os outros scripts instrumentados, incluindo o instalador ProxMenux e ProxMenux Monitor." + ], + [ + "Pacotes e utilitários instalados", + "Software instalado pelo ProxMenux no anfitrião." + ] + ] + } + }, + { + "p": "Dentro de cada seção, Por função agrupa as entradas sob a função que as fez." + } + ] + }, + { + "id": "entry", + "title": "O que cada item mostra", + "blocks": [ + { + "list": { + "items": [ + "O script, função e versão responsável.", + "A data e o recurso afetado.", + "O estado conhecido antes e depois da mudança.", + "As linhas adicionadas e removidas.", + "Os pacotes que foram realmente adicionados.", + "A transição de estado de um serviço.", + "Anular esta alteração: Repõe exatamente o estado anterior, Elimina o ficheiro (não existia antes), O pacote pode ser desinstalado, uma anulação parcial ou Não pode ser anulado a partir do registo." + ] + } + } + ] + }, + { + "id": "before", + "title": "O que significa o estado anterior", + "blocks": [ + { + "p": "O estado anterior pode ser conteúdo capturado, um ficheiro criado pela primeira vez ou um estado desconhecido. As alterações anteriores ao registo não podem ser reconstruídas; voltar a executar a função captura primeiro o estado encontrado nesse momento." + } + ] + }, + { + "id": "limits", + "title": "Âmbito do registo", + "blocks": [ + { + "list": { + "items": [ + "As alterações manuais e feitas por outros softwares não são gravadas.", + "Apenas as operações que passam pelos primitivos de auditoria ProxMenux estão cobertas.", + "A gravação nunca bloqueia a operação que descreve: se a entrada não puder ser escrita, a operação continua.", + "Mudanças sucessivas em um recurso são mostradas como a origem conhecida contra o estado atual." + ] + } + } + ] + }, + { + "id": "retention", + "title": "Provas armazenadas", + "blocks": [ + { + "table": { + "headers": [ + "Elemento", + "Comportamento" + ], + "rows": [ + [ + "Entradas", + "As entradas são guardadas no anfitrião; nada é removido automaticamente do registo." + ], + [ + "Conteúdo capturado", + "Um objeto capturado é mantido enquanto uma entrada se refere a ele." + ], + [ + "Tamanho de uma captura", + "O conteúdo com mais de 1 MiB não é guardado na totalidade; a entrada regista que a captura foi omitida devido ao tamanho." + ], + [ + "Leitura", + "O Monitor não carrega objetos armazenados acima de 2 MiB." + ], + [ + "Diferença", + "São apresentadas no máximo 400 linhas; uma diferença maior é assinalada como truncada." + ], + [ + "Listagem", + "A API devolve por predefinição 200 entradas por pedido, até um máximo de 1000." + ] + ] + } + }, + { + "calloutWarning": { + "title": "Guardar o conteúdo não implica anular automaticamente", + "body": "O conteúdo anterior pode ser consultado e reposto manualmente, mas a vista Alterações não anula operações. Uma entrada de execução regista o comando sem conhecer todos os efeitos da ferramenta executada." + } + } + ] + } + ] +} diff --git a/web/messages/pt/docs/monitor/audit-report/index.json b/web/messages/pt/docs/monitor/audit-report/index.json new file mode 100644 index 00000000..791accd2 --- /dev/null +++ b/web/messages/pt/docs/monitor/audit-report/index.json @@ -0,0 +1,136 @@ +{ + "meta": { + "title": "Auditoria e relatórios | ProxMenux Monitor", + "description": "Avalie um nó Proxmox VE, registe as alterações do ProxMenux e declare o que se espera dos sistemas convidados e do armazenamento, com relatórios imprimíveis." + }, + "header": { + "title": "Auditoria e relatórios", + "description": "Avaliação do nó, registo das alterações do ProxMenux e declaração das expectativas, com documentos que podem ser impressos ou guardados em PDF.", + "section": "ProxMenux Monitor" + }, + "sections": [ + { + "id": "views", + "blocks": [ + { + "calloutInfo": { + "title": "Três vistas, três perguntas", + "body": "Auditoria e relatórios distingue os factos do nó, as intervenções do ProxMenux e as expectativas declaradas. Uma configuração que não possa ser avaliada face a um objetivo declarado é descrita sem ser assinalada como falha." + } + }, + { + "cards": { + "items": [ + { + "icon": "shield", + "title": "Avaliação — como está o nó?", + "body": "Realiza as verificações do perfil escolhido, compõe o inventário e classifica o que precisa de atenção, com as evidências de cada resultado." + }, + { + "icon": "refresh", + "title": "Alterações — o que fez o ProxMenux?", + "body": "Lista os ficheiros, pacotes, serviços e comandos alterados pelos scripts ProxMenux instrumentados, incluindo o estado anterior quando foi capturado." + }, + { + "icon": "fileText", + "title": "Política — o que se espera?", + "body": "Declara quais os sistemas convidados que necessitam de cópia de segurança ou devem arrancar com o anfitrião, qual o armazenamento essencial e os limiares das verificações." + } + ] + } + }, + { + "flow": { + "nodes": [ + { + "label": "Avaliação", + "detail": "factos" + }, + { + "label": "Política", + "detail": "contexto" + }, + { + "label": "Alterações", + "detail": "intervenções" + } + ], + "caption": "A avaliação fornece os factos, a política dá-lhes contexto e o registo documenta as ações do ProxMenux." + } + }, + { + "figure": { + "src": "/monitor/audit/assessment-view.png", + "alt": "Auditoria e relatórios no ProxMenux Monitor com as vistas Avaliação, Alterações e Política", + "caption": "Auditoria e Relatório, com a visão de Avaliação aberta." + } + } + ] + }, + { + "id": "boundaries", + "title": "Três funções diferentes", + "blocks": [ + { + "table": { + "headers": [ + "Função", + "O que ele faz" + ], + "rows": [ + [ + "Monitor de estado", + "Observa métricas e eventos continuamente e pode gerar notificações." + ], + [ + "Auditoria e relatórios", + "Executa uma avaliação a pedido, documenta o nó e compara as execuções entre si." + ], + [ + "Registo de alterações", + "Regista as operações realizadas pelo ProxMenux através das suas primitivas de auditoria." + ] + ] + } + } + ] + }, + { + "id": "pages", + "title": "Páginas desta secção", + "blocks": [ + { + "next": { + "items": [ + { + "label": "Avaliação e inventário", + "href": "/docs/monitor/audit-report/assessment", + "tail": "Perfis, resultados, riscos aceites e inventário." + }, + { + "label": "Alterações", + "href": "/docs/monitor/audit-report/changes", + "tail": "o diário do que ProxMenux mudou no host." + }, + { + "label": "Política", + "href": "/docs/monitor/audit-report/policy", + "tail": "sistemas convidados, armazenamento e limiares." + }, + { + "label": "Relatórios e comparações", + "href": "/docs/monitor/audit-report/reports", + "tail": "os seis documentos e a execução de referência." + }, + { + "label": "Âmbito de aplicação e garantias", + "href": "/docs/monitor/audit-report/scope", + "tail": "fontes, limites e dados armazenados." + } + ] + } + } + ] + } + ] +} diff --git a/web/messages/pt/docs/monitor/audit-report/policy.json b/web/messages/pt/docs/monitor/audit-report/policy.json new file mode 100644 index 00000000..9356f813 --- /dev/null +++ b/web/messages/pt/docs/monitor/audit-report/policy.json @@ -0,0 +1,111 @@ +{ + "meta": { + "title": "Política | Auditoria e relatórios", + "description": "Política do nó em Auditoria e relatórios: cópia de segurança, arranque automático e objetivo de recuperação de cada sistema convidado, função de cada armazenamento e limiares das verificações." + }, + "header": { + "title": "Política", + "description": "A política declara o que uma inspeção não pode deduzir: a finalidade de cada sistema convidado e armazenamento e os limiares aplicados pelas verificações.", + "section": "Auditoria e relatórios" + }, + "sections": [ + { + "id": "principle", + "blocks": [ + { + "calloutInfo": { + "title": "Sem declaração o relatório descreve; com ela avalia", + "body": "Uma avaliação vê o que o anfitrião faz, não para que serve. Um convidado sem backup cuja finalidade não é declarada é relatado como uma observação. Caso seu backup seja declarado necessário, a mesma ausência é reportada como advertência. Nada precisa ser declarado." + } + }, + { + "figure": { + "src": "/monitor/audit/policy-view.png", + "alt": "Vista Política com os sistemas convidados, armazenamento e limiares do nó", + "caption": "A vista Política." + } + } + ] + }, + { + "id": "guests", + "title": "Convidados", + "intro": "Cada VM e LXC do nó tem três campos. Um valor deixado como padrão toma o valor geral, mostrado ao lado dele.", + "blocks": [ + { + "table": { + "headers": [ + "Campo", + "Valores", + "Efeito na avaliação" + ], + "rows": [ + [ + "Cópia de Segurança", + "Necessário, Não exigido, Não indicado", + "Um backup ausente é um aviso quando é necessário, uma observação quando não é indicado, e é deixado fora da contagem quando não é necessário." + ], + [ + "Arranque automático", + "Necessário, Não exigido, Não indicado", + "Indica se o sistema convidado deve arrancar com o anfitrião." + ], + [ + "Objetivo de recuperação", + "Horas", + "A idade máxima aceitável do último backup." + ] + ] + } + } + ] + }, + { + "id": "storage", + "title": "Armazenamento", + "blocks": [ + { + "p": "Um armazenamento inalcançável é relatado como crítico quando é declarado essencial ou serve um hóspede em execução, como um aviso quando seu papel não é declarado, e como uma observação quando é declarado opcional." + } + ], + "intro": "Cada armazenamento do nó é declarado Essencial, Opcional ou Não indicado." + }, + { + "id": "thresholds", + "title": "Limiares", + "intro": "Um limiar vazio utiliza o valor predefinido incluído, apresentado como texto indicativo.", + "blocks": [ + { + "list": { + "items": [ + "Verificação da capacidade de armazenamento (%) e do preenchimento do thin pool (%).", + "Rácio de sobreaprovisionamento thin e rácio de sobrealocação de memória.", + "Intervalo de scrub ZFS (dias).", + "Limite de recurso para a antiguidade das cópias de segurança (dias) e margem sobre o calendário (rácio).", + "Aviso de validade do certificado (dias).", + "Vida útil do disco (horas) e janela de erro do disco recente (dias).", + "Antiguidade do relatório Lynis (dias) e do índice de pacotes (dias).", + "Utilização do journal face ao seu limite (%).", + "Verificação do espaço (%) e dos inodes (%) do sistema de ficheiros." + ] + } + } + ] + }, + { + "id": "save", + "title": "Como a política é salva", + "blocks": [ + { + "p": "A declaração é validada e guardada atomicamente em /usr/local/share/proxmenux/audit_policy.json. Cada gravação inclui uma revisão: se outra sessão tiver alterado a declaração, o rascunho não é guardado e a vista propõe recarregar a versão gravada." + }, + { + "calloutWarning": { + "title": "A política nunca é inferida", + "body": "O ProxMenux não acrescenta requisitos por iniciativa própria. Um campo vazio mantém o valor predefinido ou fica não indicado; uma declaração parcial só afeta os elementos que menciona." + } + } + ] + } + ] +} diff --git a/web/messages/pt/docs/monitor/audit-report/reports.json b/web/messages/pt/docs/monitor/audit-report/reports.json new file mode 100644 index 00000000..2373e96f --- /dev/null +++ b/web/messages/pt/docs/monitor/audit-report/reports.json @@ -0,0 +1,247 @@ +{ + "meta": { + "title": "Relatórios e comparações | Auditoria e relatórios", + "description": "Os seis documentos de Auditoria e relatórios, a impressão ou gravação em PDF e a comparação das execuções com uma referência." + }, + "header": { + "title": "Relatórios e comparações", + "description": "Seis documentos para perguntas diferentes e a comparação de cada execução com uma referência.", + "section": "Auditoria e relatórios" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "Seis documentos, não seis estilos", + "body": "O motor seleciona as verificações e seções antes de compor o documento. Um diagnóstico rápido não é uma auditoria completa com menos páginas, e um inventário não apresenta resultados de avaliação. Os documentos da amostra abaixo utilizam dados fictícios." + } + } + ] + }, + { + "id": "documents", + "title": "Os seis documentos", + "blocks": [ + { + "downloads": { + "items": [ + { + "title": "Auditoria completa", + "body": "Documenta todo o nó como registo técnico.", + "href": "/monitor/audit/sample-audit-full-report.pdf", + "facts": [ + { + "label": "Controlos", + "value": "Todas as verificações disponíveis." + }, + { + "label": "Conteúdo", + "value": "Resumo executivo; identidade e cluster; hardware; rede e latência; armazenamento; sistemas convidados; passthrough; aplicações; conclusões com evidências; fontes e âmbito." + } + ] + }, + { + "title": "Diagnóstico rápido", + "body": "Mostra o que precisa de atenção sem o inventário completo.", + "href": "/monitor/audit/sample-audit-diagnostic-report.pdf", + "facts": [ + { + "label": "Controlos", + "value": "Os mesmos controlos que a auditoria completa." + }, + { + "label": "Conteúdo", + "value": "Identidade mínima; conclusões críticas; advertências; observações relevantes; leituras não verificadas e ações prioritárias. Diagramas, inventário e anexos longos são deixados de fora." + } + ] + }, + { + "title": "Inventário", + "body": "Descreve o que existe no nó sem avaliá-lo.", + "href": "/monitor/audit/sample-audit-inventory-report.pdf", + "facts": [ + { + "label": "Controlos", + "value": "Nenhum; nenhum achado é classificado." + }, + { + "label": "Conteúdo", + "value": "Identidade; cluster; CPU e memória; placa, BIOS e controladores; rede; armazenamento; VMs e LXCs; passthrough; aplicações e elementos geridos pelo ProxMenux." + } + ] + }, + { + "title": "Revisão da segurança", + "body": "Cobre a exposição e os controles sobre o acesso ao nó.", + "href": "/monitor/audit/sample-audit-security-report.pdf", + "facts": [ + { + "label": "Controlos", + "value": "A área de segurança, além de privilégios de contêiner, atualizações, repositórios e a cadeia APT." + }, + { + "label": "Conteúdo", + "value": "Identidade e cluster; rede e latência; acesso; firewall; 2FA; certificados; privilégios; atualizações; repositórios; estado e idade de Lynis." + } + ] + }, + { + "title": "Garantia de backup", + "body": "Verifica que a proteção declarada existe e que seus backups são utilizáveis.", + "href": "/monitor/audit/sample-audit-backup-report.pdf", + "facts": [ + { + "label": "Controlos", + "value": "A área de backup, além de conectividade de armazenamento e entrega de notificação." + }, + { + "label": "Conteúdo", + "value": "Cobertura por sistema convidado; objetivo de recuperação declarado; antiguidade e resultado; destino; retenção; verificação; tarefas falhadas; recuperação e fontes incompletas." + } + ] + }, + { + "title": "Capacidade e desgaste", + "body": "Mede a margem de crescimento e os sinais de esgotamento ou envelhecimento.", + "href": "/monitor/audit/sample-audit-capacity-report.pdf", + "facts": [ + { + "label": "Controlos", + "value": "As áreas de armazenamento e hardware, além de memória, swap, diário e o sistema de arquivos host." + }, + { + "label": "Conteúdo", + "value": "Utilização e limiares; thin pools; sobreaprovisionamento; memória; inodes; ZFS; temperaturas; horas de funcionamento; erros SMART e vida útil NVMe/SSD." + } + ] + } + ] + } + }, + { + "figure": { + "src": "/monitor/audit/audit-report-preview.png", + "alt": "Primeira página de um relatório de auditoria completo", + "caption": "Cada documento compartilha o identificador do relatório, seções numeradas, data, nó, perfil e rodapé." + } + }, + { + "p": "Conforme o perfil, o documento inclui identidade do nó e data da avaliação, resumo executivo, resumo por área, estrutura de hardware, rede e armazenamento, proteção dos sistemas convidados, conclusões com evidências, fontes ilegíveis e âmbito e política aplicados." + } + ] + }, + { + "id": "print", + "title": "Impressão ou gravação como PDF", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Executar", + "body": "A avaliação utiliza o perfil selecionado em Relatório." + }, + { + "title": "Revisão", + "body": "A execução final mostra suas descobertas, as fontes que não pôde ler e a política que aplicou." + }, + { + "title": "Gerar relatório", + "body": "Gerar relatório abre a vista preparada como documento." + }, + { + "title": "Imprimir", + "body": "Imprimir ou guardar como PDF abre o diálogo de impressão do navegador para escolher uma impressora ou Guardar como PDF." + } + ] + } + }, + { + "calloutTip": { + "title": "A impressão é um documento, não uma imagem", + "body": "A barra de ação está escondida, uma tabela que continua na próxima página repete seu cabeçalho, blocos evitam quebras desnecessárias e cada página mantém a identificação e numeração." + } + } + ] + }, + { + "id": "compare", + "title": "Comparando com uma execução de referência", + "intro": "Usar como referência marca uma execução terminada. As seguintes são comparadas com ela e as conclusões são agrupadas em:", + "blocks": [ + { + "table": { + "headers": [ + "Grupo", + "Significado" + ], + "rows": [ + [ + "Novo", + "Informado agora e não antes." + ], + [ + "Pioraram", + "Continuam presentes, mas são mais graves ou abrangentes do que antes." + ], + [ + "Melhoraram", + "Continuam presentes, mas são menos graves ou abrangentes do que antes." + ], + [ + "Resolvido", + "Já não são apresentados e ninguém os aceitou." + ], + [ + "Aceites", + "Não mais contado porque um risco foi aceito, não porque o hospedeiro mudou." + ], + [ + "Já não avaliados", + "Presentes antes mas ausentes desta execução; não foi verificado que tenham desaparecido." + ] + ] + } + }, + { + "table": { + "headers": [ + "Execução de referência", + "Comportamento" + ], + "rows": [ + [ + "Configurando", + "Qualquer execução terminada pode ser marcada; nenhuma é marcada automaticamente." + ], + [ + "Mudando", + "Marcar outra execução muda a referência sem eliminar o histórico." + ], + [ + "Comparando", + "Quando não são selecionadas duas execuções, a comparação usa a referência e a execução selecionada ou mais recente." + ], + [ + "Conservar execuções", + "São conservadas as 30 execuções mais recentes; a referência nunca é removida." + ], + [ + "Sem referência", + "A vista indica que ainda não foi escolhida uma execução de referência, pelo que não existe base de comparação." + ] + ] + } + }, + { + "calloutWarning": { + "title": "Um relatório descreve um momento", + "body": "Uma avaliação não certifica um período inteiro. Os resultados antigos deixam de descrever o estado atual; a vista mostra a antiguidade da última execução e cada fonte conserva a hora da recolha." + } + } + ] + } + ] +} diff --git a/web/messages/pt/docs/monitor/audit-report/scope.json b/web/messages/pt/docs/monitor/audit-report/scope.json new file mode 100644 index 00000000..9f01df96 --- /dev/null +++ b/web/messages/pt/docs/monitor/audit-report/scope.json @@ -0,0 +1,115 @@ +{ + "meta": { + "title": "Âmbito e garantias | Auditoria e relatórios", + "description": "Origem dos dados de Auditoria e relatórios, limites do âmbito, garantias da conceção e localização dos dados." + }, + "header": { + "title": "Âmbito e garantias", + "description": "De onde vêm os dados de uma avaliação, o que fica fora do seu âmbito e onde Auditoria e relatórios guarda os dados.", + "section": "Auditoria e relatórios" + }, + "sections": [ + { + "id": "sees", + "title": "O que observa", + "blocks": [ + { + "list": { + "items": [ + "A configuração e o estado do nó local.", + "A configuração declarada das VMs e LXCs.", + "O estado do armazenamento tal como é conhecido pelo Proxmox VE.", + "O histórico disponível de backups e verificações.", + "Dados SMART e os eventos que o Monitor recolheu.", + "O estado dos serviços, cluster, HA e fontes locais." + ] + } + } + ] + }, + { + "id": "outside", + "title": "O que está fora da sua visão", + "blocks": [ + { + "list": { + "items": [ + "O interior dos convidados, além do que eles declaram para Proxmox VE.", + "Equipamento de rede fora do hospedeiro.", + "Dependências remotas que o nó não consegue observar.", + "Estado físico que o hardware não expõe.", + "O registo de alterações não inclui ações manuais ou de outro software." + ] + } + }, + { + "calloutWarning": { + "title": "Provas em falta não são provas de ausência", + "body": "Uma fonte que não pode ser lida dá um resultado não verificado ou incompleto, nunca conforme. O relatório enumera as fontes que não estavam disponíveis." + } + } + ] + }, + { + "id": "guarantees", + "title": "Garantias do projecto", + "blocks": [ + { + "list": { + "items": [ + "Identificadores estáveis para as verificações.", + "Histórico de execuções e conclusões.", + "Uma política validada, salva atomicamente.", + "Riscos aceitos com uma razão, visíveis.", + "Atribuição de alterações ao script e função.", + "Captura do estado anterior e posterior, quando disponível.", + "Um resultado explícito quando algo não pode ser medido ou capturado." + ] + } + } + ] + }, + { + "id": "storage", + "title": "Onde são guardados os dados", + "blocks": [ + { + "table": { + "headers": [ + "Dados", + "Localização" + ], + "rows": [ + [ + "Política", + "/usr/local/share/proxmenux/audit_policy.json" + ], + [ + "Avaliações", + "A base de dados de auditoria do Monitor" + ], + [ + "Objetos capturados", + "/usr/local/share/proxmenux/changes/objects/" + ], + [ + "Entradas pendentes", + "/usr/local/share/proxmenux/changes/spool/" + ], + [ + "Registo consolidado", + "/usr/local/share/proxmenux/changes.db" + ] + ] + } + }, + { + "calloutInfo": { + "title": "Uma ferramenta para rever, não uma certificação", + "body": "Auditoria e relatórios revê, compara e documenta o nó. Os resultados são interpretados de acordo com a finalidade do sistema, a política declarada e as fontes disponíveis." + } + } + ] + } + ] +} diff --git a/web/messages/pt/docs/monitor/dashboard/apps.json b/web/messages/pt/docs/monitor/dashboard/apps.json new file mode 100644 index 00000000..648aa0dd --- /dev/null +++ b/web/messages/pt/docs/monitor/dashboard/apps.json @@ -0,0 +1,174 @@ +{ + "meta": { + "title": "Painel Apps: um lançador para todas as ligações web | ProxMenux", + "description": "Use o painel de aplicativos para abrir links web registrados LXC e links personalizados, organizá-los por categoria e voltar para o hóspede que possui cada serviço." + }, + "header": { + "title": "Painel: Página de aplicações", + "description": "Um único lançador para as interfaces web que você usa em todo o nó, seja de um aplicativo LXC registrado ou um Web Link personalizado.", + "section": "ProxMenux Monitor · Painel" + }, + "intro": { + "title": "Um lançador, não um instalador de aplicações", + "body": "O separador Apps não instala software nem descobre serviços. Reúne as ligações guardadas numa grelha pesquisável. As ligações LXC configuram-se no separador App do sistema convidado; as personalizadas incluem serviços VM, proxies inversos e painéis externos." + }, + "sources": { + "heading": "O que aparece em Apps", + "intro": "Cada URL lançável torna-se seu próprio cartão. A fonte determina onde esse cartão é editado, mas não como ele parece durante o uso normal.", + "colSource": "Origem", + "colAppears": "O que aparece", + "colManagedFrom": "Onde é gerido", + "rows": [ + { + "source": "Aplicação LXC registada", + "appears": "Um cartão para cada Web Link salvo no registro da aplicação.", + "managedFrom": "VMs e LXCs → Janela do LXC → Aplicação" + }, + { + "source": "Ligação personalizada ligada a um hóspede", + "appears": "Um URL de serviço associado a um VM ou LXC.", + "managedFrom": "Apps → Editar" + }, + { + "source": "Ligação personalizada sem associação", + "appears": "Qualquer destino HTTP(S), incluindo serviços externos ou publicados através de proxy inverso.", + "managedFrom": "Apps → Editar" + } + ], + "relationshipTitle": "Apps e a aba de aplicativos LXC têm trabalhos diferentes", + "relationshipBody": "O separador App do LXC gere identidade, ligações web e acompanhamento opcional da versão. Apps utiliza estas ligações para as abrir rapidamente. Editar um cartão LXC regressa ao registo do sistema convidado sem duplicar a configuração." + }, + "cards": { + "heading": "Como usar um cartão", + "intro": "Toda a placa é o alvo de lançamento, enquanto seus controles menores fornecem contexto sem abrir o serviço.", + "items": [ + "Clique no cartão para abrir sua URL em uma nova guia do navegador.", + "O logotipo utiliza o logotipo Web Link primeiro e volta ao logotipo da aplicação quando apropriado.", + "O chip de categoria usa a mesma cor e etiqueta que o link Web correspondente na aba do aplicativo LXC.", + "A etiqueta do sistema convidado identifica a VM ou LXC associado. Um clique abre a sua janela: as ligações LXC abrem App, as VM abrem Estado.", + "Uma seta para cima roxa significa que a aplicação específica ou imagem Docker tem uma atualização disponível. Não é uma conta de atualização geral para todo o hóspede." + ] + }, + "toolbar": { + "heading": "Procurar, filtrar e ordenar", + "intro": "A barra de ferramentas estreita uma grande coleção de aplicativos sem alterar os registros salvos.", + "items": [ + "A pesquisa corresponde ao nome da aplicação, nome do convidado, VMID e categoria.", + "O filtro de categoria mostra uma categoria de cada vez ou todas as aplicações.", + "Ordene por Nome, ID ou Categoria. Ordenar por categoria acrescenta títulos entre grupos de cartões.", + "A ordem é guardada neste navegador. O texto de pesquisa e o filtro de categoria são repostos ao regressar à página.", + "A aba Apps permanece disponível quando a grade está vazia, então o primeiro link personalizado pode ser adicionado sem registrar primeiro um aplicativo LXC." + ] + }, + "customLinks": { + "heading": "Adicionar e editar links Web personalizados", + "intro": "Use um link personalizado quando o serviço não for representado por um aplicativo LXC registrado.", + "steps": [ + "Pressione Adicionar link da barra de ferramentas ou do estado vazio.", + "Digite um nome e uma URL http:// ou https://.", + "Opcionalmente, adicione um logotipo, escolha ou crie uma categoria e ligue o link a um VM ou LXC.", + "Guarde a ligação. O cartão aparece imediatamente na grelha.", + "Para alterar ou remover uma ligação personalizada, escolha Editar e utilize o lápis no cartão." + ], + "colField": "Campo", + "colRequired": "Requerido", + "colPurpose": "Objecto", + "fields": [ + { + "field": "Nome", + "required": "Sim", + "purpose": "O título do cartão e termo de pesquisa." + }, + { + "field": "URL", + "required": "Sim", + "purpose": "O destino HTTP(S) completo aberto pelo cartão." + }, + { + "field": "URL do logotipo", + "required": "Não", + "purpose": "Uma imagem remota mostrada na carta." + }, + { + "field": "Categoria", + "required": "Não", + "purpose": "Adiciona um crachá compartilhado e permite a filtragem de categoria." + }, + { + "field": "Associação ao sistema convidado", + "required": "Não", + "purpose": "Associa o link com um VM ou LXC e permite o atalho de hóspedes." + } + ], + "editTitle": "Editar a fonte da verdade", + "editBody": "O modo de edição mostra lápis apenas nas ligações personalizadas. Para um cartão LXC, abra o separador App do sistema convidado e altere a ligação guardada." + }, + "categories": { + "heading": "Categorias e sinais de atualização", + "intro": "As categorias organizam ligações; os indicadores de atualização descrevem o estado do software. São funções separadas.", + "items": [ + "O registro LXC assistido por catálogo pode preencher uma categoria, mas permanece editável.", + "Nomes de categorias personalizados podem ser criados a partir do mesmo seletor e então reutilizados pelo filtro.", + "As cores da categoria são determinísticas e adaptam-se ao tema claro ou escuro. Faixas roxas e vermelhas são reservadas para atualização e estados de perigo.", + "Para Docker, o ProxMenux associa o cartão ao contentor ou imagem e mostra as atualizações dessa imagem. As de Docker Engine continuam no separador Atualizações do LXC." + ] + }, + "persistence": { + "heading": "Comportamento de persistência e cache", + "intro": "O painel utiliza os dados já disponíveis no Monitor sem voltar a analisar todos os sistemas convidados.", + "items": [ + "As ligações personalizadas são guardadas atomicamente em /etc/proxmenux/custom_links.json e carregadas em memória no arranque do Monitor.", + "Links de LXC registrados continuam a fazer parte do registro de Monitor salvo de sua aplicação; o painel Apps não os duplica no arquivo de link personalizado.", + "Criar, editar ou excluir um link personalizado atualiza a lista de memórias imediatamente.", + "A preferência de ordenação é local ao navegador e não se sincroniza entre dispositivos ou utilizadores.", + "A posição de topo do Apps é controlada separadamente por Configurações → Ordem de navegação." + ] + }, + "troubleshooting": { + "heading": "Situações comuns", + "colProblem": "Situação", + "colResolution": "Resolução", + "rows": [ + { + "problem": "Um aplicativo LXC está registrado, mas nenhum cartão aparece", + "resolution": "Abra sua guia App e adicione pelo menos um link Web. O rastreamento de versões sozinho não cria uma placa de lançamento." + }, + { + "problem": "O URL ou logotipo está errado", + "resolution": "Edite o link personalizado em Apps ou edite o Web Link na guia LXC App." + }, + { + "problem": "Falta um serviço Docker", + "resolution": "Edite o aplicativo Docker registrado e salve a porta web publicada do serviço como um Web Link." + }, + { + "problem": "A seta roxa refere-se à atualização errada Docker", + "resolution": "Reveja o nome e a descrição da ligação web para os associar ao contentor ou imagem pretendida." + }, + { + "problem": "Apps abrem primeiro em vez de Visão Geral do Sistema", + "resolution": "O primeiro item salvo em Configurações → Ordem de navegação torna-se a guia de pouso. Restaurar a ordem padrão ou mover Visão geral primeiro." + } + ] + }, + "whereNext": { + "heading": "Para onde seguir", + "items": [ + { + "label": "Página da aplicação LXC", + "href": "/docs/monitor/dashboard/vms-lxcs/app", + "tail": " — aplicações de registo, ligações Web e acompanhamento opcional de versões." + }, + { + "label": "Página de Atualizações do LXC", + "href": "/docs/monitor/dashboard/vms-lxcs/updates", + "tail": " — configurar e executar atualizações de aplicações, Docker Engine e imagens." + }, + { + "label": "Página de Configuração", + "href": "/docs/monitor/dashboard/settings#navigation-order", + "tail": " — alterar a ordem de navegação e a guia de aterragem." + } + ] + } +} diff --git a/web/messages/pt/docs/monitor/dashboard/hardware.json b/web/messages/pt/docs/monitor/dashboard/hardware.json new file mode 100644 index 00000000..2c13dd4e --- /dev/null +++ b/web/messages/pt/docs/monitor/dashboard/hardware.json @@ -0,0 +1,248 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Painel: Hardware | Documentação ProxMenux", + "description": "O separador Hardware inventaria a máquina física: CPU e placa-mãe, módulos de memória, sensores térmicos, GPU com monitorização por slot e instalador de controladores num clique, aceleradores Coral TPU, resumo do armazenamento com velocidades de ligação, listas PCI e USB, consumo, fontes de alimentação, ventoinhas e UPS." + }, + "header": { + "title": "Painel: Página de hardware", + "description": "A máquina física em uma tela – CPU e identidade da placa-mãe, todos os módulos de memória, sensores térmicos em todos os subsistemas, GPUs com uso ao vivo e um instalador de driver embutido, Coral TPUs, cada dispositivo PCI e USB com seu driver de kernel, o inventário de disco completo com velocidades de ligação negociadas, além de energia, refrigeração e UPS.", + "section": "ProxMenux Monitor · Painel" + }, + "intro": { + "title": "Construído a partir de ferramentas padrão", + "body": "A maior parte desta página é analisada de lscpu, dmidecode, lspci, lsusb, lsblk, smartctl, nvme, sensors, nvidia-smi, intel_gpu_top, amdgpu_top, ipmitool e upsc. Seções só renderizam quando a ferramenta relevante retorna dados, então um host sem uma UPS não mostrará o cartão UPS e um host sem IPMI não mostrará figuras de energia fora de banda." + }, + "thresholds": { + "title": "Cor do estado e limiares aplicados aqui", + "intro": "Cada indicador e leitura de temperatura usa a mesma escala: verde abaixo de Aviso, âmbar entre Aviso e Crítico, vermelho a partir de Crítico. Valores recomendados incluídos no ProxMenux:", + "items": [ + "Temperatura CPU — aviso 80 °C, crítico 90 °C.", + "Temperatura do disco — HDD 60/65 °C · SSD 70/75 °C · NVMe 80/85 °C · SAS 55/65 °C (alertar / crítico)." + ], + "outro": "Os valores são configuráveis por host. Definições → Limiares do monitor de saúde centraliza os ajustes e explica como os adaptar." + }, + "sections": { + "heading": "Seções", + "intro": "As secções aparecem nesta ordem de cima para baixo. Algumas exigem o hardware ou ferramenta correspondente e estão marcadas como (condicional).", + "systemInfoTitle": "Informações do sistema", + "systemInfoIntro": "Dois blocos lado a lado, sempre presentes:", + "systemInfoItems": [ + "CPU — modelo, microarquitetura, sockets/núcleos/threads, frequências base e boost, capacidades de virtualização (VT-x / AMD-V) e topologia da cache.", + "Placa-mãe — fabricante, modelo, versão e data BIOS, UUID SMBIOS. Ajuda a localizar a página correta do fabricante para atualizar o firmware." + ], + "memoryTitle": "Módulos de memória", + "memoryBody": "Uma linha por slot ocupado de dmidecode: etiqueta, capacidade do módulo, tipo (DDR4 / DDR5 / variantes ECC), velocidade configurada e nominal, fabricante, referência e número de série. Os slots vazios aparecem atenuados para mostrar a margem de expansão.", + "thermalTitle": "Monitoramento Térmico", + "thermalIntro": "Sete blocos com dados de lm-sensors, sysfs e coletores específicos de cada ferramenta. Os sensores hwmon de armazenamento são associados ao dispositivo de blocos físico, com modelo e caminho /dev/.... Cada bloco fica oculto se não houver sensores na categoria.", + "thermalItems": [ + "CPU — temperatura do encapsulamento e de cada núcleo.", + "GPU — sensores de GPU dedicada via nvidia-smi / amdgpu_top e iGPU Intel. Inclui ponto quente e temperatura de junção da memória quando o controlador os fornece.", + "NVME — temperatura composta do controlador associada ao namespace NVMe exato.", + "HDD — leituras drivetemp para dispositivos de blocos rotativos.", + "SSD — leituras drivetemp para dispositivos de bloco SATA/SAS não rotacionais.", + "PCI — sensores em dispositivos ligados a PCI, como HBA e placas de rede com sensores internos.", + "OTHER — chipset, VRM, sensores ambientais que não se encaixam em outro lugar." + ] + }, + "graphics": { + "heading": "Placas Gráficas", + "intro": "Cada controlador de vídeo aparece num cartão com fabricante, modelo, tipo (Integrado / PCI / BMC), endereço PCI (BDF), controlador do kernel e módulos. Mudar modo alterna entre partilha LXC com controlador nativo e passthrough VM (vfio-pci). Mudar modo GPU (VM ↔ LXC) explica os efeitos no host.", + "vfioImageAlt": "Seção de placas gráficas mostrando um GPU integrado de Matrox G200EH ligado a mgag200 (pronto para LXC) e um NVIDIA Quadro P400 ligado a vfio-pci (pronto para passagem de VM)", + "vfioImageCaption": "Duas GPUs detectadas: o chip Matrox BMC está no driver nativo e pronto para LXC; o NVIDIA Quadro P400 está ligado ao vfio-pci, pronto para passagem VM.", + "lxcImageAlt": "Placas gráficas: iGPU Intel UHD Graphics com i915 e NVIDIA Quadro P1000 com nvidia, ambas prontas para contentores LXC", + "lxcImageCaption": "O mesmo nó após devolver a placa NVIDIA ao controlador nativo: ambas as GPU prontas para contentores LXC.", + "realtimeTitle": "Janela de monitorização em tempo real", + "realtimeBody": "Clicar numa GPU abre a monitorização por slot, que consulta a ferramenta do fabricante a cada três segundos. Mostra fabricante, tipo, slot PCI, controlador, módulos do kernel, utilização dos motores (Render/3D, Video, Blitter, VideoEnhance), frequências gráfica e de memória, temperatura, consumo se disponível, VRAM e processos ativos com carga por processo. Dados de /api/gpu/<slot>/realtime.", + "toolsIntro": "A ferramenta do fornecedor usada por GPU:", + "headerVendor": "Fornecedor", + "headerTool": "Ferramenta", + "headerProject": "Projeto", + "tools": [ + { + "vendor": "NVIDIA", + "tool": "nvidia-smi", + "projectLabel": "developer.nvidia.com", + "projectHref": "https://developer.nvidia.com/nvidia-system-management-interface" + }, + { + "vendor": "Intel iGPU", + "tool": "intel_gpu_top (igt-gpu-tools)", + "projectLabel": "gitlab.freedesktop.org", + "projectHref": "https://gitlab.freedesktop.org/drm/igt-gpu-tools" + }, + { + "vendor": "AMD", + "tool": "amdgpu_top", + "projectLabel": "github.com/Umio-Yasuno/amdgpu_top", + "projectHref": "https://github.com/Umio-Yasuno/amdgpu_top" + }, + { + "vendor": "Matrox / ASPEED (BMC)", + "tool": "— (apenas visualização)", + "projectLabel": "Detetado e identificado como BMC; sem monitorização em tempo real." + } + ], + "nvidiaImageAlt": "Monitorização NVIDIA Quadro P1000: fabricante NVIDIA, controlador nvidia carregado, frequência gráfica 1.26 GHz, memória 2.50 GHz, temperatura 50 °C, motores a 0 %, sem processos ativos, memória total 4096 MiB", + "nvidiaImageCaption": "NVIDIA Quadro P1000 com controlador proprietário: frequências, temperatura, barras de utilização dos motores e processos ativos.", + "intelImageAlt": "Monitorização de iGPU Intel UHD Graphics com i915: consumo 11.31 W, carga de vídeo 1 % e processo ffmpeg com 8 MB", + "intelImageCaption": "Intel iGPU com i915 ativo. A tabela Processos Ativos pega um trabalho ffmpeg usando o motor de vídeo.", + "amdImageAlt": "Monitorização de GPU integrada AMD Lucienne com amdgpu: motores a 0 % e amdgpu_top como processo ativo", + "amdImageCaption": "iGPU AMD monitorizada com amdgpu_top. A ferramenta surge como processo ativo porque recolhe os dados em direto.", + "installTitle": "Instalar o controlador NVIDIA a partir da janela", + "installBody": "Com nouveau/nvidiafb sem controlador proprietário NVIDIA, não se podem ler frequências, consumo e carga por processo. A janela oferece Instalar controladores NVIDIA, que executa o script de Instalar controladores NVIDIA (host).", + "noDriverAlt": "Monitorização NVIDIA Quadro P620 com nvidiafb e nouveau carregados, aviso Monitorização alargada indisponível e botão azul Instalar controladores NVIDIA", + "noDriverCaption": "Controlador proprietário ainda não instalado: a janela oferece instalação num clique.", + "promptAlt": "Diálogo de confirmação de instalação do driver NVIDIA GPU listando GPUs detectadas, containers LXC com passagem NVIDIA e um par Sim/Cancelar", + "promptCaption": "Resumo pré-instalação: GPUs detectadas, containers LXC que já têm passagem NVIDIA, e o que o script fará. Nada é tocado até confirmares.", + "successAlt": "Saída terminal mostrando o driver NVIDIA 580.105.08 instalado com sucesso e nvidia-smi relatando um Quadro P620", + "successCaption": "Instalação bem-sucedida — o NVIDIA .run construído via DKMS, o serviço de persistência está em vigor, e o nvidia-smi relata o GPU.", + "warningTitle": "Escolha uma versão do driver que o seu GPU realmente suporta", + "warningBody": "Os ramos NVIDIA mais recentes deixam de suportar famílias antigas, como Maxwell ou Kepler. Se nvidia-smi mostrar \"No devices were found\" após instalar ou o DKMS falhar, o ramo pode ser incompatível. Repita com um ramo anterior, como legacy 470.x para Kepler. Consulte a compatibilidade na página oficial de pesquisa de controladores.", + "whereGoIntro": "Para onde ir a partir daqui:", + "whereGoItems": [ + "Instalar controladores NVIDIA (host) — guia completo, matriz de compatibilidade do kernel, patch NVENC opcional e propagação aos LXC.", + "Mudar modo GPU (VM ↔ LXC) — efeitos do controlo Mudar modo do cartão.", + "Adicionar GPU a VM (passthrough) e Adicionar GPU a LXC — primeira atribuição de uma GPU não associada." + ] + }, + "coral": { + "heading": "Aceleradores Coral TPU / AI", + "subHeading": "(condicional)", + "intro": "Aparece com dispositivos Google Coral ou outros aceleradores IA ligados. Cada janela mostra ligação (M.2 / mini-PCIe / USB), largura PCIe, ID fabricante/produto, suporte de software (apex no kernel para PCIe, libedgetpu em espaço de utilizador para USB), módulos (gasket + apex), nós (/dev/apex_*), estado do runtime Edge TPU, temperatura em direto e limiares de aviso do firmware.", + "imageAlt": "Detalhes Coral Edge TPU: ligação PCIe/M.2, 5.0 GT/s x1, ID 1ac1:089a, controlador apex, módulos gasket e apex carregados, /dev/apex_0 presente, Edge TPU Runtime não instalado, 53.5 °C e limiares de aviso de hardware", + "imageCaption": "Coral M.2 com módulos do kernel carregados, nó de dispositivo presente e avisos de temperatura do firmware disponíveis. O indicador do runtime fica verde após instalar o Edge TPU Runtime correspondente.", + "pathsIntro": "Existem dois caminhos de instalação dependendo do fator de forma:", + "pathsItems": [ + "M.2 / Mini-PCIe — o host precisa dos módulos do kernel gasket + apex construídos via DKMS para que o nó do dispositivo /dev/apex_0 apareça no arranque.", + "USB Accelerator — o host só precisa do tempo de execução do espaço de usuário Edge TPU (libedgetpu1-std) do repositório APT do Google." + ], + "outro": "Instalar Coral TPU no host deteta e gere as duas variantes. Informações e runtime oficial em coral.ai/docs. Depois, atribua o dispositivo a um contentor com Adicionar Coral TPU a LXC." + }, + "storage": { + "heading": "Resumo de armazenamento", + "intro": "Todos os dispositivos de blocos conhecidos pelo kernel, agrupados por tipo. Cada disco mostra nome (sda, nvme0n1, zram0…), tipo (SSD, HDD, NVMe SSD), modelo e ligação negociada. Clique para abrir modelo, número de série, capacidade, interface e velocidade atual e máxima.", + "imageAlt": "Resumo do armazenamento com onze dispositivos de blocos (SSD SATA, HDD SATA, SSD NVMe e zram), modelos e velocidades negociadas; os dois NVMe mostram 3.0 x4 com velocidade atual destacada", + "imageCaption": "Onze dispositivos neste nó. As ligações SATA aparecem como SATA <version>, <Gb/s> (current: ...); os NVMe como <PCIe gen> x<width>.", + "nvmeBody": "A linha de cada NVMe compara a ligação negociada com o máximo suportado. Se diferirem, como um SSD Gen3 x4 a 3.0 x1 num slot com uma só via, o valor atual aparece em âmbar. Ajuda a diagnosticar discos lentos ou alterações nas vias após atualizar o BIOS.", + "nvmeModalAlt": "Detalhes NVMe de nvme0n1: NVMe SSD, 953.9 GB, ligação atual 3.0 x1 em âmbar, máximo 3.0 x4, WDC CL SN720, número de série e interface PCIe/NVMe", + "nvmeModalCaption": "Detalhes NVMe com ligação reduzida: o disco suporta x4, mas o slot está ligado a x1.", + "outro": "Dados SMART, autotestes, histórico e relatório PDF estão em Painel: Armazenamento. Os mesmos dados alimentam Estado e testes SMART dos discos. Um teste longo pelo script escreve o JSON mostrado pelo Monitor em Armazenamento → Histórico." + }, + "pci": { + "heading": "Dispositivos PCI", + "intro": "Dispositivos PCI identificados por BDF PCI (Bus:Device.Function, por exemplo 03:00.0) e classe (Controlador de armazenamento, Controlador USB, Placa gráfica, Controlador de rede, Controlador de áudio…). Cada cartão mostra fabricante, nome e controlador do kernel associado, úteis para diagnosticar passthrough, grupos IOMMU ou controladores incorretos.", + "imageAlt": "Quinze dispositivos PCI por classe: controladores de armazenamento ahci/nvme, USB, placas gráficas (uma com vfio-pci, outra com controlador nativo), rede igb/tg3 e áudio associado a uma GPU em passthrough", + "imageCaption": "Quinze dispositivos neste nó. Note que o GPU e sua função de áudio acompanhante estão ligados ao vfio-pci — é um cartão preparado para a passagem do VM.", + "bdfTitle": "Lendo o BDF", + "bdfBody": "03:00.0 indica barramento PCI 03, dispositivo 00, função 0. As GPU dedicadas usam geralmente .0 para gráficos e .1 para áudio HDMI. Ambas as funções passam juntas para a VM; por isso Mudar modo GPU limpa as associações de áudio órfãs ao sair do modo VM." + }, + "usb": { + "heading": "Dispositivos USB", + "intro": "Dispositivos USB com fabricante e produto, versão USB, endereço bus:device, ID vendor:product e controlador do kernel. Classificam-se por função: Comunicações (adaptadores Z-Wave / Zigbee), UPS, armazenamento ou HID. Assim identificam-se sem comparar os ID.", + "imageAlt": "Dispositivos USB: Aeotec Z-Wave Z-Stick, coordenador Zigbee ConBee II e UPS Ellipse ECO, com versão USB, endereço, ID vendor:product e controlador associado", + "imageCaption": "Três dispositivos USB – dois rádios de automação doméstica em usbfs e um UPS em usbfs (NUT fala com ele através da libusb)." + }, + "power": { + "heading": "Consumo de energia", + "subHeading": "(condicional)", + "intro": "Aparece se o host fornecer telemetria de potência. Mostra duas origens independentes quando disponíveis:", + "items": [ + "Consumo total ACPI / IPMI — potência de todo o sistema medida por um sensor da placa-mãe ou pelo BMC. Habitual em placas de servidor.", + "Consumo do encapsulamento CPU — contadores Intel RAPL ou equivalente AMD. Distingue o consumo CPU do restante sistema em placas de consumo sem sensor total." + ], + "supplyImageAlt": "Consumo: 198 W totais via ACPI e duas fontes de alimentação com estado OK e saída de 185 W e 5 W", + "supplyImageCaption": "Placa de servidor com um único sensor de potência ACPI e PSUs duplos reportados através do IPMI — o segundo PSU é o redundante, inativo em 5 W.", + "cpuImageAlt": "Consumo numa placa de uso doméstico: apenas 8.7 W de CPU via Intel RAPL", + "cpuImageCaption": "Placa de uso doméstico sem sensor total: mostra apenas o consumo CPU via RAPL." + }, + "psu": { + "heading": "Fontes de alimentação", + "subHeading": "(condicional)", + "body": "Em máquinas de servidor com fontes duplas, IPMI mostra presença (PSU 1 / PSU 2 / …), tensão de entrada, potência de saída e estado OK/falha. Verifique após uma interrupção elétrica em nós com fontes redundantes." + }, + "fans": { + "heading": "Ventiladores do sistema", + "subHeading": "(condicional)", + "body": "RPM de cada ventoinha com minigráfico, se suportado. Sem dados individuais apresenta uma única leitura da ventoinha do chassis." + }, + "ups": { + "heading": "Status do no-break", + "subHeading": "(condicional)", + "body": "Aparece com um servidor NUT (Network UPS Tools) configurado e acessível. Mostra estado (rede / bateria / carregamento / bateria fraca), carga da bateria, autonomia estimada, percentagem de carga suportada, tensão de entrada, modelo e firmware. Alimenta também Segurança e certificados do monitor de saúde: a passagem a bateria é assinalada imediatamente." + }, + "dataCollected": { + "heading": "Como os dados são coletados", + "headerSection": "Secção da página", + "headerEndpoint": "Endpoint", + "headerSource": "Origem", + "rows": [ + { + "section": "Inventário estático (PCI, CPU, BIOS)", + "endpoint": "/api/hardware", + "source": "lspci -vmm, /proc/cpuinfo, dmidecode; em cache para a vida útil do processo." + }, + { + "section": "Valores dos sensores em direto", + "endpoint": "/api/hardware/live", + "source": "sensors (lm-sensors), /sys/class/hwmon e /sys/block identificam os dispositivos de armazenamento. As temperaturas permanecem em direto; só o mapeamento hwmon-dispositivo fica em cache por 60 segundos." + }, + { + "section": "CPU histórico de temperatura", + "endpoint": "/api/temperature/history", + "source": "Série temporal registada a cada 60 segundos pelo coletor de temperatura e guardada em SQLite." + }, + { + "section": "Métricas GPU em direto", + "endpoint": "/api/gpu//realtime", + "source": "NVIDIA: nvidia-smi --query-gpu=.... Intel: intel_gpu_top. AMD: sysfs /sys/class/drm/cardN." + } + ], + "codeComment1": "# Comparar o inventário com a vista do sistema operativo", + "codeComment2": "# Confirme o cartão GPU que o painel vê" + }, + "whereNext": { + "heading": "Para onde seguir", + "items": [ + { + "label": "Instalar Drivers NVIDIA (Host)", + "href": "/docs/hardware/nvidia-host", + "tail": " — o que executa o botão de instalação do GPU." + }, + { + "label": "Mudar modo GPU (VM ↔ LXC)", + "href": "/docs/hardware/switch-gpu-mode", + "tail": " — efeitos no host da mudança de modo em cada cartão GPU." + }, + { + "label": "Instale Coral TPU no Host", + "href": "/docs/hardware/install-coral-tpu-host", + "tail": " — instalação do módulo do kernel e do runtime Coral." + }, + { + "label": "Integridade e teste do disco SMART", + "href": "/docs/disk-manager/smart-disk-test", + "tail": " — script que produz os dados SMART nos detalhes do disco em Armazenamento." + }, + { + "label": "Painel: Página de armazenamento", + "href": "/docs/monitor/dashboard/storage", + "tail": " — tabela completa de atributos SMART, historial de auto-teste e relatório PDF." + }, + { + "label": "Monitor de Saúde", + "href": "/docs/monitor/health-monitor", + "tail": " — categoria CPU e Temperatura, que utiliza os mesmos sensores." + }, + { + "label": "Referência da API", + "href": "/docs/monitor/api", + "tail": " — endpoints de hardware e GPU." + }, + { + "label": "Índice do painel", + "href": "/docs/monitor/dashboard", + "tail": " — os outros separadores." + } + ] + } +} diff --git a/web/messages/pt/docs/monitor/dashboard/index.json b/web/messages/pt/docs/monitor/dashboard/index.json new file mode 100644 index 00000000..18d79d2d --- /dev/null +++ b/web/messages/pt/docs/monitor/dashboard/index.json @@ -0,0 +1,101 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Painel | Documentação do ProxMenux", + "description": "O painel é a interface principal do ProxMenux Monitor: dez separadores, incluindo o lançador Apps, um cabeçalho global e uma ordem de navegação configurável." + }, + "header": { + "title": "Painel", + "description": "A vista diária do ProxMenux Monitor: dez separadores, incluindo o lançador Apps, um cabeçalho global e uma ordem de navegação configurável.", + "section": "ProxMenux Monitor" + }, + "oneHeader": { + "title": "Um cabeçalho, dez separadores", + "body": "O cabeçalho (logótipo, nome do nó, indicador de estado, tempo de atividade, atualização e tema) permanece visível. O separador ativo muda toda a área de conteúdo. A cor do indicador reflete a categoria mais grave do monitor de estado: o mesmo dado é mostrado no painel." + }, + "tabs": { + "heading": "Os dez separadores", + "intro": "Cada guia tem sua própria página dedicada. As páginas são adicionadas incrementalmente à medida que a documentação é preenchida; abaixo está a lista completa e pelo que cada uma é responsável.", + "headerTab": "Separador", + "headerOwns": "O que abrange", + "rows": [ + { + "name": "Visão geral do sistema", + "linksTo": "/docs/monitor/dashboard/system-overview", + "owns": "CPU / widgets de memória / temperatura, contagem ativa de VM e LXC, gráficos de métricas históricas, resumos de armazenamento e rede. Guia de aterrissagem padrão até que a ordem de navegação seja personalizada." + }, + { + "name": "Aplicativos", + "linksTo": "/docs/monitor/dashboard/apps", + "owns": "Lançador unificado de ligações web LXC registadas e ligações personalizadas, com categorias, pesquisa, atalhos dos sistemas convidados e indicadores de atualização por aplicação." + }, + { + "name": "Armazenamento", + "owns": "pools Proxmox, discos físicos, dados SMART, estado ZFS, desgaste & vida útil, histórico de observação." + }, + { + "name": "Rede", + "owns": "Interfaces físicas, bonds, bridges e OVS, endereços IP/MAC, gráficos RX/TX e histórico RRD por interface." + }, + { + "name": "VMs e LXCs", + "owns": "Inventário de sistemas convidados, detalhes de configuração, métricas e registos, ações de iniciar, parar, reiniciar e desligar." + }, + { + "name": "Hardware", + "owns": "CPU modelo e topologia, layout de memória, topologia PCIe, GPUs com monitoramento em tempo real por slot." + }, + { + "name": "Registros do sistema", + "owns": "Live journalctl com filtros, histórico de tarefas Proxmox, registro de notificação, pacotes de logs para download." + }, + { + "name": "Terminal", + "owns": "Shell do anfitrião ou de qualquer VM/CT no navegador, com xterm.js sobre WebSockets." + }, + { + "name": "Segurança", + "owns": "Configuração da autenticação, palavra-passe, 2FA e tokens API, registo de auditoria, painel Fail2Ban opcional e implementação do Secure Gateway." + }, + { + "name": "Configurações", + "owns": "Idioma do Monitor, ordem de navegação, canais de notificação, fornecedor IA, limiares de estado, exclusões e inventário de otimizações pós-instalação." + } + ] + }, + "headerAnatomy": { + "heading": "Anatomia do cabeçalho", + "items": [ + "Logo + nome do produto à esquerda. O logotipo se transforma em uma variante \"atualização disponível\" quando uma versão mais recente do Monitor é detectada.", + "Identidade do nó: nome obtido por pvesh get /nodes, com hostname como alternativa.", + "Indicador de estado: Saudável (verde), Aviso (amarelo), Crítico (vermelho). Um clique abre o monitor de estado. Uma etiqueta azul info aparece se existem elementos ignorados ainda dentro do período de supressão.", + "Tempo de atividade: tempo de funcionamento do anfitrião num formato legível.", + "Botão Atualizar: repete as chamadas API de dados em direto sem recarregar toda a página.", + "Seletor de tema: claro, escuro ou sistema. Guardado em localStorage." + ] + }, + "whereNext": { + "heading": "Para onde seguir", + "items": [ + { + "label": "Página de aplicativos", + "href": "/docs/monitor/dashboard/apps", + "tail": " — lançador unificado de ligações web e relação com aplicações LXC registadas." + }, + { + "label": "Página Visão Geral do Sistema", + "href": "/docs/monitor/dashboard/system-overview", + "tail": " — a guia de aterragem, totalmente documentada." + }, + { + "label": "Monitor de Saúde", + "href": "/docs/monitor/health-monitor", + "tail": " — janela do indicador de estado com detalhes das dez categorias." + }, + { + "label": "Arquitetura", + "href": "/docs/monitor/architecture", + "tail": " — como o painel fala com a infra-estrutura Flask." + } + ] + } +} diff --git a/web/messages/pt/docs/monitor/dashboard/network.json b/web/messages/pt/docs/monitor/dashboard/network.json new file mode 100644 index 00000000..8a8576c1 --- /dev/null +++ b/web/messages/pt/docs/monitor/dashboard/network.json @@ -0,0 +1,251 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Painel: separador Rede | Documentação ProxMenux", + "description": "O separador Rede lista as interfaces do anfitrião: placas físicas, bridges, bonds, VLAN e interfaces virtuais VM/LXC. O detalhe mostra IP, MAC, estado, membros do bond, tráfego desde o arranque e histórico RRD." + }, + "header": { + "title": "Painel: separador Rede", + "description": "As interfaces detetadas pelo kernel — placas físicas, bridges, bonds, VLAN e portas virtuais VM/LXC — estão agrupadas em três cartões. Clique numa linha para ver os endereços, contadores de tráfego e dados históricos RRD.", + "section": "ProxMenux Monitor · Painel" + }, + "intro": { + "title": "Dados atuais e históricos", + "body": "O estado atual vem de psutil.net_if_stats() e ip, e o histórico de largura de banda do armazenamento RRD Proxmox através de /api/network/<interface>/metrics. Os contadores atualizam-se aproximadamente a cada 5 segundos e os dados RRD do gráfico são carregados a pedido." + }, + "topRow": { + "heading": "Linha superior: quatro cartões estatísticos", + "headerCard": "Cartão", + "headerWhat": "O que mostra", + "rows": [ + { + "card": "Tráfego de rede", + "what": "Taxa RX/TX agregada de todas as interfaces, expressa na unidade adequada (bps / Kbps / Mbps / Gbps)." + }, + { + "card": "Interfaces ativas", + "what": "Dois contadores: Physical X / Y e Bridges X / Y, ativas face ao total. Um primeiro ponto a verificar quando algo deixa de funcionar." + }, + { + "card": "Status da rede", + "what": "Estado rápido: Saudável / Aviso / Crítico conforme a ligação, a acessibilidade do gateway e a integridade da bridge. Reflete a categoria Interfaces de rede do Health Monitor." + }, + { + "card": "Latência de rede", + "what": "Tempo de ida e volta ao gateway com um pequeno gráfico. Um clique abre o diálogo Latência de rede descrito abaixo: histórico e teste ping a pedido ao gateway, Cloudflare ou Google, com relatório PDF para transferência." + } + ] + }, + "flow": { + "heading": "Diagrama de fluxo de rede", + "intro": "Entre a linha superior e os três cartões, Network Flow mostra a topologia em direto. Os percursos dos pacotes ligam placas físicas, bridges ao centro e depois VM e contentores. Os impulsos animados representam o tráfego rx/tx atual em cada ligação.", + "imageAlt": "Diagrama de fluxo de rede – NICs à esquerda, host e pontes no meio, VMs e LXCs à direita, com impulsos animados em cada conexão", + "imageCaption": "Fluxo de rede — nós codificados a cores e cometas animados cuja direcção e espessura reflectem o tráfego ao vivo.", + "elementsTitle": "O que o diagrama mostra", + "elementsIntro": "Cada nó representa uma entrada do mesmo inventário dos cartões abaixo. A disposição em topologia permite ver as relações de imediato:", + "elements": [ + "Placas de rede (âmbar) — interfaces físicas com ligação ativa; as inativas aparecem esbatidas.", + "Anfitrião (âmbar) — o anfitrião Proxmox entre placas de rede e bridges. Um ponto fixo que não é clicável.", + "Bridges (ciano) — bridges Linux e OVS com pelo menos uma máquina convidada ativa. As não utilizadas são ocultadas para destacar o tráfego real.", + "LXC (ciano) — contentores em execução ligados a uma bridge.", + "VM (roxo) — máquinas virtuais em execução ligadas a uma bridge.", + "As VM e os contentores parados são ocultados." + ], + "pulsesTitle": "O que a animação codifica", + "pulsesBody": "Os cometas animados que viajam ao longo de cada borda representam tráfego ao vivo:", + "pulses": [ + "Direção — para a placa de rede significa tx da máquina convidada; para a máquina, rx.", + "A espessura da linha aumenta com a taxa rx+tx da máquina convidada. Sem tráfego mantém-se uma linha animada ténue; com muito tráfego, torna-se grossa.", + "Brilho da cabeça do cometa — tom quente perto de 1 MB/s, intenso a partir de 30 MB/s. Permite identificar a máquina convidada que mais ocupa uma placa de rede.", + "Clique — todos os nós exceto o anfitrião abrem o diálogo de detalhe da interface descrito abaixo. Clicar no anfitrião não tem efeito; esta vista não inclui um diálogo para ele." + ], + "useTitle": "Quando é útil", + "useBody": "Os cartões mostram o que existe; o diagrama mostra como está ligado e por onde passa o tráfego. Permite detetar máquinas na mesma bridge, duas máquinas muito ativas na mesma placa — um possível estrangulamento — ou uma VM a saturar uma ligação enquanto as outras quase não transmitem." + }, + "groups": { + "heading": "Três grupos de interface", + "intro": "Três cartões agrupam as interfaces por função. Cada cabeçalho indica quantas estão ativas. Uma etiqueta colorida identifica o tipo de cada interface:", + "badges": [ + "Azul Physical — verdadeiro NIC.", + "Verde Bridge — bridge Linux ou OVS (vmbr*).", + "Roxo Bond — agregação bond / LACP / active-backup.", + "Ciano VLAN — subinterface VLAN (vmbr0.10, eno1.42, …)." + ], + "clickable": "Todas as linhas são clicáveis: interfaces físicas, virtuais, bridges e bonds. O detalhe descrito abaixo mostra dados básicos, IP, contadores e histórico RX/TX do armazenamento RRD Proxmox.", + "physicalTitle": "Interfaces Físicas", + "physicalBody": "Interfaces físicas reconhecidas pelo kernel: eno1, enp4s0, eth0, wlp3s0, etc. Cada dispositivo tem uma linha com etiqueta azul Physical e estado da ligação. Os membros de um bond também aparecem, com referência ao bond a que pertencem.", + "bridgeTitle": "Interfaces de ponte", + "bridgeBody": "Bridges Linux (vmbr0, vmbr1, …) e OVS geridas pelo Proxmox. Cada linha mostra a etiqueta verde Bridge, a interface física se tiver uma única porta e o estado. Os bonds têm etiqueta roxa Bond; as subinterfaces VLAN, a etiqueta ciano VLAN.", + "vmTitle": "Interfaces de VM / LXC", + "vmBody": "Interfaces tap* e veth* criadas no arranque das máquinas convidadas, uma por placa virtual. O cabeçalho mostra X / Y Active e as linhas ligam à VM/CT no separador VMs e LXCs. Após a paragem, as entradas inativas desaparecem no ciclo de atualização seguinte." + }, + "drillIn": { + "heading": "Detalhe por interface", + "intro": "Um clique numa linha abre um diálogo com cinco blocos:", + "headerBlock": "Bloco", + "headerContents": "Conteúdo", + "rows": [ + { + "block": "Informações Básicas", + "contents": "Nome, tipo (física / bridge / bond / VLAN / vm), endereço MAC, estado (ativo / inativo), MTU e interface física subjacente nos tipos virtuais." + }, + { + "block": "Membros do bond", + "contents": "Apenas para bonds: cada placa membro com estado ativo ou falha, modo do bond (active-backup / 802.3ad / balance-alb / …) e interface principal se configurada." + }, + { + "block": "Endereços IP", + "contents": "Cada endereço IPv4/IPv6 com o comprimento do prefixo. Os endereços link-local automáticos aparecem a cinzento." + }, + { + "block": "Gráfico histórico", + "contents": "Largura de banda RX/TX no período escolhido (1 hora / 24 horas / 7 dias / 30 dias / 1 ano), obtida de /api/network/<interface>/metrics (RRD Proxmox)." + }, + { + "block": "Tráfego desde a última inicialização", + "contents": "Total de bytes e pacotes RX/TX desde o último arranque do anfitrião, com contadores de erros e pacotes descartados." + } + ], + "inactiveTitle": "O detalhe das interfaces inativas continua acessível", + "inactiveBody": "Se a interface estiver inativa, o diálogo mostra o aviso «Interface inativa» e omite os contadores atuais. A configuração — endereços e membros do bond — e o histórico continuam visíveis para diagnosticar a falha e quando ocorreu." + }, + "latency": { + "heading": "Diálogo Latência de rede", + "intro": "Clique em Latência de rede na linha superior para abrir o diálogo: histórico, teste a pedido, três destinos e relatório PDF para transferência.", + "targetsTitle": "Alvos", + "targetsIntro": "A lista no topo seleciona o destino do ping:", + "targets": [ + "Gateway — o router LAN. Testa apenas o percurso local para investigar problemas do switch ou da cablagem sem incluir a WAN.", + "Cloudflare (1.1.1.1) — resolvedor DNS público numa rede anycast. Testa o percurso WAN.", + "Google (8.8.8.8) — destino público alternativo para comparar resultados ou em caso de problemas regionais do Cloudflare." + ], + "mode1Title": "Modo 1 — Vista histórica", + "mode1Alt": "Diálogo de latência em modo histórico, destino Gateway, período de uma hora e medições anteriores representadas", + "mode1Caption": "Histórico do gateway na última hora. O processo de recolha de temperatura e latência guarda as medições na base de dados a cada 60 segundos.", + "mode1Body1": "Modo inicial do diálogo. Uma segunda lista escolhe o período (1 hora / 6 horas / 24 horas / 3 dias / 7 dias). Acima aparecem Atual / Mínimo / Média / Máximo e um estado Excelente / Bom / Razoável / Mau conforme os limites abaixo.", + "mode1Body2": "Fonte: as medições usadas pelo Health Monitor para detetar lentidão persistente. O processo em segundo plano _temperature_collector_loop mede o gateway a cada 60 segundos e guarda o histórico num SQLite local.", + "mode2Title": "Modo 2 — Ensaio em tempo real", + "mode2Alt": "Diálogo de latência com ping em tempo real ao Cloudflare, progresso a 50% e novas medições no gráfico", + "mode2Caption": "Teste de dois minutos ao Cloudflare com uma leitura a cada cinco segundos, logo acrescentada ao gráfico. Parar termina mais cedo; Repetir teste acrescenta medições ao mesmo conjunto de dados.", + "mode2Intro": "Mudando o alvo para Cloudflare ou Google inicia um teste de ping sob demanda. Comportamento:", + "mode2Items": [ + "Duração — dois minutos por teste, com barra de progresso e segundos restantes.", + "Frequência — uma leitura a cada cinco segundos, 24 por teste.", + "Método — ICMP Echo Request (ping), três pings consecutivos por medição com latência média.", + "Stop — termina o teste imediatamente; os dados parciais são preservados.", + "Repetir teste — acrescenta medições aos dados existentes para criar um histórico mais longo com vários testes.", + "Indicador de estado atual — atualizado após cada medição com os mesmos limites Excelente / Bom / Razoável / Mau." + ], + "thresholdsTitle": "Limiares de desempenho", + "headerStatus": "Estado", + "headerRange": "Intervalo", + "headerImpact": "Impacto prático", + "thresholdRows": [ + { + "status": "Excelente", + "range": "< 50 ms", + "impact": "Ideal para aplicações em tempo real, jogos e chamadas de vídeo." + }, + { + "status": "Bom", + "range": "50 – 100 ms", + "impact": "Aceitável para a maioria das aplicações com impacto mínimo." + }, + { + "status": "Razoável", + "range": "100 – 200 ms", + "impact": "Atraso notável. Pode afetar VoIP e aplicativos interativos." + }, + { + "status": "Mau", + "range": "> 200 ms", + "impact": "Latência significativa. Investigação recomendada." + } + ], + "reportTitle": "Relatório de latência da rede (PDF)", + "reportIntro": "Ambos os modos têm um botão Relatório junto ao seletor de destino. Gera um PDF das medições que pode anexar a um pedido de assistência ao fornecedor de Internet.", + "reportPreviewAlt": "Primeira página PDF do relatório de latência: resumo executivo, indicador, estatísticas, gráfico e guia dos limites", + "reportPreviewCaption": "A primeira página contém resumo executivo, indicador, estatísticas principais, evolução da latência e guia dos limites. A partir da página 2 surgem a tabela de medições e a metodologia.", + "downloadLabel": "Transferir relatório de latência de exemplo (PDF)", + "sectionsIntro": "O relatório contém seis secções:", + "sections": [ + "Resumo executivo — indicador de 0 a mais de 300 ms com zonas verde, amarela e vermelha; estado Excelente / Bom / Razoável / Mau; destino, modo, número de medições e resumo da perda de pacotes.", + "Estatísticas de latência — quatro indicadores para valor atual, mínimo, média e máximo, mais número de medições, perda média de pacotes e período de teste.", + "Gráfico de latência — gráfico de área das medições durante o teste, com referências de mínimo, média e máximo no eixo vertical.", + "Limites de desempenho — a mesma escala de quatro níveis anterior, com um ponto colorido por nível.", + "Resultados detalhados — tabela numerada com data e hora, latência, perda de pacotes e estado de cada medição. Revela picos breves ocultos pelas médias.", + "Metodologia — ICMP Echo Request, três pings consecutivos por medição, nome e IP do destino e avaliação final derivada do estado." + ], + "useCaseTitle": "Caso de uso: assistência do fornecedor de Internet", + "useCaseBody": "Execute dois minutos de teste Cloudflare quando notar lentidão, prolongue com Repetir teste e selecione Relatório. O PDF contém todas as medições e a metodologia. Pode anexá-lo a um pedido de assistência com as horas do incidente; o fornecedor decide os comprovativos necessários." + }, + "excluding": { + "heading": "Excluir interfaces da monitorização", + "body1": "Pode excluir interfaces da monitorização: bridges desativadas intencionalmente, interfaces de teste ou placas removidas ainda configuradas. A definição fica em excluded_interfaces: o Health Monitor não gera avisos ou notificações e não as inclui no estado geral.", + "body2": "No menu de contexto escolha Excluir da monitorização. A interface continua visível com etiqueta roxa excluída. Pode reativar a monitorização no mesmo menu." + }, + "dataCollected": { + "heading": "Como os dados são coletados", + "headerSection": "Secção da página", + "headerEndpoint": "Endpoint", + "headerSource": "Origem", + "rows": [ + { + "section": "Inventário de interface", + "endpoint": "/api/network", + "source": "ip -j addr + ip -j link e consulta de bonds e bridges." + }, + { + "section": "Cartões de resumo", + "endpoint": "/api/network/summary", + "source": "Resumo do inventário e contagem de interfaces ativas e inativas." + }, + { + "section": "Histórico RX/TX por interface", + "endpoint": "/api/network//metrics", + "source": "Os contadores atuais usam /proc/net/dev; o histórico vem de RRD Proxmox através de pvesh. As interfaces VM/LXC usam dados da máquina convidada; as físicas e bridges, dados do nó." + }, + { + "section": "Latência: actual", + "endpoint": "/api/network/latency/current", + "source": "Breve série de ping ao gateway ou destino configurado." + }, + { + "section": "Latência: histórico", + "endpoint": "/api/network/latency/history", + "source": "Medições guardadas aproximadamente a cada 60 segundos pelo processo de recolha de temperatura e latência em segundo plano." + } + ], + "codeComment1": "# Verificar o estado das interfaces apresentado no painel", + "codeComment2": "# Verificar uma medição atual de latência de ponta a ponta" + }, + "whereNext": { + "heading": "Para onde seguir", + "items": [ + { + "label": "Monitor de Saúde", + "href": "/docs/monitor/health-monitor", + "tail": " — categoria Rede e limites do histórico de latência." + }, + { + "label": "Referência da API", + "href": "/docs/monitor/api", + "tail": " — endpoints de rede e latência." + }, + { + "label": "Integrações", + "href": "/docs/monitor/integrations", + "tail": " — a recolha Prometheus disponibiliza as mesmas métricas de rede." + }, + { + "label": "Índice do painel", + "href": "/docs/monitor/dashboard", + "tail": " — as outras páginas." + }, + { + "label": "ProxMenux → Rede", + "href": "/docs/network", + "tail": " — o lado das ações: análise de ponte, nomes de interface persistentes, backup e reinício, iperf3." + } + ] + } +} diff --git a/web/messages/pt/docs/monitor/dashboard/security.json b/web/messages/pt/docs/monitor/dashboard/security.json new file mode 100644 index 00000000..0c10615a --- /dev/null +++ b/web/messages/pt/docs/monitor/dashboard/security.json @@ -0,0 +1,246 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Painel: separador Segurança | Documentação ProxMenux", + "description": "O separador Segurança reúne os controlos de proteção em duas colunas: ProxMenux Monitor (autenticação, SSL/HTTPS, tokens de API, Secure Gateway) e Proxmox VE (firewall, Fail2Ban, auditoria Lynis). Inclui o assistente Secure Gateway, a auditoria Lynis e a instalação e o ajuste das regras do Fail2Ban." + }, + "header": { + "title": "Painel: separador Segurança", + "description": "Os controlos de segurança estão organizados em dois blocos: a configuração do Monitor (autenticação, SSL, tokens, Secure Gateway) e a do anfitrião Proxmox monitorizado (firewall, Fail2Ban, Lynis).", + "section": "ProxMenux Monitor · Painel" + }, + "intro": { + "title": "Dois escopos, uma aba", + "body": "O separador Segurança tem duas secções: ProxMenux Monitor (definições do painel) e Proxmox VE (definições do anfitrião). Os cartões Fail2Ban e Lynis permitem instalar estas ferramentas quando estão ausentes e mostram os respetivos controlos após a instalação." + }, + "monitor": { + "heading": "ProxMenux Monitor", + "intro": "Quatro cartões permitem gerir o acesso ao painel e a autenticação." + }, + "auth": { + "heading": "Autenticação", + "imageAlt": "Cartão de autenticação com estado Ativada, botões Terminar sessão e Alterar palavra-passe, informações sobre autenticação de dois fatores e botões para a ativar ou desativar a autenticação", + "imageCaption": "Cartão com autenticação ativa: indicador de estado, Alterar palavra-passe, Ativar 2FA e a ação destrutiva Desativar autenticação.", + "intro": "O cartão permite gerir o início de sessão no painel. O primeiro arranque, a política de palavras-passe, a configuração TOTP e a recuperação em caso de perda do autenticador estão descritos em Acesso e autenticação. Este cartão permite gerir essas definições no dia a dia:", + "items": [ + "Estado da autenticação — indicador Ativada / Desativada / Recusada.", + "Alterar palavra-passe — palavra-passe atual + nova palavra-passe + confirmação.", + "Ativar / Desativar autenticação de dois fatores — abre a configuração com código QR ao ativar e pede a palavra-passe atual ao desativar.", + "Desativar autenticação — ação destrutiva que volta a mostrar o diálogo inicial Proteger o painel? na próxima visita." + ] + }, + "ssl": { + "heading": "SSL/HTTPS", + "imageAlt": "Cartão SSL/HTTPS com estado HTTP sem SSL, certificado Proxmox detetado com titular, emissor e validade, botão Usar certificado Proxmox e opção Usar certificado personalizado", + "imageCaption": "Cartão SSL/HTTPS com HTTPS desativado. O Monitor deteta o certificado instalado no anfitrião Proxmox e permite usá-lo com um clique. Se tiver ficheiros próprios noutro local, pode escolher Usar certificado personalizado.", + "intro": "Disponibiliza o painel por HTTPS sem proxy inverso. O cartão deteta o certificado usado pelo Proxmox em /etc/pve/local/ e mostra o titular, o emissor e a validade para verificação antes da ativação. Há duas formas de ativar HTTPS:", + "items": [ + "Usar certificado Proxmox — o Monitor reutiliza o certificado do anfitrião com um clique. Adequado se o PVE e o painel já usarem o mesmo nome DNS.", + "Usar certificado personalizado — cole os caminhos absolutos do certificado .pem e da chave privada .key. São validados antes de reiniciar o serviço. Se o carregamento falhar, o painel regressa automaticamente a HTTP e permanece acessível." + ], + "enabledAlt": "Cartão SSL/HTTPS com HTTPS ativado, certificado ativo com os caminhos de pve-ssl.pem e pve-ssl.key e botão Desativar HTTPS", + "enabledCaption": "HTTPS ativo — o cartão mostra o certificado em uso, os caminhos dos ficheiros e a ação Desativar HTTPS, que repõe HTTP na mesma porta.", + "acmeTitle": "ACME / Let's Encrypt através do Proxmox", + "acmeBody": "Se o nó Proxmox já tiver Let’s Encrypt configurado em Datacenter → Certificados → ACME, o painel reutiliza o certificado apresentado aos navegadores ao escolher Usar certificado Proxmox. Não é necessária uma configuração ACME separada para o Monitor.", + "walkthroughLink": "Consulte HTTPS para ProxMenux Monitor para saber como é detetado o certificado ACME, o que é gravado no disco e como usar um par .pem / .key próprio." + }, + "apiTokens": { + "heading": "Tokens de acesso API", + "emptyAlt": "Cartão de tokens de acesso à API vazio, com informações sobre os tokens e botão Gerar novo token de API", + "emptyCaption": "Cartão de tokens numa instalação nova. A caixa Sobre os tokens de API resume a validade, a utilização e a inclusão em cabeçalhos Authorization: Bearer.", + "intro": "Tokens válidos por um ano para integrações automáticas: widgets Homepage, sensores REST do Home Assistant, coletores Grafana, fluxos n8n e scripts próprios. O cartão passa por três estados: vazio → formulário → token gerado.", + "generateBody": "Gerar um token. Clique em Gerar novo token de API. Introduza um nome do token descritivo para o identificar na lista e a sua palavra-passe como confirmação adicional. Se a 2FA estiver ativa, é também pedido o código TOTP atual.", + "generateAlt": "Formulário de geração de token de API com campos Nome do token e Palavra-passe e botões Gerar token e Cancelar", + "generateCaption": "Formulário Gerar token de API: introduza um nome e confirme com a palavra-passe e, se a 2FA estiver ativa, o código TOTP.", + "saveBody": "Guarde o token imediatamente. O valor completo aparece apenas uma vez após a criação. O cartão assinala-o com um aviso laranja e um botão de cópia. Não poderá recuperá-lo depois; a lista de tokens ativos mostrará apenas o prefixo.", + "generatedAlt": "Token de API gerado com valor oculto, botão de cópia, instruções para o cabeçalho Authorization: Bearer e lista dos tokens ativos com prefixo", + "generatedCaption": "Token gerado: o valor é mostrado uma vez, com botão de cópia e o excerto exato Authorization: Bearer. A lista de tokens ativos mostra nome, prefixo e data de criação para permitir a revogação individual.", + "outro": "Cada token ativo tem um botão Revogar. A revogação invalida-o imediatamente e interrompe as integrações que o usam. Encontra exemplos para Homepage, Home Assistant, n8n e Prometheus em Integrações." + }, + "gateway": { + "heading": "Secure Gateway", + "cardAlt": "Cartão Secure Gateway antes da primeira implementação, com o botão Implementar Secure Gateway", + "cardCaption": "Cartão Secure Gateway numa instalação nova: um botão inicia o assistente.", + "intro": "Aceda ao painel, à interface web Proxmox e às máquinas convidadas através da sua rede Tailscale, sem expor portas à Internet. O Monitor implementa no anfitrião um contentor LXC Alpine com tailscaled como router de sub-rede. Após aprovação na consola Tailscale, os dispositivos remotos podem aceder ao IP LAN do anfitrião a partir de qualquer local.", + "wizardTitle": "Assistente passo a passo", + "wizardIntro": "Antes de clicar em Deploy Secure Gateway, gere uma chave de autenticação na consola Tailscale. O assistente irá pedi-la no passo 2.", + "step0Title": "0. Gerar a chave de autenticação Tailscale", + "step0Body": "Inicie sessão em login.tailscale.com/admin/settings/keys e clique em Generate auth key…. Escolha uma chave pré-autenticada para que o gateway não precise de um início de sessão interativo. Copie o valor; é mostrado apenas uma vez.", + "step0Alt": "Página Settings → Keys da consola Tailscale, com o botão Generate auth key realçado", + "step0Caption": "Consola de administração Tailscale — Settings → Keys → Generate auth key…. Se ainda não tiver conta, crie uma conta gratuita Tailscale através da ligação no assistente.", + "step1Title": "1. Abrir o assistente", + "step1Body": "Regresse ao separador Segurança e clique em Deploy Secure Gateway. O primeiro passo apresenta as funções e os requisitos.", + "step1Alt": "Introdução do assistente Secure Gateway: acesso VPN sem encaminhamento de portas e com encriptação ponto a ponto", + "step1Caption": "Passo 1 — visão geral do que o Secure Gateway fornece e um lembrete de que você precisará de uma conta de Tailscale gratuita.", + "step2Title": "2. Autenticação Tailscale", + "step2Body": "Cole a chave de autenticação do passo 0 e escolha um nome de anfitrião. O gateway aparecerá com esse nome na consola Tailscale, normalmente proxmox-gateway ou o nome do nó.", + "step2Alt": "Passo do assistente Secure Gateway que pede a chave de autenticação Tailscale e o nome de anfitrião do dispositivo, com ligação para gerar a chave", + "step2Caption": "Passo 2: cole a chave pré-autenticada e escolha o nome de anfitrião. Se tiver ignorado o passo 0, a ligação sob o campo abre a página Tailscale correspondente.", + "step3Title": "3. Âmbito de acesso", + "step3Intro": "Escolha o que sua tailnet pode alcançar através do gateway:", + "step3Items": [ + "Proxmox Only — apenas a IU Proxmox e o Monitor. Superfície de ataque mais pequena.", + "Full Local Network — toda a sub-rede LAN (auto-detectado a partir da interface primária do host). Permite alcançar NAS, impressoras, VMs e qualquer outro dispositivo LAN.", + "Sub-redes personalizadas — indique os CIDR pretendidos. Para configurações com várias VLAN em que apenas alguns segmentos devem ficar acessíveis." + ], + "step3Alt": "Passo Âmbito de acesso do assistente Secure Gateway com as opções Apenas Proxmox, Toda a rede local e Sub-redes personalizadas", + "step3Caption": "Passo 3: escolha o âmbito de acesso. Toda a rede local preenche automaticamente a sub-rede LAN detetada.", + "step4Title": "4. Opções avançadas (opcional)", + "step4Intro": "Duas opções, ambas desativadas por predefinição:", + "step4Items": [ + "Exit Node — ao ativar e selecionar esta opção num dispositivo remoto, todo o tráfego de Internet desse dispositivo sai pela WAN do anfitrião Proxmox. Útil em viagem para usar a ligação de casa a partir do telemóvel.", + "Aceitar rotas — permite ao gateway aceder a redes anunciadas por outros routers de sub-rede Tailscale, em instalações com vários locais." + ], + "step4Alt": "Passo Opções avançadas do Secure Gateway com as caixas Exit Node e Accept Routes", + "step4Caption": "Passo 4: Exit Node e Accept Routes. Deixe ambas desativadas se apenas precisar de aceder ao painel a partir do telemóvel ou portátil.", + "step5Title": "5. Rever e implementar", + "step5Body": "Resumo final antes da implementação. O assistente lembra o passo manual ainda necessário na consola Tailscale: aprovar a rota de sub-rede.", + "step5Alt": "Passo Rever e implementar do Secure Gateway com resumo do nome de anfitrião, modo de acesso, redes, Exit Node e Accept Routes e botão Implementar gateway", + "step5Caption": "Passo 5 — rever a configuração e implantar. O aviso azul no fundo indica a aprovação da rota pendente.", + "approvalTitle": "Um último passo manual no administrador Tailscale", + "approvalBody": "Após a implementação, abra login.tailscale.com/admin/machines e aprove a rota de sub-rede anunciada pelo gateway. Até lá, os dispositivos remotos da rede Tailscale não podem aceder aos IP LAN através do gateway. O Tailscale assinala as rotas pendentes com um aviso amarelo na linha do dispositivo: clique em Edit route settings e selecione a rota." + }, + "pve": { + "heading": "Proxmox VE", + "intro": "As proteções do anfitrião: firewall, prevenção de intrusões e auditoria de segurança. Os cartões Fail2Ban e Lynis oferecem a instalação se necessário e depois mostram os controlos de gestão." + }, + "firewall": { + "heading": "Proxmox Firewall", + "imageAlt": "Cartão da firewall Proxmox com estado do cluster e anfitrião, regras de acesso rápido para Monitor e interface web Proxmox, contadores, lista de regras e botão Adicionar regra", + "imageCaption": "Cartão da firewall Proxmox: interruptores para o cluster e anfitrião, portas comuns em Regras de acesso rápido, contadores em Resumo de regras e lista completa com + Adicionar regra.", + "intro": "O cartão gere a configuração da firewall Proxmox VE. O motor clássico usa iptables e o alternativo usa nftables. Não gere regras arbitrárias criadas fora do Proxmox. Três blocos:", + "items": [ + "Firewall do cluster + firewall do anfitrião — interruptores globais. A firewall do cluster tem de estar ativa para que as regras do anfitrião tenham efeito. O cartão indica esta dependência junto da definição.", + "Regras de acesso rápido — linhas predefinidas para 8008/TCP (Monitor) e 8006/TCP (interface web Proxmox), com estado permitido, bloqueado ou sem proteção. A interface Proxmox é permitida por uma macro de firewall integrada que não pode ser eliminada por engano.", + "Resumo de regras — contadores do total de regras, regras accept, regras drop/reject e portas distintas protegidas. Os valores são lidos de /etc/pve/firewall/cluster.fw e /etc/pve/nodes/<node>/host.fw.", + "Regras da firewall — lista com ação, protocolo, porta, origem e nível. + Adicionar regra abre o editor no cartão; o caixote do lixo elimina a regra. As alterações são guardadas nos ficheiros Proxmox e aparecem também na respetiva interface (Datacenter / Node → Firewall)." + ] + }, + "fail2ban": { + "heading": "Fail2Ban", + "subHeading": "(conforme o estado)", + "whatIs": "O que é. O Fail2Ban é um serviço de código aberto que deteta tentativas de início de sessão falhadas repetidas nos registos e bloqueia o IP na firewall. Protege SSH e formulários web contra ataques contínuos de força bruta. O ProxMenux configura três jails: SSH, acesso web Proxmox (porta 8006) e acesso ProxMenux Monitor (porta 8008).", + "notBundled": "O Fail2Ban não está incluído. O cartão deteta se está instalado e adapta-se: se faltar, permite instalá-lo com um clique. Depois apresenta o estado das jails e os IP bloqueados e permite ajustar o número de tentativas e a duração do bloqueio de cada jail.", + "notInstalledAlt": "Cartão Fail2Ban não instalado com descrição da proteção de SSH, interface web Proxmox e Monitor através de nftables e botão Instalar e configurar Fail2Ban", + "notInstalledCaption": "Cartão Fail2Ban antes de instalar — a caixa azul visualiza o que a instalação configuraria.", + "clickBody": "Clique em Instalar e configurar Fail2Ban para abrir um diálogo de confirmação com todas as alterações que o script fará no anfitrião:", + "confirmAlt": "Confirmação Fail2Ban com modo SSH agressivo, proteção Proxmox na porta 8006 e Monitor na porta 8008, deteção nftables, ajuste dos registos journald e proteção SSH MaxAuthTries", + "confirmCaption": "Confirmação da instalação: lista de jails, nível de registo journald ajustado para ler eventos SSH e proteção adicional de SSH (MaxAuthTries=3).", + "confirmIntro": "Após a confirmação, um painel mostra a instalação em direto: apt, configuração das jails e testes. Usa o mesmo mecanismo do instalador CLI ProxMenux.", + "progressAlt": "Painel com registo de instalação Fail2Ban: pacote, journald MaxLevelStore para autenticação, jails, deteção nftables, proteção MaxAuthTries, teste de comunicação fail2ban-client e mensagem final", + "progressCaption": "Instalação em curso: o painel regista cada passo. A mensagem Connection closed no fim indica que a transmissão terminou.", + "afterInstall": "Após a instalação, o cartão mostra o estado em direto: jails configuradas, IP bloqueados e bloqueios recentes. Os separadores distinguem Jails e IP bloqueados de Atividade recente, as últimas N entradas do registo Fail2Ban.", + "activeAlt": "Cartão Fail2Ban ativo com três jails (proxmenux, proxmox, sshd), contadores de IP bloqueados, bloqueios totais e tentativas falhadas e linhas com tentativas, duração do bloqueio, intervalo e engrenagem", + "activeCaption": "Fail2Ban ativo: as três jails predefinidas (proxmenux, proxmox, sshd) com definições de tentativas, duração do bloqueio e intervalo de deteção.", + "tuneBody": "Ajustar as regras da jail. Clique na engrenagem para alterar Max Retries, Ban Time e Find Time, o intervalo móvel em que são contadas as tentativas. Um bloqueio permanente dura até ser removido manualmente. O formulário explica os valores habituais.", + "configAlt": "Formulário da jail sshd com Max Retries, Ban Time em segundos, opção Permanent Ban, Find Time, ajuda sobre valores habituais e botão Guardar configuração", + "configCaption": "Edição da jail sshd: reduza Max Retries se usar SSH apenas a partir da sua sub-rede, ou aumente Ban Time para um painel exposto à Internet.", + "outro": "O guia Instalação, configuração e desinstalação inclui a instalação manual, a alteração de SSH MaxAuthTries e a relação com o registo proxmenux-auth.log. Consulte ProxMenux → Segurança → Fail2Ban.", + "calloutTitle": "Sem Fail2Ban, este mecanismo não bloqueia IPs", + "calloutBody": "O ProxMenux Monitor verifica os IP bloqueados pelo Fail2Ban ao nível da aplicação antes de processar pedidos Flask. Consulta fail2ban-client e guarda o resultado em cache durante 30 segundos; não lê uma tabela SQL de bloqueios. Sem Fail2Ban, as tentativas falhadas são registadas em proxmenux-auth.log, mas este mecanismo não bloqueia IPs." + }, + "lynis": { + "heading": "Auditoria de segurança Lynis", + "subHeading": "(conforme o estado)", + "whatIs": "O que é. O Lynis é uma ferramenta de auditoria de segurança de código aberto que executa cerca de 280 testes no anfitrião: permissões, proteção do kernel, SSH, vulnerabilidades dos pacotes, política criptográfica, tarefas agendadas, identificação de serviços e outros. Produz um índice de segurança de 0 a 100, avisos e sugestões. É uma referência comum para avaliar servidores Debian.", + "whyUseful": "Porque é útil. Avaliar a segurança lendo cada ficheiro de configuração é difícil. O Lynis deteta falhas comuns: proteções do kernel ausentes, cifras SSH fracas, registos não persistentes ou NOPASSWD em sudoers para contas predefinidas. Repetir a análise após os ajustes ProxMenux permite comparar a melhoria através de uma pontuação.", + "notInstalledAlt": "Cartão Lynis não instalado com botão Instalar Lynis e funções: índice de segurança, deteção de vulnerabilidades, conformidade e código GitHub", + "notInstalledCaption": "Cartão Lynis antes de instalar — a caixa azul resume o que a ferramenta faz.", + "notBundled": "O Lynis também não está incluído. O ProxMenux instala-o diretamente a partir do código oficial no GitHub em vez do pacote Debian.", + "confirmAlt": "Diálogo de confirmação Lynis com as funções: índice de segurança, deteção de vulnerabilidades, análise de configuração, verificação de conformidade e código do repositório oficial GitHub", + "confirmCaption": "Confirmação da instalação que indica explicitamente a origem GitHub.", + "progressAlt": "Painel de instalação Lynis em direto, com instalação da versão mais recente, confirmação da versão 3.1.6 e mensagem final", + "progressCaption": "Instalação em curso: o painel mostra o registo em direto, tal como no Fail2Ban.", + "afterInstall": "Após a instalação, o cartão mostra a versão e um histórico de auditorias vazio. Clique em Executar auditoria de segurança para iniciar a primeira análise.", + "installedAlt": "Cartão Lynis após a instalação com versão 3.1.6, data da última análise, índice de segurança 0, avisos 0, sugestões 0, relatório vazio e botão Executar auditoria de segurança", + "installedCaption": "O Lynis está instalado, ainda sem auditorias. Os indicadores mostram inicialmente zeros.", + "runningAlt": "Cartão Lynis durante a auditoria com mensagem de análise em curso, duração estimada de 2 a 5 minutos e botão Auditoria em curso desativado", + "runningCaption": "Auditoria em curso: o botão mostra um indicador de carregamento e o cartão avisa que a análise pode demorar de 2 a 5 minutos.", + "finishedBody": "No fim, o cartão mostra os resultados: índice de segurança, avisos, sugestões e lista de Relatórios de auditoria com as análises anteriores.", + "resultsAlt": "Cartão Lynis com índice 71, detalhe Lynis 66 e PVE 71, 3 avisos, 40 sugestões, pontuação ajustada ao Proxmox de 71 em 100 na faixa Bom, relatórios com transferência PDF e botão Executar auditoria de segurança", + "resultsCaption": "Resultados de exemplo: índice de segurança 71/100 (Bom). O cartão mostra a pontuação original Lynis (66) e a ajustada ao Proxmox (71). O ajuste depende da pontuação original e da proporção das ocorrências consideradas normais no Proxmox VE; não acrescenta 11 pontos fixos.", + "scoreTitle": "Pontuação bruta de Lynis vs pontuação ajustada a Proxmox", + "scoreIntro": "As regras Lynis destinam-se a sistemas Debian de uso geral. O Proxmox diverge de algumas por motivos válidos, como serviços do cluster executados como root ou definições próprias de journald. O cartão mostra ambas as pontuações para:", + "scoreItems": [ + "Acompanhar a pontuação original Lynis, como faria um auditor externo.", + "Acompanhar a pontuação ajustada ao Proxmox, uma referência mais adequada para comparar nós do mesmo cluster." + ], + "reportBody": "Relatório completo. O botão PDF de cada auditoria transfere um relatório de várias páginas: resumo executivo, informações do sistema, estado da segurança, avisos explicados, sugestões ordenadas por impacto e inventário dos pacotes. Pode anexá-lo a uma revisão de segurança.", + "reportAlt": "Primeira página de exemplo do PDF Lynis com resumo executivo, índice 71 de 100, contagens de avisos e sugestões, nome de anfitrião, kernel, versão Lynis, data e resumo da segurança", + "reportCaption": "Primeira página do relatório: resumo executivo, informações do sistema e estado da segurança. Seguem-se avisos detalhados, sugestões e pacotes instalados. É fornecido um PDF de exemplo como referência.", + "runPeriodically": "Execute a auditoria periodicamente (após grandes atualizações do Proxmox, após a aplicação de ajustes pós-instalação, antes de abrir um caminho de acesso remoto) e mantenha os relatórios – a tendência importa mais do que qualquer número.", + "outro": "O guia de instalação, configuração e desinstalação e a análise de um relatório de exemplo estão em ProxMenux → Segurança → Lynis." + }, + "dataCollected": { + "heading": "Como os dados são coletados", + "headerCard": "Cartão", + "headerEndpoint": "Endpoint", + "headerSource": "Origem", + "rows": [ + { + "card": "Autenticação, 2FA, mudança de senha", + "endpoint": "/api/auth/*", + "source": "Configuração local de autenticação em ~/.config/proxmenux-monitor/auth.json; JWT emitidos pelo Monitor." + }, + { + "card": "SSL/HTTPS", + "endpoint": "/api/auth/ssl/*", + "source": "openssl x509 em /etc/pve/local/pve-ssl.pem + /etc/proxmenux/ssl_config.json." + }, + { + "card": "Listar, gerar e revogar tokens de API", + "endpoint": "/api/auth/api-tokens", + "source": "Os dados dos tokens ficam guardados localmente; nada sai do anfitrião." + }, + { + "card": "Gateway seguro (deploy + status)", + "endpoint": "/api/oci/*", + "source": "Cria um contentor LXC Alpine com tailscaled através de pct create / pct exec." + }, + { + "card": "Estado e regras da firewall", + "endpoint": "/api/security/firewall/*", + "source": "pve-firewall + /etc/pve/firewall/<cluster|host>.fw." + }, + { + "card": "Fail2Ban (somente quando instalado)", + "endpoint": "/api/security/fail2ban/*", + "source": "fail2ban-client status, /var/log/fail2ban.log, /etc/fail2ban/jail.local." + }, + { + "card": "Auditoria Lynis (apenas quando instalado)", + "endpoint": "/api/security/lynis/*", + "source": "Executa o lynis audit system em segundo plano; relatório analisado do /var/log/lynis-report.dat." + } + ] + }, + "whereNext": { + "heading": "Para onde seguir", + "items": [ + { + "label": "Acesso e autenticação", + "href": "/docs/monitor/access-auth", + "tail": " — configuração inicial completa, escolha de aplicação 2FA, recuperação após perda do autenticador e exemplos de proxy inverso." + }, + { + "label": "Integrações", + "href": "/docs/monitor/integrations", + "tail": " — exemplos de tokens de API com Homepage, Home Assistant, Prometheus e n8n e configuração completa do Secure Gateway." + }, + { + "label": "Referência da API", + "href": "/docs/monitor/api", + "tailRich": " — todos os endpoints /api/auth, /api/security e /api/oci com método, corpo do pedido e exemplos curl." + }, + { + "label": "ProxMenux → Segurança → Fail2Ban", + "href": "/docs/security/fail2ban", + "tail": " — guia de instalação, jails configuradas e instalação manual." + }, + { + "label": "ProxMenux → Segurança → Lynis", + "href": "/docs/security/lynis", + "tail": " — relatório de exemplo, interpretação da pontuação e quando repetir a auditoria." + } + ] + } +} diff --git a/web/messages/pt/docs/monitor/dashboard/settings.json b/web/messages/pt/docs/monitor/dashboard/settings.json new file mode 100644 index 00000000..79d22117 --- /dev/null +++ b/web/messages/pt/docs/monitor/dashboard/settings.json @@ -0,0 +1,367 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Painel: separador Definições | Documentação ProxMenux", + "description": "O separador Definições gere idioma, ordem de navegação, preferências do painel, limites e exclusões da monitorização, notificações, IA e inventário das otimizações pós-instalação." + }, + "header": { + "title": "Painel: separador Definições", + "description": "Idioma do Monitor, ordem de navegação, preferências do painel, exclusões da monitorização, notificações, configuração de IA e inventário atual das otimizações ProxMenux.", + "section": "ProxMenux Monitor · Painel" + }, + "intro": { + "title": "Onde cada definição é guardada", + "body": "Definições reúne apresentação do painel, monitorização Health Monitor, envio de alertas e alterações já aplicadas pelo ProxMenux ao anfitrião. Os cartões ligam à documentação detalhada; este separador é o ponto de acesso." + }, + "interfaceLanguage": { + "heading": "Idioma da interface", + "intro": "Escolha o idioma da interface web do Monitor. Muda de imediato, sem reiniciar o serviço nem alterar o idioma dos menus de terminal do ProxMenux.", + "items": [ + "O ProxMenux Monitor oferece atualmente inglês, alemão, espanhol, francês, italiano, português, eslovaco e sueco.", + "Na primeira visita usa o idioma do navegador, se suportado; caso contrário, inglês.", + "Alterar a seleção atualiza o idioma da página e sincroniza as outras abas do mesmo perfil do navegador.", + "Se faltar uma tradução, apenas esse texto aparece em inglês em vez de uma chave ou marcador inválido." + ], + "scopeTitle": "Preferência local do navegador", + "scopeBody": "A escolha fica em localStorage sob proxmenux-ui-language. Aplica-se a este perfil do navegador e dispositivo, não ao nó inteiro. Cada administrador pode escolher o seu idioma." + }, + "navigationOrder": { + "heading": "Ordem de navegação", + "intro": "Ordene as sete entradas principais: Visão geral, Apps, VMs e LXCs, Nó, Cópias, Terminal e Administração. Prima Editar, arraste as linhas e guarde.", + "items": [ + "Com o rato, arrastar começa ao premir. Em ecrãs táteis exige uma pressão de 250 ms para distinguir do deslocamento.", + "Os grupos Nó e Administração movem-se em conjunto; as páginas internas mantêm a ordem definida.", + "O menu móvel segue a mesma ordem guardada.", + "Repor predefinições repõe a ordem em edição. Guarde para aplicar a alteração.", + "Os novos separadores principais de versões futuras são acrescentados ao fim da ordem personalizada, preservando a sua organização." + ], + "landingTitle": "A primeira entrada é o separador inicial", + "landingBody": "O Monitor abre a primeira entrada guardada. Com Nó, abre Armazenamento; com Administração, Registos do sistema. A ordem fica neste navegador sob proxmenux-nav-order, permitindo organizações diferentes por dispositivo." + }, + "networkUnits": { + "heading": "Unidades de rede", + "imageAlt": "Cartão Unidades de rede com o seletor de apresentação em Bytes", + "imageCaption": "Escolha entre bits por segundo e bytes por segundo para cada taxa de rede exibida no painel.", + "body": "Mostra a velocidade em bits por segundo (Mbps/Gbps) ou bytes por segundo (MB/s/GB/s). Bits são a predefinição, como nas especificações de placas e fornecedores; as transferências de ficheiros usam frequentemente bytes. Gráficos, etiquetas e ajudas mudam de imediato sem recarregar." + }, + "health": { + "heading": "Monitor de Saúde", + "intro": "O cartão define a duração da supressão: quanto esperar antes de voltar a avisar sobre um alerta descartado. Cada categoria — CPU, memória, armazenamento, discos, rede, VM, serviços PVE, registos, atualizações e segurança — tem a sua lista:", + "items": [ + "24 h — padrão para a maioria das categorias transitórias.", + "72 h — para silenciar estes eventos durante alguns dias.", + "168 h (1 semana) e 720 h (1 mês) — controlos periódicos.", + "8760 h (1 ano) — silêncio durante um longo período.", + "-1 — silêncio permanente até que você o reative manualmente.", + "Horas personalizadas — um número inteiro para um valor intermédio." + ], + "imageAlt": "Definições, cartão Health Monitor com duração por categoria e supressões ativas", + "imageCaption": "As listas definem a duração das supressões futuras. A secção inferior mostra os alertas silenciados e permite reativá-los.", + "editTitle": "Modo de edição", + "editBody": "O cartão começa em leitura. Editar no canto superior direito ativa listas e botões de reativação. Guardar aplica em conjunto as durações e reativações pendentes; Cancelar descarta-as. Guardar só fica ativo quando há alterações.", + "activeTitle": "Supressões Ativas", + "activeIntro": "Sob as durações, Supressões ativas lista alertas silenciados temporariamente —24 h, 7 dias ou outro período— e os permanentes. Cada linha mostra:", + "activeItems": [ + "Um emblema colorido: Permanente em âmbar ou uma contagem, como 24 h restantes / 7 dias restantes, em azul.", + "O identificador do alerta em formato legível (por exemplo, pve_storage_full_PBS-Cloud → Armazenamento PVE cheio: PBS-Cloud).", + "Categoria, gravidade e data e hora em que o alerta foi descartado.", + "Um botão Reativar, disponível ao editar, prepara a remoção da supressão ao guardar." + ], + "activeReenableTitle": "Como reativar um alerta", + "activeReenableBody": "Reativar ao editar marca a linha a verde e risca o identificador, sem aplicar ainda a alteração. Clique de novo para Desfazer. Guardar envia em paralelo POST /api/health/un-acknowledge por reativação e retira as linhas. Se o problema persistir e a categoria permitir novos avisos, o alerta regressa aos ativos na próxima análise.", + "activePermanentNote": "As supressões permanentes —por Permanentemente ou duração predefinida -1— só são revertidas aqui. O diálogo geral não tem esse botão; esta secção reúne o registo e a reativação.", + "activeAutoRefreshTitle": "Atualização automática", + "activeAutoRefreshBody": "A lista atualiza-se ao descartar ou reativar um alerta no Health Monitor, ao regressar ao separador e quando muda a visibilidade. Não precisa de recarregar.", + "calloutTitle": "Detalhes na página Health Monitor", + "calloutBody": "Escalamento, resolução automática quando um dispositivo desaparece e diferença entre descartar e resolver estão em Health Monitor → Descartar alertas e duração da supressão. Este cartão oferece as listas e supressões ativas." + }, + "thresholds": { + "heading": "Limites do Health Monitor", + "intro": "O cartão anterior define o silêncio após dispensar um alerta; este regula o valor que desencadeia um alerta. A maioria das verificações tem valores Aviso e Crítico ajustáveis. A tabela explica exceções como a regra combinada de swap e o detetor atual de RAM.", + "whatForTitle": "Para que serve", + "whatForIntro": "Os valores predefinidos são um ponto de partida, mas cada ambiente tem condições próprias:", + "whatForItems": [ + "Um homelab com um só SSD pode avisar mais cedo, por exemplo a 75/90%, para deixar espaço para snapshots.", + "Os limites de memória devem refletir medições e carga do anfitrião. A redundância Ceph não justifica por si só avisos menos rigorosos; uso elevado de ARC ZFS não equivale a memória de trabalho irrecuperável.", + "Escolha os limites de temperatura conforme as especificações do disco e as condições reais. A refrigeração passiva ou forçada não determina só por si um limite seguro universalmente inferior ou superior.", + "Um anfitrião muito virtualizado pode ter picos de CPU durante compilações sem avisar por cada pico de 80%, mas deve alertar para saturação prolongada." + ], + "whatForOutro": "As alterações suportadas aplicam-se na próxima análise. O Health Monitor lê /usr/local/share/proxmenux/health_thresholds.json em cada ciclo sem reinício. Alguns indicadores, como a temperatura dos discos, usam estes valores; certas barras de capacidade têm limites próprios. A linha RAM descreve uma exceção atual.", + "coloursTitle": "Cores dos estados Aviso e Crítico", + "coloursIntro": "Os widgets que usam Aviso/Crítico seguem os três estados abaixo. Outros indicadores, como as barras de capacidade PVE, têm limites próprios; a cor por si só não indica um alerta Health Monitor.", + "headerColour": "Cor", + "headerRange": "Intervalo", + "headerMeaning": "Significado", + "colourRows": [ + { + "colour": "Verde", + "range": "valor < Aviso", + "meaning": "Intervalo normal. Não é gerado alerta." + }, + { + "colour": "Âmbar", + "range": "Aviso ≤ valor < crítico", + "meaning": "Estado de aviso. O Health Monitor gera um evento WARNING; as notificações respeitam filtros e horas de silêncio." + }, + { + "colour": "Vermelho", + "range": "valor ≥ Crítico", + "meaning": "Estado crítico. O Health Monitor gera um evento CRITICAL que ignora as horas de silêncio. As definições de categoria e evento do canal continuam a aplicar-se; a entrega depende também da sua disponibilidade." + } + ], + "sectionsTitle": "Secções e valores predefinidos recomendados", + "sectionsIntro": "São os valores iniciais ProxMenux até serem alterados. As secções seguem carga de processamento, temperatura e capacidade de armazenamento, da carga atual ao espaço ocupado.", + "headerSection": "Secção", + "headerWarning": "Aviso", + "headerCritical": "Crítico", + "headerGates": "Verificação controlada", + "thresholdRows": [ + { + "section": "Uso da CPU", + "warning": "85 %", + "critical": "95 %", + "gates": "Alerta de carga prolongada quando a média de CPU ultrapassa o limite no período de análise." + }, + { + "section": "Memória", + "warning": "85 %", + "critical": "95 %", + "gates": "Pressão RAM do anfitrião. A definição mostra Crítico a 95%, mas o detetor atual usa uma regra fixa de 90% sustentados; alterar a definição não muda atualmente esse ramo." + }, + { + "section": "Swap (apenas nível crítico)", + "warning": "—", + "critical": "80 %", + "gates": "O CRITICAL de swap exige mais de 80% de swap e menos de 15% de RAM disponível em várias medições. O swap ocupado por si só não ativa a regra." + }, + { + "section": "Temperatura da CPU", + "warning": "80 °C", + "critical": "90 °C", + "gates": "Temperatura do conjunto CPU ou dos núcleos obtida de lm-sensors." + }, + { + "section": "Temperatura do disco — HDD", + "warning": "60 °C", + "critical": "65 °C", + "gates": "Temperatura HDD. Valores iniciais: aviso a 60 °C, crítico a 65 °C. São valores de monitorização, não um limite universal do fabricante; consulte as especificações do modelo." + }, + { + "section": "Temperatura do disco — SSD", + "warning": "70 °C", + "critical": "75 °C", + "gates": "SSD SATA de 2,5 polegadas ou M.2. Esta classe usa 70/75 °C por predefinição; os limites reais dependem do modelo." + }, + { + "section": "Temperatura do disco — NVMe", + "warning": "80 °C", + "critical": "85 °C", + "gates": "Temperatura NVMe. Esta classe usa 80/85 °C por predefinição. A temperatura de limitação do controlador varia por modelo e nem sempre é 85 °C." + }, + { + "section": "Temperatura do disco — SAS", + "warning": "55 °C", + "critical": "65 °C", + "gates": "Temperatura SAS. Esta classe usa aviso a 55 °C e crítico a 65 °C. São valores de monitorização, não prova de falha de refrigeração a 55 °C nem um limite universal." + }, + { + "section": "Espaço em disco — máquina", + "warning": "85 %", + "critical": "95 %", + "gates": "Capacidade de / e de cada ponto de montagem do anfitrião (/var/lib/vz, /mnt/*…)." + }, + { + "section": "Espaço em disco — LXC rootfs", + "warning": "85 %", + "critical": "95 %", + "gates": "Disco raiz por contêiner, avaliado em relação ao tamanho do rootfs do PVE." + }, + { + "section": "Pontos de montagem LXC", + "warning": "85 %", + "critical": "95 %", + "gates": "Capacidade das montagens em CT ativos: mp0, mp1, NFS e bind mounts. Exclui rootfs." + }, + { + "section": "Armazenamento PVE", + "warning": "85 %", + "critical": "95 %", + "gates": "Armazenamentos geridos por PVE: LVM, LVM-thin, ZFS-pool, RBD/Ceph e PBS. Nem todos são backends de blocos." + }, + { + "section": "Conjunto ZFS", + "warning": "85 %", + "critical": "95 %", + "gates": "Pools ZFS do anfitrião, independentemente do registo no PVE." + } + ], + "defaultsTitle": "Valores predefinidos, alterações e reposição", + "defaultsBody": "Cada secção parte dos valores predefinidos; guarda apenas as alterações desejadas. O cartão mostra o valor efetivo: a alteração ou o valor inicial. Repor elimina todas as alterações de todas as secções.", + "validationTitle": "Validação", + "validationBody": "Ao guardar são verificados os intervalos permitidos e rejeitado Crítico abaixo de Aviso. A interface mostra erros e o servidor valida de novo os pedidos API antes de guardar." + }, + "lxcDetection": { + "heading": "Detecção de atualização LXC", + "imageAlt": "Cartão de deteção de atualizações LXC com interruptor para procurar pacotes pendentes em contentores Debian, Ubuntu e Alpine ativos", + "imageCaption": "Interruptor da análise periódica com apt list --upgradable / apk list -u nos CT ativos. Vem ligado. A opção correspondente em Notificações → Serviços aparece com a deteção ativa.", + "intro": "O interruptor entre Limites e Notificações controla a análise LXC. Ativo, consulta os gestores de pacotes dos CT em execução; Hardware mostra os resultados e alimenta lxc_updates_available. Desativado, para as chamadas pct exec e remove entradas LXC de managed_installs.json; /api/managed-installs deixa de mostrar esse estado sem esperar 24 h.", + "whatRunsTitle": "O que a análise executa", + "whatRunsIntro": "Para cada CT no estado running com um gestor de pacotes suportado:", + "whatRunsItems": [ + "Atualidade dos metadados. Se a cache apt/apk ultrapassar 24 horas, tenta apt-get update -qq em Debian/Ubuntu ou apk update em Alpine, com limite de 60 s. Se falhar, a lista usa a cache disponível e pode estar desatualizada.", + "Lista. Executa apt list --upgradable / apk list -u e obtém o número de pacotes e alguns nomes.", + "Evitar duplicados por CT. Uma impressão do total, atualizações de segurança e nomes ordenados evita avisos diários idênticos. Uma alteração relevante gera novo aviso." + ], + "selfUpdateTitle": "CT atualizados fora de apt podem indicar 0", + "selfUpdateBody": "A deteção cobre apenas o gestor de pacotes do CT. Software atualizado fora de apt, como uma tarefa plexupdate configurada ou imagens obtidas com docker pull, fica fora da contagem. Zero atualizações apt não prova que todas as aplicações estejam atuais. Os pacotes do sistema base continuam a ser detetados.", + "refreshTitle": "Porquê renovar os metadados após 24 h", + "refreshBody": "Um CT ativo há muito pode ter metadados apt antigos se ninguém executar apt update. apt list --upgradable pode então omitir atualizações novas. O ProxMenux tenta renovar após 24 horas e ignora o passo com cache mais recente.", + "toggleTitle": "Opção de notificação ligada à deteção", + "toggleBody": "A opção lxc_updates_available por canal em Notificações → Serviços só aparece com a deteção ativa. Desativá-la oculta a linha em todos os canais. A preferência fica na base de dados e recupera o mesmo valor ao reativar.", + "purgeTitle": "O que é removido ao desativar a deteção", + "purgeBody": "Desativar remove de imediato as entradas type=lxc de /usr/local/share/proxmenux/managed_installs.json. Os contadores de atualizações LXC em Hardware desaparecem na próxima atualização. Reativar preenche o registo no próximo ciclo, ou antes por atualização manual da API." + }, + "storageExclusions": { + "heading": "Exclusões de armazenamento remoto", + "imageAlt": "Cartão de exclusões de armazenamento remoto com PBS-Cloud, PBS e PBS2 e opções Estado e Alertas por linha", + "imageCaption": "Opções Estado e Alertas por armazenamento. Com ambas desligadas, deixa de contar no Health Monitor e de enviar notificações. Continua visível em Armazenamento, marcado como excluído.", + "intro": "Pode excluir armazenamentos geridos pelo Proxmox (NFS / CIFS / PBS / Ceph / iSCSI / etc.) com duas opções independentes:", + "items": [ + "Estado — desligar esta opção retira o armazenamento da categoria Armazenamento do Health Monitor. Útil para volumes de arquivo normalmente desligados ou destinos remotos de cópia ligados apenas nos horários previstos.", + "Alertas — desligar impede notificações deste armazenamento pelos canais configurados, mesmo com as verificações de estado ativas. Útil para consultar o estado no painel sem receber notificações." + ], + "outro": "Os armazenamentos excluídos continuam na aba Armazenamento com o emblema roxo excluído, mantendo o inventário visível. O estado fica na tabela SQLite excluded_storages." + }, + "interfaceExclusions": { + "heading": "Exclusões de interface de rede", + "imageAlt": "Cartão de exclusões das interfaces vmbr0, vmbr1, vmbr2, bond0 e eno1 com opções Estado e Alertas por interface", + "imageCaption": "Tal como no armazenamento, cada interface tem Estado e Alertas. Cada linha mostra nome, tipo (bridge / bond / física), IP e velocidade da ligação.", + "intro": "O mesmo princípio aplica-se às interfaces: excluir cada uma das verificações de estado, das notificações ou de ambas. Exemplos habituais:", + "items": [ + "Uma bridge de reserva desativada intencionalmente.", + "Uma placa de rede removida fisicamente que ainda consta em /etc/network/interfaces.", + "Uma subinterface VLAN usada apenas durante a manutenção.", + "Uma bridge de gestão com alterações repetidas e conhecidas do estado da ligação durante a manutenção." + ], + "outro": "O estado fica na tabela SQLite excluded_interfaces. O emblema roxo excluída na aba Rede mantém visíveis as interfaces excluídas." + }, + "notifications": { + "heading": "Notificações e IA", + "body1": "Aqui se ativam as notificações do ProxMenux Monitor e a reformulação com IA. Ativar notificações inicia o envio em segundo plano, regista um destino webhook Proxmox VE para integrar os seus eventos e abre os canais: Telegram, Discord, email, Gotify e outros. A reformulação com IA está numa secção avançada expansível do mesmo painel.", + "body2": "As opções são explicadas em páginas próprias: canais, controlos por evento, mensagens formatadas, nome apresentado, envio com eliminação de duplicados, intervalo, agregação e horas de silêncio, webhook PVE, fornecedores de IA e modos de instruções:", + "items": [ + "Notificações: configuração dos canais (Telegram, Discord, Gotify, email e palavras-passe de aplicação Gmail / Microsoft, ntfy, Slack, Teams e webhook genérico), categorias de eventos, mensagens formatadas, nome apresentado, envio, webhook PVE, histórico e API.", + "Assistente de IA: fornecedores (OpenAI, Anthropic, Gemini, Groq, OpenRouter, Ollama), modelos, instruções predefinidas ou personalizadas, idioma de saída, detalhe por canal e sugestões de IA." + ] + }, + "optimizations": { + "heading": "Otimizações ProxMenux", + "intro": "Inventário das otimizações pós-instalação registadas pelo ProxMenux no anfitrião. As opções de Pós-instalação automatizada e Pós-instalação personalizável registam a aplicação em /usr/local/share/proxmenux/installed_tools.json. O Monitor lê esse registo. Uma entrada não volta a verificar se todas as definições permanecem intactas.", + "imageAlt": "Cartão de otimizações ProxMenux com 14 entradas: ponto colorido, nome e versão. Inclui APT IPv4 Force, Bashrc Customization, Fastfetch, Log2ram SSD Protection, Memory Settings Optimization, Setting persistent network interfaces, System Limits Increase, APT Language Skip, Entropy Generation haveged com Legacy, Kernel Panic Configuration, Logrotate Optimization, Network Optimizations, Subscription Banner Removal e VFIO IOMMU Passthrough.", + "imageCaption": "Cada otimização mostra nome, versão e ponto colorido. No canto superior direito fica o contador laranja 14 ativas. As ferramentas com código-fonte disponível podem ser abertas.", + "dotsTitle": "O que significam os pontos", + "dotsItems": [ + " Ponto verde: otimização registada sem marca Legacy nem atualização indicada. Abra a linha se houver código-fonte disponível.", + " Ponto âmbar e emblema legacy: otimização registada cujo script foi renomeado ou substituído. O código preservado abre em modo Legacy com destaque âmbar. Não volta a verificar a configuração atual do anfitrião." + ], + "clickTitle": "Abrir o código-fonte", + "clickBody": "Clicar mostra a função bash associada e o nome do script (auto_post_install.sh ou customizable_post_install.sh). As ferramentas atuais são extraídas dos ficheiros do anfitrião; as antigas podem usar código preservado. O realce de sintaxe e Copiar ajudam na análise. Não é uma cópia garantida do código executado na instalação.", + "detailAlt": "Janela de código de APT IPv4 Force com a função bash force_apt_ipv4 de customizable_post_install.sh versão 1.0. O código realçado configura /etc/apt/apt.conf.d/99-force-ipv4 com Acquire ForceIPv4 true, regista a ferramenta e mostra uma mensagem traduzida de configuração APT IPv4 concluída.", + "detailCaption": "Código de APT IPv4 Force: função force_apt_ipv4() de customizable_post_install.sh v1.0, com realce de sintaxe e cópia num clique.", + "whyTitle": "Por que isso importa?", + "whyBody": "O ProxMenux pode alterar parâmetros do kernel, repositórios, rede, rotação de registos e passthrough de GPU. Consulte as otimizações registadas antes de alterações manuais, sobretudo se outro administrador preparou o anfitrião. O cartão mostra o registo e o código disponível; não audita todas as definições atuais nem guarda um histórico exato de execução.", + "updatesTitle": "Faixa de atualizações disponíveis", + "updatesBody": "Se a versão em disco de uma otimização superar a registada no anfitrião, aparece uma faixa com o total e Aplicar. Aplicar abre o seletor, tal como Aplicar atualizações disponíveis no menu pós-instalação. Escolha o que atualizar: o ProxMenux volta a executar as funções e atualiza o registo. A faixa desaparece quando tudo está atualizado.", + "updatesAlt": "Cartão de otimizações ProxMenux com faixa de atualizações disponíveis, total pendente e botão Aplicar para selecionar otimizações", + "updatesCaption": "A faixa aparece se pelo menos uma otimização tiver versão mais recente em disco. Consulte Aplicar atualizações disponíveis para o processo completo e a opção Path-A equivalente no menu da shell.", + "revertTitle": "Reverter uma otimização", + "revertBody": "Para reverter uma otimização, use a opção correspondente em Desinstalar otimizações no menu ProxMenux Scripts. A desinstalação remove a entrada de installed_tools.json, que desaparece do cartão na próxima atualização." + }, + "dataCollected": { + "heading": "Como os dados são coletados", + "headerCard": "Cartão", + "headerEndpoint": "Endpoint", + "headerSource": "Origem", + "rows": [ + { + "card": "Idioma da interface", + "endpoint": "localStorage", + "source": "Preferência do navegador proxmenux-ui-language; sem escolha guardada, usa inicialmente o idioma do navegador." + }, + { + "card": "Ordem de navegação", + "endpoint": "localStorage", + "source": "Preferência do navegador proxmenux-nav-order; também determina a aba inicial." + }, + { + "card": "Unidades de rede", + "endpoint": "/api/settings", + "source": "Guardado na tabela SQLite de definições do painel." + }, + { + "card": "Durações do Health Monitor", + "endpoint": "/api/health/settings", + "source": "Duração do silenciamento por categoria na base de dados do Health Monitor." + }, + { + "card": "Exclusões de armazenamento / interface", + "endpoint": "/api/storage/exclusions, /api/network/exclusions", + "source": "Tabelas de SQLite excluded_storages e excluded_interfaces." + }, + { + "card": "Painel Notificações e IA", + "endpoint": "/api/notifications/*", + "source": "Consulte Notificações e Assistente de IA." + }, + { + "card": "Lista de otimizações ProxMenux", + "endpoint": "/api/proxmenux/installed-tools", + "source": "Lê /usr/local/share/proxmenux/installed_tools.json, escrito por chamadas a register_tool nos scripts pós-instalação." + }, + { + "card": "Janela do código de otimização", + "endpoint": "/api/proxmenux/tool-source", + "source": "Extrai a função bash associada de auto_post_install.sh ou customizable_post_install.sh no anfitrião; ferramentas antigas podem usar código preservado." + } + ] + }, + "whereNext": { + "heading": "Para continuar", + "items": [ + { + "label": "Aba Aplicações", + "href": "/docs/monitor/dashboard/apps", + "tail": " — o lançador cuja posição se altera na ordem de navegação." + }, + { + "label": "Notificações", + "href": "/docs/monitor/notifications", + "tail": " — canais, controlos por evento, ajustes por canal, histórico e envios de teste." + }, + { + "label": "Assistente de IA", + "href": "/docs/monitor/ai-assistant", + "tail": " — fornecedores, modelos, modos de instruções, idiomas e detalhe por canal." + }, + { + "label": "Health Monitor → Dispensar alertas e duração do silenciamento", + "href": "/docs/monitor/health-monitor#dismissing-alerts-and-the-suppression-duration", + "tail": " — como funcionam as listas de duração por categoria." + }, + { + "label": "ProxMenux Scripts → Pós-instalação automatizada", + "href": "/docs/post-install/automated", + "tailRich": " e Pós-instalação personalizável — os scripts que registam as otimizações na lista acima." + }, + { + "label": "Desinstalar otimizações", + "href": "/docs/post-install/uninstall", + "tail": " — como reverter uma otimização registada acima." + }, + { + "label": "Índice do painel", + "href": "/docs/monitor/dashboard", + "tail": " — voltar à visão geral das abas." + } + ] + } +} diff --git a/web/messages/pt/docs/monitor/dashboard/storage.json b/web/messages/pt/docs/monitor/dashboard/storage.json new file mode 100644 index 00000000..5dae7a5d --- /dev/null +++ b/web/messages/pt/docs/monitor/dashboard/storage.json @@ -0,0 +1,268 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Painel: separador Armazenamento | Documentação ProxMenux", + "description": "O separador Armazenamento reúne quatro vistas: armazenamentos Proxmox com estado, pools ZFS, discos internos com SMART e unidades USB externas. O detalhe de cada disco mostra atributos SMART, desgaste, vida útil e histórico permanente de observações." + }, + "header": { + "title": "Painel: separador Armazenamento", + "description": "Todo o armazenamento do anfitrião num ecrã: NFS / CIFS / LVM / ZFS / dir Proxmox, estado dos pools ZFS, discos internos SATA/NVMe com SMART e unidades USB externas. Clique num disco para ver os atributos SMART e o histórico de observações.", + "section": "ProxMenux Monitor · Painel" + }, + "intro": { + "title": "Apoiado por três fontes", + "body": "Os armazenamentos Proxmox vêm de pvesm status, ZFS de zpool status, discos de lsblk + smartctl e campos NVMe de nvme. O separador atualiza-se aproximadamente a cada 60 segundos; abrir o detalhe pede uma leitura SMART." + }, + "thresholds": { + "title": "Cor do estado e limiares aplicados aqui", + "intro": "O Health Monitor classifica o estado como verde abaixo de Aviso, âmbar entre Aviso e Crítico e vermelho a partir de Crítico. Seguem-se os valores predefinidos. As barras do painel podem usar outros limites visuais descritos abaixo.", + "items": [ + "Capacidade (discos do anfitrião, armazenamentos PVE, pools ZFS, montagens LXC) — aviso 85%, crítico 95%.", + "Temperatura do disco — HDD 60/65 °C · SSD 70/75 °C · NVMe 80/85 °C · SAS 55/65 °C (alertar / crítico)." + ], + "outro": "Cada valor é configurável por anfitrião. Definições → Limites do Health Monitor apresenta os valores de referência e explica como os ajustar." + }, + "topRow": { + "heading": "Linha superior: resumo do armazenamento", + "intro": "Ao abrir, quatro cartões resumem capacidade total, utilização local, utilização remota e inventário de discos físicos. Dão respostas rápidas; os cartões abaixo contêm os detalhes.", + "imageAlt": "Separador Armazenamento com quatro cartões: capacidade total, utilização local, utilização remota e discos físicos", + "imageCaption": "Linha superior: capacidade total e número de discos, bytes usados localmente e remotamente e discos físicos por tipo com resumo do estado.", + "headerCard": "Cartão", + "headerWhat": "O que mostra", + "totalLabel": "Armazenamento Total", + "totalWhat": "Capacidade bruta total de todos os discos físicos. O rodapé indica quantos discos foram detetados.", + "localLabel": "Usado Localmente", + "localWhat": "Bytes usados no armazenamento local: LVM / LVM-thin / ZFS / dir nos discos do anfitrião. O valor principal mostra os bytes usados e o rodapé X.XX % de Y TB indica também a percentagem de ocupação.", + "remoteLabel": "Utilização remota", + "remoteWhat": "Mesmo formato da utilização local para armazenamentos remotos NFS / CIFS / PBS / Ceph / iSCSI. São contados separadamente porque as falhas locais e remotas têm efeitos distintos e estes recursos são dimensionados e monitorizados de forma diferente.", + "disksLabel": "Discos físicos", + "disksIntro": "Duas linhas de desagregação do inventário:", + "disksItems": [ + "Por tipo — número de NVMe a roxo, SSD e HDD a azul. Aparecem os tipos detetados; um anfitrião apenas NVMe mostra só essa contagem.", + "Por estado — número de discos normais a verde, com aviso a amarelo e críticos a vermelho. Sem problemas aparece apenas «X normais»; os outros estados surgem quando há ocorrências." + ] + }, + "pveStorage": { + "heading": "Cartão de armazenamento Proxmox", + "intro": "Uma linha por armazenamento de /etc/pve/storage.cfg com tipo (nfs / cifs / zfspool / lvm / lvmthin / dir / pbs), nome, estado ativo/erro/não monitorizado, percentagem de uso e barra colorida:", + "items": [ + "Até 75% — barra e valor azuis.", + "Acima de 75% até 90% — barra e valor amarelos. Estes limites visuais são distintos dos limites do Health Monitor.", + "> 90% — barra e valor vermelhos. Este limite visual é distinto do escalamento do Health Monitor.", + "Erro — contorno vermelho da linha se o armazenamento está configurado mas inacessível, por exemplo servidor NFS indisponível ou credenciais CIFS expiradas.", + "Excluído — contorno roxo e etiqueta «não monitorizado». Armazenamentos excluídos pelo utilizador, como volumes de arquivo mantidos desligados." + ], + "calloutTitle": "Excluir um armazenamento da monitorização", + "calloutBody": "O menu de cada armazenamento permite marcá-lo como excluído da monitorização. A definição fica em excluded_storages e é aplicada pelo painel e Health Monitor: sem notificações nem efeito no estado geral." + }, + "zfs": { + "heading": "Cartão ZFS Pools", + "intro": "Aparece apenas com ZFS instalado e pelo menos um pool. Cada linha mostra um pool com estado, tamanho, espaço alocado e livre e ícone de estado:", + "items": [ + "ONLINE — verde. Tudo saudável.", + "DEGRADED — amarelo. O pool fornece dados, mas pelo menos um dispositivo está indisponível; é necessário tratar da substituição.", + "FAULTED / UNAVAIL / SUSPENDED — vermelho. O pool não fornece dados e exige intervenção imediata." + ], + "outro": "O estado ZFS e SMART de cada disco contribui para a categoria Discos e E/S do Health Monitor." + }, + "physical": { + "heading": "Discos físicos e status SMART", + "intro": "Discos internos (SATA / NVMe). Cada linha condensa os campos mais úteis num relance:", + "items": [ + "Caminho do dispositivo — /dev/sda, /dev/nvme0n1.", + "Etiqueta de tipo — SATA / NVMe e respetivo ícone.", + "Etiqueta de sistema — marca laranja dos discos identificados como discos do sistema operativo. A deteção usa as montagens / e /boot e atribui System. A ausência da etiqueta não prova que o disco possa ser apagado ou reutilizado sem risco.", + "Modelo — fabricante e modelo de smartctl -i.", + "Capacidade — expressa em unidades legíveis.", + "Temperatura — valor atual em °C, com cor conforme o tipo de disco; NVMe usa limites mais altos que SATA.", + "Estado SMART — aprovado / falhou / desconhecido.", + "Etiqueta de observações — se o histórico permanente disk_observations contiver entradas do disco, uma etiqueta azul indica o número, como 3 obs.. Clique no disco para as consultar.", + "Etiqueta de estado — Saudável / Aviso / Crítico, conforme SMART e as observações recentes." + ], + "clickHint": "Um clique na linha abre o detalhe do disco descrito abaixo.", + "warningTitle": "Cuidado com os discos identificados como System", + "warningBody": "Os discos com etiqueta laranja System alojam o sistema ativo. A etiqueta ajuda a identificá-los; ProxMenux → Gestor de discos → Formatar / Apagar recusa ações destrutivas sobre eles. Para reutilizar o disco de arranque, use um ambiente de recuperação externo ao Proxmox em execução." + }, + "external": { + "heading": "Armazenamento externo (USB)", + "body": "As unidades USB têm um cartão próprio, visível quando alguma está presente. Mostra os mesmos campos dos discos internos e uma etiqueta laranja USB. Como são frequentemente ligadas apenas para cópias ou transferências ocasionais, as observações são conservadas, mas os erros de E/S de unidades USB desligadas não são escalados." + }, + "drillIn": { + "heading": "Diálogo de detalhe do disco", + "intro": "Clique num disco para abrir quatro separadores: Visão geral · SMART · Histórico · Agendamento. O cabeçalho mostra caminho, modelo, capacidade e, se aplicável, a etiqueta laranja System.", + "overviewTitle": "Separador 1 — Visão geral", + "overviewImageAlt": "Detalhe do disco, separador Visão geral com estado, indicador circular de desgaste e vida útil e atributos SMART principais", + "overviewImageCaption": "Visão geral: identificação, estado, vida restante com desgaste atual e dados escritos e atributos SMART principais.", + "overviewIntro": "Separador inicial para consultar o estado do disco sem executar um teste. Três blocos:", + "overviewItems": [ + "Identificação — modelo, número de série, capacidade e estado Saudável / Aviso / Crítico.", + "Desgaste e vida útil — anel da vida restante (97%, 50%, …) com atributo de origem (Media Wearout Indicator, Percentage Used, …), barra da percentagem consumida, projeção Vida estimada em anos e total de dados escritos. NVMe mostra também Available Spare.", + "Atributos SMART: os valores principais são apresentados em duas colunas: temperatura, horas de funcionamento com uma duração legível como 3 anos e 116 dias, velocidade de rotação ou SSD, ciclos de ligação, estado SMART, setores realocados, setores pendentes e erros CRC. A tabela completa dos atributos encontra-se no separador SMART." + ], + "smartTitle": "Separador 2 — SMART", + "smartImageAlt": "Detalhe do disco, separador SMART com testes curto e alargado, último resultado e tabela completa de atributos", + "smartImageCaption": "Separador SMART: execute testes curtos ou alargados, consulte o último resultado e todos os atributos e abra o relatório completo para imprimir ou guardar como PDF.", + "smartIntro": "Ações disponíveis em três secções:", + "smartItems": [ + "Executar teste SMART — dois botões. Teste curto (~2 min) espera pelo resultado e mostra-o no diálogo. Teste alargado (segundo plano) pode demorar horas em discos grandes, continua no servidor e avisa ao terminar.", + "Último teste — tipo, estado (aprovado / falhou) e data e hora da última execução.", + "Atributos SMART — tabela completa com ID, nome, valor, pior valor e estado normal, aviso ou crítico. SATA/SAS mostra a lista numerada. NVMe usa nvme smart-log: temperatura, reserva disponível, percentagem usada, unidades lidas/escritas, leituras/escritas do anfitrião, tempo de ocupação do controlador, ciclos de ligação, encerramentos inseguros, erros do suporte, entradas do registo de erros e tempo de temperatura composta em aviso/crítico." + ], + "pdfTitle": "Ver relatório SMART completo (PDF)", + "pdfIntro": "No fim de SMART, Ver relatório SMART completo abre um relatório imprimível. Use o diálogo de impressão do navegador para o guardar como PDF, arquivar ou partilhar com o suporte num RMA.", + "pdfPreviewAlt": "Primeira página do relatório SMART com resumo executivo, indicador PASSED e informações do disco", + "pdfPreviewCaption": "Primeira página: resumo, indicador PASSED e informações completas do disco. O PDF de exemplo inclui desgaste SSD, todos os atributos SMART e histórico de testes.", + "pdfDownloadLabel": "Transferir relatório SMART de exemplo (PDF)", + "pdfSectionsIntro": "O relatório tem seis secções principais:", + "pdfSections": [ + "Resumo executivo — estado PASSED/FAILED, avaliação clara do disco — saudável, com desgaste ou a falhar — e quatro dados: data do relatório, último tipo de teste, resultado e atributos verificados.", + "Informações do disco — modelo, série, capacidade, tipo HDD/SSD/NVMe, família, formato, interface (SATA 3.3 · 6.0 Gb/s, …), TRIM, temperatura e limite ideal, horas e ciclos de funcionamento, SMART, setores pendentes/realocados e erros CRC.", + "Desgaste e vida útil SSD (apenas SSD/NVMe) — vida restante, atributo de origem, desgaste atual, dados escritos e horas de funcionamento.", + "Atributos SMART completos — ID, nome, valor, pior valor, limite, valor bruto e estado de cada atributo. Os principais — Reallocated Sector Ct, Power On Hours, Reported Uncorrect, UDMA CRC Error Count, Media Wearout Indicator, … — têm uma breve explicação sob a linha.", + "Último autoteste e histórico completo — último teste com tipo, resultado, mensagem final e horas de funcionamento nessa altura, mais tabela numerada de todos os testes guardados.", + "Recomendações — ações conforme o resultado. Para discos saudáveis: disco saudável / testes periódicos / estratégia de cópias. Se os atributos saírem dos limites, surgem orientações de substituição." + ], + "pdfOutro": "O navegador cria o relatório imprimível; Imprimir e Guardar como PDF abrem o diálogo de impressão. Escolha um nome como SMART-<short-id>.pdf. Conserve cópias datadas para comparar alterações ou partilhar com o suporte.", + "historyTitle": "Separador 3 — Histórico", + "historyImageAlt": "Detalhe do disco, separador Histórico com testes SMART anteriores e ações de transferência e eliminação", + "historyImageCaption": "Histórico SMART do disco. Cada linha mostra tipo, data e hora, antiguidade, marca do último teste e ações de transferência da saída smartctl e eliminação.", + "historyIntro": "Testes curtos e alargados concluídos e guardados para o disco. Cada entrada contém a saída original smartctl e os campos interpretados pelo Monitor para o painel. Ações por linha:", + "historyItems": [ + "Transferir — guarda a cópia JSON com os dados smartctl -a usados pelo relatório. Útil se o suporte pedir os campos de diagnóstico originais.", + "Eliminar — remove manualmente um teste do histórico. A retenção em Agendamento (últimos 5 / 10 / 20) elimina automaticamente os mais antigos." + ], + "scheduleTitle": "Separador 4 — Agendamento", + "scheduleImageAlt": "Detalhe do disco, separador Agendamento com interruptor de testes SMART automáticos, lista de horários e botão Adicionar agendamento", + "scheduleImageCaption": "Agendamento: escolha tipo, frequência e retenção; o Monitor configura cron para executar os testes automaticamente.", + "scheduleIntro": "Testes SMART automáticos através de cron, sem terminal. Três áreas:", + "scheduleItems": [ + "Testes SMART automáticos — interruptor geral de todos os horários do disco. Permite suspendê-los durante a manutenção sem apagar a configuração.", + "Agendamentos configurados — uma linha por horário com tipo (curto / longo), expressão cron legível («Dia 1 do mês às 03:00», «Todos os domingos às 02:00»), discos abrangidos e retenção.", + "Adicionar / Editar agendamento — tipo (curto ~2 min / longo 1–4 h), frequência (diária / semanal / mensal), dia do mês ou semana, hora e resultados guardados (últimos 5 / 10 / 20)." + ], + "scheduleOutro": "O horário cria uma entrada cron no anfitrião que chama o Monitor. Os resultados ficam no histórico SMART do separador 3 e a retenção elimina automaticamente os mais antigos quando termina um novo teste.", + "tempTitle": "Diálogo do histórico de temperatura", + "tempIntro": "O Monitor recolhe periodicamente as leituras dos discos com sensor de temperatura e guarda-as num histórico local. O valor atual aparece na Visão geral; um clique abre o histórico de temperatura.", + "tempImageAlt": "Histórico de temperatura com caminho e modelo, períodos de 1 hora, 24 horas, 7 ou 30 dias, indicadores Atual/Mínimo/Média/Máximo e gráfico de linhas colorido conforme os limites do tipo de disco", + "tempImageCaption": "O detalhe de temperatura abre-se na Visão geral se o sensor devolver um valor diferente de zero. O gráfico usa limites HDD / SSD / NVMe / SAS.", + "tempShowsTitle": "Conteúdo do diálogo", + "tempShowsItems": [ + "Seletor de período: 1 hora, 24 horas por predefinição, 7 dias ou 30 dias. Cada pedido adapta a resolução para manter o gráfico legível.", + "Quatro indicadores: Atual, Mínimo, Média e Máximo no período. Atual usa os limites do armazenamento e notificações para distinguir temperatura normal, elevada ou muito alta.", + "Gráfico de linhas da temperatura no tempo, com linha e área coloridas conforme o tipo de disco:" + ], + "tempDiskTypes": [ + "HDD — limiares normalmente mais frios.", + "SSD — limiares moderados.", + "NVMe — limiares mais elevados (NVMe corre mais quente por projeto).", + "SAS — aviso a 55 °C e crítico a 65 °C, com limite de aviso diferente do HDD." + ], + "tempConfigurable": "Os quatro tipos são configurados em Definições → Limites do Health Monitor.", + "tempWhyTitle": "Porque o histórico é útil", + "tempWhyItems": [ + "Detetar tendências. Uma leitura isolada não revela que um disco aquece há semanas, por exemplo por falhas de ventilação, pó ou calor próximo. As vistas de 7 e 30 dias mostram a evolução.", + "Relacionar picos. Se uma cópia ou reconstrução ultrapassou brevemente o limite, as vistas de 1 e 24 horas mostram se o pico foi isolado ou recorrente.", + "Ajustar limites. Antes de os alterar em Definições → Limites do Health Monitor, consulte o gráfico de 30 dias para conhecer o intervalo real de funcionamento do disco." + ], + "obsTitle": "Histórico de observações nos separadores", + "obsIntro": "As falhas podem desenvolver-se gradualmente. Um disco pode indicar SMART PASSED e registar erros de leitura em dmesg, perder ligações SATA ou mostrar setores pendentes intermitentes. O ProxMenux conserva estes sinais e mostra-os no diálogo junto do estado SMART atual.", + "obsImageAlt": "Visão geral de um disco com SMART aprovado e zero setores realocados/pendentes e erros CRC, mas uma observação de erro E/S com mensagem original do kernel, explicação ATA, primeira e última data e contagem", + "obsImageCaption": "Um disco que passa no SMART pode ter observações anteriores. O cartão acrescenta o histórico dos sinais ao estado atual.", + "obsWhatTitle": "O que é uma observação", + "obsWhatIntro": "O ProxMenux regista como observação os eventos de disco do registo do kernel, dmesg ou SMART demasiado específicos para uma notificação isolada. Cada linha mostra:", + "obsWhatItems": [ + "Tipo — erro E/S, SMART, sistema de ficheiros, pool ZFS ou ligação.", + "Mensagem original do kernel de dmesg, para copiar para um motor de pesquisa ou pedido de suporte.", + "Breve explicação dos códigos ATA conhecidos: IDNF, endereço de setor não encontrado, possível setor ou cabo defeituoso; UNC, erro de leitura irrecuperável, setor defeituoso; e outros códigos padrão.", + "Primeira e última data e número de ocorrências, agrupadas por assinatura do erro." + ], + "obsWhyTitle": "Porque o ProxMenux as regista e mostra", + "obsWhyItems": [ + "As falhas podem evoluir. Erros do barramento ATA, setores UNC ou erros do suporte podem aparecer antes de SMART FAILED. O buffer dmesg não os conserva após reiniciar; o histórico de observações conserva.", + "SMART não exclui todas as falhas. Um disco pode ter atributos verdes e apresentar problemas. As observações conservam outros sintomas, como ICRC, IDNF, reinicializações de ligações SATA ou redução de velocidade.", + "Distingue o atual do recente. O Health Monitor resolve automaticamente erros transitórios que deixam de ocorrer. O histórico permite ver dias depois, por exemplo, três erros E/S de uma noite.", + "Alimenta as notificações por níveis. disk_io usa a frequência das observações para escolher silêncio, WARNING ou CRITICAL numa janela móvel de 24 horas introduzida em 1.2.1.2." + ], + "obsDedupTitle": "Agrupamento de duplicados e novos avisos", + "obsDedupBody1": "As observações são agrupadas por assinatura, uma impressão estável do tipo de erro, dispositivo e campos-chave da mensagem. As repetições aumentam occurrence_count na linha existente. Uma assinatura diferente cria outra observação e conta como novo evento para as notificações.", + "obsDedupBody2": "Para evitar avisos em cascata, a primeira combinação de disco, assinatura e gravidade notifica o operador. A mesma combinação espera 24 horas antes de novo aviso, mesmo que a contagem aumente. A passagem de WARNING para CRITICAL interrompe a espera e avisa do agravamento.", + "obsDismissTitle": "Histórico permanente e erros ativos", + "obsDismissBody1": "As observações não podem ser descartadas, ocultadas ou apagadas. Cada assinatura tem um cartão; uma repetição aumenta a contagem e atualiza a última data. O histórico segue o número de série: outro disco começa vazio mesmo na mesma porta e uma mudança de nome pelo kernel conserva o histórico.", + "obsDismissBody2": "Resolver ou descartar um erro ativo no Health Monitor não altera as observações. Permanecem após a resolução automática, para que um aviso transitório da semana passada continue visível. Consulte Health Monitor para gerir os erros ativos." + }, + "dataCollected": { + "heading": "Como os dados são coletados", + "headerSection": "Secção da página", + "headerEndpoint": "Endpoint", + "headerSource": "Origem", + "rows": [ + { + "section": "Cartões de resumo superiores", + "endpoint": "/api/storage/summary", + "source": "Agregado de lsblk, zpool list, vgs / lvs." + }, + { + "section": "Inventário por disco", + "endpoint": "/api/storage", + "source": "lsblk -O + smartctl -i por dispositivo, com cache de identidade limpa nos eventos hotplug." + }, + { + "section": "Armazenamentos Proxmox", + "endpoint": "/api/proxmox-storage", + "source": "pvesh get /nodes/<node>/storage com o estado ativo/online de cada um." + }, + { + "section": "Valores SMART atuais", + "endpoint": "/api/storage/smart/", + "source": "smartctl -A <dev> é uma consulta disponível; o endpoint de detalhe usa também JSON SMART completo e dados específicos NVMe." + }, + { + "section": "Histórico de autotestes SMART", + "endpoint": "/api/storage/smart//history", + "source": "Guardado em /usr/local/share/proxmenux/smart/<disk>/ como cópias JSON." + }, + { + "section": "Observações permanentes", + "endpoint": "/api/storage/observations", + "source": "Tabela SQLite atualizada pelo Health Monitor a cada ciclo e conservada após resolver os erros ativos." + } + ], + "outro": "Verificando a cadeia de coleta na máquina:", + "codeComment1": "# Obter o estado atual a partir de um script", + "codeComment2": "# Comparar os dados do painel com os do sistema operativo" + }, + "whereNext": { + "heading": "Para onde seguir", + "items": [ + { + "label": "Monitor de Saúde", + "href": "/docs/monitor/health-monitor", + "tail": " — categoria Discos e E/S e regras de supressão." + }, + { + "label": "Referência da API", + "href": "/docs/monitor/api", + "tail": " — endpoints de armazenamento e SMART." + }, + { + "label": "Notificações", + "href": "/docs/monitor/notifications", + "tailRich": " — ações posteriores desencadeadas por disk_io_error, storage_unavailable e smart_test_failed." + }, + { + "label": "Índice do painel", + "href": "/docs/monitor/dashboard", + "tail": " — as outras páginas." + }, + { + "label": "ProxMenux → Gestor de discos", + "href": "/docs/disk-manager", + "tail": " — ações TUI: formatar, apagar, executar testes SMART e importar discos para VM ou contentores." + }, + { + "label": "ProxMenux → Estado e testes SMART do disco", + "href": "/docs/disk-manager/smart-disk-test", + "tail": " — equivalente CLI: agendar testes SMART, exportar o JSON apresentado e consultar os tipos de teste e a sua interpretação." + } + ] + } +} diff --git a/web/messages/pt/docs/monitor/dashboard/system-logs.json b/web/messages/pt/docs/monitor/dashboard/system-logs.json new file mode 100644 index 00000000..e852138e --- /dev/null +++ b/web/messages/pt/docs/monitor/dashboard/system-logs.json @@ -0,0 +1,120 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Painel: Registos do sistema | Documentação ProxMenux", + "description": "A guia System Logs consolida três fontes em uma tela: ao vivo journalctl com filtros e download, histórico de tarefas Proxmox (UPIDs) e registro de notificações — todos pesquisáveis, filtrados por intervalo de gravidade/tempo, e baixados como pacotes de texto." + }, + "header": { + "title": "Painel: Registos do sistema", + "description": "Três subseparadores no mesmo ecrã: journal do sistema (journalctl com filtros), histórico de tarefas do Proxmox e registo de notificações. Todos permitem pesquisar, filtrar e transferir os dados como pacotes de texto.", + "section": "ProxMenux Monitor · Painel" + }, + "readOnly": { + "title": "Apenas leitura por design", + "body": "Este separador não altera ficheiros de registo. Os filtros ficam no URL ou no estado da interface; as transferências são preparadas no servidor. O painel nunca apaga entradas. Para a manutenção dos registos, utilize journalctl --vacuum-time=<N> ou logrotate no host." + }, + "topRow": { + "heading": "Linha superior: quatro contadores", + "items": [ + "Total de entradas — número de registos no intervalo do filtro ativo.", + "Erros — número de entradas com gravidade ≤ 3 (err / crit / alert / emerg).", + "Avisos — número de entradas com gravidade 4 (warning).", + "Cópias de segurança — número de entradas de tarefas vzdump / PBS no mesmo intervalo." + ] + }, + "subtabs": { + "heading": "Três subseparadores", + "logsTitle": "Registros", + "logsIntro": "O journal do sistema, obtido no servidor com journalctl. Filtros disponíveis na barra de ferramentas:", + "logsFilters": [ + "Gravidade — emerg / alert / crit / err / warning / notice / info / debug, ou qualquer combinação.", + "Tempo de alcance — último 5 min / 15 min / 1 h / 6 h / 24 h / 7 d / custom.", + "Pesquisa livre — subcadeia ou expressão regular (journalctl --grep).", + "Filtro por unidade — restringe a uma unidade systemd específica (pveproxy.service, nginx.service, …)." + ], + "logsRowsAfter": "Cada linha mostra a hora, o crachá de gravidade, a unidade de origem e a mensagem. Mensagens longas colapsam com uma opção \"mostrar mais\". A ação Download agrupa o filtro atual em um único arquivo .txt via GET /api/logs/download — útil quando você deseja compartilhar uma fatia de diário com alguém.", + "logDetailsModalTitle": "Janela Detalhes do registo", + "logDetailsBody": "Clicar numa linha abre Detalhes do registo com todos os campos estruturados que journald capturou para essa entrada, como ao executar journalctl --output=verbose no host.", + "logDetailsImageAlt": "Janela Detalhes do registo — uma entrada do journal expandida com nível, serviço, data e hora, origem, unidade systemd, ID do processo, nome do host e mensagem completa", + "logDetailsImageCaption": "Detalhes do registo — todos os campos estruturados de journald para a entrada, com a mensagem completa sem cortes no final. Útil para registos de cron e serviços quando a linha de comando executada é relevante.", + "fieldsIntro": "Campos mostrados:", + "fields": [ + "Level — emblema de gravidade colorido (INFO / AVISO / ERRO / CRÍTICO).", + "Service — nome curto da unidade / processo que emitiu a entrada.", + "Timestamp — data e hora completas da linha de registo.", + "Source — origem da entrada (jornal, kernel, auditoria, ...).", + "Systemd Unit — a unidade .service / .timer / .socket real se a entrada foi associada a uma.", + "Process ID — PID do processo de emissão.", + "Hostname — útil quando os periódicos são encaminhados através de nós de cluster.", + "Mensagem — mensagem completa sem cortes, num bloco monoespaçado pronto a copiar." + ], + "maxLevelStoreTitle": "Journald MaxLevelStore", + "maxLevelStoreBody": "Numa instalação nova do Proxmox, journald utiliza por predefinição MaxLevelStore=warning, que descarta mensagens info. O Monitor deteta isto no arranque e acrescenta um ficheiro de configuração complementar (/etc/systemd/journald.conf.d/proxmenux-loglevel.conf) com o limiar info, para guardar mensagens informativas e mais graves. Isto não inclui debug.", + "backupsTitle": "Cópias de segurança", + "backupsBody": "Histórico de tarefas do Proxmox limitado às cópias de segurança. Uma linha por tarefa (vzdump, transferências PBS, recolha de dados não utilizados e verificação), com estado (OK / WARNINGS / ERROR), sistema convidado envolvido, armazenamento de origem, duração e UPID. Clique numa linha para carregar o registo completo através de GET /api/task-log/<upid>: os mesmos dados de Datacenter → Tasks, limitados às cópias de segurança.", + "notificationsTitle": "Notificações", + "notificationsBody1": "Todas as notificações enviadas pelo Monitor: Telegram, Discord, e-mail, Gotify, ntfy, Slack, Teams e webhook. Cada linha mostra data e hora, canal, tipo de evento, gravidade, título e corpo gerados e, se a IA estiver ativa, um controlo para comparar a sua reformulação com o original.", + "notificationsBody2": "Utilize este separador para verificar se um canal entrega notificações e comparar a reformulação da IA com o modelo de base. Os canais configuram-se na página detalhada Notificações." + }, + "dataCollected": { + "heading": "Como os dados são coletados", + "headerSubtab": "Subseparador", + "headerEndpoint": "Endpoint", + "headerSource": "Origem", + "rows": [ + { + "subtab": "Registos (filtro em direto)", + "endpoint": "/api/logs", + "source": "journalctl --output json --since <range> com filtros de gravidade, unidade e pesquisa aplicados no servidor." + }, + { + "subtab": "Transferir", + "endpoint": "/api/logs/download", + "source": "A mesma consulta, devolvida como texto simples para grep / less." + }, + { + "subtab": "Cópias de segurança", + "endpoint": "/api/backups", + "source": "Histórico de tarefas PVE filtrado por vzdump, transferências PBS, recolha de dados não utilizados e verificação." + }, + { + "subtab": "Detalhes de uma tarefa de cópia de segurança", + "endpoint": "/api/task-log/<upid>", + "source": "Registo completo da tarefa em texto simples, lido de /var/log/pve/tasks/<index>/<upid>." + }, + { + "subtab": "Histórico de notificações", + "endpoint": "/api/notifications/history", + "source": "Tabela SQLite notification_history alimentada pelo ciclo de envio." + } + ], + "apiIntro": "O filtro em direto e as transferências também estão acessíveis através da API:", + "codeComment1": "# Erros e eventos mais graves da última hora com uma palavra-chave", + "codeComment2": "# Transfira o journal completo das últimas 6 horas como texto simples", + "codeComment3": "# Procure o resultado completo de uma tarefa específica por UPID" + }, + "whereNext": { + "heading": "Para onde seguir", + "items": [ + { + "label": "Monitor de Saúde", + "href": "/docs/monitor/health-monitor", + "tail": " — a categoria Registos do sistema, que deteta padrões persistentes, picos e cascatas." + }, + { + "label": "Notificações", + "href": "/docs/monitor/notifications", + "tail": " — a monitorização do journal lê a mesma origem e transforma correspondências em notificações." + }, + { + "label": "Referência da API", + "href": "/docs/monitor/api", + "tail": " — os endpoints logs e task-log com os respetivos parâmetros de consulta." + }, + { + "label": "Índice do painel", + "href": "/docs/monitor/dashboard", + "tail": " — os outros separadores." + } + ] + } +} diff --git a/web/messages/pt/docs/monitor/dashboard/system-overview.json b/web/messages/pt/docs/monitor/dashboard/system-overview.json new file mode 100644 index 00000000..41cc966f --- /dev/null +++ b/web/messages/pt/docs/monitor/dashboard/system-overview.json @@ -0,0 +1,177 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Painel: Visão geral do sistema | Documentação ProxMenux", + "description": "O separador inicial predefinido do ProxMenux Monitor: quatro cartões (CPU, memória, VM e LXC ativos, temperatura) com atualização em direto e minigráfico de tendência, gráfico histórico e resumos de armazenamento e rede ligados aos respetivos separadores." + }, + "header": { + "title": "Painel: Página Visão geral do sistema", + "description": "O separador aberto por predefinição: quatro cartões de métricas em direto no topo, gráfico histórico no centro e resumos de armazenamento e rede em baixo, com as mesmas API dos separadores dedicados.", + "section": "ProxMenux Monitor · Painel" + }, + "readOnly": { + "title": "Um instantâneo somente de leitura", + "body": "Todos os painéis deste separador são informativos. As ações ficam nos separadores ligados: Armazenamento para gerir discos, VMs e LXCs para iniciar ou parar sistemas convidados e Segurança para configurar a autenticação." + }, + "captureAlt": "Página Visão geral do sistema — quatro placas métricas (CPU, memória, VMs ativos, temperatura), gráfico de métricas de nós e placas de resumo de armazenamento / rede", + "captureCaption": "Visão geral do sistema, o separador inicial predefinido. Os quatro cartões atualizam em direto, o gráfico mostra o histórico e os dois cartões inferiores resumem armazenamento e rede.", + "topRow": { + "heading": "Linha superior: cartões de métricas em direto", + "intro": "Quatro cartões em grelha 2×2 no telemóvel e numa linha no computador. Cada um atualiza a partir de /api/system a cada poucos segundos.", + "headerCard": "Cartão", + "headerWhat": "O que mostra", + "headerSource": "Origem", + "rows": [ + { + "card": "Uso da CPU", + "what": "Percentagem atual com barra de progresso. Atualiza a cada ~1 s através do amostrador de sinais vitais.", + "source": "psutil.cpu_percent()" + }, + { + "card": "Uso de memória", + "what": "GB utilizados, percentagem e GB totais. A barra representa a percentagem.", + "source": "psutil.virtual_memory()" + }, + { + "card": "VM ativa e LXC", + "what": "Número de sistemas convidados em execução, com distribuição Em execução / Parados e totais de VM e LXC no rodapé.", + "source": "/api/vms (consolidado)" + }, + { + "card": "Temperatura", + "what": "Temperatura CPU em °C com estado (baixa / moderada / alta) e minigráfico dos últimos 5 minutos no fundo. Mostra N/A sem sensor. Clique para abrir os detalhes.", + "source": "sensors / coretemp" + } + ], + "thresholdsTitle": "Cor do estado e limiares aplicados aqui", + "thresholdsIntro": "Anéis, barras e minigráficos usam a mesma escala: verde abaixo de Aviso, âmbar entre Aviso e Crítico, vermelho a partir de Crítico. Valores recomendados incluídos no ProxMenux:", + "thresholdsItems": [ + "Utilização CPU — aviso 85 %, crítico 95 %.", + "Memória — aviso 85 %, crítico 95 %. O swap também ativa Crítico a 5 % de utilização; um host Proxmox saudável deverá utilizá-lo raramente.", + "Temperatura CPU — aviso 80 °C, crítico 90 °C." + ], + "thresholdsOutro": "Os valores são configuráveis por host. Definições → Limiares do monitor de saúde centraliza os ajustes e explica como os adaptar.", + "sparklineTitle": "O minigráfico mostra a tendência", + "sparklineBody": "A placa de temperatura desenha um traço de 5 minutos abaixo do valor, com a cor da linha e gradiente seguindo o mesmo par Aviso/Crítica documentado acima. É a maneira mais rápida de ver se o hospedeiro está em uma subida térmica sem abrir o modal detalhe." + }, + "processes": { + "heading": "Principais processos por CPU / Memória", + "intro": "Os cartões Utilização CPU e Memória abrem uma lista ordenável dos 25 processos principais: por utilização CPU no primeiro caso e por memória residente no segundo.", + "listTitle": "A janela da lista", + "listItems": [ + "Atualização automática — a lista atualiza a cada 5 segundos enquanto a janela está aberta e deixa de consultar ao fechar.", + "Filtro — a pesquisa limita a lista por comando, utilizador ou PID.", + "Barra inline — a coluna métrica primária desenha uma barra pequena escalonada para o valor mais alto da lista filtrada, então a classificação permanece visível mesmo quando nenhum processo está perto de 100 %.", + "Disposição móvel — abaixo de 640 px, PID e Utilizador ficam ocultos, para Comando, CPU % e Memória caberem sem deslocamento horizontal." + ], + "captureListAlt": "Janela de processos por memória — tabela ordenada por RSS com PID, utilizador, comando, CPU % e memória", + "captureListCaption": "O cartão de memória abre a lista ordenada pelo RSS (acento indigo). O cartão CPU abre a mesma lista ordenada pelo uso de CPU (acento azul).", + "detailTitle": "Detalhes de cada processo", + "detailIntro": "Clique numa linha para abrir uma segunda janela com os dados em direto do processo, organizados em quatro secções:", + "detailItems": [ + "Visão geral — estado, processo pai, número de threads, descritores de ficheiros abertos, utilizador e grupo.", + "Recursos — CPU %, memória %, memória residente (RSS), tamanho virtual, swap e totais de E/S de leitura e escrita.", + "Comando — nome curto, linha de comando completa, caminho do executável e diretório de trabalho.", + "Duração — data e hora de início e tempo de execução decorrido." + ], + "detailRefresh": "Os detalhes atualizam a cada 3 segundos. Quando o processo termina, as consultas param e aparece o aviso âmbar Este processo terminou. O último estado capturado mantém-se visível, atenuado, para consultar o que acontecia antes do fim.", + "captureDetailAlt": "Detalhes do processo — Visão geral, Recursos, Comando e Duração para um PID", + "captureDetailCaption": "A janela de detalhes por processo foi aberta a partir de uma linha da lista. A cor do acento corresponde ao cartão que o abriu (azul para CPU, indigo para Memória)." + }, + "middle": { + "heading": "Centro: gráficos de métricas do nó", + "body1": "Sob os cartões, NodeMetricsCharts apresenta históricos de CPU, memória e E/S de disco do armazenamento RRD do Proxmox através de /api/node/metrics. O seletor oferece 1 hora / 24 horas / 7 dias / 30 dias / 1 ano. A resolução diminui em períodos maiores para manter o gráfico fluido.", + "body2": "Os mesmos gráficos da interface web do Proxmox para um nó, integrados no tema escuro do Monitor e alinhados com os outros painéis." + }, + "bottom": { + "heading": "Linha inferior: Resumos de armazenamento e rede", + "storageTitle": "Cartão de visão geral do armazenamento", + "storageIntro": "Vista compacta do estado do armazenamento do host, dividida em três blocos:", + "storageItems": [ + "Capacidade total do nó — soma dos armazenamentos VM/LXC e do armazenamento local do sistema, com barra em gradiente do espaço utilizado e livre.", + "Capacidade total / Discos físicos — capacidade bruta e número de discos físicos detetados.", + "Armazenamento VM/LXC — espaço utilizado, livre e percentagem dos armazenamentos dos sistemas convidados, com contagem quando há mais de um.", + "Armazenamento local (sistema) — ponto de montagem raiz ou de sistema do host, separado do pool dos sistemas convidados." + ], + "storageDrillIn": "Os detalhes estão no separador Armazenamento: SMART por disco, pools ZFS, histórico de observações, etc.", + "networkTitle": "Cartão Visão Geral da Rede", + "networkBody1": "A linha superior mostra a contagem de interfaces ativas (física + pontes combinadas). Abaixo disso, duas fileiras de crachás coloridos para as interfaces que são up — NICs físicos em azul, pontes em uma cor secundária. Um seletor de tempo no topo direito (1 hora / 24 horas / 7 dias / 30 dias / 1 ano) controla um pequeno gráfico de tráfego RX / TX.", + "networkBody2": "Os detalhes por interface (IP/MAC, gráfico RRD, membros da bridge, modo bond, etc.) estão no separador Rede." + }, + "refresh": { + "heading": "Modelo de atualização", + "intro": "Cada painel gere o seu estado de carregamento (loadingStates.cpu, loadingStates.storage, …), para que uma origem lenta não bloqueie as outras. Enquanto carrega mostra um marcador pulsante. As falhas são tratadas sem bloquear a vista: sem sensor de temperatura, o cartão mostra N/A em vez de um erro.", + "items": [ + "Cartões superiores — atualização a cada ~5 s. CPU e temperatura também recebem dados a cada segundo do amostrador de sinais vitais.", + "Gráfico de métricas do nó — carrega ao abrir e ao mudar o período ou idioma. Se necessário, volta a tentar após 60 s.", + "Cartão de armazenamento — atualização a cada ~60 s. Os dados SMART ficam em cache mais tempo; o separador Armazenamento pede uma nova leitura quando necessário.", + "Cartão de rede — resumo a cada 59 s e gráfico de tráfego a cada 60 s no período ativo.", + "Atualização manual — o botão Atualizar no cabeçalho volta a carregar todos os painéis imediatamente." + ] + }, + "dataCollected": { + "heading": "Como os dados são coletados", + "headerCard": "Cartão", + "headerEndpoint": "Endpoint", + "headerSource": "Origem", + "rows": [ + { + "card": "Indicador de estado do cabeçalho", + "endpoint": "/api/health", + "source": "O estado geral em cache produzido pelo Health Monitor cada ciclo." + }, + { + "card": "CPU / RAM / Swap / Tempo de atividade", + "endpoint": "/api/system", + "source": "/proc/stat, /proc/meminfo, /proc/uptime com amostragem de CPU de janela curta." + }, + { + "card": "Informações da máquina (kernel, BIOS, distro)", + "endpoint": "/api/info", + "source": "uname -a, dmidecode, versão PVE. Cache por processo." + }, + { + "card": "Cartões de armazenamento / rede / VMs", + "endpoint": "/api/storage/summary, /api/network/summary, /api/vms", + "source": "Consulte os separadores dedicados. Os cartões do cabeçalho apresentam uma vista compacta dos mesmos endpoints." + }, + { + "card": "Frequência de atualização", + "endpoint": "—", + "source": "Sistema a cada 5 s; armazenamento, VM e resumo de rede a cada 59 s. O botão Atualizar no cabeçalho recarrega todos os painéis imediatamente." + } + ], + "codeComment1": "# Chamada que alimenta o indicador de estado do cabeçalho", + "codeComment2": "# público, sem token", + "codeComment3": "# Instantâneo autenticado utilizado pelos cartões" + }, + "whereNext": { + "heading": "Para onde seguir", + "items": [ + { + "label": "Monitor de Saúde", + "href": "/docs/monitor/health-monitor", + "tail": " — a janela do indicador de estado do cabeçalho: dez categorias, avisos dispensados e supressão." + }, + { + "label": "Referência da API", + "href": "/docs/monitor/api", + "tail": " — endpoints system, info e health." + }, + { + "label": "Notificações", + "href": "/docs/monitor/notifications", + "tail": " — como os mesmos estados se transformam em mensagens Telegram / Discord / Email." + }, + { + "label": "Índice do painel", + "href": "/docs/monitor/dashboard", + "tail": " — os restantes separadores do painel de relance." + }, + { + "label": "Arquitetura", + "href": "/docs/monitor/architecture", + "tail": " — as threads em segundo plano e as API que alimentam esta vista." + } + ] + } +} diff --git a/web/messages/pt/docs/monitor/dashboard/terminal.json b/web/messages/pt/docs/monitor/dashboard/terminal.json new file mode 100644 index 00000000..6a8840c8 --- /dev/null +++ b/web/messages/pt/docs/monitor/dashboard/terminal.json @@ -0,0 +1,174 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Painel: Terminal | Documentação ProxMenux", + "description": "Shell do host Proxmox no navegador: até 4 terminais em grelha, botões de teclado para dispositivos móveis (ESC, TAB, setas, combinações Ctrl), guia de comandos integrado com cheat.sh e proteção JWT." + }, + "header": { + "title": "Painel: Terminal", + "description": "Uma sessão shell real no host Proxmox através do navegador. Até quatro terminais em simultâneo, botões de teclado para dispositivos móveis e guia de comandos integrado, com o mesmo tema do resto do painel.", + "section": "ProxMenux Monitor · Painel" + }, + "intro": { + "title": "Um PTY real no navegador", + "body": "O terminal cria um PTY no servidor através de flask_terminal_routes, liga-o por WebSocket a xterm.js no navegador e executa-se como root, o utilizador da unidade systemd. Como em ssh root@<host>, pode utilizar vim, tmux, ferramentas ncurses e as CLI Proxmox (qm, pct, pvesh, pvecm). Cada PTY exporta PROXMENUX_TERMINAL=monitor. Todos os processos filhos bash, incluindo um arranque posterior de menu, herdam a variável para reconhecer o terminal do Monitor." + }, + "singleAlt": "Página do Terminal ProxMenux Monitor — sessão de terminal único mostrando o resumo do sistema Fastfetch no login", + "singleCaption": "Um terminal da máquina aberto — a barra de ferramentas acima mostra a contagem (1 / 4 terminais), + Novo, Procurar, Limpar e Fechar. Os ajudantes de teclado móveis aparecem sob o terminal em dispositivos de toque.", + "target": { + "heading": "Alvo da conexão", + "body1": "A aba Terminal abre uma shell no próprio host Proxmox — o mesmo login que você teria sobre o SSH. Cada aba abre um novo terminal de host.", + "body2": "Para chegar a um container LXC do navegador, use o botão dedicado Console em cada cartão CT em execução na aba VMs & LXCs. Ele abre um modal que executa pct enter <vmid> e reutiliza a mesma barra de ferramentas amigável para dispositivos móveis descrita abaixo." + }, + "menuGuard": { + "heading": "Proteção da atualização de menu neste terminal", + "body1": "Após confirmação, menu substitui a sua árvore de scripts e volta a carregar. Isto funciona por SSH ou consola Proxmox, mas no navegador fecharia o PTY da shell e interromperia o WebSocket. Para o evitar, check_updates_stable, check_updates_beta e apply_release_channel leem PROXMENUX_TERMINAL e detetam o contexto Monitor.", + "body2": "O diálogo sim/não é então substituído por uma mensagem com o comando oficial do instalador: bash -c \"$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)\" para stable e o URL equivalente de install_proxmenux_beta.sh para beta. Execute a atualização por SSH ou consola do host Proxmox; o terminal do navegador serve apenas para ler e confirmar a mensagem." + }, + "fourTerminals": { + "heading": "Até quatro terminais ao mesmo tempo", + "intro": "A página permite- lhe abrir quatro terminais da máquina simultaneamente. Cada um tem o seu próprio PTY e o seu próprio WebSocket — são sessões totalmente independentes. Dois layouts alternam com os ícones ao lado do botão \"Novo\":", + "items": [ + "Vista por separadores — um terminal visível, os outros como separadores com nome no topo (Terminal 1, Terminal 2…). Útil para uma tarefa, mantendo as outras em segundo plano.", + "Vista em grelha — todos os terminais abertos numa grelha 2×2. Permite observar htop num, iftop noutro e editar num terceiro sem mudar de separador." + ], + "outro": "A barra indica a contagem (1/4 terminais, 4/4 terminais). + Novo abre um separador; o pequeno × do cabeçalho fecha esse separador. O botão vermelho grande Fechar no topo fecha todos os terminais." + }, + "gridAlt": "Página do Terminal ProxMenux Monitor — vista em grelha com quatro terminais de máquinas em execução ls, configuração de rede, iftop e o menu principal ProxMenux lado a lado", + "gridCaption": "Vista em grelha (4 / 4 terminais) — quatro PTY independentes em paralelo: listagem de diretório, /etc/network/interfaces, iftop e menu principal ProxMenux. O seletor de disposição da barra alterna entre grelha e separadores.", + "keyboard": { + "heading": "Botões de teclado para dispositivos móveis", + "intro": "Os teclados de telemóvel e tablet geralmente não incluem ESC, TAB, setas ou combinações com modificadores. São necessárias para utilizar vim, nano, htop ou menus TUI. Terminal apresenta uma fila de botões táteis por baixo quando o ecrã é pequeno ou o dispositivo aceita toque:", + "headerButton": "Botão", + "headerSends": "Envia", + "headerUse": "Utilização típica", + "rows": [ + { + "button": "ESC", + "sends": "\\x1b", + "use": "Sair do modo de inserção em vim, cancelar uma janela TUI, deixar uma pesquisa." + }, + { + "button": "TAB", + "sends": "\\t", + "use": "Conclusão automática de caminhos e navegação entre campos em dialog/whiptail." + }, + { + "button": "↑ ↓ ← →", + "sends": "\\x1bO[ABCD]", + "use": "Histórico da shell, movimento do cursor, navegação do menu." + }, + { + "button": "↵ Enter", + "sends": "\\r", + "use": "Confirmar. Alguns teclados no ecrã substituem Enter por Ir/Concluído; este botão evita ambiguidades." + }, + { + "button": "Ctrl ▾", + "sends": "Lista pendente", + "useRich": true + } + ], + "ctrlIntro": "Três sequências de controlo:", + "ctrlItems": [ + "Ctrl+C — cancelar / interromper o comando em execução (\\x03).", + "Ctrl+X — sair de nano (\\x18).", + "Ctrl+R — pesquisa inversa no histórico bash (\\x12)." + ], + "modalTitle": "A mesma barra na janela da consola LXC", + "modalBody": "A consola aberta em VMs e LXCs → Consola apresenta os mesmos botões de teclado sob a janela. Ao ligar, introduz automaticamente pct enter <vmid> para entrar diretamente no contentor." + }, + "lxcAlt": "Janela de consola LXC do ProxMenux Monitor — Terminal: ubuntu (ID: 103), com a mesma barra móvel (ESC, TAB, setas, Enter, Ctrl) por baixo", + "lxcCaption": "Consola LXC aberta em VMs e LXCs → Consola. O cabeçalho identifica o contentor de destino (Terminal: ubuntu (ID: 103)) e a mesma barra tátil aparece sob o terminal.", + "search": { + "heading": "Pesquisar comandos — guia de referência integrado", + "intro": "O botão azul Pesquisar abre uma pesquisa aproximada de comandos. Escreva algumas letras de um comando Linux ou Proxmox (ls, tar, qm, pct, zpool, systemctl…) para ver exemplos com Enviar para o terminal ativo num toque. Assim pode consultar opções sem mudar de separador.", + "modalAlt": "Janela Pesquisar comandos do ProxMenux Monitor — pesquisa aproximada de comandos Linux e Proxmox com cheat.sh e vários exemplos de ls", + "modalCaption": "Pesquisa de ls — cada resultado mostra comando, descrição e uma pequena seta de envio para o terminal ativo. A origem dos dados aparece no canto inferior direito (Fornecido por cheat.sh).", + "aboutLabel": "Sobre o cheat.sh:", + "aboutBody": "é um guia de referência de código aberto mantido pela comunidade, com exemplos curtos e práticos para centenas de comandos Linux, ferramentas de administração e linguagens de programação. Criado para ser consultado com curl cheat.sh/<command>, também funciona no navegador. O ProxMenux Monitor encaminha as consultas por um proxy no servidor para manter a mesma origem do painel.", + "headerSource": "Origem", + "headerWhen": "Quando é usado", + "headerWhat": "O que você vê", + "onlineLabel": "(em linha)", + "onlineWhen": "Quando o host tem acesso à internet e o proxy cheat.sh responde.", + "onlineWhat": "Vários exemplos práticos por comando, com a descrição por cima. O ponto de estado no cabeçalho é verde.", + "fallbackLabel": "Alternativa local", + "fallbackWhen": "Quando cheat.sh é inacessível (host offline, firewall restritivo, falha de cheat.sh).", + "fallbackWhat": "Uma lista incluída de comandos Linux e Proxmox comuns. O catálogo é menor, mas sempre disponível. O ponto de estado é vermelho.", + "sendingNote": "Como funciona o envio: a seta junto ao resultado envia o texto para o terminal ativo (separador selecionado ou último terminal clicado na grelha). A janela fecha automaticamente para poder premir Enter." + }, + "auth": { + "heading": "Autenticação", + "items": [ + "O navegador pede primeiro um ticket de utilização única através de POST /api/terminal/ticket, com JWT no cabeçalho Authorization. Envia depois o ticket ao abrir o WebSocket. Expira após 5 segundos; com autenticação ativa, um ticket ausente ou inválido fecha a ligação antes de criar um PTY.", + "Se o Monitor estiver atrás de um proxy inverso, este tem de encaminhar os upgrades WebSocket. Exemplos Nginx / Caddy / Traefik na página Acesso e autenticação." + ] + }, + "clipboard": { + "heading": "Área de transferência, rolagem e redimensionamento", + "items": [ + "Copiar e colar — utiliza a área de transferência do navegador. Selecione texto com rato ou trackpad e use o atalho do sistema (Cmd+C em macOS, Ctrl+Shift+C em Linux/Windows). Os ambientes Linux também permitem colar com o botão central.", + "Histórico do ecrã — deslocamento com roda ou dois dedos. xterm.js mantém em memória os últimos milhares de linhas.", + "Redimensionamento — o terminal ajusta a janela PTY quando redimensiona o painel, para apresentar corretamente htop e vim.", + "Reconexão ao voltar ao separador — mudar de aplicação no telemóvel ou tablet, sobretudo no iPad, pode cortar o WebSocket. Terminal deteta a mudança de visibilidade e volta a ligar ao regressar, com um tempo limite de 15 segundos para VPN lentas." + ] + }, + "disconnect": { + "heading": "Causas de desconexão", + "intro": "As causas mais comuns do fim de uma sessão e como resolver cada uma:", + "headerCause": "Causa", + "headerFix": "Solução", + "rows": [ + { + "cause": "JWT da sessão expirado ao abrir ou voltar a ligar um terminal (período de 24 h).", + "fix": "Atualizar a página e iniciar sessão novamente. O terminal não foi projetado para sessões sem acompanhamento, então a vida útil do JWT corresponde ao login regular do painel." + }, + { + "cause": "Tempo limite de inatividade do proxy inverso.", + "fix": "Aumente proxy_read_timeout no Nginx ou o equivalente no Caddy / Traefik (exemplos em Acesso e autenticação)." + }, + { + "cause": "Telemóvel ou tablet em suspensão.", + "fix": "Quando o dispositivo retoma, o separador volta a ligar automaticamente (tempo limite de 15 s para ligações VPN). Se falhar, recarregue-o." + }, + { + "cause": "O serviço reinicia na máquina.", + "fix": "Reiniciar proxmenux-monitor.service fecha todos os PTY. Abra novos terminais quando o painel terminar de recarregar." + } + ] + }, + "warning": { + "title": "O terminal é uma shell root no host", + "body": "O terminal herda o utilizador da unidade systemd (root) e tem todos os privilégios no host Proxmox. Configure utilizador, palavra-passe e 2FA em Acesso e autenticação antes de permitir acesso fora da rede local. Com a autenticação desativada, qualquer pessoa que alcance a porta 8008 pode abrir uma shell root sem confirmações adicionais ou credenciais SSH. Para acesso externo, utilize Secure Gateway (Tailscale) ou um proxy inverso HTTPS em vez de publicar a porta na Internet." + }, + "whereNext": { + "heading": "Para onde seguir", + "items": [ + { + "label": "Acesso e autenticação", + "href": "/docs/monitor/access-auth", + "tail": " — exemplos de proxy inverso com as linhas de upgrade WebSocket necessárias para o terminal." + }, + { + "label": "Arquitetura", + "href": "/docs/monitor/architecture", + "tail": " — transporte WebSocket (HTTP via flask-sock e HTTPS / WSS via gevent)." + }, + { + "label": "Referência da API", + "href": "/docs/monitor/api", + "tail": " — endpoints WebSocket /ws/terminal e /ws/script/, com o resto da API." + }, + { + "label": "Integração → Portal seguro", + "href": "/docs/monitor/integrations", + "tail": " — para aceder ao terminal fora da LAN sem expor a porta 8008." + }, + { + "label": "Índice do painel", + "href": "/docs/monitor/dashboard", + "tail": " — os outros separadores." + } + ] + } +} diff --git a/web/messages/pt/docs/monitor/dashboard/vms-lxcs-app.json b/web/messages/pt/docs/monitor/dashboard/vms-lxcs-app.json new file mode 100644 index 00000000..cb05e0a9 --- /dev/null +++ b/web/messages/pt/docs/monitor/dashboard/vms-lxcs-app.json @@ -0,0 +1,245 @@ +{ + "meta": { + "title": "Separador App LXC: deteção, ligações e versões | ProxMenux", + "description": "Descubra e registre aplicativos LXC, crie links web e, opcionalmente, rastreie versões instaladas e disponíveis." + }, + "header": { + "title": "Separador App LXC: deteção, ligações e versões", + "description": "Dê a cada aplicação LXC uma identidade persistente, acesso web e dados opcionais de versão sem ligar o registo às atualizações." + }, + "intro": { + "p1": "A aba App registra quais aplicativos pertencem a um LXC. Um registro pode conter apenas um nome e web link, ou também incluir um detector de versão instalado e uma fonte upstream.", + "p2": "O procedimento que altera o software configura-se no separador Atualizações. Guardar uma aplicação nunca executa um instalador nem atualizador.", + "callout": "Registro, rastreamento de versões e atualização são três capacidades independentes. Qualquer um pode ser usado sem exigir os outros dois.", + "dashboardTitle": "Desde o registo até ao lançador Apps", + "dashboard": "Cada ligação web guardada aqui aparece também como cartão no separador Apps principal. Esta página LXC continua a ser a referência para nome, logótipo, ligações e acompanhamento de versões." + }, + "overview": { + "heading": "O que um registro de aplicação pode fornecer", + "lead": "Um único registro salvo pode incluir:", + "items": [ + "Um nome visível e um logótipo adaptado ao tema.", + "Um ou mais links web clicáveis construídos a partir do endereço LXC, esquema e porta salva.", + "Um detector opcional para a versão atualmente instalada dentro do LXC.", + "Uma fonte opcional GitHub, HTTP JSON ou Docker Hub para a última versão disponível.", + "Notificações de novas versões e preferências de inclusão no contador de atualizações por aplicação.", + "Uma seção correspondente na aba Atualizações, mesmo quando o rastreamento de versões está desativado." + ] + }, + "discovery": { + "heading": "Deteção em cache e Procurar aplicações", + "lead": "As sugestões de aplicação fazem parte do cache modal per-LXC. A varredura inicial prepara-os em segundo plano para que a abertura da aba App possa mostrar resultados em cache imediatamente.", + "items": [ + "Abrir a guia Aplicativo não inicia uma nova varredura de catálogo e não consulta repetidamente o LXC.", + "Procurar aplicações executa uma nova deteção nesse LXC. Utilize após instalar software enquanto o ProxMenux já está em execução.", + "A lista anterior permanece visível enquanto a varredura explícita é executada. Novas correspondências são adicionadas quando terminar.", + "Se não houver novas correspondências, o resultado aparece junto às ações e Registar aplicação continua disponível para introdução manual.", + "Salvar, remover ou restaurar um aplicativo atualiza o mesmo cache imediatamente. Iniciando ou restaurando um LXC atualiza apenas esse hóspede através de seu evento de ciclo de vida existente." + ], + "callout": "Uma sugestão não é um registo. Mantém-se só de leitura até premir Registar e guardar o formulário." + }, + "registration": { + "heading": "Registar uma aplicação", + "lead": "Uma sugestão detectada e um registro manual usam o mesmo editor:", + "steps": [ + "Prima Registar numa sugestão ou Registar aplicação para escolher no catálogo ou introduzir um nome personalizado.", + "Reveja o nome e logotipo propostos pelo catálogo.", + "Adicione os links da web necessários. Portas de escuta detectadas são oferecidas como atalhos, mas nenhuma é salva automaticamente.", + "Deixe Acompanhar versão disponível desativado em registos só com ligações ou ative-o e reveja o detetor da versão instalada e a origem da versão disponível.", + "Com acompanhamento ativo, utilize Testar detetor e guarde o registo.", + "Prima Concluído após editar. App e Atualizações usam o mesmo registo atualizado em cache." + ] + }, + "catalog": { + "heading": "Registo assistido por catálogo", + "lead": "O catálogo fornece padrões, mas o registro salvo permanece editável.", + "items": [ + "Os resultados da pesquisa podem preencher o nome canônico, logotipo e portas web comuns.", + "Detectores de versão conhecidos são baseados em nomes de pacotes reais, binários, arquivos, distribuições Python, etiquetas OCI ou comandos em vez de uma suposição universal /root/.app.", + "As sobreposições de tempo de execução verificadas têm precedência quando uma instalação usa um caminho que difere dos metadados do instalador.", + "Marcadores Proxmox VE Helper-Scripts como /root/.slug continuam a ser um sinal de compatibilidade para novas instalações auxiliares, não o único detector.", + "Cada valor proposto pode ser editado antes de salvar para cobrir instaladores oficiais e instalações manuais." + ] + }, + "docker": { + "heading": "Como Docker LXCs são representados", + "lead": "Para um LXC cuja plataforma primária é Docker, Docker é o aplicativo registrado no nível LXC.", + "items": [ + "Uma carga de trabalho containerizada como Portainer, Frigate ou Vaultwarden não é sugerida como uma aplicação nativa independente LXC.", + "Os serviços Docker em execução com portas TCP publicadas são propostos como ligações web opcionais no editor Docker.", + "Cada link sugerido mostra o serviço, porta host e porta container. Apenas os links que fornecem uma interface web devem ser salvos.", + "O logotipo Docker global é usado quando um link não tem logotipo específico. Um logotipo por-link substitui-o quando um está configurado.", + "Após o registro do Docker, o Docker Engine e as atualizações de imagem são mostradas juntos em sua seção na aba Atualizações." + ], + "callout": "Esta estrutura impede que uma carga de trabalho Docker pareça um software instalado diretamente no LXC preservando links rápidos para suas interfaces." + }, + "webLinks": { + "heading": "Ligações Web e logotipos", + "lead": "Os links Web funcionam com ou sem rastreamento de versões.", + "items": [ + "Cada link armazena um esquema, porta, descrição opcional e URL de logotipo opcional.", + "A URL exibida usa o endereço atual já detectado para o LXC; o endereço não é duplicado em cada registro de aplicativo.", + "Um link sem seu próprio logotipo cai de volta para o logotipo de nível de aplicativo.", + "Vários links podem representar uma interface de administração, API, UI secundária ou outro endpoint do mesmo aplicativo.", + "Um aplicativo salvo somente para links também aparece nas Atualizações, onde um atualizador personalizado pode ser configurado mais tarde." + ] + }, + "tracking": { + "heading": "Rastreamento opcional da versão", + "lead": "O acompanhamento combina um detetor da versão instalada com uma origem opcional da versão disponível. Os dois lados são verificados separadamente.", + "colMethod": "Método de versão instalada", + "colUse": "Usar", + "detectorRows": [ + { + "method": "dpkg / apk", + "use": "Lê a versão de pacotes instalada a partir de metadados de pacotes Debian, Ubuntu ou Alpine." + }, + { + "method": "binary", + "use": "Executa um caminho binário absoluto ou um nome de comando com argumentos de versão." + }, + { + "method": "file + regex", + "use": "Lê um arquivo real e extrai a versão com um grupo de captura." + }, + { + "method": "docker label / docker exec", + "use": "Lê um rótulo de versão OCI ou executa um comando de versão dentro de um recipiente Docker." + }, + { + "method": "python distribution", + "use": "Usa importlib.metadata através do interpretador Python selecionado." + }, + { + "method": "command", + "use": "Executa um comando avançado de estilo argv sem uma shell e extrai a versão de sua saída." + }, + { + "method": "manual", + "use": "Armazena uma versão inserida manualmente; ela deve ser alterada após atualizar o aplicativo." + }, + { + "method": "OCI image", + "use": "Para contentores instalados por OCI manager Apps. Lê as versões da aplicação e da imagem no registo da instalação e compara o digest instalado com o publicado pelo registo de imagens. Não requer configuração." + } + ], + "sourcesHeading": "Origens da versão disponível", + "sources": [ + "GitHub repositório: última versão ou tag de um repositório público owner/name.", + "HTTP JSON: um endpoint público mais um caminho pontilhado como o data.version ou o releases[0].tag_name.", + "Docker Hub: tags versionadas filtradas por uma expressão regular. Uma pré-visualização ao vivo mostra etiquetas de correspondência reais antes do registro ser salvo.", + "Etiquetas móveis como latest, stable ou lts não contêm versão. Acompanhe essas imagens por digest nas atualizações de imagens Docker." + ], + "regexHeading": "Escrever a expressão de captura", + "regexLead": "A expressão regular tem de devolver a versão no primeiro grupo de captura.", + "regexRules": [ + "Coincidir com o texto emitido pelo binário, ficheiro, comando ou origem da marca seleccionado; não adivinhar um caminho genérico.", + "Escape os pontos literais como \\. para não corresponderem a caracteres arbitrários.", + "Permita um v inicial apenas se a origem o puder incluir.", + "Inclua sufixos como pré-lançamento ou revisões distro apenas quando eles são significativos para a comparação.", + "Utilize Testar detetor antes de guardar e confirme que a versão instalada apresentada corresponde ao LXC." + ], + "regexExampleLead": "Captura comum de versão semântica:", + "regexExample": "v?(\\d+\\.\\d+\\.\\d+)", + "regexCallout": "Uma correspondência regex bem sucedida não é prova de que o caminho do detector está correto. O caminho ou pacote também deve existir na instalação real que está sendo registrada." + }, + "updater": { + "heading": "Rastreamento e atualização de versões são independentes", + "lead": "O separador Atualizações cria uma secção de aplicação logo que um registo é guardado.", + "items": [ + "Um registro somente de links mostra que o rastreamento de versões não está configurado, mas ainda pode receber um comando de atualização personalizado.", + "Um aplicativo com rastreamento mas sem um método executável mostra uma mensagem neutra pedindo um comando personalizado.", + "Um aplicativo com um wrapper Proxmox VE Helper-Scripts verificado pode usar esse updater integrado mesmo quando o registro começou a partir de um link da web.", + "Adicionar ou editar um updater não altera o detector ou fonte upstream armazenado na aba App." + ] + }, + "states": { + "heading": "Os estados da versão no cartão App", + "colState": "Estado", + "colDisplay": "Visualização", + "colMeaning": "Significado", + "rows": [ + { + "state": "Atualização disponível", + "display": "Versão disponível em roxo com um ícone de seta para cima", + "meaning": "As versões instaladas e a montante diferem." + }, + { + "state": "Atual", + "display": "Versões instaladas e mais recentes sem o alerta roxo", + "meaning": "A última verificação não encontrou nenhuma versão mais recente a montante." + }, + { + "state": "Rastreamento pendente", + "display": "Verificação ou estado pendente", + "meaning": "O registro está configurado, mas ainda não completou ambas as verificações." + }, + { + "state": "Rastreamento desativado", + "display": "Apenas ligações Web; nenhum bloco de comparação de versões", + "meaning": "O registro permanece válido e ainda pode ter um updater." + }, + { + "state": "Erro de verificação", + "display": "Explicação a âmbar no cartão", + "meaning": "O estado guardado anterior continua visível enquanto é comunicado o erro do detetor ou da origem da versão disponível." + } + ] + }, + "management": { + "heading": "Gerenciar aplicativos salvos e sugeridos", + "lead": "As ações na parte inferior da aba têm papéis distintos:", + "items": [ + "Procurar aplicações atualiza a deteção apenas neste LXC.", + "Registe outra aplicação abre o catálogo e o editor manual sem voltar a analisar o LXC.", + "Editar mostra em cada cartão Remover, Verificar, notificações e Editar campos.", + "Ocultar remove uma sugestão indesejada. As deteções ocultas podem ser restauradas na vista de registo.", + "Verificar atualiza os dados de versão da aplicação guardada selecionada; não procura novas aplicações." + ] + }, + "troubleshooting": { + "heading": "Situações comuns", + "colProblem": "Situação", + "colResolution": "Resolução", + "rows": [ + { + "problem": "O software foi instalado após o início do ProxMenux", + "resolution": "Prima Procurar aplicações. A análise explícita atualiza as sugestões em cache desse LXC." + }, + { + "problem": "Nenhuma aplicação foi detectada", + "resolution": "Registre-o manualmente. Um nome e um link web são suficientes; o rastreamento pode ser adicionado mais tarde." + }, + { + "problem": "O detector sugerido devolve a versão errada", + "resolution": "Abra Editar campos, escolha o pacote, binário ou caminho de ficheiro real e teste o detetor antes de guardar." + }, + { + "problem": "Uma carga de trabalho Docker não é oferecida como uma aplicação LXC", + "resolution": "Registre o Docker e adicione a interface publicada da carga de trabalho como um link web do Docker. As atualizações de imagem permanecem na seção Docker." + }, + { + "problem": "Um aplicativo salvo não tem botão de atualização", + "resolution": "Abra a aba Atualizações e configure seu método de atualização. O rastreamento de versões sozinho não define como uma atualização é instalada." + } + ] + }, + "figures": { + "catalog": { + "alt": "Catálogo de registro de aplicativos com resultados de busca, logotipos, portas e campos de detectores", + "caption": "Metadados de catálogo aceleram o registro enquanto cada valor proposto permanece editável." + }, + "webLinks": { + "alt": "Cartão de aplicação LXC salvo contendo um link web clicável", + "caption": "Um registo só com ligações é válido: o acompanhamento pode ficar desativado e o atualizador pode ser adicionado separadamente." + }, + "tracking": { + "alt": "Campos opcionais do detetor da versão instalada e da origem da versão disponível", + "caption": "A detecção de versão instalada e a fonte upstream são configuradas e testadas separadamente." + }, + "card": { + "alt": "Cartão de aplicação salvo com versões instaladas e disponíveis, além de um link para a web", + "caption": "O cartão combina identidade, evidência de versão e acesso à web sem executar ações de atualização desta aba." + } + } +} diff --git a/web/messages/pt/docs/monitor/dashboard/vms-lxcs-updates.json b/web/messages/pt/docs/monitor/dashboard/vms-lxcs-updates.json new file mode 100644 index 00000000..4c81d931 --- /dev/null +++ b/web/messages/pt/docs/monitor/dashboard/vms-lxcs-updates.json @@ -0,0 +1,203 @@ +{ + "meta": { + "title": "Atualizações LXC: sistema, aplicações e Docker | ProxMenux", + "description": "Configure e execute atualizações do sistema operativo, aplicações, Docker Engine e imagens Docker num contentor LXC." + }, + "header": { + "title": "Atualizações LXC: sistema, aplicações e Docker", + "description": "Reveja cada alvo de atualização em um só lugar, execute-o de forma independente ou combine alvos selecionados em uma ação em massa controlada." + }, + "intro": { + "p1": "O separador Atualizações separa a deteção de versões da instalação. O registo e o acompanhamento opcional ficam no separador App; os métodos executáveis gerem-se aqui.", + "p2": "Um aplicativo salvo aparece nas Atualizações mesmo quando contém apenas um link web. O rastreamento de versões é opcional e um atualizador pode ser configurado independentemente.", + "callout": "Registar uma aplicação não seleciona o atualizador. Se for detetado um atualizador Helper-Scripts correspondente, escolha e guarde Helper-Scripts ou Comando personalizado. A deteção não garante compatibilidade. A escolha pertence a cada aplicação, mesmo num LXC partilhado." + }, + "overview": { + "heading": "Qual a composição da aba", + "lead": "Cada alvo disponível tem sua própria seção e ação:", + "items": [ + "Pacotes do sistema para contentores Debian, Ubuntu e Alpine.", + "Uma secção por aplicação registada, incluindo registos apenas com ligações.", + "Uma seção Docker quando o Docker está registrado, com Docker Engine e imagens etiquetadas agrupadas.", + "Uma secção Atualização em bloco configurável, seguida de opções de cópia de segurança, reinício e agendamento." + ] + }, + "mechanisms": { + "heading": "Como um método de atualização é selecionado", + "lead": "O caminho integrado Proxmox VE Helper-Scripts segue o mecanismo oficial update-apps. Outros tipos de instalação usam o pacote correspondente, Docker ou caminho personalizado.", + "officialReference": "Referência oficial: a documentação update-apps de Proxmox VE Helper-Scripts abrange modos interativo e sem supervisão, cópias de segurança, simulações, recursos temporários de compilação, registos e códigos de saída.", + "colSource": "Origem", + "colAction": "Ação exibida", + "colNotes": "O que é executado", + "rows": [ + { + "source": "Pacotes APT ou APK", + "action": "Aplicar atualizações do sistema operacional", + "notes": "Actualiza os pacotes de contentores. Aplicativos registrados instalados como pacotes dpkg ou apk são cobertos por este mesmo passe." + }, + { + "source": "Proxmox VE Helper-Scripts", + "action": "Aplicar atualização", + "notes": "Após selecionar expressamente Helper-Scripts, executa o script oficial identificado pelo wrapper /usr/bin/update validado. Um marcador ou correspondência do catálogo nunca permite a execução por si só." + }, + { + "source": "Comando personalizado", + "action": "Execute o atualizador", + "notes": "Executa o comando salvo dentro do LXC e substitui qualquer atualizador de aplicativo integrado para esse registro." + }, + { + "source": "Docker Engine", + "action": "Atualizar Docker Engine", + "notes": "Atualiza apenas os pacotes Docker instalados e as dependências necessárias. Não altera outros pacotes do sistema nem contentores." + }, + { + "source": "Imagem Docker", + "action": "Atualizar imagem", + "notes": "Transfere a imagem selecionada e recria o grupo de serviços Compose ou o contentor independente protegido." + } + ], + "callout": "Um comando personalizado substitui Helper-Scripts nessa aplicação. As execuções manuais, em bloco e agendadas respeitam a escolha guardada. Mantêm-se os comandos existentes e as seleções antigas expressamente guardadas em planos em bloco ou agendamentos ativos; um agendamento antigo nunca inclui uma aplicação recém-registada." + }, + "docker": { + "heading": "Docker Engine e imagens Docker", + "lead": "Após o Docker estar registrado na aba App, seu motor e inventário de imagens aparecem dentro da mesma seção Docker.", + "items": [ + "O rastreamento de versão do Docker Engine é separado do contador do pacote OS e tem seu próprio botão de atualização.", + "As imagens locais com etiqueta são comparadas com o registo através de digests imutáveis. Verificar agora atualiza o inventário sem transferir imagens nem reiniciar contentores.", + "Os serviços Compose são atualizados a partir do projeto declarado. As imagens do mesmo grupo são tratadas juntas para evitar recriar o projeto repetidamente.", + "Um contentor independente é recriado com a configuração atual. O processo protegido conserva dados de reversão e restaura o contentor anterior se a recriação falhar.", + "Cada imagem pode ser selecionada separadamente em atualizações manuais, em massa e agendadas, exceto dependências declaradas Compose que devem seguir seu serviço pai." + ], + "callout": "Os containers em funcionamento dentro de Docker não são mostrados como aplicações independentes LXC. Suas portas web publicadas podem ser salvas como links sob o registro Docker, enquanto as atualizações de imagem permanecem na seção Docker." + }, + "actions": { + "heading": "Acções individuais e cores do estado", + "lead": "Cada seção permanece independentemente acionável, seja ou não uma atualização em massa está configurada.", + "items": [ + "Configurar abre a seleção do atualizador quando não há método; Editar altera uma escolha guardada. Os botões informativos explicam as opções, ligam a documentação oficial e mostram um exemplo de script personalizado. Selecionar não executa a opção.", + "Com acompanhamento de versão desativado mas atualizador disponível, aparece a ação neutra Executar atualizador. O ProxMenux não afirma que há uma atualização pendente.", + "Sem um atualizador Helper-Scripts disponível, configure um comando personalizado. Desativar um método não seleciona silenciosamente outro; as seleções de plano/agenda existentes permanecem salvas e alvos indisponível são reportados.", + "Atualizar imagem aplica-se apenas à unidade Docker selecionada; não atualiza Docker Engine nem imagens não relacionadas." + ], + "statusColState": "Estado conhecido", + "statusColAppearance": "Aparência", + "statusColMeaning": "Significado", + "statusRows": [ + { + "state": "Actualização verificada disponível", + "appearance": "Texto roxo, ícone de seta ascendente e ação roxa", + "meaning": "As versões instaladas e disponíveis ou os digests das imagens diferem." + }, + { + "state": "Atualizado e verificado", + "appearance": "Marca de verificação verde e ação Atualizado a verde", + "meaning": "A última verificação completa confirma que o alvo está atual." + }, + { + "state": "Versão desconhecida", + "appearance": "Texto neutro e ação neutra", + "meaning": "O atualizador pode ser executado, mas faltam dados de versão para determinar se o alvo está atualizado ou tem atualização pendente." + } + ] + }, + "custom": { + "heading": "Comandos personalizados de actualização", + "lead": "Use um comando personalizado quando a instalação não tiver nenhum atualizador integrado verificado, ou quando seu procedimento normal deve ser substituído.", + "items": [ + "Abra Configurar se o campo estiver vazio ou Editar se já houver um método.", + "Para um aplicativo integrado ou Docker Engine, o editor mostra o comando atualmente utilizado. Salvar conteúdo diferente transforma-o na sobreposição explícita para esse registro.", + "Teste o procedimento completo no terminal LXC primeiro. Deve ser não-interativo, usar o diretório de trabalho correto e retornar um status de saída não-zero na falha.", + "Não inclua pct exec; o ProxMenux já entra no contentor e executa como root." + ], + "exampleLead": "Exemplo de procedimento completo dentro do contentor:", + "example": "cd /opt/my-app && ./update.sh", + "callout": "Um comando de versão como o myapp --version só lê uma versão; não é um updater. Comandos executados com privilégios administrativos, então o conteúdo armazenado deve ser revisado com o mesmo cuidado que um comando root shell." + }, + "bulk": { + "heading": "Atualização em bloco", + "lead": "A atualização em massa cria uma ação reutilizável para um conjunto exato de alvos no LXC. É colocado após a aplicação individual e as secções Docker e antes de Opções.", + "items": [ + "Os pacotes do sistema são obrigatórios. Selecione pelo menos uma aplicação, Docker Engine ou uma unidade de imagem Docker adicional.", + "Aplicações e unidades Docker são selecionadas individualmente. O serviço principal Compose mostra as dependências atualizadas com ele.", + "Alvos indisponíveis ou removidos são marcados como obsoletos e têm de ser retirados antes de guardar.", + "Aplicar atualizações é roxo se algum alvo tiver uma atualização verificada, verde se todos estiverem verificados como atualizados e neutro se o resultado for desconhecido.", + "A remoção da configuração em massa não remove métodos de atualização individuais ou configurações de atualização agendada." + ], + "callout": "A atualização em massa não substitui os botões individuais. É um atalho opcional para uma seleção que deve ser executada em conjunto." + }, + "options": { + "heading": "Opções de backup e reinicialização", + "lead": "As mesmas opções aplicam-se às execuções manuais, em bloco e agendadas:", + "items": [ + "Snapshot antes de aplicar cria um backup vzdump no armazenamento selecionado. Se o backup necessário falhar, a atualização não será iniciada.", + "Reiniciar após a aplicação reinicia o LXC apenas após uma execução bem sucedida.", + "As seleções são armazenadas por LXC e permanecem independentes da lista alvo." + ] + }, + "scheduled": { + "heading": "Atualizações agendadas", + "lead": "Atualizações agendadas usam os mesmos alvos executáveis e opções de segurança como ações manuais.", + "items": [ + "Escolha uma frequência predefinida ou expressão cron e depois os alvos exatos: pacotes do sistema, aplicações, Docker Engine, unidades Docker independentes ou grupos de serviços Compose.", + "O atraso após o lançamento aplica-se apenas a aplicações selecionadas com acompanhamento de versão. Sem acompanhamento, o atualizador é executado em cada agendamento.", + "O estado da última execução distingue sucesso, conclusão parcial, falha, suspensão de segurança e ausência de atualizações pendentes. Após a primeira execução agendada, Atualizações → Atualizações agendadas → Ver registo abre toda a saída do atualizador e dos scripts secundários invocados.", + "Após cada execução, o ProxMenux verifica o marcador padrão Debian reboot-required. Quando é necessário reiniciar, a aba Atualizações e a notificação de conclusão dizem isso; o aviso é apagado quando o LXC inicia ou reinicia.", + "No host Proxmox, os logs de execução programados são armazenados em /usr/local/share/proxmenux/logs/lxc-updates/ usando o nome <VMID>-scheduled-<run-id>.log. Os últimos dez logs são mantidos por LXC e arquivos mais antigos são removidos automaticamente.", + "Este histórico retido se aplica às atualizações agendadas. Uma atualização manual exibe sua saída ao vivo na janela de execução do Monitor e não cria um log de execução agendado nesse diretório.", + "Os agendamentos externos no host detetados a partir de Proxmox VE Helper-Scripts aparecem separadamente para mostrar automações sobrepostas." + ], + "callout": "Execute cada método manualmente antes de ativar um agendamento. Os comandos agendados não podem responder a perguntas interativas." + }, + "completion": { + "heading": "O que acontece depois de uma atualização", + "lead": "A atualização não é considerada terminada quando o comando terminal simplesmente termina.", + "items": [ + "A mesma execução registra seu resultado final e atualiza o estado do pacote OS, versões de aplicativos registrados e inventário Docker, conforme aplicável.", + "As execuções agendadas conservam a saída do terminal e indicam se ainda é preciso reiniciar para terminar de aplicar as alterações aos pacotes.", + "O cache LXC é substituído pelo estado de pós-atualização verificado, para que os crachás e botões não mantenham o resultado anterior.", + "Ao iniciar um LXC parado ou restaurado, o evento de ciclo de vida volta a atualizar os dados. O inventário Docker espera que o daemon esteja pronto sem guardar um resultado inicial vazio como definitivo.", + "As notificações habilitadas são emitidas a partir da execução finalizada, incluindo falhas parciais e resultados agrupados de imagem Docker." + ] + }, + "troubleshooting": { + "heading": "Situações comuns", + "colProblem": "Situação", + "colResolution": "Resolução", + "rows": [ + { + "problem": "Nenhum método de atualização foi identificado", + "resolution": "Abra Configurar, adicione o procedimento oficial não-interativo e teste-o manualmente antes de agendar." + }, + { + "problem": "Uma identidade Proxmox VE Helper-Scripts é mostrada mas nenhuma ação existe", + "resolution": "O LXC tem dados de identificação antigos, mas nenhum wrapper /usr/bin/update verificado. Adicione uma opção personalizada só depois de confirmar o procedimento correto." + }, + { + "problem": "As imagens Docker estão temporariamente vazias após a inicialização ou restauração", + "resolution": "Aguarde que o Docker fique pronto ou pressione Verificar agora. O inventário repete a inicialização e não trata um resultado vazio transitório como final." + }, + { + "problem": "Um alvo em massa salvo não está mais disponível", + "resolution": "Edite a configuração em massa, remova o alvo obsoleto e selecione sua substituição atual se existir." + }, + { + "problem": "Um comando personalizado falhou", + "resolution": "Execute-o no terminal LXC e reveja caminho, dependências, parâmetros não interativos e código de saída." + }, + { + "problem": "Uma atualização agendada diz que é necessário reiniciar", + "resolution": "Abra Ver registo para rever a execução concluída e reinicie esse LXC. O ProxMenux limpa o aviso quando o evento de ciclo de vida deteta o novo arranque." + } + ] + }, + "figures": { + "osPending": { + "alt": "Seção de pacotes do sistema operacional com contagem de atualizações pendentes e de segurança", + "caption": "A seção sistema operacional mantém atualizações de pacotes independentes de aplicativos e ações Docker." + }, + "options": { + "alt": "Opções de atualização LXC com backup pré-atualização e reinicialização pós-atualização", + "caption": "As preferências de backup e reinicialização se aplicam às execuções manuais, em massa e agendadas." + } + } +} diff --git a/web/messages/pt/docs/monitor/dashboard/vms-lxcs.json b/web/messages/pt/docs/monitor/dashboard/vms-lxcs.json new file mode 100644 index 00000000..9adcc28e --- /dev/null +++ b/web/messages/pt/docs/monitor/dashboard/vms-lxcs.json @@ -0,0 +1,244 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Painel: VM e LXC | Documentação ProxMenux", + "description": "Inventário dos sistemas convidados com CPU, memória e disco em direto. Os detalhes mostram configuração, recursos, cópias de segurança, resultados recentes do registo Proxmox, notas e Iniciar / Desligar / Reiniciar / Forçar paragem." + }, + "header": { + "title": "Painel: VM e LXC", + "description": "Inventário completo dos sistemas convidados: quatro métricas no topo, lista ordenável de VM e LXC e detalhes com configuração, recursos, cópias de segurança, registos e controlos Iniciar / Desligar / Reiniciar / Forçar paragem.", + "section": "ProxMenux Monitor · Painel" + }, + "intro": { + "title": "Controlos dos sistemas convidados", + "body": "Este separador controla o ciclo de vida dos sistemas convidados. As ações passam por POST /api/vms/<vmid>/control com confirmação explícita e atualizam a linha do sistema. O desligamento forçado exige o botão específico Forçar paragem." + }, + "topRow": { + "heading": "Linha superior: quatro cartas estatísticas", + "intro": "Quatro cartões resumem o estado dos sistemas convidados: totais, uso CPU, memória atribuída face à capacidade do host e espaço de disco atribuído.", + "imageAlt": "Página VMs & LXCs — linha superior de quatro placas estatísticas: Total de VMs & LXCs, Total de CPU, Memória Total, Disco Total", + "imageCaption": "Linha superior: totais e estados Em execução / Parados, uso CPU, memória utilizada / atribuída a sistemas ativos / atribuída total com indicador Dentro dos limites e espaço de disco atribuído.", + "headerCard": "Cartão", + "headerWhat": "O que mostra", + "totalLabel": "Total de VMs e LXCs", + "totalWhat": "Contagem total com dois emblemas — X Running (verde) e Y parado (vermelho, apenas quando > 0). O número que vês quando algo não aparece depois de uma reinicialização.", + "cpuLabel": "CPU total", + "cpuWhat": "Utilização CPU total em direto dos sistemas convidados, como percentagem da CPU física do host, com o texto “Uso CPU atribuído”.", + "memoryLabel": "Memória total", + "memoryIntro": "Três leituras empilhadas verticalmente:", + "memoryItems": [ + "Utilizada atualmente — valor principal, como 15.4 GB, e X.X % de Y GB face à RAM do host. A barra azul indica a percentagem.", + "Atribuída aos ativos + Atribuída total — soma de maxmem dos sistemas em execução e de todos, incluindo os parados. A primeira importa agora, a segunda ao iniciá-los todos.", + "Dentro dos limites, a verde, muda para Sobre-alocada se o total ultrapassar a RAM do host. Uma sobre-alocação controlada pode funcionar com KSM; o indicador avisa quando a margem diminui." + ], + "diskLabel": "Disco total", + "diskWhat": "Soma do espaço em disco alocado em todos os hóspedes, na unidade apropriada (GB / TB), com a linha de rodapé \"Espaço em disco alocado\"." + }, + "inventory": { + "heading": "Lista de máquinas virtuais e contentores", + "intro": "Uma fila por convidado. A lista é de origem única a partir de /api/vms, que consolida qm list + pct list + pvesh /cluster/resources no host.", + "imageAlt": "Lista de máquinas virtuais e contentores — uma linha por sistema, com estado, tipo, nome, ID e percentagens CPU/memória/disco", + "imageCaption": "O layout otimizado para dispositivos móveis do inventário — os mesmos dados que a área de trabalho mostra, recolocado em uma única coluna com as porcentagens e indicadores de status mantidos compactos.", + "rowsIntro": "Cada linha mostra:", + "rows": [ + "Ícone de estado — triângulo verde para Em execução ou quadrado vermelho para Parado. O restante da linha fica atenuado nos sistemas parados.", + "Tipo — LXC a ciano para contentores, VM a roxo para máquinas virtuais.", + "Nome — nome do host ou nome apresentado do sistema convidado.", + "VMID — o ID numérico Proxmox abaixo do nome.", + "Metricas em linha — três percentagens com o seu ícone (CPU %, Memória %, Disco %). Cada ícone fica laranja quando a métrica cruza um limiar de atenção (por exemplo, memória acima de 90 %), então uma varredura rápida lhe diz qual hóspede está sob pressão sem abri-lo." + ], + "clickHint": "Clique numa linha para abrir os detalhes, esteja o sistema em execução ou parado.", + "mobileTitle": "Lista concebida para dispositivos móveis", + "mobileBody": "Em telemóveis e janelas estreitas, tipo, nome, ID e três percentagens ficam empilhados numa coluna, como na imagem. Em ecrãs largos distribuem-se na horizontal. Toda a linha permite abrir os detalhes." + }, + "drillIn": { + "heading": "Janela de detalhes do sistema convidado", + "intro": "A janela mostra nome, VMID, tipo, estado e tempo de atividade. Os separadores adaptam-se ao sistema: Estado, App e Atualizações para aplicações LXC, Montagens quando existem, Registos para contentores OCI manager Apps, Cópias de segurança e Firewall. A barra fixa mantém os controlos de ciclo de vida e o terminal LXC disponíveis.", + "statusTitle": "Página 1 — Estado", + "statusImageAlt": "Detalhes do sistema — Estado com CPU, memória e disco em direto, E/S de disco e rede, logótipo do sistema e Recursos / Endereços IP", + "statusImageCaption": "Estado: CPU, memória e disco com barras no topo; totais de E/S (disco lido/escrito, rede recebida/enviada); depois Recursos com Notas, + Info e lista de endereços IP.", + "statusIntro": "O separador inicial permite verificar o estado do sistema. Três blocos:", + "liveTitle": "1. Linha de métricas ao vivo", + "liveItems": [ + "Utilização CPU (X núcleos) — percentagem com barra. O número de núcleos configurados no cabeçalho esclarece o que significa 100 %.", + "Memória — utilizada / máxima em GB com barra.", + "Disco — utilizado / máximo da imagem de disco principal, no mesmo formato." + ], + "ioTitle": "2. Total I/O + Logótipo do sistema operacional", + "ioItems": [ + "E/S de disco — totais de leitura (↓) e escrita (↑) desde o arranque. Ajuda a detetar aumentos súbitos face à atividade habitual do sistema convidado.", + "E/S de rede — receção (↓) e envio (↑) acumulados, com o mesmo princípio.", + "Logótipo do sistema — ícone Debian / Ubuntu / Alpine / Windows / etc. conforme o sistema detetado. Ajuda a identificar as janelas abertas." + ], + "resourcesTitle": "3. Bloco de recursos", + "resourcesIntro": "Configuração segundo o Proxmox: núcleos CPU, memória (maxmem configurado) e swap. Duas secções expansíveis no cabeçalho:", + "resourcesItems": [ + "Notas — descrição editável do sistema convidado. Guardar chama PUT /api/vms/<vmid>/config e escreve em /etc/pve/qemu-server/<vmid>.conf ou /etc/pve/lxc/<vmid>.conf.", + "+ Info — campos extras que são muito verbosos para a visualização padrão: modo bios, tipo de máquina, estado do agente, entradas hostpci passthrough, pontos de montagem (CT), ordem de inicialização." + ], + "ipsTitle": "4. Endereços IP", + "ipsBody": "Cada endereço IPv4 ou IPv6 aparece numa etiqueta verde. A lista fica vazia com o sistema parado ou numa VM sem agente QEMU; os LXC comunicam os endereços diretamente.", + "appTitle": "Página 2 — Aplicação (LXC apenas)", + "appIntro": "Regista aplicações LXC, guarda ligações web e compara versões opcionalmente. As sugestões vêm da cache inicial; Procurar aplicações repete a deteção neste LXC após novas instalações.", + "appLinkLead": "Veja o", + "appLinkLabel": "página de aplicação dedicada", + "appLinkTail": "para descoberta em cache, registro assistido por catálogo, links web Docker e detectores de versões.", + "updatesTitle": "Página 3 — Actualizações (LXC apenas)", + "updatesIntro": "Mantém separados pacotes do sistema, aplicações, Docker Engine e imagens Docker. Cada alvo pode ser executado sozinho ou selecionado para uma ação em bloco ou agendada.", + "updatesLinkLead": "Veja o", + "updatesLinkLabel": "página de atualizações dedicadas", + "updatesLinkTail": "para atualizadores integrados e personalizados, recriação Docker, seleção em bloco, opções de segurança e agendamento.", + "mountsTitle": "Tab 4 — Montagens (LXC apenas, quando presente)", + "mountsImageAlt": "Detalhes LXC, Montagens: volumes PVE, bind mounts do host ou armazenamento PVE e NFS/CIFS montados no CT. Cada cartão mostra tipo, capacidade, bytes utilizados/totais, opções e estado: verde normal, âmbar só leitura/divergente, vermelho inacessível.", + "mountsImageCaption": "Montagens só aparece em LXC com pelo menos um ponto de montagem ou montagem remota adicionada. Sem montagens, o separador está ausente.", + "mountsIntro": "O Proxmox mostra montagens configuradas como mpX, mas não as adicionadas depois no CT com mount.cifs, NFS via autofs, etc. Este separador reúne as duas vistas: montagens configuradas e detetadas no contentor, com estado e capacidade quando o servidor a consegue obter.", + "mountTypesTitle": "Tipos de montagem detectados", + "mountTypesItems": [ + "Volume PVE — armazenamento gerido pelo Proxmox, como subvolume ZFS, diretório ou Ceph RBD. A capacidade vem das estatísticas PVE e coincide com o Proxmox.", + "Bind de armazenamento PVE — entrada mpX que aponta para um caminho de armazenamento conhecido pelo PVE.", + "Bind do host — entrada mpX com um caminho arbitrário do host (/mnt/something). A capacidade vem de df desse caminho.", + "Ad-hoc dentro de CT — montagem que somente existe no namespace de montagem do contêiner (por exemplo, um compartilhamento NFS que o CT monta sozinho). A capacidade é lida por meio de pct exec <vmid> df, que é a única maneira de vê-la - /proc/<pid>/root do host não expõe as estatísticas reais da montagem remota." + ], + "mountStateTitle": "Ponto de estado e avisos por cartão", + "mountStateItems": [ + " Verde — montagem normal e acessível.", + " Âmbar — configurado mas não montado, só leitura ou bind zombie. A origem desapareceu do host mas o CT ainda a vê montada, por exemplo após desligar um disco USB ou executar umount no host.", + " Vermelho — inacessível: a verificação não alcança a montagem, por exemplo uma partilha NFS com servidor indisponível." + ], + "mountsCalloutTitle": "Informação adicional face ao Proxmox", + "mountsCalloutBody": "Vista dos caminhos lidos e escritos pelo contentor e respetiva capacidade. Partilhas NFS/CIFS montadas no CT, invisíveis no Proxmox, têm aqui a mesma apresentação e controlo. Montagens inacessíveis e binds zombie são assinalados antes de causarem problemas numa cópia de segurança.", + "logsTitle": "Tab 5 — Registos (apenas contentores OCI)", + "logsBody": "Só para contentores OCI manager Apps. Mostra a consola do processo principal da imagem em /var/log/proxmenux/oci/VMID.console.log: últimas 100, 500 ou 1000 linhas, acompanhamento em direto enquanto ativo, filtro e transferência. Relê o ficheiro ao abrir, mesmo com o contentor parado. Detalhes: Contentores OCI no ProxMenux Monitor.", + "backupsTitle": "Página 6 — Cópias de segurança", + "backupsImageAlt": "Detalhes do sistema — Cópias de segurança com lista de cópias disponíveis, destinos, tamanhos e botão Criar cópia", + "backupsImageCaption": "Todas as cópias do sistema nos armazenamentos Proxmox configurados, da mais recente à mais antiga. O cabeçalho mostra a contagem.", + "backupsIntro": "Lista as cópias do sistema nos armazenamentos Proxmox, da mais recente à mais antiga. O contador no título permite ver se existem cópias. Cada linha mostra:", + "backupsItems": [ + "Data e hora — momento da execução.", + "Destino — armazenamento (PBS-Cloud, PBS-Local, NFS-Backup, …), colorido conforme o estado.", + "Tamanho — tamanho final em disco da cópia." + ], + "backupsOutro": "+ Criar cópia de segurança inicia uma cópia no armazenamento marcado “Backup target” no Proxmox. O restauro faz-se na interface web Proxmox; o Monitor mostra as cópias recentes do sistema e permite criar novas.", + "firewallTitle": "Página 7 — Firewall", + "firewallIntro": "Lê o registo do firewall Proxmox de cada sistema diretamente do host, sem serviço adicional nem consultas periódicas. O separador está sempre presente; o conteúdo depende da ativação do firewall e de uma regra registar pacotes.", + "firewallItems": [ + "Firewall desativado — um aviso a laranja indica onde o ativar no Proxmox (<Container|VM> → Firewall → Options) e recorda que pelo menos uma regra precisa de log: info ou nível superior para os pacotes aparecerem.", + "Firewall ativo, sem eventos — a vista vazia lembra o requisito de registo, útil logo após a ativação.", + "Eventos presentes — painel monoespaçado com deslocamento e entradas originais por ação: ACCEPT verde, REJECT laranja, DROP vermelho. O contador no cabeçalho mostra as entradas carregadas." + ], + "firewallRefresh": "Atualizar carrega as entradas recentes a pedido. Sem atualização automática, a lista mostra o momento da abertura ou do último clique. A origem é /var/log/pve-firewall.log, filtrada por VMID através de GET /api/vms/<vmid>/firewall/log.", + "firewallCalloutTitle": "Porquê tê-lo aqui quando a UI Proxmox já o mostra?", + "firewallCalloutBody": "Evita mudar para o Proxmox e mantém a vista do mesmo VMID: inicie o sistema, verifique montagens e eventos do firewall e volte a pará-lo no painel. As regras editam-se no Proxmox; o Monitor não as altera.", + "actionBarTitle": "Barra de ação inferior", + "actionBarIntro": "Sempre visível no pé do modal, independentemente da aba ativa:", + "consoleItem": "Consola, apenas em LXC ativos, abre pct enter <vmid> no contentor. Usa xterm.js e WebSocket como o separador Terminal, com a barra móvel: ESC, TAB, setas, Enter e Ctrl+C / Ctrl+X / Ctrl+R. Funciona em telemóvel ou tablet. Para VM use a consola Proxmox noVNC.", + "lifecycleIntro": "Quatro botões em grelha 2×2 enviam POST /api/vms/<vmid>/control com a action correspondente. A disponibilidade depende do estado do sistema.", + "headerButton": "Botão", + "headerEnabled": "Activado quando", + "headerAction": "Acção enviada para a máquina", + "lifecycleRows": [ + { + "button": "Iniciar", + "color": "green", + "enabled": "O hóspede está parado.", + "action": "qm start / pct start" + }, + { + "button": "Desligar", + "color": "blue", + "enabled": "O sistema convidado está em execução.", + "action": "qm shutdown / pct shutdown — desligamento ordenado, ACPI" + }, + { + "button": "Reiniciar", + "color": "blue", + "enabled": "O sistema convidado está em execução.", + "action": "qm reboot / pct reboot — reinício ordenado" + }, + { + "button": "Forçar parada", + "color": "red", + "enabled": "O sistema convidado está em execução.", + "action": "qm stop / pct stop — desligamento forçado" + } + ], + "forceStopTitle": "Forçar paragem interrompe imediatamente a execução", + "forceStopBody": "Forçar paragem ignora o desligamento, como cortar a alimentação. Use Desligar enquanto o sistema responder. Force apenas se o desligamento bloquear e aceitar o risco de perda de dados. O botão vermelho e a etiqueta ajudam a evitar cliques acidentais." + }, + "dataCollected": { + "heading": "Como os dados são coletados", + "headerSection": "Secção da página", + "headerEndpoint": "Endpoint", + "headerSource": "Origem", + "rows": [ + { + "section": "Lista de inventários", + "endpoint": "/api/vms", + "source": "pvesh get /cluster/resources --type vm para VMs e CTs." + }, + { + "section": "Painel de detalhes (configuração, rede, discos)", + "endpoint": "/api/vms/", + "source": "qm config <id> para VMs / pct config <id> para CTs." + }, + { + "section": "Gráfico de métricas do sistema convidado", + "endpoint": "/api/vms//metrics", + "source": "Dados PVE RRD (pvesh get /nodes/<node>/qemu/<id>/rrddata) condensados a uma forma amigável a gráficos." + }, + { + "section": "Resultados recentes do registo Proxmox", + "endpoint": "/api/vms//logs", + "source": "pvesh get /nodes/<node>/<qemu|lxc>/<vmid>/log --start 0 --limit 1000. Uma falha devolve uma lista vazia; não fornece todos os registos internos do sistema convidado." + }, + { + "section": "Backups disponíveis para hóspedes", + "endpoint": "/api/vms//backups", + "source": "pvesm list <storage> filtrado por VMID." + }, + { + "section": "Registo do firewall do sistema convidado (separador Firewall)", + "endpoint": "/api/vms//firewall/log", + "source": "/var/log/pve-firewall.log filtrado por VMID." + }, + { + "section": "Botões de energia (Iniciar / Parar / Reiniciar / Desligar)", + "endpoint": "/api/vms//control", + "source": "Equivalências qm start|stop|reboot|shutdown ou pct." + } + ], + "codeComment1": "# Comparar os dados do painel com PVE", + "codeComment2": "# Inspecionar a configuração do sistema como aparece na janela", + "codeComment3": "# VM", + "codeComment4": "# CT" + }, + "whereNext": { + "heading": "Para onde seguir", + "items": [ + { + "label": "Monitor de Saúde", + "href": "/docs/monitor/health-monitor", + "tailRich": " — a categoria VMs & Containers (boot falhado, tempo limite QMP, falhas de desligamento CT)." + }, + { + "label": "Notificações", + "href": "/docs/monitor/notifications", + "tailRich": " — o que os acontecimentos vm_*, ct_*, migration_* e backup_* provocam a jusante." + }, + { + "label": "Referência da API", + "href": "/docs/monitor/api", + "tailRich": " — endpoints de VM e cópias de segurança." + }, + { + "label": "Índice do painel", + "href": "/docs/monitor/dashboard", + "tailRich": " — os outros separadores." + }, + { + "label": "ProxMenux → Criar VM", + "href": "/docs/create-vm", + "tailRich": " — criação de sistemas: modelos NAS (Synology e outros), VM Linux/Windows e valores adaptados ao Proxmox." + } + ] + } +} diff --git a/web/messages/pt/docs/monitor/health-monitor.json b/web/messages/pt/docs/monitor/health-monitor.json new file mode 100644 index 00000000..50e331f3 --- /dev/null +++ b/web/messages/pt/docs/monitor/health-monitor.json @@ -0,0 +1,372 @@ +{ + "meta": { + "title": "Monitorização do Proxmox — CPU, memória, armazenamento, SMART, ZFS, registos | ProxMenux", + "description": "Monitorização proativa do Proxmox VE: dez categorias a cada cinco minutos (CPU e temperatura, memória e swap, armazenamento, discos/SMART, rede, VMs, serviços, registos, atualizações e segurança), quatro níveis de gravidade, supressão por categoria, limpeza dos erros resolvidos, histórico permanente de discos e notificações por Telegram, Discord, Gotify ou e-mail.", + "ogTitle": "Monitorização do Proxmox — CPU, memória, armazenamento, SMART, ZFS, registos", + "ogDescription": "Monitorização proativa do Proxmox VE em dez categorias, com níveis de gravidade, períodos de supressão e notificações por evento.", + "twitterTitle": "Monitor de Saúde Proxmox ProxMenux", + "twitterDescription": "Monitorização proativa do Proxmox VE em dez categorias, com níveis de gravidade e notificações." + }, + "header": { + "title": "Monitor de Saúde", + "description": "A verificação contínua analisa dez categorias do estado do anfitrião em ciclos de cinco minutos, recolhe medições entre ciclos, elimina ocorrências duplicadas e alimenta o painel, as notificações e a reformulação IA opcional a partir da mesma fonte.", + "section": "Monitor do ProxMenux" + }, + "intro": { + "title": "Um scanner, três consumidores", + "body": "Um processo em segundo plano executa o ciclo completo a cada cinco minutos e guarda cada ocorrência no SQLite com um error_key estável. Assim, (1) o painel apresenta o estado atual, (2) o sistema de notificações distribui novos eventos e (3) o assistente IA opcional reformula os alertas em linguagem simples. Uma única configuração alimenta todos estes componentes." + }, + "howItWorks": { + "heading": "Como funciona", + "intro": "A monitorização usa duas linhas de execução paralelas. Um módulo de recolha de métricas leve preenche os históricos de CPU, memória e temperatura. O ciclo completo de verificação lê esses dados, avalia condições prolongadas e executa as restantes verificações aproximadamente a cada cinco minutos, guardando depois as ocorrências no SQLite para o painel e as notificações.", + "scannerTitle": "Da amostra ao achado armazenado", + "scannerCaption": "O módulo preenche os históricos entre ciclos: CPU a cada 5 s, memória a cada 30 s e temperatura a cada 15 s. Não avalia os alertas. O ciclo completo analisa os históricos e verifica SMART, ZFS, registos e serviços antes de guardar as ocorrências no SQLite.", + "scannerArrowLabel": "passo", + "scannerNodes": { + "samplerLabel": "Recolha de métricas", + "samplerDetail": "Uso da CPU 5 s\nMemória 30 s\nTemperatura 15 s\n→ históricos", + "cycleLabel": "Ciclo completo de saúde", + "cycleDetail": "A cada 5 min\nLê os históricos\n+ verificações diretas\n(SMART, ZFS,\nserviços, registos…)", + "checksLabel": "Controlos por categoria", + "checksDetail": "Dez categorias\n(CPU, memória,\narmazenamento, discos,\nrede, VMs,\nserviços, registos,\natualizações, segurança)", + "sqliteLabel": "SQLite", + "sqliteDetail": "tabela errors\n(ativos +\nsuprimidos)\n+ disk_observations\n(histórico permanente\npor disco)" + }, + "notifTitle": "Do achado armazenado ao usuário", + "notifCaption": "O caminho da notificação. A mesma tabela de erros também impulsiona a visão do painel (listas ativa/descartada renderizadas ao vivo) e é consumida pela rotina de limpeza no final de cada ciclo para resolver automaticamente entradas antigas — ambas são executadas a partir dos mesmos dados sem passar pelo expedidor.", + "notifArrowLabel": "evento", + "notifNodes": { + "errorsLabel": "tabela de erros", + "errorsDetail": "Linhas ativas +\nsuprimidas\nidentificadas por\nerror_key", + "dispatcherLabel": "Enviador de notificações", + "dispatcherDetail": "Eventos novos +\nagravados em fila\nConforme opções\n+ intervalo mínimo", + "templatesLabel": "Modelos + reescrita de IA", + "templatesDetail": "Modelo\npor evento\n→ reformulação IA\nopcional em\nlinguagem simples", + "channelsLabel": "Canais", + "channelsDetail": "Telegram\nDiscord\nGotify\nCorreio eletrónico (SMTP)" + } + }, + "categories": { + "heading": "As dez categorias", + "imageAlt": "Visão Monitor de Saúde mostrando as dez categorias com seus status atuais (CPU, Memória, Armazenamento, Discos, Rede, VMs, Serviços, Logs, Atualizações, Segurança)", + "imageCaption": "Health Monitor view — as dez categorias com seu status atual. Categorias em um host saudável todas mostram OK; avisos e eventos críticos aparecem em linha com as linhas que os produziram.", + "intro": "Cada ciclo executa dez verificações independentes. Cada uma devolve um dos quatro estados (OK, INFO, WARNING, CRITICAL) e dados estruturados, como nomes de dispositivos, excertos de registos e limiares exatos, apresentados no painel e nas notificações.", + "headerCategory": "Categoria", + "headerChecks": "Verificações individuais", + "headerEvents": "Eventos típicos", + "rows": [ + { + "category": "CPU & Temperatura", + "checks": "Uso de CPU com histerese, temperatura do sensor", + "events": "Uso elevado e prolongado da CPU; avisos de temperatura baseados nas leituras recolhidas." + }, + { + "category": "Memória e swap", + "checks": "Utilização do RAM, utilização do swap", + "events": "Pressão prolongada sobre a memória; atividade do OOM-killer; esgotamento do swap." + }, + { + "category": "Armazenamento", + "checks": "Armazenamento do Proxmox, sistema de arquivos raiz", + "events": "Limiares de ocupação ultrapassados na raiz ou noutros sistemas de ficheiros monitorizados (85% aviso / 95% crítico por predefinição); exportação NFS indisponível; falha de autenticação CIFS; pool LVM-thin cheio." + }, + { + "category": "Discos e SMART", + "checks": "SMART, erros de E/S no dmesg, pools ZFS, LVM, erros do sistema de ficheiros", + "events": "Falha no estado SMART; setores realocados ou pendentes; erros de E/S ATA; pool ZFS DEGRADED / FAULTED; ext4 remontado só de leitura." + }, + { + "category": "Rede", + "checks": "Conectividade, estado de ligação, latência do gateway", + "events": "Bridge ou ligação agregada em baixo; gateway inacessível; picos de latência persistentes." + }, + { + "category": "VMs e contêineres", + "checks": "Comunicação QMP, arranque do VM, arranque do contentor", + "events": "Falha na inicialização do VM; falha no desligamento do CT; tempo- limite do socket do QMP; falta a configuração / disco após um clone." + }, + { + "category": "Serviços PVE", + "checks": "pveproxy, pvedaemon, pvestatd, pve-cluster, modo de cluster", + "events": "O serviço caiu; quórum de cluster perdido; o pmxcfs ficou preso." + }, + { + "category": "Registros do sistema", + "checks": "Erros persistentes, picos de erro, cascatas de erros, mensagens críticas do kernel", + "events": "Erros idênticos repetidos; explosão súbita de avisos (padrão cascata); BUG: / OOPS: / oom-killer em dmesg." + }, + { + "category": "Atualizações do sistema", + "checks": "Atualizações pendentes, atualizações de segurança, kernel / versão PVE, idade do sistema", + "events": "Atualizações de segurança ou do kernel em uso pendentes; sistema sem atualizar há muito tempo. O cabeçalho da vista geral apresenta Atualizar agora quando há atualizações. O botão executa todo o processo ProxMenux; ao fechar, atualiza o estado com ?refresh=1 sem esperar pelo ciclo seguinte." + }, + { + "category": "Segurança e Certificados", + "checks": "Tentativas de início de sessão, certificados a expirar, estado das jails Fail2Ban se instalado", + "events": "Falhas repetidas de autenticação SSH ou web; certificado PVE a expirar em menos de 30 dias; bloqueios Fail2Ban ativos." + } + ] + }, + "severity": { + "heading": "Modelo de gravidade", + "headerStatus": "Estado", + "headerColour": "Cor", + "headerMeaning": "Significado", + "headerNotification": "Notificação", + "rows": [ + { + "status": "OK", + "colour": "Verde", + "meaning": "Saudável. Não há resultados nesta categoria.", + "notification": "Silêncio." + }, + { + "status": "INFO", + "colour": "Azul", + "meaning": "Condição transitória ou já resolvida que vale a pena observar uma vez. Também usado para categorias que possuem apenas itens descartados restantes.", + "notification": "Opcional. Cada tipo de evento pode ser ativado ou desativado por canal." + }, + { + "status": "WARNING", + "colour": "Amarelo", + "meaning": "Atenção é necessária, mas o hospedeiro ainda está funcional. A causa não é trivial — leia os detalhes.", + "notification": "Enviada quando o tipo de evento está ativo no canal." + }, + { + "status": "CRITICAL", + "colour": "Vermelho", + "meaning": "Funcionalidade quebrada ou perda de dados possível. Acção necessária.", + "notification": "Enviada se o tipo de evento estiver ativo no canal. Um alerta de temperatura da CPU CRITICAL volta a ser emitido por segurança mesmo após ser silenciado." + } + ], + "infoNote": "Uma categoria OK com eventos ainda no período de supressão aparece como INFO, para recordar que há alertas silenciados.", + "unknownTitle": "UNKNOWN quando uma verificação não pode ser concluída", + "unknownBody": "Uma verificação indisponível devolve UNKNOWN; após três ciclos consecutivos é guardada uma ocorrência persistente. O painel mostra-a a amarelo. O estado global limita UNKNOWN a WARNING: uma verificação indisponível, por si só, não torna o anfitrião crítico." + }, + "dashboardView": { + "heading": "A visão do painel", + "intro": "A monitorização encontra-se no separador Vista geral. O indicador no cabeçalho (Saudável / Aviso / Crítico) abre uma janela com duas listas:", + "items": [ + "Ativos — categorias com ocorrências por resolver. Cada linha expande os controlos envolvidos, o texto original reason, o ID do dispositivo ou VM e, quando disponível, uma ligação para Armazenamento, Rede, VMs, Registos ou Hardware.", + "Suprimidos — alertas reconhecidos pelo utilizador ainda no período de supressão. Cada linha mostra o tempo restante e a duração escolhida. Ao terminar, sai desta lista; se a causa persistir e a categoria o permitir, volta aos Ativos." + ], + "pillTitle": "O indicador reflete a categoria mais grave", + "pillBody": "A cor do cabeçalho reflete a gravidade máxima: CRITICAL → vermelho, senão WARNING → amarelo, senão INFO → azul, senão verde. A mesma lógica controla o ponto do favicon e o distintivo PWA.", + "updateNowTitle": "Atualizar agora no cabeçalho Visão geral", + "updateNowBody1": "Se Atualizações do sistema indicar atualizações pendentes, surge Atualizar agora junto do indicador. A janela executa o fluxo de ProxMenux → Settings post-install Proxmox → Proxmox System Update: limpeza de repositórios, apt full-upgrade através de update-pve-safe.sh, reconstrução DKMS dos controladores geridos com um novo kernel, autoremove/autoclean e pedido de reinício se o kernel mudar. O progresso aparece em direto.", + "updateNowBody2": "No fim, fechar a janela chama GET /api/health/details?refresh=1 e invalida a cache do endpoint. As atualizações pendentes e a gravidade são recalculadas a partir do novo estado dos pacotes; o distintivo desaparece sem esperar pelo próximo ciclo. Se o anfitrião já estiver atualizado, o botão fica oculto." + }, + "dismiss": { + "heading": "Silenciar alertas e definir a duração da supressão", + "intro": "Alguns eventos persistem, como Atualizações do sistema: atualizações disponíveis até atualizar o anfitrião. Uma notificação a cada cinco minutos seria desnecessária. O botão Atualizar agora na vista geral resolve diretamente esse caso. Para os restantes casos ou atualizações adiadas, há dois mecanismos ligados de silenciamento:", + "step1": "Silenciar um evento na janela. O menu oferece 24 horas, 7 dias ou Permanentemente, independentemente da categoria. A escolha envia POST /api/health/acknowledge com error_key e suppression_hours (-1 para permanente). O evento passa aos suprimidos com a data acknowledged_at.", + "dropdownImageAlt": "Menu para silenciar um alerta: 24 horas, 7 dias ou permanentemente", + "dropdownImageCaption": "A duração escolhida aplica-se só a este alerta; sem escolha individual, usa-se o valor da categoria. Os alertas silenciados permanentemente têm uma etiqueta âmbar Permanente e normalmente não reaparecem. A temperatura crítica da CPU é a exceção descrita abaixo.", + "step2": "Duração da supressão por categoria. Em Definições → Monitorização, ou por POST /api/health/settings, cada uma das dez categorias tem uma duração predefinida usada sem escolha individual:", + "imageAlt": "Duração da supressão por categoria em Definições → Monitorização", + "imageCaption": "Um menu por categoria. Escolha uma duração maior para eventos repetitivos, como atualizações pendentes, e menor para os que pretende reavaliar depressa. As supressões ativas aparecem abaixo.", + "outro": "Durante a supressão, a verificação continua e atualiza last_seen, sem nova notificação. No fim, o ciclo seguinte reavalia a causa: o alerta pode voltar a ser emitido ou desaparecer se o problema estiver resolvido.", + "activeSuppressionsTitle": "Consultar e anular as supressões ativas", + "activeSuppressionsBody": "Os alertas silenciados, temporários ou permanentes, aparecem em Definições → Monitorização → Supressões ativas. Cada linha mostra identificador, categoria, gravidade, data e tempo restante. Reativar remove o reconhecimento para a próxima verificação. As supressões permanentes anulam-se aqui; as temporárias também podem terminar antes do prazo. Ative Editar, escolha as linhas (contorno verde e texto rasurado) e guarde. Cancelar limpa a seleção.", + "autoTitle": "Supressão automática ao alterar a duração", + "autoBody": "Escolher uma duração diferente das 24 h predefinidas tem um segundo efeito: as futuras ocorrências da categoria são guardadas já reconhecidas. Uma semana escolhida para os discos também vale para os novos alertas, sem os silenciar individualmente. Surgem diretamente nos suprimidos com a duração escolhida. As categorias mantidas em 24 h conservam o funcionamento habitual: as novas ocorrências ficam ativas até intervir.", + "tempTitle": "Exceção para temperatura da CPU CRITICAL", + "tempBody": "A persistência tem uma regra especial para Temperatura da CPU CRITICAL: esse registo ignora o reconhecimento anterior e a supressão automática. Isso não significa que todas as verificações de temperatura emitam um registo crítico ao ultrapassar um limiar configurado.", + "nonDismissableTitle": "Que ocorrências podem ser silenciadas?", + "nonDismissableBody": "A janela mostra Silenciar apenas se a verificação devolver explicitamente dismissable = true. Um valor falso ou ausente oculta o botão. A gravidade não determina esta permissão: várias verificações críticas permitem o reconhecimento. Os exemplos descrevem os dados atuais; silenciar um alerta não resolve a causa.", + "headerFinding": "Ocorrência", + "headerWhy": "Comportamento da supressão", + "rows": [ + { + "finding": "Temperatura da CPU: aviso / crítica", + "why": "O aviso baseado nas amostras de temperatura permite explicitamente a supressão. Uma regra separada ignora o reconhecimento se chegar um registo de temperatura da CPU com gravidade CRITICAL." + }, + { + "finding": "Espaço do sistema de arquivos crítico (montagem da raiz)", + "why": "As verificações de espaço permitem a supressão mesmo com ocupação crítica. Reconhecer o alerta não liberta espaço nem elimina o risco de falhas de escrita." + }, + { + "finding": "ZFS pool DEGRADED / FAULTED", + "why": "As verificações de capacidade dos pools ZFS permitem a supressão. As restantes ocorrências seguem o seu próprio indicador. Reconhecer não repara um pool degradado ou avariado." + }, + { + "finding": "Erros de E/S de disco com SMART FAILED", + "why": "As ocorrências de disco guardadas a partir do journal podem permitir a supressão. SMART FAILED continua a exigir investigação; o botão depende do indicador da verificação, não apenas do texto do alerta." + }, + { + "finding": "Interface de rede DOWN", + "why": "As verificações persistentes de interface DOWN permitem a supressão. Isso não restaura o bridge, o bond, a ligação física ou o acesso remoto." + }, + { + "finding": "E/S eventos em discos saudáveis (INFO)", + "why": "Os eventos ATA ou dmesg transitórios com SMART saudável podem ser informativos e resolver-se sozinhos. As linhas informativas podem não oferecer Silenciar; a verificação determina quando a condição está resolvida." + } + ], + "principle": "Use o botão apresentado na ocorrência concreta, sem deduzir a disponibilidade pela categoria ou gravidade. O reconhecimento controla a apresentação e as notificações. As verificações de recuperação e o histórico do disco são independentes." + }, + "autoresolve": { + "heading": "Resolução automática e limpeza", + "intro": "Muitos alertas devem desaparecer quando a causa termina: uma VM volta a arrancar, um disco foi retirado ou a temperatura regressa ao normal. A limpeza no fim de cada ciclo de cinco minutos aplica estas regras:", + "headerTrigger": "Acionador", + "headerAction": "Ação", + "rows": [ + { + "trigger": "Uso da CPU ou temperatura de volta ao normal.", + "action": "Marcado resolvido. Sai da lista Active." + }, + { + "trigger": "Pressão de memória de volta abaixo do limiar de aviso após um OOM / aviso de memória.", + "action": "Marcado resolvido." + }, + { + "trigger": "VM / CT referenciado pelo erro já não existe (qm status / pct status non-zero).", + "action": "Marcado resolvido como recurso removido." + }, + { + "trigger": "Disco referenciado pelo erro não mais presente em /dev/.", + "action": "Marcado resolvido como dispositivo removido. O histórico de observação permanente está preservado (ver secção seguinte)." + }, + { + "trigger": "Ocorrências do journal do sistema (categoria logs, entradas SMART, erros ATA ou E/S) quando termina o período de supressão.", + "action": "São removidas. Cada análise examina novas entradas do journal a partir desse momento; a mesma linha antiga não volta a ser emitida." + }, + { + "trigger": "Erros resolvidos com mais de sete dias.", + "action": "Excluído da base de dados para manter a tabela pequena. O histórico de notificação é independente e mantido por mais tempo." + } + ], + "permanentTitle": "Supressão permanente não significa resolução", + "permanentBody": "Uma duração por categoria de -1 (permanente) silencia futuros alertas dos itens reconhecidos, mas não ignora a resolução automática. Se a causa desaparecer, por remoção do recurso ou regresso abaixo do limiar, o item continua a ser limpo automaticamente." + }, + "observations": { + "heading": "Observações de discos — o histórico permanente", + "intro": "Os eventos de disco devem ser conservados. Um aviso SMART em /dev/sdh às 02:14 continua a ser relevante após terminar a sequência de erros de E/S e a resolução automática: o disco já tem antecedentes. A monitorização mantém por isso uma tabela permanente separada: disk_observations.", + "headerProperty": "Propriedade", + "headerErrors": "Tabela errors (Ativos)", + "headerObs": "Tabela disk_observations", + "rows": [ + { + "property": "Finalidade", + "errors": "Alimenta a vista do estado atual e o envio de notificações.", + "obs": "Trilha de auditoria permanente por disco." + }, + { + "property": "Resolver automaticamente", + "errors": "Sim — as linhas são limpas quando a condição desaparece.", + "obs": "Não — as entradas persistem para sempre, a menos que o usuário as descarte explicitamente." + }, + { + "property": "Chave de deduplicação", + "errors": "error_key (por exemplo smart_sdh).", + "obs": "(disk_registry_id, error_type, error_signature) com assinaturas estáveis sem dados voláteis." + }, + { + "property": "Onde mostrado", + "errors": "Janela de monitorização (listas Ativos / Suprimidos).", + "obs": "Cartão do disco no separador Armazenamento, com um indicador «X obs.» por disco." + }, + { + "property": "O que grava", + "errors": "O que quer que esteja a falhar.", + "obs": "Avisos SMART (setores, temperatura, CRC, autotestes falhados), erros de E/S (ATA / NVMe / dm), erros do sistema de ficheiros e eventos dos pools ZFS." + } + ], + "outro": "Um alerta pode desaparecer do painel e continuar no histórico do disco. Ao abrir o disco em Armazenamento, o cartão mostra o número de observações pendentes com datas, gravidade e mensagem original não processada. Isto ajuda a decidir se deve substituir a unidade.", + "renameTitle": "Renomeamentos entre dispositivos são mesclados automaticamente", + "renameBody": "Os discos podem surgir primeiro com nomes provisórios como ata8 ou nvme0n1p3. As observações são agrupadas pelo número de série conhecido: se um evento for registado como ata8 e o disco depois identificado como sdh, no ciclo seguinte as observações anteriores são associadas a sdh, mantendo o histórico unido." + }, + "notification": { + "heading": "De uma constatação a uma notificação", + "intro": "Cada erro ativo também é um candidato para o motor de notificação. O fluxo:", + "items": [ + "O scanner registra o achado com categoria + gravidade + detalhes estruturados.", + "Se o tipo de evento estiver ativo nas notificações globais e o canal não tiver silenciado a categoria, o evento entra na fila.", + "O motor de modelos produz título e corpo a partir dos dados estruturados. Se a reformulação IA estiver ativa, o par passa pelo fornecedor configurado para uma versão em linguagem simples.", + "O canal envia uma mensagem Telegram, um embed Discord, uma notificação push Gotify ou um e-mail. O resultado é guardado em notification_history.", + "Silenciar um alerta inicia o período de supressão. Novas deteções do mesmo error_key normalmente não geram notificações nem ficam automaticamente em fila para o fim do período. Mantém-se a exceção da temperatura crítica da CPU." + ], + "outro": "A configuração dos canais — token do bot Telegram, URLs de webhook, chaves IA, opções por evento e por canal — está em Notificações e Assistente de IA." + }, + "rest": { + "heading": "Endpoints REST", + "intro": "As ações da janela estão disponíveis pela API para scripts, painéis ou bots. Com a autenticação do Monitor ativa, é necessário um token Bearer válido, obtido no início de sessão ou no ecrã de tokens API. As alterações, como reconhecer alertas, guardar ou limpar erros órfãos, exigem full_admin; read_only recebe 403. Com autenticação desativada ou recusada, estes controlos permitem acesso sem token.", + "headerEndpoint": "Endpoint", + "headerMethod": "Método", + "headerUse": "Utilização", + "rows": [ + { + "endpoint": "/api/health", + "method": "GET", + "use": "Verificação leve que devolve JSON com status, timestamp e version. Serve para verificações de palavras-chave Uptime Kuma; com autenticação do Monitor ativa, o cliente tem de enviar um cabeçalho Bearer." + }, + { + "endpoint": "/api/health/status", + "method": "GET", + "use": "Estado global: um nível de gravidade e um resumo. Requer autenticação." + }, + { + "endpoint": "/api/health/details", + "method": "GET", + "use": "As dez categorias com os respetivos estados e os dados estruturados que os produziram." + }, + { + "endpoint": "/api/health/full", + "method": "GET", + "use": "Vista completa: categorias, erros ativos, suprimidos e definições personalizadas. Alimenta a janela numa só chamada e usa uma cache de seis minutos em segundo plano para responder rapidamente." + }, + { + "endpoint": "/api/health/active-errors", + "method": "GET", + "use": "Só a lista dos Activos. Filtrado por ?category=<name>." + }, + { + "endpoint": "/api/health/dismissed", + "method": "GET", + "use": "Apenas os suprimidos, com as horas restantes." + }, + { + "endpoint": "/api/health/acknowledge", + "method": "POST", + "use": "Corpo: '{'\"error_key\":\"smart_sdh\"'}'. Descarte um alerta com a janela configurada da categoria." + }, + { + "endpoint": "/api/health/settings", + "method": "GET / POST", + "use": "Ler ou guardar a duração da supressão por categoria." + }, + { + "endpoint": "/api/health/cleanup-orphans", + "method": "POST", + "use": "Limpeza manual de erros cujo dispositivo subjacente / VM se foi. Idempotente." + } + ], + "codeComment1": "# Obter o estado atual para um script", + "codeComment2": "# Rejeite um erro específico", + "codeComment3": "# Configura a supressão da categoria de discos para uma semana" + }, + "whereNext": { + "heading": "Para onde seguir", + "items": [ + { + "label": "Painel", + "href": "/docs/monitor/dashboard", + "tail": " — ponto de abertura da janela de monitorização na interface." + }, + { + "label": "Notificações", + "href": "/docs/monitor/notifications", + "tail": " — canais, opções por evento, reformulação IA e histórico." + }, + { + "label": "Assistente de IA", + "href": "/docs/monitor/ai-assistant", + "tail": " — fornecedor (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter), modo do prompt, detalhe por canal e idioma." + }, + { + "label": "Arquitetura", + "href": "/docs/monitor/architecture", + "tailRich": " — esquema SQLite (errors, disk_observations, events) e frequência das tarefas em segundo plano." + } + ] + } +} diff --git a/web/messages/pt/docs/monitor/index.json b/web/messages/pt/docs/monitor/index.json new file mode 100644 index 00000000..6c47b736 --- /dev/null +++ b/web/messages/pt/docs/monitor/index.json @@ -0,0 +1,151 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Painel da Web auto-hospedado para Proxmox VE | ProxMenux", + "description": "ProxMenux Monitor é um painel web auto-hospedado para Proxmox VE: métricas de host em tempo real, armazenamento e dados SMART, rede, VMs e contêineres, hardware, logs, um terminal web integrado, um Health Monitor proativo, notificações para Telegram / Discord / Email, um assistente de IA opcional, um REST API e integrações com ferramentas como Homepage e Home Assistant.", + "ogTitle": "ProxMenux Monitor — Painel da Web auto-hospedado para Proxmox VE", + "ogDescription": "Painel Proxmox VE em tempo real: métricas de host, armazenamento SMART, rede, VMs e contêineres, hardware, logs, terminal web, Health Monitor, notificações, assistente de IA, REST API.", + "twitterTitle": "ProxMenux Monitor | ProxMenux", + "twitterDescription": "Painel Proxmox VE auto-hospedado com Health Monitor, notificações, assistente de IA e REST API." + }, + "header": { + "title": "ProxMenux Monitor", + "description": "Um painel web Proxmox VE alojado no próprio host e distribuído como AppImage. Corre como serviço systemd único, escuta na porta TCP 8008 e serve API e interface no mesmo processo.", + "section": "ProxMenux Monitor" + }, + "atGlance": { + "title": "Resumo", + "body": "Único AppImage no host Proxmox → Flask backend (porta 8008) coletando dados ao vivo via psutil, pvesh, smartctl, journalctl → Painel Next.js servido no mesmo processo. Autenticação opcional (senha + 2FA), assistente de IA opcional, notificações opcionais, REST API para integrações." + }, + "hero": { + "alt": "ProxMenux Monitor painel — tela de visão geral do sistema com CPU, widgets de memória, temperatura e tempo de atividade", + "caption": "Tela de destino padrão: visão geral das métricas e do estado de integridade no nível do host." + }, + "coverage": { + "heading": "O que o painel cobre", + "intro": "Oito secções principais, cada uma com os seus endpoints API:", + "tableSection": "Seção", + "tableWhat": "O que mostra", + "sections": [ + { + "name": "Monitor de Saúde", + "description": "Alertas ativos e dispensados em CPU, memória, armazenamento, discos, rede, serviços, logs, VMs, atualizações e segurança. Aciona o mecanismo de notificação." + }, + { + "name": "Armazenamento", + "description": "Pools de armazenamento Proxmox, discos físicos (SATA / NVMe / USB), atributos SMART, estado dos pools ZFS, desgaste e vida útil, atividade E/S." + }, + { + "name": "Rede", + "description": "Todas as interfaces (físicas, ligações, pontes, OVS), IP/MAC/estado, gráficos RX/TX em tempo real, dados históricos de RRD por interface." + }, + { + "name": "VMs e contêineres", + "description": "Inventário VM/LXC com estado, recursos e tempo de atividade. Os detalhes mostram configuração, métricas históricas, transferência de registos Proxmox e ações iniciar/parar/reiniciar/desligar. Os registos dependem do endpoint Proxmox; não é um arquivo completo do sistema convidado." + }, + { + "name": "Hardware", + "description": "CPU modelo e topologia, layout de memória, dispositivos PCIe, lista GPU com driver e monitoramento em tempo real por slot (NVIDIA / Intel iGPU)." + }, + { + "name": "Registros e eventos", + "description": "journalctl ativo com filtros de gravidade/intervalo de tempo/palavra-chave, histórico de tarefas Proxmox, log de notificação, pacotes de log para download." + }, + { + "name": "Terminal", + "description": "Shell do host e consolas VM/CT suportadas no navegador via xterm.js e WebSockets. Segue a autenticação configurada: desativada ou recusada, permite sessões sem início de sessão a clientes com acesso de rede. Não implica auditoria de cada comando." + }, + { + "name": "Segurança", + "description": "Falhas de autenticação, estado das jails do Fail2Ban, bloqueios recentes e integração com a jail [proxmenux] do host." + } + ], + "footer": "Cada seção tem uma página de documentação dedicada em Painel na barra lateral." + }, + "howItRuns": { + "heading": "Como funciona", + "intro": "O ProxMenux Monitor é distribuído como uma AppImage autónoma. Uma única unidade systemd (proxmenux-monitor.service) inicia um processo Flask que:", + "bullets": [ + "Ouve em TCP 8008 no host (HTTP).", + "Serve o painel Next.js como ficheiros estáticos em / e a API em /api/* no mesmo processo.", + "Extrai dados ativos com ferramentas de host padrão: psutil, pvesh, smartctl, journalctl, zpool, ip, nvidia-smi, etc.", + "Persiste seu próprio estado em um banco de dados local SQLite (/usr/local/share/proxmenux/health_monitor.db): alertas descartados, observações de disco, configuração de notificação, configuração de IA. O estado de autenticação reside separadamente em /root/.config/proxmenux-monitor/auth.json." + ], + "footer": "O fluxo completo da solicitação, o layout do arquivo e a integração systemd estão descritos em Arquitetura." + }, + "noAgent": { + "title": "Nenhum agente nos convidados", + "body": "O Monitor recolhe todos os dados a partir do host. Não é necessário instalar agentes nas VM ou nos CT: os dados vêm da API do Proxmox e das informações que o kernel do host disponibiliza sobre os sistemas convidados em execução." + }, + "access": { + "heading": "Acessando o painel", + "intro": "Dois padrões de acesso são suportados e o aplicativo detecta qual deles está em uso:", + "codeComment1": "# 1) Acesso direto no host", + "codeComment2": "# 2) Via proxy reverso (Nginx/Caddy/Traefik)", + "afterCode": "O proxy inverso deve definir X-Forwarded-For, X-Forwarded-Proto e X-Forwarded-Host corretamente e encaminhar WebSockets. Nas portas padrão o navegador usa a origem atual. O backend só confia nos IPs encaminhados com PROXMENUX_TRUST_PROXY=1 explícito; restrinja o acesso direto ao backend ao ativá-lo.", + "footer": "Configuração de primeira inicialização, senha + TOTP 2FA e snippets de proxy reverso são abordados em Acesso e autenticação." + }, + "mobile": { + "heading": "Uso móvel e instalação na tela inicial", + "intro": "O painel é responsivo e vem como um Progressive Web App. O pacote public/manifest.json declara display: standalone com um nome de aplicativo, ícone e cor de tema, portanto, adicionar o URL à tela inicial produz um verdadeiro iniciador independente - sem barra de endereço do navegador, splash personalizado, tema escuro correspondente ao painel.", + "phoneAlt": "ProxMenux Monitor em execução em um telefone — visualização do painel principal", + "phoneCaption": "Painel principal em um telefone: o layout reflui para pequenas janelas de visualização.", + "addHeading": "Adicionar à tela inicial", + "iosLabel": "iOS Safari:", + "iosBody": "botão compartilhar → Adicionar à tela inicial. O ícone vem de /apple-touch-icon.png enviado no AppImage.", + "androidLabel": "Android Chrome/Edge:", + "androidBody": "menu de três pontos → Instalar aplicativo (ou Adicionar à tela inicial em versões mais antigas).", + "afterInstall": "Depois de instalado, abrir o ícone inicia o painel em modo independente com sua própria entrada no alternador de tarefas.", + "onlineOnlyTitle": "Requer ligação à rede", + "onlineOnlyBody": "A PWA pode ser instalada, mas não funciona offline: não inclui um service worker. O atalho comporta-se como uma aplicação nativa, mas o dispositivo tem de conseguir contactar o host através de TCP 8008, por LAN, VPN ou HTTPS com proxy inverso, para carregar o painel." + }, + "health": { + "heading": "Monitor de integridade e notificações", + "alt": "Tela do Health Monitor mostrando as categorias 10 rastreadas (CPU, memória, armazenamento, discos, rede, serviços, logs, VMs, atualizações, segurança) com status atual", + "caption": "Visualização do Health Monitor — as categorias 10 monitoradas, com seu status atual. Alertas ativos e dispensados aparecem aqui quando o sistema gera algum.", + "body1": "O Health Monitor corre em segundo plano e gera eventos estruturados: temperatura CPU elevada, avisos SMART, degradação dos pools ZFS, processos terminados por OOM, falhas VM/CT e incidentes de segurança. Cada evento tem categoria, gravidade (INFO / WARNING / CRITICAL) e error_key estável para agrupar duplicados sem encher o ecrã.", + "feedsIntro": "Os eventos alimentam três coisas ao mesmo tempo:", + "feedsHealth": "A visualização do Health Monitor no painel (listas ativas + dispensadas).", + "feedsChannels": "O mecanismo de notificação — Telegram, Discord, E-mail, Gotify, Pushover e Apprise (multicanal). Cada canal é configurado de forma independente e as categorias por evento podem ser silenciadas.", + "feedsAI": "O assistente de IA opcional — quando ativado, o provedor configurado (OpenAI, Anthropic, Gemini, Groq, Ollama ou OpenRouter) explica os eventos recebidos em linguagem simples e, se habilitado nas configurações de IA, propõe as próximas etapas.", + "suppressionTitle": "Supressão em vez de silenciar tudo", + "suppressionBody": "Cada categoria tem sua própria Duração de supressão: quando você dispensa um alerta, o mesmo alerta é silenciado para aquela janela (padrão 24 horas, configurável por categoria até permanente). Escalações reais - por ex. CPU temperatura ultrapassando o limite crítico — sempre aciona novamente, independentemente da supressão." + }, + "api": { + "heading": "REST API e integrações", + "intro": "Os endpoints REST expõem dados de monitorização JSON por HTTP/HTTPS para Homepage, Home Assistant, Uptime Kuma e scripts. Grafana pode usar o exportador de texto Prometheus separado em /api/prometheus. As chamadas podem usar curl.", + "tokens": "Tokens API de longa duração (365 dias) são gerados em Configurações → API Tokens de acesso ou via POST /api/auth/generate-api-token.", + "bearer": "Envie tokens com Authorization: Bearer …. O endpoint público /api/health serve a testes de disponibilidade sem credenciais. Em /api/auth/* existem rotas públicas de configuração/início/estado e rotas protegidas de contas e tokens; nem todas são anónimas.", + "catalog": "O catálogo de endpoints, rotação de tokens e segurança estão na Referência da API; exemplos para Homepage, Home Assistant, Grafana, Uptime Kuma e cURL estão em Integrações." + }, + "serviceControl": { + "heading": "Controle de serviço", + "intro": "Diariamente, o Monitor é gerenciado exatamente como qualquer outro serviço systemd. Ele também é exposto como duas entradas dentro da TUI ProxMenux em Configurações:", + "codeComment": "# Controle manual", + "footer": "Consulte Configurações → ProxMenux Monitor para alternar no menu e fluxo de verificação de status." + }, + "nextSteps": { + "heading": "Para onde ir", + "items": [ + { + "label": "Arquitetura", + "description": "— back-end Flask, unidade systemd, esquema SQLite, provedores de IA, canais de notificação." + }, + { + "label": "Acesso e autenticação", + "description": "— primeira inicialização, configuração de senha, TOTP 2FA, configuração de proxy reverso, integração Fail2Ban." + }, + { + "label": "Painel", + "description": "— cada secção da interface, uma página por secção." + }, + { + "label": "Referência da API", + "description": "— cada endpoint, formato de solicitação/resposta e gerenciamento de token." + }, + { + "label": "Integrações", + "description": "— Homepage, Home Assistant, Grafana / Prometheus, Uptime Kuma e padrão cURL genérico." + } + ] + } +} diff --git a/web/messages/pt/docs/monitor/integrations.json b/web/messages/pt/docs/monitor/integrations.json new file mode 100644 index 00000000..90bb0b37 --- /dev/null +++ b/web/messages/pt/docs/monitor/integrations.json @@ -0,0 +1,255 @@ +{ + "meta": { + "title": "Integrações Proxmox — Homepage, Home Assistant, Grafana, Prometheus | ProxMenux Monitor", + "description": "Exemplos para copiar e ligar o ProxMenux Monitor ao Homepage, Home Assistant, Grafana via Prometheus e Uptime Kuma, com a configuração necessária, endpoints API e cabeçalho de autenticação.", + "ogTitle": "Integrações Proxmox — Homepage, Home Assistant, Grafana, Prometheus", + "ogDescription": "Guia para ligar o ProxMenux Monitor ao Homepage, Home Assistant, Grafana, Prometheus e Uptime Kuma.", + "twitterTitle": "Integrações Proxmox | ProxMenux Monitor", + "twitterDescription": "Receitas para Homepage, Home Assistant, Grafana, Prometheus e Uptime Kuma." + }, + "header": { + "title": "Integrações", + "description": "Exemplos para copiar para as ferramentas do seu homelab: Homepage, Home Assistant, Grafana via Prometheus e Uptime Kuma. Cada exemplo mostra a configuração esperada, o endpoint do Monitor utilizado e o cabeçalho de autenticação necessário.", + "section": "Monitor do ProxMenux" + }, + "intro": { + "title": "O que você pode construir a partir desta página", + "body": "Copie cada exemplo para a ferramenta escolhida. Os endpoints estão na Referência da API; esta página explica como usá-los no Homepage, Home Assistant e Grafana. As imagens mostram o resultado das configurações." + }, + "auth": { + "heading": "Autenticação: a única coisa que cada receita precisa", + "intro": "A maioria dos endpoints usados por essas integrações são autenticados. Tem duas maneiras de satisfazer esse requisito.", + "optAtitle": "Opção A — API token (recomendado para integrações)", + "optAbody1": "Abra Definições → Segurança → Tokens API. Clique em Gerar token, dê-lhe um nome como homepage, home-assistant ou prometheus e copie-o: é apresentado uma única vez. Expira ao fim de um ano por predefinição e pode ser revogado individualmente. Use-o em clientes externos ao navegador.", + "optAbody2": "A partir desse ponto cada pedido é apenas:", + "optBtitle": "Opção B – fluxo de login (nome de usuário + senha)", + "optBbody": "Útil para scripts que autenticam como um usuário humano. O token retornado é de curta duração; a maioria das integrações deve preferir a Opção A.", + "outro": "O campo TOTP só é necessário com autenticação de dois fatores ativa. A rotação e revogação dos tokens, a política de palavras-passe e o registo de auditoria estão em Acesso e autenticação.", + "httpsTitle": "Usando HTTPS em vez de HTTP", + "httpsIntro": "Cada receita abaixo usa http:// nas URLs para manter os exemplos curtos. Se você ativou TLS no Monitor (Configurações → Segurança → SSL/HTTPS), troque http:// para https:// em cada URL — essa é a única mudança. Duas notas específicas para certos instrumentos:", + "httpsItems": [ + "Certificados autoassinados. A integração Home Assistant rest: verifica TLS por predefinição. Para um certificado autoassinado do Monitor, adicione verify_ssl: false a cada bloco REST junto de scan_interval:, ou importe a CA do Monitor para os certificados de confiança. O mesmo se aplica a outras ferramentas que verificam certificados.", + "Prometheus já inclui scheme: https no exemplo abaixo. Ative ou mantenha https se TLS estiver ativo no Monitor." + ] + }, + "homepage": { + "heading": "Homepage", + "headingHref": "https://gethomepage.dev", + "intro": "Homepage é um painel de aplicações estático e personalizável. O ProxMenux Monitor liga-se pelo widget integrado customapi: adicione um serviço a services.yaml, reinicie o Homepage e o cartão mostra valores atualizados.", + "iconCalloutTitle": "O logótipo oficial do ProxMenux está em dashboardicons.com", + "iconCalloutBody": "Os exemplos usam icon: proxmenux.png. O Homepage procura nomes simples em dashboardicons.com, uma biblioteca de ícones para painéis autoalojados. A entrada ProxMenux está em dashboardicons.com/icons/external/proxmenux e é carregada na primeira apresentação. Funciona para milhares de ferramentas como Telegram, Discord, Grafana e Tailscale: indique icon: <name>.png no serviço.", + "imageAlt": "Painel Homepage com três cartões ProxMenux Monitor (EDGE, VOID, DREAM), com tempo de funcionamento, CPU, RAM e temperatura de cada anfitrião", + "imageCaption": "Três instâncias ProxMenux Monitor como cartões Homepage: tempo de funcionamento, CPU, RAM e temperatura lidos de /api/system em cada anfitrião a cada 10 s.", + "basicTitle": "Elemento básico — sem autenticação", + "basicIntro": "Use isso quando o ProxMenux Monitor estiver em uma rede confiável e você ainda não tiver habilitado a autenticação no lado Monitor. A entrada services.yaml mais simples possível:", + "authedTitle": "Elemento autenticado", + "authedIntro": "Gere um token API em Configurações → Segurança → API Tokens no Monitor, copie-o e cole-o no cabeçalho Authorization abaixo — substitua o token de exemplo mostrado após Bearer pelo que você acabou de copiar:", + "authedOutro": "Reinicie o Homepage para apresentar valores atualizados. Reutilize o token nos widgets que consultam a mesma instância do Monitor.", + "multiTitle": "Configuração multi-widget — sistema, armazenamento, rede", + "multiIntro": "Para mais detalhes, crie três cartões com endpoints diferentes: sistema, armazenamento e rede. Use o mesmo token para esta instância do Monitor.", + "multiCalloutTitle": "Múltiplas máquinas Proxmox", + "multiCalloutBody": "Repita o bloco por anfitrião para obter os cartões mostrados. Cada entrada usa http://<host>:8008 da sua instância. Gere e guarde um token por anfitrião: cada instalação tem a sua chave de assinatura, pelo que um token não funciona automaticamente noutra." + }, + "homeAssistant": { + "heading": "Home Assistant", + "headingHref": "https://www.home-assistant.io", + "intro": "Os exemplos usam a integração rest do Home Assistant, sem componente HACS específico. Lê os endpoints da Referência da API e cria sensores e atributos para automações. A configuração fornece cerca de 25 sensores de recursos, estado, VMs/CTs, armazenamento, rede e atualizações. Adicione-a a configuration.yaml e recarregue ou reinicie o HA.", + "imageAlt": "Painel Home Assistant mostrando entidades ProxMenux Monitor — emblema de estado de saúde, CPU / RAM / medidores de temperatura, contagem de VM, uso de armazenamento e contador de erros ativos", + "imageCaption": "ProxMenux Monitor como integração Home Assistant de primeira classe — sensores construídos a partir da receita YAML abaixo.", + "step1Title": "1 · Guardar o token API", + "step1Body": "Guarde o token em secrets.yaml para o separar da configuração principal. Inclua o prefixo Bearer e o token num valor utilizável como cabeçalho. O ficheiro não é cifrado e também deve permanecer privado. A localização depende da instalação, normalmente /config/secrets.yaml em HA OS ou Container.", + "step2Title": "2 · Adicionar a configuração REST", + "step2Body": "Seis blocos REST cobrem as áreas principais. O scan_interval acompanha a frequência das alterações: recursos a cada 30 s, estado a cada 60 s, inventários a cada 5–10 min. Cole em configuration.yaml:", + "step3Title": "3 · Adicionar sensores binários e auxiliares de modelos", + "step3Body": "Dois sensores binários e dois sensores de modelo completam a integração, simplificando automações e cartões condicionais Lovelace sem repetir expressões Jinja em todo o lado.", + "step4Title": "4 · Recarregar e verificar", + "step4Body": "Verifique primeiro a sintaxe em Ferramentas de programador → YAML → Verificar configuração. Recarregue Toda a configuração YAML ou reinicie o HA. Em Definições → Dispositivos e serviços → Entidades, filtre por proxmenux. As cerca de 25 entidades deverão receber valores num intervalo de leitura.", + "replaceTitle": "Substituindo uma versão anterior desta receita?", + "replaceBody": "Após uma versão anterior, o registo pode conservar IDs obsoletos e os cartões mostrar Entidade não encontrada. Remova os blocos antigos rest: e template: de configuration.yaml e recarregue. Em Definições → Dispositivos e serviços → Entidades, filtre por proxmenux e remova as entradas antigas restauradas ou indisponíveis. Adicione o YAML atual e recarregue para registar as novas.", + "step5Title": "5 · Painel Lovelace", + "step5Body": "O YAML cria um cartão vertical-stack com logótipo, indicadores, sistema, VMs, armazenamento, rede e problemas condicionais. Abra o painel, escolha o lápis, Adicionar cartão e depois Manual no fundo, e cole:", + "viewTipTitle": "Quer como uma visão completa do painel em vez de uma única carta?", + "viewTipBody": "Abra o menu de três pontos → Editor de configuração em bruto e adicione uma vista com este cabeçalho acima da lista cards::", + "viewTipOutro": "Isso lhe dá uma guia/visão dedicada em seu painel com seu próprio ícone e título, em vez de uma carta longa em uma visão existente.", + "altViewTitle": "Alternativa — uma visão específica do painel", + "altViewIntro": "Para criar um separador num painel existente, adicione uma vista com o YAML abaixo. Uma vista é um separador do painel e não cria uma entrada na barra lateral. Passos:", + "altViewSteps": [ + "Abra o painel onde deseja a nova guia.", + "Clique no lápis (painel de edição) na parte superior direita.", + "Clique na aba + no final das abas existentes para criar uma nova visão.", + "Na janela, escolha Editor de código no canto superior direito para alternar entre o editor visual e YAML.", + "Colar o YAML abaixo.", + "Guarde. A vista ProxMenux Monitor aparece como separador no painel com os seus cartões." + ], + "twoEditorsTitle": "Dois editores YAML no HA — escolha o certo", + "twoEditorsIntro": "Home Assistant tem dois editores YAML que parecem semelhantes, mas esperam formatos diferentes:", + "twoEditorsItems": [ + "Editor de uma vista — por + ou Editar vista → Editor de código. Espera uma vista com title:, path: e cards: no nível superior, sem traço inicial.", + "Editor em bruto do painel completo — pelo menu de três pontos. Espera toda a lista views:, com cada vista como item iniciado por -." + ], + "twoEditorsOutro": "O formato errado pode criar uma Vista sem nome e cards: []. O YAML abaixo destina-se ao editor de uma vista; copie-o como está.", + "viewImageAlt": "Vista Home Assistant para o ProxMenux Monitor: cabeçalho picture-entity, indicadores glance e cartões de sistema, VMs, armazenamento e rede em várias colunas", + "viewImageCaption": "A vista ProxMenux Monitor num ecrã largo. A disposição Masonry organiza os cartões em colunas; o resultado depende do tipo de vista configurado.", + "twoColTipTitle": "Deseja um layout fixo de duas colunas em vez do layout automático?", + "twoColTipBody": "Agrupe dois cartões, como Sistema + VMs ou Armazenamento + Rede, num horizontal-stack para os apresentar lado a lado a qualquer largura:", + "twoColTipOutro": "No telemóvel, a linha continua comprimida. A disposição automática do HA sem horizontal-stack adapta-se melhor a ecrãs estreitos.", + "step6Title": "6 · Automação", + "step6Body": "Três automações para os cenários reativos mais comuns: substitua notify.mobile_app_<your_phone> pelo serviço de notificação que usa.", + "logoTitle": "Sobre o logotipo ProxMenux", + "logoBody": "O cartão picture-entity carrega o logótipo oficial de dashboardicons.com, uma biblioteca gratuita para painéis autoalojados. A entrada está em dashboardicons.com/icons/external/proxmenux. O Home Assistant obtém o SVG por HTTPS na primeira apresentação e guarda-o em cache.", + "logoBrokenTitle": "Se o cartão de logotipo mostrar uma imagem quebrada", + "logoBrokenIntro": "Algumas instalações HA (redes firewalled, bloqueadores de conteúdo, hosts sem internet pública) não podem alcançar jsdelivr.net no tempo de renderização. A correção é uma cópia local:", + "logoBrokenSteps": [ + "Baixar o SVG de cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/proxmenux.svg.", + "Salve-o em /config/www/icons/proxmenux.svg em seu host HA.", + "No Lovelace YAML, substitua o URL image: por /local/icons/proxmenux.svg. Salvar e recarregar — a imagem renderiza do arquivo local, sem necessidade de internet." + ], + "scanTipTitle": "Regra prática para scan_interval", + "scanTipBody": "Comece por consultar /api/system a cada 30 s. /api/health/full usa normalmente um resultado válido até seis minutos; consultar a cada 60 s não ignora essa cache. Experimente cinco minutos para /api/storage/summary e uma hora para /api/proxmenux/update-status. Adapte ao hardware e número de anfitriões." + }, + "grafana": { + "heading": "Prometheus + Grafana", + "promHref": "https://prometheus.io", + "grafanaHref": "https://grafana.com", + "intro": "O ProxMenux Monitor disponibiliza GET /api/prometheus no formato de texto Prometheus 0.0.4. Com autenticação ativa exige um token Bearer. Configure o Prometheus para recolher as métricas e o Grafana para visualizar a base de séries temporais.", + "imageAlt": "Painel Grafana com métricas ProxMenux: medidor CPU, série temporal da memória, número de VMs em execução e tráfego de rede", + "imageCaption": "Um painel Grafana com os dados ProxMenux recolhidos pelo Prometheus: CPU, memória, VMs em execução e tráfego de rede. O catálogo completo está em Referência da API → Métricas Prometheus.", + "step1Title": "1 · Adicionar a tarefa de recolha ao Prometheus", + "step1Body": "Passe o token API pelo bloco nativo authorization do Prometheus, que também permite credenciais num ficheiro.", + "step1After": "Recarregue o Prometheus com kill -HUP <PID> (substitua PID pelo ID do processo), systemctl reload prometheus se suportado ou docker compose restart prometheus no contentor. Em Status → Targets, proxmenux deverá passar a UP num intervalo. A etiqueta node=\"<hostname>\" distingue os anfitriões.", + "tokenTipTitle": "Guardar o token num ficheiro separado", + "tokenTipBody": "Em produção separe o token da configuração. Com credentials_file: /etc/prometheus/secrets/proxmenux.token, o Prometheus lê-o de um ficheiro com permissões 0600.", + "step2Title": "2 · Verificar a recolha com algumas consultas", + "step2Body": "Antes do Grafana, confirme que o Prometheus tem os dados. Abra http://<prometheus-host>:9090, escolha Query e execute uma destas consultas. Deverá obter valores atuais do anfitrião Proxmox:", + "headerQuery": "Consulta", + "headerConfirms": "O que confirma", + "verifyRows": [ + { + "query": "up{job=\"proxmenux\"}", + "confirms": "Devolve 1 se o Prometheus recolher corretamente os dados do Monitor, ou 0 se falhar. A verificação inicial mais rápida." + }, + { + "query": "proxmox_cpu_usage", + "confirms": "Utilização atual de CPU % da máquina Proxmox. Deve mudar se você atualizar a consulta com alguns segundos de intervalo." + }, + { + "query": "proxmox_vms_running", + "confirms": "Número de máquinas convidadas em execução. Compare com a interface do Proxmox." + }, + { + "query": "proxmox_uptime_seconds / 86400", + "confirms": "Tempo de funcionamento em dias. Deve corresponder ao valor que você verá em uptime no shell Proxmox." + } + ], + "calloutTitle": "Um 401 ao abrir diretamente o URL do endpoint pode ser normal", + "calloutBody": "Com autenticação ativa, a ligação em Status → Targets abre /api/prometheus no navegador sem o cabeçalho Bearer do Prometheus. A resposta pode conter '{'\"error\":\"Authentication required\"'}'. Verifique o verdadeiro State: UP do destino para confirmar a recolha pelo Prometheus.", + "step3Title": "3 · Adicionar o Prometheus como fonte de dados no Grafana", + "step3Body": "No Grafana, abra Connections → Data sources → Add new → Prometheus. Indique o URL, por exemplo http://prometheus.lan:9090, guarde e teste. Se o Prometheus exigir autenticação, configure-a aqui separadamente. O token do Monitor pertence à tarefa de recolha do Prometheus.", + "step4Title": "4 · Construir painéis com estas consultas PromQL", + "step4Body": "Uma seleção inicial das métricas habitualmente acompanhadas num anfitrião Proxmox:", + "headerPanel": "Ideia do painel", + "headerPromql": "Consulta do PromQL", + "panelRows": [ + { + "panel": "Medidor de utilização CPU por máquina", + "promql": "proxmox_cpu_usage" + }, + { + "panel": "Medidor de utilização da memória por máquina", + "promql": "proxmox_memory_usage_percent" + }, + { + "panel": "Memória usada e total (séries temporais)", + "promql": "proxmox_memory_used_bytes / 1024 / 1024 / 1024" + }, + { + "panel": "VMs/CTs em execução por anfitrião", + "promql": "proxmox_vms_running" + }, + { + "panel": "Temperatura da CPU", + "promql": "proxmox_cpu_temperature_celsius" + }, + { + "panel": "Tráfego de rede RX (bytes/s)", + "promql": "rate(proxmox_interface_bytes_received_total[5m])" + }, + { + "panel": "Transferência de rede TX (bytes/s)", + "promql": "rate(proxmox_interface_bytes_sent_total[5m])" + }, + { + "panel": "Média de carga (1m)", + "promql": "proxmox_load_average{period=\"1m\"}" + }, + { + "panel": "Espaço em disco usado % por ponto de montagem", + "promql": "proxmox_disk_usage_percent" + }, + { + "panel": "Carga da bateria UPS", + "promql": "proxmox_ups_battery_charge_percent" + }, + { + "panel": "Temperatura da GPU por slot", + "promql": "proxmox_gpu_temperature_celsius" + } + ], + "outro": "Adicione cada consulta como painel Grafana, com Stat para valores e Time series para tendências, e agrupe por categoria. Use node como variável do painel (Settings → Variables → New → Query → label_values(proxmox_cpu_usage, node)) para filtrar por anfitrião." + }, + "uptimeKuma": { + "heading": "Uptime Kuma e outras ferramentas de verificação de estado", + "href": "https://github.com/louislam/uptime-kuma", + "intro": "Para verificar uma palavra-chave, use GET /api/system-info. Esta rota não exige token e devolve nome, tempo de funcionamento e estado como healthy, warning ou critical. É pública, ao contrário dos endpoints detalhados protegidos.", + "kumaTitle": "Uptime Kuma — Monitor de palavras-chave HTTP", + "kumaSteps": [ + "Em Uptime Kuma, clique em + Adicionar Novo Monitor.", + "Tipo de monitor: HTTP(s) - Palavra-chave.", + "Nome amigável: ProxMenux Monitor — pve01.", + "URL: http://pve01.lan:8008/api/system-info.", + "Palavra-chave: healthy (o valor de health.status quando a máquina está OK).", + "Intervalo de verificação: 60 segundos são suficientes.", + "Guarde. A rota system-info não exige um cabeçalho Bearer." + ], + "healthchecksTitle": "healthchecks.io / pings de tarefas cron", + "healthchecksBody": "Uma tarefa cron pode consultar /api/system-info e testar .health.status == \"healthy\". Só após sucesso deve enviar um ping ao seu URL Healthchecks.io. O serviço recebe pings das tarefas; não consulta o Monitor. Um HTTP 2xx, por si só, não prova o bom estado do anfitrião.", + "richTitle": "Quer dados de saúde mais ricos", + "richBody": "Para o estado completo — dez categorias, erros ativos e suprimidos — use GET /api/health/full. Uma resposta contém os dados da janela do painel. Com autenticação ativa exige um token Bearer." + }, + "workflows": { + "heading": "n8n, Zapier e scripts personalizados", + "intro": "Workflows e scripts podem enviar notificações por POST para /api/notifications/send, por exemplo após falha CI ou tarefa demasiado longa. O envio direto ignora a fila e o intervalo entre impressões digitais dos eventos. Mantém a formatação, IA opcional e entrega por canal. Controle os duplicados na origem.", + "n8nBody": "No n8n use um nó HTTP Request com POST, o URL acima e o mesmo JSON do curl. Escolha credenciais genéricas Header Auth: nome Authorization e valor Bearer YOUR_API_TOKEN, substituindo o marcador. Ligue um agendamento, webhook ou outro nó para iniciar o pedido.", + "severityBody": "A gravidade usa INFO, WARNING ou CRITICAL em maiúsculas. O objeto data fornece contexto. A IA usa título e mensagem gerados e os enriquecimentos suportados; nem todos os campos entram necessariamente no prompt ou resultado. Veja Notificações → Catálogo de eventos." + }, + "pveWebhook": { + "heading": "Webhook nativo Proxmox VE (entrada)", + "intro1": "O sistema de notificações surgiu no PVE 8.1; os destinos webhook nativos exigem Proxmox VE 8.3 ou posterior. Ativar notificações nas definições tenta registar o Monitor como destino. Os avisos PVE encaminhados para lá, como relatórios de cópia ou replicação, entram no fluxo de envio. A configuração tem de estar disponível e permitir escrita.", + "intro2": "O funcionamento, o modelo enviado pelo PVE, as entradas em /etc/pve/notifications.cfg e o comportamento em cluster estão em Notificações → Integração do webhook PVE." + }, + "whereNext": { + "heading": "Para onde seguir", + "items": [ + { + "label": "Referência da API", + "href": "/docs/monitor/api", + "tail": " — endpoints com método, caminho e catálogo completo de métricas Prometheus." + }, + { + "label": "Notificações", + "href": "/docs/monitor/notifications", + "tail": " — fontes de eventos, canais, processo de envio e integração do webhook PVE." + }, + { + "label": "Assistente de IA", + "href": "/docs/monitor/ai-assistant", + "tail": " — reformulação opcional dos modelos em linguagem simples antes do envio para Telegram, Discord, e-mail ou Gotify." + }, + { + "label": "Acesso e autenticação", + "href": "/docs/monitor/access-auth", + "tail": " — criação e revogação dos tokens API destes exemplos, registo de auditoria e configuração TLS." + } + ] + } +} diff --git a/web/messages/pt/docs/monitor/notifications.json b/web/messages/pt/docs/monitor/notifications.json new file mode 100644 index 00000000..7ebaf342 --- /dev/null +++ b/web/messages/pt/docs/monitor/notifications.json @@ -0,0 +1,535 @@ +{ + "meta": { + "title": "Notificações Proxmox — Telegram, Discord, E-mail, Gotify, Pushover, Apprise | ProxMenux Monitor", + "description": "Envie notificações Proxmox VE por Telegram, Discord, email, Gotify, Pushover e cerca de 80 serviços Apprise. O Monitor reúne eventos de saúde, registo do sistema e webhook PVE, com deduplicação, intervalos entre envios, resumos, reescrita IA opcional e histórico.", + "ogTitle": "Notificações Proxmox — Telegram, Discord, e-mail, Gotify, Pushover, Apprise", + "ogDescription": "Alertas Proxmox VE nos seis canais, com serviços adicionais Apprise, deduplicação, intervalos entre envios, agregação e reescrita IA opcional.", + "twitterTitle": "Notificações Proxmox | ProxMenux Monitor", + "twitterDescription": "Envie alertas Proxmox VE para Telegram, Discord, Email, Gotify, Pushover e ~80 serviços extras via Apprise." + }, + "header": { + "title": "Notificações", + "description": "Distribui os eventos recolhidos pelo Monitor pelos canais configurados: Telegram, Discord, email, Gotify, Pushover e cerca de 80 serviços via Apprise. Inclui deduplicação, intervalos entre envios, agregação de eventos próximos, filtros por evento e canal, reescrita IA opcional e histórico consultável.", + "section": "ProxMenux Monitor" + }, + "intro": { + "title": "De onde vêm as mensagens", + "body": "As notificações usam os eventos já produzidos pelo Health Monitor, monitores do registo e tarefas Proxmox, webhook PVE, verificações periódicas e scripts ProxMenux. Não fazem uma análise separada: os eventos passam pelo mesmo processo de envio aos canais configurados." + }, + "howItWorks": { + "heading": "Como funciona", + "intro": "Coletores independentes produzem eventos estruturados. O processo de envio decide se os envia e em que formato; pode reescrevê-los com um LLM e distribui-os pelos canais configurados.", + "arrowLabel": "evento", + "caption": "Cada tentativa efetiva de envio, bem-sucedida ou falhada, fica no histórico SQLite. Um grupo agregado surge como uma entrada; os eventos suprimidos pelo intervalo entre envios não são registados.", + "nodes": { + "sourcesLabel": "Fontes", + "sourcesDetail": "Health Monitor\nMonitor do registo\nMonitor de tarefas\nWebhook PVE\nVerificações periódicas\nEventos internos", + "dispatchLabel": "Processo de envio", + "dispatchDetail": "Agregação de eventos próximos\nVerificações de assinatura/intervalo\nLimites de frequência por grupo\nControlos por canal", + "aiLabel": "Reescrita com IA (opcional)", + "aiDetail": "OpenAI / Anthropic\nGemini / Groq\nOpenRouter / Ollama\n(desativada por predefinição)", + "channelsLabel": "Canais", + "channelsDetail": "Telegram\nDiscord\nE-mail (SMTP)\nGotify\nPushover\nApprise (~80 serviços)" + } + }, + "enabling": { + "heading": "Habilitando o painel", + "intro": "Numa instalação nova, o cartão Notificações nas Definições mostra Desativadas e o botão Ativar notificações. Até o premir não envia mensagens nem altera a configuração PVE.", + "disabledAlt": "Cartão Notificações desativado com botão para ativar", + "disabledCaption": "O primeiro estado — um clique para habilitar.", + "stepsIntro": "Pressionar o botão faz três coisas em sequência:", + "steps": [ + "Passa ao estado Ativas e mostra o formulário dos canais.", + "Regista o destino webhook em /etc/pve/notifications.cfg. Sem HTTPS usa POST http://127.0.0.1:8008/api/notifications/webhook; com HTTPS usa o listener HTTP local separado na porta 8009. As notificações PVE entram assim no processo do Monitor. Veja Integração webhook PVE.", + "Inicia o thread de envio em segundo plano, que lê a fila e processa os eventos." + ], + "activeAlt": "Notificações ativas: separadores dos canais, nome apresentado e secção expansível de reescrita IA", + "activeCaption": "Estado ativo: separadores Telegram, Gotify, Discord, email, Pushover e Apprise, nome apresentado, categorias por canal e secção Avançadas: melhoria IA." + }, + "sources": { + "heading": "Fontes de eventos", + "intro": "Seis tipos de fontes alimentam as notificações: coletores em segundo plano, recetor webhook e eventos internos do processo. Produzem objetos NotificationEvent estruturados.", + "headerCollector": "Coletor", + "headerWatches": "O que monitoriza", + "headerEvents": "Eventos típicos", + "rows": [ + { + "collector": "Monitor de Saúde", + "watches": "Dez categorias, cada 5 minutos", + "events": "new_error, error_resolved, error_escalated, health_degraded, health_persistent." + }, + { + "collector": "Monitor do registo do sistema", + "watches": "Segue journalctl --follow e reconhece falhas de autenticação SSH/web, bloqueios Fail2Ban se a jail estiver instalada, erros de E/S, OOM e eventos smartd.", + "events": "auth_fail, ip_block, oom_kill, disk_io_error, service_fail." + }, + { + "collector": "Monitor de tarefas", + "watches": "Consulta /var/log/pve/tasks/index para encontrar novos UPID e acompanha os respetivos ficheiros de registo.", + "events": "backup_start, backup_complete, backup_warning, backup_fail, migration_*, snapshot_complete." + }, + { + "collector": "Webhook Proxmox", + "watches": "Recebe POST /api/notifications/webhook. Versões PVE com destinos webhook podem encaminhar notificações após a configuração; veja abaixo.", + "events": "Qualquer coisa que PVE emite – incluindo eventos que o Monitor perderia (HA, replicação, vzdump da GUI)." + }, + { + "collector": "Colector de sondagem", + "watches": "Comparações periódicas: nós do cluster disponíveis, validade de certificados, atribuição GPU e atualizações PVE/ProxMenux.", + "events": "node_disconnect, node_reconnect, pve_update, proxmenux_update, gpu_mode_switch, pci_passthrough_conflict." + }, + { + "collector": "Emissores em processo", + "watches": "Chamadas diretas de ProxMenux scripts e do próprio Monitor (notification_manager.emit_event(...)).", + "events": "system_startup, system_shutdown, system_reboot, ai_model_migrated, eventos de teste personalizados." + } + ], + "after1": "Cada evento tem event_type estável, severity (INFO, WARNING, CRITICAL), category para emojis e filtros e dados data para o modelo, como vmid, device, source_ip e reason.", + "after2": "O modelo de cada event_type em notification_templates.py produz o texto enviado. A reescrita IA opcional usa esse texto. A página Assistente IA explica a relação entre modelo e reescrita." + }, + "channels": { + "heading": "Configuração dos canais", + "intro": "Atualmente são suportados seis canais: Telegram, Discord, Gotify, Email (SMTP), Pushover e Apprise. Os cinco primeiros são integrações nativas com seus próprios campos de configuração. Apprise é um hub genérico que adiciona em torno de 80 serviços adicionais (ntfy, Matrix, Slack, Teams, Pushbullet, AWS SNS, Mattermost...) através de um único campo URL. Todos eles estão documentados passo a passo abaixo.", + "credsTitle": "Onde ficam guardadas as credenciais", + "credsBody": "Tokens, chaves, webhook URLs e senhas SMTP são armazenados localmente no banco de dados SQLite do Monitor em /usr/local/share/proxmenux/. Valores sensíveis são protegidos e mascarados na interface. Eles nunca saem do anfitrião, exceto para chegar aos seus respectivos serviços. Um backup desse diretório é suficiente para recuperar os canais configurados." + }, + "telegram": { + "heading": "Telegram", + "intro": "Precisa de um token do bot, reutilizável entre conversas, e um ID da conversa, que identifica conversa privada, grupo ou supergrupo. O guia integrado explica os passos; seguem os formatos de destino.", + "guideAlt": "Guia de Configuração de Bots Telegram com quatro seções numeradas: Criar um Bot com BotFather, Obter o Token Bot, Obter o ID de Chat e Para Grupos ou Canais", + "guideCaption": "O link + guia de configuração no separador Telegram abre a janela com quatro passos para configurar o canal.", + "step1Title": "1 · Criar um bot com BotFather", + "step1Items": [ + "Abra o Telegram e inicie uma conversa com o @BotFather (aquele com o tique azul de verificação – as cópias são comuns).", + "Enviar /newbot.", + "Escolha um nome de exibição (por exemplo: ProxMenux Lab). Pode ser mudado mais tarde.", + "Escolha um nome de utilizador único no Telegram que termine em bot, por exemplo proxmenux_lab_bot.", + "O BotFather responde com o token, por exemplo 123456789:ABCdef…. Trate-o como uma palavra-passe." + ], + "step2Title": "2 · Obter o ID do Chat", + "step2Intro": "O ID da conversa indica onde o bot envia. O formato depende do destino.", + "privateLabel": "Conversa privada (você recebe os alertas em sua própria conta):", + "privateItems": [ + "Inicie uma conversa com seu novo bot e envie qualquer mensagem (por exemplo: /start).", + "Abra uma conversa com @userinfobot (ou @myidbot) e envie /start. Ele responde com o seu ID de usuário numérico — que é o ID do Chat. É um número positivo." + ], + "privateAlt": "Formulário Telegram com token oculto, ID da conversa positivo e ID do tópico opcional vazio", + "privateCaption": "Conversa privada com o bot — Chat ID é um número positivo (seu ID de usuário pessoal).", + "groupLabel": "Grupo ou supergrupo com tópicos:", + "groupItems": [ + "Adicione o bot ao grupo como membro (e torne-o administrador se o grupo exigir que ele publique).", + "Envie qualquer mensagem no grupo.", + "Abra https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates em um navegador. Procure chat.id na resposta JSON — para grupos é um número negativo, para supergrupos começa com -100.", + "Nos supergrupos com Tópicos, anote também o message_thread_id do destino e coloque-o no campo opcional ID do tópico." + ], + "groupAlt": "Formulário Telegram para supergrupo: token oculto, ID da conversa negativo com prefixo -100 e ID do tópico 3", + "groupCaption": "Supergrupo: o ID da conversa começa por -100…; ID do tópico seleciona uma conversa específica.", + "step3Title": "3 · Salvar e testar", + "step3Body": "Introduza token e ID da conversa, guarde e prima Enviar teste. Se não chegar, consulte o histórico: token inválido, bot ausente do grupo ou bloqueado, etc." + }, + "discord": { + "heading": "Discord", + "intro": "Os canais Discord aceitam mensagens recebidas através de um Webhook URL ligado a um único canal. O Monitor precisa dessa URL e nada mais.", + "items": [ + "No Discord abra o servidor e vá a Definições do servidor → Integrações → Webhooks.", + "Prima Novo webhook, atribua um nome como ProxMenux e escolha o canal. O avatar é opcional.", + "Prima Copiar URL do webhook: o formato é https://discord.com/api/webhooks/<id>/<token>.", + "Colar no campo de URL Webhook da aba Discord no painel Notificações e salvar." + ], + "imageAlt": "Forma de canal Discord com campo de URL Webhook começando com https://discord.com/api/webhooks/", + "imageCaption": "Discord: copie o URL em Definições do servidor → Integrações → Webhooks." + }, + "gotify": { + "heading": "Gotify", + "intro": "Gotify é um servidor de notificações push alojado por si. Precisa do URL e de um token da aplicação gerado na interface de administração.", + "items": [ + "Se você ainda não tiver uma instância Gotify, instale uma — veja o guia de instalação oficial.", + "Entre no Gotify como administrador, abra Aplicações → Criar aplicação, dê-lhe o nome ProxMenux e copie o token.", + "Na aba Gotify do painel Notificações, defina Server URL para o URL base de sua instância (por exemplo. https://gotify.example.com) e colar o App Token.", + "Guarde e prima Enviar teste." + ], + "imageAlt": "Formulário de canal Gotify com campo URL do servidor definido para https://gotify.example.com e um campo Token App com placeholder A_valid_gotify_token", + "imageCaption": "Gotify — URL do servidor da sua instância self-hosted mais o Token App da interface de administração Gotify." + }, + "email": { + "heading": "Correio eletrónico (SMTP)", + "intro": "Para email precisa de servidor SMTP, porta, modo TLS, eventuais credenciais, endereço do remetente e pelo menos um destinatário.", + "imageAlt": "Formulário email: servidor SMTP, porta, TLS, utilizador, palavra-passe, remetente, destinatários separados por vírgulas e prefixo do assunto", + "imageCaption": "Configure servidor SMTP, porta e TLS, eventuais credenciais, remetente, destinatários separados por vírgulas e prefixo do assunto para filtrar alertas.", + "appNote": "O Monitor usa autenticação SMTP por palavra-passe. Gmail pode exigir uma palavra-passe de aplicação. Na Microsoft depende do serviço e política do tenant: essa credencial não contorna o bloqueio da autenticação Basic. Verifique o método permitido.", + "gmailTitle": "Senha do aplicativo do Gmail", + "gmailIntro": "As palavras-passe de aplicação Gmail exigem verificação em dois passos ativa. Sem isso, a página Palavras-passe de aplicações não está disponível.", + "gmailItems": [ + "Abra myaccount.google.com/security e ative Verificação em dois passos.", + "Vá para myaccount.google.com/apppasswords.", + "Introduza um nome, por exemplo ProxMenux, prima Criar e copie a palavra-passe de 16 caracteres.", + "Defina Servidor smtp.gmail.com, Porta 587, Modo TLS STARTTLS, Utilizador com o endereço Gmail e Palavra-passe com os 16 caracteres gerados." + ], + "outlookTitle": "Senha do aplicativo Microsoft / Outlook", + "outlookIntro": "Microsoft exige verificação em dois passos para palavras-passe de aplicação, mas isso não garante compatibilidade SMTP. Se o serviço ou tenant exigir OAuth2, o cliente SMTP do Monitor baseado em palavra-passe não consegue autenticar-se. Use um relay com a autenticação exigida a montante.", + "outlookItems": [ + "Abra o account.microsoft.com/security e habilite a verificação em duas etapas.", + "Se disponível, abra Opções de segurança avançadas → Palavras-passe de aplicações → Criar nova palavra-passe de aplicação. A sua existência não prova que o serviço aceite SMTP por palavra-passe.", + "Se Microsoft gerar uma palavra-passe de aplicação, copie-a e verifique se o serviço SMTP a aceita.", + "Só se SMTP por palavra-passe for permitido, use os parâmetros aprovados: Servidor smtp.office365.com para Exchange Online, Porta 587, Modo TLS STARTTLS, Utilizador com o endereço email e Palavra-passe com a credencial permitida. Outlook.com pessoal tem requisitos diferentes; não presuma que funcione." + ], + "relayTitle": "Relay SMTP gerido por si", + "relayBody": "Pode usar um relay SMTP sob o seu controlo, como Postfix, que trate da autenticação a montante. Configure credenciais e TLS do Monitor conforme o relay: usar um relay local não desativa por si só a encriptação." + }, + "pushover": { + "heading": "Pushover", + "intro": "Pushover é um serviço de push móvel com aplicativos oficiais para iOS, Android e navegadores de desktop. O canal ProxMenux dedicado fala diretamente com o Pushover API, então não é necessário nenhum URL Apprise.", + "stepsTitle": "Configurar", + "steps": [ + "Crie uma conta Pushover, instale o aplicativo oficial nos dispositivos que devem receber alertas e iniciar sessão.", + "Copie a chave de utilizador do painel Pushover. Use uma chave de grupo se várias pessoas ou dispositivos precisarem do mesmo alerta.", + "Abra Criar aplicação/token API, crie ProxMenux e copie o token API de 30 caracteres.", + "Em Definições → Notificações → Pushover introduza chave de utilizador/grupo e token API. Dispositivo e som são opcionais.", + "Guarde e prima Enviar teste. Verifique a receção na aplicação Pushover." + ], + "priorityTitle": "Correspondência de prioridades", + "priorityBody": "Normalmente usa prioridade Pushover 0. Com Alta prioridade para alertas críticos, eventos CRITICAL usam 1 e ultrapassam o silêncio configurado pelo utilizador no Pushover. Não usa prioridade de emergência 2, que exigiria repetições e confirmação de receção.", + "secretTitle": "Proteger ambos os valores", + "secretBody": "A chave de utilizador/grupo e o token API autorizam ambos os envios. O ProxMenux protege-os e oculta-os na interface; não os publique em capturas ou registos de suporte." + }, + "apprise": { + "heading": "Apprise: acesso a cerca de 80 serviços", + "intro": "Apprise é uma biblioteca de código aberto que integra cerca de 80 serviços por URL. O canal permite chegar a ntfy, Matrix, Slack, Microsoft Teams, Mattermost, Pushbullet, AWS SNS, Pushsafer, Rocket.Chat, Signal API e outros sem integração ProxMenux dedicada. Também suporta Pushover, cuja configuração nativa é mais simples para um único destino.", + "listIntro": "A lista completa de serviços suportados e o formato exato de URL para cada um está disponível na documentação oficial Apprise:", + "listItems": [ + "Documentação dos serviços Apprise: índice completo dos serviços suportados.", + "Noções básicas dos URL: estrutura dos URL Apprise." + ], + "stepsTitle": "Passos", + "steps": [ + "Escolha o serviço na wiki Apprise e copie o seu modelo URL. A página indica esquema (ntfy://, matrix://, pover://, slack://…), tokens, canais e nomes de anfitrião necessários.", + "Preencha os placeholders com suas próprias credenciais. Por exemplo, um tópico ntfy.sh se parece com ntfy://ntfy.sh/my-topic; uma URL Pushover parece com pover://user@token; uma URL Matrix parece com matrix://user:pass@host:port/#room.", + "Colar o URL final no campo Apprise URL na aba Apprise do painel Notificações e salvar.", + "Prima Enviar teste para verificar ligação e credenciais." + ], + "deliveredTitle": "O que é entregue", + "deliveredBody": "Apprise recebe título, texto e gravidade (info/success/warning/failure), convertida no formato do serviço: ícone, prioridade ou cor. Formatação e reescrita IA ocorrem antes do envio, como nos outros canais.", + "fanoutTitle": "Um URL por canal Apprise", + "fanoutBody": "O Monitor aceita um URL Apprise. Para distribuir por vários serviços, como ntfy.sh e Matrix, pode usar um servidor API Apprise com configuração por etiquetas: o Monitor chama o endpoint e o servidor distribui pelos destinos da etiqueta." + }, + "rich": { + "heading": "Mensagens formatadas, categorias e filtros por canal", + "intro": "Cada canal oferece Mensagens formatadas, onze Categorias de notificação expansíveis com opções por evento e Enviar teste no fim.", + "imageAlt": "Categorias de notificação com formatação, grupos VM/CT, cópias de segurança, recursos, armazenamento, rede, segurança, cluster, serviços, Health Monitor e atualizações, contadores e botão de teste", + "imageCaption": "A seta indica Mensagens formatadas do canal. Abaixo ficam onze categorias com opções por evento e Enviar teste.", + "richTitle": "Mensagens formatadas", + "richIntro": "Com Mensagens formatadas, o título inclui o emoji da categoria e o texto usa a formatação do canal, como HTML Telegram ou bloco Discord com cor da gravidade. Ao desativar envia o mesmo conteúdo em texto simples.", + "plainHeader": "Texto simples: formatação desativada", + "richHeader": "Formatado: formatação ativa", + "richOutro": "A opção é independente por canal: por exemplo email simples e Telegram/Discord formatados. Canais sem formatação em linha, como email simples e Gotify, recebem texto de qualquer modo.", + "togglesTitle": "Categorias por evento", + "togglesIntro": "Cada canal controla categorias e eventos individualmente. Desativar uma categoria suprime os seus eventos nesse canal; as opções individuais aplicam-se nas categorias ativas. Não existe um filtro global principal de eventos no processo de envio.", + "togglesItems": [ + "Categoria por canal. Desativar VM/CT suprime vm_start e eventos relacionados nesse canal. As preferências ficam em <channel>.events.<group>.", + "Evento por canal. Numa categoria ativa pode enviar backup_complete para Discord mas não Telegram. A preferência fica em <channel>.event.<event_type>." + ], + "togglesOutro": "Cada categoria mostra eventos ativos/totais e uma opção para os ativar ou desativar em conjunto, como cópias info ou atualizações, sem expandir a secção." + }, + "quiet": { + "heading": "Horário de silêncio", + "intro": "Nesta faixa horária do canal só passam imediatamente eventos CRITICAL. INFO, WARNING e ações são guardados e enviados num resumo no fim da faixa.", + "imageAlt": "Definições do canal: silêncio 22:00–07:00 com previsão da transição e resumo diário às 09:00; a nota sobre CRITICAL/WARNING refere-se ao resumo", + "imageCaption": "Horário de silêncio em cima e resumo diário em baixo, independentes por canal.", + "purposeTitle": "Para que serve", + "purposeItems": [ + "Sem avisos de atualização às 03:00. O horário de silêncio adia notificações INFO, como cópias bem-sucedidas e atualizações.", + "As urgências continuam imediatas. Só os eventos efetivamente CRITICAL ultrapassam o silêncio. O nome não basta: o monitor do registo emite bloqueios Fail2Ban e avisos de encerramento/reinício como INFO, pelo que podem aguardar.", + "As mensagens ficam guardadas. Os eventos adiados permanecem no buffer SQLite até ao fim da faixa." + ], + "howTitle": "Como funciona", + "howItems": [ + "Opção por canal. Telegram pode ficar silencioso 22:00–07:00 enquanto o email continua a enviar 24/7.", + "Hora inicial e final no fuso horário local: início incluído e fim excluído. Pode atravessar a meia-noite, por exemplo 22:00–07:00.", + "Pré-visualização em tempo real: mostra se a faixa está ativa e quando mudará de estado.", + "Durante a faixa: CRITICAL segue o envio normal. INFO e WARNING ficam no buffer persistente quiet_pending do SQLite.", + "Quando a janela fecha: uma única notificação agrupada é enviada com tudo o que se acumula — uma linha por evento buffered, em ordem cronológica. O buffer é limpo apenas após o canal confirmar a entrega, então uma parada transitória Telegram / SMTP não perde o contexto da noite.", + "Após reiniciar. O buffer permanece no disco. Se o Monitor regressar depois do fim da faixa, o ciclo seguinte recupera as entradas pendentes num resumo." + ], + "criticalTitle": "Que eventos são CRITICAL", + "criticalBody": "A fonte define a gravidade de cada evento. Um evento de disco, encerramento ou segurança não é automaticamente CRITICAL. O monitor do registo emite ip_block, system_shutdown e system_reboot como INFO. O Catálogo de eventos lista os tipos; verifique a gravidade efetiva no evento recebido e no produtor." + }, + "digest": { + "heading": "Resumo diário de eventos INFO", + "intro1": "O resumo diário é opcional: reúne eventos INFO elegíveis, como atualizações disponíveis, e envia-os às 09:00 ou à hora escolhida. Resultados de cópias/replicação e ações imediatas ficam excluídos. O horário de silêncio adia mensagens não críticas numa faixa diária.", + "intro2": "Fica abaixo do horário de silêncio no mesmo cartão do canal; veja Horário de silêncio. As duas funções são ativadas independentemente.", + "purposeTitle": "Para que serve", + "purposeItems": [ + "Um resumo de manhã. Se verifica o anfitrião uma vez por dia, pode ler às 09:00 um único resumo em vez de 20 notificações separadas.", + "Separar informações e urgências. O resumo reúne eventos INFO elegíveis; CRITICAL e WARNING não aguardam pelo resumo." + ], + "howTitle": "Como funciona", + "howItems": [ + "Ativação por canal. Desativado por predefinição. Ative só nos canais onde pretende um resumo; os restantes mantêm envios imediatos.", + "Hora de envio no fuso local, inicialmente 09:00. Pode alterá-la; o processo envia até cerca de 60 segundos após o minuto definido.", + "No resumo: eventos genéricos elegíveis de nível INFO, como atualizações de aplicações, atualizações Tailscale, atualizações de otimizações ProxMenux, atualizações de segurança APT e avisos de limite de frequência. Resultados de cópias e outras ações excluídas continuam imediatos.", + "O que nunca é atrasado:", + "Persistência. Os eventos permanecem em SQLite, na tabela digest_pending, até à hora escolhida e sobrevivem aos reinícios do Monitor.", + "Sem eventos, sem resumo. Não envia mensagens vazias quando não existem eventos INFO a resumir." + ], + "neverDelayedSub": [ + "CRITICAL eventos sempre passam imediatamente.", + "WARNING eventos sempre passam imediatamente.", + "Início, paragem, encerramento, reinício e falhas VM/CT, início e resultados de cópias, resultados de replicação e encerramento/reinício do anfitrião não entram no resumo, mesmo como INFO. O horário de silêncio pode ainda adiar os não críticos." + ], + "comboTitle": "Combinar horário de silêncio e resumo diário", + "comboBody": "Pode ativar ambos: silêncio 22:00–07:00 e resumo 09:00. Os eventos não críticos durante o silêncio saem no resumo das 07:00; INFO elegíveis fora da faixa entram no diário. CRITICAL ultrapassa ambos; WARNING ultrapassa o resumo mas aguarda no silêncio. Escolha uma faixa de silêncio, um resumo a hora fixa ou ambos." + }, + "displayName": { + "heading": "Nome apresentado", + "intro": "O nome apresentado identifica o anfitrião de origem. Surge nas mensagens formatadas, por exemplo 🏠 home-lab, e no prefixo do assunto email.", + "imageAlt": "Mostrar o campo Nome com o valor amd mostrado como exemplo, etiqueta Nome mostrado nas notificações - edite para personalizar ou deixe em branco para usar o nome da máquina do sistema", + "imageCaption": "Deixe o campo vazio para usar o nome do anfitrião ou introduza uma etiqueta personalizada.", + "outro": "Se o campo estiver vazio, o Monitor cai de volta para o nome da máquina do sistema. A substituição é mais útil quando você executa vários hosts ProxMenux que enviam para o mesmo chat ou caixa de entrada Telegram — uma etiqueta mais amigável (home-lab, office-pve) é mais fácil de ler do que pve01.lan ou pmx-prod-01." + }, + "dispatch": { + "heading": "Processo de envio", + "intro": "A tabela descreve três mecanismos relacionados. O fluxo real começa pela agregação de eventos próximos, depois verificações de envio/intervalo, limites por grupo, formatação e controlos por canal.", + "headerStage": "Etapa", + "headerWhat": "O que ele faz", + "headerTunable": "Configurável?", + "rows": [ + { + "stage": "Deduplicação por assinatura", + "what": "Calcula uma assinatura do evento (event_type + key fields from data). Assinaturas idênticas num intervalo curto são consideradas duplicados.", + "tunable": "Não — lógica interna do expedidor." + }, + { + "stage": "Intervalo entre envios", + "what": "Após envio bem-sucedido suprime repetições e guarda o estado em notification_last_sent. Valores base: 86 400 s para CRITICAL, WARNING, INFO, resources e updates. Exceções: 5 s para ações VM/CT e encerramento/reinício do anfitrião, 10 s para resultados de cópias/replicação, 1 800–3 600 s para várias categorias de saúde. Definições explícitas por evento/grupo prevalecem.", + "tunable": "Sim: definições explícitas do intervalo por evento ou grupo substituem os valores predefinidos do processo de envio." + }, + { + "stage": "Agregação de eventos próximos", + "what": "Vários eventos do mesmo tipo num intervalo curto, como tentativas SSH repetidas, são reunidos numa mensagem burst_* com contagem e exemplo.", + "tunable": "Não: janela e limiar estão definidos no código por tipo de evento." + } + ], + "calloutTitle": "Os envios ocorrem em segundo plano", + "calloutBody": "Um thread dedicado processa os envios. O pedido HTTP que produz o evento termina ao colocá-lo na fila, sem aguardar Telegram, SMTP ou webhook. O resultado de cada envio fica no histórico." + }, + "aiRewrite": { + "heading": "Reescrita IA opcional", + "body1": "Eventos elegíveis podem ser reescritos por um LLM. Resultados de cópias (backup_complete e backup_fail) ficam excluídos. IA está desativada por predefinição e, quando ativa, trabalha no thread de envio. Se a chamada falhar ou expirar, usa o texto original do modelo.", + "body2": "Seis fornecedores: OpenAI, Anthropic, Google Gemini, Groq, OpenRouter e Ollama. Cada canal escolhe detalhe (brief, standard, detailed), idioma, modo do prompt (default/custom) e prompt personalizado. Veja Assistente IA para configuração e exemplos.", + "privacyTitle": "Nota de privacidade", + "privacyBody": "Os pedidos IA podem incluir título, gravidade, texto, prompt e contexto: nomes de anfitrião, IP, utilizadores, erros e linhas do registo. Seguem para o endpoint escolhido. Ollama só permanece local com servidor e modelo ambos locais; servidores remotos ou modelos cloud enviam dados para fora do anfitrião. Para os manter na rede, desative a reescrita ou use endpoint e modelo locais controlados." + }, + "pveWebhook": { + "heading": "Integração PVE webhook", + "intro1": "Proxmox dispõe de destinos sendmail, Gotify, SMTP e webhook quando suportado. Ativar notificações do Monitor regista um destino webhook. Eventos PVE, como HA, replicação e relatórios de cópias da interface, podem assim usar o mesmo processo de envio.", + "intro2": "O alvo é visível da GUI Proxmox no Datacenter → Notificações → Alvos de Notificação:", + "imageAlt": "Webhook Proxmox com destino proxmenux-webhook, método POST, URL local 8008 e modelo JSON com escape dos valores e campos json", + "imageCaption": "O alvo webhook do lado PVE como o Proxmox vê-lo (a GUI está no locale configurado da máquina — espanhol neste exemplo). Os mesmos campos aplicam-se em qualquer idioma.", + "registeredIntro": "O que é registrado:", + "registeredItems": [ + "Método e URL. POST http://127.0.0.1:8008/api/notifications/webhook sem HTTPS do Monitor. Com HTTPS usa o listener HTTP local separado na porta 8009. Ambos permanecem no mesmo anfitrião.", + "Modelo do corpo. Usa os auxiliares Handlebars do PVE. O PVE guarda-o codificado em base64; o conteúdo JSON é:", + "Matcher. Um bloco matcher: proxmenux-matcher companheiro com mode all para que cada notificação PVE atinja o alvo.", + "Configuração privada. Cria o bloco webhook: proxmenux-webhook em /etc/pve/priv/notifications.cfg com o segredo partilhado em base64. O destino público usa-o para X-Webhook-Secret. O bloco não está vazio." + ], + "securityTitle": "Como o receptor está seguro", + "securityIntro": "O receptor webhook em POST /api/notifications/webhook aplica diferentes camadas de segurança, dependendo de onde o pedido vem:", + "securityItems": [ + "Fontes locais (127.0.0.1/::1). Aplica limites de frequência, omitindo verificações remotas de segredo, data/hora e repetições. Endereços atribuídos às interfaces do anfitrião também são locais. O destino PVE automático usa loopback.", + "Pedidos remotos. Além dos limites verifica o segredo X-Webhook-Secret, data/hora em X-ProxMenux-Timestamp ou JSON, repetições e eventual lista IP. O segredo fica em SQLite e é copiado em base64 para /etc/pve/priv/notifications.cfg para o cabeçalho PVE." + ], + "practiceTitle": "Na prática", + "practiceBody": "PVE usa http://127.0.0.1:8008 sem HTTPS, ou HTTP 8009 com HTTPS do Monitor. Para chamar https://<monitor-host>:<port>/api/notifications/webhook externamente, envie X-Webhook-Secret e data/hora atual e cumpra verificações IP e de repetições. Só o segredo não basta.", + "actionsIntro": "O Monitor gerencia este alvo através de três ações na aba Configurações:", + "actionsItems": [ + "Setup — é executado automaticamente quando você ativa as notificações. Cria a entrada em /etc/pve/notifications.cfg. O arquivo é escrito apenas quando seu conteúdo tem que mudar, e uma cópia do anterior é mantida em /usr/local/share/proxmenux/backups/pve-notifications/ (o mais novo três). Nada é escrito enquanto o /etc/pve não está montado: um Monitor que começa durante um reinício do pve-cluster registra a entrada uma vez que está de volta.", + "Limpeza: remove a entrada e mantém a cópia anterior.", + "Ler configuração: mostra destinos e regras PVE atuais para verificar o percurso efetivo quando existem vários envios configurados." + ], + "clusterTitle": "Nós de agrupamento", + "clusterBody": "/etc/pve/ é partilhado no cluster, incluindo URL e segredo. Cada nó chama o seu próprio listener: 127.0.0.1:8008 sem HTTPS ou HTTP 8009 com HTTPS. Execute o Monitor em cada nó relevante e mantenha o destino partilhado consistente com todos os listeners." + }, + "catalogue": { + "heading": "Catálogo de eventos", + "intro": "Cerca de setenta tipos de eventos são agrupados em onze categorias de IU. O painel Notificações mostra uma seção colapsável por grupo com uma opção para cada evento dentro dele. Cada evento está ligado por padrão, a menos que explicitamente marcado de outra forma.", + "headerGroup": "Grupo", + "headerEvents": "Eventos", + "rows": [ + { + "group": "VM/CT", + "events": "vm_start, vm_start_warning, vm_stop, vm_shutdown, vm_fail, vm_restart, mais o ct_* equivalentes, migration_start, migration_complete, migration_warning, migration_fail, replication_complete, replication_fail." + }, + { + "group": "Cópias de segurança", + "events": "backup_start, backup_complete, backup_warning, backup_fail, snapshot_complete, snapshot_fail." + }, + { + "group": "Recursos", + "events": "cpu_high, ram_high, temp_high, load_high." + }, + { + "group": "Armazenamento", + "events": "disk_space_low, disk_io_error, storage_unavailable, smart_test_complete, smart_test_failed." + }, + { + "group": "Rede", + "events": "network_down, network_latency." + }, + { + "group": "Segurança", + "events": "auth_fail, ip_block, firewall_issue, user_permission_change." + }, + { + "group": "Cluster", + "events": "split_brain, node_disconnect, node_reconnect." + }, + { + "group": "Serviços", + "events": "system_startup, system_shutdown, system_reboot, system_problem, service_fail, oom_kill, system_mail." + }, + { + "group": "Monitor de Saúde", + "events": "new_error, error_resolved, error_escalated, health_degraded, health_persistent, health_issue_new, health_issue_resolved." + }, + { + "group": "Atualizações", + "events": "update_summary, update_available, pve_update, update_complete, proxmenux_update." + }, + { + "group": "Hardware / GPU", + "events": "gpu_mode_switch, gpu_passthrough_blocked, pci_passthrough_conflict, ai_model_migrated." + } + ], + "burstNote": "Eventos agregados burst_*, como burst_auth_fail, burst_ip_block e burst_disk_io, substituem vários eventos por um resumo. Não têm opções próprias: herdam o estado do evento de origem.", + "backupResults": { + "heading": "Resultados da cópia de segurança", + "intro": "A notificação descreve o resultado da cópia reportado pelo Proxmox. O resultado determina título, ícone das Mensagens formatadas e linha de estado no email.", + "headerIcon": "Icon", + "headerResult": "Resultado", + "headerWhen": "Quando", + "rows": [ + { + "icon": "💾✅", + "result": "Backup concluído", + "when": "Todos os convidados terminaram e o relatório não contém avisos." + }, + { + "icon": "💾⚠️", + "result": "Backup concluído com avisos", + "when": "Todos os convidados terminaram e o relatório contém pelo menos uma linha de aviso." + }, + { + "icon": "💾❌", + "result": "Erro de cópia de segurança reportado", + "when": "Um convidado falhou ou o processo terminou com erro." + }, + { + "icon": "💾❔", + "result": "Resultado da cópia de segurança não confirmado", + "when": "O relatório está incompleto ou não indica um resultado para cada hóspede." + } + ], + "items": [ + "O título identifica a tarefa. Inclui armazenamento e, com um só convidado, tipo, nome e ID. Se falhar identifica o convidado envolvido.", + "O corpo lista cada guest com seu próprio resultado, tamanho, duração e arquivo, seguido de uma linha com os totais do trabalho.", + "Avisos e erros surgem uma só vez. A causa principal fica primeiro. Acima de oito linhas, conta as restantes no fim; continuam no registo de tarefas Proxmox.", + "Se falhar antes do primeiro convidado, mostra o motivo reportado pelo Proxmox, como armazenamento inexistente.", + "Os resumos preservam o resultado. No resumo do horário de silêncio, a cópia mantém o seu ícone. Resultados de cópias não entram no resumo diário." + ] + } + }, + "history": { + "heading": "Histórico", + "body1": "Cada tentativa efetiva fica em notification_history: data sent_at, canal, evento, gravidade, título, texto, resultado success e eventual error_message. Um grupo agregado surge como uma linha burst_*. Eventos suprimidos pelo intervalo entre envios não geram tentativas nem entradas.", + "body2": "Definições → Notificações inclui a secção Histórico de notificações, inicialmente fechada, com os últimos 20 envios, resultado, canal, data, erro e resultado dos resumos. Não oferece eliminação: Auditoria e relatório lê o mesmo histórico para verificar os envios.", + "body3": "Os mesmos dados são expostos em GET /api/notifications/history com parâmetros de consulta opcional limit, offset, severity e channel, e podem ser limpos com DELETE /api/notifications/history." + }, + "api": { + "heading": "Endpoints API", + "headerEndpoint": "Endpoint", + "headerMethod": "Método", + "headerUse": "Usar", + "rows": [ + { + "endpoint": "/api/notifications/settings", + "method": "GET / POST", + "use": "Lê ou guarda configuração de canais, eventos, reescrita IA e nome apresentado." + }, + { + "endpoint": "/api/notifications/test", + "method": "POST", + "use": "Enviar uma notificação de teste para um canal: '{'\"channel\":\"telegram\"'}'." + }, + { + "endpoint": "/api/notifications/test-ai", + "method": "POST", + "use": "Redigir e reescrever um evento de exemplo sem o enviar." + }, + { + "endpoint": "/api/notifications/provider-models", + "method": "POST", + "use": "Listar modelos disponíveis para o fornecedor de IA selecionado." + }, + { + "endpoint": "/api/notifications/send", + "method": "POST", + "use": "Emitir um evento de fora (integrações personalizadas)." + }, + { + "endpoint": "/api/notifications/history", + "method": "GET / DELETE", + "use": "Leia o histórico com filtros; limpe- o." + }, + { + "endpoint": "/api/notifications/webhook", + "method": "POST", + "use": "Recebe notificações Proxmox. Endereços locais omitem os controlos remotos mas têm limites de frequência. Nos pedidos remotos verifica X-Webhook-Secret, data/hora em X-ProxMenux-Timestamp ou JSON, repetições e eventual lista IP." + }, + { + "endpoint": "/api/notifications/proxmox/setup-webhook", + "method": "POST", + "use": "Registar o Monitor como alvo em /etc/pve/notifications.cfg." + }, + { + "endpoint": "/api/notifications/proxmox/cleanup-webhook", + "method": "POST", + "use": "Remova o alvo Monitor da configuração de notificação do PVE." + }, + { + "endpoint": "/api/notifications/proxmox/read-cfg", + "method": "GET", + "use": "Mostrar a configuração de notificação PVE atual como PVE vê." + } + ] + }, + "whereNext": { + "heading": "Leituras seguintes", + "items": [ + { + "label": "Assistente de IA", + "href": "/docs/monitor/ai-assistant", + "tail": " — fornecedores, modelos, modos do prompt, idiomas e detalhe por canal." + }, + { + "label": "Monitor de Saúde", + "href": "/docs/monitor/health-monitor", + "tail": " — o maior produtor único de eventos, com duração de supressão própria por categoria." + }, + { + "label": "Arquitetura", + "href": "/docs/monitor/architecture", + "tailRich": " — lugar das tabelas SQLite notification_last_sent, notification_history e do thread de envio na arquitetura do Monitor." + }, + { + "label": "Acesso e autenticação", + "href": "/docs/monitor/access-auth", + "tailRich": " — criação de tokens API para scripts que chamam /api/notifications/send." + }, + { + "label": "Painel → Registos do Sistema", + "href": "/docs/monitor/dashboard/system-logs", + "tail": " — vista em tempo real do registo usado pelo respetivo monitor." + } + ] + } +} diff --git a/web/messages/sk/docs/monitor/access-auth.json b/web/messages/sk/docs/monitor/access-auth.json new file mode 100644 index 00000000..445c9b87 --- /dev/null +++ b/web/messages/sk/docs/monitor/access-auth.json @@ -0,0 +1,396 @@ +{ + "meta": { + "title": "Overenie prístupu k panelu Proxmox — 2FA, tokeny API, profil, reverzný proxy | ProxMenux Monitor", + "description": "Prístup a ochrana ProxMenux Monitor: prvé spustenie, heslo s menom a avatarom, profil, TOTP 2FA, tokeny API pre skripty, HTTPS, príklady Nginx/Caddy/Traefik, protokol auditu a voliteľný jail Fail2Ban.", + "ogTitle": "Overenie prístupu k panelu Proxmox — 2FA, tokeny API, reverzný proxy", + "ogDescription": "Zabezpečte ProxMenux Monitor heslom, TOTP 2FA, tokenmi API, HTTPS, príkladmi reverzného proxy a voliteľným jailom Fail2Ban.", + "twitterTitle": "Overenie prístupu k panelu Proxmox | ProxMenux Monitor", + "twitterDescription": "Heslo a TOTP 2FA, tokeny API, HTTPS, príklady Nginx/Caddy/Traefik a protokol auditu." + }, + "header": { + "title": "Prístup a overenie", + "description": "Prístup k panelu, prvé spustenie a ochranné vrstvy: heslo a TOTP, relácie JWT, tokeny API, HTTPS, reverzný proxy, Secure Gateway a voliteľný jail Fail2Ban.", + "section": "ProxMenux Monitor" + }, + "intro": { + "title": "Overenie prístupu je voliteľné", + "body": "Pri prvom spustení panel zobrazí dialóg „Chrániť panel?“ s tlačidlami Áno, nastaviť heslo a Nie, pokračovať bez ochrany. Druhá možnosť ponechá koncové body API otvorené na TCP 8008: v izolovanej laboratórnej LAN to môže byť prijateľné, inde je to nebezpečné. Dvojfaktorové overenie (2FA) nie je súčasťou tejto úvodnej voľby; nastavuje sa až po vytvorení hesla na karte Zabezpečenie." + }, + "reaching": { + "heading": "Prístup k panelu", + "intro": "ProxMenux Monitor sa viaže na 0.0.0.0:8008. Existujú tri bežné spôsoby, ako ju dosiahnuť:", + "outro": "Priamy prístup zodpovedá predvolenej jednotke systemd. Reverzný proxy a Secure Gateway sú opísané nižšie. IP z X-Forwarded-For vyžadujú PROXMENUX_TRUST_PROXY=1 a proxy pod vašou kontrolou. Samotné X-Forwarded-Proto alebo X-Forwarded-Host túto dôveru nezapnú; frontend zostavuje URL API z pôvodu prehliadača." + }, + "firstLaunch": { + "heading": "Postup pri prvom spustení", + "intro": "Pri prvom otvorení panelu frontend zavolá GET /api/auth/status. Ak konfigurácia ešte nebola uložená (configured: false), zobrazí sa dialóg „Chrániť panel?“ s dvoma možnosťami:", + "imageAlt": "Úvodný dialóg „Chrániť panel?“ s voľbami nastaviť heslo alebo pokračovať bez ochrany", + "imageCaption": "Úvodná voľba ochrany heslom alebo pokračovania bez nej. Zobrazí sa znova po novej inštalácii alebo vypnutí overenia v nastaveniach.", + "headerButton": "Tlačidlo", + "headerWhat": "Čo sa stane?", + "headerApi": "Volanie API", + "rows": [ + { + "button": "Áno, nastaviť heslo", + "what": "Otvorí formulár s povinným používateľským menom a heslom, voliteľným zobrazovaným menom a obrázkom avatara. Zapne overenie v auth.json pomocou enabled: true a vráti JWT na prihlásenie. Voliteľné údaje profilu sa uložia následnými volaniami, ako je opísané nižšie.", + "api": "POST /api/auth/setup" + }, + { + "button": "Nie, pokračovať bez ochrany", + "what": "Nastaví declined: true v auth.json. Koncové body API zostanú otvorené, kým v nastaveniach nezapnete ochranu.", + "api": "POST /api/auth/skip" + } + ], + "twofaCalloutTitle": "2FA je konfigurovaný neskôr, nie tu", + "twofaCalloutBody": "Dialóg pri prvom spustení pokrýva iba rozhodnutie o hesle. Dvojfaktorové overenie (TOTP) sa nastaví neskôr z karty Zabezpečenie, keď sa prihlásite pomocou hesla. Úplný návod TOTP je nižšie na tejto stránke.", + "createTitle": "Vytvorenie prvého užívateľa", + "createIntro": "Áno, nastaviť heslo otvorí formulár na vytvorenie účtu a voliteľné vyplnenie profilu, aby sa avatar zobrazil hneď po uložení. Polia:", + "headerField": "Pole", + "headerRequired": "Požadované", + "headerNotes": "Poznámky", + "fieldRows": [ + { + "field": "Užívateľské meno", + "required": "Áno", + "notes": "Identifikátor na prihlásenie. V rozhraní sa neskôr nedá zmeniť; treba upraviť priamo auth.json." + }, + { + "field": "Heslo", + "required": "Áno", + "notes": "Aspoň 10 znakov z aspoň 3 zo 4 kategórií: malé písmená, veľké písmená, číslice a symboly. Jednoduché heslá ako password, 12345678 a proxmenux sú odmietnuté. Rovnaké pravidlá platia na serveri a volanie curl ich neobíde." + }, + { + "field": "Zobrazované meno", + "required": "Nie", + "notes": "Meno v ponuke hlavičky a v profile. Ak chýba, použije sa používateľské meno. Zmeniť ho môžete cez Avatar → Zobraziť profil." + }, + { + "field": "Obrázok Avatar", + "required": "Nie", + "notes": "PNG, JPEG, WebP alebo GIF až do 2 MB. Vykreslený ako kruh v hlavičke a na stránke profilu. Keď je prázdna, hlavička zobrazuje prvé písmeno zobrazovaného mena (alebo používateľského mena) vo farebnom kruhu. Dá sa nahrať, nahradiť alebo odstrániť neskôr zo stránky profilu." + } + ], + "createImageAlt": "Formulár účtu s povinným menom a heslom, voliteľným zobrazovaným menom a nahratím avatara", + "createImageCaption": "Úvodný formulár účtu. Meno profilu a avatar sú voliteľné; bez nich sa účet vytvorí a hlavička zobrazí iniciálu v kruhu.", + "saveCalloutTitle": "Jedno uloženie, až tri volania API", + "saveCalloutBody": "Formulár najprv odošle POST /api/auth/setup s menom a heslom. Nový JWT použije na PUT /api/auth/profile pre meno a POST /api/auth/profile/avatar pre obrázok, ak boli zadané. Chyba profilu nezruší účet; profil môžete dokončiť neskôr.", + "avatarTitle": "Ponuka avatara a stránka profilu", + "avatarBody1": "Po nastavení overenia sa avatar objaví vpravo hore vedľa prepínača témy. Ponuka vedie na profil a Zabezpečenie a obsahuje Odhlásiť sa. Reláciu možno ukončiť aj na karte Zabezpečenie.", + "avatarBody2": "Profil zobrazuje avatar, používateľské meno iba na čítanie a upraviteľné zobrazované meno. Nahratie, nahradenie a odstránenie avatara sú atómové; hlavička sa po úspechu aktualizuje bez obnovenia stránky. Úvodný formulár a profil používajú rovnaké koncové body opísané nižšie.", + "profileImageAlt": "Profil s náhľadom avatara, tlačidlami Nahrať / Nahradiť / Odstrániť, menom iba na čítanie a upraviteľným zobrazovaným menom", + "profileImageCaption": "Stránka profilu. Používateľské meno je iba na čítanie; zobrazované meno a avatar možno meniť tu bez otvorenia karty Zabezpečenie.", + "headerEndpoint": "Koncový bod", + "headerEpWhat": "Čo to robí?", + "endpointRows": [ + { + "endpoint": "GET /api/auth/profile", + "what": "Vráti používateľské meno, zobrazované meno a stav avatara (has_avatar, avatar_mtime)." + }, + { + "endpoint": "PUT /api/auth/profile", + "what": "Aktualizuje zobrazované meno. Telo požiadavky: '{' \"display_name\": \"...\" '}'." + }, + { + "endpoint": "GET /api/auth/profile/avatar", + "what": "Vráti obrázok PNG / JPEG / WebP / GIF so správnym typom obsahu. Vyžaduje hlavičku Bearer; frontend stiahne blob a vytvorí miestnu objektovú URL na zobrazenie." + }, + { + "endpoint": "POST /api/auth/profile/avatar", + "what": "Nahrá nový avatar (max 2 MB). Typ obsahu musí zodpovedať súboru. Starý avatar je nahradený atómovo." + }, + { + "endpoint": "DELETE /api/auth/profile/avatar", + "what": "Odstráni avatar. Hlavička opäť zobrazí iniciálu vo farebnom kruhu." + } + ], + "reversibleTitle": "Ochranu môžete zapnúť neskôr", + "reversibleBody": "Po kliknutí na Nie, pokračovať bez ochrany sa už nikdy viac nezobrazí uvítacie dialógové okno. Autentizáciu môžete znova povoliť na karte Zabezpečenie na hlavnom paneli alebo úpravou súboru /root/.config/proxmenux-monitor/auth.json a odstránením príznaku declined a reštartovaním služby." + }, + "password": { + "heading": "Overenie hesla", + "intro": "Po nastavení ochrany vyžadujú chránené volania API JWT v Authorization: Bearer <token>:", + "items": [ + "Token relácie: platí 24 hodín, vydáva ho POST /api/auth/login.", + "Token API pre integrácie: platí 365 dní, vydáva ho POST /api/auth/generate-api-token. Podrobnosti sú v ďalšej časti." + ], + "loginImageAlt": "Prihlasovacia obrazovka po nastavení overenia s poľami mena a hesla", + "loginImageCaption": "Po nastavení overenia sa tu začína prihlásenie. Pri zapnutom 2FA sa po prijatí hesla vyžiada šesťmiestny kód.", + "loginFlowTitle": "Prihlasovací tok", + "twofaIntro": "Pri 2FA prvé volanie vráti requires_totp: true. Zopakujte ho so šesťmiestnym kódom:", + "publicTitle": "Verejný prístup a chránené kontroly", + "publicIntro": "Prihlásenie a stav overenia sú verejné. Účet možno vytvoriť, kým nie sú uložené meno a heslo, aj po odmietnutí ochrany. Pri zapnutej ochrane vyžadujú systémové údaje overenie:", + "publicItems": [ + "/api/auth/login a /api/auth/status sú verejné. /api/auth/setup vytvorí prvý účet a odmietne prepísať existujúce prihlasovacie údaje.", + "/api/system-info je verejný endpoint so základnými údajmi systému vrátane health.status. Nevyžaduje token. Aj /api/auth/status je verejný a hodí sa na kontrolu dostupnosti." + ], + "cryptoTitle": "Kryptografia a ukladanie", + "cryptoIntro": "ProxMenux Monitor má otvorený zdrojový kód. Táto časť vysvetľuje ochranu prihlasovacích údajov uložených na hostiteľovi, aby ste sa mohli rozhodnúť, či jej dôverujete. Uvedené algoritmy používa scripts/auth_manager.py; ide o opis kódu, nie marketingový sľub.", + "headerAsset": "Údaj", + "headerAlgo": "Algoritmus", + "headerWhere": "Umiestnenie", + "cryptoRows": [ + { + "asset": "Heslo", + "algorithm": "PBKDF2-HMAC-SHA256 s náhodnou soľou na heslo a vysokým počtom iterácií (OWASP 2023+ východisková hodnota). Uložené ako pbkdf2_sha256$<iters>$<salt>$<hash>.", + "where": "auth.json → password_hash" + }, + { + "asset": "JWT relácie / API", + "algorithm": "Podpis HS256 s tajným kľúčom každej inštalácie, vytvoreným pri prvom spustení (secrets.token_urlsafe, ≥48 bajtov). Tokeny obsahujú iss=proxmenux-monitor a aud=api; každý požiadavok overuje podpis aktuálnym kľúčom.", + "where": "Tajomstvo: auth.json → jwt_secret. JWT sám: len na klienta." + }, + { + "asset": "API token metaúdaje", + "algorithm": "Hash SHA-256 JWT sa ukladá s odtlačkom signed_with použitého jwt_secret. Umožňuje zobraziť metadáta a rozpoznať tokeny ovplyvnené výmenou kľúča.", + "where": "auth.json → api_tokens[]" + }, + { + "asset": "Tajný kľúč TOTP pre 2FA", + "algorithm": "Štandardný TOTP (RFC 6238) s tajným kľúčom v base32. Osem jednorazových obnovovacích kódov sa ukladá ako hashe SHA-256.", + "where": "auth.json → totp_secret + backup_codes[]" + }, + { + "asset": "Zrušenie", + "algorithm": "Pri odvolaní tokenu alebo relácie sa ich SHA-256 pridá do zoznamu zablokovaných hodnôt, ktorý sa kontroluje pri každom overení. Zoznam sa uchováva v pamäti približne 30 s, aby sa pri častých požiadavkách zbytočne nečítal disk.", + "where": "auth.json → revoked_tokens[]" + } + ], + "authJsonTitle": "auth.json — obsah a ochrana", + "authJsonBody": "Údaje overenia sú v /root/.config/proxmenux-monitor/auth.json, režim 0600, vlastník root. Súbor obsahuje hashe PBKDF2 a tajné kryptografické údaje (jwt_secret, totp_secret), nikdy heslo v otvorenom texte. Cieľ zálohovania alebo replikácie šifrujte a súbor nikdy nepridávajte do systému správy verzií.", + "rotateTitle": "Výmena jwt_secret zneplatní všetky existujúce JWT", + "rotateBody": "Pri novom vytvorení alebo obnove auth.json s iným kľúčom sa zmení jwt_secret. Staré JWT relácií aj API zlyhajú s \"Invalid or expired token\". Rozhranie ich označí Neplatný — vytvoriť znova. Zrušte ich a nahraďte aj v Home Assistant, skriptoch a ostatných klientoch.", + "recoverTitle": "Obnovenie strateného hesla", + "recoverIntro": "Obnova hesla vyžaduje prístup k shellu hostiteľa. ProxMenux ponúka sprievodcu resetovaním v konfiguračnej ponuke, aby ste nemuseli ručne upravovať auth.json:", + "survivesTitle": "Čo prežíva reset", + "survivesBody": "Vymaže sa interaktívne prihlásenie, ale jwt_secret a registrované api_tokens zostanú. Home Assistant a ostatné skripty môžu používať pôvodné tokeny. Ak chcete úplný reset s novým kľúčom, odstráňte auth.json a reštartujte službu. Všetky staré tokeny potom prestanú platiť.", + "physicalTitle": "Predpoklad fyzického prístupu", + "physicalBody": "Vyžaduje shell používateľa root na hostiteľovi. Kto spustí menu ako root, už ovláda celý systém; reset hesla mu nepridáva práva. Prihlásenie do Monitora preto nechráni pred osobou s prístupom root." + }, + "twofa": { + "heading": "Dvojfaktorové overenie (TOTP)", + "intro": "2FA pridáva k heslu šesťmiestny kód, ktorý sa mení každých 30 sekúnd v telefóne alebo správcovi hesiel. Samotné heslo na prihlásenie nestačí. ProxMenux Monitor používa štandardný protokol TOTP (RFC 6238), kompatibilný s autentifikačnými aplikáciami.", + "pickTitle": "Vyberte autentifikačnú aplikáciu", + "pickIntro": "Existujúcu aplikáciu TOTP môžete použiť aj tu. Tabuľka uvádza bežné možnosti: niektoré sú zadarmo, iné na predplatné. Líšia sa aj platformy a spôsoby zálohovania.", + "headerApp": "Aplikácie", + "headerPlatforms": "Platformy", + "headerAppNotes": "Poznámky", + "apps": [ + { + "name": "Google Authenticator", + "href": "https://safety.google/authentication/", + "platforms": "iOS, Android", + "notes": "Bežná voľba. Voliteľné cloudové zálohovanie cez účet Google." + }, + { + "name": "Microsoft Authenticator", + "href": "https://www.microsoft.com/en-us/security/mobile-authenticator-app", + "platforms": "iOS, Android", + "notes": "Zálohovanie cez účet Microsoft. Podporuje aj pracovné push oznámenia Microsoft." + }, + { + "name": "Authy", + "href": "https://authy.com/", + "platforms": "iOS, Android", + "notes": "Šifrovaná synchronizácia medzi zariadeniami. Podpora desktopovej aplikácie sa skončila 19. marca 2024." + }, + { + "name": "Apple Passwords", + "href": "https://support.apple.com/guide/passwords/welcome/mac", + "platforms": "iOS, iPadOS, macOS, visionOS, Windows (cez iCloud)", + "notes": "Súčasť systémov Apple; samostatná aplikácia Passwords od iOS 18 / macOS Sequoia. Ukladá TOTP pri hesle a synchronizuje cez iCloud Kľúčenku." + }, + { + "name": "Bitwarden", + "href": "https://bitwarden.com/", + "platforms": "iOS, Android, desktop, prehliadač", + "notes": "Otvorený zdrojový kód. TOTP možno uložiť pri heslách v trezore. Je to pohodlné, ale neoddeľuje to faktory na dve zariadenia." + }, + { + "name": "1Password", + "href": "https://1password.com/", + "platforms": "iOS, Android, desktop, prehliadač", + "notes": "Podobne ako Bitwarden: TOTP v trezore hesiel. Predplatné." + }, + { + "name": "Aegis Authenticator", + "href": "https://getaegis.app/", + "platforms": "Android", + "notes": "Otvorený zdrojový kód. Šifrovaný záložný súbor v zariadení máte pod kontrolou. Bez cloudu a účtu." + }, + { + "name": "Raivo OTP", + "href": "https://raivo-otp.com/", + "platforms": "iOS, macOS", + "notes": "Otvorený zdrojový kód. Voliteľná synchronizácia iCloud. Alternatíva k Aegis v ekosystéme Apple." + }, + { + "name": "Ente Auth", + "href": "https://ente.io/auth/", + "platforms": "iOS, Android, počítač, web", + "notes": "Otvorený zdrojový kód. Cloudová synchronizácia zariadení s koncovým šifrovaním." + }, + { + "name": "2FAS", + "href": "https://2fas.com/", + "platforms": "iOS, Android, rozšírenie prehliadača", + "notes": "Otvorený zdrojový kód. Voliteľná šifrovaná cloudová záloha; rozšírenie prehliadača môže automaticky vypĺňať kódy." + }, + { + "name": "FreeOTP+", + "href": "https://github.com/helloworld1/FreeOTPPlus", + "platforms": "Android", + "notes": "Odvodená aplikácia FreeOTP s otvoreným kódom pre Android, s importom a exportom. Bez povinného účtu." + } + ], + "backupTitle": "Prečo sú zálohy dôležité", + "backupBody": "Pri strate zariadenia použite uložený obnovovací kód alebo obnovte vopred nastavenú zálohu. Cloudová synchronizácia a exporty sa líšia podľa aplikácie; overte, že obnovia aj tajné kľúče TOTP. Prístup root na hostiteľovi umožňuje aj obnovu opísanú nižšie. Uchovajte samostatnú bezpečnú zálohu.", + "setupTitle": "Nastavenie krok za krokom z panelu", + "setupImageAlt": "Nastavovacia obrazovka 2FA s QR kódom a záložnými kódmi", + "setupImageCaption": "Dialóg 2FA zobrazuje QR, tajný kľúč Base32 na ručné zadanie a osem jednorazových obnovovacích kódov. Pred zatvorením ich skopírujte; už sa nezobrazia.", + "setupSteps": [ + "Nainštalujte autentifikačnú aplikáciu do telefónu alebo otvorte správcu hesiel. Stačí raz; rovnaká aplikácia môže uchovávať kódy pre všetky chránené služby.", + "Prihláste sa do panelu menom a heslom.", + "Otvorte kartu Zabezpečenie a vyberte Zapnúť 2FA. Dialóg zobrazí QR, tajný kľúč Base32 a osem obnovovacích kódov.", + "Pridajte položku do autentifikačnej aplikácie:", + "Uložte obnovovacie kódy. Všetkých osem bezpečne uložte do správcu hesiel, šifrovanej poznámky alebo na papier. Každý funguje raz, keď aplikácia nie je dostupná.", + "Potvrďte aktuálnym šesťmiestnym kódom z aplikácie v poli \"Overovací kód\" a odošlite. Mení sa každých 30 sekúnd; ak počas písania vyprší, použite ďalší.", + "Hotovo. 2FA je aktívne. Ďalšie prihlásenie vyžiada najprv heslo a potom aktuálny šesťmiestny kód." + ], + "setupStep4Sub": [ + "Jednoduchý postup: v aplikácii vyberte Pridať účet → Naskenovať QR kód a nasmerujte fotoaparát na QR. Položka dostane názov napríklad ProxMenux Monitor (your-username) a zobrazí šesťmiestny kód obnovovaný každých 30 sekúnd.", + "Ručná alternatíva, ak nemožno skenovať, napríklad na rovnakom telefóne: Pridať účet → Zadať nastavovací kľúč. Zvoľte názov ako Proxmox Monitor, vložte tajný kľúč Base32, nechajte Typ nastavený na Časový a uložte." + ], + "testTitle": "Test pred odhlásením", + "testBody": "Aktuálnu reláciu nechajte otvorenú a hneď po nastavení otestujte nové prihlásenie v súkromnom okne. Ak kód nefunguje, pred odhlásením skontrolujte hodiny servera a telefónu. Ak je prístup už stratený, použite obnovovací kód alebo upravte auth.json zo shellu hostiteľa.", + "lostTitle": "Stratený autentifikátor", + "lostIntro": "Tri spôsoby obnovy, od najmenšieho po najväčší zásah:", + "lostItems": [ + "Použite obnovovací kód. Jeden z ôsmich zadajte do poľa TOTP. Funguje raz; nepoužité kódy zostanú platné. Po prihlásení nastavte 2FA znova v nastaveniach a získajte osem nových kódov.", + "Obnovte aplikáciu z cloudu alebo zálohy. Pri nastavenej synchronizácii ju nainštalujte na nové zariadenie a prihláste sa: Google, Microsoft, Authy, Apple Passwords cez iCloud Kľúčenku, Ente alebo 2FAS. Pri exporte z Aegis, Raivo alebo FreeOTP+ nainštalujte aplikáciu a importujte súbor.", + "Vypnite 2FA zo shellu hostiteľa. Ak iné možnosti nie sú dostupné, upravte /root/.config/proxmenux-monitor/auth.json ako root cez SSH alebo konzolu. Nastavte totp_enabled na false, uložte a reštartujte službu:" + ], + "lostShellOutro": "Môžete sa prihlásiť iba s užívateľským menom + heslom a potom znovu zapnúť 2FA z Nastavenia.", + "disableTitle": "Vypnúť 2FA", + "disableBody": "Otvorte Zabezpečenie a vyberte Vypnúť 2FA. POST /api/auth/totp/disable vyžaduje aktuálne heslo a platný TOTP alebo obnovovací kód. Odstráni tajný kľúč aj obnovovacie kódy. Starú položku odstráňte aj z aplikácie.", + "rejectedTitle": "Šesťmiestny kód je vždy odmietnutý", + "rejectedIntro": "TOTP závisí od času. Rozdiel hodín servera a telefónu má byť najviac približne 30 s. Dve kontroly:", + "rejectedItems": [ + "Telefón: Nastavenia → Dátum a čas → zapnúť automatickú / sieťovú synchronizáciu.", + "Hostiteľ Proxmox: timedatectl status má zobraziť \"System clock synchronized: yes\". Inak spustite timedatectl set-ntp true a minútu počkajte." + ], + "rejectedOutro": "Po synchronizácii hodín sa kód prijme v nasledujúcom 30-sekundovom intervale." + }, + "apiTokens": { + "heading": "API tokeny (dlhodobé)", + "intro": "Relácie prehliadača platia 24 hodín. Pre Homepage, Home Assistant, Grafana či Uptime Kuma vytvorte samostatný token API platný 365 dní. JWT používa rovnaký podpisový kľúč; pole token_name umožňuje sledovať a jednotlivo zrušiť token.", + "imageAlt": "Panel tokenov API znázorňujúci zoznam tokenov s názvom, predponou, vytvoreným dátumom a expiráciou", + "imageCaption": "Zoznam tokenov v nastaveniach: názov, predpona s poslednými štyrmi identifikačnými znakmi, dátum vytvorenia a platnosť, možnosť zrušenia.", + "generateTitle": "Generovať token", + "generateIntro": "Z panelu:", + "generateSteps": [ + "Otvorte Zabezpečenie → Prístupové tokeny API.", + "Zadajte opisný názov, napríklad \"Home Assistant\".", + "Zadajte svoje heslo. Ak je zapnutá 2FA, aj súčasný 6-miestny kód.", + "Kliknite na Vytvoriť token. Zobrazí sa iba raz: hneď ho skopírujte." + ], + "generateCli": "Z príkazového riadku:", + "useTitle": "Použitie tokenu", + "revokeTitle": "Zrušiť token", + "revokeBody": "Každý riadok má voľbu Zrušiť, ktorá pridá hash do revoked_tokens v auth.json. Token sa odmietne pri ďalšej požiadavke.", + "cheatTitle": "Prehľad bezpečnosti tokenov", + "cheatItems": [ + "Tokeny uložte do úložiska tajných údajov integrácie: Homepage secrets.yaml, Home Assistant !secret alebo premenné prostredia. Nikdy ich nepridávajte do Gitu.", + "Jeden token pre každú integráciu, pomenovaný podľa nej. Pri odstránení integrácie ho samostatne zrušte.", + "Tokeny vymieňajte každých 6–12 mesiacov. Koniec platnosti je pevný limit." + ], + "outro": "Odporúčania a príklady: Referencia API → Správa tokenov a Integrácie." + }, + "https": { + "heading": "HTTPS", + "intro": "Dve cesty k TLS:", + "items": [ + "Odporúčaný reverzný proxy. Ukončite TLS na Nginx / Caddy / Traefik a posielajte HTTP procesu Flask na port 8008. Príklady sú nižšie.", + "Priame HTTPS v AppImage. Certifikát nastavte cez POST /api/ssl/configure (rozhranie: Nastavenia → SSL). HTTPS používa gevent.pywsgi so štandardným handlerom; flask-sock obsluhuje WebSocket pre WSS. Cesty certifikátov sa uložia v konfigurácii SSL." + ], + "calloutTitle": "Priame obmedzenia HTTPS", + "calloutBody": "Monitor môže použiť certifikát spravovaný Proxmoxom alebo vlastné súbory. Sám certifikáty ACME nevydáva. Na automatické vydávanie a obnovu použite Proxmox ACME alebo proxy Caddy, Traefik či Nginx a zabezpečte načítanie obnovených certifikátov." + }, + "gateway": { + "heading": "Zabezpečená brána (Tailscale)", + "intro": "Reverzný proxy umožňuje vzdialený prístup. Secure Gateway ponúka prístup bez zverejnenia TCP 8008: vytvorí Alpine LXC s Tailscale ako smerovačom podsiete. Prístup k LAN IP hostiteľa závisí od schválených trás a pravidiel tailnetu.", + "calloutTitle": "Prečo je to pohodlné", + "calloutBody": "Použite LAN URL http://<proxmox-lan-ip>:8008 cez schválenú trasu. Smerovače Tailscale štandardne používajú SNAT: Monitor obvykle vidí LAN IP brány, nie adresu klienta 100.x.y.z. Protokoly a Fail2Ban tak určia zdrojovú adresu, ktorú hostiteľ skutočne prijme.", + "deployBody": "Celé nasadenie sa nastavuje na jednej obrazovke: vyberte úložisko LXC na hostiteľovi, vložte kľúč Tailscale auth-key vytvorený na login.tailscale.com/admin/settings/keys, určte podsiete, ktoré má brána oznamovať, a kliknite na Nasadiť. Inicializácia LXC trvá približne 30 sekúnd a kontajner sa automaticky zaregistruje do siete tailnet.", + "outro": "Nasadenie, trasy podsietí, ACL Tailscale a režim Exit Node sú opísané v Panel → Zabezpečenie → Secure Gateway, kde je aj sprievodca. Táto stránka opisuje prístup." + }, + "proxy": { + "heading": "Príklady konfigurácie reverzného proxy", + "intro": "Použite samostatný názov hostiteľa, napríklad monitor.example.com, smerujúci na port 8008 Proxmoxu. Príklady používajú tento postup. Podcesta ako example.com/proxmenux-monitor/ potrebuje úpravy frontendu aj proxy; odstránenie predpony nestačí.", + "nginxTitle": "Nginx", + "caddyTitle": "Caddy", + "traefikTitle": "Traefik (štítky — Docker / Kubernetes)", + "subPathTitle": "Pokročilé: nasadenie pod podcestou", + "subPathBody": "Frontend nemá nastavený základ podcesty a zostavuje volania od koreňa cez URL /api/*. Odstrániť predponu ako example.com/proxmenux-monitor/ nestačí pre tieto volania ani všetky súbory frontendu. Použite samostatný názov hostiteľa. Podcesta vyžaduje spoločné úpravy a osobitné testovanie." + }, + "audit": { + "heading": "Auditný záznam", + "intro": "Neúspešné prihlásenia a upozornenia na limit sa zapisujú po riadkoch do /var/log/proxmenux-auth.log. Tento logger úspešné prihlásenia nezaznamenáva:", + "outro": "Sledujte protokol cez tail -F /var/log/proxmenux-auth.log. Dodatočná konfigurácia logrotate umožní jeho rotáciu; Monitor ju sám nevykonáva." + }, + "fail2ban": { + "heading": "Voliteľné: jail Fail2Ban", + "calloutTitle": "Fail2Ban nie je súčasťou Monitora", + "calloutBody": "Fail2Ban nie je nainštalovaný samotným ProxMenux Monitor. Nainštalujte ho cez Zabezpečenie → Fail2Ban v menu ProxMenux (alebo pomocou štandardného balíka Debian). Bez toho Monitor stále zapisuje vyššie uvedený protokol auditu – iba automaticky nezablokuje recidivistov.", + "intro": "Integrácia ProxMenux obsahuje jail [proxmenux], ktorý:", + "items": [ + "Číta /var/log/proxmenux-auth.log.", + "Zodpovedá modelu authentication failure; rhost=<ip> s vyhradeným filtrom.", + "Štandardne blokuje príslušnú IP vo firewalle jadra.", + "Hook Flask before_request porovnáva požiadavky so zoznamom blokovaní uloženým v cache na 30 s. Za reverzným proxy vyžaduje blokovanie IP aj PROXMENUX_TRUST_PROXY=1 a riadený proxy nastavujúci dôveryhodné hlavičky." + ], + "outro": "Konfigurácia, ladenie času zákazu a procedúry odblokovania sú v Zabezpečenie → Fail2Ban." + }, + "troubleshoot": { + "heading": "Riešenie problémov", + "noScreenTitle": "Obrazovka prvého spustenia sa nikdy neobjaví", + "noScreenBody": "Overenie už bolo nastavené (configured: true) alebo ho niekto preskočil. Ak chcete začať znova:", + "noScreenOutro": "Vymaže stav overenia, tajné kľúče TOTP aj tokeny API. Ak ich chcete zachovať, najprv zálohujte auth.json.", + "tokenTitle": "HTTP 401 pri každej požiadavke s predtým funkčným tokenom API", + "tokenBody": "Token vypršal po 365 dňoch alebo je v revoked_tokens. V nastaveniach vytvorte nový a aktualizujte integráciu. Overenie:", + "tokenOutro": "Neplatné alebo zrušené tokeny vrátia '{'\"error\":\"Invalid or expired token\"'}'.", + "no2faTitle": "Po zapnutí 2FA sa nedá prihlásiť a autentifikátor nie je dostupný", + "no2faBody": "Použite záložný kód v TOTP poli. Ak sú preč, editujte /root/.config/proxmenux-monitor/auth.json z hostiteľa, nastavte totp_enabled na false, reštartujte službu.", + "wsTitle": "Reverzný proxy funguje, ale záložka terminálu sa odpojí každú minútu", + "wsBody": "Časový limit nečinnosti WebSocket v proxy. Zvýšte limit čítania (Nginx: proxy_read_timeout 86400s; Traefik: idleTimeout vo vstupnom bode alebo middleware). V Nginx overte proxy_set_header Upgrade $http_upgrade a Connection \"upgrade\"." + }, + "whereNext": { + "heading": "Kam ďalej", + "items": [ + { + "label": "Referencia API → Správa tokenov", + "href": "/docs/monitor/api", + "tail": " — tvorba, zoznam a zrušenie tokenov API; bezpečnosť a ukladanie tajných údajov." + }, + { + "label": "Integrácie", + "href": "/docs/monitor/integrations", + "tail": " — Homepage, Home Assistant, Grafana / Prometheus, Uptime Kuma a všeobecné príklady cURL." + }, + { + "label": "Dashboard → Bezpečnosť → Bezpečná brána", + "href": "/docs/monitor/dashboard/security", + "tail": " — nasadenie LXC brány Tailscale krok za krokom: trasy podsietí, ACL a režim Exit Node." + }, + { + "label": "Bezpečnosť → Fail2Ban", + "href": "/docs/security/fail2ban", + "tail": " — inštalácia a konfigurácia voliteľného jailu." + }, + { + "label": "Nastavenie → ProxMenux Monitor", + "href": "/docs/settings/proxmenux-monitor", + "tail": " — spustenie a zastavenie služby systemd cez TUI ProxMenux." + } + ] + } +} diff --git a/web/messages/sk/docs/monitor/ai-assistant.json b/web/messages/sk/docs/monitor/ai-assistant.json new file mode 100644 index 00000000..3d8ad079 --- /dev/null +++ b/web/messages/sk/docs/monitor/ai-assistant.json @@ -0,0 +1,342 @@ +{ + "meta": { + "title": "AI asistent Proxmox — OpenAI, Claude, Gemini, Groq, Ollama | ProxMenux Monitor", + "description": "Voliteľný AI asistent prepisuje oznámenia Proxmox VE do zrozumiteľného jazyka. Šesť poskytovateľov: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter a Ollama. Rozhranie ponúka trinásť jazykov, tri úrovne detailov pre každý kanál, vlastné prompty s komunitnou knižnicou a kontext s dobou behu, opakovaním a údajmi SMART.", + "ogTitle": "AI asistent Proxmox — OpenAI, Claude, Gemini, Groq, Ollama", + "ogDescription": "Prepíšte oznámenia Proxmox VE do zrozumiteľného jazyka pomocou OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter alebo lokálneho Ollama.", + "twitterTitle": "AI asistent Proxmox | ProxMenux Monitor", + "twitterDescription": "Prepíšte oznámenia Proxmox VE do zrozumiteľného jazyka pomocou OpenAI, Anthropic, Gemini, Groq, OpenRouter alebo lokálneho Ollama." + }, + "header": { + "title": "AI asistent", + "description": "Voliteľný prepis AI mení vhodné šablóny oznámení na zrozumiteľné správy s detailmi podľa kanála, trinástimi jazykmi rozhrania, vlastnými promptmi, verejnou komunitnou knižnicou a doplneným kontextom. Správy backup_complete a backup_fail AI úplne obchádzajú.", + "section": "ProxMenux Monitor" + }, + "intro": { + "title": "Predvolene vypnuté, zapnutie jedným prepínačom", + "body": "Prepis AI je predvolene vypnutý. Zapnite ho v Nastavenia → Oznámenia → Pokročilé: vylepšenie AI. Pri chybe doplnenia kontextu alebo prepisu sa odošle pôvodná šablóna. Každý prepis má časový limit 25 sekúnd; po jeho uplynutí sa použije šablóna bez neobmedzeného čakania." + }, + "howItWorks": { + "heading": "Ako to funguje", + "intro": "Odosielané udalosti Monitora prechádzajú rovnakým postupom. Prepis AI je voliteľný krok medzi textom zo šablóny a odoslaním do kanála. Udalosť prejde štyrmi krokmi:", + "steps": [ + "Udalosť + šablóna. Udalosť prichádza od jedného zo šiestich kolektorov a je vykreslená do štruktúrovaného tela s čistým textom pomocou notification_templates.py. Toto je telo, ktoré by kanál poslal, keby bolo prepisovanie AI vypnuté.", + "Doplnenie kontextu. Odosielací modul podľa udalosti pridá relevantné údaje: dobu behu systému pri kritických systémových chybách, frekvenciu udalostí, údaje SMART pri diskových udalostiach, zhody z databázy známych chýb a riadky denníka.", + "Zostavenie promptu. Systémový prompt tvorí šablóna a nastavenia kanála: jazyk, úroveň detailov, pravidlá emoji z Formátovaných správ a voliteľné návrhy AI. Vlastný prompt úplne nahradí systémový prompt. Používateľská správa obsahuje text šablóny a doplnené kontextové bloky.", + "Volanie poskytovateľa. Groq, OpenAI, Anthropic, Gemini, Ollama alebo OpenRouter vráti prepísaný názov a text. Odosielací modul spracuje odpoveď, nahradí tieto údaje pre daný kanál a odovzdá ich jeho adaptéru na doručenie." + ], + "notesIntro": "Tri detaily, ktoré stojí za to držať sa pred čítaním zvyšku tejto stránky:", + "notes": [ + "AI nevytvára udalosti. Každá udalosť vychádza zo skutočného signálu, napríklad kontroly stavu, riadka denníka alebo webhooku PVE. Pred spracovaním AI ju šablóna prevedie na text. AI prekladá a upravuje formát; systém nesleduje.", + "AI pracuje pre každý kanál samostatne. Telegram a Discord môžu dostať stručný prepis a e-mail podrobnú správu: tá istá udalosť v rôznom formáte, s jedným volaním poskytovateľa pre každý kanál.", + "Pri chybe sa použije šablóna. Ak poskytovateľ vráti chybu 5xx, prekročí časový limit, vráti neplatný výstup alebo odmietne požiadavku, odosielací modul zaznamená chybu a odošle pôvodný text šablóny pre daný kanál." + ] + }, + "enabling": { + "heading": "Zapnutie panela", + "intro": "Nastavenie AI je v dolnej časti panela Oznámenia na karte Nastavenia, v zbaliteľnom bloku Pokročilé: vylepšenie AI. Rozbaľte ho kliknutím na nadpis:", + "collapsedAlt": "Zbalený nadpis pokročilých nastavení AI s ikonou šípky", + "collapsedCaption": "Predvolene zbalené; jedno kliknutie panel rozbalí.", + "panelAlt": "Rozbalený panel AI s hlavným prepínačom, poskytovateľom Google Gemini, skrytým kľúčom API, modelom gemini-2.5-flash, predvoleným promptom, angličtinou, detailmi pre Telegram, Discord, Gotify a e-mail, návrhmi AI a testom spojenia", + "panelCaption": "Úplný panel AI Enhancement – každý ovládací prvok zdokumentovaný na tejto stránke mapuje na jedno z vyššie uvedených polí.", + "outro": "Zhora nadol: hlavný prepínač Správy vylepšené AI, poskytovateľ s informačným oknom, kľúč API alebo URL Ollama, modely načítané po zadaní kľúča, režim Predvolený / Vlastný, jazyk, detaily podľa kanála, Návrhy AI a tlačidlo Otestovať spojenie, ktoré odošle skúšobnú správu poskytovateľovi na overenie údajov." + }, + "context": { + "heading": "Aký kontext dostáva AI", + "intro": "Pred zostavením promptu odosielací modul doplní kontext podľa toho, ktoré údaje sú pre udalosť relevantné. Cieľom je dať LLM dosť informácií na užitočnú správu bez zbytočného obsahu a nákladov. Do používateľskej správy možno pridať päť kontextových blokov:", + "headerBlock": "Blok", + "headerWhen": "Kedy sa pridáva", + "headerWhat": "Čo nesie", + "rows": [ + { + "block": "Doba behu systému", + "when": "Iba pri kritických systémových chybách: crash, panic, oom, kernel, split_brain, quorum_lost, node_offline, node_fail, system_fail, boot_fail. Pri diskových chybách, upozorneniach a bežných operáciách sa vynechá, aby bol prompt stručný.", + "what": "Riadok ako System uptime: 14 days (stable system) umožní LLM odlíšiť problémy pri spúšťaní od chýb počas dlhšej prevádzky." + }, + { + "block": "Frekvencia udalostí", + "when": "Vždy, keď Monitor už zaznamenal rovnaký identifikátor udalosti.", + "what": "Počet výskytov, čas prvého záznamu a voliteľný vzor: opakovaný, jednorazový alebo nárazový. LLM podľa toho rozlíši opakovaný problém od prvého výskytu." + }, + { + "block": "Údaje SMART", + "when": "Len pre udalosti súvisiace s diskom (typ udalosti obsahuje disk, smart, storage, io_error alebo telo spomína /dev/sd, ata, i/o error).", + "what": "Výstup smartctl pre ovplyvnené zariadenie – celkový stav (PASSED / FAILED) plus príslušné atribúty pre režim zlyhania." + }, + { + "block": "Databáza známych chýb", + "when": "Keď text alebo kontext denníka zodpovedá vzoru chyby Proxmox dodanému s Monitorom.", + "what": "Blok KNOWN PROXMOX ERROR DETECTED so zistenou príčinou a konkrétnym riešením. Prompt prikazuje verný preklad bez preformulovania odporúčanej opravy." + }, + { + "block": "Denníky", + "when": "Keď pôvodný zberný modul zachytil riadky denníka pre udalosť, najmä sledovanie denníka a úloh.", + "what": "Pôvodné výňatky z journalctl. Prompt prikazuje LLM vybrať ID, časové údaje a náznaky hlavnej príčiny a ignorovať nesúvisiace záznamy." + } + ], + "afterBlocks": "Po pripojení týchto blokov má užívateľská správa odoslaná do LLM tento tvar:", + "calloutTitle": "Žiadna telemetria mimo samotnej udalosti", + "calloutBody": "Monitor posiela len údaje dostupné pre aktuálnu udalosť, nie celkovú telemetriu systému, historické časové rady metrík ani výpisy inventára. Päť blokov vyššie predstavuje hornú hranicu údajov odoslaných pri jednom prepise AI." + }, + "tokens": { + "heading": "Tokeny – čo sú a ako sa spotrebúvajú", + "intro1": "Komerční poskytovatelia účtujú za token. Token zodpovedá približne štyrom znakom anglického textu alebo trom štvrtinám slova. Anglická veta \"Backup completed on storage local-bak\" má približne osem tokenov. Desať riadkov denníka môže podľa technického obsahu zabrať 200–400 tokenov.", + "intro2": "Pri každom hovore sú fakturované dve veci:", + "items": [ + "Vstupné tokeny zahŕňajú systémový prompt a používateľskú správu: závažnosť, názov, text šablóny a doplnený kontext. Počet závisí od skutočného promptu a udalosti. Každý prepisovaný kanál môže spotrebovať vlastné vstupné tokeny; správy o dokončení alebo zlyhaní zálohy AI obchádzajú.", + "Výstupné tokeny – čo model odpíše. Monitor to uzatvára pomocou max_tokens (pozri tabuľku nižšie). Limit je limit, nie poplatok: ak model vyrába 250 tokeny s limitom 1500, zaplatíte za 250." + ], + "capsIntro": "Toto sú skutočné limity, ktoré používa dispečer, prevzaté priamo z AI_DETAIL_TOKENS v notification_templates.py:", + "headerLevel": "Úroveň podrobnosti", + "headerCap": "Limit výstupu (tokeny)", + "headerConsumption": "Typická skutočná spotreba", + "capRows": [ + { + "level": "stručný", + "cap": "500", + "consumption": "50–200 výstupných tokenov pri krátkych udalostiach." + }, + { + "level": "štandardná", + "cap": "1500", + "consumption": "200–700 výstupných tokenov pri bežných udalostiach s menším množstvom kontextu." + }, + { + "level": "podrobné", + "cap": "3000", + "consumption": "500–2000 výstupných tokenov pri úplných e-mailových správach s denníkmi a tabuľkami SMART." + } + ], + "customNote": "Režim vlastného promptu má pevný limit 500 výstupných tokenov bez ohľadu na úroveň detailov. Prompt ovládate vy a limit bráni neprimerane dlhým odpovediam.", + "sizingTitle": "Praktická veľkosť", + "sizingBody": "Spotrebu odhadnite ako prepísané udalosti × kanály AI × vstupné a výstupné tokeny na volanie. Napríklad 50 udalostí × jeden kanál × (500 vstupných + 300 výstupných) = 40 000 tokenov denne. Skutočná spotreba a cena závisia od modelu, kontextu, cache a limitov poskytovateľa. Časť Detaily podľa kanála opisuje brief pre chat namiesto standard pri zachovaní podrobných e-mailov." + }, + "providers": { + "heading": "Poskytovatelia AI", + "intro": "Monitor podporuje šesť poskytovateľov. Rozbaľovacia ponuka zobrazuje všetkých a informačné tlačidlo vedľa nej otvorí okno s krátkym opisom každého. Nižšie sú adresy na získanie kľúča API, opisy z rozhrania a poznámky zo zdrojového kódu.", + "imageAlt": "Informačné okno šiestich poskytovateľov AI: Groq, OpenAI, Anthropic Claude, Google Gemini, Ollama a OpenRouter, s ikonou, krátkym opisom a poznámkou o API kompatibilných s OpenAI", + "imageCaption": "Modál v aplikácii – šesť kariet, jedna na poskytovateľa, s rovnakými popismi zdokumentovanými nižšie.", + "groq": { + "heading": "Groq", + "tagline": "Veľmi rýchla, veľkorysá voľná úroveň (30 req/min). Ideálne začať.", + "items": [ + "Kľúč API: console.groq.com/keys", + "Príklady z dodaného zoznamu modelov: allam-2-7b, qwen/qwen3.8-27b, openai/gpt-oss-20b, groq/compound-mini.", + "Dodané odporúčanie: openai/gpt-oss-20b. Dostupnosť pre svoj účet overte výberom poskytovateľa a testom spojenia." + ] + }, + "openai": { + "heading": "OpenAI", + "tagline": "Priemyselná norma. Veľmi presné a široko používané.", + "items": [ + "Kľúč API: platform.openai.com/api-keys", + "Príklady z dodaného zoznamu modelov: gpt-4.1-nano, gpt-4.1-mini, gpt-4o-mini, gpt-4.1, gpt-4o, gpt-5-nano.", + "Dodané odporúčanie: gpt-4.1-nano. Adaptér spracúva aj osobitné požiadavky modelov uvažovania; zoznam obsahuje gpt-5-nano, takže tieto modely nie sú všeobecne vylúčené." + ], + "baseUrlTitle": "Základné URL kompatibilné s OpenAI", + "baseUrlBody": "Poskytovateľ OpenAI prijíma vlastnú Základnú URL pre kompatibilné služby, napríklad BytePlus / ByteDance (Kimi K2.5), LocalAI, LM Studio, vLLM, Together AI a Fireworks AI, ktoré používajú formát /v1/chat/completions. URL nastavte na karte OpenAI vedľa kľúča API." + }, + "anthropic": { + "heading": "Anthropic (Claude)", + "tagline": "Vynikajúce pre písanie a preklad. Rýchlo a hospodárne.", + "items": [ + "Kľúč API: console.anthropic.com/settings/keys", + "Príklady z dodaného zoznamu modelov: claude-haiku-4-5-20251001, claude-sonnet-4-6, claude-opus-4-6.", + "Dodané odporúčanie: claude-haiku-4-5-20251001. Odporúčaná je táto presná verzia; staršie položky Claude 3.5 už v dodanom zozname nie sú." + ] + }, + "gemini": { + "heading": "Google Gemini", + "tagline": "K dispozícii je bezplatný plán s dobrým pomerom kvality a ceny.", + "items": [ + "Kľúč API: aistudio.google.com/app/apikey", + "Príklady z dodaného zoznamu modelov: gemini-2.5-flash-lite, gemini-2.5-flash, gemini-3-flash-preview.", + "Odporúčané: gemini-2.5-flash-lite. Modely flash a flash-lite pravidelne prechádzajú overením. Varianty pro odmietajú nastavenie thinkingBudget=0, ktoré používa Monitor, a sú pre túto úlohu zbytočne náročné." + ] + }, + "openrouter": { + "heading": "OpenRouter", + "tagline": "Agregácia s prístupom k modelom 100+ pomocou jediného kľúča API. Maximálna flexibilita.", + "items": [ + "Kľúč API: openrouter.ai/keys", + "Príklady z dodaného zoznamu modelov: meta-llama/llama-3.3-70b-instruct, meta-llama/llama-3.1-70b-instruct, meta-llama/llama-3.1-8b-instruct, anthropic/claude-haiku-4.5, google/gemini-2.5-flash-lite, openai/gpt-4o-mini, mistralai/mistral-medium-3.", + "Odporúčané: meta-llama/llama-3.3-70b-instruct. Model je smerovaný cez OpenRouter, takže rovnaký kľúč sprístupní všetky uvedené modely." + ] + }, + "ollama": { + "heading": "Ollama (miestne)", + "tagline": "Používa modely sprístupnené nastaveným serverom Ollama. Lokálne modely bežia na ňom; cloudové modely Ollama posielajú požiadavky cloudovému poskytovateľovi. Lokálna prevádzka nemá poplatok za hostované API, ale využíva vlastný hardvér a elektrinu.", + "items": [ + "Kľúč API netreba. Pole Ollama URL nastavte na svoj server, predvolene http://localhost:11434, alebo na hostiteľa s vašou inštanciou Ollama.", + "Modely sa nefiltrujú. Monitor načíta modely stiahnuté pomocou ollama pull <model>. Ponuku naplní z GET /api/tags na serveri Ollama.", + "Inštalácia: ollama.com/download — Linux, macOS a Windows. Vyberte model, ktorý sa zmestí do RAM a má dostatočné kontextové okno pre bloky denníka pridávané odosielacím modulom." + ] + } + }, + "models": { + "heading": "Prečo tieto špecifické modely", + "intro": "Výber komerčných modelov používa dodaný katalóg verified_ai_models.json a kontroly dostupnosti adaptérov. Tie prevedú internú požiadavku system_prompt + user_message + max_tokens do formátu API poskytovateľa. Katalóg obsahuje testované aj ručne pridané položky; nezaručuje aktuálny prístup účtu ani rovnaké overenie každej položky.", + "consequencesIntro": "Treba si uvedomiť dva dôsledky:", + "consequences": [ + "Dodané odporúčanie je východiskový bod pre oznámenia. Jazykovú kvalitu, latenciu a cenu posúďte podľa vlastných udalostí a účtu; nejde o univerzálny rebríček modelov.", + "Môžete vybrať iný model zo zoznamu podľa kvóty alebo preferencií. Dostupnosť overte testom spojenia; uvedenie v zozname nezaručuje aktuálny prístup účtu." + ], + "ollamaTitle": "Ollama je výnimka", + "ollamaBody": "Ponuka Ollama sa nefiltruje komerčným katalógom; zobrazuje modely servera Ollama. Na lokálny beh vyberte lokálny model s dostatkom RAM a kontextu pre denníky. Cloudové modely zostávajú vzdialené aj pri prístupe cez lokálny server Ollama." + }, + "defaultPrompt": { + "heading": "Predvolený prompt", + "intro": "V režime Predvolený používa Monitor systémový prompt nižšie. Pred volaním nahradí zástupné hodnoty: '{'language'}', '{'detail_level'}', '{'emoji_instructions'}', '{'suggestions_addon'}'. Nasledujú varianty pre formátované a obyčajné kanály a doplnok návrhov AI.", + "showFullSummary": "Zobraziť kompletnú štandardnú systémovú výzvu", + "passagesIntro": "Dva varianty textu sa použijú podľa prepínača Formátované správy daného kanála:", + "passages": [ + "Formátovanie zapnuté → pridá sa blok povolených emoji, pravidlo zachovania predpony názvu hostiteľa v nadpise a príklady: spustenie a dokončenie zálohy, aktualizácie, spustenie VM a zhoršenie stavu. Tak vznikajú správy s emoji na začiatku v Telegram a Discord.", + "Formátovanie vypnuté → krátky blok prikazuje používať iba obyčajné ASCII bez emoji a znakov Unicode. Hodí sa na e-mail a kanály, kde formátovanie zhoršuje pravidlá schránky alebo čitateľnosť." + ], + "suggestionsPlaceholder": "Zástupná hodnota '{'suggestions_addon'}' je prázdna, kým nezapnete návrhy AI. Potom sa pridá tento blok:", + "showAddonSummary": "Zobraziť doplnok návrhov AI" + }, + "customPrompt": { + "heading": "Vlastný prompt", + "intro": "Režim Vlastný nahradí celý predvolený systémový prompt vaším textom. Uloží sa v nastaveniach SQLite a pri každom volaní AI sa odošle bez zmeny. Môžete tak zvoliť iný tón, štruktúru alebo zameranie.", + "imageAlt": "Vlastný prompt s textovým poľom na pravidlá prekladu, tlačidlami Exportovať a Importovať a odkazom na komunitné prompty", + "imageCaption": "Vlastný prompt vo veľkom textovom poli, tlačidlá Exportovať, Importovať a odkaz na komunitnú galériu na GitHub.", + "changesTitle": "Čo sa zmení vo vlastnom režime", + "changes": [ + "Predvolený prompt sa úplne nahradí. Mapovanie Proxmox, pravidlá spracovania kontextu a pokyny pre emoji sa už nepridávajú. Ak ich chcete zachovať, vložte ich do vlastného promptu. Dodaný EXAMPLE_CUSTOM_PROMPT nižšie je východiskový príklad.", + "Výber jazyka sa ignoruje. Predvolený prompt má zástupnú hodnotu '{'language'}', vlastný prompt nie. Jazyk uveďte priamo vo svojom texte, napríklad „Prelož do španielčiny“ alebo „Všetko napíš po francúzsky“.", + "Vlastný režim má pevný limit 500 tokenov bez ohľadu na uložené detaily kanála. Predvolený režim používa 500 / 1500 / 3000. Úprava promptu limit nezvýši; žiadajte kratšiu odpoveď alebo zvoľte vhodnú predvolenú úroveň.", + "Výstupné značky sú naďalej povinné. Do formátu odpovede zahrňte [TITLE] a [BODY]. Parser z nich vyberie obsah; ak značka chýba, vráti pôvodnú šablónu.", + "Pravidlá emoji formátovaných správ sa nepridávajú automaticky. Vo vlastnom prompte výslovne povoľte emoji alebo ich zakážte pre obyčajný text. Prepínač ovláda len predvolené bloky, nie váš text." + ], + "starterTitle": "Úvodný prompt", + "starterIntro": "Textové pole Vlastný prompt je predvyplnené jednoduchým príkladom, ktorý môžete upraviť:", + "showStarterSummary": "Zobraziť úvodný vlastný prompt", + "shareTitle": "Zdieľanie podnetov s komunitou", + "shareIntro": "Tlačidlo Exportovať uloží prompt do súboru (.txt / .md) na zálohovanie alebo zdieľanie. Importovať súbor načíta. Tretie tlačidlo otvorí verejnú komunitnú galériu na GitHub:", + "shareLinkLabel": "github.com/MacRimi/ProxMenux/discussions — Zdieľajte vlastné prompty pre oznámenia AI", + "shareOutro": "V diskusii nájdete prompty ďalších správcov: stručné upozornenia, podrobné technické správy aj jazykové varianty. Ak ste s úpravou spokojní, zdieľajte ju s krátkym odsekom o jej účele. Vítaná je aj spätná väzba o tom, čo funguje a čo nie." + }, + "suggestions": { + "heading": "Návrhy AI (BETA)", + "intro": "Návrhy AI je voliteľný doplnok, ktorý umožňuje LLM pripojiť jeden krátky, použiteľný tip na koniec tela. Aktivuje sa iba vtedy, keď je režim výzvy Predvolený, hlavný prepínač AI je zapnutý a prepínač Návrhy AI je prehodený – a aj vtedy výzva dáva modelu pokyn, aby preskočil tip, ak príčina alebo riešenie nie je jasné.", + "formatIntro": "Pridaný tip má tento presný formát:", + "rulesIntro": "Pravidlá doplnku zobrazené v rozbaliteľnom bloku časti Predvolený prompt:", + "rules": [ + "Tip sa pridá iba vtedy, keď denníky alebo databáza známych chýb jasne poukazujú na konkrétnu opravu.", + "Prompt žiada tip kratší než 100 znakov; parser túto dĺžku samostatne nekontroluje.", + "Prompt vyžaduje konkrétny príkaz alebo cestu a prikazuje vyhnúť sa všeobecným radám.", + "Ak známa chyba poskytuje riešenie, LLM musí použiť toto riešenie, nie vymyslieť nové.", + "Prompt prikazuje vynechať tip, ak vstup nepodporuje konkrétnu opravu." + ], + "betaTitle": "Prečo BETA", + "betaBody": "Kvalita tipov závisí od modelu a dostupného kontextu denníkov. Model ako Claude 3.5 Haiku, GPT-4.1 Mini alebo Llama 3.3 70B s údajmi smartctl a denníkmi môže poskytnúť užitočný tip. Malý lokálny model Ollama s jednoriadkovou udalosťou môže podať slabý výsledok alebo tip vynechať. Ak vám tipy prekážajú, vypnite ich a podľa potreby znova zapnite." + }, + "detailLevel": { + "heading": "Úroveň detailov pre každý kanál", + "intro": "Telegram, Discord, Gotify a e-mail majú vlastnú ponuku úrovne detailov. Tri hodnoty určujú limit výstupných tokenov a pokyny predvoleného promptu:", + "headerLevel": "Úroveň", + "headerLabel": "Štítok UI", + "headerCap": "Výstupný strop", + "headerProduce": "Aký výstup prompt požaduje od LLM", + "rows": [ + { + "level": "stručný", + "label": "2–3 riadky, iba podstatné", + "cap": "500 tokenov", + "produce": "\"Čo sa stalo + kde.\" Nič iné." + }, + { + "level": "štandardná", + "label": "Stručne so základným kontextom", + "cap": "1500 tokenov", + "produce": "3–6 riadkov: čo, kde, príčina a dotknuté zariadenia." + }, + { + "level": "podrobné", + "label": "Úplné technické údaje", + "cap": "3000 tokenov", + "produce": "Úplná správa: čo, kde, príčina, dotknuté zariadenia, denníky, údaje SMART a história." + } + ], + "defaultsIntro": "Predvolené hodnoty pri prvej inštalácii:", + "defaults": [ + "Telegram, Discord, Gotify — standard.", + "E-mail — detailed. E-mail je kanál, kde zvyčajne chcete úplný obraz pre archív." + ], + "emailTitle": "Podrobný e-mail pripája pôvodnú správu", + "emailBody": "Ak formátovač AI vráti výsledok pre e-mail s detailed a pôvodný text má viac než 50 znakov, pripojí ho za 40 pomlčiek a označenie Original message:. Údaje tak zostanú dostupné na neskoršie vyhľadávanie. Pri obídení alebo chybe AI sa môže odoslať len pôvodná šablóna." + }, + "language": { + "heading": "Jazyk", + "intro": "Výber v rozhraní ponúka trinásť jazykov. Uloží ai_language, ktorý predvolený prompt používa v \"translate alerts into '{'language'}'\". Zoznam:", + "list": "Angličtina (en), slovenčina (sk), španielčina (es), francúzština (fr), nemčina (de), portugalčina (pt), taliančina (it), ruština (ru), švédčina (sv), nórčina (no), japončina (ja), čínština (zh), holandčina (nl).", + "rulesIntro": "Dve dôležité pravidlá priamo z promptu:", + "rules": [ + "Prekladať: označenia, opisy, stavové slová a jednotky, napríklad GB → Go vo francúzštine.", + "Neprekladať: názvy hostiteľov, adresy IP, cesty, VM/CT, názvy zariadení ako /dev/sdX, technické identifikátory. Tieto zostávajú doslovné bez ohľadu na jazyk." + ], + "customNote": "Vlastný prompt nepoužíva výber jazyka. Požadovaný jazyk výstupu uveďte priamo vo vlastnom prompte." + }, + "templates": { + "heading": "Poznámka k šablónam", + "body1": "AI dostáva text vytvorený zo šablóny, nie surové údaje udalosti. Typy ako vm_start, auth_fail a health_degraded majú šablóny v notification_templates.py. AI prepisuje vhodné výstupy; backup_complete a backup_fail si ponechávajú deterministické správy bez AI.", + "body2": "Názvy hostiteľov a VMID vloží šablóna ešte pred prepisom; AI ich nemusí vymýšľať. Pri vypnutej AI sa odošle priamo text šablóny. Stránka Oznámenia opisuje celý postup odosielania a kroky pred touto vrstvou." + }, + "privacy": { + "heading": "Súkromie a tok údajov", + "intro": "Pri zapnutom prepise AI posiela Monitor poskytovateľovi text oznámenia a doplnené kontextové bloky. Môžu obsahovať názvy hostiteľov, IP adresy, používateľské mená, cesty zariadení, riadky denníka a atribúty SMART dotknutého zariadenia. Či opustia hostiteľa, závisí od poskytovateľa:", + "headerProvider": "Poskytovateľ", + "headerDestination": "Miesto určenia údajov", + "rows": [ + { + "provider": "Ollama", + "destination": "Lokálne modely bežia na nastavenom hostiteľovi Ollama. Ak je ním uzol Proxmox, požiadavky zostávajú na ňom. Cloudové modely Ollama posielajú požiadavky mimo hostiteľa aj cez lokálny server Ollama." + }, + { + "provider": "OpenAI", + "destination": "Predvolene api.openai.com alebo nastavená vlastná základná URL. Platia pravidlá spracovania údajov skutočného prevádzkovateľa koncového bodu." + }, + { + "provider": "Anthropic", + "destination": "api.anthropic.com." + }, + { + "provider": "Google Gemini", + "destination": "generativelanguage.googleapis.com." + }, + { + "provider": "Groq", + "destination": "api.groq.com." + }, + { + "provider": "OpenRouter", + "destination": "openrouter.ai prepošle požiadavku poskytovateľovi modelu zvolenému v poli model. Dva kroky namiesto jedného." + } + ], + "calloutTitle": "Ak obsah udalostí nemôže opustiť sieť", + "calloutBody": "Použite lokálne hostovaný koncový bod s lokálnym modelom, napríklad Ollama alebo server kompatibilný s OpenAI, alebo AI vypnite. Cloudové modely Ollama nespracúvajú údaje lokálne. Odosielací modul neanonymizuje názvy hostiteľov ani IP adresy; prompt tvorí zo skutočného obsahu udalosti." + }, + "whereNext": { + "heading": "Kam ďalej", + "items": [ + { + "label": "Oznámenia", + "href": "/docs/monitor/notifications", + "tail": " — postup odosielania, kanály, prepínače udalostí a integrácia webhooku PVE okolo tejto vrstvy." + }, + { + "label": "Monitor zdravia", + "href": "/docs/monitor/health-monitor", + "tail": "– najväčší samostatný producent udalostí, ktoré AI nakoniec prepisuje, s vlastným trvaním potlačenia pre jednotlivé kategórie." + }, + { + "label": "Architektúra", + "href": "/docs/monitor/architecture", + "tail": "— kde AI Enhancer zapadá do širšieho monitorovacieho procesu (je to modul, nie samostatná služba)." + } + ], + "communityLabel": "Komunitné prompty na GitHub", + "communityTail": " — Prechádzať, zdieľať, pýtať." + } +} diff --git a/web/messages/sk/docs/monitor/api-reference.json b/web/messages/sk/docs/monitor/api-reference.json new file mode 100644 index 00000000..2fc2dbb7 --- /dev/null +++ b/web/messages/sk/docs/monitor/api-reference.json @@ -0,0 +1,760 @@ +{ + "meta": { + "title": "API Proxmox Monitor — Referenčná príručka integrácií | ProxMenux", + "description": "Koncové body HTTP ProxMenux Monitor pre Home Assistant, Homepage, Grafana, Prometheus, n8n a vlastné panely. Čítanie stavu a zdokumentované operácie: ovládanie VM, spustenie záloh, oznámenia a potvrdenie výstrah.", + "ogTitle": "API Proxmox Monitor — Príručka integrácií", + "ogDescription": "Koncové body ProxMenux Monitor pre Home Assistant, Homepage, Grafana, Prometheus, n8n a vlastné panely.", + "twitterTitle": "API monitora Proxmox | ProxMenux", + "twitterDescription": "Koncové body pre Home Assistant, Homepage, Grafana, Prometheus, n8n a vlastné panely." + }, + "header": { + "title": "Referenčná príručka API", + "description": "Koncové body HTTP na čítanie stavu a zdokumentované akcie: senzory Home Assistant, karty Homepage, panely Grafana, zber Prometheus, toky n8n a vlastné skripty. Obsahuje kategórie, exportované metriky a príklady curl.", + "section": "ProxMenux Monitor" + }, + "intro": { + "title": "Na čo je táto stránka", + "body": "Táto stránka uvádza koncové body integrácií: čítanie údajov, spustenie záloh, vlastné oznámenia a potvrdenie výstrah. API beží v procese Flask panela na TCP 8008. Adresu počúvania a TLS opisuje Prístup a overenie." + }, + "headerEndpoint": "Koncový bod", + "headerMethod": "Metóda", + "headerUse": "Použitie", + "auth": { + "heading": "Prihlásenie", + "intro": "Pri zapnutom overovaní chránené koncové body očakávajú JWT Bearer token v hlavičke požiadavky:", + "tokensIntro": "Dva spôsoby získania tokenu:", + "items": [ + "Tokeny API, odporúčané pre integrácie. Platia 365 dní a vytvárajú sa v Zabezpečenie → Tokeny API. Majú názov a možno ich jednotlivo odvolať. Na údaje použite read_only, full_admin iba na potrebné správcovské akcie.", + "Prihlásenie, JWT na 24 hodín. POST /api/auth/login s menom, heslom a TOTP, ak ho vyžaduje 2FA. JWT vyprší po 24 hodinách; skripty sa potom musia prihlásiť znova." + ], + "flowLink": "Prihlásenie, heslá, 2FA, audit a TLS opisuje Prístup a overenie.", + "rows": [ + { + "endpoint": "/api/auth/login", + "method": "POST", + "use": "Polia tela (schéma): '{'\"username\",\"password\",\"totp_token?\"'}'. Vráti JWT na 24 hodín." + }, + { + "endpoint": "/api/auth/api-tokens", + "method": "GET", + "use": "Uveďte API tokeny (iba metadáta — mená, predpony, dátumy; nikdy nie skutočný tajný kód)." + }, + { + "endpoint": "/api/auth/generate-api-token", + "method": "POST", + "use": "Vytvorí token API na 365 dní v overenej relácii. Polia: password, token_name?, totp_token?, scope?. Heslo a požadované TOTP sa overia znova. scope je predvolene read_only; full_admin treba zvoliť výslovne. Tajný token sa vráti iba raz." + }, + { + "endpoint": "/api/auth/api-tokens/", + "method": "DELETE", + "use": "Zrušte špecifický API token jeho ID." + } + ] + }, + "conventions": { + "heading": "Konvencie", + "items": [ + "Väčšina používa JSON. Niektoré sťahovania vracajú obyčajný text; /api/prometheus používa textový formát Prometheus 0.0.4 namiesto OpenMetrics. Overte typ odpovede konkrétnej cesty.", + "Mnohé zápisy vracajú '{'\"success\": true, ...'}'. Chyby sa líšia; bežný formát je '{'\"success\": false, \"error\": \"'<'reason'>'\"'}'. Kontrolujte stav HTTP aj polia: niektoré výzvy overenia používajú HTTP 200 so success false.", + "Parametre závisia od koncového bodu. limit, offset, since a filtre kategórií použite iba tam, kde sú podporované.", + "Časové formáty sa líšia: Unix čas, reťazce ISO-8601 aj dátumy systemd. Nepredpokladajte rovnakú jednotku ani výslovné časové pásmo vo všetkých poliach." + ] + }, + "system": { + "heading": "Systém a hardvér", + "rows": [ + { + "endpoint": "/api/system", + "method": "GET", + "use": "Aktuálne hodnoty CPU, pamäte, swapu, času prevádzky a záťaže." + }, + { + "endpoint": "/api/info", + "method": "GET", + "use": "Statické informácie o hostiteľovi: meno hostiteľa, jadro, verzia PVE, model CPU, distro." + }, + { + "endpoint": "/api/system-info", + "method": "GET", + "use": "Rozšírené systémové údaje pre hlavičku panela: celkové metriky a čas spustenia." + }, + { + "endpoint": "/api/hardware", + "method": "GET", + "use": "Podrobný hardvérový inventár: zariadenia PCI, GPU a senzory." + }, + { + "endpoint": "/api/hardware/live", + "method": "GET", + "use": "Aktuálne hodnoty rýchlo sa meniacich senzorov." + }, + { + "endpoint": "/api/temperature/history", + "method": "GET", + "use": "Časové rady teplôt CPU a jeho puzdra." + }, + { + "endpoint": "/api/gpu//realtime", + "method": "GET", + "use": "Aktuálne metriky GPU NVIDIA, Intel a AMD podľa pozície PCI." + } + ] + }, + "actions": { + "heading": "Systémové akcie", + "intro": "Tieto asynchrónne systémové akcie používajú dočasné jednotky systemd. Pri zapnutom overovaní ich zápisy vyžadujú full_admin; read_only môže čítať .../status. Prijatý štart vráti HTTP 202 a stav; priebeh sledujte cez .../status. Ovládanie hostí a zálohy majú iné odpovede, opísané nižšie.", + "shapeTitle": "Tvar bežnej odozvy", + "shapeIntro": "Asynchrónne systémové akcie používajú tento objekt stavu JSON. Ovládanie hostí a zálohy majú iné formáty:", + "shapeCode": "{\n \"unit\": \"proxmenux-action-pve-update.service\",\n \"state\": \"idle | running | success | failed | cancelled\",\n \"started_at\": \"Sat 2026-08-01 11:01:32 CEST\",\n \"finished_at\": null,\n \"exit_code\": null,\n \"result\": null\n}", + "concurrencyTitle": "Súbežnosť a zrušenie", + "concurrencyBody": "Ďalší štart tej istej aktívnej akcie vráti HTTP 409. Zrušenie je možné iba s dokumentovanou cestou DELETE, napríklad pri aktualizácii PVE. Stav prejde na cancelled a časy zostanú. Konečné stavy sú v pamäti procesu a po reštarte Monitora sa môžu stratiť.", + "rows": [ + { + "endpoint": "/api/system/power/reboot", + "method": "POST", + "use": "Spustí reštart hostiteľa Proxmox. Spojenie HTTP sa môže prerušiť, keď systemd začne vypínanie." + }, + { + "endpoint": "/api/system/power/reboot/status", + "method": "GET", + "use": "Stav aktuálneho alebo posledného reštartu." + }, + { + "endpoint": "/api/system/power/shutdown", + "method": "POST", + "use": "Vypne hostiteľa Proxmox, napríklad po signáli na vypnutie z UPS." + }, + { + "endpoint": "/api/system/power/shutdown/status", + "method": "GET", + "use": "Stav aktuálneho alebo posledného vypínania." + }, + { + "endpoint": "/api/system/pve-update/run", + "method": "POST", + "use": "Spustí aktualizáciu PVE používanú voľbou Aktualizovať teraz v Health Monitor aj ponukou shellu; odovzdá ju update-pve-safe.sh." + }, + { + "endpoint": "/api/system/pve-update/status", + "method": "GET", + "use": "Stav aktuálnej alebo poslednej aktualizácie PVE." + }, + { + "endpoint": "/api/system/pve-update", + "method": "DELETE", + "use": "Zruší prebiehajúcu aktualizáciu PVE signálom SIGTERM." + }, + { + "endpoint": "/api/proxmenux/self-update/run", + "method": "POST", + "use": "Aktualizuje ProxMenux inštalátorom nastaveného stabilného alebo beta kanála. Vlastná jednotka systemd umožní pokračovať počas reštartu proxmenux-monitor vykonaného inštalátorom." + }, + { + "endpoint": "/api/proxmenux/self-update/status", + "method": "GET", + "use": "Stav aktuálnej alebo poslednej aktualizácie ProxMenux." + }, + { + "endpoint": "/api/vms//control", + "method": "POST", + "use": "Odošle ovládací príkaz VM alebo LXC. Pole action prijíma start, stop, shutdown alebo reboot. Úspešná odpoveď vracia potvrdenú úlohu PVE, nie potvrdenie dokončenia. Výsledok sledujte cez koncový bod control-task hosťa." + }, + { + "endpoint": "/api/vms//backup", + "method": "POST", + "use": "Vytvorí zálohu vzdump VM alebo LXC. Voliteľné polia prispôsobte úložisku: storage (cieľ PVE), mode (snapshot, suspend alebo stop), compress (zstd, lzo, gzip alebo none), protected (true alebo false), notes, notification (auto, always, failure alebo never) a pbs_change_detection (default, legacy alebo data). Vráti UPID úlohy PVE." + }, + { + "endpoint": "/api/vms//backups", + "method": "GET", + "use": "Zoznam predchádzajúcich záloh pre VM alebo LXC vo všetkých dosiahnuteľných úložiskách." + } + ], + "syncVsAsyncTitle": "Dva typy akcií", + "syncVsAsyncBody": "Napájanie a aktualizácie hostiteľa používajú dočasné jednotky systemd s .../status. Iba aktualizácia PVE tu má cestu DELETE na zrušenie. Ovládanie VM/LXC vráti úlohu na sledovanie; záloha UPID úlohy na pozadí. Prijatie neznamená dokončenie. Overovanie a oprávnenia závisia od cesty.", + "curlTitle": "Príklad curl", + "curlBody": "Spustí aktualizáciu PVE a sleduje ju do dokončenia, ako automatizácia Home Assistant či playbook Ansible.", + "curlCode": "TOKEN=\n\ncurl -sSf -X POST \\\n -H \"Authorization: Bearer $TOKEN\" \\\n https://:8008/api/system/pve-update/run\n\nwhile true; do\n state=$(curl -sSf -H \"Authorization: Bearer $TOKEN\" \\\n https://:8008/api/system/pve-update/status | jq -r .state)\n [ \"$state\" != \"running\" ] && break\n sleep 30\ndone\necho \"final state: $state\"", + "haTitle": "Príklad pre Home Assistant", + "haBody": "Senzor rest zisťuje stav a rest_command spustí aktualizáciu. Priraďte ich k tlačidlu panela a potrebným automatizáciám:", + "haCode": "# configuration.yaml\nsensor:\n - platform: rest\n resource: https://pve.local:8008/api/system/pve-update/status\n name: pve_update_state\n value_template: \"{{ value_json.state }}\"\n scan_interval: 60\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\nrest_command:\n pve_update:\n url: https://pve.local:8008/api/system/pve-update/run\n method: POST\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\n # Start VM 100 (works for LXC too — same endpoint)\n vm_100_start:\n url: https://pve.local:8008/api/vms/100/control\n method: POST\n content_type: 'application/json'\n payload: '{\"action\": \"start\"}'\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\n # Backup VM 100 to the 'pbs-main' storage\n vm_100_backup:\n url: https://pve.local:8008/api/vms/100/backup\n method: POST\n content_type: 'application/json'\n payload: '{\"storage\": \"pbs-main\", \"mode\": \"snapshot\", \"compress\": \"zstd\"}'\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"" + }, + "health": { + "heading": "Monitor zdravia", + "rows": [ + { + "endpoint": "/api/health", + "method": "GET", + "use": "Ľahká kontrola vracajúca JSON s status, timestamp a version. Vhodná na kontrolu kľúčových slov Uptime Kuma; pri zapnutom overovaní klient posiela hlavičku Bearer." + }, + { + "endpoint": "/api/health/status", + "method": "GET", + "use": "Celkový stav: úroveň závažnosti a zhrnutie." + }, + { + "endpoint": "/api/health/details", + "method": "GET", + "use": "Všetkých desať kategórií so stavom a štruktúrovanými údajmi jednotlivých kontrol." + }, + { + "endpoint": "/api/health/full", + "method": "GET", + "use": "Úplné údaje: kategórie, aktívne chyby, potlačené výstrahy a nastavenia potlačenia. Používa výsledky na pozadí mladšie než šesť minút; inak alebo pri vynútenej obnove spustí novú kontrolu." + }, + { + "endpoint": "/api/health/active-errors", + "method": "GET", + "use": "Aktívny zoznam, filtrovateľný ?category=<name>." + }, + { + "endpoint": "/api/health/dismissed", + "method": "GET", + "use": "Potlačené výstrahy so zostávajúcimi hodinami stíšenia." + }, + { + "endpoint": "/api/health/settings", + "method": "GET", + "use": "Nastavené trvanie potlačenia pre každú kategóriu." + }, + { + "endpoint": "/api/health/remote-storages", + "method": "GET", + "use": "Inventár vzdialených úložísk definovaných Proxmoxom s online stavom." + }, + { + "endpoint": "/api/health/interfaces", + "method": "GET", + "use": "Sieťové rozhrania s typom (most / agregácia / fyzické), IP a rýchlosťou spojenia." + }, + { + "endpoint": "/api/health/acknowledge", + "method": "POST", + "use": "Telo: '{'\"error_key\":\"smart_sdh\"'}'. Potlačí výstrahu na čas nastavený pre jej kategóriu." + }, + { + "endpoint": "/api/health/cleanup-orphans", + "method": "POST", + "use": "Ručne vyčistí chyby odstránených zariadení alebo VM. Opakované spustenie je neškodné." + } + ], + "outro": "Formáty odpovedí a kategórie opisuje Health Monitor." + }, + "storage": { + "heading": "Úložisko", + "rows": [ + { + "endpoint": "/api/storage", + "method": "GET", + "use": "Disky viditeľné pre hostiteľa: blokové zariadenia, fondy ZFS a LVM." + }, + { + "endpoint": "/api/storage/summary", + "method": "GET", + "use": "Kompaktné zhrnutie pre karty panela." + }, + { + "endpoint": "/api/proxmox-storage", + "method": "GET", + "use": "Proxmox-definované úložiská z /etc/pve/storage.cfg s online stavom a voľným priestorom." + }, + { + "endpoint": "/api/storage/observations", + "method": "GET", + "use": "Trvalá história pozorovaní: výstrahy SMART, chyby I/O a udalosti ZFS. Zachová sa aj po automatickom vyriešení výstrahy." + }, + { + "endpoint": "/api/storage/smart/", + "method": "GET", + "use": "Aktuálne atribúty SMART pre jeden disk." + }, + { + "endpoint": "/api/storage/smart//latest", + "method": "GET", + "use": "Posledný autotest SMART pre disk." + }, + { + "endpoint": "/api/storage/smart//history", + "method": "GET", + "use": "Zoznam uložených správ SMART pre disk." + }, + { + "endpoint": "/api/storage/smart//history/", + "method": "GET", + "use": "Prečítajte si konkrétny uložený SMART report." + }, + { + "endpoint": "/api/storage/smart//test", + "method": "POST", + "use": "Spustí autotest SMART. Schéma tela: '{'\"type\":\"short\"|\"long\"'}'." + }, + { + "endpoint": "/api/storage/smart/schedules", + "method": "GET", + "use": "Zoznam aktuálne naplánovaných testov SMART." + }, + { + "endpoint": "/api/storage/smart/tools", + "method": "GET", + "use": "Overí, či sú nainštalované smartctl a súvisiace nástroje." + } + ] + }, + "network": { + "heading": "Sieť", + "rows": [ + { + "endpoint": "/api/network", + "method": "GET", + "use": "Všetky rozhrania so stavom spojenia a adresami." + }, + { + "endpoint": "/api/network/summary", + "method": "GET", + "use": "Kompaktný prehľad pre panel." + }, + { + "endpoint": "/api/network//metrics", + "method": "GET", + "use": "RX/TX pre každé rozhranie, počítadlá chýb a časové rady RRD." + }, + { + "endpoint": "/api/network/latency/current", + "method": "GET", + "use": "Posledné meranie latencie k bráne." + }, + { + "endpoint": "/api/network/latency/history", + "method": "GET", + "use": "Časový rad latencie brány." + } + ] + }, + "vms": { + "heading": "VM a kontajnery", + "rows": [ + { + "endpoint": "/api/vms", + "method": "GET", + "use": "VM a CT na lokálnom uzle so stavom, vmid a názvom." + }, + { + "endpoint": "/api/vms/", + "method": "GET", + "use": "Celý detail pre jedného hosťa (config, sieť, disky)." + }, + { + "endpoint": "/api/vms//metrics", + "method": "GET", + "use": "CPU / pamäť / disk I/O časový rad pre jedného hosťa (RRD)." + }, + { + "endpoint": "/api/vms//logs", + "method": "GET", + "use": "Protokoly nedávnych úloh tohto hosťa." + }, + { + "endpoint": "/api/vms//backups", + "method": "GET", + "use": "Zálohy uložené pre tohto hosťa." + }, + { + "endpoint": "/api/vms//control", + "method": "POST", + "use": "Vyberte jednu akciu zo schémy: '{'\"action\":\"start|stop|reboot|shutdown\"'}'. Ovláda napájanie hosťa." + }, + { + "endpoint": "/api/vms//backup", + "method": "POST", + "use": "Spustí vzdump pre hosťa. Telo určuje úložisko a režim (snapshot / suspend / stop)." + }, + { + "endpoint": "/api/vms//config", + "method": "PUT", + "use": "Upraví pole popisu (poznámky) VM alebo CT. Ostatné konfiguračné kľúče tento koncový bod nemení." + }, + { + "endpoint": "/api/node/metrics", + "method": "GET", + "use": "Súhrnné metriky uzla v časových radoch RRD." + } + ] + }, + "backups": { + "heading": "Zálohy", + "rows": [ + { + "endpoint": "/api/backups", + "method": "GET", + "use": "Zálohy nájdené na úložiskách dir, NFS, CIFS a PBS zisťovaných cez lokálny uzol. Nejde o úplnú kontrolu všetkých uzlov klastra." + }, + { + "endpoint": "/api/backup-storages", + "method": "GET", + "use": "Úložiská označené ako ciele záloh s voľným miestom." + } + ] + }, + "logs": { + "heading": "Logy, úlohy, udalosti", + "rows": [ + { + "endpoint": "/api/logs", + "method": "GET", + "use": "Filtrované záznamy systémového denníka. Parametre: ?level=&service=&limit=." + }, + { + "endpoint": "/api/logs/download", + "method": "GET", + "use": "Exportuje filtrovaný rozsah ako obyčajný text." + }, + { + "endpoint": "/api/events", + "method": "GET", + "use": "Interný tok udalostí používaný aj na oznámenia." + }, + { + "endpoint": "/api/task-log/", + "method": "GET", + "use": "Úplný protokol úlohy Proxmox v obyčajnom texte podľa UPID." + } + ] + }, + "notifications": { + "heading": "Oznámenia a AI", + "intro": "Odosielanie, kanály a preformulovanie AI opisujú Oznámenia a Asistent AI.", + "rows": [ + { + "endpoint": "/api/notifications", + "method": "GET", + "use": "Nedávne oznámenia zobrazené na paneli." + }, + { + "endpoint": "/api/notifications/download", + "method": "GET", + "use": "Exportuje oznámenia ako text." + }, + { + "endpoint": "/api/notifications/status", + "method": "GET", + "use": "Stav odosielania: aktívny proces na pozadí, dĺžka radu a posledné odoslanie." + }, + { + "endpoint": "/api/notifications/settings", + "method": "GET", + "use": "Číta nastavenia oznámení: kanály, prepínače udalostí, preformulovanie AI a zobrazované meno." + }, + { + "endpoint": "/api/notifications/history", + "method": "GET", + "use": "História odosielania. Parametre: ?limit=&offset=&severity=&channel=." + }, + { + "endpoint": "/api/notifications/history", + "method": "DELETE", + "use": "Vyprázdni tabuľku histórie odosielania." + }, + { + "endpoint": "/api/notifications/test", + "method": "POST", + "use": "Odošle skúšobné oznámenie do kanála. Telo: '{'\"channel\":\"telegram\"'}'." + }, + { + "endpoint": "/api/notifications/send", + "method": "POST", + "use": "Vytvorí vlastnú udalosť. Telo: '{'\"event_type\":\"custom\",\"severity\":\"WARNING\",\"title\":\"...\",\"body\":\"...\",\"data\":'{''}''}'." + }, + { + "endpoint": "/api/notifications/test-ai", + "method": "POST", + "use": "Overí spojenie s poskytovateľom AI. Polia tela (schéma): '{'\"provider\",\"api_key\",\"model\",\"ollama_url?\"'}'." + }, + { + "endpoint": "/api/notifications/provider-models", + "method": "POST", + "use": "Zoznam dostupných modelov pre vybraného poskytovateľa AI." + }, + { + "endpoint": "/api/notifications/proxmox/setup-webhook", + "method": "POST", + "use": "Zaregistrujte monitor ako cieľ webhook v /etc/pve/notifications.cfg." + }, + { + "endpoint": "/api/notifications/proxmox/cleanup-webhook", + "method": "POST", + "use": "Odstráni cieľ Monitora z konfigurácie oznámení PVE." + }, + { + "endpoint": "/api/notifications/proxmox/read-cfg", + "method": "GET", + "use": "Prečítajte si aktuálne PVE notifications.cfg ako to vidí PVE." + } + ] + }, + "security": { + "heading": "Bezpečnosť (čítanie)", + "rows": [ + { + "endpoint": "/api/security/firewall/status", + "method": "GET", + "use": "Stav firewallu PVE a aktívne pravidlá." + }, + { + "endpoint": "/api/security/fail2ban/details", + "method": "GET", + "use": "Stav jailu Fail2Ban; vyžaduje nainštalovaný voliteľný komponent." + }, + { + "endpoint": "/api/security/fail2ban/activity", + "method": "GET", + "use": "Nedávne udalosti Fail2Ban: blokovania, odblokovania a spustenia jailu." + }, + { + "endpoint": "/api/security/lynis/status", + "method": "GET", + "use": "Stav Lynis: inštalácia a čas poslednej kontroly." + }, + { + "endpoint": "/api/security/lynis/report", + "method": "GET", + "use": "Posledná správa Lynis: výstrahy, návrhy a index zabezpečenia." + }, + { + "endpoint": "/api/security/tools", + "method": "GET", + "use": "Detekovať, ktoré voliteľné bezpečnostné nástroje (Fail2Ban, Lynis) sú nainštalované." + } + ] + }, + "proxmenuxIntegration": { + "heading": "Integrácia ProxMenux", + "rows": [ + { + "endpoint": "/api/proxmenux/update-status", + "method": "GET", + "use": "Dostupnosť aktualizácie ProxMenux Monitor, nainštalovaná a najnovšia verzia." + }, + { + "endpoint": "/api/proxmenux/installed-tools", + "method": "GET", + "use": "Zoznam optimalizácií ProxMenux po inštalácii zaznamenaných na hostiteľovi (z /usr/local/share/proxmenux/installed_tools.json)." + }, + { + "endpoint": "/api/proxmenux/tool-source/", + "method": "GET", + "use": "Kód priradenej funkcie po inštalácii z aktuálnych skriptov hostiteľa alebo zachovaného staršieho kódu. Nezaručuje presnú snímku pôvodne spusteného kódu." + } + ] + }, + "prometheus": { + "heading": "Metriky Prometheus", + "intro": "Overený koncový bod GET /api/prometheus vracia textový formát Prometheus 0.0.4. Každá metrika obsahuje node=\"<hostname>\" a časovú pečiatku. Zber zabezpečí Prometheus alebo kompatibilná databáza časových radov.", + "exportedTitle": "Exportované metriky", + "headerGroup": "Skupina", + "headerMetric": "Metrika", + "headerDesc": "Popis", + "groups": [ + { + "group": "Systém", + "metrics": [ + { + "metric": "proxmox_cpu_usage", + "desc": "Percento využitia CPU, metrika typu gauge." + }, + { + "metric": "proxmox_memory_total_bytes", + "desc": "Úplná fyzická pamäť v bajtoch." + }, + { + "metric": "proxmox_memory_used_bytes", + "desc": "Použitá pamäť v bajtoch." + }, + { + "metric": "proxmox_memory_usage_percent", + "desc": "Percento využitia pamäte." + }, + { + "metric": "proxmox_load_average", + "desc": "Priemerná systémová záťaž. Štítok period=\"1m\" | \"5m\" | \"15m\"." + } + ] + }, + { + "group": "Čas prevádzky", + "metrics": [ + { + "metric": "proxmox_uptime_seconds", + "desc": "Sekundy od posledného spustenia." + } + ] + }, + { + "group": "Hardvér", + "metrics": [ + { + "metric": "proxmox_cpu_temperature_celsius", + "desc": "Teplota puzdra CPU." + }, + { + "metric": "proxmox_disk_temperature_celsius", + "desc": "Teplota každého disku. Štítok disk." + }, + { + "metric": "proxmox_fan_speed_rpm", + "desc": "Otáčky ventilátorov. Štítok fan." + } + ] + }, + { + "group": "Priestor na disku", + "metrics": [ + { + "metric": "proxmox_disk_total_bytes", + "desc": "Celková kapacita každého exportovaného záznamu disku. Štítok disk." + }, + { + "metric": "proxmox_disk_used_bytes", + "desc": "Použitá kapacita každého exportovaného záznamu disku." + }, + { + "metric": "proxmox_disk_usage_percent", + "desc": "Percento použitej kapacity každého exportovaného záznamu disku." + } + ] + }, + { + "group": "Sieť", + "metrics": [ + { + "metric": "proxmox_network_bytes_sent_total", + "desc": "Celkový počet odoslaných bajtov, metrika typu counter." + }, + { + "metric": "proxmox_network_bytes_received_total", + "desc": "Celkový počet prijatých bajtov, metrika typu counter." + }, + { + "metric": "proxmox_interface_bytes_sent_total", + "desc": "Bajty odoslané cez každé rozhranie. Štítok interface." + }, + { + "metric": "proxmox_interface_bytes_received_total", + "desc": "Bajty prijaté cez každé rozhranie." + } + ] + }, + { + "group": "VMs / CTs", + "metrics": [ + { + "metric": "proxmox_vms_total", + "desc": "Celkový počet VM a LXC." + }, + { + "metric": "proxmox_vms_running", + "desc": "Počet spustených hostí." + }, + { + "metric": "proxmox_vms_stopped", + "desc": "Počet zastavených hostí." + }, + { + "metric": "proxmox_vm_status", + "desc": "Stav VM/CT: 1 spustený, 0 iný stav. Štítky node, vmid a name." + }, + { + "metric": "proxmox_vm_cpu_usage", + "desc": "Využitie CPU pre každú VM/CT s rovnakými štítkami." + }, + { + "metric": "proxmox_vm_memory_used_bytes / _max_bytes", + "desc": "Použitá pamäť a nastavené maximum každej VM/CT." + } + ] + }, + { + "group": "GPU", + "metrics": [ + { + "metric": "proxmox_gpu_temperature_celsius", + "desc": "Teplota GPU. Štítky slot a vendor; gpu obsahuje aj názov GPU." + }, + { + "metric": "proxmox_gpu_utilization_percent", + "desc": "Percento využitia GPU." + }, + { + "metric": "proxmox_gpu_memory_total_bytes", + "desc": "Celková pamäť GPU." + }, + { + "metric": "proxmox_gpu_power_draw_watts", + "desc": "Príkon GPU vo wattoch." + }, + { + "metric": "proxmox_gpu_clock_speed_mhz", + "desc": "Takt jadra GPU." + }, + { + "metric": "proxmox_gpu_memory_clock_mhz", + "desc": "Takt pamäte GPU." + } + ] + }, + { + "group": "UPS", + "metrics": [ + { + "metric": "proxmox_ups_battery_charge_percent", + "desc": "Percento nabitia batérie." + }, + { + "metric": "proxmox_ups_load_percent", + "desc": "Aktuálne zaťaženie UPS." + }, + { + "metric": "proxmox_ups_runtime_seconds", + "desc": "Odhadovaná výdrž na batériu." + }, + { + "metric": "proxmox_ups_input_voltage_volts", + "desc": "Vstupné napätie." + } + ] + } + ], + "scrapeTitle": "Konfigurácia zberu Prometheus", + "scrapeIntro": "Pri zapnutom overovaní zadajte token API do hlavičky Bearer v konfigurácii zberu Prometheus:", + "perHostTitle": "Zber pre každého hostiteľa", + "perHostBody": "Každá inštancia exportuje metriky svojho hostiteľa. V klastri nastavte Prometheus na zber z každého uzla. Štítok node rozlišuje rady v Grafane (proxmox_vms_running'{'node=\"pve01\"'}')." + }, + "puttingItTogether": { + "heading": "Prepojenie integrácií", + "body": "Pozrite Integrácie na prepojenie koncových bodov so senzormi Home Assistant, kartami Homepage, panelmi Grafana, tokmi n8n a ďalšími nástrojmi. Obsahuje bežné konfigurácie na kopírovanie. Táto stránka uvádza katalóg koncových bodov." + }, + "whereNext": { + "heading": "Kam ďalej", + "items": [ + { + "label": "Prístup a overenie", + "href": "/docs/monitor/access-auth", + "tail": " — vytváranie tokenov, auditný protokol, voliteľný jail Fail2Ban a TLS." + }, + { + "label": "Oznámenia", + "href": "/docs/monitor/notifications", + "tailRich": " — obsah data pre každú udalosť pri volaní /api/notifications/send." + }, + { + "label": "AI asistent", + "href": "/docs/monitor/ai-assistant", + "tailRich": " — fungovanie /api/notifications/test-ai a /api/notifications/provider-models." + }, + { + "label": "Monitor zdravia", + "href": "/docs/monitor/health-monitor", + "tailRich": " — formát odpovedí /api/health/* a význam desiatich kategórií." + } + ] + } +} diff --git a/web/messages/sk/docs/monitor/architecture.json b/web/messages/sk/docs/monitor/architecture.json new file mode 100644 index 00000000..6901f32c --- /dev/null +++ b/web/messages/sk/docs/monitor/architecture.json @@ -0,0 +1,303 @@ +{ + "meta": { + "title": "Architektúra ProxMenux Monitor — AppImage, Flask, SQLite, WebSocket | ProxMenux", + "description": "Ako je postavený ProxMenux Monitor: štruktúra AppImage, blueprinty Flask, úlohy na pozadí, údaje psutil, pvesh, smartctl a journalctl, ukladanie SQLite, terminál WebSocket, poskytovatelia AI, kanály oznámení, reverzný proxy a voliteľný Fail2Ban.", + "ogTitle": "Architektúra ProxMenux Monitor", + "ogDescription": "Vnútri ProxMenux Monitor: AppImage, blueprinty Flask, úlohy na pozadí, SQLite, WebSocket, poskytovatelia AI a kanály oznámení.", + "twitterTitle": "Architektúra ProxMenux Monitor", + "twitterDescription": "AppImage, Flask, SQLite, WebSocket, poskytovatelia AI a kanály oznámení vo vnútri Monitora." + }, + "header": { + "title": "Architektúra", + "description": "Ako sa distribuuje ProxMenux Monitor, čo obsahuje AppImage a ako požiadavky prehliadača prechádzajú cez Flask k nástrojom hostiteľa a úložisku SQLite.", + "section": "ProxMenux Monitor" + }, + "intro": { + "title": "Jeden proces, veľa povinností", + "body": "Proces Python počúva na TCP 8008. Poskytuje statický web Next.js a REST API, spravuje terminál WebSocket, spúšťa Health Monitor a posiela oznámenia. Nepotrebuje samostatný webový server, sprostredkovateľa správ ani externú databázu." + }, + "requestFlow": { + "heading": "Priebeh požiadavky", + "intro": "Typická požiadavka na údaje prechádza touto cestou; nastavenia prehliadača sa môžu spracovať lokálne:", + "diagramCaption": "Chránené cesty overujú JWT pri zapnutom overovaní. Hlavné cesty a blueprinty vracajú údaje z cache alebo čerstvého zberu. Voliteľná kontrola Fail2Ban používa zoznam blokovaní z cache. Preposlaným IP hlavičkám dôveruje iba pri PROXMENUX_TRUST_PROXY=1; inak použije adresu spojenia. Trvalý stav zahŕňa SQLite aj JSON súbory, napríklad auth.json.", + "diagramArrowLabel": "HTTP / WS", + "nodes": { + "clientLabel": "Klient", + "clientDetail": "Prehliadač alebo PWA\n+ voliteľný proxy\nNginx / Caddy /\nTraefik", + "flaskLabel": "Flask :8008", + "flaskDetail": "Blueprinty\nMiddleware JWT\nKontrola Fail2Ban\n(ak je nainštalovaný)", + "hostLabel": "Hostiteľské nástroje", + "hostDetail": "psutil\npvesh\nsmartctl\njournalctl", + "stateLabel": "Lokálny stav", + "stateDetail": "SQLite DB\n+ auth.json" + }, + "threadsIntro": "Proces spúšťa aj vlákna na pozadí. Tieto príklady zbierajú údaje, aktualizujú cache a SQLite a posielajú oznámenia. Existujú aj ďalšie úlohy; odosielanie musí byť zapnuté:", + "headerThread": "Vlákno", + "headerCadence": "Interval", + "headerJob": "Plánovaná úloha", + "rows": [ + { + "thread": "_temperature_collector_loop", + "cadence": "60 s", + "job": "Ukladá teplotu CPU a vzorky latencie do databázy histórie, aby mali grafy údaje aj bez pripojeného prehliadača." + }, + { + "thread": "_health_collector_loop", + "cadence": "5 min", + "job": "Spúšťa cyklus Health Monitor s desiatimi kategóriami, ukladá chyby a pozorovania diskov, zohľadňuje potlačenia a odovzdáva nové udalosti oznamovaciemu systému." + }, + { + "thread": "_vital_signs_sampler", + "cadence": "CPU 5 s; teplota 15 s; pamäť 30 s", + "job": "Vzorkuje využitie CPU, pamäť a teplotu CPU pre ukazovatele a trvalé podmienky, nezávisle od päťminútovej celkovej kontroly." + }, + { + "thread": "notification_manager.start()", + "cadence": "riadené udalosťami", + "job": "Spustí sledovanie denníka, úloh a hookov (JournalWatcher, TaskWatcher, ProxmoxHookWatcher) a odosiela do nastavených kanálov s voliteľným preformulovaním AI." + } + ] + }, + "systemd": { + "heading": "Jednotka systemd", + "intro": "Inštalátor vytvorí jednotku /etc/systemd/system/proxmenux-monitor.service. Predvolená konfigurácia:", + "items": [ + "User=root: služba používa oprávnenia root na SMART, pvesh a správu ZFS. Procesy webového terminálu dedia tieto oprávnenia.", + "Restart=on-failure s odstupom desať sekúnd: po chybovom ukončení sa služba automaticky reštartuje.", + "After=network.target: zaradí štart po tomto cieli; nezaručuje pridelenú IP, DNS ani vonkajšie spojenie." + ], + "inspectTitle": "Kontrola aktuálnej jednotky" + }, + "appimage": { + "heading": "Čo AppImage obsahuje", + "intro": "AppImage obsahuje súborový systém pripojený pri spustení. AppRun v koreni pripraví prostredie a spustí flask_server.py:", + "consequencesIntro": "Dva dôsledky tohto usporiadania:", + "consequences": [ + "Pribalené prostredie Python. Interpret a balíky sú v AppImage, bez inštalácie do systémového Pythonu. Aplikácia naďalej používa rozhrania jadra a externé nástroje hostiteľa.", + "Pribalení klienti hardvéru. Obsahuje ipmitool, lm-sensors a upsc. Merania vyžadujú podporovaný hardvér, prístup k senzorom a pre UPS nastavený server NUT." + ] + }, + "flask": { + "heading": "Štruktúra aplikácie Flask", + "intro": "flask_server.py vytvorí inštanciu Flask(__name__) s obmedzeným CORS, priamo registruje deväť blueprintov a inicializuje terminál. Tabuľka uvádza hlavné moduly; registrované sú aj audit, zálohy VM a PBS. Prednačítavanie PVE beží iba na hostiteľoch PVE.", + "headerBlueprint": "Blueprint / modul", + "headerPrefix": "Predpona ciest", + "headerOwns": "Zodpovednosť", + "rows": [ + { + "blueprint": "flask_server.py", + "prefix": [ + "/api/system", + "/api/storage", + "/api/network", + "/api/vms", + "/api/hardware", + "/api/logs", + "/api/prometheus" + ], + "owns": "Hlavné koncové body, statický web a voliteľná kontrola Fail2Ban, ak je na hostiteľovi jail proxmenux." + }, + { + "blueprint": "flask_auth_routes.py", + "prefix": [ + "/api/auth/*" + ], + "owns": "Prihlásenie, vydávanie JWT, nastavenie a overenie TOTP, zmena hesla a tokeny API." + }, + { + "blueprint": "flask_health_routes.py", + "prefix": [ + "/api/health/*" + ], + "owns": "Kontroly stavu, podrobnosti, aktívne a potlačené chyby a nastavenia potlačenia. Chránené cesty vyžadujú overenie, ak je zapnuté." + }, + { + "blueprint": "flask_terminal_routes.py", + "prefix": [ + "/api/terminal/* + WS" + ], + "owns": "Pridelí PTY každej relácii a cez WebSocket ho prepojí s xterm.js v prehliadači." + }, + { + "blueprint": "flask_notification_routes.py", + "prefix": [ + "/api/notifications/*" + ], + "owns": "Vytváranie, čítanie, úprava a odstránenie kanálov; testy, AI, história a ručné odosielanie." + }, + { + "blueprint": "flask_security_routes.py", + "prefix": [ + "/api/security/*" + ], + "owns": "Zlyhania prihlásenia a pri nainštalovanom Fail2Ban stav jailu, blokovania a ručné odblokovanie." + }, + { + "blueprint": "flask_proxmenux_routes.py", + "prefix": [ + "/api/proxmenux/*" + ], + "owns": "Číta optimalizácie ProxMenux zaznamenané na hostiteľovi." + }, + { + "blueprint": "flask_oci_routes.py", + "prefix": [ + "/api/oci/*" + ], + "owns": "Funkcie nasadenia aplikácií OCI a kontajnerov na Proxmox VE 9.1+." + } + ], + "endpointsLink": "Koncové body integrácií a ich formáty opisuje Referenčná príručka API." + }, + "dataSources": { + "heading": "Zdroje údajov", + "intro": "Údaje hostiteľa pochádzajú najmä zo štandardných knižníc, súborov a správcovských príkazov. Niektoré údaje hostí vyžadujú aj QEMU Guest Agent alebo príkazy v CT:", + "headerSource": "Zdroj", + "headerUsedFor": "Používa sa na", + "rows": [ + { + "source": "psutil", + "usedFor": "Záťaž CPU, pamäť, swap, využitie pripojených systémov, sieťové počítadlá a procesy." + }, + { + "source": "pvesh / qm / pct", + "usedFor": "Informácie uzla Proxmox, inventár a konfigurácia VM/CT, úložiská a história úloh." + }, + { + "source": "smartctl", + "usedFor": "Atribúty SATA/NVMe, stav SMART, opotrebenie, životnosť, model a sériové číslo." + }, + { + "source": "zpool / zfs", + "usedFor": "Stav fondu (ONLINE / DEGRADED / FAULTED / UNAVAIL), priebeh kontroly scrub a využitie datasetov." + }, + { + "source": "journalctl", + "usedFor": "Systémové protokoly, procesy ukončené pre OOM, chyby ATA/NVMe/dm, bezpečnostné udalosti a vlastné jednotky služieb." + }, + { + "source": "ip / iproute2", + "usedFor": "Rozhrania, adresy, mosty, agregácie spojení a zariadenia spravované OVS." + }, + { + "source": "nvidia-smi · intel_gpu_top", + "usedFor": "Dostupné údaje GPU o využití, VRAM, teplote a kódovaní/dekódovaní. Polia závisia od výrobcu, nástroja a ovládača." + }, + { + "source": "lspci · lscpu · dmidecode", + "usedFor": "Topológia PCIe, model a topológia CPU, základná doska a BIOS." + }, + { + "source": "ipmitool · sensors", + "usedFor": "Mimopásmové senzory, ventilátory a teploty základnej dosky, ak ich hardvér podporuje." + }, + { + "source": "upsc (NUT)", + "usedFor": "Stav batérie, záťaž a výdrž UPS pri nastavenom serveri NUT." + } + ], + "cacheTitle": "Cache obmedzuje požiadavky na hostiteľa", + "cacheBody": "Náročné výsledky smartctl -a a pvesh get sa dočasne ukladajú v procese Flask, čím sa znižuje počet volaní diskov a API klastra. Trvanie závisí od zdroja: sekundy pre metriky a minúty pre SMART." + }, + "persistence": { + "heading": "Perzistencia", + "intro": "Viaceré stavové súbory majú odlišný obsah a požiadavky na prístup:", + "headerPath": "Path", + "headerOwner": "Vlastník", + "headerContents": "Obsah", + "rows": [ + { + "path": "/usr/local/share/proxmenux/health_monitor.db", + "owner": "root:root", + "contents": "Databáza SQLite. Tabuľky: errors, events, disk_registry, disk_observations, user_settings, notification_history, excluded_storages, excluded_interfaces. Režim denníka WAL." + }, + { + "path": "/usr/local/share/proxmenux/.notification_key", + "owner": "root 0600", + "contents": "Hlavný 32-bajtový kľúč pre tajné nastavenia oznámení ENC2. Používa náhodnú soľ pre každú hodnotu, odvodené kľúče a MAC. Staré hodnoty XOR podporuje na migráciu." + }, + { + "path": "/root/.config/proxmenux-monitor/auth.json", + "owner": "root:root", + "contents": "Konfigurácia prístupu: zapnutie, meno, osolený hash hesla PBKDF2-HMAC-SHA256, tajomstvo TOTP, obnovovacie kódy, kľúč JWT inštalácie, metadáta tokenov API a hashe odvolania. Staré hashe SHA-256 sa migrujú po úspešnom prihlásení." + }, + { + "path": "/var/log/proxmenux-auth.log", + "owner": "root:root", + "contents": "Textový protokol overovania nezávislý od Fail2Ban. Ak je jail [proxmenux] nainštalovaný a aktívny, číta ho na detekciu opakovaných zlyhaní prihlásenia. Bez jailu zostáva protokol dostupný na kontrolu." + } + ], + "backupTitle": "Zálohujte auth.json pred reinštaláciou", + "backupBody": "Výmena AppImage zvyčajne zachová /root/.config/proxmenux-monitor/auth.json a /usr/local/share/proxmenux/health_monitor.db. Zachovajte auth.json s jwt_secret pre platnosť a metadáta tokenov. Databáza nezávisle ukladá stav a oznámenia. S ňou zálohujte .notification_key na obnovu tajných nastavení kanálov; samotná databáza neobnoví overovanie API." + }, + "health": { + "heading": "Cyklus Health Monitor", + "intro": "Približne každých päť minút zberač na pozadí volá health_monitor.py na kontroly desiatich kategórií panela:", + "items": [ + "Kritické služby PVE (pveproxy, pvedaemon, pvestatd, pve-cluster).", + "Úložiská Proxmox: pvesh get /storage a dostupnosť každého úložiska.", + "Disky a súborové systémy: SMART, chyby I/O v dmesg, stav ZFS a kapacita pripojených systémov.", + "VM a CT: zlyhania štartu, pády, chyby QMP a zlyhania vypnutia.", + "Sieť: stav mostov a agregácií spojení, stav liniek a latencia k bráne.", + "Aktualizácie: čakajúce balíky a bezpečnostné opravy.", + "Protokoly: trvalé vzory, špičky a kaskády v systémovom denníku.", + "Pamäť: zásahy OOM killer a dlhodobý tlak na RAM.", + "Teplota: hodnoty CPU a diskov sa porovnávajú s monitorovacími prahmi; dostupné senzory závisia od hardvéru.", + "Bezpečnosť: zlyhania prihlásenia, blokovania a stav jailu Fail2Ban." + ], + "afterIntro": "Nálezy používajú stabilné error_key, kategóriu a závažnosť. Riadky v errors sa aktualizujú cez last_seen a počty bez duplicít. Odosielanie oznámení má aj vlastné odtlačky a časové odstupy.", + "cycleEnd": "Čistenie môže vyriešiť staré chyby podľa trvania potlačenia kategórie a stavových pravidiel, odstrániť osirelé záznamy zrušených prostriedkov a vymazať events staršie než 30 dní. Kategórie opisuje Panel → Health Monitor." + }, + "notifications": { + "heading": "Systém oznámení", + "intro": "notification_manager.py riadi odosielanie: načíta kanály, spravuje rad a poskytuje Python API pre Flask a Health Monitor aj vstup CLI pre hooky .sh ProxMenux.", + "items": [ + "Sledovacie komponenty vytvárajú udalosti: JournalWatcher sleduje denník, TaskWatcher zisťuje úlohy Proxmox, ProxmoxHookWatcher prijíma hooky záloh, replikácie a snímok a PollingCollector spracúva pomalé zdroje.", + "Šablóny prevedú udalosti na názov a text. Nastavený poskytovateľ AI (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter) ich môže preformulovať bežným jazykom. Obe verzie sa ukladajú do notification_history.", + "Kanály odosielajú cez služby ako Telegram, Discord, email, Gotify, Pushover a Apprise. Implementácie v notification_channels.py používajú spoločné rozhranie create_channel() / send().", + "Šifrovanie. Citlivé nastavenia (telegram.bot_token, discord.webhook_url, pushover.user_key, pushover.api_token, ai_api_key_*, email.password) sa pred uložením šifrujú kľúčom z .notification_key a v rozhraní sa zobrazujú maskované." + ], + "linksFooter": "Prepínače udalostí, nastavenia kanálov a AI opisujú Nastavenia → Oznámenia a Nastavenia → Asistent AI." + }, + "websocket": { + "heading": "Terminál WebSocket", + "intro": "Karta Terminál prepája ľahkého klienta xterm.js s PTY servera cez WebSocket. Existujú dva režimy:", + "items": [ + "Režim HTTP, predvolený: vstavaný server Flask s flask-sock spracúva prechod na protokol WebSocket.", + "Režim HTTPS / WSS: používa gevent.pywsgi.WSGIServer s geventwebsocket.handler.WebSocketHandler na spojenia WebSocket cez TLS." + ], + "outro": "Procesy terminálu dedia User=root. Pri zapnutom overovaní WebSocket vyžaduje krátkodobý jednorazový lístok získaný z overeného koncového bodu so správcovským oprávnením. Pri vypnutom alebo odmietnutom overovaní spojenie používa tento neoverovaný režim.", + "proxyNote": "Pri reverznom proxy povoľte WebSocket a hlavičky Upgrade a Connection. Terminál potrebuje toto preposielanie." + }, + "proxy": { + "heading": "Reverzný proxy a Fail2Ban", + "intro": "Výber IP klienta a voliteľné blokovanie v aplikácii závisia od týchto nastavení a komponentov:", + "items": [ + "Výber IP klienta. Kontrola before_request a protokol prístupu dôverujú X-Forwarded-For a potom X-Real-IP iba pri PROXMENUX_TRUST_PROXY=1. Inak použijú request.remote_addr. Preposlané hlavičky sa neprijímajú automaticky.", + "Voliteľný Fail2Ban v aplikácii. Spojenie cez proxy môže mať IP proxy ako TCP protistranu. Pri dôveryhodnej IP klienta a aktívnom jaile proxmenux Flask odmietne blokované IP stavom HTTP 403. Zoznam je v cache 30 sekúnd a obnoví ho spracovanie požiadavky po vypršaní, nie samostatný časovač." + ], + "calloutTitle": "Fail2Ban nie je pribalený", + "calloutBody": "Fail2Ban nie je pribalený ani automaticky inštalovaný. Nainštalujete ho v Zabezpečení Monitora alebo cez Zabezpečenie → Fail2Ban v ProxMenux Scripts. Bez fail2ban-client či jailu proxmenux táto kontrola neblokuje požiadavky. Nastavená politika overovania zostáva v platnosti.", + "outro": "Príklady Nginx/Caddy/Traefik a návod na jail sú v Prístup a overenie a Zabezpečenie → Fail2Ban." + }, + "whereNext": { + "heading": "Kam ďalej", + "items": [ + { + "label": "Prístup a overenie", + "href": "/docs/monitor/access-auth", + "tail": " — prvé spustenie, heslo a TOTP 2FA, príklady reverzného proxy a jail Fail2Ban." + }, + { + "label": "Referenčná príručka API", + "href": "/docs/monitor/api", + "tail": " — koncové body integrácií, správa tokenov a pravidlá overovania." + }, + { + "label": "Nastavenie → ProxMenux Monitor", + "href": "/docs/settings/proxmenux-monitor", + "tail": " — ovládanie služby a kontrola stavu v textovej ponuke ProxMenux." + } + ] + } +} diff --git a/web/messages/sk/docs/monitor/audit-report/assessment.json b/web/messages/sk/docs/monitor/audit-report/assessment.json new file mode 100644 index 00000000..a00d8f6f --- /dev/null +++ b/web/messages/sk/docs/monitor/audit-report/assessment.json @@ -0,0 +1,218 @@ +{ + "meta": { + "title": "Hodnotenie a inventár | Audit a správy", + "description": "Hodnotenie vo funkcii Audit a správy: profily správ, klasifikácia výsledkov, akceptované riziká, nečitateľné zdroje, Lynis a inventár uzla." + }, + "header": { + "title": "Hodnotenie a inventár", + "description": "Hodnotenie kontroluje uzol, uchováva jeho zistenia a odpovedá na rôzne otázky v závislosti od profilu správy.", + "section": "Audit a správy" + }, + "sections": [ + { + "id": "read-only", + "blocks": [ + { + "calloutInfo": { + "title": "Hodnotenie kontroluje; nemení konfiguráciu", + "body": "Číta konfiguráciu a stav hostiteľa. Napíše svoje výsledky, správy a protokoly a kontroly zavádzania môžu na chvíľu pripojiť systémové partície EFI. Konfigurácia, ktorú posudzuje, sa nemení." + } + }, + { + "p": "Spustiť hodnotenie spustí profil vybraný v položke Správa. Zobrazenie ukazuje dátum posledného spustenia a uplynutý čas." + } + ] + }, + { + "id": "profiles", + "title": "Profily správ", + "intro": "Každý profil odpovedá na inú otázku. Kontroly a oddiely sa vyberú pred zložením dokumentu.", + "blocks": [ + { + "table": { + "headers": [ + "Profil", + "Čo zahŕňa" + ], + "rows": [ + [ + "Úplný audit", + "Všetky kontroly a celá dostupná štruktúra." + ], + [ + "Rýchla diagnostika", + "Každá kontrola; výsledok sa otvára kritickými zisteniami, upozorneniami a meraniami, ktoré nebolo možné overiť." + ], + [ + "Inventár", + "Opis uzla bez kontrol a klasifikácie." + ], + [ + "Kontrola bezpečnosti", + "Vystavenie útokom, prístup, oprávnenia, certifikáty, aktualizácie, repozitáre a Lynis." + ], + [ + "Overenie záloh", + "Pokrytie, vek, výsledky, overenie, uchovávanie a obnovenie záloh." + ], + [ + "Kapacita a opotrebenie", + "Rastové rozpätie, pamäť, využitie priestoru a životnosť diskov." + ] + ] + } + }, + { + "p": "Obsah každého dokumentu je popísaný v Správy a porovnania." + } + ] + }, + { + "id": "results", + "title": "Ako sú výsledky klasifikované", + "blocks": [ + { + "table": { + "headers": [ + "Zatriedenie", + "Význam" + ], + "rows": [ + [ + "Kritická", + "Zlyhaná podmienka, ktorá má prednosť." + ], + [ + "Varovanie", + "Podmienka vyžadujúca kontrolu vzhľadom na dôkazy alebo politiku." + ], + [ + "Poznámka", + "Informácie o uzle, ktorý nie je hlásený ako zlyhanie." + ], + [ + "Nepodarilo sa overiť", + "Zdroj potrebný na kontrolu sa nepodarilo prečítať. To neznamená, že problém neexistuje." + ], + [ + "V poriadku", + "Podmienka spĺňa použité kritérium." + ], + [ + "Netýka sa", + "Nič v rozsahu kontroly neplatí." + ], + [ + "Prijaté riziko", + "Toto zistenie existuje a rozhodnutie o ňom bolo zaznamenané." + ], + [ + "Vylúčené politikou", + "Politika vyhlasuje, že prvok je vynechaný z počtu." + ] + ] + } + }, + { + "p": "Zistenia možno filtrovať podľa oblasti: Systém, Úložisko, Sieť, Zabezpečenie, Zálohovanie, Hosťovské systémy a Hardvér. Každé zistenie si zachová dôkazy aj zdroj, z ktorého boli načítané." + } + ] + }, + { + "id": "unverified", + "title": "Keď zdroj nemožno prečítať", + "blocks": [ + { + "table": { + "headers": [ + "Prípad", + "Správanie" + ], + "rows": [ + [ + "Nepodarilo sa overiť", + "Kontrola si zachová identitu, v dôkazoch uvedie, ktorý zdroj zlyhal, a nezmení chýbajúce údaje na výsledok potvrdzujúci súlad." + ], + [ + "Neúplné dôkazy", + "Správa uvádza zdroj a čas zberu, aby bolo možné odlíšiť skutočný problém od nedostatočného načítania." + ], + [ + "Nové spustenie", + "Po oprave prístupu, balíka alebo služby, ten istý profil beží znova a porovnanie ukazuje, či je výsledok možné overiť." + ] + ] + } + } + ] + }, + { + "id": "lynis", + "title": "Lynis", + "blocks": [ + { + "p": "Bezpečnostná kontrola používa správu Lynis z hostiteľa. Ak Lynis ešte nebol spustený alebo je správa staršia než povoľuje politika, dialóg ponúkne Spustiť s Lynis, čo trvá o niekoľko minút dlhšie, alebo Spustiť bez Lynis, čo použije existujúcu správu." + }, + { + "figure": { + "src": "/monitor/audit/lynis-dialog.png", + "alt": "Dialóg, ktorý ponúka spustenie hodnotenia s alebo bez Lynis", + "caption": "Lynisov dialóg pred bezpečnostnou previerkou." + } + } + ] + }, + { + "id": "accept", + "title": "Prijatie rizika", + "blocks": [ + { + "p": "Akceptovať riziko zaznamená rozhodnutie o zistení. Dôvod je povinný a uloží sa spolu s autorom a dátumom." + }, + { + "table": { + "headers": [ + "Pole", + "Možnosti" + ], + "rows": [ + [ + "Dôvod", + "Voľný text, požadovaný." + ], + [ + "Znova preveriť po", + "90 dní, 180 dní, 1 rok alebo nevyprší platnosť. Keď obdobie skončí, nález sa znova stane aktívnym." + ], + [ + "Pripomenúť kontrolu", + "Pripomenutie, ktoré privádza rozhodnutie späť do pozornosti, kým zostáva v platnosti." + ] + ] + } + }, + { + "p": "Akceptované zistenie zostáva viditeľné s rozhodnutím; Vrátiť do aktívneho stavu akceptovanie zruší. Akceptovanie rizika nie je oprava: porovnanie ho uvedie ako akceptované, nie vyriešené." + } + ] + }, + { + "id": "inventory", + "title": "Inventár", + "blocks": [ + { + "list": { + "items": [ + "Identita, verzia Proxmox VE, jadro, predplatné a klaster.", + "CPU, pamäť, základná doska, BIOS, radiče a IOMMU.", + "Disky, SMART, hodiny prevádzky a zaznamenané udalosti.", + "Adaptéry, bondy, mosty, latencia a spojenia.", + "Úložisko, hosťovské systémy s ich diskami a rozhraniami a zálohy.", + "PCI passthrough a softvér spravovaný ProxMenux." + ] + } + } + ] + } + ] +} diff --git a/web/messages/sk/docs/monitor/audit-report/changes.json b/web/messages/sk/docs/monitor/audit-report/changes.json new file mode 100644 index 00000000..7c6642d2 --- /dev/null +++ b/web/messages/sk/docs/monitor/audit-report/changes.json @@ -0,0 +1,208 @@ +{ + "meta": { + "title": "Zmeny | Audit a správy", + "description": "Denník zmien funkcie Audit a správy: čo ProxMenux zmenil na hostiteľovi, predchádzajúci stav, rozdiely a možnosť vrátenia zmien." + }, + "header": { + "title": "Zmeny", + "description": "Denník operácií ProxMenux na hostiteľovi a, ak bol zachytený, stavu pred každou operáciou a po nej.", + "section": "Audit a správy" + }, + "sections": [ + { + "id": "purpose", + "blocks": [ + { + "calloutInfo": { + "title": "Od spusteného skriptu k vykonanej zmene", + "body": "Dlhá funkcia môže zmeniť iba dva riadky. Denník uchováva každú konkrétnu operáciu so zodpovedným skriptom, funkciou a verziou, dotknutým zdrojom, rozdielom a možnosťou vrátenia." + } + }, + { + "flow": { + "nodes": [ + { + "label": "Skript", + "detail": "funkcia + verzia" + }, + { + "label": "Zachytiť", + "detail": "obsah pred" + }, + { + "label": "Operácia", + "detail": "súbor · balík · služba" + }, + { + "label": "Denník zmien", + "detail": "Priradenie + rozdiel" + } + ], + "caption": "Zachytenie sa vykoná pri operácii a konsoliduje sa, keď Monitor načíta denník." + } + }, + { + "figure": { + "src": "/monitor/audit/changes-view.png", + "alt": "Zobrazenie Zmeny vo funkcii Audit a správy so záznamami zoskupenými podľa voľby po inštalácii a skriptu", + "caption": "Zobrazenie zmien s rozdielmi v súbore upravenom ProxMenuxom." + } + } + ] + }, + { + "id": "types", + "title": "Typy záznamov", + "intro": "Filter hore oddeľuje položky podľa druhu.", + "blocks": [ + { + "table": { + "headers": [ + "Druh", + "Čo zaznamenáva" + ], + "rows": [ + [ + "Konfigurácia", + "ProxMenux napísal, upravil alebo odstránil súbor, zmenil nastavenie alebo zmenil službu." + ], + [ + "Inštalácie", + "ProxMenux pridal balíček alebo komponent, a balíky, ktoré sa skutočne objavili, sú zaznamenané." + ], + [ + "Spustenia", + "ProxMenux spustil príkaz; jeho zmeny závisia od samotného príkazu." + ], + [ + "Použité", + "Funkcia bola použitá pred vytvorením denníka; predchádzajúci stav nebol zachytený." + ] + ] + } + } + ] + }, + { + "id": "groups", + "title": "Ako je zobrazenie usporiadané", + "blocks": [ + { + "table": { + "headers": [ + "Oddiel", + "Obsah" + ], + "rows": [ + [ + "Optimalizácie po inštalácii", + "Zoskupené podľa voľby po inštalácii, ktorú vybral používateľ." + ], + [ + "Skripty ProxMenux", + "GPU, Coral, sieť, úložisko, zabezpečenie, nástroje a ďalšie skripty s auditným zaznamenávaním vrátane inštalátora ProxMenux a ProxMenux Monitor." + ], + [ + "Nainštalované balíky a nástroje", + "Softvér nainštalovaný cez ProxMenux na hostiteľovi." + ] + ] + } + }, + { + "p": "V rámci každej sekcie Podľa funkcie zoskupuje položky pod funkciou, ktorá ich vytvorila." + } + ] + }, + { + "id": "entry", + "title": "Čo každý záznam ukazuje", + "blocks": [ + { + "list": { + "items": [ + "Skript, funkcia a zodpovedná verzia.", + "Dátum a dotknutý zdroj.", + "Známy stav pred zmenou a po nej.", + "Línie pridané a odstránené.", + "Balíčky, ktoré boli skutočne pridané.", + "Zmena stavu služby.", + "Vrátenie zmeny: Obnoví presne predchádzajúci stav, Odstráni súbor (predtým neexistoval), Balík možno odinštalovať, čiastočné vrátenie alebo Nemožno vrátiť z denníka." + ] + } + } + ] + }, + { + "id": "before", + "title": "Čo znamená predchádzajúci stav", + "blocks": [ + { + "p": "Predchádzajúci stav môže byť zachytený obsah, prvýkrát vytvorený súbor alebo neznámy stav. Zmeny pred vytvorením denníka nemožno zrekonštruovať; opätovné spustenie funkcie najprv zachytí stav nájdený v danom okamihu." + } + ] + }, + { + "id": "limits", + "title": "Rozsah denníka", + "blocks": [ + { + "list": { + "items": [ + "Ručné zmeny a zmeny vykonané iným softvérom sa nezaznamenávajú.", + "Sú zahrnuté len operácie, ktoré prechádzajú primitívmi auditu ProxMenux.", + "Záznam nikdy neblokuje operáciu, ktorú opisuje: ak nie je možné zápis zapísať, operácia pokračuje.", + "Následné zmeny jedného zdroja sú uvedené ako známy pôvod proti súčasnému stavu." + ] + } + } + ] + }, + { + "id": "retention", + "title": "Uložené dôkazy", + "blocks": [ + { + "table": { + "headers": [ + "Prvok", + "Správanie" + ], + "rows": [ + [ + "Položky", + "Záznamy sa uchovávajú na hostiteľovi; z denníka sa nič automaticky neodstraňuje." + ], + [ + "Zachovaný obsah", + "Zachytený objekt sa uchováva, kým sa na neho vzťahuje záznam." + ], + [ + "Veľkosť zachytenia", + "Obsah nad 1 MiB sa neukladá celý; záznam uvedie, že zachytenie bolo vynechané pre veľkosť." + ], + [ + "Čítanie", + "Monitor nenačítava uložené objekty väčšie než 2 MiB." + ], + [ + "Rozdiel", + "Zobrazuje sa najviac 400 riadkov; dlhší rozdiel je označený ako skrátený." + ], + [ + "Zoznam", + "API predvolene vracia 200 záznamov na požiadavku, najviac 1000." + ] + ] + } + }, + { + "calloutWarning": { + "title": "Uložený obsah neznamená automatické vrátenie zmeny", + "body": "Predchádzajúci obsah možno preskúmať a ručne obnoviť, ale zobrazenie Zmeny nevracia operácie späť. Záznam spustenia uloží príkaz bez znalosti všetkých účinkov spusteného nástroja." + } + } + ] + } + ] +} diff --git a/web/messages/sk/docs/monitor/audit-report/index.json b/web/messages/sk/docs/monitor/audit-report/index.json new file mode 100644 index 00000000..ff0a7a7c --- /dev/null +++ b/web/messages/sk/docs/monitor/audit-report/index.json @@ -0,0 +1,136 @@ +{ + "meta": { + "title": "Audit a správy | ProxMenux Monitor", + "description": "Posúďte uzol Proxmox VE, zaznamenajte zmeny ProxMenux a určte očakávania pre hosťovské systémy a úložisko s možnosťou tlače správ." + }, + "header": { + "title": "Audit a správy", + "description": "Posúdenie uzla, denník zmien ProxMenux a deklarované očakávania s dokumentmi, ktoré možno vytlačiť alebo uložiť ako PDF.", + "section": "ProxMenux Monitor" + }, + "sections": [ + { + "id": "views", + "blocks": [ + { + "calloutInfo": { + "title": "Tri zobrazenia, tri otázky", + "body": "Audit a správy oddeľuje fakty o uzle, zásahy ProxMenux a deklarované očakávania. Konfigurácia, ktorú nemožno porovnať s deklarovaným účelom, sa opíše bez označenia za chybu." + } + }, + { + "cards": { + "items": [ + { + "icon": "shield", + "title": "Hodnotenie — v akom stave je uzol?", + "body": "Spustí kontroly vybraného profilu, zloží inventár a klasifikuje, čo potrebuje pozornosť, s dôkazmi o každom výsledku." + }, + { + "icon": "refresh", + "title": "Zmeny — čo urobil ProxMenux?", + "body": "Uvádza súbory, balíky, služby a príkazy zmenené skriptmi ProxMenux s auditným zaznamenávaním, vrátane predchádzajúceho stavu, ak bol zachytený." + }, + { + "icon": "fileText", + "title": "Politika — čo sa očakáva?", + "body": "Určuje, ktoré hosťovské systémy potrebujú zálohu alebo sa musia spustiť s hostiteľom, ktoré úložisko je nevyhnutné a aké sú prahové hodnoty kontrol." + } + ] + } + }, + { + "flow": { + "nodes": [ + { + "label": "Hodnotenie", + "detail": "fakty" + }, + { + "label": "Politika", + "detail": "kontext" + }, + { + "label": "Zmeny", + "detail": "intervencie" + } + ], + "caption": "Hodnotenie poskytuje fakty, politika im dáva kontext a denník zaznamenáva zásahy ProxMenux." + } + }, + { + "figure": { + "src": "/monitor/audit/assessment-view.png", + "alt": "Audit a správy v ProxMenux Monitor so zobrazeniami Hodnotenie, Zmeny a Politika", + "caption": "Audit a správy s otvoreným zobrazením Hodnotenie." + } + } + ] + }, + { + "id": "boundaries", + "title": "Tri rôzne funkcie", + "blocks": [ + { + "table": { + "headers": [ + "Funkcia", + "Čo to robí?" + ], + "rows": [ + [ + "Monitor stavu", + "Nepretržite sleduje metriky a udalosti a môže vytvárať oznámenia." + ], + [ + "Audit a správy", + "Na požiadanie vykoná hodnotenie, zdokumentuje uzol a porovná jednotlivé spustenia." + ], + [ + "Denník zmien", + "Zaznamenáva operácie ProxMenux vykonané cez jeho základné auditné funkcie." + ] + ] + } + } + ] + }, + { + "id": "pages", + "title": "Strany tejto sekcie", + "blocks": [ + { + "next": { + "items": [ + { + "label": "Hodnotenie a súpis", + "href": "/docs/monitor/audit-report/assessment", + "tail": "profily, výsledky, akceptované riziká a inventár." + }, + { + "label": "Zmeny", + "href": "/docs/monitor/audit-report/changes", + "tail": "denník toho, čo ProxMenux zmenil na hostiteľa." + }, + { + "label": "Politika", + "href": "/docs/monitor/audit-report/policy", + "tail": "hosťovské systémy, úložisko a prahové hodnoty." + }, + { + "label": "Správy a porovnania", + "href": "/docs/monitor/audit-report/reports", + "tail": "šesť dokumentov a referenčné spustenie." + }, + { + "label": "Rozsah pôsobnosti a záruky", + "href": "/docs/monitor/audit-report/scope", + "tail": "zdroje, obmedzenia a uložené údaje." + } + ] + } + } + ] + } + ] +} diff --git a/web/messages/sk/docs/monitor/audit-report/policy.json b/web/messages/sk/docs/monitor/audit-report/policy.json new file mode 100644 index 00000000..1e0eeed7 --- /dev/null +++ b/web/messages/sk/docs/monitor/audit-report/policy.json @@ -0,0 +1,111 @@ +{ + "meta": { + "title": "Politika | Audit a správy", + "description": "Politika uzla vo funkcii Audit a správy: zálohovanie, automatický štart a cieľ obnovy každého hosťovského systému, úloha každého úložiska a prahové hodnoty kontrol." + }, + "header": { + "title": "Politika", + "description": "Politika určuje to, čo žiadna kontrola nemôže odvodiť: účel každého hosťovského systému a úložiska a prahové hodnoty kontrol.", + "section": "Audit a správy" + }, + "sections": [ + { + "id": "principle", + "blocks": [ + { + "calloutInfo": { + "title": "Bez deklarácie správa opisuje; s deklaráciou hodnotí", + "body": "Hodnotenie vidí, čo robí hostiteľ, nie na čo je. Hosť bez zálohy, ktorého účel nie je deklarovaný, sa vykazuje ako pozorovanie. Ak je jeho záloha vyhlásená za požadovanú, tá istá neprítomnosť sa oznamuje ako varovanie. Nič sa nemusí vyhlásiť." + } + }, + { + "figure": { + "src": "/monitor/audit/policy-view.png", + "alt": "Zobrazenie Politika s hosťovskými systémami, úložiskom a prahovými hodnotami uzla", + "caption": "Zobrazenie Politika." + } + } + ] + }, + { + "id": "guests", + "title": "Hosťovské systémy", + "intro": "Každá VM a LXC na uzle má tri polia. Pole ponechané na predvolenej hodnote preberá všeobecnú hodnotu zobrazenú vedľa neho.", + "blocks": [ + { + "table": { + "headers": [ + "Pole", + "Hodnoty", + "Vplyv na posúdenie" + ], + "rows": [ + [ + "Zálohovanie", + "vyžaduje sa, nevyžaduje sa, neuvádza sa", + "Chýbajúca záloha je varovanie, keď sa vyžaduje, pozorovanie, ak nie je uvedené, a je vynechané z počtu, keď sa nevyžaduje." + ], + [ + "Automatický štart", + "vyžaduje sa, nevyžaduje sa, neuvádza sa", + "Či sa hosťovský systém musí spustiť spolu s hostiteľom." + ], + [ + "Požadovaný vek zálohy", + "Hodiny", + "Maximálny prijateľný vek poslednej zálohy." + ] + ] + } + } + ] + }, + { + "id": "storage", + "title": "Úložisko", + "blocks": [ + { + "p": "Nedostupné úložisko sa označí ako kritické, ak je deklarované ako nevyhnutné alebo slúži bežiacemu hosťovskému systému; ako varovanie, ak jeho úloha nie je uvedená; a ako pozorovanie, ak je deklarované ako voliteľné." + } + ], + "intro": "Každé úložisko uzla sa označí ako Nevyhnutné, Voliteľné alebo Neuvedené." + }, + { + "id": "thresholds", + "title": "Prahové hodnoty", + "intro": "Prázdne pole prahovej hodnoty používa dodanú predvolenú hodnotu zobrazenú ako zástupný text.", + "blocks": [ + { + "list": { + "items": [ + "Kontrola kapacity úložiska (%) a zaplnenia thin poolu (%).", + "Pomer nadmerného prideľovania thin úložiska a nadmerného prideľovania pamäte.", + "Interval kontroly scrub ZFS (dni).", + "Náhradný limit veku zálohy (dni) a tolerancia plánu zálohovania (pomer).", + "Oznámenie o uplynutí platnosti osvedčenia (dni).", + "Životnosť disku (hodiny) a nedávne okno chyby disku (dni).", + "Vek správy Lynis (dni) a indexu balíkov (dni).", + "Využitie systémového denníka vzhľadom na jeho limit (%).", + "Kontrola priestoru (%) a inode (%) súborového systému." + ] + } + } + ] + }, + { + "id": "save", + "title": "Ako sa politika ukladá", + "blocks": [ + { + "p": "Deklarácia sa overí a atomicky uloží do /usr/local/share/proxmenux/audit_policy.json. Každé uloženie obsahuje revíziu: ak deklaráciu zmenila iná relácia, návrh sa neuloží a zobrazenie ponúkne načítanie uloženej verzie." + }, + { + "calloutWarning": { + "title": "Politika nie je nikdy odvodená", + "body": "ProxMenux nepridáva vlastné požiadavky. Prázdne pole zachová predvolenú hodnotu alebo zostane neuvedené; čiastočná deklarácia ovplyvní iba pomenované prvky." + } + } + ] + } + ] +} diff --git a/web/messages/sk/docs/monitor/audit-report/reports.json b/web/messages/sk/docs/monitor/audit-report/reports.json new file mode 100644 index 00000000..ffc09714 --- /dev/null +++ b/web/messages/sk/docs/monitor/audit-report/reports.json @@ -0,0 +1,247 @@ +{ + "meta": { + "title": "Správy a porovnania | Audit a správy", + "description": "Šesť dokumentov funkcie Audit a správy, ich tlač alebo uloženie do PDF a porovnávanie spustení s referenčným spustením." + }, + "header": { + "title": "Správy a porovnania", + "description": "Šesť dokumentov pre rôzne otázky a porovnanie každého spustenia s referenčným spustením.", + "section": "Audit a správy" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "Šesť dokumentov, nie šesť štýlov", + "body": "Motor vyberá kontroly a úseky pred komponovaním dokumentu. Rýchla diagnóza nie je úplný audit s menším počtom strán a inventár neobsahuje žiadne výsledky hodnotenia. Nižšie uvedené vzorové dokumenty používajú fiktívne údaje." + } + } + ] + }, + { + "id": "documents", + "title": "Šesť dokumentov", + "blocks": [ + { + "downloads": { + "items": [ + { + "title": "Úplný audit", + "body": "Zdokumentuje celý uzol vo forme technického záznamu.", + "href": "/monitor/audit/sample-audit-full-report.pdf", + "facts": [ + { + "label": "Kontroly", + "value": "Všetky dostupné kontroly." + }, + { + "label": "Obsah", + "value": "Zhrnutie; identita a klaster; hardvér; sieť a latencia; úložisko; hosťovské systémy; passthrough; aplikácie; zistenia s dôkazmi; zdroje a rozsah." + } + ] + }, + { + "title": "Rýchla diagnostika", + "body": "Ukazuje, čo potrebuje pozornosť bez kompletného inventára.", + "href": "/monitor/audit/sample-audit-diagnostic-report.pdf", + "facts": [ + { + "label": "Kontroly", + "value": "Rovnaké kontroly ako úplný audit." + }, + { + "label": "Obsah", + "value": "Minimálna identita; kritické zistenia; varovania; príslušné pozorovania; neoverené údaje a prioritné opatrenia. Diagramy, súpis a dlhé prílohy sú vynechané." + } + ] + }, + { + "title": "Inventár", + "body": "Opisuje, čo existuje na uzle bez posúdenia.", + "href": "/monitor/audit/sample-audit-inventory-report.pdf", + "facts": [ + { + "label": "Kontroly", + "value": "Žiadne; žiadne zistenie sa neklasifikuje." + }, + { + "label": "Obsah", + "value": "Identita; klaster; CPU a pamäť; základná doska, BIOS a radiče; sieť; úložisko; VM a LXC; passthrough; aplikácie a prvky spravované ProxMenux." + } + ] + }, + { + "title": "Kontrola bezpečnosti", + "body": "Zahŕňa vystavenie a kontrolu prístupu k uzlu.", + "href": "/monitor/audit/sample-audit-security-report.pdf", + "facts": [ + { + "label": "Kontroly", + "value": "Oblasť zabezpečenia, oprávnenia kontajnerov, aktualizácie, repozitáre a reťazec APT." + }, + { + "label": "Obsah", + "value": "Identita a klaster; sieť a latencia; prístup; firewall; 2FA; certifikáty; oprávnenia; aktualizácie; repozitáre; stav a vek správy Lynis." + } + ] + }, + { + "title": "Overenie záloh", + "body": "Kontrola, či vyhlásená ochrana existuje a či sú jej zálohy použiteľné.", + "href": "/monitor/audit/sample-audit-backup-report.pdf", + "facts": [ + { + "label": "Kontroly", + "value": "Oblasť zálohovania, pripojenie k úložisku a doručovanie oznámení." + }, + { + "label": "Obsah", + "value": "Pokrytie každého hosťovského systému; deklarovaný cieľ obnovy; vek a výsledok; cieľ; uchovávanie; overenie; zlyhané úlohy; obnova a neúplné zdroje." + } + ] + }, + { + "title": "Kapacita a opotrebenie", + "body": "Meria mieru rastu a známky vyčerpania alebo starnutia.", + "href": "/monitor/audit/sample-audit-capacity-report.pdf", + "facts": [ + { + "label": "Kontroly", + "value": "Oblasti úložiska a hardvéru, pamäť, swap, systémový denník a súborový systém hostiteľa." + }, + { + "label": "Obsah", + "value": "Využitie a prahové hodnoty; thin pooly; nadmerné prideľovanie; pamäť; inode; ZFS; teploty; hodiny prevádzky; chyby SMART a životnosť NVMe/SSD." + } + ] + } + ] + } + }, + { + "figure": { + "src": "/monitor/audit/audit-report-preview.png", + "alt": "Prvá strana úplnej audítorskej správy", + "caption": "Každý dokument zdieľa identifikátor správy, očíslované časti, dátum, uzol, profil a pätku." + } + }, + { + "p": "Podľa profilu dokument obsahuje identitu uzla a dátum hodnotenia, celkové zhrnutie, zhrnutie podľa oblastí, štruktúru hardvéru, siete a úložiska, ochranu hosťovských systémov, zistenia s dôkazmi, nečitateľné zdroje a použitý rozsah a politiku." + } + ] + }, + { + "id": "print", + "title": "Tlač alebo uloženie vo formáte PDF", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Spustiť", + "body": "Hodnotenie používa profil vybraný v položke Správa." + }, + { + "title": "Preskúmanie", + "body": "Dokončené spustenie zobrazuje zistenia, zdroje, ktoré sa nepodarilo načítať, a použitú politiku." + }, + { + "title": "Vytvoriť správu", + "body": "Vytvoriť správu otvorí zobrazenie pripravené ako dokument." + }, + { + "title": "Tlač", + "body": "Vytlačiť alebo uložiť ako PDF otvorí tlačový dialóg prehliadača na výber tlačiarne alebo možnosti Uložiť ako PDF." + } + ] + } + }, + { + "calloutTip": { + "title": "Výtlačok je dokument, nie snímka obrazovky", + "body": "Lišta akcií je skrytá, tabuľky pokračujúce na ďalšej strane opakujú hlavičku, bloky sa zbytočne nedelia a každá strana si zachováva identifikáciu a číslovanie." + } + } + ] + }, + { + "id": "compare", + "title": "Porovnanie s referenčným behom", + "intro": "Použiť ako referenciu označí dokončené spustenie. Neskoršie spustenia sa s ním porovnajú a zistenia sa rozdelia na:", + "blocks": [ + { + "table": { + "headers": [ + "Skupina", + "Význam" + ], + "rows": [ + [ + "Nový", + "Hlásené teraz a nie predtým." + ], + [ + "Zhoršené", + "Stále sa hlásia, ale sú závažnejšie alebo majú väčší dosah než predtým." + ], + [ + "Zlepšené", + "Stále sa hlásia, ale sú menej závažné alebo majú menší dosah než predtým." + ], + [ + "Vyriešené", + "Už sa nehlásia a nikto ich neakceptoval." + ], + [ + "Prijaté", + "Už sa nepočítalo, pretože riziko bolo prijaté, nie preto, že sa hostiteľ zmenil." + ], + [ + "Už sa nevyhodnocujú", + "Predtým boli prítomné, ale v tomto spustení chýbajú; nebolo overené, že zanikli." + ] + ] + } + }, + { + "table": { + "headers": [ + "Referenčný beh", + "Správanie" + ], + "rows": [ + [ + "Nastavenie", + "Akýkoľvek dokončený beh môže byť označený; žiadny nie je označený automaticky." + ], + [ + "Zmena", + "Označenie iného spustenia zmení referenciu bez vymazania histórie." + ], + [ + "Porovnanie", + "Ak nie sú vybrané dve spustenia, porovnanie použije referenčné a vybrané alebo najnovšie spustenie." + ], + [ + "Uchovávanie spustení", + "Uchováva sa 30 najnovších spustení; referenčné spustenie sa nikdy neodstráni." + ], + [ + "Bez referencie", + "Zobrazenie uvádza, že ešte nebolo vybrané referenčné spustenie, preto nie je s čím porovnávať." + ] + ] + } + }, + { + "calloutWarning": { + "title": "Správa opisuje jednu chvíľu", + "body": "Hodnotenie nepotvrdzuje celé obdobie. Staršie výsledky prestávajú opisovať aktuálny stav; zobrazenie uvádza vek posledného spustenia a každý zdroj uchováva čas zberu." + } + } + ] + } + ] +} diff --git a/web/messages/sk/docs/monitor/audit-report/scope.json b/web/messages/sk/docs/monitor/audit-report/scope.json new file mode 100644 index 00000000..06fe9052 --- /dev/null +++ b/web/messages/sk/docs/monitor/audit-report/scope.json @@ -0,0 +1,115 @@ +{ + "meta": { + "title": "Rozsah a záruky | Audit a správy", + "description": "Pôvod údajov funkcie Audit a správy, hranice jej rozsahu, záruky návrhu a umiestnenie údajov." + }, + "header": { + "title": "Rozsah a záruky", + "description": "Odkiaľ pochádzajú údaje hodnotenia, čo zostáva mimo jeho rozsahu a kde Audit a správy ukladá údaje.", + "section": "Audit a správy" + }, + "sections": [ + { + "id": "sees", + "title": "Čo pozoruje", + "blocks": [ + { + "list": { + "items": [ + "Konfigurácia a stav miestneho uzla.", + "Deklarovaná konfigurácia VM a LXC.", + "Stav úložiska tak, ako ho pozná Proxmox VE.", + "Dostupná história záloh a overovania.", + "Údaje SMART a udalosti, ktoré Monitor zozbieral.", + "Stav služieb, klastrov, HA a miestnych zdrojov." + ] + } + } + ] + }, + { + "id": "outside", + "title": "Čo je mimo jeho pohľadu", + "blocks": [ + { + "list": { + "items": [ + "Vnútorný stav hosťovských systémov nad rámec údajov, ktoré poskytujú Proxmox VE.", + "Sieťové vybavenie mimo hostiteľa.", + "Diaľkové závislosti, ktoré uzol nemôže pozorovať.", + "Fyzický stav, ktorý hardvér nevystavuje.", + "Denník zmien nezahŕňa ručné akcie ani akcie iného softvéru." + ] + } + }, + { + "calloutWarning": { + "title": "Chýbajúce dôkazy nie sú dôkazom neprítomnosti", + "body": "Zdroj, ktorý nemožno prečítať, vedie k neoverenému alebo neúplnému výsledku, nikdy k výsledku potvrdzujúcemu súlad. Správa uvádza zdroje, ktoré neboli dostupné." + } + } + ] + }, + { + "id": "guarantees", + "title": "Záruky dizajnu", + "blocks": [ + { + "list": { + "items": [ + "Stabilné identifikátory kontrol.", + "História spustení a zistení.", + "Overená politika uložená atomicky.", + "Viditeľné akceptované riziká s uvedeným dôvodom.", + "Priradenie zmien ku skriptu a funkcii.", + "Zachytenie stavu pred zmenou a po nej, ak je dostupný.", + "Výslovný výsledok, keď niečo nemôže byť merané alebo zachytené." + ] + } + } + ] + }, + { + "id": "storage", + "title": "Kde sa ukladajú údaje", + "blocks": [ + { + "table": { + "headers": [ + "Údaje", + "Umiestnenie" + ], + "rows": [ + [ + "Politika", + "/usr/local/share/proxmenux/audit_policy.json" + ], + [ + "Hodnotenie", + "Audítorská databáza monitora" + ], + [ + "Zachytené objekty", + "/usr/local/share/proxmenux/changes/objects/" + ], + [ + "Nevybavené záznamy", + "/usr/local/share/proxmenux/changes/spool/" + ], + [ + "Konsolidovaný denník", + "/usr/local/share/proxmenux/changes.db" + ] + ] + } + }, + { + "calloutInfo": { + "title": "Nástroj na preskúmanie, nie certifikácia", + "body": "Audit a správy kontroluje, porovnáva a dokumentuje uzol. Výsledky sa posudzujú spolu s účelom systému, deklarovanou politikou a dostupnými zdrojmi." + } + } + ] + } + ] +} diff --git a/web/messages/sk/docs/monitor/dashboard/apps.json b/web/messages/sk/docs/monitor/dashboard/apps.json new file mode 100644 index 00000000..2dce2588 --- /dev/null +++ b/web/messages/sk/docs/monitor/dashboard/apps.json @@ -0,0 +1,174 @@ +{ + "meta": { + "title": "Panel Apps: jeden spúšťač pre všetky webové odkazy | ProxMenux", + "description": "Pomocou prístrojovej dosky Apps otvorte registrované LXC Webové odkazy a vlastné odkazy, zorganizujte ich podľa kategórie a skočte späť k hosťovi, ktorý vlastní každú službu." + }, + "header": { + "title": "Panel: karta Apps", + "description": "Jediný spúšťač pre webové rozhrania, ktoré používate cez uzol, či už pochádzajú z registrovanej aplikácie LXC alebo z vlastného webového odkazu.", + "section": "ProxMenux Monitor · Prehľad" + }, + "intro": { + "title": "Spúšťač, nie inštalátor aplikácií", + "body": "Karta Apps neinštaluje softvér ani sama nevyhľadáva služby. Zoskupuje uložené odkazy do prehľadávateľnej mriežky. Odkazy LXC sa nastavujú na karte App hosťovského systému; vlastné odkazy zahŕňajú služby VM, reverzné proxy a externé panely." + }, + "sources": { + "heading": "Čo sa objavuje v Apps", + "intro": "Každá spúšťateľná URL sa stáva vlastnou kartou. Zdroj určuje, kde je karta upravená, ale nie ako vyzerá počas bežného používania.", + "colSource": "Zdroj", + "colAppears": "Čo sa objaví", + "colManagedFrom": "Kde sa spravuje", + "rows": [ + { + "source": "Registrovaná aplikácia LXC", + "appears": "Jedna karta pre každý Web Link uložený na zázname aplikácie.", + "managedFrom": "VM a LXC → Okno LXC → Aplikácia" + }, + { + "source": "Vlastný odkaz viazaný na hosťa", + "appears": "URL služby spojená so špecifickým VM alebo LXC.", + "managedFrom": "Aplikácie → Upraviť" + }, + { + "source": "Vlastný odkaz bez priradenia", + "appears": "Ľubovoľný cieľ HTTP(S) vrátane externej služby alebo služby za reverzným proxy.", + "managedFrom": "Aplikácie → Upraviť" + } + ], + "relationshipTitle": "Aplikácie a karta LXC App majú rôzne úlohy", + "relationshipBody": "Karta App LXC spravuje identitu aplikácie, webové odkazy a voliteľné sledovanie verzií. Karta Apps používa tieto odkazy na rýchle otvorenie. Úprava karty LXC preto otvorí záznam hosťovského systému bez duplikovania konfigurácie." + }, + "cards": { + "heading": "Ako používať kartu", + "intro": "Celá karta je cieľ štartu, zatiaľ čo jej menšie kontroly poskytujú kontext bez otvorenia služby.", + "items": [ + "Kliknutím na kartu otvoríte jej URL na novej karte prehliadača.", + "Logo najprv používa logo Web Link a v prípade potreby sa vráti k logu aplikácie.", + "Čip kategórie používa rovnakú farbu a označenie ako zodpovedajúci webový odkaz v záložke LXC App.", + "Označenie hosťovského systému určuje priradenú VM alebo LXC. Kliknutie otvorí jeho okno: odkazy LXC otvoria App, odkazy VM Stav.", + "Fialová šípka hore znamená, že špecifická aplikácia alebo obraz Docker má k dispozícii aktualizáciu. Nie je to všeobecný počet aktualizácií pre celého hosťa." + ] + }, + "toolbar": { + "heading": "Hľadať, filtrovať a triediť", + "intro": "Nástrojová lišta zužuje veľkú kolekciu aplikácií bez zmeny uložených záznamov.", + "items": [ + "Vyhľadávanie zodpovedá názvu aplikácie, menu hosťa, VMID a kategórii.", + "Filter kategórie zobrazuje jednu kategóriu naraz alebo všetky aplikácie.", + "Zoraďte podľa Názvu, ID alebo Kategórie. Triedenie podľa kategórie pridá nadpisy medzi skupiny kariet.", + "Poradie sa zapamätá v tomto prehliadači. Vyhľadávaný text a filter kategórie sa pri návrate na stránku obnovia.", + "Karta Apps zostáva k dispozícii, keď je mriežka prázdna, takže prvý vlastný odkaz môže byť pridaný bez registrácie aplikácie LXC ako prvý." + ] + }, + "customLinks": { + "heading": "Pridávanie a úprava vlastných webových odkazov", + "intro": "Použite vlastný odkaz, ak služba nie je reprezentovaná registrovanou aplikáciou LXC.", + "steps": [ + "Vyberte Pridať odkaz na paneli nástrojov alebo v prázdnom zobrazení.", + "Zadajte meno a kompletnú http:// alebo https:// URL.", + "Voliteľne pridať logo, vybrať alebo vytvoriť kategóriu a pripojiť odkaz na VM alebo LXC.", + "Uložte odkaz. Jeho karta sa ihneď zobrazí v mriežke.", + "Ak chcete upraviť alebo odstrániť vlastný odkaz, vyberte Upraviť a ceruzku na karte." + ], + "colField": "Pole", + "colRequired": "Požadované", + "colPurpose": "Účel", + "fields": [ + { + "field": "Názov", + "required": "Áno", + "purpose": "Názov karty a hľadaný termín." + }, + { + "field": "URL", + "required": "Áno", + "purpose": "Úplné miesto určenia HTTP (S) otvorené kartou." + }, + { + "field": "URL loga", + "required": "Nie", + "purpose": "Diaľkový obrázok zobrazený na karte." + }, + { + "field": "Kategória", + "required": "Nie", + "purpose": "Pridá zdieľaný odznak a umožňuje filtrovanie kategórií." + }, + { + "field": "Priradenie hosťovského systému", + "required": "Nie", + "purpose": "Priradí odkaz k VM alebo LXC a umožní skratku k hosťovskému systému." + } + ], + "editTitle": "Upraviť zdroj pravdy", + "editBody": "Režim úprav zobrazuje ceruzky iba pri vlastných odkazoch. Kartu aplikácie LXC upravíte na karte App hosťovského systému zmenou uloženého odkazu." + }, + "categories": { + "heading": "Kategórie a signály aktualizácie", + "intro": "Kategórie usporadúvajú odkazy; indikátory aktualizácií opisujú stav softvéru. Sú zámerne oddelené.", + "items": [ + "Registrácia LXC podporovaná katalógom môže predplniť kategóriu, ale zostáva editovateľná.", + "Vlastné názvy kategórií môžu byť vytvorené z rovnakého voliča a následne opätovne použité filtrom.", + "Farby kategórií sú deterministické a prispôsobujú sa svetlej alebo tmavej téme. Fialové a červené odtiene sú vyhradené pre aktualizácie a nebezpečné stavy.", + "Pri Docker odkazoch ProxMenux priradí kartu ku kontajneru alebo obrazu a zobrazí stav aktualizácie daného obrazu. Aktualizácie Docker Engine zostávajú na karte Aktualizácie LXC." + ] + }, + "persistence": { + "heading": "Ukladanie a správanie vyrovnávacej pamäte", + "intro": "Palubná doska je určená na otvorenie z už dostupných dát Monitor, a nie na preskenovanie každého hosťa.", + "items": [ + "Vlastné odkazy sa atomicky ukladajú do /etc/proxmenux/custom_links.json a pri štarte Monitora načítajú do pamäte.", + "Registrované odkazy LXC zostávajú súčasťou uloženého záznamu monitora v ich aplikácii; prístrojová doska Apps ich nezdvojuje do vlastného súboru.", + "Vytvorenie, úprava alebo odstránenie vlastného odkazu ihneď obnoví zoznam v pamäti.", + "Predvoľba triedenia je miestna pre tento prehliadač a nesynchronizuje sa medzi zariadeniami ani používateľmi.", + "Pozícia aplikácií na najvyššej úrovni sa ovláda samostatne pomocou Nastavenia → Poradie navigácie." + ] + }, + "troubleshooting": { + "heading": "Bežné situácie", + "colProblem": "Situácia", + "colResolution": "Riešenie", + "rows": [ + { + "problem": "Aplikácia LXC je registrovaná, ale nie je zobrazená žiadna karta", + "resolution": "Otvorte záložku App a pridajte aspoň jeden webový odkaz. Samotné sledovanie verzie nevytvára kartu spúšťača." + }, + { + "problem": "URL alebo logo je nesprávne", + "resolution": "Upraviť vlastný odkaz v Apps, alebo upraviť webový odkaz vo vlastnej záložke LXC App." + }, + { + "problem": "Chýba služba Docker", + "resolution": "Upraviť registrovanú aplikáciu Docker a uložiť webový port služby ako webový odkaz." + }, + { + "problem": "Fialová šípka sa vzťahuje na nesprávnu aktualizáciu Docker", + "resolution": "Skontrolujte názov a opis webového odkazu, aby ich bolo možné priradiť k zamýšľanému kontajneru alebo obrazu." + }, + { + "problem": "Apps sa otvára pred Prehľadom systému", + "resolution": "Prvá uložená položka v Nastavenia → Poradie navigácie sa stane úvodnou kartou. Obnovte predvolené poradie alebo presuňte Prehľad na prvé miesto." + } + ] + }, + "whereNext": { + "heading": "Kam ďalej", + "items": [ + { + "label": "LXC App záložka", + "href": "/docs/monitor/dashboard/vms-lxcs/app", + "tail": " — registrácia aplikácií, webových odkazov a voliteľného sledovania verzií." + }, + { + "label": "Karta Aktualizácie LXC", + "href": "/docs/monitor/dashboard/vms-lxcs/updates", + "tail": " — nastavenie a spustenie aktualizácií aplikácií, Docker Engine a obrazov." + }, + { + "label": "Karta Nastavenia", + "href": "/docs/monitor/dashboard/settings#navigation-order", + "tail": " — zmena poradia navigácie a úvodnej karty." + } + ] + } +} diff --git a/web/messages/sk/docs/monitor/dashboard/hardware.json b/web/messages/sk/docs/monitor/dashboard/hardware.json new file mode 100644 index 00000000..42456689 --- /dev/null +++ b/web/messages/sk/docs/monitor/dashboard/hardware.json @@ -0,0 +1,248 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Panel: Hardvér | Dokumentácia ProxMenux", + "description": "Na karte Hardvér je inventár fyzického počítača: CPU a základná doska, pamäťové moduly, teplotné senzory, GPU (s monitorovaním jednotlivých slotov v reálnom čase a inštalátorom ovládačov jedným kliknutím), Coral TPU akcelerátory, prehľad úložiska s kontrolou rýchlosti pripojenia, úplný zoznam zariadení PCI a USB, spotreba energie, jednotky PSU, ventilátory a stav UPS." + }, + "header": { + "title": "Panel: Hardvér", + "description": "Fyzický stroj na jednej obrazovke: CPU a základná doska, každý pamäťový modul, teplotné snímače všetkých subsystémov, GPU so živým využitím a inštalátorom ovládačov, Coral TPU, každé zariadenie PCI a USB s ovládačom jadra, úplný inventár diskov s dohodnutými rýchlosťami spojenia, príkon, chladenie a UPS.", + "section": "ProxMenux Monitor · Prehľad" + }, + "intro": { + "title": "Postavený zo štandardných nástrojov", + "body": "Väčšina z tejto karty je spracovaná z lscpu, dmidecode, lspci, lsusb, lsblk, smartctl, nvme, sensors, nvidia-smi, intel_gpu_top, amdgpu_top, ipmitool a upsc. Sekcie vykresľujú iba vtedy, keď príslušný nástroj vráti dáta, takže hostiteľ bez UPS neukáže kartu UPS a hostiteľ bez IPMI neukáže údaje o výkone mimo pásma." + }, + "thresholds": { + "title": "Farby stavu a prahové hodnoty, ktoré sa tu uplatňujú", + "intro": "Každý indikátor a údaj teploty používa rovnakú škálu: zelená pod prahom Upozornenie, jantárová medzi Upozornenie a Kritické, červená od prahu Kritické vyššie. Odporúčané predvolené hodnoty ProxMenux:", + "items": [ + "Teplota CPU — upozornenie 80 °C, kritické 90 °C.", + "Teplota disku HDD 60/65 °C · SSD 70/75 °C · NVMe 80/85 °C · SAS 55/65 °C (varovanie/kritické)." + ], + "outro": "Hodnoty možno nastaviť pre každého hostiteľa. Nastavenia → Prahy monitora stavu sú hlavný zdroj a vysvetľujú ich úpravu." + }, + "sections": { + "heading": "Časti", + "intro": "Sekcie sa zobrazujú zhora nadol v tomto poradí. Niektoré vyžadujú príslušný hardvér alebo nástroj a sú označené ako (podmienené).", + "systemInfoTitle": "Informácie o systéme", + "systemInfoIntro": "Dva bloky vedľa seba, vždy prítomné:", + "systemInfoItems": [ + "CPU — model, mikroarchitektúra, pätice/jadrá/vlákna, základná a boost frekvencia, príznaky virtualizácie (VT-x / AMD-V) a topológia cache.", + "Základná doska — výrobca, model, verzia a dátum BIOS, UUID SMBIOS. Pomáha nájsť správnu stránku výrobcu na stiahnutie firmvéru." + ], + "memoryTitle": "Pamäťové moduly", + "memoryBody": "Jeden riadok na obsadený slot podľa dmidecode: označenie, kapacita modulu, typ (DDR4 / DDR5 / varianty ECC), nastavená a menovitá rýchlosť, výrobca, číslo dielu a sériové číslo. Prázdne sloty sú sivé, aby bolo vidieť možnosti rozšírenia.", + "thermalTitle": "Sledovanie teplôt", + "thermalIntro": "Sedem blokov s údajmi z lm-sensors, sysfs a čítačiek pre konkrétne nástroje. Snímače úložiska hwmon sú priradené k fyzickému blokovému zariadeniu, s modelom a cestou /dev/.... Blok sa skryje, ak kategória neobsahuje snímače.", + "thermalItems": [ + "CPU — teploty puzdra procesora a jednotlivých jadier.", + "GPU — snímače samostatnej GPU cez nvidia-smi / amdgpu_top a Intel iGPU. Zahŕňa najteplejší bod a teplotu pamäťového prechodu, ak ich ovládač poskytuje.", + "NVME — zložená teplota radiča priradená ku konkrétnemu mennému priestoru NVMe.", + "HDD — hodnoty drivetemp pre rotačné blokové zariadenia.", + "SSD — hodnoty drivetemp pre nerotačné blokové zariadenia SATA/SAS.", + "PCI — senzory, ktoré sa javia ako zariadenia pripojené k PCI (HBA, sieťové karty s internými senzormi).", + "OTHER — čipset, VRM, senzory okolia, ktoré sa inde nehodia." + ] + }, + "graphics": { + "heading": "Grafické karty", + "intro": "Každý radič videa má kartu s výrobcom, modelom, typom (Integrovaný / PCI / BMC), adresou PCI (BDF), ovládačom jadra a modulmi. Prepnúť režim mení zdieľanie LXC s natívnym ovládačom na passthrough VM (vfio-pci) a späť. Prepnúť režim GPU (VM ↔ LXC) vysvetľuje zmeny na hostiteľovi.", + "vfioImageAlt": "Grafické karty: integrovaná Matrox G200EH priradená k mgag200, pripravená pre LXC, a NVIDIA Quadro P400 priradená k vfio-pci, pripravená pre passthrough VM", + "vfioImageCaption": "Dve GPU: čip BMC Matrox používa natívny ovládač a je pripravený pre LXC; NVIDIA Quadro P400 je priradená k vfio-pci a pripravená pre passthrough VM.", + "lxcImageAlt": "Grafické karty: Intel UHD Graphics iGPU s i915 a NVIDIA Quadro P1000 s nvidia, obe pripravené pre kontajnery LXC", + "lxcImageCaption": "Rovnaký uzol po vrátení karty NVIDIA k natívnemu ovládaču: obe GPU sú pripravené pre kontajnery LXC.", + "realtimeTitle": "Okno monitorovania v reálnom čase", + "realtimeBody": "Kliknutie otvorí monitorovanie GPU podľa slotu, ktoré každé tri sekundy zisťuje údaje nástrojom výrobcu. Ukazuje výrobcu, typ, slot PCI, ovládač, moduly jadra, využitie jednotiek (Render/3D, Video, Blitter, VideoEnhance), grafické a pamäťové frekvencie, teplotu, dostupnú spotrebu, VRAM a aktívne procesy s ich zaťažením jednotiek. Dáta z /api/gpu/<slot>/realtime.", + "toolsIntro": "Nástroj výrobcu používaný pre každú GPU:", + "headerVendor": "Výrobca", + "headerTool": "Nástroj", + "headerProject": "Projekt", + "tools": [ + { + "vendor": "NVIDIA", + "tool": "nvidia-smi", + "projectLabel": "developer.nvidia.com", + "projectHref": "https://developer.nvidia.com/nvidia-system-management-interface" + }, + { + "vendor": "Intel iGPU", + "tool": "intel_gpu_top (igt-gpu-tools)", + "projectLabel": "gitlab.freedesktop.org", + "projectHref": "https://gitlab.freedesktop.org/drm/igt-gpu-tools" + }, + { + "vendor": "AMD", + "tool": "amdgpu_top", + "projectLabel": "github.com/Umio-Yasuno/amdgpu_top", + "projectHref": "https://github.com/Umio-Yasuno/amdgpu_top" + }, + { + "vendor": "Matrox / ASPEED (BMC)", + "tool": "(iba zobrazovanie)", + "projectLabel": "Detekovaný a označený ako BMC; žiadny blok v reálnom čase." + } + ], + "nvidiaImageAlt": "Monitorovanie NVIDIA Quadro P1000: výrobca NVIDIA, načítaný ovládač nvidia, grafická frekvencia 1.26 GHz, pamäťová 2.50 GHz, teplota 50 °C, všetky jednotky na 0 %, žiadne aktívne procesy, celková pamäť 4096 MiB", + "nvidiaImageCaption": "NVIDIA Quadro P1000 s proprietárnym ovládačom: frekvencie, teplota, ukazovatele využitia jednotiek a aktívne procesy.", + "intelImageAlt": "Monitorovanie Intel UHD Graphics iGPU s ovládačom i915: spotreba 11.31 W, zaťaženie video jednotky 1 % a proces ffmpeg s využitím 8 MB", + "intelImageCaption": "Intel iGPU s aktívnym i915. Tabuľka Aktívne procesy zobrazuje úlohu ffmpeg používajúcu video jednotku.", + "amdImageAlt": "Monitorovanie integrovanej GPU AMD Lucienne s amdgpu: využitie jednotiek 0 % a amdgpu_top ako aktívny proces", + "amdImageCaption": "AMD iGPU monitorovaná cez amdgpu_top. Samotný nástroj je aktívny proces, pretože získava živé údaje.", + "installTitle": "Inštalácia ovládača NVIDIA z okna", + "installBody": "Pri nouveau/nvidiafb bez proprietárneho ovládača NVIDIA nie sú dostupné frekvencie, spotreba ani zaťaženie procesov. Okno ponúkne Nainštalovať ovládače NVIDIA a spustí skript opísaný v Inštalácia ovládačov NVIDIA na hostiteľovi.", + "noDriverAlt": "Monitorovanie NVIDIA Quadro P620 s načítanými nvidiafb a nouveau, oznámením Rozšírené monitorovanie nie je dostupné a modrým tlačidlom Nainštalovať ovládače NVIDIA", + "noDriverCaption": "Proprietárny ovládač ešte nie je nainštalovaný: okno ponúka inštaláciu jedným kliknutím.", + "promptAlt": "Potvrdenie inštalácie ovládača NVIDIA s nájdenými GPU, kontajnermi LXC s passthrough NVIDIA a tlačidlami Áno/Zrušiť", + "promptCaption": "Súhrn pred inštaláciou: nájdené GPU, kontajnery LXC s passthrough NVIDIA a plánované kroky. Bez potvrdenia sa nič nemení.", + "successAlt": "Výstup terminálu zobrazujúci ovládač NVIDIA 580.105.08 nainštalovaný úspešne a nvidia-smi hlásijúci Quadro P620", + "successCaption": "Úspešná inštalácia: NVIDIA .run zostavený cez DKMS, služba perzistencie pripravená a nvidia-smi hlási GPU.", + "warningTitle": "Vyberte si verziu ovládača, ktorú GPU skutočne podporuje", + "warningBody": "Novšie vetvy NVIDIA ukončujú podporu starších rodín GPU, napríklad Maxwell alebo Kepler. Ak po inštalácii nvidia-smi hlási \"No devices were found\" alebo DKMS zlyhá, vetva nemusí GPU podporovať. Zopakujte inštaláciu so staršou vetvou, napríklad legacy 470.x pre Kepler. Kompatibilitu overte na oficiálnej stránke vyhľadávania ovládačov.", + "whereGoIntro": "Kam ísť odtiaľto:", + "whereGoItems": [ + "Inštalácia ovládačov NVIDIA na hostiteľovi — úplný postup, matica kompatibility jadra, voliteľná oprava NVENC a prenos do LXC.", + "Prepnúť režim GPU (VM ↔ LXC) — čo robí ovládanie Prepnúť režim na karte.", + "Pridať GPU do VM (passthrough) a Pridať GPU do LXC — prvé priradenie neviazanej GPU." + ] + }, + "coral": { + "heading": "Coral TPU / AI akcelerátory", + "subHeading": "(podmienečné)", + "intro": "Zobrazí sa pri pripojenom Google Coral alebo inom AI akcelerátore. Okno zariadenia uvádza pripojenie (M.2 / mini-PCIe / USB), šírku PCIe, ID výrobcu/produktu, softvérovú podporu (apex v jadre pre PCIe, libedgetpu v používateľskom priestore pre USB), moduly (gasket + apex), uzly (/dev/apex_*), stav runtime Edge TPU, živú teplotu a výstražné prahy firmvéru.", + "imageAlt": "Podrobnosti Coral Edge TPU: pripojenie PCIe/M.2, 5.0 GT/s x1, ID 1ac1:089a, ovládač apex, načítané moduly gasket a apex, /dev/apex_0 prítomný, Edge TPU Runtime nenainštalovaný, 53.5 °C a hardvérové výstražné prahy", + "imageCaption": "Coral M.2 s načítanými modulmi jadra hostiteľa, prítomným uzlom zariadenia a dostupnými výstrahami teploty firmvéru. Indikátor runtime sa zmení na zelený po inštalácii zodpovedajúceho Edge TPU Runtime.", + "pathsIntro": "Dve možnosti inštalácie podľa vyhotovenia:", + "pathsItems": [ + "M.2 / Mini-PCIe — hostiteľ potrebuje moduly jadra gasket + apex zostavené cez DKMS, aby sa pri štarte objavil uzol /dev/apex_0.", + "Akcelerátor USB — hostiteľ potrebuje iba runtime Edge TPU v používateľskom priestore (libedgetpu1-std) z repozitára APT spoločnosti Google." + ], + "outro": "Inštalovať Coral TPU na hostiteľa rozpozná a spravuje oba varianty. Informácie a oficiálny runtime sú na coral.ai/docs. Potom priraďte zariadenie kontajneru cez Pridať Coral TPU do LXC." + }, + "storage": { + "heading": "Súhrn úložiska", + "intro": "Všetky blokové zariadenia známe jadru, zoskupené podľa typu. Každý disk ukazuje názov (sda, nvme0n1, zram0…), typ (SSD, HDD, NVMe SSD), model a dohodnuté spojenie. Kliknutie otvorí model, sériové číslo, kapacitu, rozhranie a aktuálnu aj maximálnu rýchlosť spojenia.", + "imageAlt": "Súhrn úložiska s jedenástimi blokovými zariadeniami (SSD SATA, HDD SATA, SSD NVMe a zram), modelmi a rýchlosťami spojenia; dva NVMe ukazujú 3.0 x4 so zvýraznenou aktuálnou rýchlosťou", + "imageCaption": "Jedenásť zariadení na tomto uzle. SATA spojenia sa zobrazujú ako SATA <version>, <Gb/s> (current: ...); NVMe ako <PCIe gen> x<width>.", + "nvmeBody": "Riadok NVMe porovnáva dohodnuté spojenie s podporovaným maximom. Pri rozdiele, napríklad Gen3 x4 SSD na 3.0 x1 v slote zapojenom jednou linkou, je aktuálna hodnota jantárová. Pomáha pri diagnostike pomalých diskov alebo zmenách liniek po aktualizácii BIOS.", + "nvmeModalAlt": "NVMe detail pohonu pre nvme0n1: NVMe typ SSD, kapacita 953.9 GB, súčasná rýchlosť spojenia 3.0 x1 zvýraznená v jantári, maximálna rýchlosť spojenia 3.0 x4, model WDC CL SN720, sériové číslo, rozhranie PCIe/NVMe", + "nvmeModalCaption": "Podrobnosti NVMe s obmedzeným spojením: disk podporuje x4, ale slot je zapojený x1.", + "outro": "Dáta SMART, samotesty, história a správa PDF sú v Panel: Úložisko. Rovnaké dáta používa Stav a testy SMART diskov. Dlhý test zo skriptu zapíše JSON zobrazený v Monitore v Úložisko → História." + }, + "pci": { + "heading": "PCI zariadenia", + "intro": "Zariadenia PCI určené pomocou PCI BDF (Bus:Device.Function, napríklad 03:00.0) a triedy (Radič úložiska, Radič USB, Grafická karta, Sieťový radič, Zvukový radič…). Každá karta zobrazuje výrobcu, názov a aktuálne priradený ovládač jadra, užitočné pri diagnostike passthrough, skupín IOMMU či nesprávneho ovládača.", + "imageAlt": "Pätnásť zariadení PCI podľa triedy: radiče úložiska ahci/nvme, USB, grafické karty (jedna s vfio-pci, druhá s natívnym ovládačom), sieť igb/tg3 a zvuk pri GPU odovzdanej VM", + "imageCaption": "Pätnásť zariadení na uzle. GPU aj pridružená zvuková funkcia sú priradené k vfio-pci, teda pripravené pre passthrough VM.", + "bdfTitle": "Čítanie BDF", + "bdfBody": "03:00.0 znamená zbernicu PCI 03, zariadenie 00, funkciu 0. Samostatné GPU zvyčajne používajú .0 pre GPU a .1 pre zvuk HDMI. Obe funkcie sa odovzdávajú VM spolu; preto Prepnúť režim GPU pri odchode z režimu VM vyčistí aj osamotené zvukové priradenia." + }, + "usb": { + "heading": "USB zariadenia", + "intro": "Zariadenia USB s výrobcom a produktom, verziou USB, adresou bus:device, ID vendor:product a ovládačom jadra. Sú rozdelené podľa úlohy: Komunikácia (adaptéry Z-Wave / Zigbee), UPS, úložisko alebo HID. Zariadenia tak rozlíšite bez porovnávania ID.", + "imageAlt": "Zariadenia USB: Aeotec Z-Wave Z-Stick, koordinátor Zigbee ConBee II a UPS Ellipse ECO, s verziou USB, adresou, ID vendor:product a priradeným ovládačom", + "imageCaption": "Tri zariadenia USB: dva adaptéry domácej automatizácie cez usbfs a UPS cez usbfs, s ktorým NUT komunikuje cez libusb." + }, + "power": { + "heading": "Spotreba energie", + "subHeading": "(podmienečné)", + "intro": "Zobrazí sa, ak hostiteľ poskytuje telemetriu príkonu. Podľa dostupnosti ukazuje dva nezávislé zdroje:", + "items": [ + "Celkový príkon ACPI / IPMI — príkon celého systému zo snímača základnej dosky alebo BMC. Typické pre serverové dosky.", + "Príkon puzdra CPU — počítadlá Intel RAPL alebo ekvivalent AMD. Odlišuje príkon CPU od zvyšku systému na bežných doskách bez celkového snímača." + ], + "supplyImageAlt": "Spotreba: 198 W celkovo cez ACPI a dva zdroje so stavom OK a výstupom 185 W a 5 W", + "supplyImageCaption": "Serverová doska s jedným snímačom ACPI a dvoma zdrojmi cez IPMI: druhý je redundantný, v pokoji na 5 W.", + "cpuImageAlt": "Spotreba na bežnej doske: iba príkon CPU 8.7 W cez Intel RAPL", + "cpuImageCaption": "Bežná doska bez celkového snímača: ukazuje iba príkon CPU cez RAPL." + }, + "psu": { + "heading": "Napájacie zdroje", + "subHeading": "(podmienečné)", + "body": "Na serverových strojoch s dvojitými zdrojmi ukazuje IPMI prítomnosť (PSU 1 / PSU 2 / …), vstupné napätie, výstupný výkon a stav OK/zlyhanie. Skontrolujte po výpadku napájania na uzle s redundantnými zdrojmi." + }, + "fans": { + "heading": "Ventilátory systému", + "subHeading": "(podmienečné)", + "body": "Otáčky každého ventilátora v RPM s minigrafom, ak je podporovaný. Bez jednotlivých údajov ukáže jednu hodnotu ventilátora skrinky." + }, + "ups": { + "heading": "Stav UPS", + "subHeading": "(podmienečné)", + "body": "Zobrazí sa pri nastavenom a dostupnom serveri NUT (Network UPS Tools). Ukazuje stav (sieť / batéria / nabíjanie / slabá batéria), nabitie batérie, odhad výdrže, percento zaťaženia, vstupné napätie, model a firmvér. Rovnaké údaje používa Bezpečnosť a certifikáty monitora stavu; prechod na batériu sa hneď zobrazí." + }, + "dataCollected": { + "heading": "Spôsob zberu údajov", + "headerSection": "Sekcia karty", + "headerEndpoint": "Koncový bod", + "headerSource": "Zdroj", + "rows": [ + { + "section": "Statický inventár (PCI, CPU, BIOS)", + "endpoint": "/api/hardware", + "source": "lspci -vmm, /proc/cpuinfo, dmidecode; vyrovnávacia pamäť počas životnosti procesu." + }, + { + "section": "Hodnoty živých snímačov", + "endpoint": "/api/hardware/live", + "source": "sensors (lm-sensors), /sys/class/hwmon a /sys/block identifikujú úložné zariadenia. Teploty zostávajú živé; iba mapovanie hwmon na zariadenia sa uchováva v pamäti 60 sekúnd." + }, + { + "section": "História teploty CPU", + "endpoint": "/api/temperature/history", + "source": "Časový rad zaznamenávaný každých 60 sekúnd zberačom teploty a uložený v SQLite." + }, + { + "section": "Živé metriky GPU", + "endpoint": "/api/gpu//realtime", + "source": "NVIDIA: nvidia-smi --query-gpu=.... Intel: intel_gpu_top. AMD: sysfs /sys/class/drm/cardN." + } + ], + "codeComment1": "# Porovnať inventár s pohľadom operačného systému", + "codeComment2": "# Potvrďte kartu GPU ktorú prístrojová doska vidí" + }, + "whereNext": { + "heading": "Kam ďalej", + "items": [ + { + "label": "Nainštalovať ovládače NVIDIA (host)", + "href": "/docs/hardware/nvidia-host", + "tail": " — skript spustený inštalačným tlačidlom v okne GPU." + }, + { + "label": "Prepnúť režim GPU (VM ↔ LXC)", + "href": "/docs/hardware/switch-gpu-mode", + "tail": " — zmeny na hostiteľovi po prepnutí režimu na karte GPU." + }, + { + "label": "Inštalovať Coral TPU na hostiteľa", + "href": "/docs/hardware/install-coral-tpu-host", + "tail": " — inštalácia modulu jadra a runtime Coral." + }, + { + "label": "SMART Zdravie a test disku", + "href": "/docs/disk-manager/smart-disk-test", + "tail": " — skript poskytujúci dáta SMART v podrobnostiach disku na karte Úložisko." + }, + { + "label": "Dashboard: Záložka úložiska", + "href": "/docs/monitor/dashboard/storage", + "tail": " — úplná tabuľka atribútov SMART, história samotestov a správa PDF." + }, + { + "label": "Monitor zdravia", + "href": "/docs/monitor/health-monitor", + "tail": " — kategória CPU a teplota, ktorá používa rovnaké snímače." + }, + { + "label": "Referenčná príručka API", + "href": "/docs/monitor/api", + "tail": " — koncové body hardvéru a GPU." + }, + { + "label": "Index panela", + "href": "/docs/monitor/dashboard", + "tail": " — Ostatné karty." + } + ] + } +} diff --git a/web/messages/sk/docs/monitor/dashboard/index.json b/web/messages/sk/docs/monitor/dashboard/index.json new file mode 100644 index 00000000..36c6a2a7 --- /dev/null +++ b/web/messages/sk/docs/monitor/dashboard/index.json @@ -0,0 +1,101 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Panel | Dokumentácia ProxMenux", + "description": "Panel je hlavným rozhraním ProxMenux Monitor: desať kariet vrátane spúšťača Apps, spoločná hlavička a nastaviteľné poradie hlavnej navigácie." + }, + "header": { + "title": "Panel", + "description": "Každodenný pohľad na ProxMenux Monitor: desať kariet vrátane spúšťača Apps, spoločná hlavička a nastaviteľné poradie hlavnej navigácie.", + "section": "ProxMenux Monitor" + }, + "oneHeader": { + "title": "Jedna hlavička, desať kariet", + "body": "Hlavička s logom, názvom uzla, indikátorom stavu, dobou prevádzky, obnovením a témou zostáva viditeľná. Aktívna karta mení celý obsah pod ňou. Farba indikátora zodpovedá najhoršej kategórii monitora stavu; panel zobrazuje ten istý údaj." + }, + "tabs": { + "heading": "Desať kariet", + "intro": "Každá karta má svoju vlastnú vyhradenú stránku. Stránky sa pridávajú postupne pri vypĺňaní dokumentácie; nižšie je úplný zoznam a za čo je zodpovedný každý z nich.", + "headerTab": "Karta", + "headerOwns": "Čo pokrýva", + "rows": [ + { + "name": "Prehľad systému", + "linksTo": "/docs/monitor/dashboard/system-overview", + "owns": "CPU / widgety pamäte / teploty, aktívny počet VM a LXC, grafy historických metrík, súhrny úložiska a siete. Predvolená vstupná karta, kým sa neprispôsobí poradie navigácie." + }, + { + "name": "Aplikácie", + "linksTo": "/docs/monitor/dashboard/apps", + "owns": "Spoločný spúšťač registrovaných webových odkazov LXC a vlastných odkazov s kategóriami, vyhľadávaním, skratkami k hosťovským systémom a indikátormi aktualizácií aplikácií." + }, + { + "name": "Úložisko", + "owns": "Proxmox pools, fyzické disky, SMART údaje, ZFS stav, opotrebovanie a životnosť, história pozorovania." + }, + { + "name": "Sieť", + "owns": "Fyzické rozhrania, bondy, mosty a OVS, adresy IP/MAC, grafy RX/TX a história RRD každého rozhrania." + }, + { + "name": "VM a LXC", + "owns": "Inventár hosťovských systémov, podrobnosti konfigurácie, metrík a denníkov a akcie spustenia, zastavenia, reštartu a vypnutia." + }, + { + "name": "Hardvér", + "owns": "Model a topológia CPU, rozloženie pamäte, topológia PCIe a GPU s monitorovaním každého slotu v reálnom čase." + }, + { + "name": "Systémové záznamy", + "owns": "Živé journalctl s filtrami, História úloh Proxmox, protokol upozornení, sťahovacie log zväzky." + }, + { + "name": "Terminál", + "owns": "Shell hostiteľa alebo ľubovoľnej VM/CT v prehliadači pomocou xterm.js cez WebSockets." + }, + { + "name": "Zabezpečenie", + "owns": "Nastavenie overovania, heslo, 2FA a tokeny API, denník auditu, voliteľný panel Fail2Ban a nasadenie Secure Gateway." + }, + { + "name": "Nastavenia", + "owns": "Jazyk Monitora, poradie navigácie, kanály oznámení, poskytovateľ AI, prahové hodnoty stavu, výnimky a inventár úprav po inštalácii." + } + ] + }, + "headerAnatomy": { + "heading": "Anatómia hlavičky", + "items": [ + "Logo + názov produktu vľavo. Keď sa zistí novšie vydanie monitora, logo sa zmení na variant „dostupná aktualizácia“.", + "Identita uzla: názov z pvesh get /nodes, prípadne z hostname.", + "Indikátor stavu: V poriadku (zelená), Varovanie (žltá), Kritický (červená). Kliknutie otvorí monitor stavu. Modré označenie info sa zobrazí, ak sú skryté položky ešte v období potlačenia.", + "Doba prevádzky: čas behu hostiteľa v čitateľnom formáte.", + "Tlačidlo Obnoviť: zopakuje volania API pre živé údaje bez načítania celej stránky.", + "Výber témy: svetlá, tmavá alebo systémová. Ukladá sa do localStorage." + ] + }, + "whereNext": { + "heading": "Kam ďalej", + "items": [ + { + "label": "Záložka aplikácií", + "href": "/docs/monitor/dashboard/apps", + "tail": " — spoločný spúšťač webových odkazov a jeho vzťah k registrovaným aplikáciám LXC." + }, + { + "label": "Karta Prehľad systému", + "href": "/docs/monitor/dashboard/system-overview", + "tail": " — úvodná karta s úplnou dokumentáciou." + }, + { + "label": "Monitor zdravia", + "href": "/docs/monitor/health-monitor", + "tail": " — okno indikátora stavu s podrobnosťami desiatich kategórií." + }, + { + "label": "Architektúra", + "href": "/docs/monitor/architecture", + "tail": " — ako panel komunikuje s backendom Flask." + } + ] + } +} diff --git a/web/messages/sk/docs/monitor/dashboard/network.json b/web/messages/sk/docs/monitor/dashboard/network.json new file mode 100644 index 00000000..c131cc2f --- /dev/null +++ b/web/messages/sk/docs/monitor/dashboard/network.json @@ -0,0 +1,251 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Prehľad: karta Sieť | Dokumentácia ProxMenux", + "description": "Karta Sieť uvádza všetky rozhrania hostiteľa: fyzické karty, mosty, bondy, VLAN a virtuálne rozhrania VM/LXC. Detail zobrazuje IP, MAC, stav, členov bondu, prenosy od spustenia a históriu RRD." + }, + "header": { + "title": "Prehľad: karta Sieť", + "description": "Rozhrania hlásené jadrom — fyzické karty, mosty, bondy, VLAN a virtuálne porty VM/LXC — sú zoskupené do troch kariet. Kliknutím na riadok otvoríte adresy, počítadlá prenosov a historické údaje RRD.", + "section": "ProxMenux Monitor · Prehľad" + }, + "intro": { + "title": "Aktuálne aj historické údaje", + "body": "Aktuálny stav pochádza z psutil.net_if_stats() a ip, história prenosov z úložiska RRD Proxmox cez /api/network/<interface>/metrics. Počítadlá sa obnovujú približne každých 5 sekúnd a údaje RRD pre graf sa načítajú podľa potreby." + }, + "topRow": { + "heading": "Horný riadok: štyri štatistické karty", + "headerCard": "Karta", + "headerWhat": "Čo ukazuje", + "rows": [ + { + "card": "Sieťové prenosy", + "what": "Agregovaná rýchlosť RX / TX na všetkých rozhraniach, formátovaná v správnej jednotke (bps / Kbps / Mbps / Gbps)." + }, + { + "card": "Aktívne rozhrania", + "what": "Dve počítadlá: Physical X / Y a Bridges X / Y, aktívne z celkového počtu. Prvé miesto na kontrolu, keď niečo prestane fungovať." + }, + { + "card": "Stav siete", + "what": "Rýchle hodnotenie: V poriadku / Varovanie / Kritické podľa stavu spojenia, dostupnosti brány a integrity mosta. Zodpovedá kategórii Sieťové rozhrania v Health Monitor." + }, + { + "card": "Odozva siete", + "what": "Čas odozvy brány s malým grafom. Kliknutie otvorí nižšie opísané okno Odozva siete: históriu a test ping na požiadanie voči bráne, Cloudflare alebo Google so správou PDF na stiahnutie." + } + ] + }, + "flow": { + "heading": "Diagram sieťových tokov", + "intro": "Medzi horným riadkom a tromi kartami zobrazuje Network Flow aktuálnu topológiu. Cesty paketov vedú od fyzických kariet cez mosty v strede k VM a kontajnerom. Animované impulzy znázorňujú aktuálne prenosy rx/tx na každom spojení.", + "imageAlt": "Diagram toku siete – NIC vľavo, hostiteľ a mosty v strede, VM a LXC vpravo, s animovanými impulzmi na každom pripojení", + "imageCaption": "Network Flow — farebne odlíšené uzly plus animované kométy, ktorých smer a hrúbka odrážajú živú premávku.", + "elementsTitle": "Čo ukazuje diagram", + "elementsIntro": "Každý uzol predstavuje položku z rovnakého inventára ako karty nižšie. Topologické usporiadanie umožňuje ihneď vidieť ich vzťahy:", + "elements": [ + "Sieťové karty (oranžové) — fyzické rozhrania s aktívnym spojením; neaktívne sú zobrazené tlmene.", + "Hostiteľ (oranžový) — hostiteľ Proxmox medzi sieťovými kartami a mostmi. Pevný bod, na ktorý nemožno kliknúť.", + "Mosty (tyrkysové) — mosty Linux a OVS s aspoň jedným aktívnym hosťovským systémom. Nepoužívané mosty sú skryté, aby diagram zvýraznil skutočné prenosy.", + "LXC (tyrkysové) — spustené kontajnery pripojené k mostu.", + "VM (fialové) — spustené virtuálne stroje pripojené k mostu.", + "Zastavené VM a kontajnery sú skryté." + ], + "pulsesTitle": "Čo animácia kóduje", + "pulsesBody": "Animované kométy, ktoré cestujú pozdĺž každého okraja predstavujú živú premávku:", + "pulses": [ + "Smer — k sieťovej karte znamená tx hosťovského systému, k hosťovi znamená rx.", + "Hrúbka čiary rastie s rýchlosťou rx+tx hosťovského systému. Bez prenosov zostáva slabá animovaná čiara, pri veľkom prenose je hrubá.", + "Žiara hlavy kométy — teplý odtieň približne pri 1 MB/s, intenzívny od 30 MB/s. Pomáha rozpoznať hosťovský systém, ktorý najviac vyťažuje sieťovú kartu.", + "Kliknutie — každý uzol okrem hostiteľa otvorí nižšie opísané okno detailu rozhrania. Kliknutie na hostiteľa nemá žiadny účinok; v tomto zobrazení preň nie je okno." + ], + "useTitle": "Keď je to užitočné", + "useBody": "Karty ukazujú, čo existuje; diagram ukazuje, ako je to prepojené a kadiaľ tečú dáta. Odhalí hostí na rovnakom moste, dva vyťažené systémy na jednej karte ako možné úzke miesto alebo VM, ktorá zaplní spojenie, kým ostatné takmer neprenášajú." + }, + "groups": { + "heading": "Tri skupiny rozhraní", + "intro": "Tri karty zoskupujú rozhrania podľa úlohy. Hlavička každej uvádza počet aktívnych rozhraní. Farebný štítok označuje typ každého rozhrania:", + "badges": [ + "Modrá Fyzická – skutočné NIC.", + "Zelená Most Most Linux alebo most OVS (vmbr*).", + "Fialové Bond — agregované rozhranie bond / LACP / active-backup.", + "Tyrkysové VLAN — podrozhranie VLAN (vmbr0.10, eno1.42, …)." + ], + "clickable": "Na každý riadok možno kliknúť: fyzické a virtuálne rozhrania, mosty aj bondy. Nižšie opísaný detail zobrazí základné údaje, IP, počítadlá a históriu RX/TX z úložiska RRD Proxmox.", + "physicalTitle": "Fyzické rozhrania", + "physicalBody": "Fyzické rozhrania rozpoznané jadrom: eno1, enp4s0, eth0, wlp3s0 a ďalšie. Každé zariadenie má riadok s modrým štítkom Physical a stavom spojenia. Zobrazujú sa aj členovia bondu s odkazom na príslušný bond.", + "bridgeTitle": "Sieťové mosty", + "bridgeBody": "Mosty Linux (vmbr0, vmbr1, …) a OVS spravované Proxmoxom. Každý riadok ukazuje zelený štítok Bridge, pri jednom porte fyzické rozhranie a stav mosta. Bondy majú fialový štítok Bond, podrozhrania VLAN tyrkysový VLAN.", + "vmTitle": "Rozhrania VM / LXC", + "vmBody": "Rozhrania tap* a veth* vytvorené pri spustení hostí, jedno pre každú virtuálnu kartu. Hlavička uvádza X / Y Active a riadky odkazujú na VM/CT v karte VMs a LXCs. Po zastavení hosťa neaktívne záznamy zmiznú pri ďalšom obnovení." + }, + "drillIn": { + "heading": "Detail rozhrania", + "intro": "Kliknutím na riadok otvoríte okno s piatimi blokmi:", + "headerBlock": "Blok", + "headerContents": "Obsah", + "rows": [ + { + "block": "Základné informácie", + "contents": "Názov, typ (fyzické / most / bond / VLAN / vm), MAC adresa, stav (aktívne / neaktívne), MTU a základné fyzické rozhranie pri virtuálnych typoch." + }, + { + "block": "Členovia bondu", + "contents": "Iba pre bondy: každá členská karta s aktívnym alebo chybovým stavom, režim bondu (active-backup / 802.3ad / balance-alb / …) a primárne rozhranie, ak je nastavené." + }, + { + "block": "IP adresy", + "contents": "Každá adresa IPv4/IPv6 s dĺžkou predpony. Automaticky nastavené adresy link-local sú uvedené sivou farbou." + }, + { + "block": "Historický graf", + "contents": "Rýchlosť RX/TX vo vybranom období (1 hodina / 24 hodín / 7 dní / 30 dní / 1 rok), získaná z /api/network/<interface>/metrics (RRD Proxmox)." + }, + { + "block": "Premávka od posledného štartu", + "contents": "Celkový počet bajtov a paketov RX/TX od posledného spustenia hostiteľa a počítadlá chýb a zahodených paketov." + } + ], + "inactiveTitle": "Detail neaktívnych rozhraní zostáva dostupný", + "inactiveBody": "Ak je rozhranie neaktívne, okno zobrazí upozornenie „Neaktívne rozhranie“ bez aktuálnych počítadiel. Konfigurácia s adresami a členmi bondu aj história zostanú viditeľné na určenie príčiny a času poruchy." + }, + "latency": { + "heading": "Okno Odozva siete", + "intro": "Kliknutím na Odozva siete v hornom riadku otvoríte okno s históriou, testom na požiadanie, tromi cieľmi a správou PDF na stiahnutie.", + "targetsTitle": "Ciele", + "targetsIntro": "Rozbaľovací zoznam hore vyberá cieľ testu ping:", + "targets": [ + "Brána — smerovač LAN. Testuje iba miestny úsek, aby ste mohli skúmať problémy prepínača alebo kabeláže bez vplyvu WAN.", + "Cloudflare (1.1.1.1) — verejný resolver DNS v sieti anycast. Testuje úsek WAN.", + "Google (8.8.8.8) — alternatívny verejný cieľ na overenie výsledkov alebo pri regionálnych problémoch Cloudflare." + ], + "mode1Title": "Režim 1 — Historické zobrazenie", + "mode1Alt": "Okno odozvy v historickom režime s cieľom Brána, hodinovým intervalom a zobrazenými predchádzajúcimi meraniami", + "mode1Caption": "História odozvy brány za poslednú hodinu. Zberné vlákno teploty a odozvy ukladá merania do databázy každých 60 sekúnd.", + "mode1Body1": "Predvolený režim okna. Druhý zoznam vyberá obdobie (1 hodina / 6 hodín / 24 hodín / 3 dni / 7 dní). Nad grafom sú Aktuálna / Minimum / Priemer / Maximum a stav Výborná / Dobrá / Zvýšená / Zlá podľa prahov uvedených nižšie.", + "mode1Body2": "Zdrojom sú merania, ktorými Health Monitor zisťuje dlhodobé spomalenie siete. Vlákno na pozadí _temperature_collector_loop meria bránu každých 60 sekúnd a ukladá históriu do lokálnej databázy SQLite.", + "mode2Title": "Režim 2 — Test v reálnom čase", + "mode2Alt": "Okno odozvy s priebežným pingom na Cloudflare, priebehom 50 % a pribúdajúcimi meraniami v grafe", + "mode2Caption": "Dvojminútový test voči Cloudflare s meraním každých päť sekúnd, ktoré sa hneď pridá do grafu. Zastaviť ukončí test skôr; Testovať znova pridá merania do rovnakého súboru údajov.", + "mode2Intro": "Prepnutie cieľa na Cloudflare alebo Google spustí na požiadanie ping test. Správanie:", + "mode2Items": [ + "Trvanie — dve minúty na test s ukazovateľom priebehu a zostávajúcimi sekundami.", + "Interval — meranie každých päť sekúnd, 24 meraní na test.", + "Metóda — ICMP Echo Request (ping), tri po sebe idúce pingy na meranie s priemernou odozvou.", + "Zastaviť — okamžite ukončí test a zachová doterajšie údaje.", + "Testovať znova — pridáva merania k existujúcim údajom, aby ste viacerými testami vytvorili dlhšiu históriu.", + "Ukazovateľ aktuálneho stavu — prehodnocuje sa po každom meraní podľa rovnakých prahov Výborná / Dobrá / Zvýšená / Zlá." + ], + "thresholdsTitle": "Hraničné hodnoty výkonu", + "headerStatus": "Stav", + "headerRange": "Rozsah", + "headerImpact": "Praktický vplyv", + "thresholdRows": [ + { + "status": "Výborná", + "range": "< 50 ms", + "impact": "Optimálne pre aplikácie v reálnom čase, herné a video hovory." + }, + { + "status": "Dobrá", + "range": "50 – 100 ms", + "impact": "V poriadku pre väčšinu aplikácií, s minimálnym dopadom." + }, + { + "status": "Zvýšená", + "range": "100 – 200 ms", + "impact": "Citeľné oneskorenie. Môže ovplyvniť VoIP a interaktívne aplikácie." + }, + { + "status": "Zlá", + "range": "> 200 ms", + "impact": "Odozva je výrazne zvýšená. Odporúča sa preveriť sieť." + } + ], + "reportTitle": "Správa o latencii siete (PDF)", + "reportIntro": "Oba režimy majú pri výbere cieľa tlačidlo Správa. Vytvorí PDF meraní, ktoré môžete priložiť k žiadosti o podporu u poskytovateľa internetu.", + "reportPreviewAlt": "Prvá strana správy PDF o odozve: súhrn, ukazovateľ, štatistiky, graf a vysvetlenie prahov", + "reportPreviewCaption": "Prvá strana obsahuje súhrn, ukazovateľ, hlavné štatistiky, časový priebeh odozvy a vysvetlenie prahov. Od strany 2 nasleduje tabuľka meraní a metodika.", + "downloadLabel": "Stiahnuť príklad správy o odozve (PDF)", + "sectionsIntro": "Správa obsahuje šesť sekcií:", + "sections": [ + "Súhrn — ukazovateľ od 0 do viac ako 300 ms so zelenou, žltou a červenou zónou; stav Výborná / Dobrá / Zvýšená / Zlá; cieľ, režim, počet meraní a súhrn straty paketov.", + "Štatistiky odozvy — štyri ukazovatele pre aktuálnu hodnotu, minimum, priemer a maximum, plus počet meraní, priemerná strata paketov a obdobie testu.", + "Graf odozvy — plošný graf meraní počas testu s referenciami minima, priemeru a maxima na zvislej osi.", + "Prahy výkonu — rovnaká štvorstupňová škála ako vyššie s farebnou bodkou pre každý stupeň.", + "Podrobné výsledky — číslovaná tabuľka s časom, odozvou, stratou paketov a stavom každého merania. Odhalí krátke špičky skryté za priemermi.", + "Metodika — ICMP Echo Request, tri po sebe idúce pingy na meranie, názov a IP cieľa a záverečné hodnotenie podľa stavu." + ], + "useCaseTitle": "Príklad použitia: podpora poskytovateľa internetu", + "useCaseBody": "Pri spomalení spustite dvojminútový test Cloudflare, predĺžte záznam cez Testovať znova a vyberte Správa. PDF obsahuje všetky merania a metodiku. Môžete ho priložiť k žiadosti o podporu s časmi poruchy; poskytovateľ určuje potrebné dôkazy." + }, + "excluding": { + "heading": "Vylúčenie rozhraní z monitorovania", + "body1": "Rozhrania možno vylúčiť z monitorovania, napríklad zámerne vypnuté mosty, testovacie rozhrania alebo odstránené karty, ktoré zostali v konfigurácii. Nastavenie je v excluded_interfaces: Health Monitor pre ne nevytvára varovania ani oznámenia a nezahŕňa ich do celkového stavu.", + "body2": "V kontextovej ponuke vyberte Vylúčiť z monitorovania. Rozhranie zostane viditeľné s fialovým štítkom vylúčené. V rovnakej ponuke môžete monitorovanie opäť zapnúť." + }, + "dataCollected": { + "heading": "Spôsob zberu údajov", + "headerSection": "Časť karty", + "headerEndpoint": "Koncový bod", + "headerSource": "Zdroj", + "rows": [ + { + "section": "Inventár rozhrania", + "endpoint": "/api/network", + "source": "ip -j addr + ip -j link a zisťovanie bondov a mostov." + }, + { + "section": "Súhrnné karty", + "endpoint": "/api/network/summary", + "source": "Súhrn inventára a počet aktívnych a neaktívnych rozhraní." + }, + { + "section": "História RX/TX jednotlivých rozhraní", + "endpoint": "/api/network//metrics", + "source": "Aktuálne počítadlá používajú /proc/net/dev; história grafu pochádza z RRD Proxmox cez pvesh. Rozhrania VM/LXC používajú údaje hosťa, fyzické rozhrania a mosty údaje uzla." + }, + { + "section": "Odozva: aktuálna", + "endpoint": "/api/network/latency/current", + "source": "Krátka séria ping na nastavenú bránu alebo cieľ." + }, + { + "section": "Odozva: história", + "endpoint": "/api/network/latency/history", + "source": "Merania ukladá zberné vlákno teploty a odozvy na pozadí približne každých 60 sekúnd." + } + ], + "codeComment1": "# Overiť stav rozhraní zobrazený v prehľade", + "codeComment2": "# Overiť aktuálne meranie odozvy celej trasy" + }, + "whereNext": { + "heading": "Kam ďalej", + "items": [ + { + "label": "Monitor zdravia", + "href": "/docs/monitor/health-monitor", + "tail": " — kategória Sieť a prahy histórie odozvy." + }, + { + "label": "Referenčná príručka API", + "href": "/docs/monitor/api", + "tail": " — koncové body siete a odozvy." + }, + { + "label": "Integrácie", + "href": "/docs/monitor/integrations", + "tail": " — zber Prometheus poskytuje rovnaké sieťové metriky." + }, + { + "label": "Index prehľadu", + "href": "/docs/monitor/dashboard", + "tail": " — Ostatné karty." + }, + { + "label": "ProxMenux → Sieť", + "href": "/docs/network", + "tail": "— strana akcií: analýza mostov, trvalé názvy rozhraní, zálohovanie a reštart, iperf3." + } + ] + } +} diff --git a/web/messages/sk/docs/monitor/dashboard/security.json b/web/messages/sk/docs/monitor/dashboard/security.json new file mode 100644 index 00000000..6fce8221 --- /dev/null +++ b/web/messages/sk/docs/monitor/dashboard/security.json @@ -0,0 +1,246 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Prehľad: karta Zabezpečenie | Dokumentácia ProxMenux", + "description": "Karta Zabezpečenie združuje ochranné funkcie do dvoch stĺpcov: ProxMenux Monitor (overovanie, SSL/HTTPS, tokeny API, Secure Gateway) a Proxmox VE (firewall, Fail2Ban, audit Lynis). Obsahuje sprievodcu Secure Gateway, postup auditu Lynis a inštaláciu a nastavenie pravidiel Fail2Ban." + }, + "header": { + "title": "Prehľad: karta Zabezpečenie", + "description": "Bezpečnostné funkcie sú rozdelené do dvoch blokov: nastavenia samotného Monitora (overovanie, SSL, tokeny, Secure Gateway) a nastavenia sledovaného hostiteľa Proxmox (firewall, Fail2Ban, Lynis).", + "section": "ProxMenux Monitor · Prehľad" + }, + "intro": { + "title": "Dve oblasti, jedna karta", + "body": "Karta Zabezpečenie má dve časti: ProxMenux Monitor (nastavenia prehľadu) a Proxmox VE (nastavenia hostiteľa). Ak Fail2Ban alebo Lynis chýba, jeho karta ponúka inštaláciu; po inštalácii zobrazí ovládacie prvky." + }, + "monitor": { + "heading": "ProxMenux Monitor", + "intro": "Štyri karty umožňujú nastaviť prístup k prehľadu a overovanie používateľov." + }, + "auth": { + "heading": "Overovanie", + "imageAlt": "Karta overovania so stavom Zapnuté, tlačidlami Odhlásiť sa a Zmeniť heslo, informáciami o dvojfaktorovom overovaní a tlačidlami na jeho zapnutie a vypnutie overovania", + "imageCaption": "Karta so zapnutým overovaním: indikátor stavu, Zmeniť heslo, Zapnúť 2FA a deštruktívna akcia Vypnúť overovanie.", + "intro": "Karta umožňuje spravovať prihlásenie do prehľadu. Prvé spustenie, pravidlá hesiel, nastavenie TOTP a obnovu po strate autentifikátora opisuje časť Prístup a overovanie. Táto karta slúži na každodennú správu týchto nastavení:", + "items": [ + "Stav overovania — indikátor Zapnuté / Vypnuté / Odmietnuté.", + "Zmeniť heslo — aktuálne heslo + nové heslo + potvrdenie.", + "Zapnúť / Vypnúť dvojfaktorové overovanie — pri zapnutí otvorí nastavenie s QR kódom, pri vypnutí vyžiada aktuálne heslo.", + "Vypnúť overovanie — deštruktívna akcia, ktorá pri ďalšej návšteve znova zobrazí úvodné okno Chrániť prehľad?." + ] + }, + "ssl": { + "heading": "SSL / HTTPS", + "imageAlt": "Karta SSL/HTTPS so stavom HTTP bez SSL, zisteným certifikátom hostiteľa Proxmox s držiteľom, vydavateľom a platnosťou a možnosťami použiť certifikát Proxmox alebo vlastný certifikát", + "imageCaption": "Karta SSL/HTTPS s vypnutým HTTPS. Monitor zistí certifikát nainštalovaný na hostiteľovi Proxmox a umožní ho použiť jedným kliknutím. Pre vlastné súbory uložené inde je k dispozícii Použiť vlastný certifikát.", + "intro": "Sprístupní prehľad cez HTTPS bez reverzného proxy. Karta zistí certifikát používaný Proxmoxom v /etc/pve/local/ a zobrazí držiteľa, vydavateľa a platnosť na kontrolu pred zapnutím. HTTPS možno zapnúť dvoma spôsobmi:", + "items": [ + "Použiť certifikát Proxmox — Monitor jedným kliknutím použije certifikát hostiteľa. Vhodné, ak PVE aj prehľad používajú rovnaký názov DNS.", + "Použiť vlastný certifikát — vložte absolútne cesty k certifikátu .pem a súkromnému kľúču .key. Pred reštartom služby sa overia. Ak načítanie zlyhá, prehľad sa automaticky vráti na HTTP a zostane dostupný." + ], + "enabledAlt": "Karta SSL/HTTPS so zapnutým HTTPS, aktívnym certifikátom s cestami k pve-ssl.pem a pve-ssl.key a tlačidlom Vypnúť HTTPS", + "enabledCaption": "HTTPS je zapnuté — karta zobrazuje používaný certifikát, cesty k súborom a akciu Vypnúť HTTPS, ktorá obnoví HTTP na rovnakom porte.", + "acmeTitle": "ACME / Let's Encrypt cez Proxmox", + "acmeBody": "Ak má uzol Proxmox nastavený Let’s Encrypt v Datacenter → Certifikáty → ACME, prehľad po kliknutí na Použiť certifikát Proxmox použije rovnaký certifikát, ktorý hostiteľ poskytuje prehliadačom. Samostatné nastavenie ACME pre Monitor nie je potrebné.", + "walkthroughLink": "Podrobný postup v časti HTTPS pre ProxMenux Monitor vysvetľuje zistenie certifikátu ACME, údaje zapisované na disk a použitie vlastnej dvojice .pem / .key." + }, + "apiTokens": { + "heading": "Prístupové tokeny API", + "emptyAlt": "Prázdna karta prístupových tokenov API s informáciami o tokenoch a tlačidlom Vygenerovať nový token API", + "emptyCaption": "Karta tokenov po novej inštalácii. Pole O tokenoch API vysvetľuje platnosť, použitie a vloženie tokenu do hlavičiek Authorization: Bearer.", + "intro": "Tokeny platné jeden rok pre bezobslužné integrácie: widgety Homepage, senzory REST v Home Assistant, zber dát pre Grafana, toky n8n a vlastné skripty. Karta prechádza tromi stavmi: prázdna → formulár → vygenerovaný token.", + "generateBody": "Vygenerujte token. Kliknite na Vygenerovať nový token API. Zadajte opisný názov tokenu, aby ste ho neskôr rozpoznali v zozname, a svoje heslo na dodatočné potvrdenie. Pri zapnutom 2FA je potrebný aj aktuálny kód TOTP.", + "generateAlt": "Formulár na vytvorenie tokenu API s poľami Názov tokenu a Heslo a tlačidlami Vygenerovať token a Zrušiť", + "generateCaption": "Formulár na vytvorenie tokenu API: zadajte názov a potvrďte heslom a pri zapnutom 2FA aj kódom TOTP.", + "saveBody": "Token ihneď uložte. Celá hodnota tokenu sa po vytvorení zobrazí iba raz. Karta na to upozorňuje oranžovým oznámením a tlačidlom kopírovania. Neskôr ju nemožno získať; v zozname aktívnych tokenov uvidíte len predponu.", + "generatedAlt": "Vygenerovaný token API so skrytou hodnotou, tlačidlom kopírovania, pokynmi pre hlavičku Authorization: Bearer a zoznamom aktívnych tokenov s predponami", + "generatedCaption": "Token je vygenerovaný: hodnota sa zobrazí iba raz spolu s tlačidlom kopírovania a presným vzorom Authorization: Bearer. Zoznam aktívnych tokenov nižšie uchováva názov, predponu a dátum vytvorenia, aby ste mohli tokeny jednotlivo odvolať.", + "outro": "Každý aktívny token má tlačidlo Odvolať. Odvolanie ho okamžite zneplatní a integrácie, ktoré ho používajú, prestanú fungovať. Príklady pre Homepage, Home Assistant, n8n a Prometheus sú v časti Integrácie." + }, + "gateway": { + "heading": "Secure Gateway", + "cardAlt": "Karta Secure Gateway pred prvým nasadením s tlačidlom Nasadiť Secure Gateway", + "cardCaption": "Karta Secure Gateway po novej inštalácii: jedným tlačidlom spustíte sprievodcu.", + "intro": "Pristupujte k prehľadu, webovému rozhraniu Proxmox a hosťovským systémom odkiaľkoľvek v sieti Tailscale bez sprístupnenia portov na internete. Monitor na hostiteľovi nasadí kontajner LXC Alpine s tailscaled ako smerovačom podsiete. Po schválení v konzole Tailscale môžu vzdialené zariadenia pristupovať k LAN IP hostiteľa odkiaľkoľvek.", + "wizardTitle": "Sprievodca krok za krokom", + "wizardIntro": "Pred kliknutím na Deploy Secure Gateway vygenerujte overovací kľúč v konzole Tailscale. Sprievodca ho vyžiada v kroku 2.", + "step0Title": "0. Vygenerovať overovací kľúč Tailscale", + "step0Body": "Prihláste sa na login.tailscale.com/admin/settings/keys a kliknite na Generate auth key…. Vyberte vopred overený kľúč, aby brána nevyžadovala interaktívne prihlásenie do Tailscale. Hodnotu skopírujte; zobrazí sa iba raz.", + "step0Alt": "Stránka Settings → Keys v konzole Tailscale so zvýrazneným tlačidlom Generate auth key", + "step0Caption": "Konzola Tailscale — Settings → Keys → Generate auth key…. Ak ešte nemáte účet, vytvorte si bezplatný účet Tailscale cez odkaz v sprievodcovi.", + "step1Title": "1. Otvorte sprievodcu", + "step1Body": "Vráťte sa na kartu Zabezpečenie a kliknite na Deploy Secure Gateway. Prvý krok predstavuje funkcie a požiadavky.", + "step1Alt": "Úvod sprievodcu Secure Gateway: prístup cez VPN bez presmerovania portov a s koncovým šifrovaním", + "step1Caption": "Krok 1 — prehľad funkcií Secure Gateway a pripomenutie, že budete potrebovať bezplatný účet Tailscale.", + "step2Title": "2. Overenie v Tailscale", + "step2Body": "Vložte overovací kľúč z kroku 0 a vyberte názov hostiteľa. Pod týmto názvom sa brána zobrazí v konzole Tailscale, zvyčajne proxmox-gateway alebo názov uzla.", + "step2Alt": "Krok sprievodcu Secure Gateway s poľami pre overovací kľúč Tailscale a názov hostiteľa zariadenia a odkazom na vytvorenie kľúča", + "step2Caption": "Krok 2: vložte vopred overený kľúč a vyberte názov hostiteľa. Ak ste vynechali krok 0, odkaz pod poľom otvorí príslušnú stránku Tailscale.", + "step3Title": "3. Rozsah prístupu", + "step3Intro": "Vyberte si, čo môže vaša sieť dosiahnuť cez bránu:", + "step3Items": [ + "Iba Proxmox — iba rozhranie Proxmox a Monitor. Najmenšia plocha útoku.", + "Celá lokálna sieť — celá podsieť LAN, automaticky zistená z hlavného rozhrania hostiteľa. Umožní prístup k NAS, tlačiarňam, VM a ostatným zariadeniam LAN.", + "Vlastné podsiete — zadajte konkrétne rozsahy CIDR. Pre prostredia s viacerými VLAN, v ktorých chcete sprístupniť iba vybrané segmenty." + ], + "step3Alt": "Krok Rozsah prístupu v sprievodcovi Secure Gateway s možnosťami Iba Proxmox, Celá lokálna sieť a Vlastné podsiete", + "step3Caption": "Krok 3: vyberte rozsah prístupu. Celá lokálna sieť automaticky vyplní zistenú podsieť LAN.", + "step4Title": "4. Pokročilé možnosti (nepovinné)", + "step4Intro": "Dva voliteľné prepínače, oba predvolene vypnuté:", + "step4Items": [ + "Výstupný uzol — po zapnutí a výbere na vzdialenom zariadení odchádza všetka jeho internetová komunikácia cez WAN hostiteľa Proxmox. Pri cestovaní tak telefón využíva vašu domácu internetovú prípojku.", + "Prijímať trasy — umožní bráne pristupovať k sieťam oznamovaným inými smerovačmi podsietí v sieti Tailscale, napríklad pri viacerých lokalitách." + ], + "step4Alt": "Krok Pokročilé možnosti v sprievodcovi Secure Gateway s políčkami Exit Node a Accept Routes", + "step4Caption": "Krok 4: Exit Node a Accept Routes. Obe možnosti nechajte vypnuté, ak potrebujete iba prístup k prehľadu z telefónu alebo notebooku.", + "step5Title": "5. Skontrolovať a nasadiť", + "step5Body": "Záverečný súhrn pred nasadením. Sprievodca pripomína následný ručný krok v konzole Tailscale: schváliť trasu podsiete.", + "step5Alt": "Krok Skontrolovať a nasadiť v Secure Gateway so súhrnom názvu hostiteľa, režimu prístupu, sietí, Exit Node a Accept Routes a tlačidlom Nasadiť bránu", + "step5Caption": "Krok 5 — skontrolujte konfiguráciu a spustite nasadenie. Modré upozornenie dole pripomína čakajúce schválenie trasy.", + "approvalTitle": "Posledný manuálny krok v Tailscale admin", + "approvalBody": "Po nasadení otvorte login.tailscale.com/admin/machines a schváľte trasu podsiete oznamovanú bránou. Dovtedy vzdialené zariadenia v sieti Tailscale nedosiahnu cez bránu na IP adresy LAN. Čakajúce trasy sú v riadku zariadenia označené žltým upozornením. Kliknite na Edit route settings a zaškrtnite trasu." + }, + "pve": { + "heading": "Proxmox VE", + "intro": "Ochrana hostiteľa: firewall, prevencia prienikov a bezpečnostný audit. Karty Fail2Ban a Lynis ponúkajú inštaláciu chýbajúcich nástrojov a potom zobrazia ovládanie ich správy." + }, + "firewall": { + "heading": "Proxmox Firewall", + "imageAlt": "Karta firewallu Proxmox so stavom klastra a hostiteľa, pravidlami rýchleho prístupu pre Monitor a webové rozhranie Proxmox, počítadlami, zoznamom pravidiel a tlačidlom Pridať pravidlo", + "imageCaption": "Karta firewallu Proxmox: prepínače pre klaster a hostiteľa, bežné porty v časti Pravidlá rýchleho prístupu, počítadlá v časti Prehľad pravidiel a celý zoznam s tlačidlom + Pridať pravidlo.", + "intro": "Karta spravuje konfiguráciu firewallu Proxmox VE. Klasický backend používa iptables, alternatívny nftables. Nespravuje ľubovoľné pravidlá vytvorené mimo Proxmoxu. Tri bloky:", + "items": [ + "Firewall klastra + firewall hostiteľa — globálne prepínače. Firewall klastra musí byť zapnutý, aby sa uplatnili pravidlá hostiteľa. Karta túto závislosť uvádza priamo pri nastavení.", + "Pravidlá rýchleho prístupu — pripravené riadky pre 8008/TCP (Monitor) a 8006/TCP (webové rozhranie Proxmox) so stavom povolené, blokované alebo nechránené. Rozhranie Proxmox povoľuje vstavané makro firewallu, ktoré nemožno omylom odstrániť.", + "Prehľad pravidiel — počítadlá všetkých pravidiel, pravidiel accept, pravidiel drop/reject a rôznych chránených portov. Údaje sa čítajú z /etc/pve/firewall/cluster.fw a /etc/pve/nodes/<node>/host.fw.", + "Pravidlá firewallu — zoznam s akciou, protokolom, portom, zdrojom a úrovňou. + Pridať pravidlo otvorí editor v karte; ikona koša odstráni pravidlo. Zmeny sa ukladajú do súborov Proxmoxu a zobrazia sa aj v jeho rozhraní (Datacenter / Node → Firewall)." + ] + }, + "fail2ban": { + "heading": "Fail2Ban", + "subHeading": "(podľa stavu)", + "whatIs": "Čo to je. Fail2Ban je služba s otvoreným zdrojovým kódom, ktorá v záznamoch zisťuje opakované neúspešné prihlásenia a blokuje IP adresu pomocou firewallu. Chráni SSH a webové formuláre pred nepretržitými útokmi hrubou silou. ProxMenux nastavuje tri jaily: SSH, webové prihlásenie Proxmox (port 8006) a prihlásenie ProxMenux Monitor (port 8008).", + "notBundled": "Fail2Ban nie je súčasťou balíka. Karta zistí, či je nainštalovaný, a prispôsobí sa: ak chýba, ponúkne inštaláciu jedným kliknutím. Po inštalácii zobrazí aktuálny stav jailov a blokované IP adresy a umožní nastaviť počet pokusov aj čas blokovania pre každý jail.", + "notInstalledAlt": "Karta Fail2Ban v stave Nenainštalované s opisom ochrany SSH, webového rozhrania Proxmox a Monitora cez nftables a tlačidlom Nainštalovať a nastaviť Fail2Ban", + "notInstalledCaption": "Karta Fail2Ban pred inštaláciou — modré pole opisuje nastavenia, ktoré inštalácia vykoná.", + "clickBody": "Kliknite na Nainštalovať a nastaviť Fail2Ban. Potvrdzovacie okno vypíše všetky zmeny, ktoré skript vykoná na hostiteľovi:", + "confirmAlt": "Potvrdenie Fail2Ban s agresívnym režimom SSH, ochranou Proxmoxu na porte 8006 a Monitora na porte 8008, zistením nftables, nastavením záznamov journald a zabezpečením SSH MaxAuthTries", + "confirmCaption": "Potvrdenie inštalácie: zoznam jailov, úprava úrovne záznamov journald na čítanie udalostí SSH a dodatočné zabezpečenie SSH (MaxAuthTries=3).", + "confirmIntro": "Po potvrdení panel priebežne zobrazuje inštaláciu: apt, konfiguráciu jailov a testy. Používa rovnaký mechanizmus ako inštalátor CLI ProxMenux.", + "progressAlt": "Panel so záznamom inštalácie Fail2Ban: balík, journald MaxLevelStore pre overovanie, jaily, zistenie nftables, zabezpečenie MaxAuthTries, test komunikácie fail2ban-client a správa o dokončení", + "progressCaption": "Prebieha inštalácia: panel zaznamenáva každý krok. Správa Connection closed na konci označuje ukončenie prenosu.", + "afterInstall": "Po inštalácii karta zobrazuje aktuálny stav: nastavené jaily, blokované IP a posledné blokovania. Karty oddeľujú Jaily a blokované IP od Nedávnej aktivity, ktorá obsahuje posledných N záznamov Fail2Ban.", + "activeAlt": "Aktívna karta Fail2Ban s tromi jailmi (proxmenux, proxmox, sshd), počítadlami blokovaných IP, všetkých blokovaní a neúspešných pokusov a riadkami s pokusmi, dĺžkou blokovania, intervalom a ozubeným kolieskom", + "activeCaption": "Fail2Ban je aktívny: tri predvolené jaily (proxmenux, proxmox, sshd) s nastaveniami počtu pokusov, dĺžky blokovania a intervalu zisťovania.", + "tuneBody": "Upravte pravidlá jailu. Ozubeným kolieskom nastavíte Max Retries, Ban Time a Find Time, posuvný interval na počítanie pokusov. Trvalé blokovanie zostáva aktívne až do ručného zrušenia. Formulár vysvetľuje bežné hodnoty.", + "configAlt": "Formulár jailu sshd s Max Retries, Ban Time v sekundách, možnosťou Permanent Ban, Find Time, pomocou pre bežné hodnoty a tlačidlom Uložiť konfiguráciu", + "configCaption": "Úprava jailu sshd: znížte Max Retries, ak SSH používate iba z vlastnej podsiete, alebo predĺžte Ban Time pre prehľad dostupný z internetu.", + "outro": "Návod Inštalácia, nastavenie a odinštalovanie opisuje aj ručnú inštaláciu, zmenu SSH MaxAuthTries a súvislosť so záznamom proxmenux-auth.log. Pozrite ProxMenux → Zabezpečenie → Fail2Ban.", + "calloutTitle": "Bez Fail2Ban tento mechanizmus neblokuje IP adresy", + "calloutBody": "ProxMenux Monitor kontroluje IP adresy blokované Fail2Ban na aplikačnej úrovni pred spracovaním požiadaviek Flask. Volá fail2ban-client a výsledok ukladá do vyrovnávacej pamäte na 30 sekúnd; nečíta tabuľku blokovaní SQL. Bez Fail2Ban sa neúspešné prihlásenia zapisujú do proxmenux-auth.log, ale tento mechanizmus IP adresy neblokuje." + }, + "lynis": { + "heading": "Bezpečnostný audit Lynis", + "subHeading": "(podľa stavu)", + "whatIs": "Čo to je. Lynis je nástroj bezpečnostného auditu s otvoreným zdrojovým kódom, ktorý vykonáva približne 280 testov hostiteľa: oprávnenia, zabezpečenie jadra, SSH, zraniteľnosti balíkov, kryptografické pravidlá, plánované úlohy, identifikáciu služieb a ďalšie. Vytvorí index zabezpečenia od 0 do 100, varovania a návrhy. Bežne sa používa na hodnotenie serverov založených na Debiane.", + "whyUseful": "Prečo je to užitočné. Hodnotiť bezpečnosť čítaním každého konfiguračného súboru je náročné. Lynis odhalí často prehliadané problémy: chýbajúcu ochranu jadra, slabé šifry SSH, netrvalé záznamy alebo NOPASSWD v sudoers pre predvolené účty. Opakovanie kontroly po úpravách ProxMenuxu umožní porovnať zlepšenie pomocou skóre.", + "notInstalledAlt": "Karta Lynis v stave Nenainštalované s tlačidlom Nainštalovať Lynis a funkciami: index zabezpečenia, zisťovanie zraniteľností, kontrola súladu a zdroj na GitHube", + "notInstalledCaption": "Karta Lynis pred inštaláciou — modré pole zhŕňa funkcie nástroja.", + "notBundled": "Ani Lynis nie je súčasťou balíka. ProxMenux ho inštaluje priamo z oficiálneho zdrojového kódu GitHub namiesto balíka Debian.", + "confirmAlt": "Potvrdzovacie okno Lynis s funkciami: index zabezpečenia, zisťovanie zraniteľností, analýza konfigurácie, kontrola súladu a zdrojový kód z oficiálneho úložiska GitHub", + "confirmCaption": "Potvrdenie inštalácie výslovne uvádza zdroj na GitHube.", + "progressAlt": "Panel priebehu inštalácie Lynis s inštaláciou najnovšej verzie, potvrdením verzie 3.1.6 a správou o dokončení", + "progressCaption": "Prebieha inštalácia: panel priebežne zobrazuje záznam rovnako ako pri Fail2Ban.", + "afterInstall": "Po inštalácii karta zobrazí verziu a prázdnu históriu auditov. Prvú kontrolu spustíte tlačidlom Spustiť bezpečnostný audit.", + "installedAlt": "Karta Lynis po inštalácii s verziou 3.1.6, časom poslednej kontroly, indexom zabezpečenia 0, varovaniami 0, návrhmi 0, prázdnou správou a tlačidlom Spustiť bezpečnostný audit", + "installedCaption": "Lynis je nainštalovaný, audit ešte neprebehol. Ukazovatele zatiaľ zobrazujú nuly.", + "runningAlt": "Karta Lynis počas auditu so správou o prebiehajúcej kontrole, odhadom 2 až 5 minút a vypnutým tlačidlom Prebieha audit", + "runningCaption": "Prebieha audit: tlačidlo zobrazuje indikátor načítavania a karta upozorňuje, že kontrola môže trvať 2 až 5 minút.", + "finishedBody": "Po dokončení karta zobrazí výsledky: index zabezpečenia, varovania, návrhy a zoznam Správy auditu s predchádzajúcimi kontrolami.", + "resultsAlt": "Karta Lynis s indexom 71, rozdelením Lynis 66 a PVE 71, 3 varovaniami, 40 návrhmi, skóre upraveným pre Proxmox 71 zo 100 v pásme Dobré, správami na stiahnutie v PDF a tlačidlom Spustiť bezpečnostný audit", + "resultsCaption": "Príklad výsledkov: index zabezpečenia 71/100 (Dobré). Karta zobrazuje pôvodné skóre Lynis (66) a skóre upravené pre Proxmox (71). Úprava závisí od pôvodného skóre a podielu zistení považovaných za očakávané správanie Proxmox VE; nejde o pevné pripočítanie 11 bodov.", + "scoreTitle": "Pôvodné skóre Lynis a skóre upravené pre Proxmox", + "scoreIntro": "Pravidlá Lynis sú určené pre všeobecné systémy Debian. Proxmox sa od niektorých odlišuje z opodstatnených dôvodov, napríklad služby klastra bežia ako root alebo používajú vlastné nastavenia journald. Karta zobrazuje obe skóre, aby ste mohli:", + "scoreItems": [ + "Sledovať pôvodné skóre Lynis rovnako ako externí audítori.", + "Sledovať skóre upravené pre Proxmox, vhodnejšie na porovnávanie uzlov v rovnakom klastri." + ], + "reportBody": "Úplná správa. Tlačidlo PDF pri každom audite stiahne viacstranovú správu: súhrn pre vedenie, informácie o systéme, stav zabezpečenia, vysvetlené varovania, návrhy zoradené podľa vplyvu a zoznam balíkov. Môžete ju priložiť k bezpečnostnej kontrole.", + "reportAlt": "Príklad prvej strany správy PDF Lynis so súhrnom, indexom 71 zo 100, počtom varovaní a návrhov, názvom hostiteľa, jadrom, verziou Lynis, dátumom a prehľadom zabezpečenia", + "reportCaption": "Prvá strana správy: súhrn pre vedenie, informácie o systéme a stav zabezpečenia. Nasledujú podrobné varovania, návrhy a zoznam nainštalovaných balíkov. Ako referencia je priložený príklad PDF.", + "runPeriodically": "Audit spúšťajte pravidelne: po veľkých aktualizáciách Proxmoxu, po úpravách po inštalácii a pred sprístupnením vzdialeného prístupu. Správy si uchovajte; trend je dôležitejší než jedno skóre.", + "outro": "Návod na inštaláciu, nastavenie a odinštalovanie a rozbor príkladu správy nájdete v časti ProxMenux → Zabezpečenie → Lynis." + }, + "dataCollected": { + "heading": "Spôsob zberu údajov", + "headerCard": "Karta", + "headerEndpoint": "Koncový bod", + "headerSource": "Zdroj", + "rows": [ + { + "card": "Overenie, 2FA, zmena hesla", + "endpoint": "/api/auth/*", + "source": "Lokálna konfigurácia overovania v ~/.config/proxmenux-monitor/auth.json; JWT vydáva Monitor." + }, + { + "card": "SSL / HTTPS", + "endpoint": "/api/auth/ssl/*", + "source": "openssl x509 na /etc/pve/local/pve-ssl.pem + /etc/proxmenux/ssl_config.json." + }, + { + "card": "Zoznam, vytváranie a odvolávanie tokenov API", + "endpoint": "/api/auth/api-tokens", + "source": "Údaje tokenov sú uložené lokálne; nič neopúšťa hostiteľa." + }, + { + "card": "Secure Gateway (nasadenie a stav)", + "endpoint": "/api/oci/*", + "source": "Vytvorí kontajner LXC Alpine s tailscaled pomocou pct create / pct exec." + }, + { + "card": "Stav a pravidlá firewallu", + "endpoint": "/api/security/firewall/*", + "source": "pve-firewall + /etc/pve/firewall/<cluster|host>.fw." + }, + { + "card": "Fail2Ban (iba po nainštalovaní)", + "endpoint": "/api/security/fail2ban/*", + "source": "fail2ban-client status, /var/log/fail2ban.log, /etc/fail2ban/jail.local." + }, + { + "card": "Audit Lynis (iba po nainštalovaní)", + "endpoint": "/api/security/lynis/*", + "source": "Spúšťa lynis audit system v pozadí; správa spracovaná z /var/log/lynis-report.dat." + } + ] + }, + "whereNext": { + "heading": "Kam ďalej", + "items": [ + { + "label": "Prístup a overenie", + "href": "/docs/monitor/access-auth", + "tail": " — celé úvodné nastavenie, výber aplikácie 2FA, obnova po strate autentifikátora a príklady reverzného proxy." + }, + { + "label": "Integrácie", + "href": "/docs/monitor/integrations", + "tail": " — príklady použitia tokenov API s Homepage, Home Assistant, Prometheus a n8n a celý postup nastavenia Secure Gateway." + }, + { + "label": "Referenčná príručka API", + "href": "/docs/monitor/api", + "tailRich": " — všetky koncové body /api/auth, /api/security a /api/oci s metódou, telom požiadavky a príkladmi curl." + }, + { + "label": "ProxMenux → Bezpečnosť → Fail2Ban", + "href": "/docs/security/fail2ban", + "tail": " — postup inštalácie, nastavené jaily a ručná inštalácia." + }, + { + "label": "ProxMenux → Bezpečnosť → Lynis", + "href": "/docs/security/lynis", + "tail": " — príklad správy, vysvetlenie skóre a kedy audit zopakovať." + } + ] + } +} diff --git a/web/messages/sk/docs/monitor/dashboard/settings.json b/web/messages/sk/docs/monitor/dashboard/settings.json new file mode 100644 index 00000000..c80d161a --- /dev/null +++ b/web/messages/sk/docs/monitor/dashboard/settings.json @@ -0,0 +1,367 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Prehľad: karta Nastavenia | Dokumentácia ProxMenux", + "description": "Karta Nastavenia spravuje jazyk, poradie navigácie, predvoľby prehľadu, prahy a vylúčenia monitorovania, oznámenia, AI a inventár úprav po inštalácii." + }, + "header": { + "title": "Prehľad: karta Nastavenia", + "description": "Jazyk Monitora, poradie navigácie, predvoľby prehľadu, vylúčenia monitorovania, oznámenia, nastavenia AI a aktuálny inventár optimalizácií ProxMenux.", + "section": "ProxMenux Monitor · Prehľad" + }, + "intro": { + "title": "Kde sa ukladá každé nastavenie", + "body": "Nastavenia spájajú zobrazenie prehľadu, monitorovanie Health Monitor, odosielanie výstrah a zmeny už vykonané ProxMenuxom na hostiteľovi. Karty odkazujú na podrobnú dokumentáciu; tu nájdete vstupný bod." + }, + "interfaceLanguage": { + "heading": "Jazyk rozhrania", + "intro": "Vyberte jazyk webového rozhrania Monitora. Zmena platí ihneď, bez reštartu služby či zmeny jazyka terminálových ponúk ProxMenux.", + "items": [ + "ProxMenux Monitor v súčasnosti ponúka angličtinu, nemčinu, španielčinu, francúzštinu, taliančinu, portugalčinu, slovenčinu a švédčinu.", + "Pri prvej návšteve použije jazyk prehliadača, ak je podporovaný; inak angličtinu.", + "Zmena výberu upraví jazyk stránky a zosúladí ostatné otvorené karty rovnakého profilu prehliadača.", + "Ak chýba preklad, iba daný text sa zobrazí v angličtine namiesto chybného kľúča alebo zástupného textu." + ], + "scopeTitle": "Lokálna predvoľba prehliadača", + "scopeBody": "Výber je uložený v localStorage pod proxmenux-ui-language. Platí pre tento profil prehliadača a zariadenie, nie pre celý uzol. Každý správca si môže vybrať vlastný jazyk." + }, + "navigationOrder": { + "heading": "Poradie navigácie", + "intro": "Usporiadajte sedem hlavných položiek: Prehľad, Aplikácie, VM a LXC, Uzol, Záloha, Terminál a Správa. Stlačte Upraviť, presuňte riadky a uložte.", + "items": [ + "Myšou sa presúvanie začne stlačením. Dotyková obrazovka vyžaduje podržanie 250 ms, aby sa odlíšilo od rolovania.", + "Skupiny Uzol a Správa sa presúvajú celé; ich vnútorné stránky si zachovajú určené poradie.", + "Mobilná ponuka používa rovnaké uložené poradie.", + "Obnoviť predvolené obnoví upravované poradie. Zmenu použijete uložením.", + "Nové hlavné karty budúcich verzií sa pridajú na koniec vlastného poradia a zachovajú vaše usporiadanie." + ], + "landingTitle": "Prvá položka sa stane úvodnou kartou", + "landingBody": "Monitor otvorí prvú uloženú položku. Pri Uzol otvorí Úložisko, pri Správa Systémové záznamy. Poradie je v tomto prehliadači pod proxmenux-nav-order, takže každé zariadenie môže mať vlastné usporiadanie." + }, + "networkUnits": { + "heading": "Jednotky siete", + "imageAlt": "Karta Jednotky siete s výberom zobrazenia na Bajty", + "imageCaption": "Vyberte bity alebo bajty za sekundu pre všetky sieťové rýchlosti v prehľade.", + "body": "Zobrazuje priepustnosť v bitoch za sekundu (Mbps/Gbps) alebo bajtoch za sekundu (MB/s/GB/s). Predvolené sú bity ako v špecifikáciách kariet a poskytovateľov; prenosy súborov často používajú bajty. Grafy, štítky a pomôcky sa zmenia ihneď bez obnovenia." + }, + "health": { + "heading": "Monitor zdravia", + "intro": "Karta nastavuje trvanie potlačenia: ako dlho čakať pred opätovným oznámením zamietnutej výstrahy. Každá kategória — CPU, pamäť, úložisko, disky, sieť, VM, služby PVE, záznamy, aktualizácie a zabezpečenie — má vlastný zoznam:", + "items": [ + "24 h Predvolené pre väčšinu prechodných kategórií.", + "72 h — na stíšenie týchto udalostí na niekoľko dní.", + "168 h (1 týždeň) a 720 h (1 mesiac) — pravidelné kontroly.", + "8760 h (1 rok) — stíšenie na dlhé obdobie.", + "-1 — trvalé stíšenie až do ručného opätovného zapnutia.", + "Vlastný počet hodín — celé číslo pre inú požadovanú hodnotu." + ], + "imageAlt": "Nastavenia, karta Health Monitor s trvaním podľa kategórie a aktívnymi potlačeniami", + "imageCaption": "Zoznamy určujú trvanie budúcich potlačení. Dolná časť zobrazuje stíšené výstrahy a umožňuje ich znova zapnúť.", + "editTitle": "Režim úprav", + "editBody": "Karta je najprv iba na čítanie. Upraviť vpravo hore zapne zoznamy a tlačidlá obnovenia. Uložiť naraz použije čakajúce zmeny trvania a obnovenia; Zrušiť ich zahodí. Uložiť sa zapne až pri zmenách.", + "activeTitle": "Aktívne potlačenia", + "activeIntro": "Pod trvaním časť Aktívne potlačenia uvádza dočasne stíšené výstrahy —24 h, 7 dní alebo iné obdobie— aj trvalé. Každý riadok zobrazuje:", + "activeItems": [ + "Farebný odznak: Trvalo v jantárovej farbe alebo odpočet, napríklad zostáva 24 h / zostáva 7 dní, v modrej.", + "Identifikátor výstrahy v čitateľnej forme (napr. pve_storage_full_PBS-Cloud → Plné úložisko PVE: PBS-Cloud).", + "Kategória, závažnosť a čas zamietnutia výstrahy.", + "Tlačidlo Znova zapnúť v režime úprav pripraví zrušenie potlačenia pri uložení." + ], + "activeReenableTitle": "Ako znova zapnúť výstrahu", + "activeReenableBody": "Znova zapnúť pri úprave označí riadok zeleno a prečiarkne identifikátor, ale zmena ešte neplatí. Opätovné kliknutie umožní Vrátiť späť. Uložiť odošle súbežne POST /api/health/un-acknowledge pre každé obnovenie a odstráni riadky. Ak problém trvá a kategória povoľuje opakovanie, výstraha sa vráti medzi aktívne pri ďalšej kontrole.", + "activePermanentNote": "Trvalé potlačenia cez Natrvalo alebo predvolené trvanie -1 možno zrušiť iba tu. Hlavné okno toto tlačidlo nemá; táto časť spája zoznam a obnovenie.", + "activeAutoRefreshTitle": "Automatické obnovenie", + "activeAutoRefreshBody": "Zoznam sa obnoví pri zamietnutí alebo zapnutí výstrahy v Health Monitor, pri návrate na kartu a pri zmene viditeľnosti. Stránku netreba načítať znova.", + "calloutTitle": "Podrobnosti na stránke Health Monitor", + "calloutBody": "Eskaláciu, automatické vyriešenie pri zmiznutí zariadenia a rozdiel medzi zamietnutím a vyriešením opisuje Health Monitor → Zamietnutie výstrah a trvanie potlačenia. Táto karta ponúka zoznamy a aktívne potlačenia." + }, + "thresholds": { + "heading": "Prahy Health Monitor", + "intro": "Predchádzajúca karta určuje trvanie stíšenia po potlačení; táto nastavuje hodnotu spustenia výstrahy. Väčšina kontrol má nastaviteľný varovný a kritický prah. Tabuľka vysvetľuje výnimky, napríklad kombinované pravidlo swapu a aktuálny detektor RAM.", + "whatForTitle": "Na čo slúži", + "whatForIntro": "Predvolené hodnoty sú východiskom, ale každé prostredie má vlastné podmienky:", + "whatForItems": [ + "Homelab s jediným SSD môže varovať skôr, napríklad pri 75/90 %, aby zostalo miesto na snímky.", + "Prahy pamäte majú vychádzať z meraní a záťaže hostiteľa. Redundancia Ceph sama neodôvodňuje miernejšie varovania a vysoké využitie ARC ZFS neznamená neuvoľniteľnú pracovnú pamäť.", + "Teplotné prahy vyberte podľa špecifikácií disku a skutočných podmienok. Pasívne alebo nútené chladenie samo neurčuje univerzálne nižší či vyšší bezpečný limit.", + "Silne virtualizovaný hostiteľ môže pri zostavovaní dosiahnuť špičky CPU bez výstrahy pri každom 80 % výkyve, ale musí upozorniť na trvalé preťaženie." + ], + "whatForOutro": "Podporované zmeny platia pri ďalšej kontrole. Health Monitor číta /usr/local/share/proxmenux/health_thresholds.json v každom cykle bez reštartu. Niektoré ukazovatele, napríklad teplota diskov, používajú tieto hodnoty; niektoré kapacitné pruhy majú vlastné hranice. Riadok RAM vysvetľuje aktuálnu výnimku.", + "coloursTitle": "Farby stavov Varovanie a Kritické", + "coloursIntro": "Widgety s nastavenou dvojicou Varovanie/Kritické používajú tri stavy nižšie. Iné ukazovatele, napríklad kapacitné pruhy PVE, majú vlastné hranice; samotná farba nedokazuje výstrahu Health Monitor.", + "headerColour": "Farba", + "headerRange": "Rozsah", + "headerMeaning": "Význam", + "colourRows": [ + { + "colour": "Zelená", + "range": "Hodnota < varovný prah", + "meaning": "Normálny rozsah. Nevzniká výstraha." + }, + { + "colour": "Oranžová", + "range": "Varovný prah ≤ hodnota < kritický prah", + "meaning": "Varovný stav. Health Monitor vytvorí udalosť WARNING; oznámenia rešpektujú filtre kanála a tiché hodiny." + }, + { + "colour": "Červená", + "range": "Hodnota ≥ kritický prah", + "meaning": "Kritický stav. Health Monitor vytvorí udalosť CRITICAL, ktorá obíde tiché hodiny. Nastavenia kategórií a udalostí kanála stále platia; doručenie závisí aj od dostupnosti kanála." + } + ], + "sectionsTitle": "Časti a odporúčané predvolené hodnoty", + "sectionsIntro": "Sú to úvodné hodnoty ProxMenux, kým ich nezmeníte. Časti nasledujú výpočtovú záťaž, teplotu a kapacitu úložiska, od aktuálnej záťaže po obsadené miesto.", + "headerSection": "Oddiel", + "headerWarning": "Varovný prah", + "headerCritical": "Kritický prah", + "headerGates": "Riadená kontrola", + "thresholdRows": [ + { + "section": "Využitie CPU", + "warning": "85 %", + "critical": "95 %", + "gates": "Výstraha trvalej záťaže, keď priemerné využitie CPU prekročí prah počas kontrolného obdobia." + }, + { + "section": "Pamäť", + "warning": "85 %", + "critical": "95 %", + "gates": "Tlak na RAM hostiteľa. Nastavenie uvádza kritický prah 95 %, ale aktuálny detektor používa pevné pravidlo trvalých 90 %; zmena nastavenia teraz nemení túto vetvu." + }, + { + "section": "Swap (iba kritická hranica)", + "warning": "—", + "critical": "80 %", + "gates": "Swap CRITICAL vyžaduje súčasne viac než 80 % swapu a menej než 15 % dostupnej RAM počas viacerých meraní. Samotný obsadený swap pravidlo nespustí." + }, + { + "section": "Teplota CPU", + "warning": "80 °C", + "critical": "90 °C", + "gates": "Teplota puzdra CPU alebo jadier z lm-sensors." + }, + { + "section": "Teplota disku — HDD", + "warning": "60 °C", + "critical": "65 °C", + "gates": "Teplota HDD. Predvolene varovanie pri 60 °C a kritické pri 65 °C. Sú to hodnoty monitorovania, nie univerzálny limit výrobcu; overte špecifikácie modelu." + }, + { + "section": "Teplota disku — SSD", + "warning": "70 °C", + "critical": "75 °C", + "gates": "SATA SSD vo formáte 2,5 palca alebo M.2. Táto trieda používa predvolene 70/75 °C; skutočné limity závisia od modelu." + }, + { + "section": "Teplota disku NVMe", + "warning": "80 °C", + "critical": "85 °C", + "gates": "Teplota NVMe. Táto trieda používa predvolene 80/85 °C. Teplota obmedzovania radiča závisí od modelu a nie je vždy 85 °C." + }, + { + "section": "Teplota disku — SAS", + "warning": "55 °C", + "critical": "65 °C", + "gates": "Teplota SAS. Táto trieda používa varovanie pri 55 °C a kritické pri 65 °C. Sú to predvoľby monitorovania, nie dôkaz poruchy chladenia pri 55 °C ani univerzálny limit výrobcu." + }, + { + "section": "Miesto na disku — hostiteľ", + "warning": "85 %", + "critical": "95 %", + "gates": "Kapacita / a každého bodu pripojenia hostiteľa (/var/lib/vz, /mnt/*…)." + }, + { + "section": "Miesto na disku LXC rootfs", + "warning": "85 %", + "critical": "95 %", + "gates": "Koreňový disk každého kontajnera, hodnotený podľa veľkosti rootfs z PVE." + }, + { + "section": "Prípojné body LXC", + "warning": "85 %", + "critical": "95 %", + "gates": "Kapacita pripojení v spustených CT: mp0, mp1, NFS a bind mount. Bez rootfs." + }, + { + "section": "PVE úložisko", + "warning": "85 %", + "critical": "95 %", + "gates": "Úložiská spravované PVE: LVM, LVM-thin, ZFS-pool, RBD/Ceph a PBS. Nie všetky sú blokové úložiská." + }, + { + "section": "ZFS pool", + "warning": "85 %", + "critical": "95 %", + "gates": "Fondy ZFS na hostiteľovi, nezávisle od registrácie v PVE." + } + ], + "defaultsTitle": "Predvolené hodnoty, zmeny a obnovenie", + "defaultsBody": "Každá časť začína predvolenými hodnotami; ukladáte iba želané zmeny. Karta ukazuje platnú hodnotu: vašu zmenu alebo predvoľbu. Obnoviť odstráni všetky zmeny vo všetkých častiach.", + "validationTitle": "Overenie", + "validationBody": "Pri ukladaní sa kontrolujú povolené rozsahy a odmietne sa kritický prah pod varovným. Rozhranie zobrazuje chyby a server pred uložením znovu overí požiadavky API." + }, + "lxcDetection": { + "heading": "Kontrola aktualizácií v LXC", + "imageAlt": "Karta zisťovania aktualizácií LXC s prepínačom hľadania balíkov v spustených kontajneroch Debian, Ubuntu a Alpine", + "imageCaption": "Prepínač pravidelnej kontroly cez apt list --upgradable / apk list -u v spustených CT. Predvolene zapnutý. Súvisiaci prepínač v Oznámenia → Služby sa zobrazuje pri zapnutej detekcii.", + "intro": "Prepínač medzi Prahmi a Oznámeniami riadi kontrolu LXC. Zapnutý zisťuje balíky spustených CT; Hardvér zobrazuje výsledky a vstupujú do lxc_updates_available. Vypnutý zastaví volania pct exec a odstráni záznamy LXC z managed_installs.json; /api/managed-installs prestane hlásiť stav bez čakania 24 hodín.", + "whatRunsTitle": "Čo kontrola spúšťa", + "whatRunsIntro": "Pre každý CT v stave running s podporovaným správcom balíkov:", + "whatRunsItems": [ + "Aktuálnosť metadát. Ak je cache apt/apk staršia než 24 hodín, pokúsi sa o apt-get update -qq na Debian/Ubuntu alebo apk update na Alpine s limitom 60 s. Pri zlyhaní zoznam použije dostupnú, možno zastaranú cache.", + "Zoznam. Spustí apt list --upgradable / apk list -u a získa počet balíkov a niekoľko názvov.", + "Odstránenie duplicít pre CT. Odtlačok počtu, bezpečnostných aktualizácií a zoradených názvov zabráni dennému opakovaniu rovnakej sady. Významná zmena vyvolá nové oznámenie." + ], + "selfUpdateTitle": "CT aktualizované mimo apt môžu hlásiť 0", + "selfUpdateBody": "Detekcia pokrýva iba správcu balíkov CT. Softvér aktualizovaný mimo apt, napríklad nastavená úloha plexupdate alebo obrazy získané cez docker pull, sa nepočíta. Nula aktualizácií apt nedokazuje aktuálnosť všetkých aplikácií. Balíky základného systému sa naďalej zisťujú.", + "refreshTitle": "Prečo obnovovať metadáta po 24 hodinách", + "refreshBody": "Dlho bežiaci CT môže mať staré metadáta apt, ak nikto nespúšťa apt update. apt list --upgradable potom môže prehliadnuť nové aktualizácie. ProxMenux skúsi obnovu po 24 hodinách a pri novšej cache ju vynechá.", + "toggleTitle": "Prepínač oznámení pri zapnutej detekcii", + "toggleBody": "Prepínač lxc_updates_available pre každý kanál v Oznámenia → Služby sa zobrazuje iba pri zapnutej detekcii. Vypnutie skryje riadok vo všetkých kanáloch. Voľba zostáva v databáze a po zapnutí sa obnoví pôvodná hodnota.", + "purgeTitle": "Čo sa odstráni pri vypnutí detekcie", + "purgeBody": "Vypnutie ihneď odstráni záznamy type=lxc z /usr/local/share/proxmenux/managed_installs.json. Po obnovení Hardvér prestane zobrazovať počty aktualizácií LXC. Po zapnutí register naplní ďalší cyklus, prípadne skoršie ručné obnovenie cez API." + }, + "storageExclusions": { + "heading": "Vylúčené vzdialené úložiská", + "imageAlt": "Karta vylúčení vzdialených úložísk PBS-Cloud, PBS a PBS2 s prepínačmi Stav a Výstrahy pre každý riadok", + "imageCaption": "Prepínače Stav a Výstrahy pre každé úložisko. Ak sú oba vypnuté, úložisko sa nehodnotí v Health Monitor a neposiela oznámenia. Na karte Úložisko zostáva viditeľné ako vylúčené.", + "intro": "Úložiská spravované Proxmoxom (NFS / CIFS / PBS / Ceph / iSCSI / atď.) môžete vylúčiť dvoma nezávislými prepínačmi:", + "items": [ + "Stav — vypnutie prepínača vyradí úložisko z kategórie Úložisko v Health Monitor. Užitočné pre zväzky archívu, ktoré bývajú offline, alebo vzdialené ciele záloh zapínané iba podľa plánu.", + "Výstrahy — vypnutie zastaví oznámenia o tomto úložisku cez nastavené kanály, aj pri zapnutých kontrolách stavu. Užitočné, ak chcete sledovať stav na paneli bez oznámení." + ], + "outro": "Vylúčené úložiská zostávajú na karte Úložisko s fialovým odznakom vylúčené, aby nezmizli z inventára. Stav sa ukladá do tabuľky SQLite excluded_storages." + }, + "interfaceExclusions": { + "heading": "Vylúčené sieťové rozhrania", + "imageAlt": "Karta vylúčení rozhraní vmbr0, vmbr1, vmbr2, bond0 a eno1 s prepínačmi Stav a Výstrahy pre každé rozhranie", + "imageCaption": "Rovnako ako pri úložisku má každé rozhranie prepínače Stav a Výstrahy. Riadok zobrazuje názov, typ (most / agregácia / fyzické), IP a rýchlosť spojenia.", + "intro": "Rovnaký princíp platí pre rozhrania: každé možno vylúčiť z kontrol stavu, oznámení alebo oboch. Bežné príklady:", + "items": [ + "Zámerne vypnutý záložný most.", + "Fyzicky odstránená sieťová karta, ktorá zostáva uvedená v /etc/network/interfaces.", + "Podrozhranie VLAN používané iba počas údržby.", + "Správcovský most so známymi opakovanými zmenami stavu spojenia počas údržby." + ], + "outro": "Stav sa ukladá do tabuľky SQLite excluded_interfaces. Fialový odznak vylúčené na karte Sieť ponechá vylúčené rozhrania viditeľné." + }, + "notifications": { + "heading": "Oznámenia a AI", + "body1": "Tu zapnete oznámenia ProxMenux Monitor a preformulovanie pomocou AI. Zapnúť oznámenia spustí odosielanie na pozadí, zaregistruje cieľ webhooku Proxmox VE na príjem jeho udalostí a otvorí nastavenia kanálov Telegram, Discord, email, Gotify a ďalších. AI je v rozbaľovacej rozšírenej časti toho istého panela.", + "body2": "Možnosti vysvetľujú samostatné stránky: kanály, prepínače udalostí, formátované správy, zobrazované meno, odosielanie s odstránením duplicít, odstupom, zoskupením a tichým časom, webhook PVE, poskytovatelia AI a režimy pokynov:", + "items": [ + "Oznámenia: nastavenie kanálov (Telegram, Discord, Gotify, email a heslá aplikácií Gmail / Microsoft, ntfy, Slack, Teams a všeobecný webhook), kategórie udalostí, formátované správy, zobrazované meno, odosielanie, webhook PVE, história a API.", + "Asistent AI: poskytovatelia (OpenAI, Anthropic, Gemini, Groq, OpenRouter, Ollama), modely, predvolené alebo vlastné pokyny, jazyk výstupu, podrobnosť pre kanály a návrhy AI." + ] + }, + "optimizations": { + "heading": "Optimalizácie ProxMenux", + "intro": "Inventár optimalizácií po inštalácii zaznamenaných ProxMenuxom na hostiteľovi. Voľby z Automatizované úpravy po inštalácii a Prispôsobiteľné úpravy po inštalácii zaznamenajú použitie v /usr/local/share/proxmenux/installed_tools.json. Monitor číta tento register. Záznam znovu nekontroluje, či všetky nastavenia zostali nezmenené.", + "imageAlt": "Karta optimalizácií ProxMenux so 14 záznamami: farebná bodka, názov a verzia. Obsahuje APT IPv4 Force, Bashrc Customization, Fastfetch, Log2ram SSD Protection, Memory Settings Optimization, Setting persistent network interfaces, System Limits Increase, APT Language Skip, Entropy Generation haveged s Legacy, Kernel Panic Configuration, Logrotate Optimization, Network Optimizations, Subscription Banner Removal a VFIO IOMMU Passthrough.", + "imageCaption": "Každá optimalizácia zobrazuje názov, verziu a farebnú bodku. Vpravo hore je oranžový počet 14 aktívnych. Nástroje s dostupným zdrojovým kódom možno otvoriť.", + "dotsTitle": "Čo znamenajú bodky", + "dotsItems": [ + " Zelená bodka: zaznamenaná optimalizácia bez označenia Legacy a dostupnej aktualizácie. Kliknite na riadok, ak je dostupný zdrojový kód.", + " Jantárová bodka a odznak legacy: zaznamenaná optimalizácia, ktorej skript bol premenovaný alebo nahradený. Zachovaný kód sa otvorí v režime Legacy s jantárovým zvýraznením. Aktuálnu konfiguráciu hostiteľa znovu neoveruje." + ], + "clickTitle": "Otvorenie zdrojového kódu", + "clickBody": "Kliknutie otvorí priradenú funkciu bash a názov skriptu (auto_post_install.sh alebo customizable_post_install.sh). Aktuálne nástroje sa získavajú zo súborov hostiteľa, staršie môžu používať zachovaný kód. Pomáha zvýraznenie syntaxe a Kopírovať. Nejde o zaručenú snímku presného kódu spusteného pri inštalácii.", + "detailAlt": "Okno kódu APT IPv4 Force s funkciou bash force_apt_ipv4 z customizable_post_install.sh verzie 1.0. Zvýraznený kód nastavuje /etc/apt/apt.conf.d/99-force-ipv4 pomocou Acquire ForceIPv4 true, registruje nástroj a zobrazuje preloženú správu o dokončení konfigurácie APT IPv4.", + "detailCaption": "Kód APT IPv4 Force: funkcia force_apt_ipv4() z customizable_post_install.sh v1.0 so zvýraznením syntaxe a kopírovaním jedným kliknutím.", + "whyTitle": "Prečo na tom záleží", + "whyBody": "ProxMenux môže meniť parametre jadra, repozitáre, sieť, rotáciu protokolov a odovzdanie GPU. Pred ručnými zmenami si pozrite zaznamenané optimalizácie, najmä ak hostiteľa nastavil iný správca. Karta ukazuje register a dostupný kód; neoveruje všetky aktuálne nastavenia ani neuchováva presnú históriu vykonania.", + "updatesTitle": "Oznam dostupných aktualizácií", + "updatesBody": "Ak je verzia optimalizácie na disku novšia než zaznamenaná na hostiteľovi, zobrazí sa oznam s počtom a Použiť. Použiť otvorí výber optimalizácií, rovnako ako Použiť dostupné aktualizácie v ponuke po inštalácii. Vyberte aktualizácie; ProxMenux znova spustí funkcie a upraví register. Keď je všetko aktuálne, oznam zmizne.", + "updatesAlt": "Karta optimalizácií ProxMenux s oznamom dostupných aktualizácií, ich počtom a tlačidlom Použiť na otvorenie výberu", + "updatesCaption": "Oznam sa objaví, ak má aspoň jedna optimalizácia novšiu verziu na disku. Pozrite Použiť dostupné aktualizácie pre celý postup a zodpovedajúcu voľbu Path-A v ponuke shellu.", + "revertTitle": "Vrátenie optimalizácie späť", + "revertBody": "Optimalizáciu vrátite späť príslušnou voľbou Odinštalovať optimalizácie v ponuke ProxMenux Scripts. Odinštalovanie odstráni záznam z installed_tools.json a pri ďalšom obnovení zmizne z karty." + }, + "dataCollected": { + "heading": "Spôsob zberu údajov", + "headerCard": "Karta", + "headerEndpoint": "Koncový bod", + "headerSource": "Zdroj", + "rows": [ + { + "card": "Jazyk rozhrania", + "endpoint": "localStorage", + "source": "Voľba prehliadača proxmenux-ui-language; ak nie je uložený výber, najprv sa použije jazyk prehliadača." + }, + { + "card": "Poradie navigácie", + "endpoint": "localStorage", + "source": "Voľba prehliadača proxmenux-nav-order; určuje aj úvodnú kartu." + }, + { + "card": "Jednotky siete", + "endpoint": "/api/settings", + "source": "Uložené v tabuľke nastavení SQLite panela." + }, + { + "card": "Trvanie v Health Monitor", + "endpoint": "/api/health/settings", + "source": "Trvanie potlačenia podľa kategórie v databáze Health Monitor." + }, + { + "card": "Vylúčenie úložiska / rozhrania", + "endpoint": "/api/storage/exclusions, /api/network/exclusions", + "source": "SQLite tabuľky excluded_storages a excluded_interfaces." + }, + { + "card": "Panel Oznámenia a AI", + "endpoint": "/api/notifications/*", + "source": "Pozrite Oznámenia a Asistent AI." + }, + { + "card": "Zoznam optimalizácií ProxMenux", + "endpoint": "/api/proxmenux/installed-tools", + "source": "Číta /usr/local/share/proxmenux/installed_tools.json, kam zapisujú volania register_tool v skriptoch po inštalácii." + }, + { + "card": "Okno kódu optimalizácie", + "endpoint": "/api/proxmenux/tool-source", + "source": "Získa priradenú funkciu bash z auto_post_install.sh alebo customizable_post_install.sh na hostiteľovi; staršie nástroje môžu používať zachovaný kód." + } + ] + }, + "whereNext": { + "heading": "Kam ďalej", + "items": [ + { + "label": "Záložka aplikácií", + "href": "/docs/monitor/dashboard/apps", + "tail": " — spúšťač, ktorého polohu určíte v poradí navigácie." + }, + { + "label": "Oznámenia", + "href": "/docs/monitor/notifications", + "tail": " — kanály, prepínače udalostí, vlastné nastavenia kanálov, história a skúšobné odoslanie." + }, + { + "label": "AI asistent", + "href": "/docs/monitor/ai-assistant", + "tail": " — poskytovatelia, modely, režimy pokynov, jazyky a podrobnosť pre kanály." + }, + { + "label": "Health Monitor → Potlačenie výstrah a jeho trvanie", + "href": "/docs/monitor/health-monitor#dismissing-alerts-and-the-suppression-duration", + "tail": " — ako fungujú vyššie uvedené zoznamy trvania podľa kategórie." + }, + { + "label": "ProxMenux Scripts → Automatizované úpravy po inštalácii", + "href": "/docs/post-install/automated", + "tailRich": " a Prispôsobiteľné úpravy po inštalácii — skripty, ktoré zapisujú optimalizácie do vyššie uvedeného zoznamu." + }, + { + "label": "Odinštalovať optimalizácie", + "href": "/docs/post-install/uninstall", + "tail": " — ako vrátiť späť vyššie zaznamenanú optimalizáciu." + }, + { + "label": "Prehľad panela", + "href": "/docs/monitor/dashboard", + "tail": " — späť na prehľad kariet." + } + ] + } +} diff --git a/web/messages/sk/docs/monitor/dashboard/storage.json b/web/messages/sk/docs/monitor/dashboard/storage.json new file mode 100644 index 00000000..6fe25751 --- /dev/null +++ b/web/messages/sk/docs/monitor/dashboard/storage.json @@ -0,0 +1,268 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Prehľad: karta Úložisko | Dokumentácia ProxMenux", + "description": "Karta Úložisko spája štyri zobrazenia: úložiská Proxmox so stavom, pooly ZFS, interné disky so SMART a externé disky USB. Detail disku ukazuje atribúty SMART, opotrebovanie, životnosť a trvalú históriu pozorovaní." + }, + "header": { + "title": "Prehľad: karta Úložisko", + "description": "Úložiská hostiteľa na jednej obrazovke: NFS / CIFS / LVM / ZFS / dir Proxmox, stav poolov ZFS, interné disky SATA/NVMe so SMART a externé disky USB. Kliknutím na disk zobrazíte atribúty SMART a históriu pozorovaní.", + "section": "ProxMenux Monitor · Prehľad" + }, + "intro": { + "title": "Podporované tromi zdrojmi", + "body": "Úložiská Proxmox pochádzajú z pvesm status, ZFS zo zpool status, disky z lsblk + smartctl a polia NVMe z nvme. Karta sa obnovuje približne každých 60 sekúnd; otvorenie detailu vyžiada načítanie SMART." + }, + "thresholds": { + "title": "Farby stavu a prahové hodnoty, ktoré sa tu uplatňujú", + "intro": "Health Monitor hodnotí stav ako zelený pod varovaním, oranžový medzi varovaním a kritickým prahom a červený od kritického prahu. Nasledujú predvolené hodnoty. Jednotlivé pruhy môžu používať iné farebné hranice opísané nižšie.", + "items": [ + "Kapacita (disky hostiteľa, úložiská PVE, pooly ZFS, pripojenia LXC) — varovanie 85 %, kritické 95 %.", + "Teplota disku HDD 60/65 °C · SSD 70/75 °C · NVMe 80/85 °C · SAS 55/65 °C (varovanie/kritické)." + ], + "outro": "Každú hodnotu možno nastaviť pre hostiteľa. Nastavenia → Prahy Health Monitor uvádza rozhodujúce hodnoty a vysvetľuje ich úpravu." + }, + "topRow": { + "heading": "Horný riadok: prehľad úložísk", + "intro": "Po otvorení štyri karty zhŕňajú celkovú kapacitu, miestne využitie, vzdialené využitie a zoznam fyzických diskov. Poskytujú rýchle odpovede; karty nižšie obsahujú podrobnosti.", + "imageAlt": "Karta Úložisko so štyrmi kartami: celková kapacita, miestne využitie, vzdialené využitie a fyzické disky", + "imageCaption": "Horný riadok: celková kapacita a počet diskov, miestne a vzdialene použité bajty a fyzické disky podľa typu so súhrnom stavu.", + "headerCard": "Karta", + "headerWhat": "Čo ukazuje", + "totalLabel": "Celková kapacita", + "totalWhat": "Celková hrubá kapacita všetkých fyzických diskov. Päta uvádza počet zistených diskov.", + "localLabel": "Lokálne využité", + "localWhat": "Použité bajty na miestnych úložiskách: LVM / LVM-thin / ZFS / dir na diskoch hostiteľa. Hlavná hodnota ukazuje použité bajty a päta X.XX % z Y TB aj percento zaplnenia.", + "remoteLabel": "Vzdialené využitie", + "remoteWhat": "Rovnaký formát ako miestne využitie pre vzdialené úložiská NFS / CIFS / PBS / Ceph / iSCSI. Počítajú sa oddelene, pretože miestne a vzdialené poruchy majú iný dosah a zdroje sa plánujú a monitorujú odlišne.", + "disksLabel": "Fyzické disky", + "disksIntro": "Dva riadky členenia pre súpis:", + "disksItems": [ + "Podľa typu — počet NVMe fialovo, SSD a HDD modro. Zobrazujú sa zistené typy; hostiteľ iba s NVMe ukazuje len tento počet.", + "Podľa stavu — počet normálnych diskov zeleno, s varovaním žlto a kritických červeno. Bez problémov sa ukáže len „X normálnych“; ďalšie stavy sa zobrazia pri zistení problému." + ] + }, + "pveStorage": { + "heading": "Skladovacia karta Proxmox", + "intro": "Riadok pre každé úložisko z /etc/pve/storage.cfg s typom (nfs / cifs / zfspool / lvm / lvmthin / dir / pbs), názvom, stavom aktívne/chyba/nemonitorované, percentom využitia a farebným pruhom:", + "items": [ + "Do 75 % — modrý pruh a hodnota.", + "Nad 75 % do 90 % — žltý pruh a hodnota. Farebné hranice sú oddelené od prahov Health Monitor.", + "> 90 % — červený pruh a hodnota. Táto farebná hranica je oddelená od eskalácie v Health Monitor.", + "Chyba — červený rám riadka, ak je úložisko nastavené, ale nedostupné, napríklad pri výpadku NFS alebo neplatných prihlasovacích údajoch CIFS.", + "Vylúčené — fialový rám a štítok „nemonitorované“. Úložiská vylúčené používateľom, napríklad zámerne odpojené archívne zväzky." + ], + "calloutTitle": "Vylúčiť úložisko z monitorovania", + "calloutBody": "Ponuka úložiska ho umožňuje označiť ako vylúčené z monitorovania. Nastavenie je v excluded_storages a rešpektuje ho prehľad aj Health Monitor: bez oznámení a vplyvu na celkový stav." + }, + "zfs": { + "heading": "ZFS Pools karta", + "intro": "Zobrazuje sa iba s nainštalovaným ZFS a aspoň jedným poolom. Každý riadok ukazuje pool so stavom, veľkosťou, prideleným a voľným miestom a ikonou stavu:", + "items": [ + "ONLINE — zelená. Všetko zdravé.", + "DEGRADED — žltá. Pool poskytuje dáta, ale aspoň jedno zariadenie je nedostupné; treba riešiť jeho výmenu.", + "FAULTED / UNAVAIL / SUSPENDED — červená. Pool neposkytuje dáta a vyžaduje okamžitý zásah." + ], + "outro": "Stav ZFS a SMART každého disku vstupuje do kategórie Disky a I/O v Health Monitor." + }, + "physical": { + "heading": "Fyzické disky a SMART stav", + "intro": "Interné disky (SATA / NVMe). Každý riadok kondenzuje najužitočnejšie polia na prvý pohľad:", + "items": [ + "Trasa zariadenia — /dev/sda, /dev/nvme0n1.", + "Štítok typu — SATA / NVMe a príslušná ikona.", + "Systémový štítok — oranžové označenie diskov rozpoznaných ako disky operačného systému. Detekcia používa pripojenia / a /boot a pridelí štítok System. Chýbajúci štítok nedokazuje, že disk možno bezpečne vymazať alebo použiť inak.", + "Model — výrobca a model z smartctl -i.", + "Kapacita — zobrazená v zrozumiteľných jednotkách.", + "Teplota — aktuálna hodnota v °C s farbou podľa typu disku; NVMe používa vyššie prahy než SATA.", + "Stav SMART — úspešný / neúspešný / neznámy.", + "Štítok pozorovaní — ak trvalá história disk_observations obsahuje záznamy disku, modrý štítok ukáže ich počet, napríklad 3 obs.. Kliknutím na disk ich preskúmate.", + "Štítok stavu — V poriadku / Varovanie / Kritické podľa SMART a nedávnych pozorovaní." + ], + "clickHint": "Kliknutím na celý riadok otvoríte nižšie opísaný detail disku.", + "warningTitle": "S diskami označenými System zaobchádzajte opatrne", + "warningBody": "Disky s oranžovým štítkom System obsahujú bežiaci systém. Štítok pomáha pri identifikácii; ProxMenux → Správca diskov → Formátovať / Vymazať na nich odmieta deštruktívne akcie. Na iné využitie zavádzacieho disku použite záchranné prostredie mimo bežiaceho Proxmoxu." + }, + "external": { + "heading": "Externé úložisko (USB)", + "body": "Disky USB majú vlastnú kartu, viditeľnú pri prítomnosti aspoň jedného disku. Ukazuje rovnaké polia ako interné disky a oranžový štítok USB. Keďže sa často pripájajú iba na zálohy alebo občasné prenosy, pozorovania zostávajú uložené, ale chyby I/O odpojeného disku USB sa neeskalujú." + }, + "drillIn": { + "heading": "Okno detailu disku", + "intro": "Kliknutím na disk otvoríte štyri karty: Prehľad · SMART · História · Plánovanie. Hlavička ukazuje cestu, model, kapacitu a prípadne oranžový štítok System.", + "overviewTitle": "Karta 1 — Prehľad", + "overviewImageAlt": "Detail disku, karta Prehľad so stavom, kruhovým ukazovateľom opotrebovania a životnosti a hlavnými atribútmi SMART", + "overviewImageCaption": "Prehľad: identifikácia, stav, zostávajúca životnosť s aktuálnym opotrebovaním a zapísanými dátami a hlavné atribúty SMART.", + "overviewIntro": "Úvodná karta na kontrolu stavu disku bez spustenia testu. Tri bloky:", + "overviewItems": [ + "Identifikácia — model, sériové číslo, kapacita a stav V poriadku / Varovanie / Kritické.", + "Opotrebovanie a životnosť — kruh zostávajúcej životnosti (97 %, 50 %, …) so zdrojovým atribútom (Media Wearout Indicator, Percentage Used, …), pruh spotrebovaného percenta, odhad Odhadovaná životnosť v rokoch a celkové zapísané dáta. NVMe ukazuje aj Available Spare.", + "Atribúty SMART: hlavné hodnoty sa zobrazujú v dvoch stĺpcoch: teplota, počet hodín prevádzky s čitateľným trvaním, napríklad 3 roky a 116 dní, otáčky alebo SSD, počet zapnutí, stav SMART, prerozdelené sektory, čakajúce sektory a chyby CRC. Úplná tabuľka atribútov je na karte SMART." + ], + "smartTitle": "Karta 2 — SMART", + "smartImageAlt": "Detail disku, karta SMART s krátkym a rozšíreným testom, posledným výsledkom a úplnou tabuľkou atribútov", + "smartImageCaption": "Karta SMART: spustite krátky alebo rozšírený test, skontrolujte posledný výsledok a všetky atribúty a otvorte úplnú správu na tlač alebo uloženie do PDF.", + "smartIntro": "Dostupné akcie v troch častiach:", + "smartItems": [ + "Spustiť test SMART — dve tlačidlá. Krátky test (~2 min) počká na výsledok a zobrazí ho v okne. Rozšírený test (na pozadí) môže na veľkých diskoch trvať hodiny, pokračuje na serveri a po dokončení odošle oznámenie.", + "Posledný test — typ, stav (úspešný / neúspešný) a čas posledného spustenia.", + "Atribúty SMART — úplná tabuľka s ID, názvom, hodnotou, najhoršou hodnotou a stavom v poriadku, varovanie alebo kritické. SATA/SAS zobrazuje číslovaný zoznam. NVMe používa nvme smart-log: teplotu, dostupnú rezervu, použité percento, prečítané/zapísané jednotky, čítania/zápisy hostiteľa, čas vyťaženia radiča, zapnutia, nebezpečné vypnutia, chyby média, záznamy chýb a čas celkovej teploty vo varovnom/kritickom pásme." + ], + "pdfTitle": "Zobraziť úplnú správu SMART (PDF)", + "pdfIntro": "Dole na karte SMART otvorí Zobraziť úplnú správu SMART správu na tlač. Tlačovým oknom prehliadača ju uložíte do PDF na archiváciu alebo zdieľanie s podporou pri RMA.", + "pdfPreviewAlt": "Prvá strana správy SMART so súhrnom, ukazovateľom PASSED a informáciami o disku", + "pdfPreviewCaption": "Prvá strana: súhrn, ukazovateľ PASSED a úplné informácie o disku. Príklad PDF obsahuje opotrebovanie SSD, všetky atribúty SMART a históriu testov.", + "pdfDownloadLabel": "Stiahnuť príklad správy SMART (PDF)", + "pdfSectionsIntro": "Správa má šesť hlavných častí:", + "pdfSections": [ + "Súhrn — stav PASSED/FAILED, zrozumiteľné hodnotenie disku — v poriadku, opotrebovaný alebo zlyhávajúci — a štyri údaje: čas správy, posledný typ testu, výsledok a overené atribúty.", + "Informácie o disku — model, sériové číslo, kapacita, typ HDD/SSD/NVMe, rodina, formát, rozhranie (SATA 3.3 · 6.0 Gb/s, …), TRIM, teplota a optimálny prah, hodiny prevádzky, zapnutia, SMART, čakajúce/prerozdelené sektory a chyby CRC.", + "Opotrebovanie a životnosť SSD (iba SSD/NVMe) — zostávajúca životnosť, zdrojový atribút, opotrebovanie, zapísané dáta a hodiny prevádzky.", + "Úplné atribúty SMART — ID, názov, hodnota, najhoršia hodnota, prah, nespracovaná hodnota a stav každého atribútu. Hlavné — Reallocated Sector Ct, Power On Hours, Reported Uncorrect, UDMA CRC Error Count, Media Wearout Indicator, … — majú pod riadkom stručné vysvetlenie.", + "Posledný autotest a úplná história — posledný test s typom, výsledkom, záverečnou správou a vtedajším počtom hodín prevádzky a číslovaná tabuľka všetkých uchovaných testov.", + "Odporúčania — kroky podľa výsledku. Pre zdravé disky: disk v poriadku / pravidelné testy / stratégia záloh. Pri atribútoch mimo rozsahu sa pridajú odporúčania na výmenu." + ], + "pdfOutro": "Prehliadač vytvorí správu na tlač; Tlačiť aj Uložiť ako PDF otvoria tlačové okno. Vyberte názov ako SMART-<short-id>.pdf. Uchovajte datované kópie na porovnanie zmien alebo zdieľanie s podporou.", + "historyTitle": "Karta 3 — História", + "historyImageAlt": "Detail disku, karta História s predchádzajúcimi testmi SMART a možnosťami stiahnutia a odstránenia", + "historyImageCaption": "História testov SMART disku. Každý riadok ukazuje typ, čas, vek, označenie posledného testu a možnosti stiahnutia výstupu smartctl a odstránenia.", + "historyIntro": "Dokončené a uchované krátke aj rozšírené testy disku. Každý záznam obsahuje pôvodný výstup smartctl a polia spracované Monitorom pre prehľad. Akcie v riadku:", + "historyItems": [ + "Stiahnuť — uloží snímku JSON s údajmi smartctl -a použitými v správe. Užitočné, ak podpora potrebuje pôvodné diagnostické polia.", + "Odstrániť — ručne vymaže test z histórie. Uchovávanie v Plánovaní (posledných 5 / 10 / 20) automaticky maže najstaršie." + ], + "scheduleTitle": "Karta 4 — Plánovanie", + "scheduleImageAlt": "Detail disku, karta Plánovanie s prepínačom automatických testov SMART, zoznamom plánov a tlačidlom Pridať plán", + "scheduleImageCaption": "Plánovanie: vyberte typ, frekvenciu a uchovávanie; Monitor nastaví cron na automatické spúšťanie testov.", + "scheduleIntro": "Automatické testy SMART cez cron bez terminálu. Tri oblasti:", + "scheduleItems": [ + "Automatické testy SMART — spoločný prepínač všetkých plánov disku. Umožní ich pozastaviť počas údržby bez vymazania nastavení.", + "Nastavené plány — riadok pre každý plán s typom (krátky / dlhý), čitateľným výrazom cron („Prvý deň mesiaca o 03:00“, „Každú nedeľu o 02:00“), zahrnutými diskami a uchovávaním.", + "Pridať / Upraviť plán — typ (krátky ~2 min / dlhý 1–4 h), frekvencia (denne / týždenne / mesačne), deň mesiaca alebo týždňa, čas a uchované výsledky (posledných 5 / 10 / 20)." + ], + "scheduleOutro": "Plán vytvorí na hostiteľovi záznam cron, ktorý volá Monitor. Výsledky sa uložia do histórie SMART na karte 3 a nastavenie uchovávania po novom teste automaticky odstráni najstaršie výsledky.", + "tempTitle": "Okno histórie teploty", + "tempIntro": "Monitor pravidelne meria disky s teplotným senzorom a ukladá hodnoty do lokálnej histórie. Aktuálna hodnota je v Prehľade; kliknutie otvorí detail histórie teploty.", + "tempImageAlt": "História teploty s cestou a modelom, obdobiami 1 hodina, 24 hodín, 7 alebo 30 dní, hodnotami Aktuálna/Minimum/Priemer/Maximum a čiarovým grafom s farbami podľa prahov typu disku", + "tempImageCaption": "Detail teploty otvoríte z Prehľadu, ak senzor vráti nenulovú hodnotu. Graf používa prahy HDD / SSD / NVMe / SAS.", + "tempShowsTitle": "Obsah okna", + "tempShowsItems": [ + "Výber obdobia: 1 hodina, predvolene 24 hodín, 7 dní alebo 30 dní. Každý dopyt prispôsobí rozlíšenie, aby bol graf čitateľný.", + "Štyri ukazovatele: Aktuálna, Minimum, Priemer a Maximum za obdobie. Aktuálna používa prahy úložiska a oznámení na rozlíšenie normálnej, zvýšenej a vysokej teploty.", + "Čiarový graf teploty v čase s čiarou a plochou zafarbenou podľa typu disku:" + ], + "tempDiskTypes": [ + "HDD — zvyčajne nižšie teplotné prahy.", + "SSD — stredné teplotné prahy.", + "NVMe Vyššie prahové hodnoty (NVMe beží teplejšie podľa dizajnu).", + "SAS — varovanie pri 55 °C a kritické pri 65 °C; prah varovania sa líši od HDD." + ], + "tempConfigurable": "Všetky štyri typy nastavíte v Nastavenia → Prahy Health Monitor.", + "tempWhyTitle": "Prečo je história dôležitá", + "tempWhyItems": [ + "Odhalenie trendov. Jediné meranie neukáže, že sa disk celé týždne zahrieva, napríklad pre poruchu ventilátora, prach alebo blízky zdroj tepla. Zobrazenia za 7 a 30 dní odhalia vývoj.", + "Súvislosti špičiek. Ak záloha alebo obnova krátko zvýšila teplotu nad prah, zobrazenia za 1 a 24 hodín ukážu, či išlo o jednorazovú alebo opakovanú udalosť.", + "Nastavenie prahov. Pred zmenou v Nastavenia → Prahy Health Monitor si v 30-dňovom grafe pozrite skutočný prevádzkový rozsah disku." + ], + "obsTitle": "História pozorovaní naprieč kartami", + "obsIntro": "Poruchy sa môžu rozvíjať postupne. Disk môže hlásiť SMART PASSED a pritom zapisovať chyby čítania do dmesg, strácať spojenia SATA alebo uvádzať občasné čakajúce sektory. ProxMenux uchováva tieto signály a zobrazuje ich v okne spolu s aktuálnym stavom SMART.", + "obsImageAlt": "Prehľad disku s úspešným SMART a nulou prerozdelených/čakajúcich sektorov a chýb CRC, ale s pozorovaním chyby I/O s pôvodnou správou jadra, vysvetlením ATA, prvým a posledným časom a počtom výskytov", + "obsImageCaption": "Disk, ktorý prešiel SMART, môže mať staršie pozorovania. Karta dopĺňa aktuálny stav o históriu signálov.", + "obsWhatTitle": "Čo je pozorovanie", + "obsWhatIntro": "ProxMenux zaznamená ako pozorovanie udalosti disku z denníka jadra, dmesg alebo SMART, ktoré by samostatne boli príliš podrobné pre oznámenie. Každý riadok zobrazuje:", + "obsWhatItems": [ + "Typ — chyba I/O, SMART, súborového systému, poolu ZFS alebo spojenia.", + "Pôvodná správa jadra z dmesg na skopírovanie do vyhľadávača alebo žiadosti o podporu.", + "Stručné vysvetlenie známych kódov ATA: IDNF, adresa sektora sa nenašla, možný chybný sektor alebo kábel; UNC, neopraviteľná chyba čítania, chybný sektor; a ďalšie štandardné kódy.", + "Prvý a posledný čas a počet výskytov zoskupených podľa podpisu chyby." + ], + "obsWhyTitle": "Prečo ich ProxMenux zaznamenáva a zobrazuje", + "obsWhyItems": [ + "Poruchy sa môžu vyvíjať. Chyby zbernice ATA, sektory UNC alebo chyby média sa môžu objaviť pred stavom SMART FAILED. Pamäť dmesg ich po reštarte neuchová, história pozorovaní áno.", + "SMART nevylučuje každú poruchu. Disk môže mať zelené atribúty a pritom problémy. Pozorovania uchovávajú ďalšie príznaky, napríklad ICRC, IDNF, resety spojení SATA alebo zníženie rýchlosti.", + "Odlišuje aktuálne od nedávneho. Health Monitor automaticky vyrieši prechodné chyby, ktoré sa už neopakujú. História aj po dňoch ukáže napríklad tri chyby I/O z jednej noci.", + "Podklad stupňovaných oznámení. disk_io používa frekvenciu pozorovaní na výber tichého stavu, WARNING alebo CRITICAL v posuvnom 24-hodinovom okne zavedenom vo verzii 1.2.1.2." + ], + "obsDedupTitle": "Zoskupovanie duplicít a opakované oznámenia", + "obsDedupBody1": "Pozorovania sa zoskupujú podľa podpisu, stabilného odtlačku typu chyby, zariadenia a kľúčových polí správy. Opakovania zvýšia occurrence_count v existujúcom riadku. Iný podpis vytvorí ďalšie pozorovanie a pre oznámenia predstavuje novú udalosť.", + "obsDedupBody2": "Aby nevznikla záplava oznámení, prvá kombinácia disku, podpisu a závažnosti upozorní operátora. Rovnaká kombinácia čaká 24 hodín na ďalšie oznámenie aj pri rastúcom počte. Prechod z WARNING na CRITICAL čakanie preruší a oznámi zhoršenie.", + "obsDismissTitle": "Trvalá história a aktívne chyby", + "obsDismissBody1": "Pozorovania nemožno zamietnuť, skryť ani vymazať. Každý podpis má kartu; opakovanie zvýši počet a aktualizuje posledný čas. História sleduje sériové číslo: iný disk začína bez záznamov aj na rovnakom porte a premenovanie jadrom históriu zachová.", + "obsDismissBody2": "Vyriešenie alebo zamietnutie aktívnej chyby v Health Monitor nemení pozorovania. Zostávajú aj po automatickom vyriešení, takže dočasné varovanie z minulého týždňa je stále viditeľné. Aktívne chyby spravuje Health Monitor." + }, + "dataCollected": { + "heading": "Spôsob zberu údajov", + "headerSection": "Časť karty", + "headerEndpoint": "Koncový bod", + "headerSource": "Zdroj", + "rows": [ + { + "section": "Horné súhrnné karty", + "endpoint": "/api/storage/summary", + "source": "Agregované z lsblk, zpool list, vgs / lvs." + }, + { + "section": "Inventár diskov", + "endpoint": "/api/storage", + "source": "lsblk -O + smartctl -i pre zariadenie s vyrovnávacou pamäťou identity vymazanou pri pripojení za chodu." + }, + { + "section": "Úložiská Proxmox", + "endpoint": "/api/proxmox-storage", + "source": "pvesh get /nodes/<node>/storage s aktívnym/online stavom každého." + }, + { + "section": "Aktuálne hodnoty SMART", + "endpoint": "/api/storage/smart/", + "source": "smartctl -A <dev> je jeden z dostupných dopytov; detailný koncový bod používa aj úplný SMART JSON a údaje špecifické pre NVMe." + }, + { + "section": "História autotestov SMART", + "endpoint": "/api/storage/smart//history", + "source": "Uložené v /usr/local/share/proxmenux/smart/<disk>/ ako snímky JSON." + }, + { + "section": "Trvalé pozorovania", + "endpoint": "/api/storage/observations", + "source": "Tabuľka SQLite aktualizovaná Health Monitor pri každom cykle a uchovaná po vyriešení aktívnych chýb." + } + ], + "outro": "Overovanie reťazca zberu na hostiteľovi:", + "codeComment1": "# Získať aktuálny stav zo skriptu", + "codeComment2": "# Porovnať údaje prehľadu s priamym výstupom operačného systému" + }, + "whereNext": { + "heading": "Kam ďalej", + "items": [ + { + "label": "Monitor zdravia", + "href": "/docs/monitor/health-monitor", + "tail": " — kategória Disky a I/O a pravidlá potláčania." + }, + { + "label": "Referenčná príručka API", + "href": "/docs/monitor/api", + "tail": " — koncové body úložísk a SMART." + }, + { + "label": "Oznámenia", + "href": "/docs/monitor/notifications", + "tailRich": " — následné akcie spustené udalosťami disk_io_error, storage_unavailable a smart_test_failed." + }, + { + "label": "Index prehľadu", + "href": "/docs/monitor/dashboard", + "tail": " — Ostatné karty." + }, + { + "label": "ProxMenux → Správca diskov", + "href": "/docs/disk-manager", + "tail": " — akcie TUI: formátovanie, vymazanie, testy SMART a import diskov do VM alebo kontajnerov." + }, + { + "label": "ProxMenux → Stav a testy SMART disku", + "href": "/docs/disk-manager/smart-disk-test", + "tail": " — verzia CLI: plánovanie testov SMART, export zobrazeného JSON a podrobnosti o typoch testov a výklade výsledkov." + } + ] + } +} diff --git a/web/messages/sk/docs/monitor/dashboard/system-logs.json b/web/messages/sk/docs/monitor/dashboard/system-logs.json new file mode 100644 index 00000000..ff1b0f8b --- /dev/null +++ b/web/messages/sk/docs/monitor/dashboard/system-logs.json @@ -0,0 +1,120 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Panel: Systémové záznamy | Dokumentácia ProxMenux", + "description": "Záložka System Logs konsoliduje tri zdroje do jednej obrazovky: živé journalctl s filtrami a downloadom, História úloh Proxmox (UPIDs) a oznamovací protokol, všetky vyhľadávateľné, filtrovateľné podľa závažnosti / časového rozsahu, a sťahovanie ako textové zväzky." + }, + "header": { + "title": "Panel: Systémové záznamy", + "description": "Tri podkarty na jednej obrazovke: systémový žurnál (journalctl s filtrami), história úloh Proxmox a záznam oznámení. Vo všetkých možno vyhľadávať, filtrovať a sťahovať údaje ako textové balíky.", + "section": "ProxMenux Monitor · Prehľad" + }, + "readOnly": { + "title": "Len na čítanie podľa návrhu", + "body": "Táto karta nemení súbory záznamov. Filtre sa uchovávajú v URL alebo stave rozhrania a súbory na stiahnutie pripravuje server. Panel nikdy neodstraňuje záznamy; na ich údržbu použite na hostiteľovi journalctl --vacuum-time=<N> alebo logrotate." + }, + "topRow": { + "heading": "Horný riadok: štyri počítadlá", + "items": [ + "Celkový počet záznamov — počet položiek v časovom rozsahu aktívneho filtra.", + "Chyby — počet záznamov so závažnosťou ≤ 3 (err / crit / alert / emerg).", + "Upozornenia — počet záznamov so závažnosťou 4 (warning).", + "Zálohy — počet záznamov úloh vzdump / PBS v rovnakom časovom rozsahu." + ] + }, + "subtabs": { + "heading": "Tri podkarty", + "logsTitle": "Logy", + "logsIntro": "Systémový žurnál, ktorý server načítava cez journalctl. Na paneli nástrojov sú tieto filtre:", + "logsFilters": [ + "Závažnosť — emerg / alert / crit / err / warning / notice / info / debug alebo ľubovoľná kombinácia.", + "Časový rozsah Posledná 5 min/ 15 min/ 1 h / 6 h / 24 h / 7 d / vlastné.", + "Voľné vyhľadávanie textu — podreťazec alebo regulárny výraz (journalctl --grep).", + "Filter jednotky — obmedzí výsledky na konkrétnu jednotku systemd (pveproxy.service, nginx.service, …)." + ], + "logsRowsAfter": "Každý riadok zobrazuje časovú pečiatku, označenie závažnosti, zdrojovú jednotku a správu. Dlhé správy sa zbalia s prepínačom „zobraziť viac“. Akcia Stiahnuť vytvorí z aktuálneho filtra jeden súbor .txt cez GET /api/logs/download, vhodný na zdieľanie časti žurnálu s ďalšou osobou.", + "logDetailsModalTitle": "Okno Podrobnosti záznamu", + "logDetailsBody": "Kliknutie na riadok otvorí okno Podrobnosti záznamu so všetkými štruktúrovanými poľami, ktoré journald zachytil pre danú položku, rovnako ako príkaz journalctl --output=verbose na hostiteľovi.", + "logDetailsImageAlt": "Okno Podrobnosti záznamu — rozbalená položka žurnálu s úrovňou, službou, časovou pečiatkou, zdrojom, jednotkou systemd, ID procesu, názvom hostiteľa a úplnou správou", + "logDetailsImageCaption": "Podrobnosti záznamu — všetky štruktúrované polia danej položky journald a dole úplná neskrátená správa. Užitočné pri záznamoch cron a služieb, kde záleží na vykonanom príkaze.", + "fieldsIntro": "Zobrazené polia:", + "fields": [ + "Úroveň — farebné označenie závažnosti (INFO / WARNING / ERROR / CRITICAL).", + "Služba — krátky názov jednotky alebo procesu, ktorý vytvoril záznam.", + "Časová pečiatka — úplný dátum a čas riadka záznamu.", + "Zdroj — pôvod položky (žurnál, jadro, audit, …).", + "Jednotka systemd — konkrétna jednotka .service / .timer / .socket, ak bola k záznamu priradená.", + "ID procesu — PID procesu, ktorý vytvoril záznam.", + "Názov hostiteľa — užitočný pri preposielaní žurnálov medzi uzlami klastra.", + "Správa — úplná neskrátená správa v bloku s neproporcionálnym písmom, pripravená na kopírovanie." + ], + "maxLevelStoreTitle": "Journald MaxLevelStore", + "maxLevelStoreBody": "Na novej inštalácii Proxmox používa journald predvolene MaxLevelStore=warning, čím zahadzuje správy info. Monitor to pri štarte rozpozná a pridá doplnkovú konfiguráciu (/etc/systemd/journald.conf.d/proxmenux-loglevel.conf) s prahom info, aby sa uchovávali informačné a závažnejšie správy. Správy debug to nezahŕňa.", + "backupsTitle": "Zálohy", + "backupsBody": "História úloh Proxmox obmedzená na zálohovanie. Jeden riadok na úlohu (vzdump, prenosy PBS, čistenie nepoužívaných dát a overenie), so stavom (OK / WARNINGS / ERROR), hosťovským systémom, zdrojovým úložiskom, trvaním a UPID. Kliknutím na riadok načítate úplný záznam úlohy cez GET /api/task-log/<upid> — rovnaké údaje ako v Datacenter → Úlohy, obmedzené na zálohy.", + "notificationsTitle": "Oznámenia", + "notificationsBody1": "Všetky oznámenia odoslané Monitorom: Telegram, Discord, e-mail, Gotify, ntfy, Slack, Teams a webhook. Každý riadok uvádza časovú pečiatku, kanál, typ udalosti, závažnosť, vytvorený názov a telo a pri zapnutej AI prepínač na porovnanie jej prepracovanej verzie s originálom.", + "notificationsBody2": "Na tejto karte overíte doručovanie oznámení cez kanál a porovnáte prepracovanie AI s pôvodnou šablónou. Kanály sa nastavujú na podrobnej stránke Oznámenia." + }, + "dataCollected": { + "heading": "Spôsob zberu údajov", + "headerSubtab": "Podkarta", + "headerEndpoint": "Koncový bod", + "headerSource": "Zdroj", + "rows": [ + { + "subtab": "Záznamy (živý filter)", + "endpoint": "/api/logs", + "source": "journalctl --output json --since <range> s filtrami závažnosti, jednotky a vyhľadávania použitými na serveri." + }, + { + "subtab": "Stiahnuť", + "endpoint": "/api/logs/download", + "source": "Rovnaký dotaz, vrátený ako obyčajný text pre grep / less." + }, + { + "subtab": "Zálohy", + "endpoint": "/api/backups", + "source": "História úloh PVE filtrovaná podľa vzdump, prenosov PBS, čistenia nepoužívaných dát a overenia." + }, + { + "subtab": "Podrobnosti úlohy zálohovania", + "endpoint": "/api/task-log/<upid>", + "source": "Plný textový záznam úloh čítaný z /var/log/pve/tasks/<index>/<upid>." + }, + { + "subtab": "História oznámení", + "endpoint": "/api/notifications/history", + "source": "Tabuľka SQLite notification_history, ktorú plní odosielacia slučka." + } + ], + "apiIntro": "Živý filter aj sťahovanie sú dostupné cez API:", + "codeComment1": "# Chyby a závažnejšie udalosti za poslednú hodinu s kľúčovým slovom", + "codeComment2": "# Stiahnuť celý žurnál za posledných 6 hodín ako obyčajný text", + "codeComment3": "# Vyhľadajte úplný výstup konkrétnej úlohy podľa UPID" + }, + "whereNext": { + "heading": "Kam ďalej", + "items": [ + { + "label": "Monitor zdravia", + "href": "/docs/monitor/health-monitor", + "tail": " — kategória Systémové záznamy, ktorá sleduje pretrvávajúce vzory, náhle nárasty a kaskády." + }, + { + "label": "Oznámenia", + "href": "/docs/monitor/notifications", + "tail": " — sledovanie žurnálu číta rovnaký zdroj a premieňa zhody na oznámenia." + }, + { + "label": "Referenčná príručka API", + "href": "/docs/monitor/api", + "tail": " — koncové body logs a task-log s parametrami dotazov." + }, + { + "label": "Index panela", + "href": "/docs/monitor/dashboard", + "tail": " — Ostatné karty." + } + ] + } +} diff --git a/web/messages/sk/docs/monitor/dashboard/system-overview.json b/web/messages/sk/docs/monitor/dashboard/system-overview.json new file mode 100644 index 00000000..3381d241 --- /dev/null +++ b/web/messages/sk/docs/monitor/dashboard/system-overview.json @@ -0,0 +1,177 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Panel: Prehľad systému | Dokumentácia ProxMenux", + "description": "Predvolená úvodná karta ProxMenux Monitor: štyri karty (CPU, pamäť, aktívne VM a LXC, teplota) s aktualizáciou naživo a minigrafom trendu, historický graf a súhrny úložiska a siete s odkazmi na podrobné karty." + }, + "header": { + "title": "Panel: Prehľad systému", + "description": "Karta, ktorú panel otvorí predvolene: štyri karty živých metrík hore, historický graf v strede a súhrny úložiska a siete dole. Používajú rovnaké API ako príslušné podrobné karty.", + "section": "ProxMenux Monitor · Prehľad" + }, + "readOnly": { + "title": "Snímka iba na čítanie", + "body": "Všetky panely tejto karty sú informačné. Akcie sú na prepojených kartách: Úložisko na správu diskov, VM a LXC na spustenie či zastavenie hosťovských systémov a Bezpečnosť na nastavenie overovania." + }, + "captureAlt": "Karta Prehľad systému — štyri karty metrík (CPU, pamäť, aktívne VM, teplota), graf metrík uzla a súhrnné karty úložiska a siete", + "captureCaption": "Prehľad systému, predvolená úvodná karta. Štyri karty sa aktualizujú naživo, graf zobrazuje históriu a dve dolné karty sumarizujú úložisko a sieť.", + "topRow": { + "heading": "Horný riadok: živé karty metrík", + "intro": "Štyri karty v mriežke 2×2 na mobile a v jednom riadku na počítači. Každá sa aktualizuje z /api/system každých pár sekúnd.", + "headerCard": "Karta", + "headerWhat": "Čo ukazuje", + "headerSource": "Zdroj", + "rows": [ + { + "card": "Využitie CPU", + "what": "Aktuálne percento s ukazovateľom priebehu. Vzorkovač životných funkcií ho aktualizuje každú ~1 s.", + "source": "psutil.cpu_percent()" + }, + { + "card": "Využitie pamäte", + "what": "Použité GB, percento a celkové GB. Ukazovateľ zobrazuje percento.", + "source": "psutil.virtual_memory()" + }, + { + "card": "Aktívne VM a LXC", + "what": "Počet bežiacich hosťovských systémov s rozdelením Spustené / Zastavené a celkovým počtom VM a LXC v päte.", + "source": "/api/vms (konsolidované)" + }, + { + "card": "Teplota", + "what": "Teplota CPU v °C s označením stavu (nízka / zvýšená / vysoká) a minigrafom posledných 5 minút v pozadí. Bez snímača sa zobrazí N/A. Kliknutie otvorí podrobnosti.", + "source": "sensors / coretemp" + } + ], + "thresholdsTitle": "Farby stavu a prahové hodnoty, ktoré sa tu uplatňujú", + "thresholdsIntro": "Prstence, ukazovatele a minigrafy používajú rovnakú škálu: zelená pod prahom Upozornenie, jantárová medzi Upozornenie a Kritické, červená od prahu Kritické vyššie. Odporúčané predvolené hodnoty ProxMenux:", + "thresholdsItems": [ + "Využitie CPU — upozornenie 85 %, kritické 95 %.", + "Pamäť — upozornenie 85 %, kritické 95 %. Swap tiež vyvolá kritický stav pri 5 % využitia; správne fungujúci hostiteľ Proxmox by ho mal používať len zriedka.", + "Teplota CPU — upozornenie 80 °C, kritické 90 °C." + ], + "thresholdsOutro": "Hodnoty možno nastaviť pre každého hostiteľa. Nastavenia → Prahy monitora stavu sú hlavný zdroj a vysvetľujú ich úpravu.", + "sparklineTitle": "Minigraf ukazuje trend", + "sparklineBody": "Karta teploty zobrazuje pod hodnotou priebeh posledných 5 minút. Farba čiary a prechodu sa riadi uvedenými prahmi Upozornenie/Kritické. Rýchlo tak zistíte, či teplota hostiteľa stúpa, bez otvorenia podrobností." + }, + "processes": { + "heading": "Procesy s najvyšším využitím CPU a pamäte", + "intro": "Karty Využitie CPU a Pamäť otvárajú triediteľný zoznam 25 najnáročnejších procesov: podľa využitia CPU pri otvorení z CPU alebo podľa rezidentnej pamäte pri otvorení z Pamäte.", + "listTitle": "Dialóg zoznamu", + "listItems": [ + "Automatické obnovenie — zoznam sa aktualizuje každých 5 sekúnd, kým je okno otvorené; po zatvorení sa dotazy zastavia.", + "Filter — vyhľadávanie obmedzí zoznam podľa príkazu, používateľa alebo PID.", + "Ukazovateľ v riadku — stĺpec hlavnej metriky kreslí malý ukazovateľ škálovaný podľa najvyššej hodnoty vo filtrovanom zozname. Poradie zostáva zrejmé, aj keď žiadny proces nie je blízko 100 %.", + "Mobilné rozloženie — pod 640 px sa skryjú stĺpce PID a Používateľ, aby sa Príkaz, CPU % a Pamäť zmestili na telefón bez vodorovného posúvania." + ], + "captureListAlt": "Okno procesov podľa pamäte — tabuľka zoradená podľa RSS so stĺpcami PID, používateľ, príkaz, CPU % a pamäť", + "captureListCaption": "Karta Pamäť otvorí zoznam podľa RSS (indigová farba). Karta CPU otvorí ten istý zoznam podľa využitia CPU (modrá farba).", + "detailTitle": "Podrobnosti jednotlivého procesu", + "detailIntro": "Kliknutie na riadok otvorí druhé okno so živými údajmi procesu v štyroch sekciách:", + "detailItems": [ + "Prehľad — stav, nadradený proces, počet vlákien, otvorené deskriptory súborov, používateľ a skupina.", + "Zdroje — CPU %, pamäť %, rezidentná pamäť (RSS), virtuálna veľkosť, swap a celkové prečítané a zapísané I/O dáta.", + "Príkaz — krátky názov, úplný príkazový riadok, cesta k spustiteľnému súboru a pracovný adresár.", + "Trvanie — časová pečiatka spustenia a uplynutý čas behu." + ], + "detailRefresh": "Podrobnosti sa aktualizujú každé 3 sekundy. Po ukončení procesu sa dotazy zastavia a objaví sa jantárové oznámenie Tento proces sa skončil. Posledný zachytený stav zostane stlmený na obrazovke, aby bolo vidieť dianie tesne pred koncom.", + "captureDetailAlt": "Podrobnosti procesu — Prehľad, Zdroje, Príkaz a Trvanie pre jedno PID", + "captureDetailCaption": "Podrobnosti procesu otvorené z riadka zoznamu. Farba zodpovedá karte, z ktorej sa otvorili: modrá pre CPU, indigová pre pamäť." + }, + "middle": { + "heading": "Stred: grafy metrík uzla", + "body1": "Pod kartami zobrazuje NodeMetricsCharts históriu CPU, pamäte a diskového I/O z úložiska RRD Proxmox cez /api/node/metrics. Volič ponúka 1 hodina / 24 hodín / 7 dní / 30 dní / 1 rok. Pri dlhšom období klesá rozlíšenie údajov, aby bol graf plynulý.", + "body2": "Rovnaké grafy ako vo webovom rozhraní Proxmox pre uzol, začlenené do tmavej témy Monitora a zarovnané s ostatnými panelmi." + }, + "bottom": { + "heading": "Dolný riadok: Súhrny úložiska a siete", + "storageTitle": "Karta Prehľad úložiska", + "storageIntro": "Kompaktný prehľad stavu úložiska hostiteľa, rozdelený do troch blokov:", + "storageItems": [ + "Celková kapacita uzla — súčet úložísk VM/LXC a lokálneho systémového úložiska, s ukazovateľom využitého a voľného miesta s farebným prechodom.", + "Celková kapacita / Fyzické disky — hrubá kapacita a počet nájdených fyzických diskov.", + "Úložisko VM/LXC — využité a voľné miesto a percento úložísk hosťovských systémov, s počítadlom pri viacerých úložiskách.", + "Lokálne úložisko (systém) — koreňový alebo systémový prípojný bod hostiteľa, oddelený od fondu hosťovských systémov." + ], + "storageDrillIn": "Podrobnosti sú na karte Úložisko: SMART jednotlivých diskov, fondy ZFS, história pozorovaní a ďalšie údaje.", + "networkTitle": "Sieťová prehľadová karta", + "networkBody1": "Hore je počet aktívnych rozhraní, fyzických aj mostov spolu. Pod ním sú dva rady farebných označení rozhraní up: fyzické NIC modrou a mosty druhou farbou. Volič vpravo hore (1 hodina / 24 hodín / 7 dní / 30 dní / 1 rok) ovláda malý graf prevádzky RX / TX.", + "networkBody2": "Podrobnosti rozhraní (IP/MAC, graf RRD, členovia mosta, režim bond a ďalšie) sú na karte Sieť." + }, + "refresh": { + "heading": "Model aktualizácie", + "intro": "Každý panel spravuje vlastný stav načítania (loadingStates.cpu, loadingStates.storage, …), aby pomalý zdroj neblokoval ostatné. Pri načítaní zobrazuje pulzujúci zástupný prvok. Zlyhania neblokujú zobrazenie: bez snímača teploty karta ukáže N/A namiesto chyby.", + "items": [ + "Horné karty metrík — aktualizácia každých ~5 s. CPU a teplota navyše dostávajú údaje každú sekundu zo vzorkovača životných funkcií.", + "Graf metrík uzla — načíta sa pri otvorení a zmene obdobia alebo jazyka. V prípade potreby zopakuje požiadavku po 60 s.", + "Karta úložiska — aktualizácia každých ~60 s. Dáta SMART sa uchovávajú v pamäti dlhšie; karta Úložisko na požiadanie načíta nové.", + "Karta siete — súhrn každých 59 s a graf prevádzky každých 60 s pre aktívne obdobie.", + "Manuálne obnovenie — tlačidlo Obnoviť v hlavičke okamžite načíta všetky panely znova." + ] + }, + "dataCollected": { + "heading": "Spôsob zberu údajov", + "headerCard": "Karta", + "headerEndpoint": "Koncový bod", + "headerSource": "Zdroj", + "rows": [ + { + "card": "Indikátor stavu v hlavičke", + "endpoint": "/api/health", + "source": "Celkový stav, ktorý monitor stavu vytvorí pri každom cykle a uloží do vyrovnávacej pamäte." + }, + { + "card": "CPU / RAM / Swap / Čas prevádzky", + "endpoint": "/api/system", + "source": "/proc/stat, /proc/meminfo, /proc/uptime s krátkodobým vzorkovaním CPU." + }, + { + "card": "Informácie o hostiteľovi (kernel, BIOS, distro)", + "endpoint": "/api/info", + "source": "uname -a, dmidecode, verzia PVE. Uložené vo vyrovnávacej pamäti na úrovni procesu." + }, + { + "card": "Karty úložiska, siete a VM", + "endpoint": "/api/storage/summary, /api/network/summary, /api/vms", + "source": "Pozrite si príslušné podrobné karty. Karty v hlavičke zobrazujú kompaktný prehľad z rovnakých koncových bodov." + }, + { + "card": "Frekvencia aktualizácie", + "endpoint": "—", + "source": "Systém každých 5 s; úložisko, VM a súhrn siete každých 59 s. Tlačidlo Obnoviť v hlavičke okamžite načíta všetky panely znova." + } + ], + "codeComment1": "# Volanie pre indikátor stavu v hlavičke", + "codeComment2": "# verejné, bez tokenu", + "codeComment3": "# Overená snímka použitá kartami" + }, + "whereNext": { + "heading": "Kam ďalej", + "items": [ + { + "label": "Monitor zdravia", + "href": "/docs/monitor/health-monitor", + "tail": " — okno indikátora stavu v hlavičke: desať kategórií, odmietnutie a potlačenie upozornení." + }, + { + "label": "Referenčná príručka API", + "href": "/docs/monitor/api", + "tail": " — koncové body system, info a health." + }, + { + "label": "Oznámenia", + "href": "/docs/monitor/notifications", + "tail": "— ako sa rovnaké stavy menia na Telegram / Discord / e-mailové správy." + }, + { + "label": "Index panela", + "href": "/docs/monitor/dashboard", + "tail": " — ostatné karty panela v skratke." + }, + { + "label": "Architektúra", + "href": "/docs/monitor/architecture", + "tail": " — vlákna na pozadí a API, ktoré poskytujú údaje pre toto zobrazenie." + } + ] + } +} diff --git a/web/messages/sk/docs/monitor/dashboard/terminal.json b/web/messages/sk/docs/monitor/dashboard/terminal.json new file mode 100644 index 00000000..a2ce36e0 --- /dev/null +++ b/web/messages/sk/docs/monitor/dashboard/terminal.json @@ -0,0 +1,174 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Panel: Terminál | Dokumentácia ProxMenux", + "description": "Shell hostiteľa Proxmox v prehliadači: až 4 terminály v mriežke, tlačidlá klávesnice pre mobilné zariadenia (ESC, TAB, šípky, kombinácie Ctrl), integrovaný prehľad príkazov z cheat.sh a ochrana JWT." + }, + "header": { + "title": "Panel: Terminál", + "description": "Skutočná relácia shellu na hostiteľovi Proxmox v prehliadači. Až štyri terminály súčasne, tlačidlá klávesnice pre mobilné zariadenia a integrovaný prehľad príkazov, všetko v rovnakej téme ako zvyšok panela.", + "section": "ProxMenux Monitor · Prehľad" + }, + "intro": { + "title": "Skutočná PTY v prehliadači", + "body": "Terminál vytvorí na serveri PTY cez flask_terminal_routes, spojí ho cez WebSocket s xterm.js v prehliadači a beží ako root, používateľ jednotky systemd. Rovnako ako cez ssh root@<host> môžete používať vim, tmux, nástroje ncurses a CLI Proxmox (qm, pct, pvesh, pvecm). Každý PTY exportuje PROXMENUX_TERMINAL=monitor. Všetky podriadené procesy bash vrátane neskoršieho spustenia menu premennú zdedia, aby rozpoznali terminál Monitora." + }, + "singleAlt": "ProxMenux Monitor Karta Terminál – jedna terminálová relácia zobrazujúca súhrn systému Fastfetch pri prihlásení", + "singleCaption": "Jeden host terminál otvorený a vyššie uvedený panel nástrojov ukazuje počet (1 / 4 terminály), + Nové, Hľadať, Vyčistiť a Zavrieť. Pomocníci mobilnej klávesnice sa objavia pod terminálom na dotykových zariadeniach.", + "target": { + "heading": "Cieľ pripojenia", + "body1": "Karta Terminál otvorí shell na samotnom hostiteľovi Proxmox, rovnako ako prihlásenie cez SSH. Každá karta otvorí nový terminál hostiteľa.", + "body2": "Na prístup do kontajnera LXC použite tlačidlo Konzola na karte každého spusteného CT v karte VM a LXC. Otvorí okno, ktoré spustí pct enter <vmid> a použije rovnaký mobilný panel nástrojov opísaný nižšie." + }, + "menuGuard": { + "heading": "Ochrana pri samoaktualizácii menu v tomto termináli", + "body1": "Po potvrdení menu nahradí vlastný strom skriptov a znovu sa načíta. Cez SSH alebo konzolu Proxmox to funguje, ale v prehliadači by sa ukončil PTY shellu a prerušil WebSocket. Preto check_updates_stable, check_updates_beta a apply_release_channel čítajú PROXMENUX_TERMINAL a rozpoznávajú kontext Monitora.", + "body2": "Dialóg áno/nie sa potom nahradí správou s oficiálnym príkazom inštalátora: bash -c \"$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)\" pre stable a zodpovedajúcou URL install_proxmenux_beta.sh pre beta. Aktualizáciu vykonajte cez SSH alebo konzolu hostiteľa Proxmox; terminál prehliadača slúži iba na prečítanie a potvrdenie správy." + }, + "fourTerminals": { + "heading": "Až štyri terminály naraz", + "intro": "Môžete otvoriť až štyri terminály hostiteľa súčasne. Každý má vlastný PTY aj WebSocket a ide o úplne nezávislé relácie. Ikony vedľa tlačidla „Nový“ prepínajú dve rozloženia:", + "items": [ + "Zobrazenie kariet — viditeľný je jeden terminál, ostatné sú pomenované karty hore (Terminál 1, Terminál 2…). Vhodné na jednu úlohu, kým ostatné bežia na pozadí.", + "Zobrazenie mriežky — všetky otvorené terminály v mriežke 2×2. Môžete sledovať htop v jednom, iftop v druhom a upravovať v treťom bez prepínania kariet." + ], + "outro": "Panel nástrojov uvádza počet (1/4 terminálov, 4/4 terminálov). + Nový otvorí kartu; malé × v jej hlavičke ju zatvorí. Veľké červené tlačidlo Zavrieť hore ukončí všetky terminály." + }, + "gridAlt": "Karta Terminál ProxMenux Monitor — mriežka štyroch terminálov hostiteľa s ls, konfiguráciou siete, iftop a hlavnou ponukou ProxMenux vedľa seba", + "gridCaption": "Zobrazenie mriežky (4 / 4 terminály) — štyri nezávislé PTY súčasne: zoznam adresára, /etc/network/interfaces, iftop a hlavná ponuka ProxMenux. Prepínač rozloženia na paneli nástrojov mení mriežku a karty.", + "keyboard": { + "heading": "Tlačidlá klávesnice pre mobilné zariadenia", + "intro": "Klávesnice telefónov a tabletov zvyčajne nemajú ESC, TAB, šípky ani kombinácie s modifikátormi. Tieto klávesy sú potrebné pre vim, nano, htop a ponuky TUI. Terminál preto na malých alebo dotykových zariadeniach zobrazuje pod terminálom rad dotykových tlačidiel:", + "headerButton": "Tlačidlo", + "headerSends": "Posiela", + "headerUse": "Typické použitie", + "rows": [ + { + "button": "ESC", + "sends": "\\x1b", + "use": "Ukončí režim vkladania v vim, zruší dialóg TUI alebo ukončí vyhľadávanie." + }, + { + "button": "TAB", + "sends": "\\t", + "use": "Automatické dopĺňanie ciest a prechod medzi poľami v dialog/whiptail." + }, + { + "button": "↑ ↓ ← →", + "sends": "\\x1bO[ABCD]", + "use": "História shellu, pohyb kurzora a navigácia ponúk." + }, + { + "button": "↵ Enter", + "sends": "\\r", + "use": "Potvrdenie. Niektoré klávesnice nahrádzajú Enter tlačidlami Prejsť/Hotovo; toto tlačidlo je jednoznačné." + }, + { + "button": "Ctrl ▾", + "sends": "Rozbaľovací zoznam", + "useRich": true + } + ], + "ctrlIntro": "Tri kontrolné sekvencie:", + "ctrlItems": [ + "Ctrl+C — zruší alebo preruší bežiaci príkaz (\\x03).", + "Ctrl+X — ukončí nano (\\x18).", + "Ctrl+R — spätné vyhľadávanie v histórii bash (\\x12)." + ], + "modalTitle": "Rovnaký panel nástrojov v okne konzoly LXC", + "modalBody": "Konzola otvorená cez VM a LXC → Konzola zobrazuje rovnaké tlačidlá klávesnice pod oknom. Pri pripojení automaticky zadá pct enter <vmid>, čím vstúpite priamo do kontajnera." + }, + "lxcAlt": "Okno konzoly LXC ProxMenux Monitor — Terminal: ubuntu (ID: 103), s rovnakým mobilným panelom nástrojov (ESC, TAB, šípky, Enter, Ctrl) pod terminálom", + "lxcCaption": "Konzola LXC otvorená cez VM a LXC → Konzola. Hlavička uvádza cieľový kontajner (Terminal: ubuntu (ID: 103)) a pod terminálom sa zobrazuje rovnaký dotykový panel nástrojov.", + "search": { + "heading": "Vyhľadávanie príkazov — integrovaný prehľad", + "intro": "Modré tlačidlo Hľadať otvorí približné vyhľadávanie príkazov. Zadajte niekoľko písmen príkazu Linux alebo Proxmox (ls, tar, qm, pct, zpool, systemctl…) a zobrazia sa príklady s voľbou Odoslať do aktívneho terminálu jedným dotykom. Voľbu príkazu tak nájdete bez prepínania karty prehliadača.", + "modalAlt": "Okno Vyhľadávanie príkazov ProxMenux Monitor — približné vyhľadávanie príkazov Linux a Proxmox cez cheat.sh s príkladmi ls", + "modalCaption": "Vyhľadávanie ls — každý výsledok zobrazuje príkaz, opis a malú šípku na odoslanie do aktívneho terminálu. Vpravo dole je uvedený zdroj údajov (Údaje z cheat.sh).", + "aboutLabel": "O cheat.sh:", + "aboutBody": "je open-source prehľad spravovaný komunitou s krátkymi praktickými príkladmi stoviek príkazov Linux, nástrojov správy a programovacích jazykov. Pôvodne bol navrhnutý na použitie cez curl cheat.sh/<command>, ale je dostupný aj v prehliadači. ProxMenux Monitor posiela dotazy cez proxy na serveri, aby okno používalo rovnaký pôvod ako panel.", + "headerSource": "Zdroj", + "headerWhen": "Keď sa použije", + "headerWhat": "Čo vidíš", + "onlineLabel": "(online)", + "onlineWhen": "Keď má hostiteľ prístup na internet a cheat.sh proxy odpovedá.", + "onlineWhat": "Niekoľko praktických príkladov na príkaz s opisom nad nimi. Stavová bodka v hlavičke je zelená.", + "fallbackLabel": "Miestna záložná možnosť", + "fallbackWhen": "Keď cheat.sh je nedostupný (offline hostiteľ, obmedzujúci firewall, cheat.sh výpadok).", + "fallbackWhat": "Pribalený zoznam bežných príkazov Linux a Proxmox. Menší katalóg, ale vždy dostupný. Stavová bodka je červená.", + "sendingNote": "Ako funguje odosielanie: šípka vedľa výsledku odošle text do aktívneho terminálu (vybraná karta alebo posledný terminál, na ktorý ste klikli v mriežke). Okno sa automaticky zatvorí, aby ste mohli stlačiť Enter." + }, + "auth": { + "heading": "Prihlásenie", + "items": [ + "Prehliadač najprv požiada o jednorazový lístok cez POST /api/terminal/ticket s JWT v hlavičke Authorization. Lístok následne odošle pri otvorení WebSocketu. Platí 5 sekúnd; pri zapnutom overovaní chýbajúci alebo neplatný lístok ukončí spojenie pred vytvorením PTY.", + "Ak je Monitor za reverzným proxy, proxy musí posielať požiadavky na upgrade WebSocket. Príklady pre Nginx / Caddy / Traefik sú na stránke Prístup a overenie." + ] + }, + "clipboard": { + "heading": "Schránka, história výstupu a zmena veľkosti", + "items": [ + "Kopírovanie a prilepenie — používa schránku prehliadača. Vyberte text myšou alebo trackpadom a použite systémovú skratku (Cmd+C na macOS, Ctrl+Shift+C na Linux/Windows). Prostredia Linux podporujú aj prilepenie prostredným tlačidlom.", + "História výstupu — posúvanie kolieskom alebo dvoma prstami. xterm.js uchováva v pamäti posledných niekoľko tisíc riadkov.", + "Zmena veľkosti — pri zmene veľkosti panela terminál prispôsobí okno PTY, aby sa htop a vim zobrazovali správne.", + "Opätovné pripojenie po návrate na kartu — prepnutie aplikácie v telefóne alebo tablete, najmä iPade, môže prerušiť WebSocket. Terminál zistí zmenu viditeľnosti a po návrate sa pripojí, s časovým limitom 15 sekúnd pre pomalé VPN." + ] + }, + "disconnect": { + "heading": "Príčiny odpojenia", + "intro": "Najčastejšie príčiny ukončenia relácie a ich riešenia:", + "headerCause": "Príčina", + "headerFix": "Riešenie", + "rows": [ + { + "cause": "JWT relácie vypršal pri otváraní alebo opätovnom pripájaní terminálu (platnosť 24 h).", + "fix": "Obnovte stránku a prihláste sa znova. Terminál nie je určený na bezobslužné relácie; platnosť JWT je rovnaká ako pri bežnom prihlásení do panela." + }, + { + "cause": "Časový limit nečinnosti reverzného proxy.", + "fix": "Zvýšte proxy_read_timeout v Nginx alebo ekvivalent v Caddy / Traefik (príklady na stránke Prístup a overenie)." + }, + { + "cause": "Telefón alebo tablet v režime spánku.", + "fix": "Po prebudení zariadenia sa karta automaticky pripojí (časový limit 15 s pre VPN). Ak nie, obnovte ju." + }, + { + "cause": "Reštart služby na hostiteľovi.", + "fix": "Každý reštart proxmenux-monitor.service ukončí všetky PTY. Nové terminály otvorte po dokončení načítania panela." + } + ] + }, + "warning": { + "title": "Terminál je shell root na hostiteľovi", + "body": "Terminál zdedí používateľa jednotky systemd (root) a má plné oprávnenia na hostiteľovi Proxmox. Pred sprístupnením mimo miestnej siete nastavte meno, heslo a 2FA v Prístup a overenie. Pri vypnutom overovaní môže každý s prístupom k portu 8008 otvoriť shell root bez ďalších potvrdení či prihlasovacích údajov SSH. Na prístup zvonka použite Secure Gateway (Tailscale) alebo reverzný proxy s HTTPS namiesto zverejnenia portu na internete." + }, + "whereNext": { + "heading": "Kam ďalej", + "items": [ + { + "label": "Prístup a overenie", + "href": "/docs/monitor/access-auth", + "tail": " — príklady reverzného proxy s riadkami na upgrade WebSocket potrebnými pre terminál." + }, + { + "label": "Architektúra", + "href": "/docs/monitor/architecture", + "tail": " — prenos WebSocket (HTTP cez flask-sock a HTTPS / WSS cez gevent)." + }, + { + "label": "Referenčná príručka API", + "href": "/docs/monitor/api", + "tail": " — koncové body WebSocket /ws/terminal a /ws/script/ spolu so zvyškom API." + }, + { + "label": "Integrácia → Bezpečná brána", + "href": "/docs/monitor/integrations", + "tail": " — prístup k terminálu mimo LAN bez sprístupnenia portu 8008." + }, + { + "label": "Index panela", + "href": "/docs/monitor/dashboard", + "tail": " — Ostatné karty." + } + ] + } +} diff --git a/web/messages/sk/docs/monitor/dashboard/vms-lxcs-app.json b/web/messages/sk/docs/monitor/dashboard/vms-lxcs-app.json index 8abc8a2b..8a53e560 100644 --- a/web/messages/sk/docs/monitor/dashboard/vms-lxcs-app.json +++ b/web/messages/sk/docs/monitor/dashboard/vms-lxcs-app.json @@ -10,7 +10,9 @@ "intro": { "p1": "Karta App zaznamenáva, ktoré aplikácie patria do LXC. Záznam môže obsahovať iba názov a webový odkaz alebo aj detektor nainštalovanej verzie a zdroj dostupnej verzie.", "p2": "Postup, ktorý mení softvér, sa nastavuje samostatne na karte Aktualizácie. Uloženie aplikácie nikdy nespúšťa inštalátor ani aktualizátor.", - "callout": "Registrácia, sledovanie verzie a aktualizácia sú tri nezávislé možnosti. Každú možno používať bez ostatných dvoch." + "callout": "Registrácia, sledovanie verzie a aktualizácia sú tri nezávislé možnosti. Každú možno používať bez ostatných dvoch.", + "dashboardTitle": "Od registrácie k spúšťaču aplikácií", + "dashboard": "Každý webový odkaz uložený tu sa zobrazí aj ako karta na hlavnej karte Apps. Táto stránka LXC zostáva hlavným zdrojom názvu aplikácie, loga, odkazov a sledovania verzie." }, "overview": { "heading": "Čo môže obsahovať záznam aplikácie", @@ -29,7 +31,7 @@ "lead": "Návrhy aplikácií sú súčasťou vyrovnávacej pamäte modálneho okna každého LXC. Úvodné skenovanie ich pripraví na pozadí, takže karta App môže okamžite zobraziť uložené výsledky.", "items": [ "Otvorenie karty App nespustí nové skenovanie katalógu ani opakované dotazy do LXC.", - "Hľadať aplikácie výslovne spustí nové zisťovanie iba pre daný LXC. Používa sa po inštalácii softvéru počas behu ProxMenux.", + "Hľadať aplikácie výslovne spustí nové zisťovanie pre daný LXC. Použite po inštalácii softvéru počas behu ProxMenux.", "Predchádzajúci zoznam zostáva počas hľadania viditeľný. Nové zhody sa pridajú po dokončení.", "Ak sa nenájde nová zhoda, výsledok sa zobrazí pri akciách a Registrovať aplikáciu zostáva dostupné pre manuálne zadanie.", "Uloženie, odstránenie alebo obnovenie aplikácie okamžite aktualizuje rovnakú pamäť. Štart alebo obnova LXC aktualizuje iba daný systém cez existujúcu udalosť životného cyklu." @@ -40,10 +42,10 @@ "heading": "Registrácia aplikácie", "lead": "Zistený návrh aj manuálny záznam používajú rovnaký editor:", "steps": [ - "Stlačte Registrovať pri návrhu alebo Registrovať aplikáciu a vyberte položku katalógu alebo zadajte vlastný názov.", + "Stlačte Registrovať pri návrhu alebo Registrovať aplikáciu a vyberte z katalógu či zadajte vlastný názov.", "Skontrolujte názov a logo navrhnuté katalógom.", "Pridajte potrebné webové odkazy. Zistené otvorené porty sa ponúknu ako skratky, ale neuložia sa automaticky.", - "Pre záznam iba s odkazom nechajte Sledovať dostupnú verziu vypnuté alebo ho zapnite a skontrolujte detektor a zdroj verzie.", + "Pre záznam iba s odkazom nechajte Sledovať dostupnú verziu vypnuté alebo ho zapnite a skontrolujte detektor nainštalovanej verzie a zdroj dostupnej verzie.", "Pri zapnutom sledovaní použite Otestovať detektor a potom záznam uložte.", "Po úpravách stlačte Hotovo. Karty App a Aktualizácie použijú aktualizovaný záznam z pamäte." ] @@ -88,23 +90,48 @@ "colMethod": "Metóda nainštalovanej verzie", "colUse": "Použitie", "detectorRows": [ - { "method": "dpkg / apk", "use": "Číta verziu nainštalovaného balíka z metadát Debianu, Ubuntu alebo Alpine." }, - { "method": "binary", "use": "Spustí absolútnu cestu binárneho súboru alebo názov príkazu s parametrami verzie." }, - { "method": "file + regex", "use": "Číta skutočný súbor a extrahuje verziu pomocou jednej zachytávacej skupiny." }, - { "method": "docker label / docker exec", "use": "Číta OCI značku verzie alebo spustí príkaz verzie v Docker kontajneri." }, - { "method": "python distribution", "use": "Používa importlib.metadata cez vybraný interpreter Pythonu." }, - { "method": "command", "use": "Spustí pokročilý príkaz vo formáte argv bez shellu a extrahuje verziu z výstupu." }, - { "method": "manual", "use": "Uloží manuálne zadanú verziu; po aktualizácii aplikácie ju treba zmeniť." } + { + "method": "dpkg / apk", + "use": "Číta verziu nainštalovaného balíka z metadát Debianu, Ubuntu alebo Alpine." + }, + { + "method": "binary", + "use": "Spustí absolútnu cestu binárneho súboru alebo názov príkazu s parametrami verzie." + }, + { + "method": "file + regex", + "use": "Číta skutočný súbor a extrahuje verziu pomocou jednej zachytávacej skupiny." + }, + { + "method": "docker label / docker exec", + "use": "Číta OCI značku verzie alebo spustí príkaz verzie v Docker kontajneri." + }, + { + "method": "python distribution", + "use": "Používa importlib.metadata cez vybraný interpreter Pythonu." + }, + { + "method": "command", + "use": "Spustí pokročilý príkaz vo formáte argv bez shellu a extrahuje verziu z výstupu." + }, + { + "method": "manual", + "use": "Uloží manuálne zadanú verziu; po aktualizácii aplikácie ju treba zmeniť." + }, + { + "method": "OCI image", + "use": "Pre kontajnery nainštalované cez OCI manager Apps. Číta verzie aplikácie a obrazu z inštalačného záznamu a porovná nainštalovaný digest s digestom z registra. Nevyžaduje nastavenie." + } ], "sourcesHeading": "Zdroje dostupnej verzie", "sources": [ - "GitHub repozitár: najnovšie vydanie alebo značka verejného repozitára vlastník/názov.", + "GitHub repozitár: najnovšie vydanie alebo značka verejného repozitára owner/name.", "HTTP JSON: verejný koncový bod a cesta ako data.version alebo releases[0].tag_name.", "Docker Hub: verzované značky filtrované regulárnym výrazom. Živý náhľad pred uložením ukáže skutočné zodpovedajúce značky.", "Pohyblivé značky ako latest, stable alebo lts neobsahujú verziu. Tieto obrazy sledujte podľa digestu v aktualizáciách Docker obrazov." ], "regexHeading": "Zachytávací výraz", - "regexLead": "Regulárny výraz detektora musí vrátiť verziu vo svojej prvej zachytávacej skupine.", + "regexLead": "Regulárny výraz musí vrátiť verziu v prvej zachytávacej skupine.", "regexRules": [ "Výraz musí zodpovedať textu vybraného binárneho súboru, súboru, príkazu alebo zdroja značiek; nepoužívajte odhadovanú všeobecnú cestu.", "Doslovné bodky escapujte ako \\., aby nezodpovedali ľubovoľnému znaku.", @@ -132,11 +159,31 @@ "colDisplay": "Zobrazenie", "colMeaning": "Význam", "rows": [ - { "state": "Dostupná aktualizácia", "display": "Dostupná verzia fialovo s ikonou šípky nahor", "meaning": "Nainštalovaná a dostupná verzia sa líšia." }, - { "state": "Aktuálne", "display": "Nainštalovaná a dostupná verzia bez fialového upozornenia", "meaning": "Posledná kontrola nenašla novšiu verziu." }, - { "state": "Sledovanie čaká", "display": "Stav kontroly alebo čakania", "meaning": "Záznam je nastavený, ale ešte nedokončil obe kontroly." }, - { "state": "Sledovanie vypnuté", "display": "Iba webové odkazy bez porovnania verzií", "meaning": "Záznam zostáva platný a môže mať aktualizátor." }, - { "state": "Chyba kontroly", "display": "Jantárové vysvetlenie na karte", "meaning": "Predchádzajúci uložený stav zostane viditeľný a zobrazí sa chyba detektora alebo zdroja." } + { + "state": "Dostupná aktualizácia", + "display": "Dostupná verzia fialovo s ikonou šípky nahor", + "meaning": "Nainštalovaná a dostupná verzia sa líšia." + }, + { + "state": "Aktuálne", + "display": "Nainštalovaná a dostupná verzia bez fialového upozornenia", + "meaning": "Posledná kontrola nenašla novšiu verziu." + }, + { + "state": "Sledovanie čaká", + "display": "Stav kontroly alebo čakania", + "meaning": "Záznam je nastavený, ale ešte nedokončil obe kontroly." + }, + { + "state": "Sledovanie vypnuté", + "display": "Iba webové odkazy bez porovnania verzií", + "meaning": "Záznam zostáva platný a môže mať aktualizátor." + }, + { + "state": "Chyba kontroly", + "display": "Jantárové vysvetlenie na karte", + "meaning": "Predchádzajúci uložený stav zostane viditeľný a zobrazí sa chyba detektora alebo zdroja." + } ] }, "management": { @@ -155,11 +202,26 @@ "colProblem": "Situácia", "colResolution": "Riešenie", "rows": [ - { "problem": "Softvér bol nainštalovaný po štarte ProxMenux", "resolution": "Stlačte Hľadať aplikácie. Výslovné skenovanie aktualizuje návrhy v pamäti daného LXC." }, - { "problem": "Aplikácia nebola zistená", "resolution": "Zaregistrujte ju manuálne. Stačí názov a jeden webový odkaz; sledovanie možno pridať neskôr." }, - { "problem": "Navrhnutý detektor vracia nesprávnu verziu", "resolution": "Otvorte Upraviť polia, vyberte skutočný balík, binárny súbor alebo súbor a pred uložením otestujte detektor." }, - { "problem": "Služba Dockeru sa neponúka ako aplikácia LXC", "resolution": "Zaregistrujte Docker a pridajte publikované rozhranie služby ako webový odkaz Dockeru. Aktualizácie obrazov zostanú v sekcii Docker." }, - { "problem": "Uložená aplikácia nemá tlačidlo aktualizácie", "resolution": "Otvorte Aktualizácie a nastavte jej metódu. Samotné sledovanie verzie neurčuje, ako sa aktualizácia nainštaluje." } + { + "problem": "Softvér bol nainštalovaný po štarte ProxMenux", + "resolution": "Stlačte Hľadať aplikácie. Výslovné skenovanie aktualizuje návrhy v pamäti daného LXC." + }, + { + "problem": "Aplikácia nebola zistená", + "resolution": "Zaregistrujte ju manuálne. Stačí názov a jeden webový odkaz; sledovanie možno pridať neskôr." + }, + { + "problem": "Navrhnutý detektor vracia nesprávnu verziu", + "resolution": "Otvorte Upraviť polia, vyberte skutočný balík, binárny súbor alebo súbor a pred uložením otestujte detektor." + }, + { + "problem": "Služba Dockeru sa neponúka ako aplikácia LXC", + "resolution": "Zaregistrujte Docker a pridajte publikované rozhranie služby ako webový odkaz Dockeru. Aktualizácie obrazov zostanú v sekcii Docker." + }, + { + "problem": "Uložená aplikácia nemá tlačidlo aktualizácie", + "resolution": "Otvorte Aktualizácie a nastavte jej metódu. Samotné sledovanie verzie neurčuje, ako sa aktualizácia nainštaluje." + } ] }, "figures": { diff --git a/web/messages/sk/docs/monitor/dashboard/vms-lxcs-updates.json b/web/messages/sk/docs/monitor/dashboard/vms-lxcs-updates.json index 7f4438f6..725001b8 100644 --- a/web/messages/sk/docs/monitor/dashboard/vms-lxcs-updates.json +++ b/web/messages/sk/docs/monitor/dashboard/vms-lxcs-updates.json @@ -56,7 +56,7 @@ "notes": "Stiahne vybraný obraz a znova vytvorí jeho skupinu služieb Compose alebo chránený samostatný kontajner." } ], - "callout": "Vlastný príkaz nahrádza Helper-Scripts pre danú aplikáciu. Ručné, hromadné aj naplánované spustenia rešpektujú uložený výber. Existujúce príkazy a staršie výslovne uložené výbery v plánoch alebo aktívnych naplánovaných úlohách sa zachovajú; starší plán nikdy neaktivuje aktualizátor novo registrovanej aplikácie." + "callout": "Vlastný príkaz nahrádza Helper-Scripts pre danú aplikáciu. Ručné, hromadné aj plánované behy rešpektujú uloženú voľbu. Existujúce príkazy a staršie výslovne uložené výbery v hromadných plánoch či aktívnych úlohách sa zachovajú; starý plán nikdy nezahrnie novo registrovanú aplikáciu." }, "docker": { "heading": "Docker Engine a Docker obrazy", @@ -90,7 +90,7 @@ }, { "state": "Overene aktuálne", - "appearance": "Zelená kontrola a zelená akcia Aktualizované", + "appearance": "Zelená značka a zelená akcia Aktualizované", "meaning": "Posledná dokončená kontrola potvrdila, že cieľ je aktuálny." }, { @@ -110,7 +110,7 @@ "Nepridávajte pct exec; ProxMenux už vstupuje do kontajnera a príkaz spúšťa ako root." ], "exampleLead": "Príklad úplného postupu v kontajneri:", - "example": "cd /opt/moja-aplikacia && ./update.sh", + "example": "cd /opt/my-app && ./update.sh", "callout": "Príkaz ako myapp --version iba číta verziu a nič neaktualizuje. Príkazy sa spúšťajú s oprávneniami správcu a musia sa kontrolovať ako príkazy shellu root." }, "bulk": { @@ -120,7 +120,7 @@ "Balíky OS sú povinné. Musí byť vybraná aspoň jedna ďalšia aplikácia, Docker Engine alebo jednotka Docker obrazu.", "Aplikácie a jednotky Dockeru sa vyberajú samostatne. Hlavná služba Compose zobrazuje závislosti, ktoré sa aktualizujú spolu s ňou.", "Odstránené alebo nedostupné ciele sa označia ako neaktuálne a pred uložením ich treba odstrániť.", - "Tlačidlo Použiť aktualizácie je fialové, ak má niektorý vybraný cieľ overenú aktualizáciu, zelené, ak sú všetky overene aktuálne, a neutrálne pri neznámom výsledku.", + "Použiť aktualizácie je fialové, ak má niektorý cieľ overenú aktualizáciu, zelené, ak sú všetky overene aktuálne, a neutrálne pri neznámom výsledku.", "Odstránenie hromadnej konfigurácie neodstráni samostatné metódy ani plánovanie." ], "callout": "Hromadná aktualizácia nenahrádza samostatné tlačidlá. Je to voliteľná skratka pre výber, ktorý sa má spustiť spolu." @@ -140,8 +140,11 @@ "items": [ "Vyberte predvoľbu alebo cron výraz a potom presné ciele: balíky OS, jednotlivé aplikácie, Docker Engine, samostatné jednotky Dockeru alebo skupiny služieb Compose.", "Oneskorenie po vydaní platí iba pre vybrané aplikácie so sledovaním verzie. Aplikácie bez sledovania spustia aktualizátor pri každom termíne.", - "Stav posledného behu rozlišuje úspech, čiastočné dokončenie, zlyhanie, bezpečnostné pozdržanie a stav bez čakajúcich aktualizácií.", - "Zistené externé plány Proxmox VE Helper-Scripts sa zobrazia samostatne, aby bola viditeľná prekrývajúca sa automatizácia." + "Stav posledného behu rozlišuje úspech, čiastočné dokončenie, zlyhanie, bezpečnostné pozastavenie a žiadne čakajúce aktualizácie. Po prvom plánovanom behu otvorí Aktualizácie → Plánované aktualizácie → Zobraziť záznam celý výstup aktualizátora a podradených skriptov.", + "Po každom spustení ProxMenux skontroluje štandardnú značku Debianu oznamujúcu potrebu reštartu. Ak je reštart potrebný, karta Aktualizácie aj záverečné upozornenie to oznámia. Varovanie sa zruší pri spustení alebo reštarte daného LXC.", + "Na počítači Proxmox sa v /usr/local/share/proxmenux/logs/lxc-updates/ ukladajú záznamy plánovaného priebehu pomocou mena <VMID>-scheduled-<run-id>.log. Posledných desať protokolov je zachovaných na LXC a staršie súbory sú automaticky odstránené.", + "Táto zachovaná história sa vzťahuje na plánované aktualizácie. Manuálna aktualizácia zobrazuje svoj výstup naživo v okne vykonávania monitora a v tomto adresári nevytvára plánovaný záznam.", + "Externé plány na hostiteľovi zistené z Proxmox VE Helper-Scripts sa zobrazujú samostatne, aby bolo vidieť prekrývajúce sa automatizácie." ], "callout": "Pred zapnutím plánu otestujte každú vybranú metódu manuálne. Plánovaný príkaz nemôže odpovedať na interaktívne otázky." }, @@ -150,9 +153,10 @@ "lead": "Aktualizácia sa nepovažuje za dokončenú iba preto, že príkaz v termináli skončil.", "items": [ "Rovnaký beh uloží konečný výsledok a podľa potreby obnoví stav balíkov OS, verzie aplikácií a inventár Dockeru.", - "Vyrovnávacia pamäť LXC sa nahradí overeným stavom po aktualizácii, takže odznaky a tlačidlá nezostanú v starom stave.", - "Po spustení zastaveného alebo obnoveného LXC existujúca udalosť životného cyklu znova obnoví tento LXC. Inventár Dockeru čaká na pripravenosť démona a dočasne prázdny výsledok nepovažuje za konečný.", - "Povolené upozornenia sa odošlú z dokončeného behu vrátane čiastočných zlyhaní a zoskupených výsledkov Docker obrazov." + "Plánované behy uchovávajú výstup terminálu a oznamujú, či je na dokončenie zmien balíkov ešte potrebný reštart.", + "Vyrovnávacia pamäť LXC sa nahradí overeným stavom po aktualizácii, aby označenia a tlačidlá nezostali v pôvodnom stave.", + "Ak sa spustí zastavený alebo obnovený LXC, existujúca udalosť životného cyklu znova obnoví jeho údaje. Inventarizácia Dockeru počká na pripravenosť démona, aby sa prázdny výsledok pri štarte neuložil ako konečný.", + "Zapnuté oznámenia sa odosielajú po dokončení behu vrátane čiastočných zlyhaní a zoskupených výsledkov Docker obrazov." ] }, "troubleshooting": { @@ -179,6 +183,10 @@ { "problem": "Vlastný príkaz zlyhá", "resolution": "Spustite ho v termináli LXC a skontrolujte cestu, závislosti, neinteraktívne parametre a návratový kód." + }, + { + "problem": "Plánovaná aktualizácia hovorí, že je potrebné reštartovať", + "resolution": "Otvorte Zobraziť záznam, skontrolujte dokončený beh a reštartujte daný LXC. ProxMenux vymaže upozornenie, keď udalosť životného cyklu zaznamená nový štart." } ] }, diff --git a/web/messages/sk/docs/monitor/dashboard/vms-lxcs.json b/web/messages/sk/docs/monitor/dashboard/vms-lxcs.json new file mode 100644 index 00000000..3b161ab5 --- /dev/null +++ b/web/messages/sk/docs/monitor/dashboard/vms-lxcs.json @@ -0,0 +1,244 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Panel: VM a LXC | Dokumentácia ProxMenux", + "description": "Inventár hosťovských systémov so živými údajmi CPU, pamäte a disku. Podrobnosti obsahujú konfiguráciu, zdroje, zálohy, nedávne výsledky záznamu Proxmox, poznámky a Spustiť / Vypnúť / Reštartovať / Vynútiť vypnutie." + }, + "header": { + "title": "Panel: VM a LXC", + "description": "Úplný inventár hosťovských systémov uzla: štyri metriky hore, triediteľný zoznam VM a LXC a podrobnosti s konfiguráciou, zdrojmi, zálohami, záznamami a ovládaním Spustiť / Vypnúť / Reštartovať / Vynútiť vypnutie.", + "section": "ProxMenux Monitor · Prehľad" + }, + "intro": { + "title": "Ovládanie hosťovských systémov", + "body": "Táto karta ovláda životný cyklus hosťovských systémov. Akcie idú cez POST /api/vms/<vmid>/control s výslovným potvrdením a aktualizujú riadok systému. Nútené vypnutie vyžaduje samostatné tlačidlo Vynútiť vypnutie." + }, + "topRow": { + "heading": "Horný riadok: štyri štatistické karty", + "intro": "Štyri karty sumarizujú stav systémov: celkové počty, využitie CPU, pridelenú pamäť oproti kapacite hostiteľa a pridelený diskový priestor.", + "imageAlt": "VMs & LXCs záložka Vrchný rad štyroch stat kariet: Celkom VMs & LXCs, Spolu CPU, celková pamäť, celkový disk", + "imageCaption": "Horný riadok: celkové počty a stavy Spustené / Zastavené, využitie CPU, použitá pamäť / pridelená bežiacim systémom / celkovo pridelená pamäť s označením V rámci limitov a pridelené miesto na disku.", + "headerCard": "Karta", + "headerWhat": "Čo ukazuje", + "totalLabel": "VM a LXC spolu", + "totalWhat": "Celkový počet s dvoma odznakmi X Beh (zelená) a Y zastavená (červená, len ak > 0). Číslo, ktoré pozeráš, keď sa po reštarte niečo nevrátilo.", + "cpuLabel": "CPU celkom", + "cpuWhat": "Celkové živé využitie CPU všetkých systémov ako percento fyzického CPU hostiteľa s textom „Využitie pridelenej CPU“.", + "memoryLabel": "Pamäť spolu", + "memoryIntro": "Tri hodnoty nastavené vertikálne:", + "memoryItems": [ + "Aktuálne použitá — hlavná hodnota, napríklad 15.4 GB, a X.X % z Y GB vzhľadom na RAM hostiteľa. Modrý ukazovateľ zobrazuje percento.", + "Pridelená bežiacim + Celkovo pridelená — súčet maxmem pre bežiace systémy a pre všetky vrátane zastavených. Prvý je dôležitý teraz, druhý pri spustení všetkých naraz.", + "V rámci limitov, zelené, sa zmení na Nadmerne pridelené, ak súčet prekročí RAM hostiteľa. Kontrolované nadmerné prideľovanie môže fungovať s KSM; označenie včas upozorní na malú rezervu." + ], + "diskLabel": "Disk spolu", + "diskWhat": "Súčet miesta na disku prideleného všetkým systémom v GB alebo TB s textom „Pridelené miesto na disku“." + }, + "inventory": { + "heading": "Zoznam virtuálnych strojov a kontajnerov", + "intro": "Jeden riadok na systém. Zoznam pochádza z /api/vms, ktoré spája qm list + pct list + pvesh /cluster/resources na hostiteľovi.", + "imageAlt": "Virtuálne stroje & Kontajnery Zoznam 1 riadok na hosťa so statusom, typovým odznakom, menom, ID a inline CPU / pamäť / percento disku", + "imageCaption": "Rozloženie inventára optimalizované pre mobilné zariadenia – rovnaké údaje, aké zobrazuje zobrazenie na počítači, preskupené do jedného stĺpca, pričom percentá a indikátory stavu sú kompaktné.", + "rowsIntro": "Každý riadok zobrazuje:", + "rows": [ + "Ikona stavu — zelený trojuholník pri spustenom systéme alebo červený štvorec pri zastavenom. Zvyšok riadka zastaveného systému sa stlmí.", + "Typ — LXC azúrovou pre kontajnery, VM fialovou pre virtuálne stroje.", + "Názov — názov hostiteľa alebo zobrazovaný názov hosťovského systému.", + "VMID — číselné ID Proxmox pod názvom.", + "Vložené metriky 3 percentá s ikonou (CPU %, % pamäte, % disku). Každá ikona sa zmení na oranžovú, keď metrika prekročí prah pozornosti (napr. pamäť nad 90 %), takže rýchly sken vám povie, ktorý hosť je pod tlakom bez otvorenia." + ], + "clickHint": "Kliknutie na riadok otvorí podrobnosti, či systém beží alebo je zastavený.", + "mobileTitle": "Zoznam navrhnutý pre mobilné zariadenia", + "mobileBody": "Na telefónoch a v úzkych oknách sa typ, názov, ID a tri percentá ukladajú do jedného stĺpca ako na snímke. Široké zobrazenie ich rozloží vodorovne. V oboch prípadoch celý riadok otvorí podrobnosti." + }, + "drillIn": { + "heading": "Okno podrobností hosťovského systému", + "intro": "Detail sa otvorí s názvom hosťovského systému, VMID, typom, stavom a dobou prevádzky. Karty sa prispôsobujú jeho typu: Stav, Aplikácia a Aktualizácie pre správu aplikácií LXC, Pripojenia pri LXC s bodmi pripojenia, Záznamy pri kontajneroch nainštalovaných cez OCI manager Apps a ďalej Zálohy a Firewall. Pevný panel akcií sprístupňuje ovládanie prevádzky a terminál LXC na každej karte.", + "statusTitle": "Karta 1 — Stav", + "statusImageAlt": "Podrobnosti systému — Stav so živými údajmi CPU, pamäte a disku, diskovým a sieťovým I/O, logom systému a blokom Zdroje / IP adresy", + "statusImageCaption": "Stav: CPU, pamäť a disk s ukazovateľmi hore; celkové I/O (disk čítanie/zápis, sieť príjem/odoslanie); potom Zdroje s Poznámkami, + Info a zoznamom IP adries.", + "statusIntro": "Predvolená karta na overenie stavu systému. Tri bloky:", + "liveTitle": "1. Riadok živých metrík", + "liveItems": [ + "Využitie CPU (X jadier) — percento s ukazovateľom. Nastavený počet jadier v hlavičke vysvetľuje, čo znamená 100 %.", + "Pamäť — použitá / maximum v GB s ukazovateľom.", + "Disk — použité / maximum pre hlavný obraz disku v rovnakom formáte." + ], + "ioTitle": "2. I/O celkový počet + logo OS", + "ioItems": [ + "Diskové I/O — celkové čítanie (↓) a zápis (↑) od štartu. Pomáha odhaliť náhly nárast I/O oproti bežnej aktivite systému.", + "Sieťové I/O — celkové prijaté (↓) a odoslané (↑) dáta, na rovnakom princípe.", + "Logo systému — ikona Debian / Ubuntu / Alpine / Windows / atď. podľa zisteného systému. Pomáha pri rozlišovaní otvorených okien." + ], + "resourcesTitle": "3. Blok zdrojov", + "resourcesIntro": "Konfigurácia podľa Proxmoxu: jadrá CPU, pamäť (nastavené maxmem) a swap. Dve rozbaľovacie sekcie v hlavičke:", + "resourcesItems": [ + "Poznámky — upraviteľný popis systému. Uloženie zavolá PUT /api/vms/<vmid>/config a zapíše do /etc/pve/qemu-server/<vmid>.conf alebo /etc/pve/lxc/<vmid>.conf.", + "+ Info — režim BIOS, typ stroja, stav agenta, položky passthrough hostpci, body pripojenia CT a poradie štartu." + ], + "ipsTitle": "4. IP adresy", + "ipsBody": "Každá adresa IPv4 alebo IPv6 má zelené označenie. Zoznam je prázdny pri zastavenom systéme alebo VM bez agenta QEMU; LXC hlásia adresy priamo.", + "appTitle": "Karta 2 — App (iba LXC)", + "appIntro": "Registruje aplikácie LXC, ukladá webové odkazy a voliteľne porovnáva verzie. Návrhy pochádzajú zo štartovacej pamäte; Hľadať aplikácie zopakuje zisťovanie v tomto LXC po novej inštalácii.", + "appLinkLead": "Pozrite si", + "appLinkLabel": "vyhradená stránka aplikácie", + "appLinkTail": "pre zisťovanie v pamäti, registráciu s pomocou katalógu, webové odkazy Dockeru a detektory verzie.", + "updatesTitle": "Karta 3 — Aktualizácie (iba LXC)", + "updatesIntro": "Oddeľuje balíky OS, aplikácie, Docker Engine a Docker obrazy. Každý cieľ sa spúšťa samostatne alebo sa presne vyberie pre hromadnú či plánovanú akciu.", + "updatesLinkLead": "Pozrite si", + "updatesLinkLabel": "podrobná stránka Aktualizácie", + "updatesLinkTail": "pre integrované a vlastné aktualizátory, opätovné vytvorenie Docker kontajnerov, hromadný výber, bezpečnostné možnosti a plánovanie.", + "mountsTitle": "Karta 4 — Pripojenia (iba LXC, ak existujú)", + "mountsImageAlt": "Podrobnosti LXC, Pripojenia: zväzky PVE, bind mounty hostiteľa či úložiska PVE a NFS/CIFS pripojené v CT. Karta obsahuje typ, kapacitu, použité/celkové bajty, možnosti a stav: zelený funkčný, jantárový iba čítanie/odchýlka, červený nedostupný.", + "mountsImageCaption": "Karta Pripojenia sa zobrazuje iba pri kontajneroch LXC s aspoň jedným bodom pripojenia alebo dodatočne pripojeným vzdialeným súborovým systémom. CT bez pripojení túto kartu nemá.", + "mountsIntro": "Proxmox zobrazuje pripojenia nakonfigurované ako mpX, nie však pridané neskôr v CT cez mount.cifs, NFS cez autofs a podobne. Karta spája oba pohľady: nakonfigurované pripojenia a pripojenia zistené v kontajneri, so stavom a kapacitou, ak ju server vie získať.", + "mountTypesTitle": "Typy zisteného pripojenia", + "mountTypesItems": [ + "Zväzok PVE — úložisko spravované Proxmoxom, napríklad podzväzok ZFS, adresár alebo Ceph RBD. Kapacita pochádza zo štatistík PVE a zodpovedá Proxmoxu.", + "Bind z úložiska PVE — položka mpX smerujúca na cestu úložiska známeho PVE.", + "Bind z hostiteľa — položka mpX s ľubovoľnou cestou hostiteľa (/mnt/something). Kapacitu poskytuje df pre túto cestu.", + "Pripojenie pridané v CT — existuje iba v mennom priestore kontajnera, napríklad NFS zdieľanie pripojené samotným CT. Kapacita sa číta cez pct exec <vmid> df; /proc/<pid>/root z hostiteľa neukazuje skutočné štatistiky vzdialeného pripojenia." + ], + "mountStateTitle": "Bodka na karte a upozornenia", + "mountStateItems": [ + " Zelená — pripojenie je funkčné a dostupné.", + " Jantárová — nastavené, ale nepripojené, iba na čítanie alebo zombie bind. Zdroj na hostiteľovi bol odstránený, ale CT ho stále vidí pripojený, napríklad po odpojení USB disku alebo umount na hostiteľovi.", + " Červená — nedostupné: kontrola sa nedostala k pripojeniu, napríklad NFS zdieľanie s vypnutým serverom." + ], + "mountsCalloutTitle": "Ďalšie informácie oproti Proxmoxu", + "mountsCalloutBody": "Prehľad všetkých miest, z ktorých kontajner číta alebo do ktorých zapisuje, vrátane ich kapacity. Zdieľania NFS alebo CIFS pripojené zvnútra CT, ktoré webové rozhranie Proxmox nevidí, sa tu zobrazujú s rovnakým vzhľadom a kontrolou stavu ako nakonfigurované prípojné body. Nefunkčné vzdialené pripojenia a neplatné bind mounty sa označia skôr, než spôsobia problém pri zálohovaní.", + "logsTitle": "Karta 5 — Záznamy (iba kontajnery OCI)", + "logsBody": "Iba pre kontajnery OCI manager Apps. Ukazuje konzolu hlavného procesu obrazu z /var/log/proxmenux/oci/VMID.console.log: posledných 100, 500 alebo 1000 riadkov, živé sledovanie počas behu, filter a stiahnutie. Súbor znovu načíta pri otvorení aj pri zastavenom kontajneri. Podrobnosti: Kontajnery OCI v ProxMenux Monitor.", + "backupsTitle": "Karta 6 — Zálohy", + "backupsImageAlt": "Podrobnosti systému — karta Zálohy so zoznamom dostupných záloh, cieľmi, veľkosťami a tlačidlom Vytvoriť zálohu", + "backupsImageCaption": "Všetky zálohy systému na nastavených úložiskách Proxmox, od najnovšej. Hlavička uvádza ich počet.", + "backupsIntro": "Uvádza zálohy systému na úložiskách Proxmox, od najnovšej. Počítadlo v názve ukazuje, či zálohy existujú. Každý riadok obsahuje:", + "backupsItems": [ + "Časová pečiatka — dátum a čas behu.", + "Cieľ — úložisko (PBS-Cloud, PBS-Local, NFS-Backup, …), farebne podľa stavu.", + "Veľkosť — konečná veľkosť zálohy na disku." + ], + "backupsOutro": "+ Vytvoriť zálohu spustí zálohu na úložisku označenom „Backup target“ v Proxmoxe. Obnova sa vykonáva vo webovom rozhraní Proxmox; Monitor ukazuje nedávne zálohy systému a umožňuje vytvoriť nové.", + "firewallTitle": "Karta 7 — Firewall", + "firewallIntro": "Číta záznam firewallu Proxmox daného systému priamo z hostiteľa, bez ďalšej služby a pravidelných dotazov. Karta je vždy prítomná; obsah závisí od zapnutia firewallu a od toho, či pravidlo zaznamenáva pakety.", + "firewallItems": [ + "Firewall je vypnutý — oranžové upozornenie ukáže, kde ho zapnúť v Proxmoxe (<Container|VM> → Firewall → Options), a pripomenie, že aspoň jedno pravidlo musí mať log: info alebo vyššiu úroveň, aby sa pakety zobrazovali.", + "Firewall povolený, zatiaľ žiadne udalosti — nápoveda v prázdnom stave s rovnakou požiadavkou na protokolovanie, užitočná, keď ste práve zapli bránu firewall.", + "Udalosti sú dostupné — posúvateľný panel s neproporcionálnym písmom a pôvodnými položkami podľa akcie: ACCEPT zelená, REJECT oranžová, DROP červená. Počítadlo v hlavičke ukazuje počet načítaných položiek." + ], + "firewallRefresh": "Obnoviť načíta najnovšie položky na požiadanie. Automatické obnovenie neprebieha; zoznam zachytáva otvorenie alebo posledné obnovenie. Zdroj je /var/log/pve-firewall.log, filtrovaný podľa VMID cez GET /api/vms/<vmid>/firewall/log.", + "firewallCalloutTitle": "Prečo ho tu máme, keď ho už ukazuje UI Proxmox?", + "firewallCalloutBody": "Odpadá prepínanie do Proxmoxu a pohľad zostáva na rovnakom VMID: spustite systém, skontrolujte pripojenia a udalosti firewallu a znova ho zastavte v paneli. Pravidlá sa upravujú v Proxmoxe; Monitor ich nemení.", + "actionBarTitle": "Akčný panel dole", + "actionBarIntro": "Vždy viditeľné dole v okne bez ohľadu na aktívnu kartu:", + "consoleItem": "Konzola, iba pre bežiace LXC, otvorí pct enter <vmid> v kontajneri. Používa xterm.js a WebSocket ako karta Terminál s mobilným panelom nástrojov: ESC, TAB, šípky, Enter a Ctrl+C / Ctrl+X / Ctrl+R. Funguje z telefónu či tabletu. Pre VM použite konzolu Proxmox noVNC.", + "lifecycleIntro": "Štyri tlačidlá v mriežke 2×2 posielajú POST /api/vms/<vmid>/control s príslušnou action. Dostupnosť závisí od stavu systému.", + "headerButton": "Tlačidlo", + "headerEnabled": "Povolené, keď", + "headerAction": "Akcia zaslaná hostiteľovi", + "lifecycleRows": [ + { + "button": "Spustiť", + "color": "green", + "enabled": "Hosť je zastavený.", + "action": "qm start / pct start" + }, + { + "button": "Vypnúť", + "color": "blue", + "enabled": "Hosťovský systém beží.", + "action": "qm shutdown / pct shutdown — riadne vypnutie, ACPI" + }, + { + "button": "Reštartovať", + "color": "blue", + "enabled": "Hosťovský systém beží.", + "action": "qm reboot / pct reboot — riadny reštart" + }, + { + "button": "Vynútiť vypnutie", + "color": "red", + "enabled": "Hosťovský systém beží.", + "action": "qm stop / pct stop — vynútené vypnutie" + } + ], + "forceStopTitle": "Vynútené vypnutie okamžite ukončí beh", + "forceStopBody": "Vynútiť vypnutie obíde vypínanie ako odpojenie napájania. Použite Vypnúť, ak systém reaguje. Vynútenie použite len pri zablokovanom vypínaní a ak prijímate riziko straty dát. Červená farba a označenie bránia náhodnému kliknutiu." + }, + "dataCollected": { + "heading": "Spôsob zberu údajov", + "headerSection": "Sekcia karty", + "headerEndpoint": "Koncový bod", + "headerSource": "Zdroj", + "rows": [ + { + "section": "Zoznam inventára", + "endpoint": "/api/vms", + "source": "pvesh get /cluster/resources --type vm pre VM a CT." + }, + { + "section": "Detailný panel (config, sieť, disky)", + "endpoint": "/api/vms/", + "source": "qm config <id> pre VM / pct config <id> pre CT." + }, + { + "section": "Graf metrík hosťovského systému", + "endpoint": "/api/vms//metrics", + "source": "Dáta RRD PVE (pvesh get /nodes/<node>/qemu/<id>/rrddata) upravené do formátu pre graf." + }, + { + "section": "Nedávne výsledky záznamu Proxmox", + "endpoint": "/api/vms//logs", + "source": "pvesh get /nodes/<node>/<qemu|lxc>/<vmid>/log --start 0 --limit 1000. Pri zlyhaní príkazu vráti prázdny zoznam; nejde o úplné systémové záznamy vnútri hosťovského systému." + }, + { + "section": "Zálohy k dispozícii pre hostí", + "endpoint": "/api/vms//backups", + "source": "pvesm list <storage> filtrované VMID." + }, + { + "section": "Záznam firewallu hosťovského systému (karta Firewall)", + "endpoint": "/api/vms//firewall/log", + "source": "/var/log/pve-firewall.log filtrované VMID." + }, + { + "section": "Ovládanie napájania (Spustiť / Vynútiť vypnutie / Reštartovať / Vypnúť)", + "endpoint": "/api/vms//control", + "source": "ekvivalenty qm start|stop|reboot|shutdown alebo pct." + } + ], + "codeComment1": "# Porovnať údaje panela s PVE", + "codeComment2": "# Skontrolovať konfiguráciu systému presne ako v okne podrobností", + "codeComment3": "# VM", + "codeComment4": "# CT" + }, + "whereNext": { + "heading": "Kam ďalej", + "items": [ + { + "label": "Monitor zdravia", + "href": "/docs/monitor/health-monitor", + "tailRich": " — Kategória VMs & Containers (neúspešné spustenie, timeouty QMP, zlyhania vypnutia CT)." + }, + { + "label": "Oznámenia", + "href": "/docs/monitor/notifications", + "tailRich": " — čo následne spúšťajú udalosti vm_*, ct_*, migration_* a backup_*." + }, + { + "label": "Referenčná príručka API", + "href": "/docs/monitor/api", + "tailRich": " — koncové body VM a záloh." + }, + { + "label": "Index panela", + "href": "/docs/monitor/dashboard", + "tailRich": " — Ostatné karty." + }, + { + "label": "ProxMenux → Vytvoriť VM", + "href": "/docs/create-vm", + "tailRich": " — vytváranie systémov: šablóny NAS (Synology a ďalšie), VM Linux/Windows a predvoľby prispôsobené Proxmoxu." + } + ] + } +} diff --git a/web/messages/sk/docs/monitor/health-monitor.json b/web/messages/sk/docs/monitor/health-monitor.json new file mode 100644 index 00000000..645ab240 --- /dev/null +++ b/web/messages/sk/docs/monitor/health-monitor.json @@ -0,0 +1,372 @@ +{ + "meta": { + "title": "Monitorovanie stavu Proxmox — CPU, pamäť, úložisko, SMART, ZFS, denníky | ProxMenux", + "description": "Proaktívne monitorovanie Proxmox VE: desať kategórií každých päť minút (CPU a teplota, pamäť a swap, úložisko, disky/SMART, sieť, VM, služby, denníky, aktualizácie a bezpečnosť), štyri úrovne závažnosti, potlačenie podľa kategórie, automatické čistenie vyriešených chýb, trvalá história diskov a oznámenia cez Telegram, Discord, Gotify alebo e-mail.", + "ogTitle": "Monitorovanie stavu Proxmox — CPU, pamäť, úložisko, SMART, ZFS, denníky", + "ogDescription": "Proaktívne monitorovanie Proxmox VE v desiatich kategóriách s úrovňami závažnosti, dobou potlačenia a oznámeniami podľa udalostí.", + "twitterTitle": "Proxmox Health Monitor ProxMenux", + "twitterDescription": "Proaktívne monitorovanie Proxmox VE v desiatich kategóriách s úrovňami závažnosti a oznámeniami." + }, + "header": { + "title": "Monitor zdravia", + "description": "Priebežná kontrola skúma desať kategórií stavu hostiteľa v päťminútových cykloch, medzi nimi zbiera merania, odstraňuje duplicitné zistenia a z rovnakého zdroja údajov napája panel, oznámenia aj voliteľné prepisovanie pomocou AI.", + "section": "ProxMenux Monitor" + }, + "intro": { + "title": "Jeden skener, traja spotrebitelia", + "body": "Vlákno na pozadí každých päť minút vykoná úplný cyklus a uloží každé zistenie do SQLite pod stabilným error_key. Vďaka tomu (1) panel zobrazuje aktuálny stav, (2) systém oznámení posiela nové udalosti do nastavených kanálov a (3) voliteľný AI asistent prepisuje upozornenia do zrozumiteľného jazyka. Jedno nastavenie tak slúži všetkým nadväzujúcim súčastiam." + }, + "howItWorks": { + "heading": "Ako to funguje", + "intro": "Monitor používa dve súbežné vlákna. Ľahký zberač meraní plní históriu CPU, pamäte a teploty. Úplný kontrolný cyklus číta tieto údaje, vyhodnocuje dlhšie trvajúce stavy a približne každých päť minút vykoná ostatné kontroly. Potom uloží zistenia do SQLite pre panel a oznámenia.", + "scannerTitle": "Od vzorky po skladovaný nález", + "scannerCaption": "Zberač medzi cyklami plní históriu: CPU každých 5 s, pamäť každých 30 s a teplota každých 15 s. Sám nevyhodnocuje upozornenia. Úplný cyklus vyhodnotí históriu a vykoná náročnejšie kontroly SMART, ZFS, denníkov a služieb pred uložením zistení do SQLite.", + "scannerArrowLabel": "krok", + "scannerNodes": { + "samplerLabel": "Zberač meraní", + "samplerDetail": "Využitie CPU 5 s\nPamäť 30 s\nTeplota 15 s\n→ história meraní", + "cycleLabel": "Celý cyklus zdravia", + "cycleDetail": "Každých 5 min\nČíta históriu\n+ priame kontroly\n(SMART, ZFS,\nslužby, denníky…)", + "checksLabel": "Kontroly podľa kategórie", + "checksDetail": "Desať kategórií\n(CPU, pamäť,\núložisko, disky,\nsieť, VM,\nslužby, denníky,\naktualizácie, bezpečnosť)", + "sqliteLabel": "SQLite", + "sqliteDetail": "tabuľka errors\n(aktívne +\npotlačené)\n+ disk_observations\n(trvalá história\nkaždého disku)" + }, + "notifTitle": "Od uloženého nálezu k užívateľovi", + "notifCaption": "Cesta oznámení. Rovnaká tabuľka chýb napája aj panel so zoznamami aktívnych a potlačených upozornení a čistenie na konci cyklu, ktoré automaticky rieši zastarané záznamy. Obe funkcie pracujú priamo s údajmi bez odosielacieho modulu.", + "notifArrowLabel": "udalosť", + "notifNodes": { + "errorsLabel": "Tabuľka chýb", + "errorsDetail": "Aktívne +\npotlačené riadky\ns kľúčom\nerror_key", + "dispatcherLabel": "Odosielateľ oznámení", + "dispatcherDetail": "Nové + zhoršené\nudalosti vo fronte\nPodľa prepínačov\n+ časového odstupu", + "templatesLabel": "Šablóny + prepis pomocou AI", + "templatesDetail": "Šablóna\npodľa udalosti\n→ voliteľný prepis AI\ndo zrozumiteľného\njazyka", + "channelsLabel": "Kanály", + "channelsDetail": "Telegram\nDiscord\nGotify\nE-mail (SMTP)" + } + }, + "categories": { + "heading": "Desať kategórií", + "imageAlt": "Monitor stavu s desiatimi kategóriami a ich aktuálnymi stavmi: CPU, pamäť, úložisko, disky, sieť, VM, služby, denníky, aktualizácie a bezpečnosť", + "imageCaption": "Monitor stavu — desať kategórií s aktuálnym stavom. Na zdravom hostiteľovi majú všetky stav OK; upozornenia a kritické udalosti sa zobrazia priamo pri príslušných riadkoch.", + "intro": "Každý cyklus vykoná desať nezávislých kontrol. Každá vráti jeden zo štyroch stavov (OK, INFO, WARNING, CRITICAL) a štruktúrované údaje, napríklad názvy zariadení, úryvky denníkov a presné prahy. Zobrazia sa na paneli aj v oznámení.", + "headerCategory": "Kategória", + "headerChecks": "Čiastkové kontroly", + "headerEvents": "Typické udalosti", + "rows": [ + { + "category": "CPU & Teplota", + "checks": "Použitie CPU s hysterézou, teplota snímača", + "events": "Dlhodobo vysoké využitie CPU; upozornenia na teplotu podľa zozbieraných meraní senzorov." + }, + { + "category": "Pamäť a swap", + "checks": "Využitie RAM a swapu", + "events": "Dlhodobý nedostatok pamäte; činnosť OOM-killera; vyčerpanie swapu." + }, + { + "category": "Úložisko", + "checks": "Proxmox úložiská, koreňový súborový systém", + "events": "Prekročenie nastavených prahov využitia koreňového alebo iného sledovaného súborového systému (predvolene 85% upozornenie / 95% kritický stav); nedostupný export NFS; zlyhanie overenia CIFS; plný pool LVM-thin." + }, + { + "category": "Disky & SMART", + "checks": "SMART, dmesg I/O chyby, ZFS pools, LVM, chyby súborového systému", + "events": "Zlyhanie kontroly SMART; realokované alebo čakajúce sektory; chyby I/O ATA; pool ZFS v stave DEGRADED / FAULTED; ext4 znovu pripojený iba na čítanie." + }, + { + "category": "Sieť", + "checks": "Prepojenie, stav spojenia, latencia brány", + "events": "Nefunkčný most alebo agregované rozhranie; nedostupná brána; pretrvávajúce výkyvy latencie." + }, + { + "category": "VM a kontajnery", + "checks": "QMP komunikácia, spustenie VM, spustenie kontajnera", + "events": "Zlyhalo spustenie VM; zlyhanie vypnutia CT; QMP soket timeout; chýba konfigurácia / disk po klone." + }, + { + "category": "Služby PVE", + "checks": "pveproxy, pvedaemon, pvestatd, pve-cluster, režim klastra", + "events": "Pád služby; strata kvóra klastra; zablokovaný pmxcfs." + }, + { + "category": "Systémové záznamy", + "checks": "Pretrvávajúce chyby, náhle nárasty chýb, kaskády chýb, kritické správy jadra", + "events": "Opakované rovnaké chyby; náhly výbuch výstrah (kaskádový vzor); BUG: / OOPS: / oom-killer v Dmesgu." + }, + { + "category": "Aktualizácie systému", + "checks": "Nevybavené aktualizácie, aktualizácie zabezpečenia, verzia jadra / PVE, systémový vek", + "events": "Čakajúce bezpečnostné aktualizácie alebo aktualizácie používaného jadra; dlho neaktualizovaný systém. Ak sú dostupné aktualizácie, hlavička prehľadu zobrazí Aktualizovať teraz. Tlačidlo spustí celý postup ProxMenux; po zatvorení obnoví stav cez ?refresh=1 bez čakania na ďalší cyklus." + }, + { + "category": "Bezpečnosť a certifikáty", + "checks": "Pokusy o prihlásenie, platnosť certifikátov končí, voliteľný Fail2Ban jail stav", + "events": "Opakované zlyhania overenia cez SSH alebo web; platnosť certifikátu PVE končí o menej než 30 dní; aktívne blokovania Fail2Ban." + } + ] + }, + "severity": { + "heading": "Model závažnosti", + "headerStatus": "Stav", + "headerColour": "Farba", + "headerMeaning": "Význam", + "headerNotification": "Upozornenie", + "rows": [ + { + "status": "OK", + "colour": "Zelená", + "meaning": "Zdravé. Žiadne zistenia v tejto kategórii.", + "notification": "Ticho." + }, + { + "status": "INFO", + "colour": "Modrá", + "meaning": "Prechodný alebo už vyriešený stav, ktorý stojí za zmienku. Používa sa aj pre kategórie, v ktorých zostali len zamietnuté položky.", + "notification": "Voliteľné. Každý typ udalosti možno zapnúť alebo vypnúť pre jednotlivé kanály." + }, + { + "status": "WARNING", + "colour": "Žltá", + "meaning": "Vyžaduje pozornosť, ale hostiteľ je stále funkčný. Príčina nie je zanedbateľná — prečítajte si podrobnosti.", + "notification": "Odošle sa, ak je daný typ udalosti pre kanál zapnutý." + }, + { + "status": "CRITICAL", + "colour": "Červená", + "meaning": "Funkčnosť narušená alebo strata dát možná. Potrebné opatrenia.", + "notification": "Odošle sa, ak je typ udalosti pre kanál zapnutý. Upozornenie na teplotu CPU so závažnosťou CRITICAL sa z bezpečnostných dôvodov obnoví aj po predchádzajúcom potlačení." + } + ], + "infoNote": "Kategória so stavom OK, ktorá má ešte potlačené udalosti v platnej lehote, sa zobrazí ako INFO. Pripomína tak, že niektoré upozornenia sú potlačené.", + "unknownTitle": "UNKNOWN, keď kontrolu nemožno dokončiť", + "unknownBody": "Nedostupná kontrola vráti UNKNOWN; po troch takýchto cykloch za sebou sa uloží trvalé zistenie. Panel ju zobrazí žltou farbou. Celkový stav obmedzuje UNKNOWN na WARNING, takže samotná nedostupná kontrola nespôsobí kritický stav hostiteľa." + }, + "dashboardView": { + "heading": "Zobrazenie na paneli", + "intro": "Monitor stavu sa nachádza na karte Prehľad. Indikátor v hlavičke (V poriadku / Upozornenie / Kritický stav) otvorí okno s dvoma zoznamami:", + "items": [ + "Aktívne — kategórie s nevyriešeným zistením. Rozbalený riadok zobrazí príslušné kontroly, pôvodný text reason, ID zariadenia alebo VM a prípadný odkaz na Úložisko, Sieť, VM, Denníky alebo Hardvér.", + "Potlačené — používateľom potvrdené položky, ktorých lehota potlačenia ešte neuplynula. Riadok ukazuje zostávajúci čas a nastavenú dobu. Po uplynutí zo zoznamu zmizne; ak príčina trvá a kategória to podporuje, vráti sa medzi Aktívne." + ], + "pillTitle": "Indikátor zodpovedá najzávažnejšej kategórii", + "pillBody": "Farba hlavičky zodpovedá najvyššej závažnosti: CRITICAL → červená, inak WARNING → žltá, inak INFO → modrá, inak zelená. Rovnaká logika riadi bod vo favikone aj odznak PWA.", + "updateNowTitle": "Aktualizovať teraz tlačidlo v hlavičke Prehľad", + "updateNowBody1": "Ak Aktualizácie systému hlásia čakajúce aktualizácie, pri indikátore sa zobrazí Aktualizovať teraz. Okno vykoná postup z ProxMenux → Settings post-install Proxmox → Proxmox System Update: čistenie repozitárov, apt full-upgrade cez update-pve-safe.sh, opätovné zostavenie spravovaných ovládačov DKMS pri novom jadre, autoremove/autoclean a ponuku reštartu pri zmene jadra. Priebeh sa zobrazuje priebežne.", + "updateNowBody2": "Po dokončení zatvorenie okna zavolá GET /api/health/details?refresh=1 a zneplatní vyrovnávaciu pamäť koncového bodu. Čakajúce aktualizácie a závažnosť sa prepočítajú podľa nového stavu balíkov. Odznak zmizne bez čakania na ďalší cyklus. Ak je hostiteľ aktuálny, tlačidlo je skryté." + }, + "dismiss": { + "heading": "Potlačenie upozornení a jeho trvanie", + "intro": "Niektoré udalosti pretrvávajú, napríklad Aktualizácie systému: dostupné aktualizácie, kým hostiteľa neaktualizujete. Oznámenie každých päť minút nie je potrebné. Tlačidlo Aktualizovať teraz v prehľade tento prípad rieši priamo. Pre ostatné prípady alebo odložené aktualizácie sú dostupné dva prepojené spôsoby potlačenia:", + "step1": "Potlačiť jednotlivú udalosť v okne. Ponuka obsahuje 24 hodín, 7 dní alebo Natrvalo bez ohľadu na predvolenú dobu kategórie. Voľba odošle POST /api/health/acknowledge s error_key a zvolenými suppression_hours (-1 pre trvalé potlačenie). Udalosť sa presunie medzi potlačené s časom acknowledged_at.", + "dropdownImageAlt": "Ponuka potlačenia upozornenia: 24 hodín, 7 dní alebo natrvalo", + "dropdownImageCaption": "Zvolená doba platí iba pre toto upozornenie; bez individuálnej voľby sa použije hodnota kategórie. Trvalo potlačené upozornenia majú jantárový odznak Natrvalo a bežne sa neobnovujú. Výnimkou je kritická teplota CPU opísaná nižšie.", + "step2": "Doba potlačenia podľa kategórie. V Nastavenia → Monitor stavu alebo cez POST /api/health/settings má každá z desiatich kategórií predvolenú dobu použitú bez individuálnej voľby:", + "imageAlt": "Doby potlačenia podľa kategórie v Nastavenia → Monitor stavu", + "imageCaption": "Jedna ponuka pre každú kategóriu. Pre časté udalosti, napríklad čakajúce aktualizácie, zvoľte dlhšiu dobu; pre rýchle opätovné vyhodnotenie kratšiu. Aktívne potlačenia sú uvedené pod nimi.", + "outro": "Počas potlačenia kontrola pokračuje a aktualizuje last_seen bez nového oznámenia. Po uplynutí lehoty ďalší cyklus príčinu znovu vyhodnotí: upozornenie sa môže obnoviť alebo zmiznúť, ak sa problém vyriešil.", + "activeSuppressionsTitle": "Kontrola a zrušenie aktívnych potlačení", + "activeSuppressionsBody": "Dočasne aj trvalo potlačené upozornenia sú v Nastavenia → Monitor stavu → Aktívne potlačenia. Riadok ukazuje identifikátor, kategóriu, závažnosť, čas potvrdenia a zostávajúcu dobu. Znovu povoliť zruší potvrdenie pre ďalšiu kontrolu. Tu možno zrušiť trvalé potlačenie aj predčasne ukončiť dočasné. Zapnite Upraviť, vyberte riadky (zelený okraj a prečiarknutie) a uložte. Zrušiť vyprázdni výber.", + "autoTitle": "Automatické potlačenie pri zmene doby", + "autoBody": "Iná doba než predvolených 24 hodín má druhý účinok: budúce zistenia kategórie sa ukladajú už potvrdené. Týždeň nastavený pre disky tak platí aj pre nové upozornenia bez individuálneho potláčania. Zobrazia sa priamo medzi potlačenými s danou dobou. Kategórie ponechané na 24 hodinách fungujú pôvodným spôsobom: nové zistenia sú aktívne, kým nezasiahnete.", + "tempTitle": "Výnimka pre teplotu CPU CRITICAL", + "tempBody": "Vrstva uchovávania má osobitné pravidlo pre Teplota CPU CRITICAL: takýto záznam obíde predchádzajúce potvrdenie aj automatické potlačenie. Neznamená to, že každá kontrola teploty vytvára kritický záznam pri prekročení nastaveného prahu.", + "nonDismissableTitle": "Ktoré zistenia možno potlačiť?", + "nonDismissableBody": "Okno zobrazí Potlačiť iba vtedy, keď kontrola výslovne vráti dismissable = true. Nepravdivá alebo chýbajúca hodnota tlačidlo skryje. Samotná závažnosť toto oprávnenie neurčuje: viaceré kritické kontroly umožňujú potvrdenie. Príklady opisujú aktuálne údaje; potlačenie upozornenia neopraví príčinu.", + "headerFinding": "Zistenie", + "headerWhy": "Správanie pri potlačení", + "rows": [ + { + "finding": "Teplota CPU: upozornenie / kritický stav", + "why": "Upozornenie zo vzoriek teploty výslovne umožňuje potlačenie. Samostatné pravidlo obíde potvrdenie, ak príde záznam teploty CPU so závažnosťou CRITICAL." + }, + { + "finding": "Kritické využitie koreňového súborového systému", + "why": "Kontroly priestoru výslovne umožňujú potlačenie aj pri kritickom využití. Potvrdenie neuvoľní miesto ani neodstráni riziko zlyhania zápisu." + }, + { + "finding": "ZFS pool DEGRADED / FAULTED", + "why": "Kontroly kapacity poolu ZFS výslovne umožňujú potlačenie. Ostatné zistenia používajú vlastný príznak. Potvrdenie neopraví degradovaný ani chybný pool." + }, + { + "finding": "Chyba disku I/O s SMART FAILED", + "why": "Uložené diskové zistenia z denníka môžu umožňovať potlačenie. SMART FAILED stále vyžaduje preskúmanie; tlačidlo závisí od príznaku konkrétnej kontroly, nie iba od textu upozornenia." + }, + { + "finding": "Sieťové rozhranie DOWN", + "why": "Uložené kontroly rozhrania DOWN výslovne umožňujú potlačenie. Neobnoví to most, agregované rozhranie, fyzické spojenie ani vzdialený prístup." + }, + { + "finding": "I/O udalosti na zdravých diskoch (INFO)", + "why": "Prechodné udalosti ATA alebo dmesg pri zdravom SMART môžu byť informačné a vyriešiť sa samy. Informačné riadky nemusia ponúkať Potlačiť; kontrola určuje, kedy je stav vyriešený." + } + ], + "principle": "Použite tlačidlo zobrazené pri konkrétnom zistení; jeho dostupnosť neodvodzujte od kategórie ani závažnosti. Potvrdenie riadi zobrazenie a oznámenia. Kontroly obnovy a história disku zostávajú samostatné." + }, + "autoresolve": { + "heading": "Automatické vyriešenie a čistenie", + "intro": "Mnohé upozornenia majú zmiznúť, keď príčina zanikne: VM sa už spúšťa, disk bol odstránený alebo sa teplota vrátila do normálu. Čistenie na konci každého päťminútového cyklu používa tieto pravidlá:", + "headerTrigger": "Podmienka", + "headerAction": "Akcia", + "rows": [ + { + "trigger": "Využitie CPU alebo teplota sa vrátia do normálu.", + "action": "Označí sa ako vyriešené a zmizne zo zoznamu Aktívne." + }, + { + "trigger": "Pamäťový tlak späť pod prahom varovania po upozornení na OOM / pamäť.", + "action": "Označí sa ako vyriešené." + }, + { + "trigger": "VM / CT, na ktoré odkazuje chyba, už neexistuje (qm status / pct status nenulové).", + "action": "Označí sa ako vyriešené, pretože prostriedok bol odstránený." + }, + { + "trigger": "Disk referencovaný chybou už nie je prítomný v /dev/.", + "action": "Označí sa ako vyriešené po odstránení zariadenia. História pozorovaní disku zostáva zachovaná." + }, + { + "trigger": "Zistenia zo systémového denníka (kategória logs, položky SMART, chyby ATA alebo I/O) po uplynutí lehoty potlačenia.", + "action": "Odstránia sa. Každá kontrola od tohto bodu skúma nové záznamy denníka; rovnaký historický riadok sa znovu nevydá." + }, + { + "trigger": "Vyriešené chyby staršie ako sedem dní.", + "action": "Vymažú sa z databázy, aby tabuľka zostala malá. História oznámení je samostatná a uchováva sa dlhšie." + } + ], + "permanentTitle": "Trvalé potlačenie nie je to isté ako vyriešené", + "permanentBody": "Doba kategórie -1 (natrvalo) potlačí budúce upozornenia potvrdených položiek, ale neobíde automatickú kontrolu vyriešenia. Ak príčina zanikne, napríklad odstránením prostriedku alebo poklesom pod prah, položka sa stále automaticky vyčistí." + }, + "observations": { + "heading": "Pozorovania diskov — trvalá história", + "intro": "Udalosti diskov sa oplatí uchovať. Upozornenie SMART na /dev/sdh o 02:14 je dôležité aj po skončení prívalu chýb I/O a automatickom vyriešení: disk už má svoju históriu problémov. Monitor preto vedie samostatnú trvalú tabuľku disk_observations.", + "headerProperty": "Vlastnosť", + "headerErrors": "Tabuľka errors (Aktívne)", + "headerObs": "Tabuľka disk_observations", + "rows": [ + { + "property": "Účel", + "errors": "Napája zobrazenie aktuálneho stavu a odosielanie oznámení.", + "obs": "Trvalý auditný záznam každého disku." + }, + { + "property": "Automatické vyriešenie", + "errors": "Áno — riadky sa odstránia, keď príčina zanikne.", + "obs": "Nie — záznamy zostávajú natrvalo, pokiaľ ich používateľ výslovne neodmietne." + }, + { + "property": "Deduplikačný kľúč", + "errors": "error_key (napr. smart_sdh).", + "obs": "(disk_registry_id, error_type, error_signature) so stabilnými podpismi zbavenými prchavých dát." + }, + { + "property": "Kde sa zobrazuje", + "errors": "Okno monitora stavu (zoznamy Aktívne / Potlačené).", + "obs": "Detailná karta disku na karte Úložisko s odznakom „X obs.“ pre každý disk." + }, + { + "property": "Čo zaznamenáva", + "errors": "Čokoľvek v súčasnosti zlyháva.", + "obs": "Upozornenia SMART (sektory, teplota, CRC, neúspešné samotesty), chyby I/O (ATA / NVMe / dm), chyby súborového systému a udalosti poolov ZFS." + } + ], + "outro": "Upozornenie môže zmiznúť z panela, hoci incident zostane v histórii disku. Po otvorení disku v Úložisku karta ukáže počet nevybavených pozorovaní, časové pečiatky, závažnosť a pôvodné nespracované správy. Pomáha to pri rozhodovaní o výmene disku.", + "renameTitle": "Zmeny názvov zariadení sa automaticky zlúčia", + "renameBody": "Disky sa môžu najprv objaviť pod dočasnými názvami ata8 alebo nvme0n1p3. Pozorovania sa zlučujú podľa známeho sériového čísla: ak je udalosť zaznamenaná ako ata8 a disk neskôr identifikovaný ako sdh, staré pozorovania sa pri ďalšom cykle priradia k sdh. História zostane celistvá." + }, + "notification": { + "heading": "Od zistenia k oznámeniu", + "intro": "Každá aktívna chyba môže viesť aj k oznámeniu. Postup:", + "items": [ + "Kontrola uloží zistenie s kategóriou, závažnosťou a štruktúrovanými údajmi.", + "Ak je typ udalosti povolený v globálnych nastaveniach upozornení a kanál túto kategóriu neumlčal, udalosť je zaradená do poradia.", + "Systém šablón vytvorí zo štruktúrovaných údajov nadpis a telo. Ak je prepis AI zapnutý, táto dvojica prejde aj cez nastaveného poskytovateľa na zrozumiteľné preformulovanie.", + "Kanál odošle správu Telegram, vloženú správu Discord, push oznámenie Gotify alebo e-mail. Výsledok sa uloží do notification_history.", + "Potlačenie upozornenia spustí jeho lehotu. Ďalšie zistenia rovnakého error_key počas nej bežne nevytvoria oznámenie ani sa automaticky nezaradia na odoslanie po jej skončení. Výnimka pre kritickú teplotu CPU zostáva." + ], + "outro": "Nastavenie kanálov — token bota Telegram, URL webhookov, kľúče AI, prepínače udalostí a úpravy kanálov — opisujú Oznámenia a AI asistent." + }, + "rest": { + "heading": "Koncové body REST", + "intro": "Činnosti okna sú dostupné cez API pre skripty, panely či botov. Pri zapnutom overovaní Monitora treba platný Bearer token z prihlásenia alebo obrazovky API tokenov. Zmeny, ako potvrdenie upozornení, uloženie či čistenie osirelých chýb, vyžadujú full_admin; read_only dostane 403. Pri vypnutom alebo odmietnutom overovaní tieto kontroly umožnia prístup bez tokenu.", + "headerEndpoint": "Koncový bod", + "headerMethod": "Metóda", + "headerUse": "Použitie", + "rows": [ + { + "endpoint": "/api/health", + "method": "GET", + "use": "Ľahká kontrola vracajúca JSON s status, timestamp a version. Vhodná pre kontroly kľúčových slov Uptime Kuma; pri zapnutom overovaní Monitora musí klient poslať hlavičku Bearer." + }, + { + "endpoint": "/api/health/status", + "method": "GET", + "use": "Celkový stav: jedna úroveň závažnosti a súhrnný text. Vyžaduje overenie." + }, + { + "endpoint": "/api/health/details", + "method": "GET", + "use": "Všetkých desať kategórií s ich stavmi a štruktúrovanými údajmi, z ktorých vznikli." + }, + { + "endpoint": "/api/health/full", + "method": "GET", + "use": "Úplná snímka: kategórie, aktívne a potlačené chyby a vlastné nastavenia potlačenia. Naplní okno jedným volaním a využíva šesťminútovú vyrovnávaciu pamäť na pozadí pre rýchlu odpoveď." + }, + { + "endpoint": "/api/health/active-errors", + "method": "GET", + "use": "Iba zoznam Aktívne. Možno filtrovať cez ?category=<name>." + }, + { + "endpoint": "/api/health/dismissed", + "method": "GET", + "use": "Iba zoznam Potlačené so zostávajúcimi hodinami." + }, + { + "endpoint": "/api/health/acknowledge", + "method": "POST", + "use": "Telo: '{'\"error_key\":\"smart_sdh\"'}'. Odmietnite upozornenie s nastaveným oknom kategórie." + }, + { + "endpoint": "/api/health/settings", + "method": "GET / POST", + "use": "Čítať alebo uložiť dobu potlačenia podľa kategórie." + }, + { + "endpoint": "/api/health/cleanup-orphans", + "method": "POST", + "use": "Ručné čistenie chýb po odstránených zariadeniach alebo VM. Idempotentné." + } + ], + "codeComment1": "# Získajte snímku aktuálneho stavu pre skript", + "codeComment2": "# Odmietnuť špecifickú chybu", + "codeComment3": "# Nastaviť potlačenie kategórie diskov na týždeň" + }, + "whereNext": { + "heading": "Kam ďalej", + "items": [ + { + "label": "Panel", + "href": "/docs/monitor/dashboard", + "tail": " — odtiaľ sa v rozhraní otvára okno monitora stavu." + }, + { + "label": "Oznámenia", + "href": "/docs/monitor/notifications", + "tail": " — kanály, prepínače udalostí, prepis pomocou AI a história." + }, + { + "label": "AI asistent", + "href": "/docs/monitor/ai-assistant", + "tail": " — poskytovateľ (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter), režim promptu, podrobnosť podľa kanála a jazyk." + }, + { + "label": "Architektúra", + "href": "/docs/monitor/architecture", + "tailRich": " — schéma SQLite (errors, disk_observations, events) a intervaly vlákien na pozadí." + } + ] + } +} diff --git a/web/messages/sk/docs/monitor/index.json b/web/messages/sk/docs/monitor/index.json new file mode 100644 index 00000000..49f438ea --- /dev/null +++ b/web/messages/sk/docs/monitor/index.json @@ -0,0 +1,151 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Webový informačný panel s vlastným hosťovaním pre Proxmox VE | ProxMenux", + "description": "ProxMenux Monitor je webový panel pre Proxmox VE na vlastnom hostiteľovi: metriky v reálnom čase, úložisko a SMART, sieť, VM a kontajnery, hardvér, logy, webový terminál, proaktívny Health Monitor, upozornenia Telegram / Discord / e-mail, voliteľný AI asistent, REST API a integrácie ako Homepage a Home Assistant.", + "ogTitle": "ProxMenux Monitor — Webový panel pre Proxmox VE na vlastnom hostiteľovi", + "ogDescription": "Proxmox VE ovládací panel v reálnom čase: metriky hostiteľa, úložisko SMART, sieť, virtuálne počítače a kontajnery, hardvér, denníky, webový terminál, Health Monitor, upozornenia, asistent AI, REST API.", + "twitterTitle": "ProxMenux Monitor | ProxMenux", + "twitterDescription": "Webový panel Proxmox VE na vlastnom hostiteľovi s Health Monitor, upozorneniami, AI asistentom a REST API." + }, + "header": { + "title": "ProxMenux Monitor", + "description": "Webový panel Proxmox VE na vlastnom hostiteľovi, dodávaný ako AppImage. Beží ako jediná služba systemd, počúva na TCP porte 8008 a poskytuje API aj rozhranie z jedného procesu.", + "section": "ProxMenux Monitor" + }, + "atGlance": { + "title": "Na prvý pohľad", + "body": "Jediný AppImage na hostiteľovi Proxmox → backend Flask (port 8008) zbiera živé dáta cez psutil, pvesh, smartctl, journalctl → panel Next.js poskytovaný z rovnakého procesu. Voliteľné overovanie (heslo + 2FA), AI asistent, upozornenia a REST API pre integrácie." + }, + "hero": { + "alt": "Panel ProxMenux Monitor — prehľad systému s CPU, pamäťou, teplotou a dobou prevádzky", + "caption": "Predvolená vstupná obrazovka – prehľad metrík a zdravotného stavu na úrovni hostiteľa." + }, + "coverage": { + "heading": "Čo pokrýva informačný panel", + "intro": "Osem prvotriednych sekcií, z ktorých každá je podporovaná svojimi vlastnými koncovými bodmi API:", + "tableSection": "Sekcia", + "tableWhat": "Čo zobrazuje", + "sections": [ + { + "name": "Monitor zdravia", + "description": "Aktívne a zrušené výstrahy v rámci CPU, pamäte, úložiska, diskov, siete, služieb, denníkov, virtuálnych počítačov, aktualizácií a zabezpečenia. Poháňa mechanizmus upozornení." + }, + { + "name": "Úložisko", + "description": "Úložné pooly Proxmox, fyzické disky (SATA / NVMe / USB), atribúty SMART, stav poolov ZFS, opotrebenie a životnosť, aktivita I/O." + }, + { + "name": "Sieť", + "description": "Všetky rozhrania (fyzické, bondy, mosty, OVS), IP/MAC/stav, živé grafy RX/TX a historické dáta RRD pre každé rozhranie." + }, + { + "name": "VM a kontajnery", + "description": "Zoznam VM/LXC so stavom, zdrojmi a dobou prevádzky. Detail ukáže konfiguráciu, historické metriky, sťahovanie logov Proxmox a akcie štart/zastavenie/reštart/vypnutie. Dostupnosť logov závisí od endpointu Proxmox; nejde o úplný archív logov hosťovského OS." + }, + { + "name": "Hardvér", + "description": "CPU model a topológia, rozloženie pamäte, zariadenia PCIe, zoznam GPU s ovládačom a monitorovaním jednotlivých slotov v reálnom čase (NVIDIA / Intel iGPU)." + }, + { + "name": "Denníky a udalosti", + "description": "Živý journalctl s filtrami závažnosti / časového rozsahu / kľúčových slov, históriou úloh Proxmox, denníkom upozornení, balíkmi denníkov na stiahnutie." + }, + { + "name": "Terminál", + "description": "Shell hostiteľa a podporované konzoly VM/CT v prehliadači cez xterm.js a WebSockets. Používa nastavený režim overovania: pri vypnutí alebo odmietnutí môžu klienti s prístupom zo siete otvoriť reláciu bez prihlásenia. Neznamená to audit každého príkazu." + }, + { + "name": "Zabezpečenie", + "description": "Zlyhania overenia, stav jailov Fail2Ban, nedávne blokovania a integrácia s jailom [proxmenux] hostiteľa." + } + ], + "footer": "Každá sekcia má vlastnú dokumentačnú stránku pod Panel na bočnom paneli." + }, + "howItRuns": { + "heading": "Ako to beží", + "intro": "ProxMenux Monitor sa dodáva ako samostatný AppImage. Jediná jednotka systemd (proxmenux-monitor.service) spúšťa proces Flask, ktorý:", + "bullets": [ + "Počúva na TCP 8008 na hostiteľovi (HTTP).", + "Poskytuje panel Next.js ako statické súbory pod / a API pod /api/* z jedného procesu.", + "Sťahuje aktuálne údaje pomocou štandardných hostiteľských nástrojov: psutil, pvesh, smartctl, journalctl, zpool, ip, nvidia-smi atď.", + "Ukladá stav do lokálnej databázy SQLite (/usr/local/share/proxmenux/health_monitor.db): skryté upozornenia, pozorovania diskov, nastavenia upozornení a AI. Stav overovania je samostatne v /root/.config/proxmenux-monitor/auth.json." + ], + "footer": "Úplný tok požiadaviek, štruktúra súborov a integrácia systemd sú v Architektúra." + }, + "noAgent": { + "title": "Žiadny agent na hosťoch", + "body": "Monitor získava všetky údaje z hostiteľa. Do VM ani CT netreba inštalovať agenta: údaje pochádzajú z API Proxmoxu a z informácií, ktoré jadro hostiteľa poskytuje o spustených virtuálnych strojoch a kontajneroch." + }, + "access": { + "heading": "Prístup k ovládaciemu panelu", + "intro": "Sú podporované dva prístupové vzory a aplikácia zistí, ktorý z nich sa používa:", + "codeComment1": "# 1) Priamy prístup k hostiteľovi", + "codeComment2": "# 2) Prostredníctvom reverzného proxy (Nginx / Caddy / Traefik)", + "afterCode": "Reverzný proxy má správne nastaviť X-Forwarded-For, X-Forwarded-Proto a X-Forwarded-Host a prepúšťať WebSockets. Na štandardných portoch prehliadač používa aktuálny origin. Backend dôveruje preposlaným IP iba pri výslovnom PROXMENUX_TRUST_PROXY=1; vtedy obmedzte priamy prístup k backendu.", + "footer": "Nastavenie pri prvom spustení, heslo + TOTP 2FA a úryvky reverzného proxy sú zahrnuté v Prístup a overenie." + }, + "mobile": { + "heading": "Mobilné používanie a pridanie na domovskú obrazovku", + "intro": "Panel sa prispôsobuje veľkosti obrazovky a dodáva sa ako progresívna webová aplikácia. Súbor public/manifest.json deklaruje display: standalone, názov, ikonu a farbu motívu. Pridanie URL na domovskú obrazovku vytvorí samostatný spúšťač bez adresného riadka, s vlastnou úvodnou obrazovkou a tmavým motívom panela.", + "phoneAlt": "ProxMenux Monitor spustený na telefóne — zobrazenie hlavného panela", + "phoneCaption": "Hlavný panel v telefóne — rozloženie sa prispôsobí malej obrazovke.", + "addHeading": "Pridať na domovskú obrazovku", + "iosLabel": "iOS Safari:", + "iosBody": "tlačidlo zdieľania → Pridať na domovskú obrazovku. Ikona pochádza z /apple-touch-icon.png dodaného v AppImage.", + "androidLabel": "Android Chrome / Edge:", + "androidBody": "ponuka s tromi bodkami → Inštalovať aplikáciu (alebo Pridať na domovskú obrazovku v starších verziách).", + "afterInstall": "Po nainštalovaní sa otvorením ikony spustí ovládací panel v samostatnom režime s vlastnou položkou prepínača úloh.", + "onlineOnlyTitle": "Vyžaduje sieťové pripojenie", + "onlineOnlyBody": "Aplikáciu PWA možno nainštalovať, ale nefunguje offline: neobsahuje service worker. Zástupca sa správa ako natívna aplikácia, no na načítanie panela musí zariadenie naďalej dosiahnuť hostiteľa cez TCP 8008, prostredníctvom LAN, VPN alebo HTTPS cez reverzný proxy server." + }, + "health": { + "heading": "Monitor zdravia a upozornenia", + "alt": "Obrazovka Monitora zdravia zobrazujúca 10 sledované kategórie (CPU, pamäť, úložisko, disky, sieť, služby, denníky, VM, aktualizácie, zabezpečenie) s aktuálnym stavom", + "caption": "Zobrazenie Monitora zdravia – sledované kategórie 10 s ich aktuálnym stavom. Tu sa zobrazia aktívne a odmietnuté upozornenia, keď systém nejaké vyvolá.", + "body1": "Health Monitor priebežne beží na pozadí a vytvára štruktúrované udalosti: vysoká teplota CPU, SMART výstrahy, degradácia poolov ZFS, ukončenia procesov pri OOM, poruchy VM/CT a bezpečnostné incidenty. Každá má kategóriu, závažnosť (INFO / WARNING / CRITICAL) a stabilný error_key, ktorý zlúči duplicity namiesto zahltenia obrazovky.", + "feedsIntro": "Udalosti napájajú tri veci súčasne:", + "feedsHealth": "Pohľad Health Monitor na ovládacom paneli (aktívne + zamietnuté zoznamy).", + "feedsChannels": "Mechanizmus upozornení — Telegram, Discord, e-mail, Gotify, Pushover a Apprise (viackanálové). Každý kanál sa nastavuje samostatne a kategórie udalostí možno stlmiť.", + "feedsAI": "Voliteľný AI asistent cez vybraného poskytovateľa (OpenAI, Anthropic, Gemini, Groq, Ollama alebo OpenRouter) vysvetľuje udalosti zrozumiteľným jazykom a pri zapnutí príslušnej voľby navrhuje ďalšie kroky.", + "suppressionTitle": "Potlačenie namiesto stlmenia všetkých", + "suppressionBody": "Každá kategória má vlastné Trvanie potlačenia. Po skrytí sa rovnaká výstraha stlmí na tento čas (predvolene 24 hodín, nastaviteľné pre kategóriu až natrvalo). Skutočné zhoršenie, napríklad prekročenie kritickej teploty CPU, ju vyvolá znova bez ohľadu na potlačenie." + }, + "api": { + "heading": "REST API a integrácie", + "intro": "Endpointy REST poskytujú monitorovacie dáta JSON cez HTTP/HTTPS pre Homepage, Home Assistant, Uptime Kuma a skripty. Grafana môže použiť samostatný textový exportér Prometheus na /api/prometheus. Požiadavky možno posielať cez curl.", + "tokens": "Tokeny API s dlhou životnosťou (365 dni) sa generujú z Nastavenia → API prístupových tokenov alebo prostredníctvom POST /api/auth/generate-api-token.", + "bearer": "Tokeny posielajte ako Authorization: Bearer …. Verejný /api/health je vhodný na kontroly dostupnosti bez poverení. Pod /api/auth/* sú verejné trasy nastavenia/prihlásenia/stavu aj chránená správa účtov/tokenov; nie všetky sú anonymné.", + "catalog": "Katalóg endpointov, rotácia tokenov a zabezpečenie sú v Referenčnej príručke API; príklady pre Homepage, Home Assistant, Grafana, Uptime Kuma a cURL sú v Integrácie." + }, + "serviceControl": { + "heading": "Ovládanie služby", + "intro": "Každý deň je monitor spravovaný presne ako ktorákoľvek iná služba systemd. Je tiež vystavený ako dva záznamy v ProxMenux TUI pod Nastavenia:", + "codeComment": "# Manuálne ovládanie", + "footer": "Pozrite si Nastavenia → ProxMenux Monitor, kde nájdete postup prepínania a overovania stavu v ponuke." + }, + "nextSteps": { + "heading": "Kam ďalej", + "items": [ + { + "label": "Architektúra", + "description": "— Flask backend, jednotka systemd, schéma SQLite, poskytovatelia AI, oznamovacie kanály." + }, + { + "label": "Prístup a overenie", + "description": "— prvé spustenie, nastavenie hesla, TOTP 2FA, konfigurácia reverzného proxy, integrácia Fail2Ban." + }, + { + "label": "Panel", + "description": "— každá sekcia UI, každá jedna strana." + }, + { + "label": "Referenčná príručka API", + "description": "— každý koncový bod, tvar žiadosti/odpovede a správa tokenov." + }, + { + "label": "Integrácie", + "description": "— Homepage, Home Assistant, Grafana / Prometheus, Uptime Kuma a všeobecný vzor cURL." + } + ] + } +} diff --git a/web/messages/sk/docs/monitor/integrations.json b/web/messages/sk/docs/monitor/integrations.json new file mode 100644 index 00000000..320c12ea --- /dev/null +++ b/web/messages/sk/docs/monitor/integrations.json @@ -0,0 +1,255 @@ +{ + "meta": { + "title": "Integrácie Proxmox — Homepage, Home Assistant, Grafana, Prometheus | ProxMenux Monitor", + "description": "Príklady na skopírovanie pre pripojenie ProxMenux Monitor k Homepage, Home Assistant, Grafana cez Prometheus a Uptime Kuma. Obsahujú potrebnú konfiguráciu, koncové body API a hlavičku overenia.", + "ogTitle": "Integrácie Proxmox — Homepage, Home Assistant, Grafana, Prometheus", + "ogDescription": "Návody na pripojenie ProxMenux Monitor k Homepage, Home Assistant, Grafana, Prometheus a Uptime Kuma.", + "twitterTitle": "Integrácie Proxmox | ProxMenux Monitor", + "twitterDescription": "Recepty pre Homepage, Home Assistant, Grafana, Prometheus a Uptime Kuma." + }, + "header": { + "title": "Integrácie", + "description": "Príklady na skopírovanie pre nástroje vášho homelabu: Homepage, Home Assistant, Grafana cez Prometheus a Uptime Kuma. Každý ukazuje potrebnú konfiguráciu, použitý koncový bod Monitora a hlavičku overenia.", + "section": "ProxMenux Monitor" + }, + "intro": { + "title": "Čo môžete vytvoriť z tejto stránky", + "body": "Skopírujte príklad do zvoleného nástroja. Koncové body opisuje Referenčná príručka API; táto stránka ukazuje ich použitie v Homepage, Home Assistant a Grafana. Snímky ukazujú výsledok konfigurácií." + }, + "auth": { + "heading": "Overenie: jedna vec, ktorú každý recept potrebuje", + "intro": "Väčšina použitých koncových bodov vyžaduje overenie. Požiadavku možno splniť dvoma spôsobmi.", + "optAtitle": "Možnosť A API token (odporúčané pre integráciu)", + "optAbody1": "Otvorte Nastavenia → Bezpečnosť → API tokeny. Kliknite na Generovať token, zadajte názov ako homepage, home-assistant alebo prometheus a skopírujte ho: zobrazí sa iba raz. Predvolene platí rok a možno ho samostatne odvolať. Používajte ho pre klientov mimo prehliadača.", + "optAbody2": "Od tohto bodu je každá žiadosť jednoducho:", + "optBtitle": "Možnosť B — prihlásenie menom a heslom", + "optBbody": "Vhodné pre skripty, ktoré sa overujú ako používateľ. Vrátený token platí krátko; väčšina integrácií by mala použiť možnosť A.", + "outro": "Pole TOTP treba iba pri zapnutom dvojfaktorovom overení. Výmenu a odvolanie tokenov, pravidlá hesiel a auditný denník opisuje Prístup a overenie.", + "httpsTitle": "Používanie HTTPS namiesto HTTP", + "httpsIntro": "Príklady používajú pre stručnosť http://. Ak ste na Monitore zapli TLS (Nastavenia → Bezpečnosť → SSL/HTTPS), v každej URL nahraďte http:// za https://. Dve poznámky pre konkrétne nástroje:", + "httpsItems": [ + "Certifikáty podpísané vlastným kľúčom. Integrácia Home Assistant rest: predvolene overuje TLS. Pri takomto certifikáte Monitora pridajte verify_ssl: false do každého bloku REST vedľa scan_interval: alebo importujte CA Monitora medzi dôveryhodné certifikáty. Rovnako postupujú iné nástroje overujúce certifikáty.", + "Prometheus má v príklade nižšie pripravené scheme: https. Zapnite alebo ponechajte https, ak je TLS na Monitore zapnuté." + ] + }, + "homepage": { + "heading": "Homepage", + "headingHref": "https://gethomepage.dev", + "intro": "Homepage je statický prispôsobiteľný panel aplikácií. ProxMenux Monitor sa pripája cez vstavaný widget customapi: vložte službu do services.yaml, reštartujte Homepage a karta zobrazí aktuálne hodnoty.", + "iconCalloutTitle": "Oficiálne logo ProxMenux je na dashboardicons.com", + "iconCalloutBody": "Príklady používajú icon: proxmenux.png. Homepage automaticky vyhľadá jednoduché názvy súborov v dashboardicons.com, knižnici ikon pre vlastné panely. Položka ProxMenux je na dashboardicons.com/icons/external/proxmenux a načíta sa pri prvom zobrazení. Rovnako fungujú tisíce nástrojov ako Telegram, Discord, Grafana či Tailscale: do služby stačí napísať icon: <name>.png.", + "imageAlt": "Panel Homepage s tromi kartami ProxMenux Monitor (EDGE, VOID, DREAM), ktoré ukazujú čas prevádzky, CPU, RAM a teplotu každého hostiteľa", + "imageCaption": "Tri inštancie ProxMenux Monitor ako karty Homepage: čas prevádzky, CPU, RAM a teplota CPU sa čítajú z /api/system každého hostiteľa každých 10 s.", + "basicTitle": "Základný widget — bez overenia", + "basicIntro": "Použite to, keď je ProxMenux Monitor na dôveryhodnej sieti a ešte ste nezaviedli autentifikáciu na strane monitora. Najjednoduchšia možná položka services.yaml:", + "authedTitle": "Overený grafický prvok", + "authedIntro": "Na Monitore vytvorte token v Nastavenia → Bezpečnosť → API tokeny. Skopírujte ho do hlavičky Authorization nižšie: ukážkový token za Bearer nahraďte vlastným.", + "authedOutro": "Reštartujte Homepage a karta zobrazí aktuálne hodnoty. Rovnaký token použite vo widgetoch, ktoré čítajú tú istú inštanciu Monitora.", + "multiTitle": "Nastavenie multi- widgetu Systém, úložisko, sieť", + "multiIntro": "Pre viac podrobností vytvorte tri karty s rôznymi koncovými bodmi: systém, úložisko a sieť. Pre tú istú inštanciu Monitora použite rovnaký token.", + "multiCalloutTitle": "Viac hostiteľov Proxmox", + "multiCalloutBody": "Zopakujte blok pre každého hostiteľa, aby vznikli zobrazené karty. Každá položka používa http://<host>:8008 vlastnej inštancie. Vytvorte a uložte token pre každého hostiteľa: oddelené inštalácie majú vlastné podpisové kľúče, preto nemožno predpokladať platnosť tokenu inde." + }, + "homeAssistant": { + "heading": "Home Assistant", + "headingHref": "https://www.home-assistant.io", + "intro": "Príklady používajú vstavanú integráciu Home Assistant rest, takže vlastný komponent HACS netreba. Číta body opísané v Referenčnej príručke API a vytvára senzory a atribúty pre automatizácie. Konfigurácia ponúka približne 25 senzorov zdrojov, stavu, VM/CT, úložiska, siete a aktualizácií. Vložte ju do configuration.yaml a znovu načítajte alebo reštartujte HA.", + "imageAlt": "Panel Home Assistant s entitami ProxMenux Monitor: stav, ukazovatele CPU/RAM/teploty, počet VM, využitie úložiska a počet aktívnych chýb", + "imageCaption": "ProxMenux Monitor plne začlenený do Home Assistant so senzormi vytvorenými z príkladu YAML nižšie.", + "step1Title": "1 · Uložiť API token", + "step1Body": "Token uložte do secrets.yaml oddelene od hlavnej konfigurácie. Predponu Bearer a token vložte do jednej hodnoty použiteľnej ako hlavička. Súbor nie je šifrovaný a musí zostať súkromný. Umiestnenie závisí od inštalácie, obvykle /config/secrets.yaml v HA OS alebo Container.", + "step2Title": "2 · Vložiť konfiguráciu REST", + "step2Body": "Šesť blokov REST pokrýva všetky hlavné oblasti Monitora, jeden blok pre každú oblasť. Každý má vhodný scan_interval podľa frekvencie zmien údajov: systémové zdroje každých 30 s, stav každých 60 s a pomaly sa meniaci inventár každých 5–10 minút. Vložte do configuration.yaml:", + "step3Title": "3 · Pridať binárne senzory a pomocné šablóny", + "step3Body": "Dva binárne senzory a niekoľko šablónových senzorov dopĺňajú integráciu – vďaka nim sú automatizácie a podmienené karty Lovelace oveľa čistejšie ako reťazenie Jinja na každom mieste.", + "step4Title": "4 · Znovu načítať a overiť", + "step4Body": "V rozhraní Home Assistant najprv overte syntax cez Vývojárske nástroje → YAML → Skontrolovať konfiguráciu. Potom znovu načítajte Všetku konfiguráciu YAML alebo vykonajte úplný reštart. Po obnovení v časti Nastavenia → Zariadenia a služby → Entity filtrujte podľa proxmenux. Všetkých približne 25 entít by sa malo naplniť počas jedného intervalu načítania.", + "replaceTitle": "Nahradiť skoršiu verziu tohto receptu?", + "replaceBody": "Po staršej verzii môže register uchovať neaktuálne ID a karty hlásiť Entita sa nenašla. Odstráňte staré bloky rest: a template: z configuration.yaml a znovu načítajte. V Nastavenia → Zariadenia a služby → Entity filtrujte podľa proxmenux a vymažte staré obnovené alebo nedostupné položky. Vložte aktuálny YAML a načítajte znova, aby sa zaregistrovali nové.", + "step5Title": "5 · Panel Lovelace", + "step5Body": "YAML vytvorí kartu vertical-stack s logom, ukazovateľmi, systémom, VM, úložiskom, sieťou a podmienenými problémami. Otvorte panel, kliknite na ceruzku, Pridať kartu a dole Manuálne, potom vložte:", + "viewTipTitle": "Chcete to namiesto jednej karty ako kompletný pohľad na prístrojovú dosku?", + "viewTipBody": "Otvorte ponuku s troma bodkami → Editor surovej konfigurácie a pridajte zobrazenie s touto hlavičkou nad zoznam cards::", + "viewTipOutro": "To vám dáva vyhradenú záložku / pohľad na palubnej doske s vlastnou ikonou a názvom, namiesto jednej dlhej karty na existujúcom pohľade.", + "altViewTitle": "Alternatívou je dedikovaný pohľad na prístrojovú dosku", + "altViewIntro": "Ak chcete vlastnú kartu v existujúcom paneli, pridajte zobrazenie s YAML nižšie. Zobrazenie je karta panela, nevytvára novú položku v bočnom paneli. Postup:", + "altViewSteps": [ + "Otvorte prístrojovú dosku, kde chcete novú kartu.", + "Vpravo hore kliknite na ceruzku na úpravu panela.", + "Kliknutím na záložku + na konci existujúcich kariet vytvoríte nový pohľad.", + "V pravom hornom rohu okna zvoľte Editor kódu na prepnutie medzi vizuálnym editorom a YAML.", + "Vložte YAML nižšie.", + "Uložte. Zobrazenie ProxMenux Monitor sa objaví ako karta v paneli so svojimi kartami." + ], + "twoEditorsTitle": "Dva editory YAML v HA — vyberte správny", + "twoEditorsIntro": "Home Assistant má dva YAML editory, ktoré vyzerajú podobne, ale očakávajú rôzne formáty:", + "twoEditorsItems": [ + "Editor jedného zobrazenia — cez + alebo Upraviť zobrazenie → Editor kódu. Očakáva jedno zobrazenie s title:, path: a cards: na najvyššej úrovni bez úvodnej pomlčky.", + "Editor surovej konfigurácie celého panela — cez ponuku s troma bodkami. Očakáva celý zoznam views:, každé zobrazenie ako položku začínajúcu -." + ], + "twoEditorsOutro": "Nesprávny formát môže vytvoriť Nepomenované zobrazenie a cards: []. YAML nižšie patrí do editora jedného zobrazenia; skopírujte ho presne.", + "viewImageAlt": "Home Assistant vykresľovanie vyhradeného zobrazenia ProxMenux Monitor — hlavička obrázkovej entity, kľúčové ukazovatele výkonu a karty entít systému / virtuálnych počítačov / úložiska / siete automaticky rozložené HA vo viacerých stĺpcoch", + "viewImageCaption": "Zobrazenie ProxMenux Monitor na širokej obrazovke. Rozloženie Masonry automaticky usporiada karty do stĺpcov; výsledok závisí od nastaveného typu zobrazenia.", + "twoColTipTitle": "Chcete pevné dvojstĺpcové rozloženie namiesto automatického?", + "twoColTipBody": "Dvojicu kariet, napríklad Systém + VM alebo Úložisko + Sieť, vložte do spoločného horizontal-stack, aby zostali vedľa seba pri každej šírke:", + "twoColTipOutro": "Na mobile zostane riadok stlačený. Automatické rozloženie HA bez horizontal-stack sa lepšie prispôsobí úzkej obrazovke.", + "step6Title": "6 · Automatizácie", + "step6Body": "Tri automatizácie pre najbežnejšie scenáre: nahraďte notify.mobile_app_<your_phone> vlastnou oznamovacou službou.", + "logoTitle": "O logu ProxMenux", + "logoBody": "Karta picture-entity načíta oficiálne logo z dashboardicons.com, bezplatnej knižnice pre vlastné panely. Položka je na dashboardicons.com/icons/external/proxmenux. Home Assistant načíta SVG cez HTTPS pri prvom zobrazení a uloží ho do vyrovnávacej pamäte.", + "logoBrokenTitle": "Ak logo karta zobrazí rozbitý obrázok", + "logoBrokenIntro": "Niektoré inštalácie, filtrované siete alebo blokátory obsahu bránia prístupu k jsdelivr.net pri zobrazení. Použite lokálnu kópiu:", + "logoBrokenSteps": [ + "Stiahnite si SVG z cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/proxmenux.svg.", + "Uložte si to na /config/www/icons/proxmenux.svg na HA hostiteľa.", + "V Lovelace YAML nahraďte image: URL adresu /local/icons/proxmenux.svg. Uložiť a znova načítať – obrázok sa vykreslí z lokálneho súboru, nie je potrebný internet." + ], + "scanTipTitle": "Praktické pravidlo pre scan_interval", + "scanTipBody": "Začnite čítaním /api/system každých 30 s. /api/health/full zvyčajne číta výsledok platný až šesť minút; čítanie každých 60 s túto pamäť neobíde. Skúste päť minút pre /api/storage/summary a hodinu pre /api/proxmenux/update-status. Intervaly prispôsobte hardvéru a počtu hostiteľov." + }, + "grafana": { + "heading": "Prometheus + Grafana", + "promHref": "https://prometheus.io", + "grafanaHref": "https://grafana.com", + "intro": "ProxMenux Monitor poskytuje GET /api/prometheus v textovom formáte Prometheus 0.0.4. Pri zapnutom overení treba Bearer token. Nastavte Prometheus na zber metrík a Grafana na zobrazenie údajov z databázy časových radov.", + "imageAlt": "Panel Grafana s metrikami ProxMenux: ukazovateľ CPU, vývoj pamäte, počet spustených VM a sieťová priepustnosť", + "imageCaption": "Jednoduchý panel Grafana z metrík ProxMenux zozbieraných cez Prometheus: CPU, pamäť, spustené VM a sieťová priepustnosť. Celý katalóg je v Referenčnej príručke API → Metriky Prometheus.", + "step1Title": "1 · Pridať úlohu zberu do Prometheus", + "step1Body": "API token odovzdajte cez vstavaný blok Prometheus authorization, ktorý umožňuje aj prihlasovacie údaje zo súboru.", + "step1After": "Znovu načítajte Prometheus cez kill -HUP <PID> (PID nahraďte ID jeho procesu), systemctl reload prometheus, ak je podporované, alebo docker compose restart prometheus pre kontajner. V Status → Targets má proxmenux prejsť do UP v jednom intervale. Štítok node=\"<hostname>\" odlišuje hostiteľov.", + "tokenTipTitle": "Token uložte do samostatného súboru", + "tokenTipBody": "V produkcii oddeľte token od konfigurácie. Pomocou credentials_file: /etc/prometheus/secrets/proxmenux.token ho Prometheus načíta zo súboru s oprávneniami 0600.", + "step2Title": "2 · Overiť zber pomocou niekoľkých dopytov", + "step2Body": "Pred konfiguráciou Grafana overte, či Prometheus naozaj má údaje. Otvorte jeho webové rozhranie na http://<prometheus-host>:9090, kliknite na Query a spustite niektorý z týchto dopytov. Mali by sa vrátiť aktuálne číselné údaje z vášho hostiteľa Proxmox:", + "headerQuery": "Dopyt", + "headerConfirms": "Čo potvrdzuje", + "verifyRows": [ + { + "query": "up{job=\"proxmenux\"}", + "confirms": "Vráti 1, ak Prometheus úspešne zbiera údaje Monitora, inak 0. Najrýchlejšia úvodná kontrola." + }, + { + "query": "proxmox_cpu_usage", + "confirms": "Aktuálne využitie CPU hostiteľa Proxmox v percentách. Pri opakovaní dopytu o niekoľko sekúnd by sa hodnota mala meniť." + }, + { + "query": "proxmox_vms_running", + "confirms": "Počet bežiacich hostí. Porovnaj to s tým, čo vidíš v UI Proxmoxu." + }, + { + "query": "proxmox_uptime_seconds / 86400", + "confirms": "Čas prevádzky hostiteľa v dňoch. Má zodpovedať príkazu uptime v termináli Proxmox." + } + ], + "calloutTitle": "401 pri priamom otvorení URL koncového bodu môže byť v poriadku", + "calloutBody": "Pri zapnutom overení odkaz v Status → Targets otvorí /api/prometheus v prehliadači bez hlavičky Bearer služby Prometheus. Odpoveď môže obsahovať '{'\"error\":\"Authentication required\"'}'. Skutočný State: UP cieľa potvrdzuje úspešný zber cez Prometheus.", + "step3Title": "3 · Pridať Prometheus ako zdroj údajov Grafana", + "step3Body": "V Grafana otvorte Connections → Data sources → Add new → Prometheus. Zadajte URL, napríklad http://prometheus.lan:9090, uložte a otestujte. Ak Prometheus vyžaduje overenie, nastavte ho tu samostatne. Token Monitora patrí do úlohy zberu Prometheus.", + "step4Title": "4 · Vytvoriť panely pomocou týchto dopytov PromQL", + "step4Body": "Úvodný výber metrík bežne sledovaných na hostiteľovi Proxmox:", + "headerPanel": "Nápad panelu", + "headerPromql": "Dopyt PromQL", + "panelRows": [ + { + "panel": "Merač využitia CPU na hostiteľa", + "promql": "proxmox_cpu_usage" + }, + { + "panel": "Merač využitia pamäte na hostiteľa", + "promql": "proxmox_memory_usage_percent" + }, + { + "panel": "Použitá pamäť vs celková (časové rady)", + "promql": "proxmox_memory_used_bytes / 1024 / 1024 / 1024" + }, + { + "panel": "Spustené VM/CT podľa hostiteľa", + "promql": "proxmox_vms_running" + }, + { + "panel": "Teplota CPU", + "promql": "proxmox_cpu_temperature_celsius" + }, + { + "panel": "Sieťová priepustnosť RX (bajty/s)", + "promql": "rate(proxmox_interface_bytes_received_total[5m])" + }, + { + "panel": "Sieťová priepustnosť TX (bytes/s)", + "promql": "rate(proxmox_interface_bytes_sent_total[5m])" + }, + { + "panel": "Priemer zaťaženia (1 m)", + "promql": "proxmox_load_average{period=\"1m\"}" + }, + { + "panel": "Použitý diskový priestor % na bod pripojenia", + "promql": "proxmox_disk_usage_percent" + }, + { + "panel": "Stav nabitia batérie UPS", + "promql": "proxmox_ups_battery_charge_percent" + }, + { + "panel": "Teplota GPU na slot", + "promql": "proxmox_gpu_temperature_celsius" + } + ], + "outro": "Každý dopyt pridajte ako panel Grafana, s Stat pre hodnoty a Time series pre vývoj, a zoskupte podľa kategórie. Použite node ako premennú panela (Settings → Variables → New → Query → label_values(proxmox_cpu_usage, node)) na filtrovanie podľa hostiteľa." + }, + "uptimeKuma": { + "heading": "Uptime Kuma a iné kontroly stavu", + "href": "https://github.com/louislam/uptime-kuma", + "intro": "Na kontrolu kľúčového slova použite GET /api/system-info. Táto cesta nevyžaduje token a vracia názov hostiteľa, čas prevádzky a stav healthy, warning alebo critical. Je verejná, na rozdiel od chránených podrobných koncových bodov.", + "kumaTitle": "Uptime Kuma — HTTP monitor kľúčových slov", + "kumaSteps": [ + "V Uptime Kuma, kliknite na + Pridať nový monitor.", + "Typ monitora: HTTP(s) – kľúčové slovo.", + "Zobrazovaný názov: ProxMenux Monitor — pve01.", + "URL: http://pve01.lan:8008/api/system-info.", + "Kľúčové slovo: healthy (hodnota health.status, keď hostiteľ je OK).", + "Interval kontroly: 60 sekúnd stačí.", + "Uložte. Cesta system-info nevyžaduje hlavičku Bearer." + ], + "healthchecksTitle": "healthchecks.io / pingy z úloh cron", + "healthchecksBody": "Úloha cron môže čítať /api/system-info a overiť .health.status == \"healthy\". Až po úspechu odošle úspešný ping na vlastnú URL Healthchecks.io. Služba prijíma pingy úloh, sama Monitor nekontroluje. Samotné HTTP 2xx nedokazuje dobrý stav hostiteľa.", + "richTitle": "Chcete podrobnejšie údaje o stave?", + "richBody": "Pre úplný stav — desať kategórií, aktívne a potlačené chyby — použite GET /api/health/full. Jedna odpoveď obsahuje údaje okna panela. Pri zapnutom overení treba Bearer token." + }, + "workflows": { + "heading": "n8n, Zapier a vlastné skripty", + "intro": "Workflow nástroje a skripty môžu odosielať oznámenia cez POST na /api/notifications/send, napríklad pri zlyhaní CI alebo dlhej úlohe cron. Priame odoslanie obíde front aj časový odstup podľa odtlačku udalosti. Zachová formátovanie kanálov, voliteľnú AI a doručenie. Duplicity musí riešiť volajúci.", + "n8nBody": "V n8n použite uzol HTTP Request s POST, uvedenou URL a rovnakým JSON ako curl. Zvoľte všeobecné údaje Header Auth: názov Authorization a hodnotu Bearer YOUR_API_TOKEN, pričom nahraďte zástupný text. Požiadavku spustí plán, webhook alebo predchádzajúci uzol.", + "severityBody": "Závažnosť používa INFO, WARNING alebo CRITICAL veľkými písmenami. Objekt data poskytuje kontext. AI používa vytvorený nadpis, správu a podporované doplnenia; nie je zaručené, že ľubovoľné polia zahrnie do promptu či výstupu. Pozri Oznámenia → Katalóg udalostí." + }, + "pveWebhook": { + "heading": "Natívny webhook Proxmox VE (prichádzajúci)", + "intro1": "Systém oznámení prišiel v PVE 8.1; natívne ciele webhook vyžadujú Proxmox VE 8.3 alebo novší. Zapnúť oznámenia v nastaveniach sa pokúsi zaregistrovať Monitor ako cieľ. Oznámenia PVE smerované sem, napríklad správy záloh či replikácie, vstúpia do jeho odosielacieho postupu. Konfigurácia musí byť dostupná a zapisovateľná.", + "intro2": "Postup, šablónu od PVE, záznamy v /etc/pve/notifications.cfg a správanie v klastri opisuje Oznámenia → Integrácia webhooku PVE." + }, + "whereNext": { + "heading": "Kam ďalej", + "items": [ + { + "label": "Referenčná príručka API", + "href": "/docs/monitor/api", + "tail": " — koncové body s metódou, cestou a úplným katalógom metrík Prometheus." + }, + { + "label": "Oznámenia", + "href": "/docs/monitor/notifications", + "tail": " — zdroje udalostí, kanály, postup odosielania a podrobná integrácia webhooku PVE." + }, + { + "label": "AI asistent", + "href": "/docs/monitor/ai-assistant", + "tail": " — voliteľné preformulovanie šablón do zrozumiteľného jazyka pred odoslaním cez Telegram, Discord, e-mail alebo Gotify." + }, + { + "label": "Prístup a overenie", + "href": "/docs/monitor/access-auth", + "tail": " — vytváranie a odvolanie API tokenov pre tieto príklady, auditný denník a nastavenie TLS." + } + ] + } +} diff --git a/web/messages/sk/docs/monitor/notifications.json b/web/messages/sk/docs/monitor/notifications.json new file mode 100644 index 00000000..215eda7b --- /dev/null +++ b/web/messages/sk/docs/monitor/notifications.json @@ -0,0 +1,535 @@ +{ + "meta": { + "title": "Oznámenia Proxmox — Telegram, Discord, e-mail, Gotify, Pushover, Apprise | ProxMenux Monitor", + "description": "Posielajte oznámenia Proxmox VE do Telegram, Discord, e-mailu, Gotify, Pushover a približne 80 služieb cez Apprise. Udalosti z monitora zdravia, denníkov a webhooku PVE spracuje deduplikácia, interval opakovania, zoskupovanie, voliteľná AI a história.", + "ogTitle": "Oznámenia Proxmox — Telegram, Discord, e-mail, Gotify, Pushover, Apprise", + "ogDescription": "Upozornenia Proxmox do Telegram, Discord, e-mailu, Gotify, Pushover a približne 80 služieb cez Apprise, s deduplikáciou, intervalmi opakovania, zoskupovaním a voliteľnou AI.", + "twitterTitle": "Oznámenia Proxmox | ProxMenux Monitor", + "twitterDescription": "Upozornenia Proxmox VE do Telegram, Discord, e-mailu, Gotify, Pushover a približne 80 služieb cez Apprise." + }, + "header": { + "title": "Oznámenia", + "description": "Rozosiela udalosti zdrojov Monitora do Telegram, Discord, e-mailu, Gotify, Pushover a približne 80 služieb cez Apprise. Obsahuje deduplikáciu, intervaly opakovania, zoskupovanie, filtre udalostí a kanálov, voliteľnú AI a prehľadnú históriu.", + "section": "ProxMenux Monitor" + }, + "intro": { + "title": "Odkiaľ pochádzajú správy", + "body": "Oznámenia spracúvajú výstup existujúcich zdrojov: Monitor zdravia, sledovanie denníka a úloh Proxmox, webhook PVE, pravidelné zisťovanie a priame udalosti skriptov. Každá udalosť prechádza rovnakým odosielacím postupom." + }, + "howItWorks": { + "heading": "Ako to funguje", + "intro": "Zdroje vytvárajú štruktúrované udalosti. Spracovanie rozhodne o odoslaní a formáte, voliteľná AI upraví text a výsledok sa doručí nastaveným kanálom.", + "arrowLabel": "udalosť", + "caption": "Prehľad postupu. Každý skutočný úspešný, zoskupený či neúspešný pokus o odoslanie sa zaznamená v SQLite. Udalosti potlačené intervalom opakovania sa nezapisujú.", + "nodes": { + "sourcesLabel": "Zdroje", + "sourcesDetail": "Monitor zdravia\nSledovanie denníka\nSledovanie úloh\nWebhook PVE\nPravidelné zisťovanie\nInterné zdroje", + "dispatchLabel": "Postup odosielania", + "dispatchDetail": "Zoskupovanie nárazových udalostí\nKontrola odtlačku / intervalu\nLimity skupín\nOvládanie jednotlivých kanálov", + "aiLabel": "Prepis pomocou AI (voliteľné)", + "aiDetail": "OpenAI / Anthropic\nGemini / Groq\nOpenRouter / Ollama\n(predvolene vypnuté)", + "channelsLabel": "Kanály", + "channelsDetail": "Telegram\nDiscord\nE-mail (SMTP)\nGotify\nPushover\nApprise (približne 80 služieb)" + } + }, + "enabling": { + "heading": "Zapnutie oznámení", + "intro": "Po novej inštalácii karta Oznámenia zobrazuje Vypnuté a tlačidlo Zapnúť oznámenia. Pred kliknutím sa nič neodosiela ani nemení konfigurácia PVE.", + "disabledAlt": "Úvodná karta oznámení so stavom Vypnuté a tlačidlom Zapnúť oznámenia", + "disabledCaption": "Úvodný stav — zapnutie jedným kliknutím.", + "stepsIntro": "Stlačením tlačidla urobíte tri veci v poradí:", + "steps": [ + "Prepne stav na Aktívne a zobrazí formulár kanálov.", + "Zaregistruje webhook v /etc/pve/notifications.cfg. Bez HTTPS používa POST http://127.0.0.1:8008/api/notifications/webhook; s HTTPS lokálny HTTP prijímač na porte 8009. Oznámenia PVE vstúpia do spracovania Monitora. Pozrite Integrácia webhooku PVE.", + "Spustí odosielacie vlákno na pozadí, ktoré číta front udalostí a spracúva každú udalosť." + ], + "activeAlt": "Aktívna karta oznámení s kanálmi, zobrazovaným názvom a rozbaľovacími nastaveniami AI", + "activeCaption": "Aktívny stav: kanály Telegram / Gotify / Discord / e-mail / Pushover / Apprise, zobrazovaný názov, kategórie kanála a časť Pokročilé: Vylepšenie pomocou AI." + }, + "sources": { + "heading": "Zdroje udalostí", + "intro": "Šesť typov zdrojov zahŕňa zberače na pozadí, webhookový prijímač a interné zdroje. Vytvárajú štruktúrované objekty NotificationEvent.", + "headerCollector": "Zberač údajov", + "headerWatches": "Čo sleduje", + "headerEvents": "Typické udalosti", + "rows": [ + { + "collector": "Monitor zdravia", + "watches": "Desať kategórií, približne každých 5 minút", + "events": "new_error, error_resolved, error_escalated, health_degraded, health_persistent." + }, + { + "collector": "Sledovanie systémového denníka", + "watches": "journalctl --follow s rozpoznávaním zlyhaní SSH/webu, blokovaní Fail2Ban pri nainštalovanom jaili, chýb I/O jadra, OOM a udalostí smartd.", + "events": "auth_fail, ip_block, oom_kill, disk_io_error, service_fail." + }, + { + "collector": "Sledovanie úloh", + "watches": "Sleduje /var/log/pve/tasks/index pre nové UPID úloh a ich jednotlivé denníky.", + "events": "backup_start, backup_complete, backup_warning, backup_fail, migration_*, snapshot_complete." + }, + { + "collector": "Prijímač webhooku Proxmox", + "watches": "Prijíma POST /api/notifications/webhook. Verzie PVE s podporou cieľov webhook môžu po nastavení posielať oznámenia sem; pozrite nižšie.", + "events": "Oznámenia PVE vrátane HA, replikácie a vzdump z rozhrania, ktoré by Monitor inak nemusel zachytiť." + }, + { + "collector": "Pravidelné zisťovanie", + "watches": "Pravidelne porovnáva dostupnosť uzlov klastra, platnosť certifikátov, GPU passthrough a dostupné aktualizácie PVE/ProxMenux.", + "events": "node_disconnect, node_reconnect, pve_update, proxmenux_update, gpu_mode_switch, pci_passthrough_conflict." + }, + { + "collector": "Interné zdroje udalostí", + "watches": "Priame volania skriptov ProxMenux a samotného Monitora (notification_manager.emit_event(...)).", + "events": "system_startup, system_shutdown, system_reboot, ai_model_migrated, vlastné testovacie udalosti." + } + ], + "after1": "Udalosť nesie event_type, závažnosť severity (INFO, WARNING, CRITICAL), kategóriu category pre ikony a filtre a údaje data pre šablónu (vmid, device, source_ip, reason…).", + "after2": "Pre každý event_type vytvorí šablóna v notification_templates.py text správy. Ten prechádza odosielaním a voliteľnou úpravou AI. Súvislosti vysvetľuje stránka Asistent AI." + }, + "channels": { + "heading": "Nastavenie kanálov", + "intro": "Podporovaných je šesť kanálov: Telegram, Discord, Gotify, e-mail SMTP, Pushover a Apprise. Prvých päť má vlastné polia. Apprise pridáva približne 80 služieb cez URL, napríklad ntfy, Matrix, Slack, Teams, Pushbullet, AWS SNS a Mattermost. Postupy sú nižšie.", + "credsTitle": "Uloženie prihlasovacích údajov", + "credsBody": "Tokeny, kľúče, URL webhookov a heslá SMTP sú v miestnej databáze SQLite pod /usr/local/share/proxmenux/. Citlivé hodnoty sú chránené a v rozhraní maskované; odosielajú sa len príslušným službám. Záloha celého adresára umožní obnoviť kanály." + }, + "telegram": { + "heading": "Telegram", + "intro": "Potrebujete token robota, použiteľný vo viacerých chatoch, a ID chatu pre súkromný chat, skupinu alebo tému superskupiny. Integrovaný návod opisuje nastavenie; tu sú aj oba formáty ID.", + "guideAlt": "Návod Telegram so štyrmi časťami: BotFather, token, ID chatu a skupiny alebo kanály", + "guideCaption": "Odkaz + návod na nastavenie otvorí štyri kroky na vytvorenie robota a nastavenie kanála približne za dve minúty.", + "step1Title": "1 · Vytvorte robota cez BotFather", + "step1Items": [ + "Otvorte Telegram a začnite četovať s @BotFather (s modrým overovacím začiarknutím – kópie sú bežné).", + "Pošlite /newbot.", + "Vyberte zobrazovaný názov (napr. ProxMenux Lab). Môže sa zmeniť neskôr.", + "Vyberte jedinečné meno na Telegrame končiace na bot, napríklad proxmenux_lab_bot.", + "BotFather vráti token v tvare 123456789:ABCdef…. Je to token robota; chráňte ho ako heslo." + ], + "step2Title": "2 · Získajte ID rozhovoru", + "step2Intro": "ID chatu identifikuje kde robot prispieva. V závislosti od cieľa má jeden z dvoch tvarov.", + "privateLabel": "Súkromný chat (prijímate upozornenia na svoj vlastný účet):", + "privateItems": [ + "Začnite chatovať so svojím novým robotom a pošlite akúkoľvek správu (napr. /start).", + "Otvorte chat s @userinfobot alebo @myidbot a pošlite /start. Kladné číselné ID používateľa v odpovedi je vaše ID súkromného chatu." + ], + "privateAlt": "Formulár Telegram s maskovaným tokenom, kladným ID súkromného chatu a prázdnym voliteľným ID témy", + "privateCaption": "Súkromný chat s robotom — ID chatu je vaše kladné používateľské ID.", + "groupLabel": "Skupina alebo superskupina s témami:", + "groupItems": [ + "Pridajte robota do skupiny; ak to vyžadujú oprávnenia, nastavte ho ako správcu.", + "Pošlite správu do skupiny.", + "Otvorte https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates. V odpovedi JSON nájdite chat.id: skupiny majú záporné ID, superskupiny začínajú na -100.", + "Pri superskupine so zapnutými Témami zadajte požadovaný message_thread_id do voliteľného poľa ID témy." + ], + "groupAlt": "Formulár Telegram s maskovaným tokenom, záporným ID superskupiny začínajúcim na -100 a ID témy 3", + "groupCaption": "Superskupina — ID začína na -100… a voliteľné ID témy vyberá konkrétne vlákno.", + "step3Title": "3 · Uložte a otestujte", + "step3Body": "Vložte token a ID chatu, uložte a vyberte Odoslať test. Správa má prísť do sekundy. Pri chybe História uvedie dôvod, napríklad neplatný token, chýbajúce členstvo v skupine alebo blokovanie používateľom." + }, + "discord": { + "heading": "Discord", + "intro": "Discord prijíma správy cez URL webhooku priradenú ku kanálu. Monitor potrebuje túto URL.", + "items": [ + "V Discord otvorte Nastavenia servera → Integrácie → Webhooks.", + "Kliknite na Nový Webhook. Pomenujte ho (napr. ProxMenux) a vyberte kanál, na ktorom má uverejňovať. Avatar je voliteľný.", + "Vyberte Kopírovať URL webhooku. Formát: https://discord.com/api/webhooks/<id>/<token>.", + "Vložte ju do poľa Webhook URL karty Discord v paneli upozornení a uložte." + ], + "imageAlt": "Formulár kanála Discord s Webhook URL poľom začínajúcim s https://discord.com/api/webhooks/", + "imageCaption": "Discord — vložte URL z Nastavenia servera → Integrácie → Webhooks." + }, + "gotify": { + "heading": "Gotify", + "intro": "Gotify je push server na vlastnom hostiteľovi. Potrebujete jeho základnú URL a token aplikácie z administrácie.", + "items": [ + "Ak Gotify ešte nemáte, použite oficiálny inštalačný návod.", + "Ako správca otvorte Aplikácie → Vytvoriť aplikáciu, zadajte názov ako ProxMenux a skopírujte token.", + "V Gotify nastavte URL servera, napríklad https://gotify.example.com, a vložte token aplikácie.", + "Uložte a stlačte Odoslať test." + ], + "imageAlt": "Formulár Gotify s URL https://gotify.example.com a vzorovou hodnotou tokenu A_valid_gotify_token", + "imageCaption": "Gotify — URL vlastnej inštancie a token aplikácie z administrácie." + }, + "email": { + "heading": "E-mail (SMTP)", + "intro": "E-mail je najflexibilnejší kanál a ten s najviac polí. Potrebujete SMTP server, port, režim TLS, prípadne užívateľské meno a heslo, adresu odosielateľa a aspoň jedného príjemcu.", + "imageAlt": "Formulár SMTP: server, port, režim TLS, meno, heslo, odosielateľ, príjemcovia oddelení čiarkami a predpona predmetu", + "imageCaption": "E-mail: SMTP host / port / TLS režim, voliteľné užívateľské meno + heslo, adresa odosielateľa, čiarkovo oddeľovaní príjemcovia a predpona predmetu, aby sa upozornenia dali ľahko filtrovať do schránky.", + "appNote": "Monitor používa SMTP s heslom. Gmail môže vyžadovať heslo aplikácie. Pri Microsofte záleží na službe a pravidlách organizácie; heslo aplikácie neobíde zákaz základného overenia. Najprv overte podporu služby.", + "gmailTitle": "Heslo aplikácie Gmail", + "gmailIntro": "Heslá aplikácií Gmail vyžadujú zapnuté dvojstupňové overenie (2-Step Verification) v účte Google. Bez neho stránka Heslá aplikácií nebude dostupná.", + "gmailItems": [ + "Otvorte myaccount.google.com/security a zapnite 2-Step Verification ak ešte nie je zapnutý.", + "Otvorte myaccount.google.com/apppasswords.", + "Zadajte názov ako ProxMenux a vyberte Vytvoriť. Skopírujte 16-znakové heslo.", + "Nastavte Server smtp.gmail.com, Port 587, Režim TLS STARTTLS, Meno vašu adresu Gmail a Heslo 16-znakové heslo aplikácie." + ], + "outlookTitle": "Microsoft / Outlook heslo aplikácie", + "outlookIntro": "Heslá aplikácií Microsoft vyžadujú dvojstupňové overenie, ale nezaručujú kompatibilitu SMTP. Pri požiadavke OAuth2 sa klient Monitora s heslom neprihlási. Použite SMTP relay podporujúci požadované overenie poskytovateľa.", + "outlookItems": [ + "Otvorte account.microsoft.com/security a povoľte dvojstupňové overovanie.", + "Ak účet ponúka Rozšírené možnosti zabezpečenia → Heslá aplikácií, vyberte Vytvoriť heslo aplikácie. Samotná voľba nezaručuje podporu SMTP s heslom.", + "Ak Microsoft vytvorí heslo, skopírujte ho a overte jeho prijatie službou SMTP.", + "Len ak poskytovateľ dovoľuje SMTP s heslom, použite schválené hodnoty: Server smtp.office365.com pre Exchange Online, Port 587, Režim TLS STARTTLS, Meno adresu schránky a Heslo povolený údaj. Osobné Outlook.com má iné nastavenia a požiadavky." + ], + "relayTitle": "SMTP relay na vlastnom serveri", + "relayBody": "Nasmerujte Monitor na vlastný SMTP relay, napríklad Postfix. Ten rieši overenie voči poskytovateľovi. Overenie a TLS Monitora nastavte podľa relaya; miestny relay automaticky nevypína šifrovanie." + }, + "pushover": { + "heading": "Pushover", + "intro": "Pushover poskytuje push oznámenia pre iOS, Android aj počítačové prehliadače. Kanál ProxMenux používa priamo API Pushover, bez URL Apprise.", + "stepsTitle": "Nastavenie", + "steps": [ + "Vytvorte účet Pushover, nainštalujte aplikáciu do prijímajúcich zariadení a prihláste sa.", + "Skopírujte kľúč používateľa z Pushover. Pre viac príjemcov môžete použiť kľúč skupiny.", + "Otvorte Vytvoriť aplikáciu/token API, vytvorte ProxMenux a skopírujte 30-znakový token API.", + "V Nastavenia → Oznámenia → Pushover vložte kľúč a token API. Zariadenie a zvuk sú voliteľné.", + "Uložte nastavenia a stlačte Odoslať test. Aplikácia Pushover by mala správu dostať okamžite." + ], + "priorityTitle": "Prioritné mapovanie", + "priorityBody": "Bežné správy majú prioritu 0. So zapnutou Vysokou prioritou kritických upozornení používa CRITICAL prioritu 1 a obíde tiché hodiny Pushover. Núdzová priorita 2 s opakovaním a potvrdením sa nepoužíva.", + "secretTitle": "Chrániť obe hodnoty", + "secretBody": "Kľúč používateľa/skupiny aj token API povoľujú doručenie. Monitor ich chráni a maskuje; nezverejňujte ani jeden na snímkach či v protokoloch podpory." + }, + "apprise": { + "heading": "Apprise (generický uzol pre služby ~80)", + "intro": "Apprise podporuje približne 80 služieb cez URL: ntfy, Matrix, Slack, Microsoft Teams, Mattermost, Pushbullet, AWS SNS, Pushsafer, Rocket.Chat, Signal API a ďalšie. Monitor nemusí každú integrovať samostatne. Pushover možno tiež použiť cez Apprise, ale vlastná karta je jednoduchšia pre jeden cieľ.", + "listIntro": "Úplný zoznam podporovaných služieb a presný formát URL pre každú z nich je k dispozícii v oficiálnej dokumentácii Apprise:", + "listItems": [ + "Dokumentácia služieb Apprise — úplný zoznam.", + "Základy URL — štruktúra URL Apprise." + ], + "stepsTitle": "Kroky", + "steps": [ + "Vyberte cieľovú službu na Apprise wiki a skopírujte pre ňu šablónu URL. Každá stránka služby zobrazuje presnú schému, ktorá sa má použiť (ntfy://, matrix://, pover://, slack://…) plus všetky požadované tokeny, kanály alebo názvy hostiteľov.", + "Nahraďte zástupné hodnoty prihlasovacími údajmi. Príklady: ntfy.sh ntfy://ntfy.sh/my-topic, Pushover pover://user@token, Matrix matrix://user:pass@host:port/#room.", + "Prilepte cieľovú webovú adresu do poľa Apprise URL na karte Apprise na paneli Upozornenia a uložte.", + "Vyberte Odoslať test na overenie dostupnosti a prihlasovacích údajov." + ], + "deliveredTitle": "Čo dostane doručené", + "deliveredBody": "Apprise dostane názov, text a závažnosť prispôsobenú možnostiam služby, ako ikona, priorita či farba. Formátovanie a AI sa vykonajú pred odoslaním, rovnako ako pri Telegrame či e-maile.", + "fanoutTitle": "Jedno URL na kanál Apprise", + "fanoutBody": "Jeden kanál Apprise má jednu URL. Pre viac služieb, napríklad ntfy.sh a Matrix, použite server Apprise API s označenou konfiguráciou. Rozosiela volanie Monitora na všetky URL danej značky." + }, + "rich": { + "heading": "Rozšírené správy, kategórie a filtre kanálov", + "intro": "Každý kanál má Rozšírené správy, jedenásť rozbaľovacích Kategórií oznámení s prepínačmi udalostí a tlačidlo Odoslať test.", + "imageAlt": "Panel kategórií s rozšírenými správami, skupinami VM/CT, záloh, zdrojov, úložiska, siete, bezpečnosti, klastra, služieb, zdravia a aktualizácií, počtami a tlačidlom testu", + "imageCaption": "Šípka označuje Rozšírené správy. Pod nimi je jedenásť kategórií s udalosťami; Odoslať test je dole.", + "richTitle": "Rozšírené správy", + "richIntro": "So zapnutými Rozšírenými správami sa pridá ikona kategórie a formát kanála, napríklad HTML Telegram alebo farebné karty Discord. Pri vypnutí príde rovnaký obsah ako obyčajný text:", + "plainHeader": "Obyčajný text — rozšírené správy vypnuté", + "richHeader": "Formátovaný text — rozšírené správy zapnuté", + "richOutro": "Každý kanál má vlastnú voľbu. E-mail môže zostať obyčajný, Telegram a Discord formátované. Kanály bez príslušného formátu, ako textový e-mail či Gotify, dostanú text.", + "togglesTitle": "Kategórie udalostí", + "togglesIntro": "Každý kanál nezávisle ovláda kategórie a udalosti. Vypnutá kategória potlačí svoje udalosti v danom kanáli. Jednotlivé prepínače platia v zapnutých kategóriách; globálny hlavný filter udalostí v odosielači nie je.", + "togglesItems": [ + "Kategória podľa kanála. Vypnutie VM/CT potlačí vm_start a podobné udalosti. Ukladá sa ako <channel>.events.<group>.", + "Udalosť podľa kanála. V zapnutej kategórii možno posielať backup_complete do Discord, nie do Telegram. Ukladá sa ako <channel>.event.<event_type>." + ], + "togglesOutro": "Kategória ukazuje počet zapnutých / všetkých udalostí a prepínač celej skupiny, napríklad záloh info či aktualizácií, bez rozbalenia." + }, + "quiet": { + "heading": "Tiché hodiny", + "intro": "Počas tichých hodín kanála prejdú iba udalosti CRITICAL. INFO, WARNING a akcie sa uložia na disk a po skončení prídu v súhrne.", + "imageAlt": "Nastavenia kanála: tiché hodiny 22:00–07:00 s náhľadom zmeny a denný súhrn o 09:00 s poznámkou, že tento súhrn nezdrží CRITICAL ani WARNING", + "imageCaption": "Dve nezávislé nastavenia kanála: tiché hodiny hore a denný súhrn pod nimi.", + "purposeTitle": "Načo to je?", + "purposeItems": [ + "Nezobudiť ma o 03:00 kvôli upozorneniu na aktualizáciu. Zálohy, aktualizácie aplikácií, optimalizácie po inštalácii a ďalšie udalosti na úrovni INFO prestanú v noci pingovať váš telefón.", + "Kritické udalosti stále prídu. Tiché hodiny obídu iba udalosti CRITICAL. Samotný názov nestačí: sledovanie denníka vydáva blokovania Fail2Ban aj vypnutie/reštart hostiteľa ako INFO, takže sa môžu zadržať.", + "Odložené správy sa zachovajú. Čakajú v SQLite až do konca intervalu." + ], + "howTitle": "Ako to funguje", + "howItems": [ + "Voľba podľa kanála. Telegram môže mlčať od 22:00 do 07:00, zatiaľ čo e-mail dostáva všetko nepretržite.", + "Začiatok a koniec v miestnom čase: začiatok sa započítava, koniec nie. Interval môže prejsť cez polnoc, napríklad 22:00–07:00.", + "Živý náhľad. Pod poľami je aktuálny stav intervalu a čas ďalšej zmeny.", + "Počas intervalu: CRITICAL sa odosiela normálne. INFO a WARNING čakajú v tabuľke SQLite quiet_pending.", + "Po skončení: príde chronologický súhrn s riadkom pre každú udalosť. Vyrovnávacia pamäť sa vyprázdni až po potvrdení doručenia, aby odolala dočasným výpadkom Telegram či SMTP.", + "Prežije reštart. Údaje zostanú na disku. Nasledujúci cyklus rozpozná čakajúce riadky a podľa potreby odošle obnovovací súhrn." + ], + "criticalTitle": "Čo je CRITICAL", + "criticalBody": "Závažnosť určuje zdroj pri vytvorení udalosti. Disk, vypnutie či bezpečnosť automaticky neznamenajú CRITICAL. Sledovanie denníka vydáva ip_block, system_shutdown a system_reboot ako INFO. Katalóg udalostí uvádza typy; skutočnú závažnosť overte v zdroji a prijatej udalosti." + }, + "digest": { + "heading": "Denný súhrn informačných udalostí", + "intro1": "Denný súhrn je voliteľný. Vhodné INFO, napríklad dostupné aktualizácie, združuje o 09:00 alebo v zvolenom čase. Výsledky záloh a replikácie či priame akcie sú vyňaté. Tiché hodiny naopak zadržia nekritické správy počas intervalu.", + "intro2": "Voľba je pod tichými hodinami na rovnakej karte; pozrite Tiché hodiny. Zapínajú sa samostatne.", + "purposeTitle": "Načo to je?", + "purposeItems": [ + "Ranný prehľad. Súhrn o 09:00 nahradí napríklad 20 jednotlivých správ z predošlého dňa bez čítania 20 bublín Telegramu.", + "Rozlíšenie aktivity a naliehavosti. INFO opisuje dianie; CRITICAL a WARNING signalizujú potrebu zásahu. Vhodné INFO sa zoskupia, ostatné si zachovajú priame doručovanie." + ], + "howTitle": "Ako to funguje", + "howItems": [ + "Zapnutie pre každý kanál. Predvolene vypnuté. Zapnite iba tam, kde chcete súhrn; ostatné kanály nechajte priame.", + "Čas doručenia v miestnom čase, predvolene 09:00. Odosielač ho spustí približne do 60 s od danej minúty.", + "Obsah súhrnu: vhodné všeobecné udalosti INFO, napríklad dostupná aktualizácia aplikácie, dostupná aktualizácia Tailscale, dostupná aktualizácia optimalizácie ProxMenux, čakajúce bezpečnostné aktualizácie APT a oznámenie o limite odosielania. Výsledky záloh a vyňaté akcie zostanú priame.", + "Čo sa nikdy neodkladá:", + "Trvalé uloženie. Udalosti čakajú v tabuľke SQLite digest_pending do nastaveného času a prežijú reštart.", + "Bez udalostí nie je súhrn. Ak nečakajú INFO, prázdna správa sa neposiela." + ], + "neverDelayedSub": [ + "Udalosti CRITICAL prechádzajú bez zdržania denným súhrnom.", + "Udalosti WARNING prechádzajú bez zdržania denným súhrnom.", + "Akcie a zlyhania VM/CT, začiatok a výsledky záloh, výsledky replikácie a vypnutie/reštart hostiteľa obídu denný súhrn aj pri INFO. Tiché hodiny môžu nekritické udalosti stále zdržať." + ], + "comboTitle": "Kombinovanie tichých hodín a denného súhrnu", + "comboBody": "Kanál môže mať obe voľby: ticho 22:00–07:00 a súhrn o 09:00. Nekritické udalosti intervalu prídu o 07:00; vhodné INFO mimo intervalu idú do denného súhrnu. CRITICAL obíde oboje; WARNING obíde denný súhrn, nie tiché hodiny. Vyberte čas ticha, súhrn v pevnom čase alebo oboje." + }, + "displayName": { + "heading": "Zobrazovaný názov", + "intro": "Každé oznámenie nesie Zobrazovaný názov — označenie, ktoré identifikuje, ktorý hostiteľ vytvoril výstrahu. Je to hodnota, ktorú vidíte v spodnej časti vyššie uvedeného príkladu multimediálnych správ (🏠 home-lab) a vo vnútri predpony predmetu e-mailu.", + "imageAlt": "Pole zobrazovaného názvu s príkladom amd; prázdne pole použije systémový názov hostiteľa", + "imageCaption": "Pole Zobrazovaný názov – nechajte prázdne, ak chcete použiť názov hostiteľa systému, alebo ho prepíšte čímkoľvek, čo chcete.", + "outro": "Prázdne pole používa názov systému. Vlastný názov pomáha pri viacerých hostiteľoch v rovnakom chate či schránke: home-lab a office-pve sa čítajú ľahšie než pve01.lan či pmx-prod-01." + }, + "dispatch": { + "heading": "Postup odosielania", + "intro": "Tabuľka opisuje tri súvisiace mechanizmy. Skutočné poradie je zoskupovanie, rezervácia doručenia a interval opakovania, limity skupín, vytvorenie textu a riadenie kanálov:", + "headerStage": "Štádium", + "headerWhat": "Čo to robí?", + "headerTunable": "Nastaviteľné?", + "rows": [ + { + "stage": "Deduplikácia podľa odtlačku", + "what": "Pre udalosť sa vypočíta odtlačok (event_type + key fields from data). Rovnaké odtlačky v krátkom intervale sa považujú za duplikáty.", + "tunable": "Nie — interná logika odosielača." + }, + { + "stage": "Interval opakovania", + "what": "Po úspešnom odoslaní sa opakované odtlačky potlačia; stav je v notification_last_sent. Základ pre CRITICAL, WARNING, INFO, resources a updates je 86400 s. Výnimky: 5 s pre akcie VM/CT a vypnutie/reštart, 10 s pre výsledky záloh/replikácie, 1800–3600 s pre viaceré zdravotné stavy. Výslovné nastavenia udalosti/skupiny majú prednosť.", + "tunable": "Áno — konfiguračné hodnoty pre udalosť či skupinu prepisujú predvolené intervaly." + }, + { + "stage": "Zoskupovanie nárazových udalostí", + "what": "Viac rovnakých udalostí v krátkom čase, napríklad útok na SSH, vytvorí správu burst_* s počtom a ukážkou.", + "tunable": "Nie — okno a prah sú pevné pre každý typ udalosti." + } + ], + "calloutTitle": "Odosielanie vo vlákne na pozadí", + "calloutBody": "Slučka odoslania beží vo vlastnom vlákne. Požiadavka HTTP, ktorá vysiela udalosť, sa vráti hneď, ako je udalosť zaradená do frontu – nečaká na Telegram, SMTP alebo webhook RTT. Každý výsledok odoslania sa zaznamená do tabuľky histórie na spätnú kontrolu." + }, + "aiRewrite": { + "heading": "Nepovinné prepísanie AI", + "body1": "Vhodné udalosti môže prepísať LLM. backup_complete a backup_fail sa neprepisujú. AI je predvolene vypnutá a beží v odosielacom vlákne. Pri chybe alebo časovom limite sa použije pôvodný text.", + "body2": "Podporuje OpenAI, Anthropic, Google Gemini, Groq, OpenRouter a miestne Ollama. Pre kanál: podrobnosť (brief, standard, detailed), jazyk, režim pokynov (default alebo custom) a vlastné pokyny. Návod a príklady sú v Asistent AI.", + "privacyTitle": "Poznámka o ochrane osobných údajov", + "privacyBody": "Požiadavka AI môže obsahovať názov, závažnosť, text, systémové/vlastné pokyny a kontext s názvami hostiteľov, IP, používateľmi, chybami a denníkmi. Posiela sa zvolenému serveru. Ollama zostáva miestne len s miestnym serverom aj modelom; vzdialený server alebo cloudový model odosiela údaje mimo hostiteľa. Ak musia zostať v sieti, vypnite AI alebo použite riadený miestny server a model." + }, + "pveWebhook": { + "heading": "Integrácia PVE webhook", + "intro1": "Proxmox používa ciele oznámení sendmail, Gotify, SMTP a pri podporovaných verziách webhook. Monitor zaregistruje cieľ webhook. Oznámenia HA, replikácie a záloh z rozhrania potom vstupujú do rovnakého spracovania.", + "intro2": "Cieľ nájdete v Datacenter → Oznámenia → Ciele oznámení.", + "imageAlt": "Dialóg webhooku Proxmox s cieľom proxmenux-webhook, POST na http://127.0.0.1:8008/api/notifications/webhook a JSON šablónou s funkciami escape pre title, message, severity, timestamp a poľami json", + "imageCaption": "Webhook z pohľadu PVE; rozhranie snímky je v španielčine. Rovnaké polia platia v každom jazyku.", + "registeredIntro": "Čo sa zaregistruje:", + "registeredItems": [ + "Metóda a URL. POST http://127.0.0.1:8008/api/notifications/webhook bez HTTPS Monitora; s HTTPS samostatný miestny HTTP port 8009. Obe zostávajú na hostiteľovi.", + "Šablóna správy. JSON s funkciami Handlebars PVE, uložený v konfigurácii ako base64. Po dekódovaní:", + "Pravidlo priradenia. Blok matcher: proxmenux-matcher s mode all posiela všetky oznámenia PVE do cieľa.", + "Súkromná konfigurácia. Nastavenie zapíše webhook: proxmenux-webhook do /etc/pve/priv/notifications.cfg so zdieľaným tajomstvom v base64. Verejný cieľ ho použije pre X-Webhook-Secret. Blok nie je prázdny." + ], + "securityTitle": "Ako je prijímač zabezpečený", + "securityIntro": "Prijímač webhook na POST /api/notifications/webhook používa rôzne bezpečnostné vrstvy v závislosti od toho, odkiaľ pochádza žiadosť:", + "securityItems": [ + "Miestne zdroje (127.0.0.1 / ::1). Platí limit požiadaviek, no preskočia sa vzdialené kontroly tajomstva, času a opakovania. Aj adresy miestnych rozhraní hostiteľa sú miestne. Automatický cieľ PVE používa loopback.", + "Vzdialené volania. Okrem limitu sa overí tajomstvo v X-Webhook-Secret, čas v X-ProxMenux-Timestamp alebo JSON, opakovanie a voliteľný zoznam IP. Tajomstvo je v SQLite aj ako kópia base64 v /etc/pve/priv/notifications.cfg, aby PVE odoslal hlavičku." + ], + "practiceTitle": "V praxi", + "practiceBody": "PVE používa http://127.0.0.1:8008 bez HTTPS, inak HTTP 8009. Vzdialené integrácie na https://<monitor-host>:<port>/api/notifications/webhook musia poslať X-Webhook-Secret, aktuálny čas a splniť kontroly opakovania a IP. Tajomstvo samo nestačí.", + "actionsIntro": "Monitor riadi tento cieľ prostredníctvom troch akcií na karte Nastavenie:", + "actionsItems": [ + "Nastaviť pri zapnutí vytvorí položku v /etc/pve/notifications.cfg. Zapisujú sa iba zmeny; tri najnovšie zálohy sú v /usr/local/share/proxmenux/backups/pve-notifications/. Bez pripojeného /etc/pve sa nezapisuje; čaká sa na návrat pve-cluster.", + "Vyčistiť odstráni položku a ponechá predchádzajúcu zálohu.", + "Čítať konfiguráciu zobrazí ciele a pravidlá, aby ste overili viac oznamovacích trás PVE." + ], + "clusterTitle": "Uzly klastra", + "clusterBody": "/etc/pve/ vrátane URL a tajomstva je zdieľaný v klastri. Každý uzol volá svoj vlastný prijímač: 127.0.0.1:8008 bez HTTPS, inak HTTP 8009. Spustite Monitor na každom potrebnom uzle a zlaďte spoločný cieľ so všetkými prijímačmi." + }, + "catalogue": { + "heading": "Katalóg udalostí", + "intro": "Približne sedemdesiat typov je v jedenástich kategóriách. Každá rozbaľovacia skupina ponúka prepínače udalostí. Predvolene sú zapnuté, pokiaľ nie je uvedené inak.", + "headerGroup": "Skupina", + "headerEvents": "Udalosti", + "rows": [ + { + "group": "VM / CT", + "events": "vm_start, vm_start_warning, vm_stop, vm_shutdown, vm_fail, vm_restart, plus ekvivalenty ct_*, migration_start, migration_complete, migration_warning, migration_fail, replication_complete, replication_fail." + }, + { + "group": "Zálohy", + "events": "backup_start, backup_complete, backup_warning, backup_fail, snapshot_complete, snapshot_fail." + }, + { + "group": "Zdroje", + "events": "cpu_high, ram_high, temp_high, load_high." + }, + { + "group": "Úložisko", + "events": "disk_space_low, disk_io_error, storage_unavailable, smart_test_complete, smart_test_failed." + }, + { + "group": "Sieť", + "events": "network_down, network_latency." + }, + { + "group": "Zabezpečenie", + "events": "auth_fail, ip_block, firewall_issue, user_permission_change." + }, + { + "group": "Klaster", + "events": "split_brain, node_disconnect, node_reconnect." + }, + { + "group": "Služby", + "events": "system_startup, system_shutdown, system_reboot, system_problem, service_fail, oom_kill, system_mail." + }, + { + "group": "Monitor zdravia", + "events": "new_error, error_resolved, error_escalated, health_degraded, health_persistent, health_issue_new, health_issue_resolved." + }, + { + "group": "Aktualizácie", + "events": "update_summary, update_available, pve_update, update_complete, proxmenux_update." + }, + { + "group": "Hardvér / GPU", + "events": "gpu_mode_switch, gpu_passthrough_blocked, pci_passthrough_conflict, ai_model_migrated." + } + ], + "burstNote": "Typy burst_* (burst_auth_fail, burst_ip_block, burst_disk_io, atď.) nahrádzajú nárazové udalosti súhrnom. Nemajú vlastné prepínače v rozhraní a dedia stav zdrojovej udalosti.", + "backupResults": { + "heading": "Výsledky zálohy", + "intro": "Oznámenie o úlohe zálohovania Proxmox uvádza, ako sa úloha skončila. Výsledok sa prečíta zo správy, ktorú Proxmox odošle, a nastaví názov, ikonu zobrazenú so zapnutými Rozšírenými správami a stavový riadok e-mailu.", + "headerIcon": "Icon", + "headerResult": "Výsledok", + "headerWhen": "Kedy", + "rows": [ + { + "icon": "💾✅", + "result": "Záloha bola dokončená", + "when": "Zálohovanie všetkých hostí v úlohe sa dokončilo a hlásenie neobsahuje upozornenia." + }, + { + "icon": "💾⚠️", + "result": "Záloha skončila s upozorneniami", + "when": "Zálohovanie všetkých hostí sa dokončilo a hlásenie obsahuje aspoň jeden riadok s upozornením." + }, + { + "icon": "💾❌", + "result": "Hlásená chyba zálohy", + "when": "Hosť zlyhal alebo úloha skončila chybou." + }, + { + "icon": "💾❔", + "result": "Výsledok zálohy nepotvrdený", + "when": "Správa je neúplná alebo neuvádza výsledok pre každého hosťa." + } + ], + "items": [ + "Názov identifikuje úlohu. Uvádza úložisko a pri jednom hosťovi aj jeho typ, meno a ID. Pri zlyhaní pomenuje dotknutého hosťa.", + "Text uvádza každého hosťa s výsledkom, veľkosťou, trvaním a archívom, potom súčty úlohy.", + "Varovania a chyby sa neopakujú. Duplicitné riadky sú uvedené raz, hlavná príčina prvá. Zobrazí sa najviac osem; ostatné sú spočítané na konci a zostanú v denníku úlohy Proxmox.", + "Úloha zlyhaná pred prvým hosťom uvedie príčinu od Proxmoxu, napríklad neexistujúce úložisko.", + "Súhrny zachovajú výsledok. Záloha v súhrne tichých hodín si ponechá ikonu výsledku. Výsledky záloh obchádzajú denný súhrn." + ] + } + }, + "history": { + "heading": "História", + "body1": "Každý skutočný pokus o odoslanie je v notification_history: čas sent_at, kanál, typ, závažnosť, názov, text, success a pri chybe error_message. Zoskupenia majú typ burst_*. Udalosti potlačené intervalom sa nezapisujú.", + "body2": "Nastavenia → Oznámenia obsahuje predvolene zatvorenú Históriu oznámení s poslednými 20 položkami: výsledok, kanál, dátum, chyba a stav denného súhrnu. Stránka neponúka vymazanie; Audit & Report číta rovnaké údaje doručenia.", + "body3": "Rovnaké údaje sú vystavené na GET /api/notifications/history s voliteľnými parametrami dotazu limit, offset, severity a channel, a môžu byť vymazané DELETE /api/notifications/history." + }, + "api": { + "heading": "Koncové body API", + "headerEndpoint": "Koncový bod", + "headerMethod": "Metóda", + "headerUse": "Použitie", + "rows": [ + { + "endpoint": "/api/notifications/settings", + "method": "GET / POST", + "use": "Číta alebo zapisuje nastavenia kanálov, udalostí, AI a zobrazovaného názvu." + }, + { + "endpoint": "/api/notifications/test", + "method": "POST", + "use": "Pošlite oznámenie o teste na jeden kanál: '{'\"channel\":\"telegram\"'}'." + }, + { + "endpoint": "/api/notifications/test-ai", + "method": "POST", + "use": "Vytvorí a prepíše ukážkovú udalosť bez odoslania." + }, + { + "endpoint": "/api/notifications/provider-models", + "method": "POST", + "use": "Zoznam dostupných modelov pre vybraného poskytovateľa AI." + }, + { + "endpoint": "/api/notifications/send", + "method": "POST", + "use": "Vytvorí udalosť z externej integrácie." + }, + { + "endpoint": "/api/notifications/history", + "method": "GET / DELETE", + "use": "Číta filtrovanú históriu alebo ju vymaže." + }, + { + "endpoint": "/api/notifications/webhook", + "method": "POST", + "use": "Prijíma oznámenia Proxmox. Miestne zdroje preskočia vzdialené overenie, nie limit. Vzdialené požiadavky sa overia cez X-Webhook-Secret, čas v X-ProxMenux-Timestamp alebo JSON, kontrolu opakovania a nastavený zoznam IP." + }, + { + "endpoint": "/api/notifications/proxmox/setup-webhook", + "method": "POST", + "use": "Zaregistrujte monitor ako cieľ v /etc/pve/notifications.cfg." + }, + { + "endpoint": "/api/notifications/proxmox/cleanup-webhook", + "method": "POST", + "use": "Odstráni cieľ Monitora z nastavení oznámení PVE." + }, + { + "endpoint": "/api/notifications/proxmox/read-cfg", + "method": "GET", + "use": "Zobrazí aktuálnu konfiguráciu oznámení PVE." + } + ] + }, + "whereNext": { + "heading": "Kam ďalej", + "items": [ + { + "label": "AI asistent", + "href": "/docs/monitor/ai-assistant", + "tail": " — poskytovatelia, modely, režimy pokynov, jazyky a podrobnosti podľa kanála." + }, + { + "label": "Monitor zdravia", + "href": "/docs/monitor/health-monitor", + "tail": " — hlavný samostatný zdroj udalostí s vlastnými intervalmi potlačenia kategórií." + }, + { + "label": "Architektúra", + "href": "/docs/monitor/architecture", + "tailRich": " — miesto tabuliek SQLite notification_last_sent, notification_history a odosielacieho vlákna v procese Monitora." + }, + { + "label": "Prístup a overenie", + "href": "/docs/monitor/access-auth", + "tailRich": " — vydávanie tokenov API pre skripty volajúce /api/notifications/send." + }, + { + "label": "Dashboard → Systémové denníky", + "href": "/docs/monitor/dashboard/system-logs", + "tail": " — živý pohľad na systémový denník, ktorý používa jeho sledovanie." + } + ] + } +} diff --git a/web/messages/sv/docs/monitor/access-auth.json b/web/messages/sv/docs/monitor/access-auth.json new file mode 100644 index 00000000..4880b377 --- /dev/null +++ b/web/messages/sv/docs/monitor/access-auth.json @@ -0,0 +1,396 @@ +{ + "meta": { + "title": "Autentisering för Proxmox-panelen — 2FA, API-token, profil, omvänd proxy | ProxMenux Monitor", + "description": "Åtkomst och skydd för ProxMenux Monitor: första starten, lösenord med namn och avatar, profil, TOTP 2FA, API-token för skript, HTTPS, exempel för Nginx/Caddy/Traefik, granskningslogg och valfri Fail2Ban-jail.", + "ogTitle": "Proxmox-autentisering — 2FA, API-token, omvänd proxy", + "ogDescription": "Skydda ProxMenux Monitor med lösenord, TOTP 2FA, API-token, HTTPS, exempel för omvänd proxy och valfri Fail2Ban-jail.", + "twitterTitle": "Proxmox Dashboardautentisering | ProxMenux Monitor", + "twitterDescription": "Lösenord + TOTP 2FA, API tokens, HTTPS, Nginx/Caddy/Traefik snippets och revisionslogg." + }, + "header": { + "title": "Åtkomst och autentisering", + "description": "Åtkomst till panelen, första starten och skyddslager: lösenord och TOTP, JWT-sessioner, API-token, HTTPS, omvänd proxy, Secure Gateway och valfri Fail2Ban-jail.", + "section": "ProxMenux-övervakning" + }, + "intro": { + "title": "Autentisering är valfritt", + "body": "Vid första starten visas dialogen ”Skydda instrumentpanelen?” med knapparna Ja, ange lösenord och Nej, fortsätt utan skydd. Det andra alternativet lämnar API-ändpunkterna öppna på TCP 8008. Det kan fungera i ett isolerat labbnätverk men är farligt i andra miljöer. Tvåfaktorsautentisering (2FA) ingår inte i det första valet, utan ställs in senare på fliken Säkerhet när ett lösenord har angetts." + }, + "reaching": { + "heading": "Öppna instrumentpanelen", + "intro": "ProxMenux Monitor binder till 0.0.0.0:8008. Det finns tre vanliga sätt att nå den:", + "outro": "Direktåtkomst motsvarar standardenheten för systemd. Omvänd proxy och Secure Gateway beskrivs nedan. Klient-IP från X-Forwarded-For kräver PROXMENUX_TRUST_PROXY=1 och en proxy du kontrollerar. Enbart X-Forwarded-Proto eller X-Forwarded-Host aktiverar inte detta förtroende; frontend bygger API-URL:er från webbläsarens ursprung." + }, + "firstLaunch": { + "heading": "Första starten", + "intro": "När panelen öppnas första gången anropar frontend GET /api/auth/status. Om konfigurationen aldrig har sparats (configured: false) visas ”Skydda instrumentpanelen?” med två val:", + "imageAlt": "Dialogen ”Skydda instrumentpanelen?” med val att ange lösenord eller fortsätta utan skydd", + "imageCaption": "Första valet mellan lösenordsskydd och inget skydd. Visas igen efter nyinstallation eller avaktiverad autentisering i inställningarna.", + "headerButton": "Knapp", + "headerWhat": "Vad händer", + "headerApi": "API-anrop", + "rows": [ + { + "button": "Ja, ange lösenord", + "what": "Öppnar ett formulär med obligatoriskt användarnamn och lösenord, samt valfritt visningsnamn och avatarbild. Aktiverar autentisering i auth.json med enabled: true och returnerar ett JWT för inloggning. Valfria profilfält sparas med efterföljande anrop enligt nedan.", + "api": "POST /api/auth/setup" + }, + { + "button": "Nej, fortsätt utan skydd", + "what": "Anger declined: true i auth.json. API-ändpunkterna är öppna tills du aktiverar skyddet i inställningarna.", + "api": "POST /api/auth/skip" + } + ], + "twofaCalloutTitle": "2FA är konfigurerad senare, inte här", + "twofaCalloutBody": "Den första dialogen gäller endast lösenordsskyddet. Tvåfaktorsautentisering (TOTP) ställs sedan in på fliken Säkerhet efter inloggning med lösenord. Hela anvisningen finns längre ned.", + "createTitle": "Skapa den första användaren", + "createIntro": "Ja, ange lösenord öppnar ett formulär som skapar kontot och kan fylla i profilen, så att avataren visas direkt när du sparar. Fälten är:", + "headerField": "Fält", + "headerRequired": "Krav", + "headerNotes": "Anteckningar", + "fieldRows": [ + { + "field": "Användarnamn", + "required": "Ja", + "notes": "Identifierare för inloggning. Kan inte ändras i gränssnittet; du måste redigera auth.json direkt." + }, + { + "field": "Lösenord", + "required": "Ja", + "notes": "Minst 10 tecken från minst 3 av 4 kategorier: gemener, versaler, siffror och symboler. Enkla lösenord som password, 12345678 och proxmenux avvisas. Samma regler gäller på servern och kan inte kringgås med curl." + }, + { + "field": "Visningsnamn", + "required": "Nej", + "notes": "Namn i menyn i sidhuvudet och på profilsidan. Om det är tomt används användarnamnet. Kan ändras via Avatar → Visa profil." + }, + { + "field": "Avatarbild", + "required": "Nej", + "notes": "PNG, JPEG, WebP eller GIF upp till 2 MB. Visas i en cirkel i sidhuvudet och profilen. Utan bild visas första bokstaven i visningsnamnet eller användarnamnet på färgad bakgrund. Bilden kan senare laddas upp, ersättas eller tas bort i profilen." + } + ], + "createImageAlt": "Kontoformulär med obligatoriskt användarnamn och lösenord samt valfritt visningsnamn och avatar", + "createImageCaption": "Formulär vid första starten. Namn och avatar är valfria; utan dem skapas kontot med en bokstav i en cirkel i sidhuvudet.", + "saveCalloutTitle": "En sparning, upp till tre API-anrop", + "saveCalloutBody": "Formuläret skickar först POST /api/auth/setup med användarnamn och lösenord. Det nya JWT:t används sedan till PUT /api/auth/profile för namn och POST /api/auth/profile/avatar för bilden, om de angetts. Profilfel avbryter inte kontot; profilen kan slutföras senare.", + "avatarTitle": "Avatar meny och profilsida", + "avatarBody1": "Efter konfigureringen visas avataren uppe till höger, bredvid temaväljaren. Menyn öppnar profil och Säkerhet och har åtgärden Logga ut. Du kan även logga ut från Säkerhet.", + "avatarBody2": "Profilen visar avatar, skrivskyddat användarnamn och redigerbart visningsnamn. Uppladdningar, ersättningar och borttagningar av avataren är atomära; sidhuvudet uppdateras automatiskt efter en lyckad ändring. Kontoformuläret och profilen använder samma ändpunkter som beskrivs nedan.", + "profileImageAlt": "Profil med avatarförhandsvisning, knappar för uppladdning, ersättning och borttagning, skrivskyddat användarnamn och redigerbart visningsnamn", + "profileImageCaption": "Profilsidan. Användarnamnet är skrivskyddat; visningsnamn och avatar kan ändras här utan att öppna Säkerhet.", + "headerEndpoint": "Ändpunkt", + "headerEpWhat": "Vad det gör", + "endpointRows": [ + { + "endpoint": "GET /api/auth/profile", + "what": "Returnerar användarnamn, visningsnamn och avatarstatus (has_avatar, avatar_mtime)." + }, + { + "endpoint": "PUT /api/auth/profile", + "what": "Uppdaterar visningsnamnet. Begärans innehåll: '{' \"display_name\": \"...\" '}'." + }, + { + "endpoint": "GET /api/auth/profile/avatar", + "what": "Returnerar avatarbilden som PNG / JPEG / WebP / GIF med rätt innehållstyp. Kräver Bearer-headern; frontend hämtar en blob och skapar en lokal objekt-URL för visning." + }, + { + "endpoint": "POST /api/auth/profile/avatar", + "what": "Laddar upp en ny avatar, högst 2 MB. Innehållstypen ska motsvara filen. Den gamla bilden ersätts atomärt." + }, + { + "endpoint": "DELETE /api/auth/profile/avatar", + "what": "Tar bort avataren. Sidhuvudet visar åter en bokstav i en färgad cirkel." + } + ], + "reversibleTitle": "Du kan aktivera skyddet senare", + "reversibleBody": "Efter Nej, fortsätt utan skydd visas inte välkomstdialogen igen. Aktivera autentisering på fliken Säkerhet eller redigera /root/.config/proxmenux-monitor/auth.json, ta bort flaggan declined och starta om tjänsten." + }, + "password": { + "heading": "Lösenordsautentisering", + "intro": "Efter konfigureringen kräver skyddade API-anrop ett JWT i Authorization: Bearer <token>:", + "items": [ + "Sessionstoken: giltigt i 24 timmar, utfärdas av POST /api/auth/login.", + "API-token för integrationer: giltigt i 365 dagar, utfärdas av POST /api/auth/generate-api-token. Se nästa avsnitt." + ], + "loginImageAlt": "Inloggningsskärm som visas efter autentisering är konfigurerad - användarnamn och lösenordsfält", + "loginImageCaption": "När autentiseringen är konfigurerad börjar varje besök på instrumentbrädan här. Med 2FA aktiverad ber skärmen om 6-siffrig kod i ett andra steg efter att lösenordet accepteras.", + "loginFlowTitle": "Inloggningsflöde", + "twofaIntro": "Med 2FA returnerar första anropet requires_totp: true. Upprepa det med den sexsiffriga koden:", + "publicTitle": "Offentlig åtkomst och skyddade kontroller", + "publicIntro": "Inloggning och autentiseringsstatus är offentliga. Kontot kan skapas så länge användarnamn och lösenord inte sparats, även efter att skydd avböjts. Systemdata kräver autentisering när skyddet är aktivt:", + "publicItems": [ + "/api/auth/login och /api/auth/status är offentliga. /api/auth/setup skapar första kontot och vägrar skriva över befintliga inloggningsuppgifter.", + "/api/system-info är en offentlig ändpunkt med grundläggande systeminformation, inklusive health.status. Den kräver ingen token. Även /api/auth/status är offentlig och passar för en tillgänglighetskontroll." + ], + "cryptoTitle": "Kryptografi och lagring", + "cryptoIntro": "ProxMenux Monitor har öppen källkod. Här beskrivs skyddet för uppgifter på värden så att du kan bedöma det innan du väljer att lita på det. Algoritmerna används i scripts/auth_manager.py; avsnittet beskriver koden.", + "headerAsset": "Uppgift", + "headerAlgo": "Algoritm", + "headerWhere": "Lagringsplats", + "cryptoRows": [ + { + "asset": "Lösenord", + "algorithm": "PBKDF2-HMAC-SHA256 med ett slumpmässigt salt per lösenord och många iterationer enligt OWASP 2023+. Lagras som pbkdf2_sha256$<iters>$<salt>$<hash>.", + "where": "auth.json → password_hash" + }, + { + "asset": "Sessions-JWT / API-JWT", + "algorithm": "HS256-signering med en hemlighet per installation, skapad vid första starten (secrets.token_urlsafe, ≥48 byte). Token innehåller iss=proxmenux-monitor och aud=api; varje begäran verifierar signaturen med den aktuella hemligheten.", + "where": "Hemlighet: auth.json → jwt_secret. JWT själv: bara på klienten." + }, + { + "asset": "Metadata för API-token", + "algorithm": "JWT:ts SHA-256-hash lagras med fingeravtrycket signed_with av använt jwt_secret. Det gör att metadata kan visas och token upptäckas efter byte av signeringshemlighet.", + "where": "auth.json → api_tokens[]" + }, + { + "asset": "TOTP-hemlighet för 2FA", + "algorithm": "Standard-TOTP (RFC 6238) med base32-kodad hemlighet. De åtta engångskoderna för återställning lagras som SHA-256-hashar.", + "where": "auth.json → totp_secret + backup_codes[]" + }, + { + "asset": "Återkallelser", + "algorithm": "Vid återkallelse läggs tokenets SHA-256-hash i en spärrlista som läses vid varje verifiering. En minnescache på cirka 30 s undviker upprepade diskläsningar.", + "where": "auth.json → revoked_tokens[]" + } + ], + "authJsonTitle": "auth.json — innehåll och skydd", + "authJsonBody": "Autentiseringsuppgifterna finns i /root/.config/proxmenux-monitor/auth.json, med läge 0600 och ägare root. Filen innehåller PBKDF2-hashar och kryptografiska hemligheter (jwt_secret, totp_secret), aldrig lösenord i klartext. Kryptera mål för säkerhetskopiering eller replikering och lägg aldrig filen i versionshantering.", + "rotateTitle": "Byte av jwt_secret gör alla befintliga JWT ogiltiga", + "rotateBody": "Om auth.json återskapas eller återställs med en annan hemlighet ändras jwt_secret. Gamla sessions- och API-JWT misslyckas med \"Invalid or expired token\". Gränssnittet visar Ogiltigt — skapa på nytt. Återkalla och ersätt berörda token även i Home Assistant, skript och andra klienter.", + "recoverTitle": "Återställa ett förlorat lösenord", + "recoverIntro": "Lösenordsåterställning kräver skalåtkomst till värden. ProxMenux har en guidad återställning i konfigurationsmenyn så att du slipper redigera auth.json manuellt:", + "survivesTitle": "Vad överlever återställningen", + "survivesBody": "Den interaktiva inloggningen tas bort, men jwt_secret och registrerade api_tokens behålls. Home Assistant och andra skript kan fortsätta med samma token. För att börja om helt med en ny hemlighet, radera auth.json och starta om tjänsten. Alla gamla token blir då ogiltiga.", + "physicalTitle": "Krav på åtkomst till värden", + "physicalBody": "Kräver ett root-skal på värden. Den som kör menu som root styr redan hela maskinen; lösenordsåterställningen ger inga ytterligare rättigheter. Monitor-inloggningen skyddar därför inte mot någon som redan har root-åtkomst." + }, + "twofa": { + "heading": "Tvåfaktorsautentisering (TOTP)", + "intro": "2FA lägger till en sexsiffrig kod som ändras var 30:e sekund på telefonen eller i lösenordshanteraren. Enbart lösenordet räcker då inte för inloggning. ProxMenux Monitor använder standardprotokollet TOTP (RFC 6238), som fungerar med autentiseringsappar.", + "pickTitle": "Välj en autentiseringsapp", + "pickIntro": "En befintlig TOTP-app kan användas här. Tabellen visar vanliga alternativ: vissa gratis, andra med abonnemang. Även plattformar och säkerhetskopiering skiljer sig.", + "headerApp": "App", + "headerPlatforms": "Plattformar", + "headerAppNotes": "Anteckningar", + "apps": [ + { + "name": "Google Authenticator", + "href": "https://safety.google/authentication/", + "platforms": "iOS, Android", + "notes": "Vanligt val. Valfri molnsäkerhetskopiering via Google-kontot." + }, + { + "name": "Microsoft Authenticator", + "href": "https://www.microsoft.com/en-us/security/mobile-authenticator-app", + "platforms": "iOS, Android", + "notes": "Säkerhetskopiering via Microsoft-konto. Hanterar även Microsofts pushmeddelanden för arbete." + }, + { + "name": "Authy", + "href": "https://authy.com/", + "platforms": "iOS, Android", + "notes": "Krypterad synkronisering mellan enheter. Skrivbordsappen stöds inte längre sedan den 19 mars 2024." + }, + { + "name": "Apple Passwords", + "href": "https://support.apple.com/guide/passwords/welcome/mac", + "platforms": "iOS, iPadOS, macOS, visionOS, Windows (via iCloud)", + "notes": "Inbyggd i Apples system; separat Passwords-app sedan iOS 18 / macOS Sequoia. Sparar TOTP tillsammans med lösenord och synkroniserar via iCloud-nyckelring." + }, + { + "name": "Bitwarden", + "href": "https://bitwarden.com/", + "platforms": "iOS, Android, skrivbord, webbläsare", + "notes": "Öppen källkod. TOTP kan lagras tillsammans med lösenord i valvet. Det är bekvämt men håller inte faktorerna på separata enheter." + }, + { + "name": "1Password", + "href": "https://1password.com/", + "platforms": "iOS, Android, skrivbord, webbläsare", + "notes": "Samma idé som Bitwarden - TOTP integrerad med lösenordsvalvet. Prenumeration." + }, + { + "name": "Aegis Authenticator", + "href": "https://getaegis.app/", + "platforms": "Android", + "notes": "Öppen källkod. Krypterad säkerhetskopia på enheten under din kontroll. Inget moln eller konto krävs." + }, + { + "name": "Raivo OTP", + "href": "https://raivo-otp.com/", + "platforms": "iOS, macOS", + "notes": "Öppen källkod. Valfri iCloud-synkronisering. Ett alternativ i Apples ekosystem som liknar Aegis." + }, + { + "name": "Ente Auth", + "href": "https://ente.io/auth/", + "platforms": "iOS, Android, skrivbord, webb", + "notes": "Öppen källkod. Molnsynkronisering mellan enheter med totalsträckskryptering." + }, + { + "name": "2FAS", + "href": "https://2fas.com/", + "platforms": "iOS, Android, webbläsartillägg", + "notes": "Öppen källkod. Valfri krypterad molnsäkerhetskopia; webbläsartillägget kan fylla i koder automatiskt." + }, + { + "name": "FreeOTP+", + "href": "https://github.com/helloworld1/FreeOTPPlus", + "platforms": "Android", + "notes": "Vidareutveckling av FreeOTP för Android med öppen källkod samt import och export. Inget konto krävs." + } + ], + "backupTitle": "Varför säkerhetskopior behövs", + "backupBody": "Om enheten försvinner, använd en sparad återställningskod eller återställ en säkerhetskopia som du ordnat i förväg. Molnsynkronisering och exporter skiljer sig mellan appar; kontrollera att TOTP-hemligheterna kan återställas. Root-åtkomst på värden möjliggör också återställning enligt nedan. Spara en separat, säker kopia.", + "setupTitle": "Ställ in steg för steg från panelen", + "setupImageAlt": "2FA-inställning med QR-kod och återställningskoder", + "setupImageCaption": "2FA-dialogen visar QR-kod, Base32-hemlighet för manuell inmatning och åtta engångskoder för återställning. Kopiera dem innan dialogen stängs; de visas inte igen.", + "setupSteps": [ + "Installera autentiseringsappen på din telefon (eller öppna din lösenordshanterare). En av apparna från tabellen ovan. Du behöver bara göra det en gång - samma app kommer att hålla koder för varje tjänst du skyddar.", + "Logga in på panelen med användarnamn och lösenord.", + "Öppna fliken Säkerhet och välj Aktivera 2FA. Dialogen visar QR-kod, Base32-hemlighet och åtta återställningskoder.", + "Lägg till posten i autentiseringsappen:", + "Spara återställningskoderna. Förvara alla åtta i en lösenordshanterare, krypterad anteckning eller säker papperskopia. Varje kod fungerar en gång när appen är otillgänglig.", + "Bekräfta med den aktuella sexsiffriga koden från appen i fältet \"Verifieringskod\" och skicka. Koden ändras var 30:e sekund; använd nästa om den hinner löpa ut.", + "Klart. 2FA är aktivt. Nästa inloggning frågar först efter lösenord och sedan den aktuella sexsiffriga koden." + ], + "setupStep4Sub": [ + "Enkel metod: välj Lägg till konto → Skanna QR-kod i appen och rikta kameran mot koden. Posten får automatiskt ett namn som ProxMenux Monitor (your-username) och visar en sexsiffrig kod som ändras var 30:e sekund.", + "Manuellt alternativ när skanning inte är möjlig, exempelvis på samma telefon: Lägg till konto → Ange inställningsnyckel. Välj ett namn som Proxmox Monitor, klistra in Base32-hemligheten, lämna Typ som Tidsbaserad och spara." + ], + "testTitle": "Test innan du loggar ut", + "testBody": "Behåll den nuvarande sessionen och testa en ny inloggning i ett privat fönster omedelbart efter inställningen. Kontrollera serverns och telefonens klockor om koden nekas, innan du stänger den fungerande sessionen. Om åtkomsten redan är förlorad, använd återställningskod eller redigera auth.json från värdens skal.", + "lostTitle": "Förlorad autentiseringsapp", + "lostIntro": "Tre återställningsmetoder, från minst till mest ingripande:", + "lostItems": [ + "Använd en återställningskod. Ange en av de åtta sparade koderna i TOTP-fältet. Den fungerar en gång; oanvända koder förblir giltiga. Ställ sedan in 2FA på nytt i inställningarna för åtta nya koder.", + "Återställ appen från moln eller säkerhetskopia. Med inställd molnsynkronisering kan appen installeras och kontot öppnas på en ny enhet: Google, Microsoft, Authy, Apple Passwords via iCloud-nyckelring, Ente eller 2FAS. Med en exportfil från Aegis, Raivo eller FreeOTP+, installera appen och importera filen.", + "Stäng av 2FA från värdens skal. Om övriga metoder saknas, redigera /root/.config/proxmenux-monitor/auth.json som root via SSH eller konsol. Sätt totp_enabled till false, spara och starta om tjänsten:" + ], + "lostShellOutro": "Du kan logga in med användarnamn + lösenord bara, sedan aktivera 2FA från Inställningar.", + "disableTitle": "Inaktivera 2FA", + "disableBody": "Öppna Säkerhet och välj Inaktivera 2FA. POST /api/auth/totp/disable kräver aktuellt lösenord och giltig TOTP- eller återställningskod. Hemligheten och återställningskoderna tas bort. Ta även bort den gamla posten i appen.", + "rejectedTitle": "Den sexsiffriga koden nekas alltid", + "rejectedIntro": "TOTP är tidsbaserat. Serverns och telefonens klockor bör skilja mindre än cirka 30 s. Två kontroller:", + "rejectedItems": [ + "Telefon: Inställningar → Datum och tid → aktivera automatisk / nätverkssynkronisering.", + "Proxmox-värd: timedatectl status ska visa \"System clock synchronized: yes\". Kör annars timedatectl set-ntp true och vänta en minut." + ], + "rejectedOutro": "När klockorna är synkroniserade accepteras koden inom nästa 30-sekundersintervall." + }, + "apiTokens": { + "heading": "API-token med lång giltighetstid", + "intro": "Sessioner löper ut efter 24 timmar. Skapa ett separat API-token giltigt i 365 dagar för Homepage, Home Assistant, Grafana eller Uptime Kuma. JWT:t använder samma signeringshemlighet; fältet token_name gör att det kan identifieras och återkallas separat.", + "imageAlt": "API-tokenlista med namn, prefix, datum för skapande och utgångsdatum", + "imageCaption": "Listan i inställningarna visar namn, prefix med de fyra sista tecknen för identifiering, skapande- och utgångsdatum samt återkallelse.", + "generateTitle": "Generera en token", + "generateIntro": "Från panelen:", + "generateSteps": [ + "Öppna Säkerhet → API-åtkomsttoken.", + "Skriv ett beskrivande namn (t.ex. \"Home Assistant\").", + "Skriv in ditt lösenord. Om 2FA är på, även den nuvarande 6-siffriga koden.", + "Välj Generera token. Det visas endast en gång: kopiera direkt." + ], + "generateCli": "Från kommandoraden:", + "useTitle": "Använd en token", + "revokeTitle": "Återkalla en token", + "revokeBody": "Varje rad har Återkalla, vilket lägger till hashen i revoked_tokens i auth.json. Tokenet nekas från nästa begäran.", + "cheatTitle": "Snabbguide för tokensäkerhet", + "cheatItems": [ + "Spara token i integrationens lagring för hemligheter: Homepage secrets.yaml, Home Assistant !secret eller miljövariabler. Lägg dem aldrig i Git.", + "Ett token per integration, med integrationens namn. Återkalla det när integrationen tas bort.", + "Rotera varje 6-12 månader. Utgången är en hård gräns, inte en rekommendation." + ], + "outro": "Lagringsråd och exempel: API-referens → Tokenhantering och Integrationer." + }, + "https": { + "heading": "HTTPS", + "intro": "Två vägar till TLS:", + "items": [ + "Omvänd proxy rekommenderas. Avsluta TLS på Nginx / Caddy / Traefik och vidarebefordra HTTP till Flask på port 8008. Exempel nedan.", + "Direkt HTTPS i AppImage. Ange certifikat via POST /api/ssl/configure (gränssnitt: Inställningar → SSL). HTTPS använder gevent.pywsgi med standardhanteraren; flask-sock hanterar WebSocket för WSS. Certifikatsökvägar sparas i SSL-konfigurationen." + ], + "calloutTitle": "Direkt HTTPS begränsningar", + "calloutBody": "Monitor kan använda ett certifikat hanterat av Proxmox eller egna certifikatsfiler. Det utfärdar inte ACME-certifikat självt. Använd Proxmox ACME eller Caddy, Traefik eller Nginx för automatisk utfärdning och förnyelse, och se till att förnyade certifikat läses in." + }, + "gateway": { + "heading": "Säker gateway (Tailscale)", + "intro": "En omvänd proxy möjliggör fjärråtkomst. Secure Gateway ger åtkomst utan att exponera TCP 8008: en Alpine-LXC kör Tailscale som undernätsrouter. Åtkomst till värdens LAN-IP beror på godkända rutter och åtkomstregler i tailnet.", + "calloutTitle": "Varför detta är bekvämt", + "calloutBody": "Använd LAN-adressen http://<proxmox-lan-ip>:8008 via godkänd rutt. Tailscales undernätsroutrar använder SNAT som standard. Monitor ser normalt gatewayens LAN-IP, inte klientens 100.x.y.z. Loggar och Fail2Ban identifierar därför den källadress som faktiskt når värden.", + "deployBody": "Välj LXC-lagring, klistra in en Tailscale-nyckel skapad på login.tailscale.com/admin/settings/keys, välj undernät och distribuera. LXC:n startas på cirka 30 sekunder och registreras i tailnet.", + "outro": "Distribution, undernätsrutter, Tailscale-ACL och Exit Node beskrivs i Panel → Säkerhet → Secure Gateway, där även guiden finns. Här beskrivs åtkomsten." + }, + "proxy": { + "heading": "Konfigurationsexempel för omvänd proxy", + "intro": "Använd ett eget värdnamn, exempelvis monitor.example.com, vidarebefordrat till port 8008 på Proxmox-värden. Exemplen följer detta mönster. En undersökväg som example.com/proxmenux-monitor/ behöver anpassningar av frontend och proxy; att ta bort prefixet räcker inte.", + "nginxTitle": "Nginx", + "caddyTitle": "Caddy", + "traefikTitle": "Traefik (etiketter — Docker / Kubernetes)", + "subPathTitle": "Avancerat: distribution under en undersökväg", + "subPathBody": "Frontend saknar en inställd bas för undersökvägar och bygger API-anrop från roten med /api/*. Att ta bort ett prefix som example.com/proxmenux-monitor/ hanterar varken anropen eller alla frontendfiler. Använd ett eget värdnamn. Undersökvägar kräver samordnade ändringar och särskild testning." + }, + "audit": { + "heading": "Granskningslogg", + "intro": "Misslyckade inloggningar och varningar om begränsning skrivs radvis till /var/log/proxmenux-auth.log. Denna logger registrerar inte lyckade inloggningar:", + "outro": "Följ loggen med tail -F /var/log/proxmenux-auth.log. Extra konfiguration för logrotate möjliggör rotation; Monitor gör den inte självt." + }, + "fail2ban": { + "heading": "Valfritt: Fail2Ban-jail", + "calloutTitle": "Fail2Ban ingår inte i Monitor", + "calloutBody": "Fail2Ban är inte installerad av ProxMenux Monitor själv. Installera den via Säkerhet → Fail2Ban i menyn ProxMenux (eller med standardpaketet Debian). Utan den skriver monitorn fortfarande granskningsloggen ovan – den förbjuder helt enkelt inte återkommande brottslingar automatiskt.", + "intro": "ProxMenux-integrationen innehåller en jail [proxmenux] som:", + "items": [ + "Läser /var/log/proxmenux-auth.log", + "Matchar authentication failure; rhost=<ip> mönster med ett dedikerat filter.", + "Blockerar normalt den berörda IP-adressen i kärnans brandvägg.", + "Flasks before_request-hook kontrollerar begäran mot spärrlistan, cachad i 30 s. Bakom en omvänd proxy kräver IP-blockering även PROXMENUX_TRUST_PROXY=1 och en kontrollerad proxy som anger tillförlitliga vidarebefordringshuvuden." + ], + "outro": "Konfiguration, spärrtid och upplåsning: Säkerhet → Fail2Ban." + }, + "troubleshoot": { + "heading": "Felsökning", + "noScreenTitle": "Den första lanseringsskärmen visas aldrig", + "noScreenBody": "Autentisering är redan inställd (configured: true) eller har hoppats över. För att börja om:", + "noScreenOutro": "Raderar autentisering, TOTP-hemligheter och API-token. Säkerhetskopiera auth.json först om du vill behålla dem.", + "tokenTitle": "HTTP 401 på varje begäran från en fungerande API token", + "tokenBody": "Token gick ut (365 d-gräns) eller kom in i revoked_tokens-listan. Skapa en ny i Inställningar och uppdatera integrationen. För att kontrollera:", + "tokenOutro": "Utgångna eller återkallade tokens returnerar '{'\"error\":\"Invalid or expired token\"'}'.", + "no2faTitle": "Kan inte logga in efter att 2FA aktiverats och appen saknas", + "no2faBody": "Ange en återställningskod i TOTP-fältet. Om ingen finns, redigera /root/.config/proxmenux-monitor/auth.json från värdens skal, sätt totp_enabled till false och starta om tjänsten.", + "wsTitle": "Omvänd proxy fungerar men den terminala fliken kopplar bort varje minut", + "wsBody": "WebSocket-anslutningens tidsgräns för inaktivitet i proxyn. Öka lästiden (Nginx: proxy_read_timeout 86400s; Traefik: idleTimeout i ingångspunkt eller middleware). Kontrollera i Nginx att proxy_set_header Upgrade $http_upgrade och Connection \"upgrade\" finns." + }, + "whereNext": { + "heading": "Nästa steg", + "items": [ + { + "label": "API-referens → Tokenhantering", + "href": "/docs/monitor/api", + "tail": " — skapa, lista och återkalla API-token; säkerhet och lagring av hemligheter." + }, + { + "label": "Integrationer", + "href": "/docs/monitor/integrations", + "tail": " — Homepage, Home Assistant, Grafana / Prometheus, Uptime Kuma och allmänna cURL-exempel." + }, + { + "label": "Dashboard → Säkerhet → Secure Gateway", + "href": "/docs/monitor/dashboard/security", + "tail": " — distribuera Tailscale-gatewayens LXC steg för steg: undernätsrutter, ACL och Exit Node." + }, + { + "label": "Säkerhet - Fail2Ban", + "href": "/docs/security/fail2ban", + "tail": " — installera och konfigurera den valfria jailen." + }, + { + "label": "Inställningar → ProxMenux Monitor", + "href": "/docs/settings/proxmenux-monitor", + "tail": " — starta och stoppa systemd-tjänsten via ProxMenux TUI." + } + ] + } +} diff --git a/web/messages/sv/docs/monitor/ai-assistant.json b/web/messages/sv/docs/monitor/ai-assistant.json new file mode 100644 index 00000000..8346ec59 --- /dev/null +++ b/web/messages/sv/docs/monitor/ai-assistant.json @@ -0,0 +1,342 @@ +{ + "meta": { + "title": "Proxmox AI-assistent — OpenAI, Claude, Gemini, Groq, Ollama | ProxMenux Monitor", + "description": "Den valfria AI-assistenten skriver om Proxmox VE-aviseringar på tydligt språk. Sex leverantörer: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter och Ollama. Gränssnittet erbjuder tretton språk, tre detaljnivåer per kanal, egna promptar med ett communitybibliotek och händelsekontext med drifttid, återkommande händelser och SMART-data.", + "ogTitle": "Proxmox AI-assistent — OpenAI, Claude, Gemini, Groq, Ollama", + "ogDescription": "Skriv om Proxmox VE-aviseringar på tydligt språk med OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter eller lokal Ollama.", + "twitterTitle": "Proxmox AI-assistent | ProxMenux Monitor", + "twitterDescription": "Skriv om Proxmox VE-aviseringar på tydligt språk med OpenAI, Anthropic, Gemini, Groq, OpenRouter eller lokal Ollama." + }, + "header": { + "title": "AI-assistent", + "description": "Valfri AI-omskrivning gör lämpliga aviseringsmallar till tydliga meddelanden med detaljnivå per kanal, tretton språk i gränssnittet, egna promptar, ett offentligt communitybibliotek och berikad kontext. Rapporterna backup_complete och backup_fail går helt förbi AI.", + "section": "ProxMenux-övervakning" + }, + "intro": { + "title": "Avstängt som standard, aktiveras med ett reglage", + "body": "AI-omskrivning är avstängd som standard. Aktivera den under Inställningar → Aviseringar → Avancerat: AI-förbättring. Om kontextberikning eller omskrivning misslyckas skickas originalmallen. Varje omskrivning har högst 25 sekunders väntetid; därefter används mallen i stället för obegränsad väntan." + }, + "howItWorks": { + "heading": "Hur det fungerar", + "intro": "Händelser som Monitor skickar följer samma flöde. AI-omskrivning är ett valfritt steg mellan malltexten och sändningen till kanalen. En händelse går igenom fyra steg:", + "steps": [ + "Händelse och mall. En händelse kommer från en av sex insamlare och formateras av notification_templates.py till strukturerad vanlig text. Kanalen skulle skicka den texten om AI-omskrivning var avstängd.", + "Kontextberikning. Sändningsmodulen lägger vid behov till relevanta uppgifter: systemets drifttid vid kritiska systemfel, händelsefrekvens, SMART-data för diskhändelser, träffar i databasen med kända fel och loggrader.", + "Skapa prompten. Systemprompten byggs av mallen och kanalens inställningar: språk, detaljnivå, emoji-regler från Formaterade meddelanden och valfria AI-förslag. En egen prompt ersätter hela systemprompten. Användarmeddelandet innehåller malltext och berikade kontextblock.", + "Anrop till leverantören. Groq, OpenAI, Anthropic, Gemini, Ollama eller OpenRouter returnerar omskriven rubrik och meddelandetext. Sändningsmodulen tolkar svaret, ersätter innehållet för kanalen och skickar det via kanaladaptern." + ], + "notesIntro": "Tre detaljer värda att hålla fast vid innan du läser resten av denna sida:", + "notes": [ + "AI skapar inga händelser. Varje händelse kommer från en verklig signal, exempelvis en hälsokontroll, loggrad eller PVE-webhook. En mall formaterar texten innan AI ser den. AI översätter och formaterar, den övervakar inte systemet.", + "AI körs per kanal. Telegram och Discord kan få en kort omskrivning medan e-post får en detaljerad rapport: samma händelse i olika format, med ett leverantörsanrop per kanal.", + "Vid fel används mallen. Om leverantören returnerar ett 5xx-fel, överskrider tidsgränsen, ger felaktig utdata eller avvisar begäran loggar sändningsmodulen felet och skickar kanalens ursprungliga malltext." + ] + }, + "enabling": { + "heading": "Aktivera panelen", + "intro": "AI-inställningarna finns längst ned i panelen Aviseringar under fliken Inställningar, i det hopfällbara blocket Avancerat: AI-förbättring. Klicka på rubriken för att öppna det:", + "collapsedAlt": "Hopfälld rubrik för avancerade AI-inställningar med pilsymbol", + "collapsedCaption": "Hopfällt som standard; ett klick öppnar panelen.", + "panelAlt": "Utökad panel för AI-förbättringar med huvudreglage för AI-förbättrade meddelanden, leverantören Google Gemini, dold API-nyckel, modellen gemini-2.5-flash, standardläge för prompten, engelska som språk, detaljnivå per kanal för Telegram, Discord, Gotify och e-post samt reglage för AI-förslag och knappen Testa anslutning", + "panelCaption": "Hela AI-panelen: varje reglage som beskrivs på sidan motsvarar ett av fälten ovan.", + "outro": "Uppifrån: huvudreglaget AI-förbättrade meddelanden, leverantör med informationsruta, API-nyckel eller Ollama-URL, modellista hämtad efter nyckeln, läget Standard / Anpassat, språk, detaljnivå per kanal, AI-förslag och Testa anslutning, som skickar ett testmeddelande för att kontrollera inloggningsuppgifterna." + }, + "context": { + "heading": "Vilket sammanhang AI får", + "intro": "Innan prompten byggs väljer sändningsmodulen vilka extra uppgifter som är relevanta för händelsen. Syftet är att ge LLM tillräckligt underlag för ett användbart meddelande utan onödigt innehåll och onödiga kostnader. Fem kontextblock kan läggas till:", + "headerBlock": "Block", + "headerWhen": "När den injiceras", + "headerWhat": "Vad den bär", + "rows": [ + { + "block": "Systemuppetid", + "when": "Endast vid kritiska systemfel: crash, panic, oom, kernel, split_brain, quorum_lost, node_offline, node_fail, system_fail, boot_fail. Utelämnas vid diskfel, varningar och rutinåtgärder för att hålla prompten kort.", + "what": "En linje som System uptime: 14 days (stable system). Låt LLM skilja startproblem från långvariga misslyckanden." + }, + { + "block": "Händelsefrekvens", + "when": "När Monitor har sett samma händelsefingeravtryck tidigare.", + "what": "Antal förekomster, tid för första observationen och valfritt mönster: återkommande, enstaka eller topp. LLM använder uppgifterna för att skilja återkommande problem från den första observationen." + }, + { + "block": "SMART-data", + "when": "Endast för diskrelaterade händelser (händelse typ innehåller disk, smart, storage, io_error, eller kroppen nämner /dev/sd, ata, i/o error).", + "what": "Utgång av smartctl för den drabbade enheten - övergripande hälsa (PASSED / FAILED) plus relevanta attribut för felläget." + }, + { + "block": "Databas med kända fel", + "when": "När texten eller loggkontexten matchar ett Proxmox-specifikt felmönster som följer med Monitor.", + "what": "Ett KNOWN PROXMOX ERROR DETECTED-block med den matchade orsaken och en konkret lösning. Prompten instruerar LLM att översätta detta verbatim - ingen parafrasering av den rekommenderade fixen." + }, + { + "block": "Journalloggar", + "when": "När den ursprungliga insamlaren har fångat loggrader för händelsen, främst journal- och uppgiftsövervakningen.", + "what": "Obearbetade utdrag från journalctl. Prompten ber LLM att hämta ID:n, tidsstämplar och ledtrådar till grundorsaken och ignorera orelaterade poster." + } + ], + "afterBlocks": "När blocken har sammanfogats har användarmeddelandet till LLM följande form:", + "calloutTitle": "Ingen telemetri bortom själva händelsen", + "calloutBody": "Övervakaren skickar bara vad den har till hands för den aktuella händelsen - ingen systemomfattande telemetri, ingen historisk metrisk serie, inga lagerdumpar. De fem blocken ovan är den övre gränsen för vad som lämnar värden på en enda AI-rewrite." + }, + "tokens": { + "heading": "Tokens - vad de är och hur de konsumeras", + "intro1": "Kommersiella leverantörer tar betalt per token. En token motsvarar ungefär fyra engelska tecken eller tre fjärdedelar av ett ord. Den engelska frasen \"Backup completed on storage local-bak\" är omkring åtta token. Tio loggrader kan vara 200–400 token beroende på det tekniska innehållet.", + "intro2": "Två saker faktureras på varje samtal:", + "items": [ + "Indatatoken omfattar systemprompt och användarmeddelande med allvarlighetsgrad, rubrik, malltext och berikad kontext. Antalet beror på prompt och händelse. Varje omskriven kanal kan förbruka egna indatatoken; rapporter om slutförd eller misslyckad säkerhetskopiering går förbi AI.", + "Utdatatoken är modellens svar. Monitor begränsar dem med max_tokens. Taket är en gräns, inte fast förbrukning: ger modellen 250 token med gränsen 1500 betalar du för 250." + ], + "capsIntro": "Dessa är de gränser som sändningsmodulen använder, direkt från AI_DETAIL_TOKENS i notification_templates.py:", + "headerLevel": "detaljnivå", + "headerCap": "Utdatagräns (token)", + "headerConsumption": "Typisk faktisk förbrukning", + "capRows": [ + { + "level": "kortfattad", + "cap": "500", + "consumption": "50–200 utdatatoken för korta händelser." + }, + { + "level": "standard", + "cap": "1500", + "consumption": "200–700 utdatatoken för typiska händelser med begränsad kontext." + }, + { + "level": "detaljerad", + "cap": "3000", + "consumption": "500–2000 utdatatoken för fullständiga e-postrapporter med loggar och SMART-tabeller." + } + ], + "customNote": "Läget med egen prompt har en fast gräns på 500 utdatatoken oavsett detaljnivå. Du styr prompten och gränsen motverkar alltför långa svar.", + "sizingTitle": "Praktisk storlek", + "sizingBody": "Uppskatta förbrukningen som omskrivna händelser × AI-kanaler × in- och utdatatoken per anrop. Exempel: 50 händelser × en kanal × (500 indata + 300 utdata) = 40 000 token per dag. Förbrukning och kostnad beror på modell, kontext, cache och leverantörsgränser. Detaljnivå per kanal visar brief för chatt i stället för standard, med fortsatt detaljerad e-post." + }, + "providers": { + "heading": "AI-leverantörer", + "intro": "Monitor stöder sex leverantörer. Listrutan visar alla och informationsknappen bredvid öppnar en ruta med en kort beskrivning av varje. Nedan finns länkar för API-nycklar, gränssnittets beskrivningar och relevanta kodnoteringar.", + "imageAlt": "Informationsruta för sex AI-leverantörer: Groq, OpenAI, Anthropic Claude, Google Gemini, Ollama och OpenRouter, med ikon, kort beskrivning och anmärkning om OpenAI-kompatibla API:er", + "imageCaption": "Informationsrutan i appen: sex kort, ett per leverantör, med beskrivningarna nedan.", + "groq": { + "heading": "Groq", + "tagline": "Mycket snabb, generös fri nivå (30 req/min). Perfekt att börja.", + "items": [ + "API-nyckel: console.groq.com/keys", + "Exempel från den medföljande modellistan: allam-2-7b, qwen/qwen3.8-27b, openai/gpt-oss-20b, groq/compound-mini.", + "Medföljande rekommendation: openai/gpt-oss-20b. Kontrollera tillgängligheten för ditt konto med leverantörsväljaren och anslutningstestet." + ] + }, + "openai": { + "heading": "OpenAI", + "tagline": "Industristandard. Mycket exakt och allmänt används.", + "items": [ + "API-nyckel: platform.openai.com/api-keys", + "Exempel från den medföljande modellistan: gpt-4.1-nano, gpt-4.1-mini, gpt-4o-mini, gpt-4.1, gpt-4o, gpt-5-nano.", + "Medföljande rekommendation: gpt-4.1-nano. Adaptern hanterar även särskilda krav för resonemangsmodeller; listan innehåller gpt-5-nano, så sådana modeller är inte generellt uteslutna." + ], + "baseUrlTitle": "OpenAI-kompatibel bas URL", + "baseUrlBody": "OpenAI-leverantören accepterar en egen Bas-URL för kompatibla tjänster som BytePlus / ByteDance (Kimi K2.5), LocalAI, LM Studio, vLLM, Together AI och Fireworks AI, som stöder formatet /v1/chat/completions. Ange URL:en på OpenAI-fliken bredvid API-nyckeln." + }, + "anthropic": { + "heading": "Anthropic (Claude)", + "tagline": "Utmärkt för att skriva och översätta. Snabb och ekonomisk.", + "items": [ + "API-nyckel: console.anthropic.com/settings/keys", + "Exempel från den medföljande modellistan: claude-haiku-4-5-20251001, claude-sonnet-4-6, claude-opus-4-6.", + "Medföljande rekommendation: claude-haiku-4-5-20251001. Denna exakta version är rekommenderad; de äldre Claude 3.5-posterna finns inte längre i listan." + ] + }, + "gemini": { + "heading": "Google Gemini", + "tagline": "Gratis nivå tillgänglig, bra kvalitet / priskvot.", + "items": [ + "API-nyckel: aistudio.google.com/app/apikey", + "Exempel från den medföljande modellistan: gemini-2.5-flash-lite, gemini-2.5-flash, gemini-3-flash-preview.", + "Rekommenderas: gemini-2.5-flash-lite - flash och flash-lite passerar verifiern konsekvent. Pro-varianterna avvisar thinkingBudget=0-inställningen Monitor använder och är överkill för denna arbetsbelastning." + ] + }, + "openrouter": { + "heading": "OpenRouter", + "tagline": "Aggregator med tillgång till 100+-modeller med en enda API-nyckel. maximal flexibilitet.", + "items": [ + "API-nyckel: openrouter.ai/keys", + "Exempel från den medföljande modellistan: meta-llama/llama-3.3-70b-instruct, meta-llama/llama-3.1-70b-instruct, meta-llama/llama-3.1-8b-instruct, anthropic/claude-haiku-4.5, google/gemini-2.5-flash-lite, openai/gpt-4o-mini, mistralai/mistral-medium-3.", + "Rekommenderas: meta-llama/llama-3.3-70b-instruct - samma modell som Groq-posten men dirigeras genom OpenRouter, vilket innebär en enda nyckel för alla listade modeller." + ] + }, + "ollama": { + "heading": "Ollama (lokal)", + "tagline": "Använder modeller som din konfigurerade Ollama-server visar. Lokala modeller körs där; Ollamas molnmodeller vidarebefordrar anrop till en molnleverantör. Lokal körning undviker avgifter för ett hostat API men använder egen hårdvara och el.", + "items": [ + "Ingen API nyckel. Ställ in Ollama URL-fältet till din server (standard http://localhost:11434 eller vilken värd som helst kör din Ollama-instans).", + "Modellerna filtreras inte. Monitor läser modeller som hämtats med ollama pull <model>. Listrutan hämtas från GET /api/tags på din Ollama-server.", + "Installation: ollama.com/download — Linux, macOS och Windows. Välj en modell som ryms i RAM och har tillräckligt kontextfönster för loggblocken som sändningsmodulen lägger till." + ] + } + }, + "models": { + "heading": "Varför dessa specifika modeller", + "intro": "Modellvalen för kommersiella leverantörer använder katalogen verified_ai_models.json och adaptrarnas tillgänglighetskontroller. Adaptrarna översätter den interna begäran system_prompt + user_message + max_tokens till respektive API-format. Katalogen innehåller testade och manuellt tillagda poster; den garanterar varken aktuell kontoåtkomst eller samma verifiering för varje post.", + "consequencesIntro": "Två konsekvenser värt att vara medveten om:", + "consequences": [ + "Den medföljande rekommendationen är en utgångspunkt för aviseringar. Bedöm språkkvalitet, latens och kostnad för dina händelser och ditt konto; den är ingen allmän modellrankning.", + "Du kan välja en annan listad modell efter kvot eller önskemål. Kontrollera tillgängligheten med anslutningstestet; en listning garanterar inte aktuell åtkomst för ditt konto." + ], + "ollamaTitle": "Ollama är undantaget", + "ollamaBody": "Ollamas lista filtreras inte av den kommersiella katalogen; den visar serverns modeller. Välj en lokal modell som ryms i RAM och har kontext för loggblocken för lokal körning. Molnmodeller är fortfarande fjärrmodeller även via en lokal Ollama-server." + }, + "defaultPrompt": { + "heading": "Standardprompt", + "intro": "I läget Standard använder Monitor systemprompten nedan. Före anropet ersätts platshållarna: '{'language'}', '{'detail_level'}', '{'emoji_instructions'}', '{'suggestions_addon'}'. Därefter visas varianter för formaterade och enkla kanaler samt tillägget med AI-förslag.", + "showFullSummary": "Visa hela standardsystemprompten", + "passagesIntro": "Två textvarianter väljs utifrån reglaget Formaterade meddelanden för varje kanal:", + "passages": [ + "Formatering på → ett block listar tillåtna emoji, kräver att värdnamnsprefixet i rubriken bevaras exakt och visar exempel: start och slutförande av säkerhetskopiering, uppdateringar, VM-start och försämrad hälsa. Det ger emoji i början av meddelanden i Telegram och Discord.", + "Formatering av → ett kort block begär vanlig ASCII utan emoji eller Unicode-symboler. Det används för e-post och kanaler där extra formatering stör inkorgsregler eller läsbarhet." + ], + "suggestionsPlaceholder": "Och '{'suggestions_addon'}' platshållare är tom om du inte aktiverar AI-förslag (nästa avsnitt), i vilket fall detta block injiceras:", + "showAddonSummary": "Visa tillägget med AI-förslag" + }, + "customPrompt": { + "heading": "Anpassat uppmaningsläge", + "intro": "Läget Anpassat ersätter hela standardsystemprompten med din egen text. Den sparas i SQLite-inställningarna och skickas oförändrad vid varje AI-anrop. Då kan du välja en annan ton, struktur eller inriktning.", + "imageAlt": "Egen prompt med textfält för översättningsregler, knappar för export och import samt länk till communitypromptar", + "imageCaption": "Custom Prompt - stor textarea med användarens prompt, plus Export, Import och en länk till gemenskapsgalleriet på GitHub.", + "changesTitle": "Vad som ändras i anpassat läge", + "changes": [ + "Standardprompten ersätts helt. Proxmox-mappningar, kontextregler och emoji-instruktioner följer inte med. Klistra in dem i din egen prompt om du vill behålla dem. Medföljande EXAMPLE_CUSTOM_PROMPT nedan är en utgångspunkt.", + "Språkväljaren ignoreras. Standardprompten har platshållaren '{'language'}', den egna prompten har det inte. Ange språket i instruktionen, exempelvis ”Översätt till spanska” eller ”Skriv allt på franska”.", + "Anpassat läge har en fast gräns på 500 token, oavsett sparad detaljnivå per kanal. Standardläget använder 500 / 1500 / 3000. Att ändra prompten höjer inte gränsen; begär ett kortare svar eller välj en lämplig standardnivå.", + "Utdatamarkörerna är fortfarande obligatoriska. Inkludera [TITLE] och [BODY] i svarsformatet. Parsern hämtar innehållet; saknas en markör används originalmallen.", + "Emoji-regler för formaterade meddelanden läggs inte till automatiskt. Ange i din egen prompt om emoji ska användas eller undvikas för vanlig text. Reglaget styr bara standardblocken, inte din text." + ], + "starterTitle": "Startprompt", + "starterIntro": "Textfältet Egen prompt är förifyllt med ett enkelt exempel som du kan anpassa:", + "showStarterSummary": "Visa exempel på egen prompt", + "shareTitle": "Dela promptar med communityn", + "shareIntro": "Exportera sparar din prompt i en fil (.txt / .md) för säkerhetskopiering eller delning. Importera läser in en fil. Den tredje knappen öppnar det offentliga communitygalleriet på GitHub:", + "shareLinkLabel": "github.com/MacRimi/ProxMenux/discussions — Dela egna promptar för AI-aviseringar", + "shareOutro": "Läs diskussionen för att se andra administratörers promptar: korta larm, utförliga tekniska rapporter och språkvarianter. Dela din egen variant om du är nöjd, gärna med ett stycke om syftet. Återkoppling om vad som fungerar och inte fungerar är också välkommen." + }, + "suggestions": { + "heading": "AI-förslag (BETA)", + "intro": "AI-förslag kan lägga till ett kort och användbart tips sist i texten. Läget Standard, AI-huvudreglaget och AI-förslag måste vara aktiva. Prompten ber modellen utelämna tipset om orsaken eller lösningen är oklar.", + "formatIntro": "När ett tips läggs till följer det detta exakta format:", + "rulesIntro": "Reglerna bakade i tillägget (synliga i det kollapsbara blocket under standardpromptavsnittet ovan):", + "rules": [ + "Tipset tas med endast om loggkontexten eller databasen med kända fel tydligt pekar på en konkret lösning.", + "Prompten begär ett tips under 100 tecken; parsern kontrollerar inte längden separat.", + "Prompten kräver ett konkret kommando eller en sökväg och ber modellen undvika allmänna råd.", + "Om ett känt fel ger en lösning, måste LLM använda den lösningen, inte uppfinna en ny.", + "Prompten ber modellen utelämna tipset om underlaget inte stöder en konkret lösning." + ], + "betaTitle": "Varför BETA", + "betaBody": "Tipsens kvalitet beror på modellen och loggkontexten. En modell som Claude 3.5 Haiku, GPT-4.1 Mini eller Llama 3.3 70B med smartctl-data och loggrader kan ge användbara tips. En liten lokal Ollama-modell med en enda händelserad kan ge ett svagt resultat eller inget tips. Stäng av förslagen om de stör och aktivera dem igen när du vill." + }, + "detailLevel": { + "heading": "Detaljnivå per kanal", + "intro": "Telegram, Discord, Gotify och e-post har varsin detaljväljare. Tre värden styr gränsen för utdatatoken och instruktionerna i standardprompten:", + "headerLevel": "Nivå", + "headerLabel": "UI-märkning", + "headerCap": "Utdatagräns", + "headerProduce": "Vad prompten ber LLM att skriva", + "rows": [ + { + "level": "kortfattad", + "label": "2–3 rader, bara det väsentliga", + "cap": "500 token", + "produce": "\"Vad hände + var\". Inget annat." + }, + { + "level": "standard", + "label": "Koncis med grundläggande sammanhang", + "cap": "1500 token", + "produce": "3–6 rader: vad, var, orsak och berörda enheter." + }, + { + "level": "detaljerad", + "label": "Fullständiga tekniska detaljer", + "cap": "3000 token", + "produce": "Fullständig rapport: vad, var, orsak, berörda enheter, loggar, SMART-data och historik." + } + ], + "defaultsIntro": "Standarder som Monitorn tillämpar på första installationen:", + "defaults": [ + "Telegram, Discord, Gotify — standard.", + "E-post — detailed. E-post är den kanal där du vanligtvis vill ha hela bilden för arkiv." + ], + "emailTitle": "Detaljerad e-post lägger till originalet", + "emailBody": "Om AI-formateraren returnerar ett resultat för e-post med detailed och originaltexten är längre än 50 tecken läggs den till efter 40 bindestreck och Original message:. Det bevarar detaljer för senare sökningar. När AI hoppas över eller misslyckas kan bara originalmallen skickas." + }, + "language": { + "heading": "Språk", + "intro": "Gränssnittets väljare erbjuder tretton språk. Den sparar ai_language, som standardprompten använder i \"translate alerts into '{'language'}'\". Listan:", + "list": "Engelska (en), slovakiska (sk), spanska (es), franska (fr), tyska (de), portugisiska (pt), italienska (it), ryska (ru), svenska (sv), norska (no), japanska (ja), kinesiska (zh), nederländska (nl).", + "rulesIntro": "Två viktiga regler som tagits direkt från prompten:", + "rules": [ + "Översätt: etiketter, beskrivningar, statusord och enheter, exempelvis GB → Go på franska.", + "Översätt inte: värdnamn, IP-adresser, sökvägar, VM/CT-ID:n, enhetsnamn som /dev/sdX och tekniska identifierare. De bevaras exakt oavsett språk." + ], + "customNote": "Egen prompt använder inte språkväljaren. Ange önskat utdataspråk direkt i din prompt." + }, + "templates": { + "heading": "En anteckning på mallar", + "body1": "AI får färdig malltext, inte rå händelsedata. Typer som vm_start, auth_fail och health_degraded har mallar i notification_templates.py. AI skriver om lämpliga mallutdata; backup_complete och backup_fail behåller deterministiska rapporter utan AI.", + "body2": "Två praktiska konsekvenser: AI ser aldrig ett värdnamn eller VMID det måste uppfinna - dessa fält placeras av mallen innan omskrivningen. Och om AI är inaktiverad är den mallade kroppen det som skickas direkt. Notifications-sidan dokumenterar sändningspipeline i sin helhet och är rätt korsreferens för allt som händer en händelse innan det når detta lager." + }, + "privacy": { + "heading": "Integritet och dataflöde", + "intro": "Med AI-omskrivning aktiverad skickar Monitor malltext och berikade kontextblock till leverantören. Det kan innehålla värdnamn, IP-adresser, användarnamn, enhetssökvägar, loggrader och SMART-attribut för berörd enhet. Om uppgifterna lämnar värden beror på leverantören:", + "headerProvider": "Leverantör", + "headerDestination": "Datadestination", + "rows": [ + { + "provider": "Ollama", + "destination": "Lokala modeller körs på den konfigurerade Ollama-värden. Är det själva Proxmox-noden stannar deras anrop där. Ollamas molnmodeller skickar anrop utanför värden även via en lokal Ollama-server." + }, + { + "provider": "OpenAI", + "destination": "api.openai.com som standard eller en egen bas-URL. Den faktiska endpointoperatörens datapolicy gäller." + }, + { + "provider": "Anthropic", + "destination": "api.anthropic.com." + }, + { + "provider": "Google Gemini", + "destination": "generativelanguage.googleapis.com." + }, + { + "provider": "Groq", + "destination": "api.groq.com." + }, + { + "provider": "OpenRouter", + "destination": "openrouter.ai vidarebefordrar till modellleverantören som valts i fältet model. Två steg i stället för ett." + } + ], + "calloutTitle": "Om händelseinnehåll inte kan lämna nätverket", + "calloutBody": "Använd en lokalt hostad endpoint med lokal modell, som lokal Ollama eller en OpenAI-kompatibel server, eller stäng av AI. Ollamas molnmodeller behandlar inte data lokalt. Sändningsmodulen anonymiserar inte värdnamn eller IP-adresser; prompten byggs av händelsens verkliga innehåll." + }, + "whereNext": { + "heading": "Gå vidare", + "items": [ + { + "label": "Aviseringar", + "href": "/docs/monitor/notifications", + "tail": " — sändningsflödet, kanaler, händelsereglage och PVE-webhookintegrationen kring denna del." + }, + { + "label": "Hälsoövervakare", + "href": "/docs/monitor/health-monitor", + "tail": " — den största enskilda källan till händelser som AI skriver om, med egna undertryckningstider per kategori." + }, + { + "label": "Arkitektur", + "href": "/docs/monitor/architecture", + "tail": " - där AI Enhancer passar in i den bredare övervakningsprocessen (det är en modul, inte en separat tjänst)." + } + ], + "communityLabel": "Communitypromptar på GitHub", + "communityTail": " — Bläddra, dela, fråga." + } +} diff --git a/web/messages/sv/docs/monitor/api-reference.json b/web/messages/sv/docs/monitor/api-reference.json new file mode 100644 index 00000000..0fd9db90 --- /dev/null +++ b/web/messages/sv/docs/monitor/api-reference.json @@ -0,0 +1,760 @@ +{ + "meta": { + "title": "Proxmox Monitor-API — Integrationsreferens | ProxMenux", + "description": "HTTP-slutpunkter i ProxMenux Monitor för Home Assistant, Homepage, Grafana, Prometheus, n8n och egna paneler. Läs status och anropa dokumenterade åtgärder: VM-styrning, säkerhetskopiering, aviseringar och bekräftelse av varningar.", + "ogTitle": "Proxmox Monitor-API — Integrationsreferens", + "ogDescription": "ProxMenux Monitor-slutpunkter för Home Assistant, Homepage, Grafana, Prometheus, n8n och egna paneler.", + "twitterTitle": "Proxmox Monitor-API | ProxMenux", + "twitterDescription": "Slutpunkter för Home Assistant, Homepage, Grafana, Prometheus, n8n och egna paneler." + }, + "header": { + "title": "API-referens", + "description": "HTTP-slutpunkter för att läsa status och anropa dokumenterade åtgärder: Home Assistant-sensorer, Homepage-kort, Grafana-paneler, Prometheus-insamling, n8n-flöden och egna skript. Med kategorier, exporterade mätvärden och curl-exempel.", + "section": "ProxMenux Monitor" + }, + "intro": { + "title": "Vad sidan används till", + "body": "Sidan samlar slutpunkter för integrationer: dataläsning, start av säkerhetskopiering, egna aviseringar och bekräftelse av varningar. API:t körs i panelens Flask-process på TCP 8008. Bindningsadress och TLS beskrivs i Åtkomst och autentisering." + }, + "headerEndpoint": "Slutpunkt", + "headerMethod": "Metod", + "headerUse": "Användning", + "auth": { + "heading": "Autentisering", + "intro": "När autentisering är på väntar skyddade slutpunkter ett JWT Bearer-token i begärans header:", + "tokensIntro": "Två sätt att få token:", + "items": [ + "API-token, rekommenderade för integrationer. Giltiga i 365 dagar, skapade under Säkerhet → API-token. De namnges och kan återkallas var för sig. Använd read_only för data och full_admin bara för nödvändiga administrationsåtgärder.", + "Inloggning, JWT i 24 timmar. POST /api/auth/login med användarnamn, lösenord och TOTP när 2FA kräver det. JWT:t går ut efter 24 timmar; skript måste då autentisera igen." + ], + "flowLink": "Inloggning, lösenord, 2FA, granskningslogg och TLS beskrivs i Åtkomst och autentisering.", + "rows": [ + { + "endpoint": "/api/auth/login", + "method": "POST", + "use": "Fält i begäran (schema): '{'\"username\",\"password\",\"totp_token?\"'}'. Returnerar ett JWT för 24 timmar." + }, + { + "endpoint": "/api/auth/api-tokens", + "method": "GET", + "use": "Lista API tokens (endast metadata - namn, prefix, datum; aldrig den faktiska hemligheten)." + }, + { + "endpoint": "/api/auth/generate-api-token", + "method": "POST", + "use": "Skapar ett API-token för 365 dagar i en autentiserad session. Fält: password, token_name?, totp_token?, scope?. Lösenord och krävd TOTP kontrolleras igen. scope är read_only som standard; full_admin måste väljas uttryckligen. Hemligheten returneras bara en gång." + }, + { + "endpoint": "/api/auth/api-tokens/", + "method": "DELETE", + "use": "Återkalla en specifik API token av dess ID." + } + ] + }, + "conventions": { + "heading": "Konventioner", + "items": [ + "De flesta använder JSON. Nedladdningar kan ge vanlig text; /api/prometheus använder Prometheus textformat 0.0.4 i stället för OpenMetrics. Kontrollera svarstypen för den aktuella slutpunkten.", + "Många skrivningar returnerar '{'\"success\": true, ...'}'. Felformat varierar; ett vanligt format är '{'\"success\": false, \"error\": \"'<'reason'>'\"'}'. Kontrollera HTTP-status och fält: vissa autentiseringsutmaningar använder HTTP 200 med success false.", + "Frågeparametrar varierar per slutpunkt. Använd limit, offset, since och kategorifilter bara där de stöds.", + "Tidsformat varierar: Unix-tidsstämplar, ISO-8601-strängar och systemd-datum förekommer. Anta inte samma enhet eller uttrycklig tidszon för alla fält." + ] + }, + "system": { + "heading": "System & hårdvara", + "rows": [ + { + "endpoint": "/api/system", + "method": "GET", + "use": "Aktuella värden för CPU, minne, swap, drifttid och belastning." + }, + { + "endpoint": "/api/info", + "method": "GET", + "use": "Statisk värdinformation: värdnamn, kärna, PVE-version, CPU-modell och distribution." + }, + { + "endpoint": "/api/system-info", + "method": "GET", + "use": "Utökade systemdata för panelens sidhuvud: övergripande mätvärden och starttid." + }, + { + "endpoint": "/api/hardware", + "method": "GET", + "use": "Detaljerad maskinvaruinventering: PCI-enheter, GPU:er och sensorer." + }, + { + "endpoint": "/api/hardware/live", + "method": "GET", + "use": "Aktuella värden från sensorer som ändras snabbt." + }, + { + "endpoint": "/api/temperature/history", + "method": "GET", + "use": "Tidsserier för CPU- och kapslingstemperatur." + }, + { + "endpoint": "/api/gpu//realtime", + "method": "GET", + "use": "Aktuella GPU-mätvärden för NVIDIA, Intel och AMD per PCI-plats." + } + ] + }, + "actions": { + "heading": "Systemåtgärder", + "intro": "Dessa asynkrona systemåtgärder körs i tillfälliga systemd-enheter. Med autentisering på kräver skrivningar full_admin; read_only kan läsa .../status. Godkänd start ger HTTP 202 och status; läs .../status för förloppet. Gäststyrning och säkerhetskopiering har andra svar som beskrivs nedan.", + "shapeTitle": "Vanlig svarsform", + "shapeIntro": "Asynkrona systemåtgärder delar JSON-statusobjektet nedan. Gäststyrning och säkerhetskopiering har andra format:", + "shapeCode": "{\n \"unit\": \"proxmenux-action-pve-update.service\",\n \"state\": \"idle | running | success | failed | cancelled\",\n \"started_at\": \"Sat 2026-08-01 11:01:32 CEST\",\n \"finished_at\": null,\n \"exit_code\": null,\n \"result\": null\n}", + "concurrencyTitle": "Samtidig körning och avbrott", + "concurrencyBody": "En ny start av samma aktiva åtgärd ger HTTP 409. Avbrott finns bara med dokumenterad DELETE-slutpunkt, som för PVE-uppdatering. Status blir cancelled med bevarade tidsstämplar. Slutstatus ligger i processminnet och kan försvinna när Monitor startas om.", + "rows": [ + { + "endpoint": "/api/system/power/reboot", + "method": "POST", + "use": "Startar om Proxmox-värden. HTTP-anslutningen kan stängas när systemd börjar avstängningen." + }, + { + "endpoint": "/api/system/power/reboot/status", + "method": "GET", + "use": "Status för aktuell eller senaste omstart." + }, + { + "endpoint": "/api/system/power/shutdown", + "method": "POST", + "use": "Stänger av Proxmox-värden, exempelvis som svar på en avstängningssignal från UPS." + }, + { + "endpoint": "/api/system/power/shutdown/status", + "method": "GET", + "use": "Status för aktuell eller senaste avstängning." + }, + { + "endpoint": "/api/system/pve-update/run", + "method": "POST", + "use": "Startar samma PVE-uppdatering som Uppdatera nu i Health Monitor och skalmenyn; anropar update-pve-safe.sh." + }, + { + "endpoint": "/api/system/pve-update/status", + "method": "GET", + "use": "Status för aktuell eller senaste PVE-uppdatering." + }, + { + "endpoint": "/api/system/pve-update", + "method": "DELETE", + "use": "Avbryter en pågående PVE-uppdatering med SIGTERM." + }, + { + "endpoint": "/api/proxmenux/self-update/run", + "method": "POST", + "use": "Uppdaterar ProxMenux med installationsprogrammet för vald stabil- eller betakanal. En egen systemd-enhet låter jobbet fortsätta när installationsprogrammet startar om proxmenux-monitor." + }, + { + "endpoint": "/api/proxmenux/self-update/status", + "method": "GET", + "use": "Status för aktuell eller senaste ProxMenux-uppdatering." + }, + { + "endpoint": "/api/vms//control", + "method": "POST", + "use": "Skickar en styrorder för VM eller LXC. Fältet action accepterar start, stop, shutdown eller reboot. Ett lyckat svar ger en bekräftad PVE-uppgift, men betyder inte att den är klar. Läs gästens control-task-slutpunkt för resultatet." + }, + { + "endpoint": "/api/vms//backup", + "method": "POST", + "use": "Skapar en vzdump-säkerhetskopia av VM eller LXC. Valfria fält att anpassa till lagringen: storage (PVE-mål), mode (snapshot, suspend eller stop), compress (zstd, lzo, gzip eller none), protected (true eller false), notes, notification (auto, always, failure eller never) och pbs_change_detection (default, legacy eller data). Returnerar PVE-uppgiftens UPID." + }, + { + "endpoint": "/api/vms//backups", + "method": "GET", + "use": "Lista tidigare säkerhetskopior för en VM eller LXC över alla tillgängliga lager." + } + ], + "syncVsAsyncTitle": "Två typer av åtgärder", + "syncVsAsyncBody": "Värdens strömstyrning och uppdateringar använder tillfälliga systemd-enheter med .../status. Bara PVE-uppdatering har här en DELETE-slutpunkt för avbrott. VM/LXC-styrning ger en uppgift att följa; säkerhetskopiering ger ett UPID för ett bakgrundsjobb. Godkännande betyder inte slutförande. Autentisering och behörighet beror på slutpunkten.", + "curlTitle": "curl-exempel", + "curlBody": "Startar en PVE-uppdatering och följer den tills den är klar, som en Home Assistant-automation eller en Ansible-playbook.", + "curlCode": "TOKEN=\n\ncurl -sSf -X POST \\\n -H \"Authorization: Bearer $TOKEN\" \\\n https://:8008/api/system/pve-update/run\n\nwhile true; do\n state=$(curl -sSf -H \"Authorization: Bearer $TOKEN\" \\\n https://:8008/api/system/pve-update/status | jq -r .state)\n [ \"$state\" != \"running\" ] && break\n sleep 30\ndone\necho \"final state: $state\"", + "haTitle": "Exempel för Home Assistant", + "haBody": "En rest-sensor läser status och rest_command startar uppdateringen. Koppla dem till en panelknapp och önskade automationer:", + "haCode": "# configuration.yaml\nsensor:\n - platform: rest\n resource: https://pve.local:8008/api/system/pve-update/status\n name: pve_update_state\n value_template: \"{{ value_json.state }}\"\n scan_interval: 60\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\nrest_command:\n pve_update:\n url: https://pve.local:8008/api/system/pve-update/run\n method: POST\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\n # Start VM 100 (works for LXC too — same endpoint)\n vm_100_start:\n url: https://pve.local:8008/api/vms/100/control\n method: POST\n content_type: 'application/json'\n payload: '{\"action\": \"start\"}'\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\n # Backup VM 100 to the 'pbs-main' storage\n vm_100_backup:\n url: https://pve.local:8008/api/vms/100/backup\n method: POST\n content_type: 'application/json'\n payload: '{\"storage\": \"pbs-main\", \"mode\": \"snapshot\", \"compress\": \"zstd\"}'\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"" + }, + "health": { + "heading": "Hälsoövervakare", + "rows": [ + { + "endpoint": "/api/health", + "method": "GET", + "use": "Lätt kontroll som ger JSON med status, timestamp och version. Lämplig för nyckelordskontroll i Uptime Kuma; med autentisering på måste klienten skicka Bearer-headern." + }, + { + "endpoint": "/api/health/status", + "method": "GET", + "use": "Övergripande status: en allvarlighetsgrad och en sammanfattning." + }, + { + "endpoint": "/api/health/details", + "method": "GET", + "use": "Alla tio kategorier med status och strukturerade data från varje kontroll." + }, + { + "endpoint": "/api/health/full", + "method": "GET", + "use": "Fullständiga data: kategorier, aktiva fel, avfärdade varningar och inställningar för undertryckning. Använder bakgrundsresultat yngre än sex minuter; annars eller vid tvingad uppdatering körs en ny kontroll." + }, + { + "endpoint": "/api/health/active-errors", + "method": "GET", + "use": "Aktiv lista, filtrerad av ?category=<name>." + }, + { + "endpoint": "/api/health/dismissed", + "method": "GET", + "use": "Avfärdade varningar med återstående timmar av undertryckning." + }, + { + "endpoint": "/api/health/settings", + "method": "GET", + "use": "Konfigurerad tid för undertryckning per kategori." + }, + { + "endpoint": "/api/health/remote-storages", + "method": "GET", + "use": "Inventering av fjärrlagring definierad i Proxmox, med tillgänglighetsstatus." + }, + { + "endpoint": "/api/health/interfaces", + "method": "GET", + "use": "Nätverksgränssnitt med typ (brygga / bond / fysiskt), IP och länkhastighet." + }, + { + "endpoint": "/api/health/acknowledge", + "method": "POST", + "use": "Begärans innehåll: '{'\"error_key\":\"smart_sdh\"'}'. Undertrycker en varning under kategorins inställda tid." + }, + { + "endpoint": "/api/health/cleanup-orphans", + "method": "POST", + "use": "Manuell rensning av fel vars underliggande enhet eller VM är borta. Idempotent." + } + ], + "outro": "Svarsformat och kategorier beskrivs i Health Monitor." + }, + "storage": { + "heading": "Lagring", + "rows": [ + { + "endpoint": "/api/storage", + "method": "GET", + "use": "Diskar som är synliga för värden: blockenheter, ZFS-pooler och LVM." + }, + { + "endpoint": "/api/storage/summary", + "method": "GET", + "use": "Kompakt sammanfattning som används av instrumentpanelkort." + }, + { + "endpoint": "/api/proxmox-storage", + "method": "GET", + "use": "Lagring definierad i /etc/pve/storage.cfg, med tillgänglighetsstatus och ledigt utrymme." + }, + { + "endpoint": "/api/storage/observations", + "method": "GET", + "use": "Beständig observationshistorik: SMART-varningar, I/O-fel och ZFS-händelser. Bevaras efter automatisk lösning av varningar." + }, + { + "endpoint": "/api/storage/smart/", + "method": "GET", + "use": "Nuvarande SMART attribut för en disk." + }, + { + "endpoint": "/api/storage/smart//latest", + "method": "GET", + "use": "Senaste SMART självtest för disken." + }, + { + "endpoint": "/api/storage/smart//history", + "method": "GET", + "use": "Lista över lagrade SMART-rapporter för disken." + }, + { + "endpoint": "/api/storage/smart//history/", + "method": "GET", + "use": "Läs en specifik lagrad SMART-rapport." + }, + { + "endpoint": "/api/storage/smart//test", + "method": "POST", + "use": "Startar ett SMART-självtest. Schema för begäran: '{'\"type\":\"short\"|\"long\"'}'." + }, + { + "endpoint": "/api/storage/smart/schedules", + "method": "GET", + "use": "Lista de schemalagda SMART-testerna." + }, + { + "endpoint": "/api/storage/smart/tools", + "method": "GET", + "use": "Kontrollerar om smartctl och relaterade verktyg är installerade." + } + ] + }, + "network": { + "heading": "Nätverk", + "rows": [ + { + "endpoint": "/api/network", + "method": "GET", + "use": "Alla gränssnitt med länkstatus och adresser." + }, + { + "endpoint": "/api/network/summary", + "method": "GET", + "use": "Kompakt vy för panelen." + }, + { + "endpoint": "/api/network//metrics", + "method": "GET", + "use": "RX/TX per gränssnitt, felräknare och RRD-tidsserier." + }, + { + "endpoint": "/api/network/latency/current", + "method": "GET", + "use": "Senaste latensmätning till gatewayen." + }, + { + "endpoint": "/api/network/latency/history", + "method": "GET", + "use": "Tidsserie av gateway latens." + } + ] + }, + "vms": { + "heading": "VM och containrar", + "rows": [ + { + "endpoint": "/api/vms", + "method": "GET", + "use": "VM och CT på den lokala noden med status, vmid och namn." + }, + { + "endpoint": "/api/vms/", + "method": "GET", + "use": "Full detalj för en gäst (konfig, nätverk, diskar)." + }, + { + "endpoint": "/api/vms//metrics", + "method": "GET", + "use": "CPU / minne / disk I / O tidsserie för en gäst (RRD)." + }, + { + "endpoint": "/api/vms//logs", + "method": "GET", + "use": "Loggar för gästens senaste uppgifter." + }, + { + "endpoint": "/api/vms//backups", + "method": "GET", + "use": "Säkerhetskopior som sparats för den här gästen." + }, + { + "endpoint": "/api/vms//control", + "method": "POST", + "use": "Välj en åtgärd i schemat: '{'\"action\":\"start|stop|reboot|shutdown\"'}'. Styr gästens strömtillstånd." + }, + { + "endpoint": "/api/vms//backup", + "method": "POST", + "use": "Startar vzdump för gästen. Innehållet väljer lagring och läge (snapshot / suspend / stop)." + }, + { + "endpoint": "/api/vms//config", + "method": "PUT", + "use": "Uppdatera beskrivningsfältet (noter) av en VM / CT. Andra konfignycklar är inte modifierbara från denna slutpunkt." + }, + { + "endpoint": "/api/node/metrics", + "method": "GET", + "use": "Aggregerade nodmätvärden som RRD-tidsserier." + } + ] + }, + "backups": { + "heading": "Säkerhetskopieringar", + "rows": [ + { + "endpoint": "/api/backups", + "method": "GET", + "use": "Säkerhetskopior i dir-, NFS-, CIFS- och PBS-lagring som frågas via den lokala noden. Ingen fullständig genomsökning av alla klusternoder." + }, + { + "endpoint": "/api/backup-storages", + "method": "GET", + "use": "Lagring markerad som mål för säkerhetskopiering, med ledigt utrymme." + } + ] + }, + "logs": { + "heading": "Loggar, uppgifter, händelser", + "rows": [ + { + "endpoint": "/api/logs", + "method": "GET", + "use": "Filtrerade journalposter. Query: ?level=&service=&limit=" + }, + { + "endpoint": "/api/logs/download", + "method": "GET", + "use": "Exporterar det filtrerade intervallet som vanlig text." + }, + { + "endpoint": "/api/events", + "method": "GET", + "use": "Intern händelseström - samma som matar meddelanden." + }, + { + "endpoint": "/api/task-log/", + "method": "GET", + "use": "Fullständig logg i vanlig text för en Proxmox-uppgift identifierad med UPID." + } + ] + }, + "notifications": { + "heading": "Aviseringar och AI", + "intro": "Sändning, kanaler och AI-omformulering beskrivs i Aviseringar och AI-assistent.", + "rows": [ + { + "endpoint": "/api/notifications", + "method": "GET", + "use": "Senaste aviseringar som visas på panelen." + }, + { + "endpoint": "/api/notifications/download", + "method": "GET", + "use": "Exporterar aviseringar som text." + }, + { + "endpoint": "/api/notifications/status", + "method": "GET", + "use": "Sändningsstatus: aktiv bakgrundsprocess, kölängd och senaste sändning." + }, + { + "endpoint": "/api/notifications/settings", + "method": "GET", + "use": "Läser aviseringsinställningar: kanaler, händelsereglage, AI-omformulering och visningsnamn." + }, + { + "endpoint": "/api/notifications/history", + "method": "GET", + "use": "Sändningshistorik. Parametrar: ?limit=&offset=&severity=&channel=." + }, + { + "endpoint": "/api/notifications/history", + "method": "DELETE", + "use": "Tömmer tabellen för sändningshistorik." + }, + { + "endpoint": "/api/notifications/test", + "method": "POST", + "use": "Skickar en testavisering till en kanal. Begärans innehåll: '{'\"channel\":\"telegram\"'}'." + }, + { + "endpoint": "/api/notifications/send", + "method": "POST", + "use": "Skapar en egen händelse. Begärans innehåll: '{'\"event_type\":\"custom\",\"severity\":\"WARNING\",\"title\":\"...\",\"body\":\"...\",\"data\":'{''}''}'." + }, + { + "endpoint": "/api/notifications/test-ai", + "method": "POST", + "use": "Testar anslutningen till AI-leverantören. Fält i begäran (schema): '{'\"provider\",\"api_key\",\"model\",\"ollama_url?\"'}'." + }, + { + "endpoint": "/api/notifications/provider-models", + "method": "POST", + "use": "Lista tillgängliga modeller för den valda AI-leverantören." + }, + { + "endpoint": "/api/notifications/proxmox/setup-webhook", + "method": "POST", + "use": "Registrera Monitor som ett webhook-mål i /etc/pve/notifications.cfg." + }, + { + "endpoint": "/api/notifications/proxmox/cleanup-webhook", + "method": "POST", + "use": "Tar bort Monitor-målet från PVE:s aviseringsinställningar." + }, + { + "endpoint": "/api/notifications/proxmox/read-cfg", + "method": "GET", + "use": "Läs PVE: s nuvarande notifications.cfg som PVE ser det." + } + ] + }, + "security": { + "heading": "Säkerhet (läs)", + "rows": [ + { + "endpoint": "/api/security/firewall/status", + "method": "GET", + "use": "PVE brandvägg och aktiva regler." + }, + { + "endpoint": "/api/security/fail2ban/details", + "method": "GET", + "use": "Status för Fail2Ban-jail; kräver att den valfria komponenten är installerad." + }, + { + "endpoint": "/api/security/fail2ban/activity", + "method": "GET", + "use": "Senaste Fail2Ban-händelser: blockeringar, hävda blockeringar och jailstarter." + }, + { + "endpoint": "/api/security/lynis/status", + "method": "GET", + "use": "Lynis-status: installation och tidpunkt för senaste kontroll." + }, + { + "endpoint": "/api/security/lynis/report", + "method": "GET", + "use": "Senaste Lynis-rapport: varningar, förslag och härdningsindex." + }, + { + "endpoint": "/api/security/tools", + "method": "GET", + "use": "Upptäck vilka valfria säkerhetsverktyg (Fail2Ban, Lynis) som är installerade." + } + ] + }, + "proxmenuxIntegration": { + "heading": "ProxMenux-integration", + "rows": [ + { + "endpoint": "/api/proxmenux/update-status", + "method": "GET", + "use": "Tillgänglig ProxMenux Monitor-uppdatering samt installerad och senaste version." + }, + { + "endpoint": "/api/proxmenux/installed-tools", + "method": "GET", + "use": "Lista över varje ProxMenux efterinstallationsoptimering som för närvarande är registrerad på värden (från /usr/local/share/proxmenux/installed_tools.json)." + }, + { + "endpoint": "/api/proxmenux/tool-source/", + "method": "GET", + "use": "Källkod för den kopplade efterinstallationsfunktionen från aktuella värdskript eller bevarad äldre kod. Ingen garanterad kopia av exakt den kod som ursprungligen kördes." + } + ] + }, + "prometheus": { + "heading": "Prometheus-mätvärden", + "intro": "Den autentiserade slutpunkten GET /api/prometheus ger Prometheus textformat 0.0.4. Varje mätvärde innehåller node=\"<hostname>\" och en uttrycklig tidsstämpel. Samla med Prometheus eller en kompatibel tidsseriedatabas.", + "exportedTitle": "Exporterade mätvärden", + "headerGroup": "Grupp", + "headerMetric": "Mätvärde", + "headerDesc": "Beskrivning", + "groups": [ + { + "group": "System", + "metrics": [ + { + "metric": "proxmox_cpu_usage", + "desc": "CPU-användning i procent, typen gauge." + }, + { + "metric": "proxmox_memory_total_bytes", + "desc": "Totalt fysiskt minne i byte." + }, + { + "metric": "proxmox_memory_used_bytes", + "desc": "Använt minne i byte." + }, + { + "metric": "proxmox_memory_usage_percent", + "desc": "Minnesanvändningsprocent." + }, + { + "metric": "proxmox_load_average", + "desc": "Genomsnittlig systembelastning. Etikett period=\"1m\" | \"5m\" | \"15m\"." + } + ] + }, + { + "group": "Drifttid", + "metrics": [ + { + "metric": "proxmox_uptime_seconds", + "desc": "Sekunder sedan senaste start." + } + ] + }, + { + "group": "Hårdvara", + "metrics": [ + { + "metric": "proxmox_cpu_temperature_celsius", + "desc": "CPU:ns kapslingstemperatur." + }, + { + "metric": "proxmox_disk_temperature_celsius", + "desc": "Temperatur per disk. Etikett disk." + }, + { + "metric": "proxmox_fan_speed_rpm", + "desc": "Fläkthastigheter. Etikett fan." + } + ] + }, + { + "group": "Diskutrymme", + "metrics": [ + { + "metric": "proxmox_disk_total_bytes", + "desc": "Total kapacitet per exporterad diskpost. Etikett disk." + }, + { + "metric": "proxmox_disk_used_bytes", + "desc": "Använd kapacitet per exporterad diskpost." + }, + { + "metric": "proxmox_disk_usage_percent", + "desc": "Använd kapacitet i procent per exporterad diskpost." + } + ] + }, + { + "group": "Nätverk", + "metrics": [ + { + "metric": "proxmox_network_bytes_sent_total", + "desc": "Totalt antal skickade byte, typen counter." + }, + { + "metric": "proxmox_network_bytes_received_total", + "desc": "Totalt antal mottagna byte, typen counter." + }, + { + "metric": "proxmox_interface_bytes_sent_total", + "desc": "Skickade byte per gränssnitt. Etikett interface." + }, + { + "metric": "proxmox_interface_bytes_received_total", + "desc": "Mottagna byte per gränssnitt." + } + ] + }, + { + "group": "VMs / CTs", + "metrics": [ + { + "metric": "proxmox_vms_total", + "desc": "Totalt antal VM och LXC." + }, + { + "metric": "proxmox_vms_running", + "desc": "Antal körande gäster." + }, + { + "metric": "proxmox_vms_stopped", + "desc": "Antal stoppade gäster." + }, + { + "metric": "proxmox_vm_status", + "desc": "Status per VM/CT: 1 körs, 0 annars. Etiketter node, vmid och name." + }, + { + "metric": "proxmox_vm_cpu_usage", + "desc": "CPU-användning per VM/CT, med samma etiketter." + }, + { + "metric": "proxmox_vm_memory_used_bytes / _max_bytes", + "desc": "Använt minne och konfigurerat maximum per VM/CT." + } + ] + }, + { + "group": "GPU", + "metrics": [ + { + "metric": "proxmox_gpu_temperature_celsius", + "desc": "GPU-temperatur. Etiketter slot och vendor; gpu innehåller även GPU-namnet." + }, + { + "metric": "proxmox_gpu_utilization_percent", + "desc": "GPU-användning i procent." + }, + { + "metric": "proxmox_gpu_memory_total_bytes", + "desc": "Totalt GPU-minne." + }, + { + "metric": "proxmox_gpu_power_draw_watts", + "desc": "GPU:ns effektförbrukning i watt." + }, + { + "metric": "proxmox_gpu_clock_speed_mhz", + "desc": "GPU:ns kärnklockfrekvens." + }, + { + "metric": "proxmox_gpu_memory_clock_mhz", + "desc": "GPU:ns minnesklockfrekvens." + } + ] + }, + { + "group": "UPS", + "metrics": [ + { + "metric": "proxmox_ups_battery_charge_percent", + "desc": "Batteriets laddning i procent." + }, + { + "metric": "proxmox_ups_load_percent", + "desc": "Nuvarande belastning på UPS." + }, + { + "metric": "proxmox_ups_runtime_seconds", + "desc": "Beräknad drifttid på batteri." + }, + { + "metric": "proxmox_ups_input_voltage_volts", + "desc": "Ingångsspänning" + } + ] + } + ], + "scrapeTitle": "Insamlingskonfiguration för Prometheus", + "scrapeIntro": "Med autentisering på anger du ett API-token i Bearer-headern för Prometheus insamlingskonfiguration:", + "perHostTitle": "Insamling per värd", + "perHostBody": "Varje instans exporterar mätvärden för sin egen värd. Låt Prometheus samla från varje nod i ett kluster. Etiketten node skiljer serierna i Grafana (proxmox_vms_running'{'node=\"pve01\"'}')." + }, + "puttingItTogether": { + "heading": "Kombinera integrationerna", + "body": "Se Integrationer för att ansluta slutpunkterna till Home Assistant-sensorer, Homepage-kort, Grafana-paneler, n8n-flöden och fler verktyg. Där finns vanliga konfigurationer att kopiera. Den här sidan samlar slutpunktskatalogen." + }, + "whereNext": { + "heading": "Gå vidare", + "items": [ + { + "label": "Åtkomst och autentisering", + "href": "/docs/monitor/access-auth", + "tail": " — skapande av token, granskningslogg, valfri Fail2Ban-jail och TLS." + }, + { + "label": "Aviseringar", + "href": "/docs/monitor/notifications", + "tailRich": " — innehåll i data per händelsetyp vid anrop till /api/notifications/send." + }, + { + "label": "AI-assistent", + "href": "/docs/monitor/ai-assistant", + "tailRich": " — hur /api/notifications/test-ai och /api/notifications/provider-models fungerar." + }, + { + "label": "Hälsoövervakare", + "href": "/docs/monitor/health-monitor", + "tailRich": " — svarsformat för /api/health/* och betydelsen av de tio kategorierna." + } + ] + } +} diff --git a/web/messages/sv/docs/monitor/architecture.json b/web/messages/sv/docs/monitor/architecture.json new file mode 100644 index 00000000..b4c27043 --- /dev/null +++ b/web/messages/sv/docs/monitor/architecture.json @@ -0,0 +1,303 @@ +{ + "meta": { + "title": "Arkitektur för ProxMenux Monitor — AppImage, Flask, SQLite, WebSocket | ProxMenux", + "description": "ProxMenux Monitors uppbyggnad: AppImage-struktur, Flask-blueprints, bakgrundsuppgifter, data från psutil, pvesh, smartctl och journalctl, SQLite-lagring, WebSocket-terminal, AI-leverantörer, aviseringskanaler, omvänd proxy och valfri Fail2Ban.", + "ogTitle": "ProxMenux Monitor Arkitektur", + "ogDescription": "Inuti ProxMenux Monitor: AppImage, Flask-blueprints, bakgrundsuppgifter, SQLite, WebSocket, AI-leverantörer och aviseringskanaler.", + "twitterTitle": "ProxMenux Monitor Arkitektur", + "twitterDescription": "AppImage, Flask, SQLite, WebSocket, AI-leverantörer och meddelandekanaler - inuti Monitorn." + }, + "header": { + "title": "Arkitektur", + "description": "Hur ProxMenux Monitor distribueras, vad AppImage innehåller och hur webbläsarens begäranden går genom Flask till värdens verktyg och SQLite-lagring.", + "section": "ProxMenux Monitor" + }, + "intro": { + "title": "En process, många ansvar", + "body": "En Python-process lyssnar på TCP 8008. Den serverar den statiska Next.js-versionen, exponerar REST-API:t, hanterar WebSocket-terminalen, kör Health Monitor och skickar aviseringar. Separat webbserver, meddelandemäklare eller extern databas krävs inte." + }, + "requestFlow": { + "heading": "En begärans väg", + "intro": "En typisk databegäran följer denna väg; webbläsarinställningar kan hanteras lokalt:", + "diagramCaption": "Skyddade slutpunkter validerar JWT när autentisering är på. Kärnrutter och blueprints returnerar cachade eller nyinsamlade värddata. Den valfria Fail2Ban-kontrollen använder sin cachade blockeringslista. Vidarebefordrade IP-headers betros bara med PROXMENUX_TRUST_PROXY=1; annars används motpartens adress. Beständigt tillstånd finns i SQLite och JSON-filer som auth.json.", + "diagramArrowLabel": "HTTP / WS", + "nodes": { + "clientLabel": "Klient", + "clientDetail": "Webbläsare eller PWA\n+ valfri proxy\nNginx / Caddy /\nTraefik", + "flaskLabel": "Flask :8008", + "flaskDetail": "Blueprints\nJWT-middleware\nFail2Ban-kontroll\n(om installerad)", + "hostLabel": "Värdverktyg", + "hostDetail": "psutil\npvesh\nsmartctl\njournalctl", + "stateLabel": "Lokalt tillstånd", + "stateDetail": "SQLite DB\n+ auth.json" + }, + "threadsIntro": "Processen kör även bakgrundstrådar. Exemplen samlar data, uppdaterar cache och SQLite och skickar aviseringar. Fler uppgifter finns; sändning beror på att den är aktiverad:", + "headerThread": "Tråd", + "headerCadence": "Intervall", + "headerJob": "Jobb", + "rows": [ + { + "thread": "_temperature_collector_loop", + "cadence": "60 s", + "job": "Sparar CPU-temperatur och latensmätningar i historikdatabasen, så att grafer får data även utan ansluten webbläsare." + }, + { + "thread": "_health_collector_loop", + "cadence": "5 min", + "job": "Kör Health Monitor-cykeln med tio kategorier, sparar fel och diskobservationer, hanterar avfärdanden och skickar nya händelser till aviseringsmotorn." + }, + { + "thread": "_vital_signs_sampler", + "cadence": "CPU 5 s; temperatur 15 s; minne 30 s", + "job": "Samplar CPU-användning, minne och CPU-temperatur för aktuella indikatorer och varaktiga tillstånd, oberoende av femminuterskontrollen." + }, + { + "thread": "notification_manager.start()", + "cadence": "Händelsestyrt", + "job": "Startar bevakare för journal, uppgifter och hookar (JournalWatcher, TaskWatcher, ProxmoxHookWatcher) och skickar till konfigurerade kanaler med valfri AI-omformulering." + } + ] + }, + "systemd": { + "heading": "systemd-enhet", + "intro": "Installationsprogrammet skapar enheten /etc/systemd/system/proxmenux-monitor.service. Standardkonfiguration:", + "items": [ + "User=root: tjänsten använder root-behörighet för SMART, pvesh och ZFS-hantering. Webbterminalens processer ärver behörigheten.", + "Restart=on-failure med tio sekunders väntan: tjänsten startas om automatiskt efter ett fel.", + "After=network.target: ordnar start efter målet; garanterar inte tilldelad IP, DNS eller extern anslutning." + ], + "inspectTitle": "Granska aktuell enhet" + }, + "appimage": { + "heading": "Vad AppImage innehåller", + "intro": "AppImage innehåller ett filsystem som monteras vid körning. AppRun i roten ställer in miljön och startar flask_server.py:", + "consequencesIntro": "Två konsekvenser av denna layout:", + "consequences": [ + "Medföljande Python-miljö. Tolken och paketen finns i AppImage utan installation i värdens system-Python. Appen använder fortfarande kärngränssnitt och externa värdverktyg.", + "Maskinvaruklienter ingår. Här finns ipmitool, lm-sensors och upsc. Mätningar kräver maskinvarustöd, sensoråtkomst och för UPS en konfigurerad NUT-server." + ] + }, + "flask": { + "heading": "Flask-appens struktur", + "intro": "flask_server.py skapar en Flask(__name__)-instans med begränsat CORS, registrerar nio blueprints direkt och initierar terminalen. Tabellen visar huvudmoduler; även granskning, VM-säkerhetskopiering och PBS registreras. PVE-förladdning körs bara på PVE-värdar.", + "headerBlueprint": "Blueprint / modul", + "headerPrefix": "Ruttprefix", + "headerOwns": "Ansvar", + "rows": [ + { + "blueprint": "flask_server.py", + "prefix": [ + "/api/system", + "/api/storage", + "/api/network", + "/api/vms", + "/api/hardware", + "/api/logs", + "/api/prometheus" + ], + "owns": "Kärnslutpunkter, statisk webb och valfri Fail2Ban-kontroll när jail proxmenux finns på värden." + }, + { + "blueprint": "flask_auth_routes.py", + "prefix": [ + "/api/auth/*" + ], + "owns": "Inloggning, JWT-utfärdande, TOTP-inställning och kontroll, lösenordsbyte och API-token." + }, + { + "blueprint": "flask_health_routes.py", + "prefix": [ + "/api/health/*" + ], + "owns": "Hälsokontroller, detaljerad status, aktiva och avfärdade fel samt undertryckningsinställningar. Skyddade slutpunkter kräver autentisering när den är på." + }, + { + "blueprint": "flask_terminal_routes.py", + "prefix": [ + "/api/terminal/* + WS" + ], + "owns": "Tilldelar ett PTY per session och ansluter det via WebSocket till xterm.js i webbläsaren." + }, + { + "blueprint": "flask_notification_routes.py", + "prefix": [ + "/api/notifications/*" + ], + "owns": "Skapa, läsa, ändra och ta bort kanaler; tester, AI, historik och manuella sändningar." + }, + { + "blueprint": "flask_security_routes.py", + "prefix": [ + "/api/security/*" + ], + "owns": "Inloggningsfel och, med Fail2Ban installerat, jailstatus, blockeringar och manuell avblockering." + }, + { + "blueprint": "flask_proxmenux_routes.py", + "prefix": [ + "/api/proxmenux/*" + ], + "owns": "Läser ProxMenux-optimeringar som registrerats på värden." + }, + { + "blueprint": "flask_oci_routes.py", + "prefix": [ + "/api/oci/*" + ], + "owns": "Funktioner för distribution av OCI- och containerappar på Proxmox VE 9.1+." + } + ], + "endpointsLink": "Integrationsslutpunkter och deras format beskrivs i API-referens." + }, + "dataSources": { + "heading": "Datakällor", + "intro": "Värddata kommer främst från standardbibliotek, filer och administrationskommandon. Vissa gästdata beror även på QEMU Guest Agent eller kommandon i en CT:", + "headerSource": "Källa", + "headerUsedFor": "Används för", + "rows": [ + { + "source": "psutil", + "usedFor": "CPU-belastning, minne, swap, monteringsanvändning, nätverksräknare och processer." + }, + { + "source": "pvesh / qm / pct", + "usedFor": "Proxmox-nodinformation, VM/CT-inventering och konfiguration, lagring och uppgiftshistorik." + }, + { + "source": "smartctl", + "usedFor": "SATA/NVMe-attribut, SMART-status, slitage, livslängd, modell och serienummer." + }, + { + "source": "zpool / zfs", + "usedFor": "Poolstatus (ONLINE / DEGRADED / FAULTED / UNAVAIL), scrubförlopp och datasetanvändning." + }, + { + "source": "journalctl", + "usedFor": "Systemloggar, OOM-avslutade processer, ATA/NVMe/dm-fel, säkerhet och egna tjänsteenheter." + }, + { + "source": "ip / iproute2", + "usedFor": "Gränssnitt, adresser, bryggor, bond-gränssnitt och OVS-hanterade enheter." + }, + { + "source": "nvidia-smi · intel_gpu_top", + "usedFor": "Tillgängliga GPU-data om användning, VRAM, temperatur och kodning/avkodning. Fälten beror på tillverkare, verktyg och drivrutin." + }, + { + "source": "lspci · lscpu · dmidecode", + "usedFor": "PCIe-topologi, CPU-modell och topologi samt moderkort och BIOS." + }, + { + "source": "ipmitool · sensors", + "usedFor": "Out-of-band-sensorer, fläkthastigheter och moderkortstemperaturer när maskinvaran stöder dem." + }, + { + "source": "upsc (NUT)", + "usedFor": "Batteristatus, belastning och återstående drifttid för UPS med konfigurerad NUT-server." + } + ], + "cacheTitle": "Cache minskar anrop till värden", + "cacheBody": "Krävande resultat från smartctl -a och pvesh get cachas i Flask-processen för att minska upprepade anrop till diskar och kluster-API. Tiden beror på källan: sekunder för aktuella mätvärden och minuter för SMART." + }, + "persistence": { + "heading": "Persistens", + "intro": "Flera tillståndsfiler har olika innehåll och åtkomstkrav:", + "headerPath": "Path", + "headerOwner": "Ägare", + "headerContents": "Innehåll", + "rows": [ + { + "path": "/usr/local/share/proxmenux/health_monitor.db", + "owner": "root:root", + "contents": "SQLite-databas. Tabeller: errors, events, disk_registry, disk_observations, user_settings, notification_history, excluded_storages, excluded_interfaces. Journalläge WAL." + }, + { + "path": "/usr/local/share/proxmenux/.notification_key", + "owner": "root 0600", + "contents": "32-byte huvudnyckel för aviseringshemligheter i ENC2-format. Använder slumpmässigt salt per värde, härledda nycklar och MAC. Äldre XOR-värden stöds för migrering." + }, + { + "path": "/root/.config/proxmenux-monitor/auth.json", + "owner": "root:root", + "contents": "Inloggningskonfiguration: aktivering, användarnamn, saltad PBKDF2-HMAC-SHA256-lösenordshash, TOTP-hemlighet, återställningskoder, installationens JWT-nyckel, API-tokenmetadata och återkallningshashar. Äldre SHA-256-hashar migreras vid lyckad inloggning." + }, + { + "path": "/var/log/proxmenux-auth.log", + "owner": "root:root", + "contents": "Autentiseringslogg i vanlig text, oberoende av Fail2Ban. Om jail [proxmenux] är installerad och aktiv läser den loggen för att upptäcka upprepade inloggningsfel. Utan jail kan loggen fortfarande granskas." + } + ], + "backupTitle": "Säkerhetskopiera auth.json före ominstallation", + "backupBody": "Byte av AppImage bevarar normalt /root/.config/proxmenux-monitor/auth.json och /usr/local/share/proxmenux/health_monitor.db. Bevara auth.json med dess jwt_secret för tokenens giltighet och metadata. Databasen lagrar hälso- och aviseringsstatus separat. Spara .notification_key med den för krypterade kanalinställningar; databasen ensam återställer inte API-autentisering." + }, + "health": { + "heading": "Health Monitor-cykeln", + "intro": "Ungefär var femte minut anropar bakgrundsinsamlaren health_monitor.py för kontrollerna i panelens tio kategorier:", + "items": [ + "Kritiska PVE-tjänster (pveproxy, pvedaemon, pvestatd, pve-cluster).", + "Proxmox-lagring: pvesh get /storage och tillgänglighet för varje lagring.", + "Diskar och filsystem: SMART, I/O-fel i dmesg, ZFS-status och monteringskapacitet.", + "VM och CT: startfel, krascher, QMP-fel och avstängningsfel.", + "Nätverk: brygg- och bondstatus, länkstatus och latens till gatewayen.", + "Uppdateringar: väntande paket och säkerhetsuppdateringar.", + "Loggar: ihållande mönster, toppar och kaskader i systemjournalen.", + "Minne: OOM-händelser och ihållande minnestryck.", + "Temperatur: CPU- och diskvärden jämförs med övervakningsgränser; tillgängliga sensorer beror på maskinvaran.", + "Säkerhet: inloggningsfel, blockeringar och Fail2Ban-jailstatus." + ], + "afterIntro": "Resultat använder stabil error_key, kategori och allvarlighetsgrad. Rader i errors uppdateras med last_seen och räknare utan dubbletter. Aviseringssändning har även egna fingeravtryck och väntetider.", + "cycleEnd": "Rensning kan lösa gamla fel med kategorins tid för undertryckning och statusregler, ta bort övergivna poster för borttagna resurser och radera events äldre än 30 dagar. Kategorierna beskrivs i Panel → Health Monitor." + }, + "notifications": { + "heading": "Aviseringsmotor", + "intro": "notification_manager.py samordnar sändning: laddar kanaler, hanterar kön och erbjuder ett Python-API för Flask och Health Monitor samt en CLI-ingång för ProxMenux .sh-hookar.", + "items": [ + "Bevakare skapar händelser: JournalWatcher följer journalen, TaskWatcher frågar efter Proxmox-uppgifter, ProxmoxHookWatcher tar emot hookar för säkerhetskopiering, replikering och ögonblicksbilder och PollingCollector hanterar långsamma källor.", + "Mallar omvandlar händelser till titel och text. Vald AI-leverantör (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter) kan omformulera dem på vanligt språk. Båda versionerna sparas i notification_history.", + "Kanaler skickar via tjänster som Telegram, Discord, e-post, Gotify, Pushover och Apprise. Implementationerna i notification_channels.py delar gränssnittet create_channel() / send().", + "Kryptering. Känsliga inställningar (telegram.bot_token, discord.webhook_url, pushover.user_key, pushover.api_token, ai_api_key_*, email.password) krypteras med nyckeln i .notification_key före lagring och maskeras i gränssnittet." + ], + "linksFooter": "Händelsereglage, kanalinställningar och AI beskrivs i Inställningar → Aviseringar och Inställningar → AI-assistent." + }, + "websocket": { + "heading": "WebSocket-terminal", + "intro": "Fliken Terminal ansluter en lätt xterm.js-klient till ett PTY på servern via WebSocket. Två lägen finns:", + "items": [ + "HTTP-läge, standard: den inbyggda Flask-servern med flask-sock hanterar byte till WebSocket-protokollet.", + "HTTPS-/WSS-läge: använder gevent.pywsgi.WSGIServer med geventwebsocket.handler.WebSocketHandler för WebSocket över TLS." + ], + "outro": "Terminalprocesser ärver User=root. Med autentisering på kräver WebSocket en kortlivad engångsbiljett från den autentiserade biljettslutpunkten med administratörsbehörighet. Om autentisering är avstängd eller avböjd följer anslutningen det oautentiserade läget.", + "proxyNote": "Med omvänd proxy måste WebSocket och dess headers Upgrade och Connection vidarebefordras. Terminalen kräver det." + }, + "proxy": { + "heading": "Omvänd proxy och Fail2Ban", + "intro": "Val av klient-IP och valfri blockering i appen beror på dessa inställningar och komponenter:", + "items": [ + "Val av klient-IP. Kontrollen before_request och inloggningsloggen litar på X-Forwarded-For och sedan X-Real-IP bara med PROXMENUX_TRUST_PROXY=1. Annars används request.remote_addr. Vidarebefordrade headers godtas inte automatiskt.", + "Valfri Fail2Ban-kontroll i appen. En proxyanslutning kan visa proxyns IP som TCP-motpart. Med betrodd klientadress och aktiv jail proxmenux avvisar Flask blockerade IP-adresser med HTTP 403. Listan cachas i 30 sekunder och förnyas av en begäran efter utgång, utan separat timer." + ], + "calloutTitle": "Fail2Ban ingår inte", + "calloutBody": "Fail2Ban ingår inte och installeras inte automatiskt. Det kan installeras under Monitors Säkerhet eller Säkerhet → Fail2Ban i ProxMenux Scripts. Utan fail2ban-client eller jail proxmenux blockerar kontrollen inga begäranden. Inställd autentiseringspolicy gäller fortfarande.", + "outro": "Exempel för Nginx/Caddy/Traefik och jailguiden finns i Åtkomst och autentisering och Säkerhet → Fail2Ban." + }, + "whereNext": { + "heading": "Gå vidare", + "items": [ + { + "label": "Åtkomst och autentisering", + "href": "/docs/monitor/access-auth", + "tail": " — första start, lösenord och TOTP-2FA, exempel för omvänd proxy och Fail2Ban-jail." + }, + { + "label": "API-referens", + "href": "/docs/monitor/api", + "tail": " — integrationsslutpunkter, tokenhantering och autentiseringskonventioner." + }, + { + "label": "Inställningar → ProxMenux Monitor", + "href": "/docs/settings/proxmenux-monitor", + "tail": " — tjänstestyrning och statuskontroll i ProxMenux textmeny." + } + ] + } +} diff --git a/web/messages/sv/docs/monitor/audit-report/assessment.json b/web/messages/sv/docs/monitor/audit-report/assessment.json new file mode 100644 index 00000000..898d838e --- /dev/null +++ b/web/messages/sv/docs/monitor/audit-report/assessment.json @@ -0,0 +1,218 @@ +{ + "meta": { + "title": "Bedömning och inventering | Granskning och rapporter", + "description": "Bedömning i Granskning och rapporter: rapportprofiler, klassificering av resultat, accepterade risker, oläsbara källor, Lynis och nodens inventering." + }, + "header": { + "title": "Bedömning och inventering", + "description": "Bedömningen inspekterar noden, håller sina resultat och svarar på olika frågor beroende på rapportprofilen.", + "section": "Granskning och rapporter" + }, + "sections": [ + { + "id": "read-only", + "blocks": [ + { + "calloutInfo": { + "title": "En bedömning inspekterar; den ändrar inte konfigurationen", + "body": "Den läser värdens konfiguration och tillstånd. Det skriver sina resultat, rapporter och loggar, och startkontrollerna kan montera EFI-systempartitioner för ett ögonblick. Konfigurationen den bedömer är inte modifierad." + } + }, + { + "p": "Kör bedömning startar en körning med profilen som valts i Rapport. Vyn visar datumet för den senaste körningen och hur lång tid som gått." + } + ] + }, + { + "id": "profiles", + "title": "Rapportprofiler", + "intro": "Varje profil svarar på en annan fråga. Kontrollerna och sektionerna väljs innan dokumentet komponeras.", + "blocks": [ + { + "table": { + "headers": [ + "Profil", + "Vad det täcker" + ], + "rows": [ + [ + "Fullständig granskning", + "Alla kontroller och all tillgänglig struktur." + ], + [ + "Snabbdiagnos", + "Varje kontroll; resultatet öppnas med de kritiska resultaten, varningarna och avläsningarna som inte kunde verifieras." + ], + [ + "Inventering", + "En beskrivning av noden, utan kontroller och ingen klassificering." + ], + [ + "Säkerhetsgranskning", + "Exponering, åtkomst, privilegier, certifikat, uppdateringar, repositorier och Lynis." + ], + [ + "Kontroll av säkerhetskopior", + "Täckning, ålder, resultat, verifiering, lagring och återhämtning av säkerhetskopiorna." + ], + [ + "Kapacitet och slitage", + "Tillväxtmarginal, minne, utrymmesanvändning och diskarnas livslängd." + ] + ] + } + }, + { + "p": "Innehållet i varje dokument beskrivs i Rapporter och jämförelser." + } + ] + }, + { + "id": "results", + "title": "Hur resultat klassificeras", + "blocks": [ + { + "table": { + "headers": [ + "Klassificering", + "Betydelse" + ], + "rows": [ + [ + "Kritisk", + "Ett misslyckat tillstånd som har prioritet." + ], + [ + "Varning", + "Ett villkor som behöver en översyn, med tanke på bevisen eller policyn." + ], + [ + "observation", + "Information om noden som inte rapporteras som ett misslyckande." + ], + [ + "Ej verifierat", + "Källan som kontrollen behöver kunde inte läsas. Det betyder inte att problemet saknas." + ], + [ + "Uppfyllt", + "Villkoret möter det kriterium som tillämpas." + ], + [ + "Ej tillämpligt", + "Inget inom ramen för kontrollen gäller." + ], + [ + "Accepterad risk", + "Resultatet finns och ett beslut om det har registrerats." + ], + [ + "Undantagen enligt policy", + "Policyn förklarar att elementet lämnas utanför räkningen." + ] + ] + } + }, + { + "p": "Resultat kan filtreras efter område: System, lagring, nätverk, säkerhet, säkerhetskopiering, gäster och hårdvara. Varje fynd håller sina bevis, med källan det lästes från." + } + ] + }, + { + "id": "unverified", + "title": "När en källa inte kan läsas", + "blocks": [ + { + "table": { + "headers": [ + "fall", + "Beteende" + ], + "rows": [ + [ + "Ej verifierat", + "Kontrollen behåller sin identitet, anger i underlaget vilken källa som misslyckades och gör inte saknade data till ett godkänt resultat." + ], + [ + "Ofullständiga underlag", + "Rapporten anger källa och insamlingstid så att ett verkligt problem kan skiljas från en otillräcklig avläsning." + ], + [ + "En ny körning", + "När åtkomsten, paketet eller tjänsten korrigeras körs samma profil igen och jämförelsen visar om resultatet kan verifieras." + ] + ] + } + } + ] + }, + { + "id": "lynis", + "title": "Lynis", + "blocks": [ + { + "p": "Säkerhetsgranskningen använder värdens Lynis-rapport. Om Lynis aldrig har körts eller rapporten är äldre än policyn tillåter erbjuder en dialog Kör med Lynis, som tar några minuter extra, eller Kör utan Lynis, som använder befintlig rapport." + }, + { + "figure": { + "src": "/monitor/audit/lynis-dialog.png", + "alt": "Dialog som erbjuder att köra bedömningen med eller utan Lynis", + "caption": "Lynis-dialogen före en säkerhetsgranskning." + } + } + ] + }, + { + "id": "accept", + "title": "Acceptera en risk", + "blocks": [ + { + "p": "Acceptera risk registrerar ett beslut om ett fynd. En motivering krävs och sparas med författare och datum." + }, + { + "table": { + "headers": [ + "Fält", + "Alternativ" + ], + "rows": [ + [ + "Orsak", + "Fritext, obligatoriskt." + ], + [ + "Slutar gälla efter", + "90 dagar, 180 dagar, 1 år eller utan utgångsdatum. När perioden löper ut blir fyndet aktivt igen." + ], + [ + "Påminn mig om att granska", + "En påminnelse som tar beslutet tillbaka till uppmärksamhet medan det är i kraft." + ] + ] + } + }, + { + "p": "Ett accepterat fynd är synligt med beslutet; Återställ till aktiv återkallar acceptansen. Att acceptera en risk åtgärdar den inte: jämförelsen visar den som accepterad, inte som löst." + } + ] + }, + { + "id": "inventory", + "title": "Inventering", + "blocks": [ + { + "list": { + "items": [ + "Identitet, Proxmox VE version, kärna, abonnemang och kluster.", + "CPU, minne, moderkort, BIOS, styrenheter och IOMMU.", + "Disker, SMART, power-on timmar och inspelade händelser.", + "Adaptrar, bondningar, bryggor, latens och anslutningar.", + "Lagring, gäster med sina diskar och gränssnitt och säkerhetskopior.", + "PCI genomgång och programvaran ProxMenux hanterar." + ] + } + } + ] + } + ] +} diff --git a/web/messages/sv/docs/monitor/audit-report/changes.json b/web/messages/sv/docs/monitor/audit-report/changes.json new file mode 100644 index 00000000..b8de2364 --- /dev/null +++ b/web/messages/sv/docs/monitor/audit-report/changes.json @@ -0,0 +1,208 @@ +{ + "meta": { + "title": "Ändringar | Granskning och rapporter", + "description": "Ändringslogg i Granskning och rapporter: vad ProxMenux ändrat på värden, tidigare tillstånd, skillnader och om ändringen kan ångras." + }, + "header": { + "title": "Ändringar", + "description": "Logg över ProxMenux åtgärder på värden och, när det registrerats, tillståndet före och efter varje åtgärd.", + "section": "Granskning och rapporter" + }, + "sections": [ + { + "id": "purpose", + "blocks": [ + { + "calloutInfo": { + "title": "Från körningen av skriptet till ändringen det gjorde", + "body": "En lång funktion kan ändra bara två rader. Loggen sparar varje konkret åtgärd med ansvarigt skript, funktion och version, berörd resurs, skillnad och om den kan ångras." + } + }, + { + "flow": { + "nodes": [ + { + "label": "Skript", + "detail": "Funktion + version" + }, + { + "label": "Registrering", + "detail": "innehåll före" + }, + { + "label": "Åtgärd", + "detail": "fil · paket · service" + }, + { + "label": "Logg", + "detail": "attribution + skillnad" + } + ], + "caption": "Registreringen görs när åtgärden körs och sammanställs när Monitor läser loggen." + } + }, + { + "figure": { + "src": "/monitor/audit/changes-view.png", + "alt": "Vyn Ändringar i Granskning och rapporter med poster grupperade efter efterinstallationsalternativ och skript", + "caption": "Förändringsvyn, med skillnaden i en fil redigerad av ProxMenux." + } + } + ] + }, + { + "id": "types", + "title": "Typer av poster", + "intro": "Filtret på toppen skiljer posterna efter typ.", + "blocks": [ + { + "table": { + "headers": [ + "Typ", + "Vad den registrerar" + ], + "rows": [ + [ + "Konfiguration", + "ProxMenux skrev, redigerade eller tog bort en fil, ändrade en inställning eller ändrade en tjänst." + ], + [ + "Installationer", + "ProxMenux lade till ett paket eller en komponent, och de paket som faktiskt visas registreras." + ], + [ + "Körningar", + "ProxMenux körde ett kommando; ändringarna beror på kommandot självt." + ], + [ + "Tillämpat", + "En funktion tillämpades innan loggen fanns; tidigare tillstånd registrerades inte." + ] + ] + } + } + ] + }, + { + "id": "groups", + "title": "Hur vyn är organiserad", + "blocks": [ + { + "table": { + "headers": [ + "Avsnitt", + "Innehåll" + ], + "rows": [ + [ + "Optimeringar efter installation", + "Grupperas av post-install alternativet som användaren valt." + ], + [ + "ProxMenux-skript", + "GPU, Coral, nätverk, lagring, säkerhet, verktyg och andra instrumenterade skript, inklusive ProxMenux installatör och ProxMenux Monitor." + ], + [ + "Installerade paket och verktyg", + "Programvara som ProxMenux installerat på värden." + ] + ] + } + }, + { + "p": "Efter funktion grupperar posterna i varje avsnitt under funktionen som skapade dem." + } + ] + }, + { + "id": "entry", + "title": "Vad varje post visar", + "blocks": [ + { + "list": { + "items": [ + "Ansvarigt skript, funktion och version.", + "Datumet och den berörda resursen.", + "Det kända tillståndet före och efter ändringen.", + "Raderna som lagts till och tagits bort.", + "De paket som faktiskt lades till.", + "En tjänsts tillståndsändring.", + "Ångra detta: Återställer exakt tidigare tillstånd, Tar bort filen (den fanns inte tidigare), Paketet kan avinstalleras, delvis återställning eller Kan inte ångras från loggen." + ] + } + } + ] + }, + { + "id": "before", + "title": "Vad tidigare tillstånd betyder", + "blocks": [ + { + "p": "Tidigare tillstånd kan vara registrerat innehåll, en fil som skapats för första gången eller ett okänt tillstånd. Ändringar från tiden före loggen kan inte rekonstrueras; när funktionen körs igen registreras först tillståndet som finns då." + } + ] + }, + { + "id": "limits", + "title": "Loggens omfattning", + "blocks": [ + { + "list": { + "items": [ + "Manuella ändringar och ändringar som görs av annan programvara registreras inte.", + "Endast operationer som går igenom ProxMenux-revisionsprimitiva täcks.", + "Inspelningen blockerar aldrig den operation som den beskriver: om inträdet inte kan skrivas fortsätter operationen.", + "Successiva ändringar av en resurs visas som det kända ursprungstillståndet jämfört med det aktuella." + ] + } + } + ] + }, + { + "id": "retention", + "title": "Lagrade bevis", + "blocks": [ + { + "table": { + "headers": [ + "Element", + "Beteende" + ], + "rows": [ + [ + "Inlägg", + "Posterna sparas på värden; inget tas bort automatiskt från loggen." + ], + [ + "Registrerat innehåll", + "Ett fångat objekt hålls medan en post hänvisar till det." + ], + [ + "Storlek på en registrering", + "Innehåll över 1 MiB lagras inte hela; posten registrerar att fångsten hoppades på grund av dess storlek." + ], + [ + "Läsning", + "Monitorn laddar inte lagrade objekt över 2 MiB." + ], + [ + "Skillnad", + "Högst 400 rader visas; en längre skillnad markeras som avkortad." + ], + [ + "Lista", + "API:t returnerar som standard 200 poster per begäran, högst 1000." + ] + ] + } + }, + { + "calloutWarning": { + "title": "Sparat innehåll innebär ingen automatisk återställning", + "body": "Tidigare innehåll kan granskas och återställas manuellt, men vyn Ändringar ångrar inga åtgärder. En körningspost registrerar kommandot utan att känna till alla effekter av verktyget som kördes." + } + } + ] + } + ] +} diff --git a/web/messages/sv/docs/monitor/audit-report/index.json b/web/messages/sv/docs/monitor/audit-report/index.json new file mode 100644 index 00000000..93656e69 --- /dev/null +++ b/web/messages/sv/docs/monitor/audit-report/index.json @@ -0,0 +1,136 @@ +{ + "meta": { + "title": "Granskning och rapporter | ProxMenux Monitor", + "description": "Bedöm en Proxmox VE-nod, registrera ProxMenux ändringar och ange förväntningar på gäster och lagring, med utskrivbara rapporter." + }, + "header": { + "title": "Granskning och rapporter", + "description": "Bedömning av noden, logg över ProxMenux ändringar och angivna förväntningar, med dokument som kan skrivas ut eller sparas som PDF.", + "section": "ProxMenux Monitor" + }, + "sections": [ + { + "id": "views", + "blocks": [ + { + "calloutInfo": { + "title": "Tre vyer, tre frågor", + "body": "Granskning och rapporter skiljer mellan fakta om noden, ProxMenux ingrepp och angivna förväntningar. En konfiguration som inte kan bedömas mot ett angivet syfte beskrivs utan att rapporteras som ett fel." + } + }, + { + "cards": { + "items": [ + { + "icon": "shield", + "title": "Bedömning - hur är noden?", + "body": "Kör kontrollerna av den valda profilen, komponerar inventeringen och klassificerar vad som behöver uppmärksamhet, med bevis på varje resultat." + }, + { + "icon": "refresh", + "title": "Förändringar – vad gjorde ProxMenux?", + "body": "Listar filer, paket, tjänster och kommandon som ändrats av instrumenterade ProxMenux-skript, med tidigare tillstånd när det har registrerats." + }, + { + "icon": "fileText", + "title": "Policy – vad förväntas?", + "body": "Anger vilka gäster som behöver säkerhetskopieras eller startas med värden, vilken lagring som är nödvändig och kontrollernas tröskelvärden." + } + ] + } + }, + { + "flow": { + "nodes": [ + { + "label": "Bedömning", + "detail": "Fakta" + }, + { + "label": "Policy", + "detail": "kontext" + }, + { + "label": "Ändringar", + "detail": "interventioner" + } + ], + "caption": "Bedömningen ger fakta, policyn ger dem sammanhang och loggen registrerar ProxMenux åtgärder." + } + }, + { + "figure": { + "src": "/monitor/audit/assessment-view.png", + "alt": "Granskning och rapporter i ProxMenux Monitor med vyerna Bedömning, Ändringar och Policy", + "caption": "Audit & Report, med bedömningsvyn öppen." + } + } + ] + }, + { + "id": "boundaries", + "title": "Tre olika funktioner", + "blocks": [ + { + "table": { + "headers": [ + "Funktion", + "Vad det gör" + ], + "rows": [ + [ + "Hälsoövervakning", + "Bevakar mätvärden och händelser kontinuerligt och kan utlösa aviseringar." + ], + [ + "Granskning och rapporter", + "Kör en bedömning på begäran, dokumenterar noden och jämför körningar med varandra." + ], + [ + "Ändringslogg", + "Registrerar åtgärder som ProxMenux utför genom sina grundläggande granskningsfunktioner." + ] + ] + } + } + ] + }, + { + "id": "pages", + "title": "Sidor i detta avsnitt", + "blocks": [ + { + "next": { + "items": [ + { + "label": "Bedömning och inventering", + "href": "/docs/monitor/audit-report/assessment", + "tail": "profiler, resultat, accepterade risker och inventering." + }, + { + "label": "Ändringar", + "href": "/docs/monitor/audit-report/changes", + "tail": "loggen över vad ProxMenux ändrat på värden." + }, + { + "label": "Policy", + "href": "/docs/monitor/audit-report/policy", + "tail": "gäster, lagring och tröskelvärden." + }, + { + "label": "Rapporter och jämförelser", + "href": "/docs/monitor/audit-report/reports", + "tail": "de sex dokumenten och referenskörningen." + }, + { + "label": "Omfattning och garantier", + "href": "/docs/monitor/audit-report/scope", + "tail": "källor, gränser och lagrade data." + } + ] + } + } + ] + } + ] +} diff --git a/web/messages/sv/docs/monitor/audit-report/policy.json b/web/messages/sv/docs/monitor/audit-report/policy.json new file mode 100644 index 00000000..79e963ae --- /dev/null +++ b/web/messages/sv/docs/monitor/audit-report/policy.json @@ -0,0 +1,111 @@ +{ + "meta": { + "title": "Policy | Granskning och rapporter", + "description": "Nodens policy i Granskning och rapporter: säkerhetskopiering, autostart och återställningsmål för varje gäst, varje lagrings roll och kontrollernas tröskelvärden." + }, + "header": { + "title": "Policy", + "description": "Policyn anger vad ingen inspektion kan härleda: syftet med varje gäst och lagring samt tröskelvärdena som kontrollerna tillämpar.", + "section": "Granskning och rapporter" + }, + "sections": [ + { + "id": "principle", + "blocks": [ + { + "calloutInfo": { + "title": "Utan angivna förväntningar beskriver rapporten; med dem bedömer den", + "body": "En bedömning ser vad värden gör, inte vad det är för. En gäst utan en säkerhetskopia vars syfte inte förklaras rapporteras som en observation. Om dess backup förklaras krävs, rapporteras samma frånvaro som en varning. Ingenting måste förklaras." + } + }, + { + "figure": { + "src": "/monitor/audit/policy-view.png", + "alt": "Policyvisning med gästerna, lagringen och trösklarna på noden", + "caption": "Policyvyn." + } + } + ] + }, + { + "id": "guests", + "title": "Gäster", + "intro": "Varje VM och LXC av noden har tre fält. Ett värde kvar som standard tar det allmänna värdet, som visas bredvid det.", + "blocks": [ + { + "table": { + "headers": [ + "Fält", + "Värden", + "Effekt på bedömningen" + ], + "rows": [ + [ + "Säkerhetskopiering", + "Krävs, Krävs inte, Ej angivet", + "En saknad säkerhetskopia är en varning när det krävs, en observation när det inte anges, och det lämnas ur räkningen när det inte krävs." + ], + [ + "Autostart", + "Krävs, Krävs inte, Ej angivet", + "Om gästen måste starta tillsammans med värden." + ], + [ + "Återställningsmål", + "Timmar", + "Den högsta acceptabla åldern för den sista säkerhetskopian." + ] + ] + } + } + ] + }, + { + "id": "storage", + "title": "Lagring", + "blocks": [ + { + "p": "Lagring som inte kan nås rapporteras som kritisk om den angetts som nödvändig eller används av en gäst som körs, som en varning om rollen inte angetts och som en observation om den angetts som valfri." + } + ], + "intro": "Varje lagring av noden deklareras som väsentlig, valfri eller ej angiven." + }, + { + "id": "thresholds", + "title": "Trösklar", + "intro": "Ett tomt tröskelfält använder det medföljande standardvärdet, som visas som platshållare.", + "blocks": [ + { + "list": { + "items": [ + "Granskning av lagringskapacitet (%) och fyllnadsgrad i thin pool (%).", + "Kvot för thin-överallokering och överallokering av minne.", + "Intervall för ZFS-scrub (dagar).", + "Reservgräns för säkerhetskopians ålder (dagar) och marginal mot schemat (kvot).", + "Certifikat utgångsmeddelande (dagar).", + "Disk livslängd (timmar) och nyligen diskfel fönster (dagar).", + "Lynis-rapportens ålder (dagar) och paketindexets ålder (dagar).", + "Journalens användning i förhållande till sitt tak (%).", + "Granskning av filsystemets utrymme (%) och inoder (%)." + ] + } + } + ] + }, + { + "id": "save", + "title": "Hur policyn sparas", + "blocks": [ + { + "p": "Deklarationen valideras och sparas atomiskt i /usr/local/share/proxmenux/audit_policy.json. Varje sparning har en revision: om en annan session ändrat deklarationen sparas inte utkastet och vyn erbjuder att läsa in den sparade versionen igen." + }, + { + "calloutWarning": { + "title": "Policyn härleds aldrig automatiskt", + "body": "ProxMenux lägger inte till egna krav. Ett tomt fält behåller standardvärdet eller förblir ej angivet; en delvis ifylld deklaration påverkar bara de namngivna delarna." + } + } + ] + } + ] +} diff --git a/web/messages/sv/docs/monitor/audit-report/reports.json b/web/messages/sv/docs/monitor/audit-report/reports.json new file mode 100644 index 00000000..6f570405 --- /dev/null +++ b/web/messages/sv/docs/monitor/audit-report/reports.json @@ -0,0 +1,247 @@ +{ + "meta": { + "title": "Rapporter och jämförelser | Granskning och rapporter", + "description": "De sex dokumenten i Granskning och rapporter, hur de skrivs ut eller sparas som PDF och hur körningar jämförs med en referenskörning." + }, + "header": { + "title": "Rapporter och jämförelser", + "description": "Sex dokument för olika frågor och jämförelse av varje körning med en referenskörning.", + "section": "Granskning och rapporter" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "Sex dokument, inte sex stilar", + "body": "Motorn väljer kontroller och avsnitt innan dokumentet skapas. En snabbdiagnos är inte en fullständig granskning med färre sidor, och en inventering visar inga bedömningsresultat. Exempeldokumenten nedan använder fiktiva data." + } + } + ] + }, + { + "id": "documents", + "title": "De sex dokumenten", + "blocks": [ + { + "downloads": { + "items": [ + { + "title": "Fullständig granskning", + "body": "Dokumenterar hela noden som ett tekniskt underlag.", + "href": "/monitor/audit/sample-audit-full-report.pdf", + "facts": [ + { + "label": "kontroller", + "value": "Alla tillgängliga kontroller." + }, + { + "label": "Innehåll", + "value": "Sammanfattning; identitet och kluster; hårdvara; nätverk och latens; lagring; gäster; passthrough; applikationer; fynd med underlag; källor och omfattning." + } + ] + }, + { + "title": "Snabbdiagnos", + "body": "Visar vad som behöver uppmärksamhet utan den fullständiga inventeringen.", + "href": "/monitor/audit/sample-audit-diagnostic-report.pdf", + "facts": [ + { + "label": "kontroller", + "value": "Samma kontroller som fullständig revision." + }, + { + "label": "Innehåll", + "value": "Minimal identitet; kritiska fynd; varningar; relevanta observationer; overifierade avläsningar och prioriterade åtgärder. Diagram, inventering och långa bilagor utelämnas." + } + ] + }, + { + "title": "Inventering", + "body": "Beskriver vad som finns på noden utan att bedöma det.", + "href": "/monitor/audit/sample-audit-inventory-report.pdf", + "facts": [ + { + "label": "kontroller", + "value": "Ingen; ingen upptäckt klassificeras." + }, + { + "label": "Innehåll", + "value": "Identitet; kluster; CPU och minne; moderkort, BIOS och styrenheter; nätverk; lagring; virtuella maskiner och LXC; passthrough; applikationer och delar som hanteras av ProxMenux." + } + ] + }, + { + "title": "Säkerhetsgranskning", + "body": "Täcker exponering och kontrollerna över tillgången till noden.", + "href": "/monitor/audit/sample-audit-security-report.pdf", + "facts": [ + { + "label": "kontroller", + "value": "Säkerhetsområdet, plus containerprivilegier, uppdateringar, repositorier och APT-kedjan." + }, + { + "label": "Innehåll", + "value": "Identitet och kluster; nätverk och latens; tillgång; brandvägg; 2FA; certifikat; privilegier; uppdateringar; repositorier; tillstånd och ålder av Lynis." + } + ] + }, + { + "title": "Kontroll av säkerhetskopior", + "body": "Kontrollerar att det deklarerade skyddet finns och att dess säkerhetskopior är användbara.", + "href": "/monitor/audit/sample-audit-backup-report.pdf", + "facts": [ + { + "label": "kontroller", + "value": "Backup-området, plus lagringsanslutning och meddelandeleverans." + }, + { + "label": "Innehåll", + "value": "Täckning per gäst; deklarerat återhämtningsmål; ålder och resultat; destination; bevarande; verifiering; misslyckade jobb; återhämtning och ofullständiga källor." + } + ] + }, + { + "title": "Kapacitet och slitage", + "body": "Mäter tillväxtmarginal och tecken på utmattning eller åldrande.", + "href": "/monitor/audit/sample-audit-capacity-report.pdf", + "facts": [ + { + "label": "kontroller", + "value": "Lagrings- och hårdvaruområden, plus minne, swap, journal och värdfilsystemet." + }, + { + "label": "Innehåll", + "value": "Användning och tröskelvärden; thin pools; överallokering; minne; inoder; ZFS; temperaturer; drifttimmar; SMART-fel och NVMe/SSD-livslängd." + } + ] + } + ] + } + }, + { + "figure": { + "src": "/monitor/audit/audit-report-preview.png", + "alt": "Första sidan i en fullständig revisionsrapport", + "caption": "Varje dokument delar rapportidentifieraren, numrerade sektioner, datum, nod, profil och sidfot." + } + }, + { + "p": "Beroende på profil innehåller dokumentet nodidentitet och bedömningsdatum, sammanfattat resultat, sammanfattning per område, hårdvaru-, nätverks- och lagringsstruktur, gästernas skydd, fynd med underlag, oläsbara källor samt tillämpad omfattning och policy." + } + ] + }, + { + "id": "print", + "title": "Skriva ut eller spara som PDF", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Kör", + "body": "Bedömningen använder profilen som valts i Rapport." + }, + { + "title": "Granska", + "body": "Den färdiga körningen visar sina resultat, de källor som den inte kunde läsa och den politik den tillämpade." + }, + { + "title": "Skapa rapport", + "body": "Skapa rapport öppnar vyn som förberetts som ett dokument." + }, + { + "title": "Skriv ut", + "body": "Skriv ut eller spara som PDF öppnar webbläsarens utskriftsdialog där du väljer en skrivare eller Spara som PDF." + } + ] + } + }, + { + "calloutTip": { + "title": "Utskriften är ett dokument, inte en skärmdump", + "body": "Handlingsfältet är dolt, en tabell som fortsätter på nästa sida upprepar sin rubrik, block undviker onödiga raster och varje sida håller identifieringen och numreringen." + } + } + ] + }, + { + "id": "compare", + "title": "Jämför med en referenskörning", + "intro": "Använd som referens markerar en avslutad körning. Senare körningar jämförs med den och fynden delas upp i:", + "blocks": [ + { + "table": { + "headers": [ + "Grupp", + "Betydelse" + ], + "rows": [ + [ + "Nya", + "Rapporterade nu och inte tidigare." + ], + [ + "Försämrade", + "Rapporteras fortfarande men är allvarligare eller mer omfattande än tidigare." + ], + [ + "Förbättrade", + "Rapporteras fortfarande men är mindre allvarliga eller omfattande än tidigare." + ], + [ + "Lösta", + "Rapporteras inte längre och har inte accepterats av någon." + ], + [ + "Accepterade", + "Inte längre räknas eftersom en risk accepterades, inte för att värden ändrades." + ], + [ + "Bedöms inte längre", + "Fanns tidigare men saknas i denna körning; det har inte verifierats att de upphört." + ] + ] + } + }, + { + "table": { + "headers": [ + "Referenskörning", + "Beteende" + ], + "rows": [ + [ + "Ställa in den", + "Varje färdig körning kan markeras; ingen markeras automatiskt." + ], + [ + "Ändra den", + "Att markera en annan körning flyttar referensen utan att ta bort historiken." + ], + [ + "Jämför", + "När inga två körningar väljs använder jämförelsen referensen och den valda eller senaste körningen." + ], + [ + "Behålla körningar", + "De 30 senaste körningarna sparas; referenskörningen tas aldrig bort." + ], + [ + "Utan en referens", + "Vyn anger att ingen referenskörning valts ännu och att det därför inte finns något att jämföra med." + ] + ] + } + }, + { + "calloutWarning": { + "title": "En rapport beskriver ett ögonblick", + "body": "En bedömning certifierar inte en hel period. Äldre resultat slutar beskriva aktuellt tillstånd; vyn visar senaste körningens ålder och varje källa behåller sin insamlingstid." + } + } + ] + } + ] +} diff --git a/web/messages/sv/docs/monitor/audit-report/scope.json b/web/messages/sv/docs/monitor/audit-report/scope.json new file mode 100644 index 00000000..0e75f3aa --- /dev/null +++ b/web/messages/sv/docs/monitor/audit-report/scope.json @@ -0,0 +1,115 @@ +{ + "meta": { + "title": "Omfattning och garantier | Granskning och rapporter", + "description": "Var data i Granskning och rapporter kommer från, vad som ligger utanför dess vy, designens garantier och var data lagras." + }, + "header": { + "title": "Omfattning och garantier", + "description": "Var bedömningsdata kommer från, vad som ligger utanför dess vy och var Granskning och rapporter lagrar data.", + "section": "Granskning och rapporter" + }, + "sections": [ + { + "id": "sees", + "title": "Vad den observerar", + "blocks": [ + { + "list": { + "items": [ + "Konfiguration och tillstånd av den lokala noden.", + "Den deklarerade konfigurationen av VM och LXC.", + "Lagringens tillstånd som det är känt för Proxmox VE.", + "Den tillgängliga historien om säkerhetskopior och verifieringar.", + "SMART data och de händelser som Monitor har samlat in.", + "Tillstånd för tjänster, kluster, HA och lokala källor." + ] + } + } + ] + }, + { + "id": "outside", + "title": "Vad är utanför dess syn", + "blocks": [ + { + "list": { + "items": [ + "Insidan av gästerna, bortom vad de förklarar för Proxmox VE.", + "Nätverksutrustning utanför värden.", + "Fjärrberoenden som noden inte kan observera.", + "Fysiskt tillstånd som hårdvaran inte exponerar.", + "Ändringsloggen omfattar inte manuella åtgärder eller åtgärder från annan programvara." + ] + } + }, + { + "calloutWarning": { + "title": "Avsaknad av bevis är inte bevis på frånvaro", + "body": "En källa som inte kan läsas ger ett overifierat eller ofullständigt resultat, aldrig ett godkänt resultat. Rapporten listar de källor som inte var tillgängliga." + } + } + ] + }, + { + "id": "guarantees", + "title": "Garantier av designen", + "blocks": [ + { + "list": { + "items": [ + "Stabila identifierare för kontrollerna.", + "Historik över körningar och fynd.", + "En validerad policy, sparad atomiskt.", + "Godtagna risker med en anledning, synliga.", + "Koppling av ändringar till skript och funktion.", + "Registrering av tillstånd före och efter, när det är tillgängligt.", + "Ett uttryckligt resultat när något inte kan mätas eller fångas." + ] + } + } + ] + }, + { + "id": "storage", + "title": "Där data lagras", + "blocks": [ + { + "table": { + "headers": [ + "Data", + "Plats" + ], + "rows": [ + [ + "Policy", + "/usr/local/share/proxmenux/audit_policy.json" + ], + [ + "Bedömningar", + "Revisionsdatabasen för Monitor" + ], + [ + "Registrerade objekt", + "/usr/local/share/proxmenux/changes/objects/" + ], + [ + "Väntande poster", + "/usr/local/share/proxmenux/changes/spool/" + ], + [ + "Sammanställd logg", + "/usr/local/share/proxmenux/changes.db" + ] + ] + } + }, + { + "calloutInfo": { + "title": "Ett verktyg för att granska, inte en certifiering", + "body": "Granskning och rapporter granskar, jämför och dokumenterar noden. Resultaten tolkas tillsammans med systemets syfte, angiven policy och tillgängliga källor." + } + } + ] + } + ] +} diff --git a/web/messages/sv/docs/monitor/dashboard/apps.json b/web/messages/sv/docs/monitor/dashboard/apps.json new file mode 100644 index 00000000..135cb80c --- /dev/null +++ b/web/messages/sv/docs/monitor/dashboard/apps.json @@ -0,0 +1,174 @@ +{ + "meta": { + "title": "Apps-panelen: en startvy för alla webblänkar | ProxMenux", + "description": "Använd instrumentpanelen Apps för att öppna registrerade LXC Web Links och anpassade länkar, organisera dem efter kategori och hoppa tillbaka till gästen som äger varje tjänst." + }, + "header": { + "title": "Dashboard: Apps flik", + "description": "En enda launcher för webbgränssnitten du använder över noden, oavsett om de kommer från en registrerad LXC-applikation eller en anpassad webblänk.", + "section": "ProxMenux Monitor · Översikt" + }, + "intro": { + "title": "En launcher, inte en applikation installer", + "body": "Fliken Apps installerar inte program och upptäcker inte tjänster själv. Den samlar sparade länkar i ett sökbart rutnät. LXC-länkar ställs in på gästens App-flik; egna länkar kan lägga till VM-tjänster, omvända proxyservrar och externa paneler." + }, + "sources": { + "heading": "Vad som visas i Apps", + "intro": "Varje lanseringsbar URL blir ett eget kort. Källan bestämmer var kortet redigeras, men inte hur det ser ut under normal användning.", + "colSource": "Källa", + "colAppears": "Vad som visas", + "colManagedFrom": "Där den hanteras", + "rows": [ + { + "source": "Registrerad LXC-applikation", + "appears": "Ett kort för varje webblänk sparad på applikationsposten.", + "managedFrom": "VM och LXC → LXC-dialog → App" + }, + { + "source": "Anpassad länk bunden till en gäst", + "appears": "En tjänst URL associerad med en specifik VM eller LXC.", + "managedFrom": "Apps → redigera" + }, + { + "source": "Egen länk utan gästkoppling", + "appears": "Valfritt HTTP(S)-mål, inklusive externa tjänster eller tjänster bakom en omvänd proxy.", + "managedFrom": "Apps → redigera" + } + ], + "relationshipTitle": "Appar och LXC App-fliken har olika jobb", + "relationshipBody": "LXC-gästens App-flik hanterar identitet, webblänkar och valfri versionsspårning. Apps använder länkarna som snabb åtkomst. Redigering av ett LXC-kort leder därför till gästens post utan att duplicera konfigurationen." + }, + "cards": { + "heading": "Hur man använder ett kort", + "intro": "Hela kortet är lanseringsmålet, medan dess mindre kontroller ger kontext utan att öppna tjänsten.", + "items": [ + "Klicka på kortet för att öppna sin URL i en ny webbläsarflik.", + "Logotypen använder Web Link-logotypen först och faller tillbaka till applikationslogotypen när så är lämpligt.", + "Kategorietiketten använder samma färg och text som motsvarande webblänk i LXC-gästens App-flik.", + "Gästetiketten visar kopplad VM eller LXC. Ett klick öppnar dess dialog: LXC-länkar öppnar App, VM-länkar Status.", + "En lila uppåtpil innebär att den specifika applikationen eller Docker-bilden har en tillgänglig uppdatering. Det är inte en allmän uppdatering räknas för hela gästen." + ] + }, + "toolbar": { + "heading": "Sök, filter och sortera", + "intro": "Verktygsfältet begränsar en stor applikationssamling utan att ändra sparade poster.", + "items": [ + "Sök matchar applikationsnamnet, gästnamnet, VMID och kategori.", + "Kategorifiltret visar en kategori åt gången eller alla applikationer.", + "Sortera efter Namn, ID eller Kategori. Kategorisortering lägger in rubriker mellan kortgrupper.", + "Sorteringen sparas i denna webbläsare. Söktext och kategorifilter återställs när sidan besöks igen.", + "Fliken Apps förblir tillgänglig när nätet är tomt, så den första anpassade länken kan läggas till utan att registrera en LXC-applikation först." + ] + }, + "customLinks": { + "heading": "Lägga till och redigera anpassade webblänkar", + "intro": "Använd en anpassad länk när tjänsten inte representeras av en registrerad LXC-applikation.", + "steps": [ + "Välj Lägg till länk i verktygsfältet eller den tomma vyn.", + "Ange ett namn och en komplett http:// eller https:// URL.", + "Alternativt lägga till en logotyp, välj eller skapa en kategori och bind länken till en VM eller LXC.", + "Spara länken. Kortet visas direkt i rutnätet.", + "Välj Redigera och pennan på kortet för att ändra eller ta bort en egen länk." + ], + "colField": "Fält", + "colRequired": "Krav", + "colPurpose": "syfte", + "fields": [ + { + "field": "Namn", + "required": "Ja", + "purpose": "Kortet titel och sökterm." + }, + { + "field": "URL", + "required": "Ja", + "purpose": "Den kompletta HTTP (S) destination öppnas av kortet." + }, + { + "field": "Logotyp URL", + "required": "Nej", + "purpose": "En fjärrbild som visas på kortet." + }, + { + "field": "Kategori", + "required": "Nej", + "purpose": "Lägger till ett delat märke och möjliggör kategorifiltrering." + }, + { + "field": "Gästkoppling", + "required": "Nej", + "purpose": "Kopplar länken till en VM eller LXC och aktiverar gästgenvägen." + } + ], + "editTitle": "Redigera källan till sanning", + "editBody": "Redigeringsläget visar pennor bara för egna länkar. För ett LXC-applikationskort öppnar du gästens App-flik och redigerar den sparade länken." + }, + "categories": { + "heading": "Kategorier och uppdateringssignaler", + "intro": "Kategorier organiserar länkar; uppdateringssignaler rapporterar programvarutillstånd. De är avsiktligt separata.", + "items": [ + "Katalogstödd LXC-registrering kan fylla i en kategori, men den är fortfarande redigerbar.", + "Anpassade kategorinamn kan skapas från samma väljare och sedan återanvändas av filtret.", + "Kategorifärger är deterministiska och anpassar sig till ljus eller mörkt tema. Lila och röda intervall är reserverade för uppdatering och farliga tillstånd.", + "För Docker-webblänkar kopplar ProxMenux kortet till dess container eller avbildning och visar avbildningens uppdateringsstatus. Docker Engine-uppdateringar finns kvar på LXC-gästens Uppdateringar-flik." + ] + }, + "persistence": { + "heading": "Persistens och cache beteende", + "intro": "Dashboarden är utformad för att öppna från redan tillgängliga Monitor-data istället för att rescan varje gäst.", + "items": [ + "Egna länkar sparas atomiskt i /etc/proxmenux/custom_links.json och läses in i minnet när Monitor startar.", + "Registrerade LXC-länkar förblir en del av deras applikations sparade Monitor-post; Apps-instrumentpanelen duplicerar dem inte i den anpassade länkfilen.", + "Skapa, redigera eller ta bort en anpassad länk uppdaterar in-memory-listan omedelbart.", + "Sorteringsvalet gäller lokalt i webbläsaren och synkroniseras inte mellan enheter eller användare.", + "Apps position i huvudnavigeringen ställs in separat under Inställningar → Navigeringsordning." + ] + }, + "troubleshooting": { + "heading": "Vanliga situationer", + "colProblem": "Situation", + "colResolution": "Lösning", + "rows": [ + { + "problem": "En LXC-applikation är registrerad men inget kort visas", + "resolution": "Öppna sin App-flik och lägg till minst en webblänk. Version spårning ensam skapar inte ett lanseringskort." + }, + { + "problem": "URL eller logotyp är fel", + "resolution": "Redigera den anpassade länken i Apps, eller redigera webblänken i den egna LXC App-fliken." + }, + { + "problem": "En Docker-tjänst saknas", + "resolution": "Redigera den registrerade Docker-applikationen och spara tjänstens publicerade webbport som en webblänk." + }, + { + "problem": "Den lila pilen hänvisar till fel Docker-uppdatering", + "resolution": "Granska webblänkens namn och beskrivning så att de kan matchas till den avsedda containern eller avbildningen." + }, + { + "problem": "Appar öppnar först istället för Systemöversikt", + "resolution": "Det första sparade objektet i Inställningar → Navigationsorder blir landningsfliken. Återställ standardordningen eller flytta översikt först." + } + ] + }, + "whereNext": { + "heading": "Var till nästa", + "items": [ + { + "label": "LXC App fliken", + "href": "/docs/monitor/dashboard/vms-lxcs/app", + "tail": " - registrera applikationer, webblänkar och valfri versionsspårning." + }, + { + "label": "LXC Updates fliken", + "href": "/docs/monitor/dashboard/vms-lxcs/updates", + "tail": " — konfigurera och köra uppdateringar av applikationer, Docker Engine och avbildningar." + }, + { + "label": "Inställningar flik", + "href": "/docs/monitor/dashboard/settings#navigation-order", + "tail": " — ändra navigeringsordningen och startfliken." + } + ] + } +} diff --git a/web/messages/sv/docs/monitor/dashboard/hardware.json b/web/messages/sv/docs/monitor/dashboard/hardware.json new file mode 100644 index 00000000..95408fac --- /dev/null +++ b/web/messages/sv/docs/monitor/dashboard/hardware.json @@ -0,0 +1,248 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Översikt: Hårdvara | ProxMenux-dokumentation", + "description": "Fliken Hårdvara inventerar den fysiska maskinen: CPU och moderkort, minnesmoduler, temperatursensorer, GPU:er med realtidsövervakning per plats och drivrutinsinstallation med ett klick, Coral TPU-acceleratorer, lagringssammanfattning med länkhastigheter, PCI- och USB-listor, effekt, nätaggregat, fläktar och UPS-status." + }, + "header": { + "title": "Översikt: Hårdvara", + "description": "Den fysiska maskinen i en skärm - CPU och moderkortsidentitet, varje minnesmodul, termiska sensorer över alla delsystem, GPU med levande utnyttjande och en inbyggd drivrutininstallatör, Coral TPU, varje PCI och USB-enhet med sin kärndrivrutin, hela diskinventeringen med förhandlade länkhastigheter, plus ström, kylning och UPS.", + "section": "ProxMenux Monitor · Översikt" + }, + "intro": { + "title": "Byggd av standardverktyg", + "body": "De flesta data kommer från lscpu, dmidecode, lspci, lsusb, lsblk, smartctl, nvme, sensors, nvidia-smi, intel_gpu_top, amdgpu_top, ipmitool och upsc. Avsnitten visas bara när verktyget ger data: utan UPS visas inget UPS-kort och utan IPMI saknas effektvärden från separat maskinvaruövervakning." + }, + "thresholds": { + "title": "Statusfärger och trösklar som tillämpas här", + "intro": "Alla temperaturindikatorer och värden använder samma skala: grön under Varning, bärnstensfärgad mellan Varning och Kritisk, röd från Kritisk och uppåt. Rekommenderade standardvärden i ProxMenux:", + "items": [ + "CPU-temperatur — varning 80 °C, kritisk 90 °C.", + "Disktemperatur HDD 60/65 °C · SSD 70/75 °C · NVMe 80/85 °C · SAS 55/65 °C (varning / kritisk)." + ], + "outro": "Alla värden kan ställas in per värd. Inställningar → Tröskelvärden för hälsokontrollen är den centrala referensen och förklarar hur de anpassas." + }, + "sections": { + "heading": "Avsnitt", + "intro": "Avsnitten visas i den här ordningen uppifrån och ner. Vissa kräver motsvarande hårdvara eller verktyg och markeras med (villkorligt).", + "systemInfoTitle": "Systeminformation", + "systemInfoIntro": "Två sida vid sida block, alltid närvarande:", + "systemInfoItems": [ + "CPU — modell, mikroarkitektur, socklar/kärnor/trådar, bas- och boostfrekvens, virtualiseringsstöd (VT-x / AMD-V) och cachetopologi.", + "Moderkort — tillverkare, modell, BIOS-version och datum samt SMBIOS-UUID. Hjälper dig hitta rätt nedladdningssida för firmware hos tillverkaren." + ], + "memoryTitle": "Minnesmoduler", + "memoryBody": "En rad per upptagen plats från dmidecode: platsnamn, modulstorlek, typ (DDR4 / DDR5 / ECC-varianter), inställd och nominell hastighet, tillverkare, artikelnummer och serienummer. Tomma platser är nedtonade för att visa möjligheten till utbyggnad.", + "thermalTitle": "Termisk övervakning", + "thermalIntro": "Sju block med data från lm-sensors, sysfs och verktygsspecifika insamlare. Lagringens hwmon-sensorer kopplas till den fysiska blockenheten med modell och sökväg /dev/.... Ett block döljs om kategorin saknar sensorer.", + "thermalItems": [ + "CPU — temperatur för CPU-paketet och varje kärna.", + "GPU — sensorer för dedikerade GPU:er via nvidia-smi / amdgpu_top samt Intel iGPU. Visar hetaste punkt och minnesövergångens temperatur när drivrutinen tillhandahåller dem.", + "NVME — styrenhetens sammansatta temperatur kopplad till dess exakta NVMe-namnrymd.", + "HDD - drivetemp-avläsningar för rotationsblockenheter.", + "SSD - drivetemp-avläsningar för icke-rotationella SATA / SAS-blockenheter.", + "PCI - sensorer som dyker upp som PCI-fästa enheter (HBA, nätverkskort med interna sensorer).", + "OTHER - chipset, VRM, omgivande sensorer som inte passar någon annanstans." + ] + }, + "graphics": { + "heading": "Grafikkort", + "intro": "Varje videokontroller visas som ett kort med tillverkare, modell, typ (Integrerad / PCI / BMC), PCI-adress (BDF), kärndrivrutin och moduler. Byt läge växlar mellan LXC-delning med inbyggd drivrutin och VM-passthrough (vfio-pci). Byt GPU-läge (VM ↔ LXC) beskriver ändringarna på värden.", + "vfioImageAlt": "Grafikkort: integrerad Matrox G200EH kopplad till mgag200, redo för LXC, och NVIDIA Quadro P400 kopplad till vfio-pci, redo för VM-passthrough", + "vfioImageCaption": "Två GPU:er: Matrox BMC-kretsen använder sin vanliga drivrutin och är redo för LXC; NVIDIA Quadro P400 är kopplad till vfio-pci, redo för VM-passthrough.", + "lxcImageAlt": "Grafikkort: Intel UHD Graphics iGPU med i915 och NVIDIA Quadro P1000 med nvidia, båda redo för LXC-containrar", + "lxcImageCaption": "Samma nod efter att ha bytt NVIDIA-kortet tillbaka till den infödda drivrutinen - både GPU: er nu redo för LXC-containrar.", + "realtimeTitle": "Dialogruta för realtidsövervakning", + "realtimeBody": "Ett klick öppnar övervakning per GPU-plats och hämtar data med tillverkarens verktyg var tredje sekund. Den visar tillverkare, typ, PCI-plats, drivrutin, kärnmoduler, motorbelastning (Render/3D, Video, Blitter, VideoEnhance), grafik- och minnesfrekvenser, temperatur, rapporterad effekt, VRAM och aktiva processer med belastning per process. Data från /api/gpu/<slot>/realtime.", + "toolsIntro": "Tillverkarverktyget som används för varje GPU:", + "headerVendor": "Tillverkare", + "headerTool": "Verktyg", + "headerProject": "Projekt", + "tools": [ + { + "vendor": "NVIDIA", + "tool": "nvidia-smi", + "projectLabel": "developer.nvidia.com", + "projectHref": "https://developer.nvidia.com/nvidia-system-management-interface" + }, + { + "vendor": "Intel iGPU", + "tool": "intel_gpu_top (igt-gpu-tools)", + "projectLabel": "gitlab.freedesktop.org", + "projectHref": "https://gitlab.freedesktop.org/drm/igt-gpu-tools" + }, + { + "vendor": "AMD", + "tool": "amdgpu_top", + "projectLabel": "github.com/Umio-Yasuno/amdgpu_top", + "projectHref": "https://github.com/Umio-Yasuno/amdgpu_top" + }, + { + "vendor": "Matrox / ASPEED (BMC)", + "tool": "— (endast visning)", + "projectLabel": "Upptäckt och märkt som BMC; inget realtidsblock." + } + ], + "nvidiaImageAlt": "Övervakning av NVIDIA Quadro P1000: tillverkare NVIDIA, drivrutinen nvidia laddad, grafikfrekvens 1.26 GHz, minnesfrekvens 2.50 GHz, temperatur 50 °C, alla motorer på 0 %, inga aktiva processer, totalt 4096 MiB minne", + "nvidiaImageCaption": "NVIDIA Quadro P1000 med proprietär drivrutin: frekvenser, temperatur, belastningsstaplar för motorerna och aktiva processer.", + "intelImageAlt": "Övervakning av Intel UHD Graphics iGPU med i915: effekt 11.31 W, videobelastning 1 % och en ffmpeg-process som använder 8 MB", + "intelImageCaption": "Intel iGPU med i915 aktiv. Tabellen Aktiva Processer plockar upp ett ffmpeg jobb med hjälp av videomotorn.", + "amdImageAlt": "Övervakning av integrerad AMD Lucienne GPU med amdgpu: motorbelastning 0 % och amdgpu_top som aktiv process", + "amdImageCaption": "AMD iGPU övervakas med amdgpu_top. Verktyget visas som aktiv process eftersom det samlar in livevärdena.", + "installTitle": "Installera NVIDIA-drivrutinen från dialogrutan", + "installBody": "Med nouveau/nvidiafb utan proprietär NVIDIA-drivrutin saknas frekvenser, effekt och processbelastning. Dialogrutan visar Installera NVIDIA-drivrutiner, som kör skriptet i Installera NVIDIA-drivrutiner på värden.", + "noDriverAlt": "Övervakning av NVIDIA Quadro P620 med nvidiafb och nouveau laddade, meddelandet Utökad övervakning saknas och en blå knapp Installera NVIDIA-drivrutiner", + "noDriverCaption": "Ingen proprietär drivrutin installerad ännu — dialogrutan erbjuder installation med ett klick.", + "promptAlt": "Bekräftelse på installation av NVIDIA-drivrutin med upptäckta GPU:er, LXC-containrar med NVIDIA-passthrough och knapparna Ja/Avbryt", + "promptCaption": "Sammanfattning före installation: upptäckta GPU:er, LXC-containrar med NVIDIA-passthrough och skriptets åtgärder. Inget ändras före bekräftelsen.", + "successAlt": "Terminalutdata med NVIDIA-drivrutinen 580.105.08 installerad och nvidia-smi som visar en Quadro P620", + "successCaption": "Framgångsrik installation - NVIDIA .run byggd via DKMS, uthållighetstjänsten är på plats, och nvidia-smi rapporterar GPU.", + "warningTitle": "Välj en drivrutinsversion som din GPU stöder", + "warningBody": "Nyare NVIDIA-grenar slutar stödja äldre GPU-familjer som Maxwell och Kepler. Om nvidia-smi visar \"No devices were found\" efter installationen eller DKMS misslyckas kan grenen sakna stöd för din GPU. Kör igen med en äldre gren, exempelvis legacy 470.x för Kepler. Kontrollera stödet på den officiella sidan för drivrutinssökning.", + "whereGoIntro": "Vart ska man gå härifrån:", + "whereGoItems": [ + "Installera NVIDIA-drivrutiner på värden — fullständig guide, kompatibilitetsmatris för kärnan, valfri NVENC-patch och överföring till LXC.", + "Byt GPU-läge (VM ↔ LXC) — vad reglaget Byt läge på kortet gör.", + "Lägg till GPU i VM (passthrough) och Lägg till GPU i LXC — första tilldelning av en obunden GPU." + ] + }, + "coral": { + "heading": "Coral TPU / AI-acceleratorer", + "subHeading": "(villkorligt)", + "intro": "Visas när Google Coral eller andra AI-acceleratorer är anslutna. Enhetsdialogrutan visar anslutning (M.2 / mini-PCIe / USB), PCIe-bredd, tillverkar-/produkt-ID, programstöd (apex i kärnan för PCIe, libedgetpu i användarrymden för USB), moduler (gasket + apex), enhetsnoder (/dev/apex_*), Edge TPU-runtime-status, aktuell temperatur och firmwaregränser för varningar.", + "imageAlt": "Coral Edge TPU-detaljer: PCIe/M.2, länk 5.0 GT/s x1, ID 1ac1:089a, kärndrivrutin apex, gasket och apex laddade, /dev/apex_0 finns, Edge TPU Runtime ej installerad, 53.5 °C och maskinvarugränser för temperaturvarningar", + "imageCaption": "M.2 Coral med värdens kärnmoduler laddade, enhetsnoden tillgänglig och firmwaregränser för temperaturvarningar synliga. Runtime-raden blir grön när rätt Edge TPU Runtime är installerad.", + "pathsIntro": "Två installationsvägar finns beroende på formfaktorn:", + "pathsItems": [ + "M.2 / Mini-PCIe — värden behöver kärnmodulerna gasket + apex byggda med DKMS så att enhetsnoden /dev/apex_0 finns vid start.", + "USB-accelerator — värden behöver bara Edge TPU-runtime i användarrymden (libedgetpu1-std) från Googles APT-förråd." + ], + "outro": "Installera Coral TPU på värden upptäcker och hanterar båda varianterna. Bakgrund och officiell runtime finns på coral.ai/docs. Tilldela sedan enheten till en container med Lägg till Coral TPU i LXC." + }, + "storage": { + "heading": "Lagringssammanfattning", + "intro": "Alla blockenheter som kärnan känner till, grupperade efter typ. Varje disk visar namn (sda, nvme0n1, zram0…), typ (SSD, HDD, NVMe SSD), modell och förhandlad länk. Klicka för modell, serienummer, kapacitet, gränssnitt samt aktuell och maximal länkhastighet.", + "imageAlt": "Storage Sammanfattningskort som listar elva blockenheter (SATA SSDs, SATA HDDs, NVMe SSDs och zram) med modellsträngar och förhandlade länkhastigheter; de två NVMe-enheterna visar 3.0 x4 med den aktuella hastigheten markerad", + "imageCaption": "Elva enheter på noden. SATA-länkar visas som SATA <version>, <Gb/s> (current: ...); NVMe som <PCIe gen> x<width>.", + "nvmeBody": "För varje NVMe jämförs den förhandlade länken med enhetens maximum. Vid skillnad, exempelvis en Gen3 x4 SSD på 3.0 x1 i en plats med en enda bana, visas aktuellt värde i bärnstensfärg. Det hjälper vid felsökning av långsamma diskar eller ändrad bantilldelning efter en BIOS-uppdatering.", + "nvmeModalAlt": "NVMe-enhetsdetalj modal för nvme0n1: NVMe SSD-typ, 953.9 GB-kapacitet, nuvarande länkhastighet 3.0 x1 markerad i amber, maximal kopplingshastighet 3.0 x4, modell WDC CL SN720, serienummer, PCIe / NVMe gränssnitt", + "nvmeModalCaption": "NVMe-detaljer med färre banor: enheten stöder x4 men platsen är kopplad som x1.", + "outro": "SMART-data, självtester, historik och PDF-rapport finns under Översikt: Lagring. Samma data används av SMART-diskstatus och tester. Ett långt test från skriptet skriver den JSON som Monitor visar under Lagring → Historik." + }, + "pci": { + "heading": "PCI-enheter", + "intro": "PCI-enheter identifieras med PCI BDF (Bus:Device.Function, exempelvis 03:00.0) och klass (Lagringskontroller, USB-kontroller, Grafikkort, Nätverkskontroller, Ljudkontroller…). Varje kort visar tillverkare, namn och kopplad kärndrivrutin, användbart för felsökning av passthrough, IOMMU-grupper och fel drivrutin.", + "imageAlt": "PCI-enheter sektion som listar femton enheter grupperade av klass: lagringskontroller på ahci / nvme, USB-kontroller, grafikkort (en på vfio-pci, en på den infödda drivrutinen), nätverkskontroller på igb / tg3, en ljudkontroller tillsammans med en genomgående GPU", + "imageCaption": "Femton enheter på denna nod. Notera GPU och dess följeslagare ljudfunktion både bunden till vfio-pci - det är ett kort förberedt för VM genomgång.", + "bdfTitle": "Läsa BDF", + "bdfBody": "03:00.0 betyder PCI-buss 03, enhet 00, funktion 0. Dedikerade GPU:er använder oftast .0 för grafik och .1 för HDMI-ljud. Båda funktionerna förs vidare till VM:n tillsammans; därför rensar Byt GPU-läge även överblivna ljudkopplingar när VM-läget lämnas." + }, + "usb": { + "heading": "USB-enheter", + "intro": "USB-enheter med tillverkare och produkt, USB-version, adress bus:device, ID vendor:product och kärndrivrutin. De grupperas efter roll: Kommunikation (Z-Wave-/Zigbee-adaptrar), UPS, lagring och HID. Då kan du identifiera adaptrarna utan att jämföra deras ID.", + "imageAlt": "USB-enheter kort som listar tre enheter: en Aeotec Z-Wave Z-Stick, en ConBee II Zigbee koordinator och en Ellipse ECO UPS, var och en med USB-version, adress, leverantör: produkt ID och bunden drivrutin", + "imageCaption": "Tre USB-enheter - två hemautomationsradio på usbfs och en UPS på usbfs (NUT talar med det genom libusb)." + }, + "power": { + "heading": "Energiförbrukning", + "subHeading": "(villkorligt)", + "intro": "Visas om värden tillhandahåller effektdata. Två oberoende källor visas när de finns:", + "items": [ + "Total effekt ACPI / IPMI — hela systemets effekt från en moderkortssensor eller BMC. Vanligt på serverkort.", + "CPU-paketets effekt — Intel RAPL-räknare eller AMD:s motsvarighet. Skiljer CPU-effekten från resten på konsumentkort utan totalmätning." + ], + "supplyImageAlt": "Effekt: 198 W totalt via ACPI och två nätaggregat med status OK och uteffekt 185 W respektive 5 W", + "supplyImageCaption": "Serverkort med en ACPI-effektsensor och två nätaggregat via IPMI: det andra är redundant och ger 5 W i viloläge.", + "cpuImageAlt": "Effekt på konsumentkort: endast CPU-effekt 8.7 W via Intel RAPL", + "cpuImageCaption": "Konsumentkort utan totalsensor — endast CPU-effekt via RAPL visas." + }, + "psu": { + "heading": "Strömförsörjning", + "subHeading": "(villkorligt)", + "body": "På servrar med dubbla nätaggregat visar IPMI närvaro (PSU 1 / PSU 2 / …), ingångsspänning, uteffekt och status OK/fel. Kontrollera detta efter ett strömavbrott på en nod med redundanta nätaggregat." + }, + "fans": { + "heading": "Systemfläktar", + "subHeading": "(villkorligt)", + "body": "Varvtal per fläkt med minidiagram när det stöds. Utan individuella värden visas en enda avläsning för chassifläkten." + }, + "ups": { + "heading": "UPS-status", + "subHeading": "(villkorligt)", + "body": "Visas när en NUT-server (Network UPS Tools) är konfigurerad och nåbar. Visar status (nät / batteri / laddning / låg batterinivå), batterinivå, uppskattad drifttid, belastningsprocent, ingångsspänning, modell och firmware. Samma data används i Säkerhet och certifikat i hälsokontrollen; batteridrift uppmärksammas direkt." + }, + "dataCollected": { + "heading": "Hur data samlas in", + "headerSection": "Avsnitt av fliken", + "headerEndpoint": "Slutpunkt", + "headerSource": "Källa", + "rows": [ + { + "section": "Statisk inventering (PCI, CPU, BIOS)", + "endpoint": "/api/hardware", + "source": "lspci -vmm, /proc/cpuinfo, dmidecode; cachad för livslängden av processen." + }, + { + "section": "Live sensor värden", + "endpoint": "/api/hardware/live", + "source": "sensors (lm-sensors), /sys/class/hwmon och /sys/block identifierar lagringsenheterna. Temperaturerna är aktuella; endast kopplingen mellan hwmon och enheter cachas i 60 sekunder." + }, + { + "section": "CPU temperaturhistoria", + "endpoint": "/api/temperature/history", + "source": "Tidsserie som temperaturinsamlaren registrerar var 60:e sekund och sparar i SQLite." + }, + { + "section": "GPU-mätvärden i realtid", + "endpoint": "/api/gpu//realtime", + "source": "NVIDIA: nvidia-smi --query-gpu=.... Intel: intel_gpu_top. AMD: sysfs /sys/class/drm/cardN." + } + ], + "codeComment1": "# Jämför inventeringen med operativsystemets vy", + "codeComment2": "# Bekräfta GPU-kortet instrumentpanelen ser" + }, + "whereNext": { + "heading": "Nästa steg", + "items": [ + { + "label": "Installera NVIDIA-drivrutiner på värden", + "href": "/docs/hardware/nvidia-host", + "tail": " — skriptet som installationsknappen i GPU-dialogrutan kör." + }, + { + "label": "Byt GPU-läge (VM ↔ LXC)", + "href": "/docs/hardware/switch-gpu-mode", + "tail": " — ändringarna på värden när läget växlas på ett GPU-kort." + }, + { + "label": "Installera Coral TPU på värden", + "href": "/docs/hardware/install-coral-tpu-host", + "tail": " — installation av Coral-kärnmodul och runtime." + }, + { + "label": "SMART-status och disktest", + "href": "/docs/disk-manager/smart-disk-test", + "tail": " — skriptet bakom SMART-data i diskdetaljerna på fliken Lagring." + }, + { + "label": "Dashboard: Storage Tab", + "href": "/docs/monitor/dashboard/storage", + "tail": " - Full SMART attributtabell, självtesthistoria och PDF-rapport." + }, + { + "label": "Hälsoövervakare", + "href": "/docs/monitor/health-monitor", + "tail": " — kategorin CPU och temperatur, som använder samma sensorer." + }, + { + "label": "API-referens", + "href": "/docs/monitor/api", + "tail": " — slutpunkterna för hårdvara och GPU." + }, + { + "label": "Översiktsindex", + "href": "/docs/monitor/dashboard", + "tail": " — de andra flikarna." + } + ] + } +} diff --git a/web/messages/sv/docs/monitor/dashboard/index.json b/web/messages/sv/docs/monitor/dashboard/index.json new file mode 100644 index 00000000..a7a98c84 --- /dev/null +++ b/web/messages/sv/docs/monitor/dashboard/index.json @@ -0,0 +1,101 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Översikt | ProxMenux-dokumentation", + "description": "Panelen är ProxMenux Monitors huvudgränssnitt: tio innehållsflikar inklusive Apps-startaren, ett gemensamt sidhuvud och en konfigurerbar ordning i huvudnavigeringen." + }, + "header": { + "title": "Översikt", + "description": "ProxMenux Monitors vardagsvy: tio innehållsflikar inklusive Apps-startaren, ett gemensamt sidhuvud och en konfigurerbar ordning i huvudnavigeringen.", + "section": "ProxMenux Monitor" + }, + "oneHeader": { + "title": "En rubrik, tio flikar", + "body": "Sidhuvudet med logotyp, nodnamn, statusindikator, drifttid, uppdatering och tema förblir synligt. Den aktiva fliken ändrar hela innehållsytan nedanför. Statusfärgen visar den allvarligaste kategorin i hälsoövervakningen; samma värde visas i panelen." + }, + "tabs": { + "heading": "De tio flikarna", + "intro": "Varje flik har sin egen dedikerade sida. Sidor läggs inkrementellt som dokumentationen fylls i; nedan är den fullständiga listan och vad var och en är ansvarig för.", + "headerTab": "Flik", + "headerOwns": "Vad fliken omfattar", + "rows": [ + { + "name": "Systemöversikt", + "linksTo": "/docs/monitor/dashboard/system-overview", + "owns": "CPU / minne / temperatur widgets, aktiva VM & LXC räkna, historiska metriska diagram, lagring och nätverkssammanfattningar. Standardlandningsfliken tills navigationsordern är anpassad." + }, + { + "name": "Appar", + "linksTo": "/docs/monitor/dashboard/apps", + "owns": "Gemensam startvy för registrerade LXC-webblänkar och egna länkar, med kategorier, sökning, gästgenvägar och uppdateringsindikatorer per applikation." + }, + { + "name": "Lagring", + "owns": "Proxmox pooler, fysiska diskar, SMART data, ZFS tillstånd, slitage och livstid, observationshistorik." + }, + { + "name": "Nätverk", + "owns": "Fysiska gränssnitt, bondningar, bryggor och OVS, IP/MAC-adresser, RX/TX-diagram och RRD-historik per gränssnitt." + }, + { + "name": "VM och LXC", + "owns": "Inventering av gäster, detaljvyer för konfiguration, mätvärden och loggar samt start, stopp, omstart och avstängning." + }, + { + "name": "Hårdvara", + "owns": "CPU modell och topologi, minne layout, PCIe topologi, GPU med per-slot realtid övervakning." + }, + { + "name": "Systemloggar", + "owns": "Live journalctl med filter, Proxmox aktivitetshistorik, anmälningslogg, nedladdningsbara loggpaket." + }, + { + "name": "Terminal", + "owns": "Skal till värden eller valfri VM/CT i webbläsaren, med xterm.js över WebSockets." + }, + { + "name": "Säkerhet", + "owns": "Auth installation, lösenord / 2FA / API tokens, revisionslogg, valfri Fail2Ban panel, Secure Gateway distribution." + }, + { + "name": "Inställningar", + "owns": "Monitors språk, navigeringsordning, aviseringskanaler, AI-leverantör, hälsotrösklar, undantag och inventering av efterinstallationsoptimeringar." + } + ] + }, + "headerAnatomy": { + "heading": "Header anatomi", + "items": [ + "Logo + produktnamn till vänster. Logotypen förvandlas till en \"uppdatering tillgänglig\" variant när en nyare Monitor release upptäcks.", + "Nodidentitet: namn från pvesh get /nodes, med hostname som reserv.", + "Statusindikator: Frisk (grön), Varning (gul), Kritisk (röd). Ett klick öppnar hälsoövervakningen. Ett blått info-märke visas när avfärdade poster fortfarande är inom sin undertryckningstid.", + "Drifttid: värdens drifttid i lättläst format.", + "Uppdateringsknapp: upprepar API-anropen för aktuella data utan att ladda om hela sidan.", + "Temaväljare: ljust, mörkt eller system. Sparas i localStorage." + ] + }, + "whereNext": { + "heading": "Var till nästa", + "items": [ + { + "label": "Apps flik", + "href": "/docs/monitor/dashboard/apps", + "tail": " — gemensam startvy för webblänkar och dess relation till registrerade LXC-applikationer." + }, + { + "label": "Systemöversikt flik", + "href": "/docs/monitor/dashboard/system-overview", + "tail": " - landningsfliken, fullt dokumenterad." + }, + { + "label": "Hälsoövervakare", + "href": "/docs/monitor/health-monitor", + "tail": " — dialogen bakom statusindikatorn med detaljer för tio kategorier." + }, + { + "label": "Arkitektur", + "href": "/docs/monitor/architecture", + "tail": " — Hur instrumentpanelen pratar med Flask backend." + } + ] + } +} diff --git a/web/messages/sv/docs/monitor/dashboard/network.json b/web/messages/sv/docs/monitor/dashboard/network.json new file mode 100644 index 00000000..de31d3d0 --- /dev/null +++ b/web/messages/sv/docs/monitor/dashboard/network.json @@ -0,0 +1,251 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Översikt: fliken Nätverk | ProxMenux-dokumentation", + "description": "Fliken Nätverk listar värdens gränssnitt: fysiska nätverkskort, bryggor, bond-gränssnitt, VLAN och virtuella VM/LXC-gränssnitt. Detaljvyn visar IP, MAC, status, bond-medlemmar, trafik sedan start och RRD-historik." + }, + "header": { + "title": "Översikt: fliken Nätverk", + "description": "Gränssnitten som kärnan rapporterar — fysiska kort, bryggor, bond-gränssnitt, VLAN och virtuella VM/LXC-portar — grupperas i tre kort. Klicka på en rad för att visa adresser, trafikräknare och historiska RRD-data.", + "section": "ProxMenux Monitor · Översikt" + }, + "intro": { + "title": "Aktuella och historiska data", + "body": "Aktuell status kommer från psutil.net_if_stats() och ip, bandbreddshistoriken från Proxmox RRD-lagring via /api/network/<interface>/metrics. Räknarna uppdateras ungefär var femte sekund och RRD-data för diagrammet hämtas vid behov." + }, + "topRow": { + "heading": "Översta raden: fyra statistikkort", + "headerCard": "Kort", + "headerWhat": "Vad det visar", + "rows": [ + { + "card": "Nätverkstrafik", + "what": "Aggregerad RX / TX-hastighet över alla gränssnitt, formaterad i rätt enhet (bps / Kbps / Mbps / Gbps)." + }, + { + "card": "Aktiva gränssnitt", + "what": "Två räknare: Physical X / Y och Bridges X / Y, aktiva av totalt antal. En första kontroll när något slutar fungera." + }, + { + "card": "Nätverksstatus", + "what": "Snabb bedömning: Bra / Varning / Kritiskt utifrån länkstatus, gatewayens nåbarhet och bryggans integritet. Motsvarar kategorin Nätverksgränssnitt i Health Monitor." + }, + { + "card": "Nätverkslatens", + "what": "Svarstid till gatewayen med ett litet diagram. Ett klick öppnar dialogen Nätverkslatens som beskrivs nedan: historik och pingtest vid behov mot gatewayen, Cloudflare eller Google med en nedladdningsbar PDF-rapport." + } + ] + }, + "flow": { + "heading": "Nätverksflödesdiagram", + "intro": "Mellan den översta raden och de tre korten visar Network Flow aktuell topologi. Paketvägarna går från fysiska nätverkskort via bryggor i mitten till VM och containrar. Animerade pulser visar aktuell rx/tx-trafik på varje länk.", + "imageAlt": "Nätverksflödesdiagram - NICs till vänster, värd och broar i mitten, VM och LXCs till höger, med animerade pulser på varje anslutning", + "imageCaption": "Nätverksflöde - färgkodade noder plus animerade kometer vars riktning och tjocklek återspeglar levande trafik.", + "elementsTitle": "Vad diagrammet visar", + "elementsIntro": "Varje nod representerar en post i samma inventering som korten nedanför. Topologin gör deras samband direkt synliga:", + "elements": [ + "Nätverkskort (orange) — fysiska gränssnitt med aktiv länk; inaktiva visas nedtonade.", + "Värd (orange) — Proxmox-värden mellan nätverkskort och bryggor. En fast punkt som inte är klickbar.", + "Bryggor (cyan) — Linux- och OVS-bryggor med minst en aktiv gäst. Oanvända bryggor döljs så att diagrammet visar den faktiska trafiken.", + "LXC (cyan) — containrar som körs och är anslutna till en brygga.", + "VM (lila) — virtuella maskiner som körs och är anslutna till en brygga.", + "Stoppade VM och containrar döljs." + ], + "pulsesTitle": "Vad animationen kodar", + "pulsesBody": "De animerade kometer som reser längs varje kant representerar levande trafik:", + "pulses": [ + "Riktning — mot nätverkskortet betyder gästens tx, mot gästen betyder rx.", + "Linjebredden ökar med gästens rx+tx-hastighet. Utan trafik syns fortfarande en svag animerad linje; vid hög trafik blir den tjock.", + "Kometens huvudglöd — varm ton runt 1 MB/s, intensiv från 30 MB/s. Hjälper dig att se vilken gäst som belastar ett nätverkskort mest.", + "Klick — alla noder utom värden öppnar gränssnittets detaljdialog som beskrivs nedan. Ett klick på värden har ingen effekt; den har ingen dialog i denna vy." + ], + "useTitle": "När det är användbart", + "useBody": "Korten visar vad som finns; diagrammet visar hur det är anslutet och var trafiken går. Du kan se gäster på samma brygga, två aktiva gäster som delar nätverkskort — en möjlig flaskhals — eller en VM som mättar en länk medan övriga är tysta." + }, + "groups": { + "heading": "Tre gränssnittsgrupper", + "intro": "Tre kort grupperar gränssnitten efter funktion. Varje rubrik visar antalet aktiva gränssnitt. En färgad etikett anger varje gränssnitts typ:", + "badges": [ + "Blå Physical - verklig NIC.", + "Grönt Bridge - Linux bridge eller OVS bridge (vmbr*).", + "Lila Bond — aggregerat gränssnitt med bond / LACP / active-backup.", + "Cyan VLAN — VLAN-undergränssnitt (vmbr0.10, eno1.42, …)." + ], + "clickable": "Varje rad är klickbar: fysiska och virtuella gränssnitt, bryggor och bond-gränssnitt. Detaljvyn nedan visar grunduppgifter, IP, räknare och RX/TX-historik från Proxmox RRD-lagring.", + "physicalTitle": "Fysiska gränssnitt", + "physicalBody": "Fysiska gränssnitt som kärnan identifierar: eno1, enp4s0, eth0, wlp3s0 med flera. Varje enhet har en rad med blå etikett Physical och länkstatus. Även bond-medlemmar visas med hänvisning till sitt bond-gränssnitt.", + "bridgeTitle": "Brygggränssnitt", + "bridgeBody": "Linux-bryggor (vmbr0, vmbr1, …) och OVS-bryggor som Proxmox hanterar. Varje rad visar grön etikett Bridge, det fysiska gränssnittet om bryggan har en enda port och status. Bond-gränssnitt har lila Bond, VLAN-undergränssnitt cyan VLAN.", + "vmTitle": "VM-/LXC-gränssnitt", + "vmBody": "Gränssnitt tap* och veth* som skapas när gäster startar, ett per virtuellt nätverkskort. Rubriken visar X / Y Active och raderna länkar till VM/CT i fliken VMs & LXCs. Efter ett stopp försvinner inaktiva poster vid nästa uppdatering." + }, + "drillIn": { + "heading": "Detaljer per gränssnitt", + "intro": "Ett klick på en rad öppnar en dialog med fem block:", + "headerBlock": "Block", + "headerContents": "Innehåll", + "rows": [ + { + "block": "Grundläggande information", + "contents": "Namn, typ (fysiskt / brygga / bond / VLAN / vm), MAC-adress, status (aktivt / inaktivt), MTU och underliggande fysiskt gränssnitt för virtuella typer." + }, + { + "block": "Bond-medlemmar", + "contents": "Endast för bond-gränssnitt: varje ingående kort med aktiv-/felstatus, bond-läge (active-backup / 802.3ad / balance-alb / …) och primärt gränssnitt om det är konfigurerat." + }, + { + "block": "IP-adresser", + "contents": "Varje IPv4/IPv6-adress med prefixlängd. Automatiskt konfigurerade länklokala adresser visas i grått." + }, + { + "block": "Historiska diagram", + "contents": "RX/TX-bandbredd under valt intervall (1 timme / 24 timmar / 7 dagar / 30 dagar / 1 år), hämtad från /api/network/<interface>/metrics (Proxmox RRD)." + }, + { + "block": "Trafik sedan senaste start", + "contents": "Totalt antal RX/TX-byte och paket sedan värdens senaste start samt räknare för fel och tappade paket." + } + ], + "inactiveTitle": "Detaljer visas även för inaktiva gränssnitt", + "inactiveBody": "Om gränssnittet är inaktivt visar dialogen meddelandet ”Inaktivt gränssnitt” utan aktuella räknare. Konfiguration med adresser och bond-medlemmar samt historik visas fortfarande för att undersöka vad som gick fel och när." + }, + "latency": { + "heading": "Dialog för nätverkslatens", + "intro": "Klicka på Nätverkslatens i den översta raden för att öppna dialogen med historik, test vid behov, tre mål och en nedladdningsbar PDF-rapport.", + "targetsTitle": "Mål", + "targetsIntro": "Listan längst upp väljer målet för pingtestet:", + "targets": [ + "Gateway — din LAN-router. Testar bara den lokala sträckan för att undersöka switch- eller kabelfel utan att inkludera WAN.", + "Cloudflare (1.1.1.1) — offentlig DNS-resolver i ett anycast-nätverk. Testar WAN-sträckan.", + "Google (8.8.8.8) — alternativt offentligt mål för kontroll av resultaten eller vid regionala Cloudflare-problem." + ], + "mode1Title": "Läge 1 — Historik", + "mode1Alt": "Latensdialog i historikläge med målet Gateway, ett tidsintervall på en timme och tidigare mätningar i diagrammet", + "mode1Caption": "Gatewayens historik för den senaste timmen. Insamlingstråden för temperatur och latens sparar mätningarna i historikdatabasen var 60:e sekund.", + "mode1Body1": "Dialogens standardläge. En andra lista väljer tidsintervallet (1 timme / 6 timmar / 24 timmar / 3 dagar / 7 dagar). Ovanför visas Aktuellt / Min / Medel / Max och status Utmärkt / Bra / Måttlig / Dålig enligt gränserna nedan.", + "mode1Body2": "Källa: mätningarna som Health Monitor använder för att upptäcka varaktiga nätverksfördröjningar. Bakgrundstråden _temperature_collector_loop mäter gatewayen var 60:e sekund och sparar historiken lokalt i SQLite.", + "mode2Title": "Läge 2 — Realtidstest", + "mode2Alt": "Latensdialog med pingtest mot Cloudflare i realtid, 50 % förlopp och nya mätningar i diagrammet", + "mode2Caption": "Tvåminuterstest mot Cloudflare med en mätning var femte sekund som genast läggs till i diagrammet. Stoppa avslutar i förtid; Testa igen lägger till mätningar i samma datamängd.", + "mode2Intro": "Växla målet till Cloudflare eller Google startar ett on-demand ping test. Beteende:", + "mode2Items": [ + "Varaktighet — två minuter per körning med förloppsindikator och återstående sekunder.", + "Intervall — en mätning var femte sekund, 24 per körning.", + "Metod — ICMP Echo Request (ping), tre ping i följd per mätning med genomsnittlig latens.", + "Stoppa — avslutar testet direkt och bevarar hittills insamlade data.", + "Testa igen — lägger till mätningar i befintliga data för en längre historik över flera körningar.", + "Aktuell statusindikator — omvärderas efter varje mätning med samma gränser för Utmärkt / Bra / Måttlig / Dålig." + ], + "thresholdsTitle": "Prestandagränser", + "headerStatus": "Status", + "headerRange": "Intervall", + "headerImpact": "Praktisk påverkan", + "thresholdRows": [ + { + "status": "Utmärkt", + "range": "< 50 ms", + "impact": "Optimal för realtidsappar, spel och videosamtal." + }, + { + "status": "Bra", + "range": "50 – 100 ms", + "impact": "Acceptabel för de flesta applikationer med minimal påverkan." + }, + { + "status": "Måttlig", + "range": "100 – 200 ms", + "impact": "Noterbar fördröjning. Kan påverka VoIP och interaktiva appar." + }, + { + "status": "Dålig", + "range": "> 200 ms", + "impact": "Betydande latens. Utredning rekommenderas." + } + ], + "reportTitle": "Rapport om nätverkslatens (PDF)", + "reportIntro": "Båda lägena har knappen Rapport bredvid målväljaren. Den skapar en PDF med mätningarna som du kan bifoga ett supportärende hos internetleverantören.", + "reportPreviewAlt": "Första PDF-sidan i latensrapporten med sammanfattning, mätare, statistik, diagram och gränsvärdesguide", + "reportPreviewCaption": "Första sidan innehåller sammanfattning, mätare, huvudstatistik, latens över tid och gränsvärdesguide. Från sida 2 följer mättabellen och metoden.", + "downloadLabel": "Hämta exempelrapport om latens (PDF)", + "sectionsIntro": "Rapporten har sex avsnitt:", + "sections": [ + "Sammanfattning — mätare från 0 till över 300 ms med gröna, gula och röda zoner; status Utmärkt / Bra / Måttlig / Dålig; mål, läge, antal mätningar och sammanfattad paketförlust.", + "Latensstatistik — fyra indikatorer för aktuellt värde, minimum, medel och maximum samt antal mätningar, genomsnittlig paketförlust och testperiod.", + "Latensdiagram — ytdiagram över testets mätningar med minimum, medel och maximum markerade på den lodräta axeln.", + "Prestandagränser — samma fyrgradiga skala som ovan med en färgad punkt per nivå.", + "Detaljerade resultat — numrerad tabell med tidsstämpel, latens, paketförlust och status för varje mätning. Visar korta toppar som kan döljas av medelvärden.", + "Metod — ICMP Echo Request, tre ping i följd per mätning, målets namn och IP samt en slutbedömning utifrån status." + ], + "useCaseTitle": "Användningsfall: support hos internetleverantören", + "useCaseBody": "Kör Cloudflare-testet i två minuter när anslutningen känns långsam, förläng med Testa igen och välj Rapport. PDF-filen innehåller alla mätningar och metoden. Du kan bifoga den till ett supportärende med tiderna för problemet; leverantören avgör vilka underlag som behövs." + }, + "excluding": { + "heading": "Utesluta gränssnitt från övervakning", + "body1": "Gränssnitt kan uteslutas från övervakning, som avsiktligt avstängda bryggor, testgränssnitt eller borttagna kort som finns kvar i konfigurationen. Inställningen sparas i excluded_interfaces: Health Monitor ger inga varningar eller aviseringar och räknar inte in dem i den övergripande statusen.", + "body2": "Välj Uteslut från övervakning i radens snabbmeny. Gränssnittet visas fortfarande med lila etikett uteslutet. Samma meny återaktiverar övervakningen." + }, + "dataCollected": { + "heading": "Hur data samlas in", + "headerSection": "Avsnitt av fliken", + "headerEndpoint": "Ändpunkt", + "headerSource": "Källa", + "rows": [ + { + "section": "Gränssnittsinventering", + "endpoint": "/api/network", + "source": "ip -j addr + ip -j link och analys av bond-gränssnitt och bryggor." + }, + { + "section": "Sammanfattningskort", + "endpoint": "/api/network/summary", + "source": "Sammanställning av inventeringen och antal aktiva och inaktiva gränssnitt." + }, + { + "section": "RX/TX-historik per gränssnitt", + "endpoint": "/api/network//metrics", + "source": "Aktuella räknare använder /proc/net/dev; diagramhistoriken kommer från Proxmox RRD via pvesh. VM/LXC-gränssnitt använder gästdata, fysiska gränssnitt och bryggor använder noddata." + }, + { + "section": "Latens: aktuell", + "endpoint": "/api/network/latency/current", + "source": "Kort serie ping mot konfigurerad gateway eller annat mål." + }, + { + "section": "latens: historisk", + "endpoint": "/api/network/latency/history", + "source": "Mätningar sparas ungefär var 60:e sekund av bakgrundstråden för temperatur och latens." + } + ], + "codeComment1": "# Kontrollera gränssnittsstatusen som visas i översikten", + "codeComment2": "# Kontrollera en aktuell latensmätning från början till slut" + }, + "whereNext": { + "heading": "Läs vidare", + "items": [ + { + "label": "Hälsoövervakare", + "href": "/docs/monitor/health-monitor", + "tail": " — kategorin Nätverk och gränsvärden för latenshistoriken." + }, + { + "label": "API-referens", + "href": "/docs/monitor/api", + "tail": " — ändpunkter för nätverk och latens." + }, + { + "label": "Integrationer", + "href": "/docs/monitor/integrations", + "tail": " — Prometheus-insamlingen visar samma nätverksmått." + }, + { + "label": "Översiktsindex", + "href": "/docs/monitor/dashboard", + "tail": " — de andra flikarna." + }, + { + "label": "ProxMenux → Nätverk", + "href": "/docs/network", + "tail": " - Åtgärdssidan: broanalys, ihållande gränssnittsnamn, backup och omstart, iperf3." + } + ] + } +} diff --git a/web/messages/sv/docs/monitor/dashboard/security.json b/web/messages/sv/docs/monitor/dashboard/security.json new file mode 100644 index 00000000..255bb94b --- /dev/null +++ b/web/messages/sv/docs/monitor/dashboard/security.json @@ -0,0 +1,246 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Översikt: fliken Säkerhet | ProxMenux-dokumentation", + "description": "Fliken Säkerhet samlar skyddsfunktionerna i två kolumner: ProxMenux Monitor (autentisering, SSL/HTTPS, API-token, Secure Gateway) och Proxmox VE (brandvägg, Fail2Ban, Lynis-granskning). Med stegvisa anvisningar för Secure Gateway, Lynis-granskning samt installation och regelinställningar för Fail2Ban." + }, + "header": { + "title": "Översikt: fliken Säkerhet", + "description": "Säkerhetsfunktionerna är uppdelade i två block: inställningar för Monitor (autentisering, SSL, token, Secure Gateway) och för den övervakade Proxmox-värden (brandvägg, Fail2Ban, Lynis).", + "section": "ProxMenux Monitor · Översikt" + }, + "intro": { + "title": "Två områden, en flik", + "body": "Fliken Säkerhet har två avsnitt: ProxMenux Monitor (översiktens inställningar) och Proxmox VE (värdens inställningar). Korten för Fail2Ban och Lynis erbjuder installation när verktygen saknas och visar sedan deras kontroller när de är installerade." + }, + "monitor": { + "heading": "ProxMenux Monitor", + "intro": "Fyra kort styr åtkomsten till översikten och autentiseringen." + }, + "auth": { + "heading": "Autentisering", + "imageAlt": "Autentiseringskort med status Aktiverad, knapparna Logga ut och Ändra lösenord, information om tvåfaktorsautentisering samt knappar för att aktivera 2FA och inaktivera autentisering", + "imageCaption": "Kort med autentisering aktiverad: statusindikator, Ändra lösenord, Aktivera 2FA och den destruktiva åtgärden Inaktivera autentisering.", + "intro": "Kortet hanterar inloggningen till översikten. Första starten, lösenordsregler, TOTP-konfiguration och återställning när autentiseraren gått förlorad beskrivs i Åtkomst och autentisering. Kortet används för den dagliga hanteringen av dessa inställningar:", + "items": [ + "Autentiseringsstatus — indikator med Aktiverad / Inaktiverad / Avböjd.", + "Ändra lösenord — nuvarande lösenord + nytt lösenord + bekräftelse.", + "Aktivera / Inaktivera tvåfaktorsautentisering — öppnar konfigurationsdialogen med QR-kod vid aktivering och begär det nuvarande lösenordet vid inaktivering.", + "Inaktivera autentisering — destruktiv åtgärd som vid nästa besök åter visar startdialogen Skydda din översikt?." + ] + }, + "ssl": { + "heading": "SSL / HTTPS", + "imageAlt": "SSL/HTTPS-kort med status HTTP utan SSL, upptäckt Proxmox-certifikat med innehavare, utfärdare och utgångsdatum samt alternativ för Proxmox-certifikatet eller ett eget certifikat", + "imageCaption": "SSL/HTTPS-kort med HTTPS avstängt. Monitor upptäcker certifikatet på Proxmox-värden och låter dig använda det med ett klick. Välj Använd eget certifikat om du har egna filer på annan plats.", + "intro": "Gör översikten tillgänglig via HTTPS utan omvänd proxy. Kortet upptäcker certifikatet som Proxmox använder under /etc/pve/local/ och visar innehavare, utfärdare och utgångsdatum för kontroll före aktivering. HTTPS kan aktiveras på två sätt:", + "items": [ + "Använd Proxmox-certifikat — Monitor återanvänder värdens certifikat med ett klick. Lämpligt om PVE och översikten redan använder samma DNS-namn.", + "Använd eget certifikat — klistra in absoluta sökvägar till .pem-certifikatet och den privata .key-nyckeln. De valideras före omstarten. Om inläsningen misslyckas återgår översikten automatiskt till HTTP och förblir tillgänglig." + ], + "enabledAlt": "SSL/HTTPS-kort med HTTPS aktiverat, aktivt certifikat med sökvägar till pve-ssl.pem och pve-ssl.key samt knappen Inaktivera HTTPS", + "enabledCaption": "HTTPS är aktivt — kortet visar certifikatet som används, filsökvägarna och åtgärden Inaktivera HTTPS, som återgår till HTTP på samma port.", + "acmeTitle": "ACME / Let's Encrypt via Proxmox", + "acmeBody": "Om Let’s Encrypt redan är konfigurerat på Proxmox-noden under Datacenter → Certifikat → ACME återanvänder översikten det certifikat som värden visar för webbläsare när du väljer Använd Proxmox-certifikat. Monitor behöver ingen separat ACME-konfiguration.", + "walkthroughLink": "Se HTTPS för ProxMenux Monitor för stegvisa anvisningar om upptäckt av ACME-certifikatet, vad som skrivs till disk och hur du använder ett eget .pem / .key-par." + }, + "apiTokens": { + "heading": "API-åtkomsttoken", + "emptyAlt": "Tomt kort för API-åtkomsttoken med information om token och knappen Generera ny API-token", + "emptyCaption": "Tokenkort efter en nyinstallation. Rutan Om API-token beskriver giltighetstid, användning och hur token läggs in i Authorization: Bearer-huvuden.", + "intro": "Token med ett års giltighet för automatiserade integrationer: Homepage-widgetar, REST-sensorer i Home Assistant, Grafana-insamlare, n8n-flöden och egna skript. Kortet har tre steg: tomt → formulär → genererad token.", + "generateBody": "Generera en token. Klicka på Generera ny API-token. Ange ett beskrivande tokennamn för identifiering i listan och ditt lösenord som extra bekräftelse. Om 2FA är aktiverat krävs även den aktuella TOTP-koden.", + "generateAlt": "Formulär för att generera API-token med fälten Tokennamn och Lösenord samt knapparna Generera token och Avbryt", + "generateCaption": "Formuläret Generera API-token: ange ett namn och bekräfta med lösenordet samt TOTP-koden om 2FA är aktiverat.", + "saveBody": "Spara token direkt. Hela tokenvärdet visas bara en gång efter att det genererats. Kortet markerar detta med ett orange meddelande och en kopieringsknapp. Värdet kan inte hämtas senare; listan över aktiva token visar bara prefixet.", + "generatedAlt": "Genererad API-token med maskerat värde, kopieringsknapp, instruktioner för huvudet Authorization: Bearer och lista över aktiva token med prefix", + "generatedCaption": "Token har genererats: värdet visas en gång med en kopieringsknapp och det exakta utdraget Authorization: Bearer. Listan över aktiva token visar namn, prefix och skapelsedatum så att du kan återkalla enskilda token.", + "outro": "Varje aktiv token har knappen Återkalla. Återkallelsen ogiltigförklarar token direkt och stoppar integrationer som använder den. Exempel för Homepage, Home Assistant, n8n och Prometheus finns under Integrationer." + }, + "gateway": { + "heading": "Secure Gateway", + "cardAlt": "Secure Gateway-kort före den första installationen med knappen Installera Secure Gateway", + "cardCaption": "Secure Gateway-kort efter en nyinstallation: en knapp startar guiden.", + "intro": "Nå översikten, Proxmox webbgränssnitt och gästerna varifrån som helst i ditt Tailscale-nätverk utan att öppna portar mot internet. Monitor installerar en Alpine LXC-container på värden med tailscaled som undernätsrouter. Efter godkännande i Tailscales administratörskonsol kan fjärrenheterna nå värdens LAN-IP överallt.", + "wizardTitle": "Steg-för-steg guide", + "wizardIntro": "Skapa en autentiseringsnyckel i Tailscales konsol innan du klickar på Deploy Secure Gateway. Guiden ber om den i steg 2.", + "step0Title": "0. Skapa Tailscales autentiseringsnyckel", + "step0Body": "Logga in på login.tailscale.com/admin/settings/keys och klicka på Generate auth key…. Välj en förautentiserad nyckel så att gatewayen inte behöver en interaktiv Tailscale-inloggning. Kopiera värdet; det visas bara en gång.", + "step0Alt": "Sidan Settings → Keys i Tailscales administratörskonsol med knappen Generate auth key markerad", + "step0Caption": "Tailscale admin konsol - Settings → Keys → Generate auth key.... Använd ett gratis Tailscale-konto om du inte har en ännu (länk inuti guiden).", + "step1Title": "1. Öppna guiden", + "step1Body": "Gå tillbaka till fliken Säkerhet och klicka på Deploy Secure Gateway. Det första steget beskriver funktioner och krav.", + "step1Alt": "Introduktion i Secure Gateway-guiden: VPN-åtkomst utan portvidarebefordran och med totalsträckskryptering", + "step1Caption": "Steg 1 - översikt över vad Secure Gateway ger och en påminnelse om att du behöver ett gratis Tailscale-konto.", + "step2Title": "2. Tailscale autentisering", + "step2Body": "Klistra in autentiseringsnyckeln från steg 0 och välj ett värdnamn. Gatewayen visas med detta namn i Tailscales konsol, vanligtvis proxmox-gateway eller nodens namn.", + "step2Alt": "Steg i Secure Gateway-guiden med fält för Tailscales autentiseringsnyckel och enhetens värdnamn samt en länk för att skapa nyckeln", + "step2Caption": "Steg 2: klistra in den förautentiserade nyckeln och välj värdnamn. Om du hoppade över steg 0 öppnar länken under fältet motsvarande Tailscale-sida.", + "step3Title": "3. Åtkomstområde", + "step3Intro": "Välj vad ditt tailnet kan nå genom gateway:", + "step3Items": [ + "Proxmox Only - endast Proxmox UI och Monitor. Mindre attackyta.", + "Hela det lokala nätverket — hela LAN-undernätet, automatiskt upptäckt via värdens primära gränssnitt. Ger åtkomst till NAS, skrivare, virtuella maskiner och andra LAN-enheter.", + "Egna undernät — ange specifika CIDR-nät. För miljöer med flera VLAN där bara vissa segment ska vara åtkomliga." + ], + "step3Alt": "Steget Åtkomstområde i Secure Gateway-guiden med alternativen Endast Proxmox, Hela det lokala nätverket och Egna undernät", + "step3Caption": "Steg 3: välj åtkomstområde. Hela det lokala nätverket fyller automatiskt i det upptäckta LAN-undernätet.", + "step4Title": "4. Avancerade alternativ (valfritt)", + "step4Intro": "Två valfria reglage, båda avstängda som standard:", + "step4Items": [ + "Exit Node — när den aktiveras och väljs på en fjärrenhet går all enhetens internettrafik via Proxmox-värdens WAN-anslutning. Praktiskt på resor när du vill använda hemmets internetanslutning från telefonen.", + "Acceptera rutter — låter gatewayen nå nätverk som annonseras av andra undernätsroutrar i Tailscale-nätverket, för installationer på flera platser." + ], + "step4Alt": "Steget Avancerade alternativ i Secure Gateway-guiden med kryssrutorna Exit Node och Accept Routes", + "step4Caption": "Steg 4: Exit Node och Accept Routes. Låt båda vara avstängda om du bara behöver nå översikten från telefonen eller datorn.", + "step5Title": "5. Granska och installera", + "step5Body": "Slutlig sammanfattning före installationen. Guiden påminner om ett manuellt steg som återstår i Tailscales konsol efteråt: godkänna undernätsrutten.", + "step5Alt": "Steget Granska och installera i Secure Gateway med sammanfattning av värdnamn, åtkomstläge, nätverk, Exit Node och Accept Routes samt knappen Installera gateway", + "step5Caption": "Steg 5 - granska konfigurationen och distribuera. Det blå meddelandet längst ner flaggar det väntande ruttgodkännandet.", + "approvalTitle": "Ett sista manuellt steg i Tailscale admin", + "approvalBody": "Öppna login.tailscale.com/admin/machines efter installationen och godkänn undernätsrutten som gatewayen annonserar. Innan dess kan fjärrenheter i Tailscale-nätverket inte nå LAN-IP-adresser via gatewayen. Tailscale markerar väntande rutter med en gul varning på enhetens rad. Klicka på Edit route settings och markera rutten." + }, + "pve": { + "heading": "Proxmox VE", + "intro": "Värdens skydd: brandvägg, intrångsskydd och säkerhetsgranskning. Korten för Fail2Ban och Lynis erbjuder installation om verktygen saknas och visar sedan deras kontroller." + }, + "firewall": { + "heading": "Proxmox Firewall", + "imageAlt": "Proxmox-brandväggskort med kluster- och värdstatus, snabbåtkomstregler för Monitor och Proxmox webbgränssnitt, räknare, regellista och knappen Lägg till regel", + "imageCaption": "Proxmox-brandväggskort: reglage för kluster och värd, vanliga portar under Snabbåtkomstregler, räknare under Regelöversikt och fullständig lista med + Lägg till regel.", + "intro": "Kortet hanterar Proxmox VE:s brandväggskonfiguration. Den klassiska motorn använder iptables och alternativet använder nftables. Regler som skapats utanför Proxmox hanteras inte. Tre block:", + "items": [ + "Klusterbrandvägg + värdbrandvägg — övergripande reglage. Klusterbrandväggen måste vara aktiv för att värdens regler ska få effekt. Kortet visar detta beroende vid inställningen.", + "Snabbåtkomstregler — fördefinierade rader för 8008/TCP (Monitor) och 8006/TCP (Proxmox webbgränssnitt) med läget tillåtet, blockerat eller oskyddat. Proxmox-gränssnittet tillåts via ett inbyggt brandväggsmakro som inte kan tas bort av misstag.", + "Regelöversikt — räknare för alla regler, accept-regler, drop/reject-regler och olika skyddade portar. Värdena läses från /etc/pve/firewall/cluster.fw och /etc/pve/nodes/<node>/host.fw.", + "Brandväggsregler — lista med åtgärd, protokoll, port, källa och nivå. + Lägg till regel öppnar redigeraren i kortet; papperskorgen tar bort regeln. Ändringar sparas i Proxmox-filerna och visas även i dess gränssnitt (Datacenter / Node → Firewall)." + ] + }, + "fail2ban": { + "heading": "Fail2Ban", + "subHeading": "(beroende på status)", + "whatIs": "Vad är det? Fail2Ban är en tjänst med öppen källkod som upptäcker upprepade misslyckade inloggningar i loggar och blockerar IP-adressen i brandväggen. Den skyddar SSH och webbformulär mot ständiga brute force-attacker. ProxMenux konfigurerar tre jails: SSH, Proxmox webbinloggning (port 8006) och ProxMenux Monitors inloggning (port 8008).", + "notBundled": "Fail2Ban ingår inte. Kortet känner av om det är installerat och anpassas därefter: om det saknas erbjuds installation med ett klick. När det är installerat visas aktuell jail-status och blockerade IP-adresser, och antal försök samt blockeringstid kan ställas in för varje jail.", + "notInstalledAlt": "Fail2Ban-kort i läget Inte installerat med beskrivning av skydd för SSH, Proxmox webbgränssnitt och Monitor via nftables samt knappen Installera och konfigurera Fail2Ban", + "notInstalledCaption": "Fail2Ban-kortet innan du installerar - den blå rutan förhandsgranskar vad installationen skulle konfigurera.", + "clickBody": "Klicka på Installera och konfigurera Fail2Ban för att öppna en bekräftelsedialog med alla ändringar som skriptet gör på värden:", + "confirmAlt": "Fail2Ban-bekräftelse med aggressivt SSH-läge, skydd för Proxmox på port 8006 och Monitor på port 8008, identifiering av nftables, justerad journald-loggning och SSH-skydd via MaxAuthTries", + "confirmCaption": "Installationsbekräftelse: lista över jails, ändrad loggnivå i journald för att läsa SSH-händelser samt extra SSH-skydd (MaxAuthTries=3).", + "confirmIntro": "Efter bekräftelsen visar en panel installationen i realtid: apt, jail-konfiguration och tester. Samma mekanism används av ProxMenux CLI-installationsprogram.", + "progressAlt": "Panel med Fail2Bans installationslogg: paket, journald MaxLevelStore för autentisering, jails, nftables-identifiering, MaxAuthTries-skydd, kommunikationstest med fail2ban-client och slutmeddelande", + "progressCaption": "Installation pågår: varje steg loggas i panelen. Meddelandet Connection closed längst ner markerar att överföringen är avslutad.", + "afterInstall": "Efter installationen visar kortet aktuell status: konfigurerade jails, blockerade IP-adresser och senaste blockeringar. Flikarna skiljer Jails och blockerade IP-adresser från Senaste aktivitet, de senaste N posterna i Fail2Ban-loggen.", + "activeAlt": "Aktivt Fail2Ban-kort med tre jails (proxmenux, proxmox, sshd), räknare för blockerade IP-adresser, totala blockeringar och misslyckade försök samt rader med försök, blockeringstid, intervall och kugghjul", + "activeCaption": "Fail2Ban är aktivt: de tre förvalda jailsen (proxmenux, proxmox, sshd) med inställningar för försök, blockeringstid och identifieringsintervall.", + "tuneBody": "Justera jail-reglerna. Klicka på kugghjulet för att ändra Max Retries, Ban Time och Find Time, det rullande intervallet för att räkna försök. En permanent blockering gäller tills du tar bort den manuellt. Formuläret förklarar vanliga värden.", + "configAlt": "Formulär för jailen sshd med Max Retries, Ban Time i sekunder, alternativet Permanent Ban, Find Time, hjälp om vanliga värden och knappen Spara konfiguration", + "configCaption": "Redigera jailen sshd: sänk Max Retries om du bara använder SSH från ditt eget undernät, eller öka Ban Time för en översikt som är åtkomlig från internet.", + "outro": "Guiden Installation, konfiguration och avinstallation beskriver även manuell installation, ändringen av SSH MaxAuthTries och kopplingen till loggen proxmenux-auth.log. Se ProxMenux → Säkerhet → Fail2Ban.", + "calloutTitle": "Utan Fail2Ban blockerar den här mekanismen inga IP-adresser", + "calloutBody": "ProxMenux Monitor kontrollerar IP-adresser som blockerats av Fail2Ban på applikationsnivå innan Flask-begäranden behandlas. Den frågar fail2ban-client och sparar resultatet i cache i 30 sekunder; ingen SQL-tabell med blockeringar läses. Utan Fail2Ban loggas misslyckade inloggningar i proxmenux-auth.log, men mekanismen blockerar inga IP-adresser." + }, + "lynis": { + "heading": "Säkerhetsgranskning med Lynis", + "subHeading": "(beroende på status)", + "whatIs": "Vad är det? Lynis är ett säkerhetsgranskningsverktyg med öppen källkod som kör omkring 280 tester på värden: filbehörigheter, kärnskydd, SSH, paketsårbarheter, kryptografiregler, schemalagda uppgifter, tjänsteidentifiering med mera. Det ger ett härdningsindex från 0 till 100, varningar och förslag. Det är en vanlig utgångspunkt för att bedöma Debian-servrar.", + "whyUseful": "Varför är det användbart? Att bedöma säkerheten genom att läsa varje konfigurationsfil är svårt. Lynis hittar vanliga förbiseenden: saknade kärnskydd, svaga SSH-chiffer, loggar som inte sparas permanent eller NOPASSWD i sudoers för standardkonton. En ny körning efter ProxMenux-ändringar gör förbättringen jämförbar genom en poäng.", + "notInstalledAlt": "Lynis-kort i läget Inte installerat med knappen Installera Lynis och funktionerna härdningsindex, sårbarhetsidentifiering, efterlevnadskontroll och GitHub-källkod", + "notInstalledCaption": "Lynis kort före installation - den blå rutan sammanfattar vad verktyget gör.", + "notBundled": "Lynis ingår inte heller. ProxMenux installerar det direkt från den officiella källkoden på GitHub i stället för Debian-paketet.", + "confirmAlt": "Bekräftelsedialog för Lynis med funktionerna härdningsindex, sårbarhetsidentifiering, konfigurationsanalys, efterlevnadskontroll och källkod från det officiella GitHub-arkivet", + "confirmCaption": "Installationsbekräftelse som uttryckligen anger GitHub som källa.", + "progressAlt": "Installationspanel för Lynis i realtid med installation av den senaste versionen, bekräftelse av version 3.1.6 och slutmeddelande", + "progressCaption": "Installation pågår: panelen visar loggen i realtid, precis som för Fail2Ban.", + "afterInstall": "Efter installationen visar kortet versionen och en tom granskningshistorik. Klicka på Kör säkerhetsgranskning för att starta den första kontrollen.", + "installedAlt": "Lynis-kort efter installation med version 3.1.6, tidpunkt för senaste kontroll, härdningsindex 0, varningar 0, förslag 0, tom rapport och knappen Kör säkerhetsgranskning", + "installedCaption": "Lynis är installerat, men ingen granskning har körts. Mätvärdena visar inledningsvis noll.", + "runningAlt": "Lynis-kort under granskning med meddelande om pågående kontroll, beräknad tid 2–5 minuter och inaktiverad knapp Granskning pågår", + "runningCaption": "Granskning pågår: knappen visar en laddningsindikator och kortet upplyser om att kontrollen kan ta 2–5 minuter.", + "finishedBody": "När kontrollen är klar visar kortet resultaten: härdningsindex, varningar, förslag och listan Granskningsrapporter med tidigare kontroller.", + "resultsAlt": "Lynis-kort med index 71, uppdelningen Lynis 66 och PVE 71, 3 varningar, 40 förslag, poäng anpassad för Proxmox på 71 av 100 i kategorin Bra, PDF-rapporter och knappen Kör säkerhetsgranskning", + "resultsCaption": "Exempelresultat: härdningsindex 71/100 (Bra). Kortet visar Lynis råpoäng (66) och poängen anpassad för Proxmox (71). Justeringen beror på råpoängen och andelen fynd som klassas som förväntat beteende i Proxmox VE; den lägger inte till 11 fasta poäng.", + "scoreTitle": "Lynis råpoäng och poäng anpassad för Proxmox", + "scoreIntro": "Lynis regler är avsedda för allmänna Debian-system. Proxmox avviker ibland av giltiga skäl, som klustertjänster som körs som root eller egna journald-inställningar. Kortet visar båda poängen så att du kan:", + "scoreItems": [ + "Följa Lynis råpoäng på samma sätt som externa granskare.", + "Följa poängen anpassad för Proxmox, en lämpligare jämförelsegrund för noder i samma kluster." + ], + "reportBody": "Fullständig rapport. Knappen PDF för varje granskning hämtar en flersidig rapport: sammanfattning, systeminformation, säkerhetsläge, förklarade varningar, förslag sorterade efter påverkan och paketförteckning. Den kan bifogas en säkerhetsgenomgång.", + "reportAlt": "Exempel på första sidan i Lynis PDF-rapport med sammanfattning, index 71 av 100, antal varningar och förslag, värdnamn, kärna, Lynis-version, datum och säkerhetsöversikt", + "reportCaption": "Rapportens första sida: sammanfattning, systeminformation och säkerhetsläge. Därefter följer detaljerade varningar, förslag och installerade paket. En exempelrapport i PDF bifogas som referens.", + "runPeriodically": "Kör granskningen regelbundet, efter större Proxmox-uppgraderingar och ändringar efter installationen samt innan fjärråtkomst öppnas. Spara rapporterna; utvecklingen över tid är viktigare än ett enskilt värde.", + "outro": "Guiden för installation, konfiguration och avinstallation samt genomgången av en exempelrapport finns under ProxMenux → Säkerhet → Lynis." + }, + "dataCollected": { + "heading": "Hur data samlas in", + "headerCard": "Kort", + "headerEndpoint": "Ändpunkt", + "headerSource": "Källa", + "rows": [ + { + "card": "Autentisering, 2FA, lösenordsändring", + "endpoint": "/api/auth/*", + "source": "Lokal autentiseringskonfiguration i ~/.config/proxmenux-monitor/auth.json; JWT utfärdas av Monitor." + }, + { + "card": "SSL / HTTPS", + "endpoint": "/api/auth/ssl/*", + "source": "openssl x509 på /etc/pve/local/pve-ssl.pem + /etc/proxmenux/ssl_config.json." + }, + { + "card": "Lista, skapa och återkalla API-token", + "endpoint": "/api/auth/api-tokens", + "source": "Token rader hålls lokalt; ingenting lämnar värden." + }, + { + "card": "Secure Gateway (distribuera + status)", + "endpoint": "/api/oci/*", + "source": "Skapar en Alpine LXC-container med tailscaled via pct create / pct exec." + }, + { + "card": "Brandväggsstatus och regler", + "endpoint": "/api/security/firewall/*", + "source": "pve-firewall + /etc/pve/firewall/<cluster|host>.fw." + }, + { + "card": "Fail2Ban (endast när den är installerad)", + "endpoint": "/api/security/fail2ban/*", + "source": "fail2ban-client status, /var/log/fail2ban.log, /etc/fail2ban/jail.local." + }, + { + "card": "Lynis revision (endast när den är installerad)", + "endpoint": "/api/security/lynis/*", + "source": "Kör lynis audit system i bakgrunden och läser rapporten från /var/log/lynis-report.dat." + } + ] + }, + "whereNext": { + "heading": "Läs vidare", + "items": [ + { + "label": "Åtkomst och autentisering", + "href": "/docs/monitor/access-auth", + "tail": " — fullständig första konfiguration, val av 2FA-app, återställning vid förlorad autentiserare och exempel för omvänd proxy." + }, + { + "label": "Integrationer", + "href": "/docs/monitor/integrations", + "tail": " — exempel på API-token med Homepage, Home Assistant, Prometheus och n8n samt fullständig konfiguration av Secure Gateway." + }, + { + "label": "API-referens", + "href": "/docs/monitor/api", + "tailRich": " — alla ändpunkter under /api/auth, /api/security och /api/oci med metod, begärandekropp och curl-exempel." + }, + { + "label": "ProxMenux → Säkerhet → Fail2Ban", + "href": "/docs/security/fail2ban", + "tail": " — installationsguide, konfigurerade jails och manuell installation." + }, + { + "label": "ProxMenux → Säkerhet → Lynis", + "href": "/docs/security/lynis", + "tail": " — exempelrapport, poängtolkning och när granskningen bör köras igen." + } + ] + } +} diff --git a/web/messages/sv/docs/monitor/dashboard/settings.json b/web/messages/sv/docs/monitor/dashboard/settings.json new file mode 100644 index 00000000..64a4198b --- /dev/null +++ b/web/messages/sv/docs/monitor/dashboard/settings.json @@ -0,0 +1,367 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Översikt: fliken Inställningar | ProxMenux-dokumentation", + "description": "Fliken Inställningar hanterar språk, navigeringsordning, översiktens inställningar, övervakningsgränser och undantag, aviseringar, AI och förteckningen över optimeringar efter installation." + }, + "header": { + "title": "Översikt: fliken Inställningar", + "description": "Monitors språk, navigeringsordning, översiktens inställningar, övervakningsundantag, aviseringar, AI-konfiguration och aktuell förteckning över ProxMenux-optimeringar.", + "section": "ProxMenux Monitor · Översikt" + }, + "intro": { + "title": "Var varje inställning sparas", + "body": "Inställningar samlar översiktens utseende, Health Monitor-övervakning, utskick av larm och ändringar som ProxMenux redan gjort på värden. Korten länkar till sin detaljerade dokumentation; fliken är en ingång till den." + }, + "interfaceLanguage": { + "heading": "Gränssnittsspråk", + "intro": "Välj språk för Monitors webbgränssnitt. Det ändras direkt utan att starta om tjänsten eller ändra språk i ProxMenux terminalmenyer.", + "items": [ + "ProxMenux Monitor erbjuder för närvarande engelska, tyska, spanska, franska, italienska, portugisiska, slovakiska och svenska.", + "Vid första besöket används webbläsarens språk om det stöds, annars engelska.", + "Ett ändrat val uppdaterar sidans språk och synkroniserar andra öppna flikar i samma webbläsarprofil.", + "Om en översättning saknas visas bara den texten på engelska i stället för en felaktig nyckel eller platshållare." + ], + "scopeTitle": "Lokal webbläsarinställning", + "scopeBody": "Valet sparas i localStorage under proxmenux-ui-language. Det gäller denna webbläsarprofil och enhet, inte hela noden. Varje administratör kan välja sitt språk." + }, + "navigationOrder": { + "heading": "Navigeringsordning", + "intro": "Ordna de sju huvudposterna: Översikt, Appar, VM och LXC, Nod, Säkerhetskopiering, Terminal och Administration. Välj Redigera, dra raderna och spara.", + "items": [ + "Med mus börjar dragningen vid tryck. På pekskärm krävs ett 250 ms långt tryck för att skilja det från rullning.", + "Grupperna Nod och Administration flyttas som helheter; deras undersidor behåller den fastställda ordningen.", + "Mobilmenyn följer samma sparade ordning.", + "Återställ standard återställer ordningen under redigering. Spara för att tillämpa ändringen.", + "Nya huvudflikar i framtida versioner läggs sist i den anpassade ordningen så att din ordning bevaras." + ], + "landingTitle": "Den första posten blir startfliken", + "landingBody": "Monitor öppnar den första sparade posten. För Nod öppnas Lagring, för Administration Systemloggar. Ordningen sparas i webbläsaren under proxmenux-nav-order, så olika enheter kan ha olika arbetsordning." + }, + "networkUnits": { + "heading": "Nätverksenheter", + "imageAlt": "Kortet Nätverksenheter med visningsvalet inställt på Byte", + "imageCaption": "Välj mellan bitar per sekund och byte per sekund för varje nätverkshastighet som visas i instrumentpanelen.", + "body": "Visar nätverkshastighet i bitar per sekund (Mbps/Gbps) eller byte per sekund (MB/s/GB/s). Bitar är standard som i specifikationer för nätverkskort och internet; filöverföringar använder ofta byte. Diagram, etiketter och tips ändras direkt utan omladdning." + }, + "health": { + "heading": "Hälsoövervakare", + "intro": "Kortet ställer in undertryckningstid: hur länge kontrollen väntar innan en avfärdad varning får visas igen. Varje kategori — CPU, minne, lagring, diskar, nätverk, VM, PVE-tjänster, loggar, uppdateringar och säkerhet — har en egen lista:", + "items": [ + "24 h - standard för de flesta övergående kategorier.", + "72 h — för händelser du vill tysta i några dagar.", + "168 h (1 vecka) och 720 h (1 månad) - periodiska kontroller.", + "8760 h (1 år) — tystnad under lång tid.", + "-1 — permanent tystnad tills du återaktiverar manuellt.", + "Eget antal timmar — ett heltal för ett mellanvärde." + ], + "imageAlt": "Inställningar, Health Monitor-kort med tid per kategori och aktiva undertryckningar", + "imageCaption": "Listorna anger tiden för framtida undertryckningar. Avsnittet nedanför visar tystade varningar och låter dig återaktivera dem.", + "editTitle": "Redigeringsläge", + "editBody": "Kortet är först skrivskyddat. Redigera uppe till höger aktiverar listor och återaktiveringsknappar. Spara tillämpar väntande tider och återaktiveringar tillsammans; Avbryt kastar dem. Spara aktiveras först när ändringar finns.", + "activeTitle": "Aktiva undertryckningar", + "activeIntro": "Under tiderna listar Aktiva undertryckningar tillfälligt tystade varningar —24 timmar, 7 dagar eller eget intervall— och permanenta. Varje rad visar:", + "activeItems": [ + "Ett färgat märke: Permanent i bärnsten eller en nedräkning som 24 h kvar / 7 dagar kvar i blått.", + "Varningsidentifieraren i läsbar form (t.ex. pve_storage_full_PBS-Cloud → PVE-lagring full: PBS-Cloud).", + "Kategori, allvarlighetsgrad och tidpunkten då varningen avfärdades.", + "Knappen Återaktivera i redigeringsläge köar borttagning av undertryckningen när du sparar." + ], + "activeReenableTitle": "Så återaktiveras en varning", + "activeReenableBody": "Återaktivera under redigering markerar raden grönt och stryker identifieraren, utan att tillämpa ändringen. Klicka igen för att Ångra. Spara skickar parallella POST /api/health/un-acknowledge för varje återaktivering och tar bort raderna. Om problemet kvarstår och kategorin stöder nya varningar visas det åter som aktivt vid nästa kontroll.", + "activePermanentNote": "Permanenta undertryckningar —via Permanent eller standardtiden -1— återställs bara här. Den allmänna dialogen har ingen sådan knapp; avsnittet samlar översikt och återaktivering.", + "activeAutoRefreshTitle": "Automatisk uppdatering", + "activeAutoRefreshBody": "Listan uppdateras när en varning avfärdas eller återaktiveras i Health Monitor, när fliken får fokus igen och när synligheten ändras. Ingen omladdning behövs.", + "calloutTitle": "Detaljer på sidan Health Monitor", + "calloutBody": "Eskalering, automatisk lösning när en enhet försvinner och skillnaden mellan avfärda och lösa beskrivs i Health Monitor → Avfärda varningar och undertryckningstid. Kortet visar listorna och aktiva undertryckningar." + }, + "thresholds": { + "heading": "Gränsvärden i Health Monitor", + "intro": "Förra kortet anger tystnadens längd efter avfärdande; detta anger värdet som utlöser en varning. De flesta gränskontroller har justerbara värden för Varning och Kritiskt. Tabellen förklarar undantag som kombinerad swapregel och aktuell RAM-detektor.", + "whatForTitle": "Vad det används till", + "whatForIntro": "Standardvärdena är en utgångspunkt, men varje miljö har egna förutsättningar:", + "whatForItems": [ + "Ett homelab med en enda SSD kan varna tidigare, till exempel vid 75/90 %, för att lämna plats för ögonblicksbilder.", + "Minnesgränser bör spegla värdens mätningar och arbetslast. Ceph-redundans motiverar inte ensam mildare varningar, och hög ZFS ARC-användning är inte samma sak som arbetsminne som inte kan återvinnas.", + "Välj temperaturgränser efter diskens specifikationer och faktiska förhållanden. Passiv eller forcerad kylning avgör inte ensam en allmänt lägre eller högre säker gräns.", + "En tungt virtualiserad värd kan få CPU-toppar vid byggen utan att varna för varje topp på 80 %, men måste fortfarande varna vid långvarig överbelastning." + ], + "whatForOutro": "Ändringar som stöds gäller vid nästa kontroll. Health Monitor läser /usr/local/share/proxmenux/health_thresholds.json varje cykel utan omstart. Vissa indikatorer, som disktemperatur, använder värdena; vissa kapacitetsstaplar har egna gränser. RAM-raden beskriver ett aktuellt undantag.", + "coloursTitle": "Statusfärger för Varning och Kritiskt", + "coloursIntro": "Widgetar med det konfigurerade paret Varning/Kritiskt följer de tre lägena nedan. Andra indikatorer, som PVE-kapacitetsstaplar, har egna gränser; färgen ensam visar inte att Health Monitor har larmat.", + "headerColour": "Färg", + "headerRange": "Intervall", + "headerMeaning": "Betydelse", + "colourRows": [ + { + "colour": "Grön", + "range": "Värde < Varning", + "meaning": "Normalt intervall. Ingen varning skapas." + }, + { + "colour": "Bärnstensgul", + "range": "Varning ≤ värde < Kritiskt", + "meaning": "Varningsläge. Health Monitor skapar en WARNING-händelse; aviseringar följer kanalfilter och tysta tider." + }, + { + "colour": "Röd", + "range": "Värde ≥ Kritiskt", + "meaning": "Kritiskt läge. Health Monitor skapar en CRITICAL-händelse som kringgår tysta tider. Kanalens kategori- och händelseinställningar gäller fortfarande; leverans beror även på kanalens tillgänglighet." + } + ], + "sectionsTitle": "Avsnitt och rekommenderade standardvärden", + "sectionsIntro": "Detta är ProxMenux startvärden tills du ändrar dem. Avsnitten följer beräkningslast, temperatur och lagringskapacitet, från aktuell last till använt utrymme.", + "headerSection": "Avsnitt", + "headerWarning": "Varning", + "headerCritical": "Kritiskt", + "headerGates": "Berörd kontroll", + "thresholdRows": [ + { + "section": "CPU-användning", + "warning": "85 %", + "critical": "95 %", + "gates": "Varning för varaktig last när CPU-medelvärdet överstiger gränsen under kontrollperioden." + }, + { + "section": "Minne", + "warning": "85 %", + "critical": "95 %", + "gates": "Värdens RAM-belastning. Den konfigurerbara standarden visar Kritiskt vid 95 %, men aktuell detektor använder en fast regel på 90 % över tid; inställningen ändrar för närvarande inte den körningsgrenen." + }, + { + "section": "Swap (endast kritisk nivå)", + "warning": "—", + "critical": "80 %", + "gates": "Swap-CRITICAL kräver både över 80 % swap och under 15 % tillgängligt RAM över flera mätningar. Upptaget swaputrymme ensamt utlöser inte regeln." + }, + { + "section": "CPU-temperatur", + "warning": "80 °C", + "critical": "90 °C", + "gates": "CPU-paketets eller kärnornas temperatur från lm-sensors." + }, + { + "section": "Disktemperatur — HDD", + "warning": "60 °C", + "critical": "65 °C", + "gates": "HDD-temperatur. Standard: varning vid 60 °C och kritiskt vid 65 °C. Det är övervakningsvärden, inte en allmän tillverkargräns; kontrollera modellens specifikationer." + }, + { + "section": "Disktemperatur — SSD", + "warning": "70 °C", + "critical": "75 °C", + "gates": "SATA-SSD i 2,5-tums- eller M.2-format. Klassen använder 70/75 °C som standard; faktiska gränser beror på modellen." + }, + { + "section": "Disktemperatur — NVMe", + "warning": "80 °C", + "critical": "85 °C", + "gates": "NVMe-temperatur. Klassen använder 80/85 °C som standard. Styrenhetens strypningstemperatur varierar med modellen och är inte alltid 85 °C." + }, + { + "section": "Disktemperatur — SAS", + "warning": "55 °C", + "critical": "65 °C", + "gates": "SAS-temperatur. Klassen använder varning vid 55 °C och kritiskt vid 65 °C. Det är övervakningsvärden, inte bevis på kylfel vid 55 °C eller en allmän tillverkargräns." + }, + { + "section": "Diskutrymme — värd", + "warning": "85 %", + "critical": "95 %", + "gates": "Kapacitet för / och varje monteringspunkt på värden (/var/lib/vz, /mnt/*…)." + }, + { + "section": "Diskutrymme - LXC rootfs", + "warning": "85 %", + "critical": "95 %", + "gates": "Rotdisk per container, bedömd mot rootfs-storleken från PVE." + }, + { + "section": "LXC-monteringspunkter", + "warning": "85 %", + "critical": "95 %", + "gates": "Kapacitet för monteringar i körande CT: mp0, mp1, NFS och bind-monteringar. Exkluderar rootfs." + }, + { + "section": "PVE-lagring", + "warning": "85 %", + "critical": "95 %", + "gates": "Lagring som hanteras av PVE: LVM, LVM-thin, ZFS-pool, RBD/Ceph och PBS. Alla är inte blocklagringssystem." + }, + { + "section": "ZFS-pool", + "warning": "85 %", + "critical": "95 %", + "gates": "ZFS-pooler på värden, oberoende av registrering i PVE." + } + ], + "defaultsTitle": "Standardvärden, ändringar och återställning", + "defaultsBody": "Varje avsnitt börjar med standardvärden; bara önskade ändringar sparas. Kortet visar det gällande värdet: din ändring eller standarden. Återställ tar bort alla ändringar i samtliga avsnitt.", + "validationTitle": "Validering", + "validationBody": "När du sparar kontrolleras tillåtna intervall och Kritiskt under Varning avvisas. Gränssnittet visar fel och servern validerar API-begäranden igen före lagring." + }, + "lxcDetection": { + "heading": "Identifiering av LXC-uppdateringar", + "imageAlt": "Kort för LXC-uppdateringar med reglage för att söka väntande paket i körande Debian-, Ubuntu- och Alpine-containrar", + "imageCaption": "Reglage för regelbundna kontroller med apt list --upgradable / apk list -u i körande CT. Påslaget som standard. Motsvarande aviseringsreglage under Aviseringar → Tjänster visas när detektering är på.", + "intro": "Reglaget mellan Gränser och Aviseringar styr LXC-kontrollen. Påslaget frågar det pakethanterarna i körande CT; Hårdvara visar resultat och matar lxc_updates_available. Avstängt stoppar det sina pct exec-anrop och tar bort LXC-poster från managed_installs.json; /api/managed-installs slutar visa statusen utan att vänta 24 timmar.", + "whatRunsTitle": "Vad kontrollen kör", + "whatRunsIntro": "För varje CT i tillståndet running med en pakethanterare som stöds:", + "whatRunsItems": [ + "Metadatans aktualitet. Är apt/apk-cachen äldre än 24 timmar provas apt-get update -qq på Debian/Ubuntu eller apk update på Alpine med 60 s tidsgräns. Vid fel används befintlig cache och resultaten kan vara inaktuella.", + "Lista. Kör apt list --upgradable / apk list -u och hämtar paketantal och några paketnamn.", + "Undvik dubbletter per CT. Ett fingeravtryck av totalantal, säkerhetsuppdateringar och sorterade namn förhindrar identiska dagliga aviseringar. En betydande ändring meddelas igen." + ], + "selfUpdateTitle": "CT som uppdateras utanför apt kan visa 0", + "selfUpdateBody": "Detekteringen täcker bara CT:ns pakethanterare. Program som uppdateras utanför apt, som ett konfigurerat plexupdate-jobb eller avbilder hämtade med docker pull, räknas inte. Noll apt-uppdateringar bevisar inte att alla appar är aktuella. Baspaket som väntar upptäcks fortfarande.", + "refreshTitle": "Varför metadata förnyas efter 24 timmar", + "refreshBody": "En CT som körts länge kan ha gamla apt-metadata om ingen kör apt update. apt list --upgradable kan då missa nya uppdateringar. ProxMenux försöker förnya efter 24 timmar och hoppar över steget om cachen är nyare.", + "toggleTitle": "Aviseringsreglage när detektering är på", + "toggleBody": "Reglaget lxc_updates_available per kanal under Aviseringar → Tjänster visas bara när detektering är på. När den stängs av döljs raden för alla kanaler. Valet sparas i databasen och samma värde återkommer när detektering slås på.", + "purgeTitle": "Vad som rensas när detektering stängs av", + "purgeBody": "Avstängning tar genast bort type=lxc-poster från /usr/local/share/proxmenux/managed_installs.json. Räknarna för LXC-uppdateringar i Hårdvara försvinner vid nästa omladdning. Påslagning fyller registret vid nästa kontroll, eller tidigare med manuell API-uppdatering." + }, + "storageExclusions": { + "heading": "Exklusioner för fjärrlagring", + "imageAlt": "Kort för undantag av fjärrlagring med PBS-Cloud, PBS och PBS2 samt reglage för Hälsa och Varningar per rad", + "imageCaption": "Reglage för Hälsa och Varningar per lagring. Med båda avstängda räknas lagringen inte i Health Monitor och skickar inga aviseringar. Den syns fortfarande under Lagring, markerad som undantagen.", + "intro": "Lagring som hanteras av Proxmox (NFS / CIFS / PBS / Ceph / iSCSI osv.) kan undantas med två oberoende reglage:", + "items": [ + "Hälsa — när reglaget stängs av slutar lagringen bidra till kategorin Lagring i Health Monitor. Användbart för arkivvolymer som oftast är offline eller fjärrmål för säkerhetskopiering som bara slås på enligt schema.", + "Varningar — avstängt hindrar reglaget aviseringar om lagringen via konfigurerade kanaler, även med hälsokontroller på. Användbart om du vill se status på panelen utan aviseringar." + ], + "outro": "Undantagen lagring syns på fliken Lagring med ett lila märke undantagen, så att inventeringen förblir synlig. Status sparas i SQLite-tabellen excluded_storages." + }, + "interfaceExclusions": { + "heading": "Exklusioner för nätverksgränssnitt", + "imageAlt": "Kort för gränssnittsundantag med vmbr0, vmbr1, vmbr2, bond0 och eno1 samt reglage för Hälsa och Varningar per gränssnitt", + "imageCaption": "Precis som för lagring finns Hälsa och Varningar per gränssnitt. Varje rad visar namn, typ (brygga / bond / fysiskt), IP och länkhastighet.", + "intro": "Samma princip gäller gränssnitt: undanta varje från hälsokontroller, aviseringar eller båda. Vanliga exempel:", + "items": [ + "En reservbrygga som avsiktligt är avstängd.", + "Ett fysiskt borttaget nätverkskort som fortfarande finns i /etc/network/interfaces.", + "Ett VLAN-undergränssnitt som bara används vid underhåll.", + "En hanteringsbrygga med kända, upprepade ändringar av länkstatus vid underhåll." + ], + "outro": "Status sparas i SQLite-tabellen excluded_interfaces. Det lila märket undantaget på fliken Nätverk gör att undantagna gränssnitt förblir synliga." + }, + "notifications": { + "heading": "Aviseringar och AI", + "body1": "Här aktiveras ProxMenux Monitor-aviseringar och AI-omformulering. Aktivera aviseringar startar sändning i bakgrunden, registrerar ett Proxmox VE-webhookmål för dess händelser och öppnar kanalformuläret för Telegram, Discord, e-post, Gotify och fler. AI-omformulering finns i ett utfällbart avancerat avsnitt i samma panel.", + "body2": "Alternativen förklaras på egna sidor: kanaler, händelsereglage, formaterade meddelanden, visningsnamn, sändning med dubblettfilter, väntetid, gruppering och tysta timmar, PVE-webhook, AI-leverantörer och instruktionslägen:", + "items": [ + "Aviseringar: kanaler (Telegram, Discord, Gotify, e-post och applösenord för Gmail / Microsoft, ntfy, Slack, Teams och allmän webhook), händelsekategorier, formaterade meddelanden, visningsnamn, sändning, PVE-webhook, historik och API.", + "AI-assistent: leverantörer (OpenAI, Anthropic, Gemini, Groq, OpenRouter, Ollama), modeller, standardinstruktioner eller egna instruktioner, utmatningsspråk, detaljnivå per kanal och AI-förslag." + ] + }, + "optimizations": { + "heading": "ProxMenux-optimeringar", + "intro": "Inventering av efterinstallationsoptimeringar som ProxMenux registrerat på värden. Val från Automatisk efterinstallation och Anpassningsbar efterinstallation registrerar tillämpningen i /usr/local/share/proxmenux/installed_tools.json. Monitor läser registret. En post kontrollerar inte på nytt att alla underliggande inställningar är oförändrade.", + "imageAlt": "ProxMenux-optimeringskort med 14 poster: färgad prick, namn och version. Här finns APT IPv4 Force, Bashrc Customization, Fastfetch, Log2ram SSD Protection, Memory Settings Optimization, Setting persistent network interfaces, System Limits Increase, APT Language Skip, Entropy Generation haveged med Legacy, Kernel Panic Configuration, Logrotate Optimization, Network Optimizations, Subscription Banner Removal och VFIO IOMMU Passthrough.", + "imageCaption": "Varje optimering visar namn, version och färgad prick. Uppe till höger finns den orange räknaren 14 aktiva. Verktyg med tillgänglig källkod går att öppna.", + "dotsTitle": "Vad prickarna betyder", + "dotsItems": [ + " Grön prick: registrerad optimering utan Legacy-markering eller visad uppdatering. Öppna raden när källkod är tillgänglig.", + " Bärnstensprick och legacy-märke: registrerad optimering vars skript har bytt namn eller ersatts. Bevarad källkod öppnas i Legacy-läge med bärnstensfärg. Värdens aktuella konfiguration kontrolleras inte på nytt." + ], + "clickTitle": "Öppna källkoden", + "clickBody": "Ett klick visar den kopplade bash-funktionen och skriptnamnet (auto_post_install.sh eller customizable_post_install.sh). Aktuella verktyg hämtas från värdens filer; äldre kan använda bevarad källkod. Syntaxmarkering och Kopiera hjälper vid granskning. Detta garanterar inte en kopia av exakt den kod som kördes vid installationen.", + "detailAlt": "Källkodsfönster för APT IPv4 Force med bash-funktionen force_apt_ipv4 från customizable_post_install.sh version 1.0. Markerad kod konfigurerar /etc/apt/apt.conf.d/99-force-ipv4 med Acquire ForceIPv4 true, registrerar verktyget och visar ett översatt meddelande om slutförd APT IPv4-konfiguration.", + "detailCaption": "Kod för APT IPv4 Force: funktionen force_apt_ipv4() från customizable_post_install.sh v1.0, med syntaxmarkering och kopiering med ett klick.", + "whyTitle": "Varför detta är viktigt", + "whyBody": "ProxMenux kan ändra kärnparametrar, paketkällor, nätverk, loggrotation och GPU-genomkoppling. Granska registrerade optimeringar före manuella ändringar, särskilt om en annan administratör satte upp värden. Kortet visar register och tillgänglig källkod; det granskar inte varje aktuell inställning och bevarar ingen exakt körningshistorik.", + "updatesTitle": "Banderoll för tillgängliga uppdateringar", + "updatesBody": "Om optimeringens version på disk är nyare än den som registrerats på värden visas en banderoll med antal och Tillämpa. Tillämpa öppnar väljaren, som Tillämpa tillgängliga uppdateringar i efterinstallationsmenyn. Välj vad som ska uppdateras; ProxMenux kör funktionerna igen och uppdaterar registret. När allt är aktuellt försvinner banderollen.", + "updatesAlt": "ProxMenux-optimeringskort med banderoll för tillgängliga uppdateringar, antal väntande och knappen Tillämpa som öppnar väljaren", + "updatesCaption": "Banderollen visas om minst en optimering har en nyare version på disk. Se Tillämpa tillgängliga uppdateringar för hela förloppet och motsvarigheten Path-A i skalmenyn.", + "revertTitle": "Ångra en optimering", + "revertBody": "Ångra en optimering med motsvarande val under Avinstallera optimeringar i ProxMenux Scripts-menyn. Avinstallationen tar bort posten från installed_tools.json och den försvinner från kortet vid nästa omladdning." + }, + "dataCollected": { + "heading": "Hur data samlas in", + "headerCard": "Kort", + "headerEndpoint": "Slutpunkt", + "headerSource": "Källa", + "rows": [ + { + "card": "Gränssnittsspråk", + "endpoint": "localStorage", + "source": "Webbläsarvalet proxmenux-ui-language; utan sparat val används först webbläsarens språk." + }, + { + "card": "Navigeringsordning", + "endpoint": "localStorage", + "source": "Webbläsarvalet proxmenux-nav-order; det bestämmer också startfliken." + }, + { + "card": "Nätverksenheter", + "endpoint": "/api/settings", + "source": "Sparas i panelens SQLite-tabell för inställningar." + }, + { + "card": "Tider i Health Monitor", + "endpoint": "/api/health/settings", + "source": "Tid för undertryckning per kategori i Health Monitor-databasen." + }, + { + "card": "Undantag för lagring och gränssnitt", + "endpoint": "/api/storage/exclusions, /api/network/exclusions", + "source": "SQLite-tabellerna excluded_storages och excluded_interfaces." + }, + { + "card": "Panelen Aviseringar och AI", + "endpoint": "/api/notifications/*", + "source": "Se Aviseringar och AI-assistent." + }, + { + "card": "ProxMenux-optimeringslista", + "endpoint": "/api/proxmenux/installed-tools", + "source": "Läser /usr/local/share/proxmenux/installed_tools.json, som skrivs av register_tool-anrop i efterinstallationsskripten." + }, + { + "card": "Källkodsfönster för optimering", + "endpoint": "/api/proxmenux/tool-source", + "source": "Hämtar den kopplade bash-funktionen från auto_post_install.sh eller customizable_post_install.sh på värden; äldre verktyg kan använda bevarad källkod." + } + ] + }, + "whereNext": { + "heading": "Gå vidare", + "items": [ + { + "label": "Fliken Appar", + "href": "/docs/monitor/dashboard/apps", + "tail": " — appstartaren vars placering ändras med navigeringsordningen." + }, + { + "label": "Aviseringar", + "href": "/docs/monitor/notifications", + "tail": " — kanaler, händelsereglage, kanalspecifika inställningar, historik och testsändning." + }, + { + "label": "AI-assistent", + "href": "/docs/monitor/ai-assistant", + "tail": " — leverantörer, modeller, instruktionslägen, språk och detaljnivå per kanal." + }, + { + "label": "Health Monitor → Avfärda varningar och tid för undertryckning", + "href": "/docs/monitor/health-monitor#dismissing-alerts-and-the-suppression-duration", + "tail": " — hur listorna för tid per kategori fungerar." + }, + { + "label": "ProxMenux Scripts → Automatisk efterinstallation", + "href": "/docs/post-install/automated", + "tailRich": " och Anpassningsbar efterinstallation — skripten som registrerar optimeringar i listan ovan." + }, + { + "label": "Avinstallera optimeringar", + "href": "/docs/post-install/uninstall", + "tail": " — hur du ångrar en optimering registrerad ovan." + }, + { + "label": "Översiktsindex", + "href": "/docs/monitor/dashboard", + "tail": " — tillbaka till fliköversikten." + } + ] + } +} diff --git a/web/messages/sv/docs/monitor/dashboard/storage.json b/web/messages/sv/docs/monitor/dashboard/storage.json new file mode 100644 index 00000000..c402ea5e --- /dev/null +++ b/web/messages/sv/docs/monitor/dashboard/storage.json @@ -0,0 +1,268 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Översikt: fliken Lagring | ProxMenux-dokumentation", + "description": "Fliken Lagring samlar fyra vyer: Proxmox-lagring med status, ZFS-pooler, interna diskar med SMART och externa USB-enheter. Diskdetaljerna visar SMART-attribut, slitage, livslängd och beständig observationshistorik." + }, + "header": { + "title": "Översikt: fliken Lagring", + "description": "Värdens lagring på en skärm: NFS / CIFS / LVM / ZFS / dir i Proxmox, ZFS-poolernas status, interna SATA/NVMe-diskar med SMART och externa USB-enheter. Klicka på en disk för att se SMART-attribut och observationshistorik.", + "section": "ProxMenux Monitor · Översikt" + }, + "intro": { + "title": "Uppbackad av tre källor", + "body": "Proxmox-lagring hämtas från pvesm status, ZFS från zpool status, diskar från lsblk + smartctl och NVMe-fält från nvme. Fliken uppdateras ungefär var 60:e sekund; detaljvyn begär en SMART-avläsning." + }, + "thresholds": { + "title": "Statusfärger och trösklar som tillämpas här", + "intro": "Health Monitor klassar status som grön under Varning, orange mellan Varning och Kritiskt och röd från Kritiskt och uppåt. Standardvärdena följer. Enskilda staplar kan använda andra färggränser som beskrivs nedan.", + "items": [ + "Kapacitet (värddiskar, PVE-lagring, ZFS-pooler, LXC-monteringar) — varning 85 %, kritiskt 95 %.", + "Disktemperatur HDD 60/65 °C · SSD 70/75 °C · NVMe 80/85 °C · SAS 55/65 °C (varning / kritisk)." + ], + "outro": "Varje värde kan ställas in per värd. Inställningar → Health Monitor-gränser visar de gällande värdena och förklarar hur de ändras." + }, + "topRow": { + "heading": "Översta raden: lagringsöversikt", + "intro": "När fliken öppnas sammanfattar fyra kort total kapacitet, lokal användning, fjärranvändning och fysiska diskar. De ger snabba svar; korten nedanför innehåller detaljerna.", + "imageAlt": "Fliken Lagring med fyra kort: total kapacitet, lokal användning, fjärranvändning och fysiska diskar", + "imageCaption": "Översta raden: total kapacitet och antal diskar, lokalt och på distans använda byte samt fysiska diskar per typ med statusöversikt.", + "headerCard": "Kort", + "headerWhat": "Vad det visar", + "totalLabel": "Total lagring", + "totalWhat": "Total råkapacitet för alla fysiska diskar. Sidfoten visar antalet upptäckta diskar.", + "localLabel": "Lokalt använt", + "localWhat": "Använda byte på lokal lagring: LVM / LVM-thin / ZFS / dir på värdens diskar. Huvudvärdet visar använda byte och sidfoten X.XX % av Y TB visar även fyllnadsgraden.", + "remoteLabel": "Fjärranvändning", + "remoteWhat": "Samma format som lokal användning för fjärrlagring NFS / CIFS / PBS / Ceph / iSCSI. De räknas separat eftersom lokala och fjärrbaserade avbrott har olika omfattning och resurserna planeras och övervakas på olika sätt.", + "disksLabel": "Fysiska diskar", + "disksIntro": "Inventeringen delas upp på två rader:", + "disksItems": [ + "Efter typ — antal NVMe i lila, SSD och HDD i blått. Upptäckta typer visas; en värd med bara NVMe visar endast det antalet.", + "Efter status — antal normala diskar i grönt, med varning i gult och kritiska i rött. Utan problem visas bara ”X normala”; övriga lägen visas när problem upptäcks." + ] + }, + "pveStorage": { + "heading": "Proxmox Storage kort", + "intro": "En rad per lagring i /etc/pve/storage.cfg med typ (nfs / cifs / zfspool / lvm / lvmthin / dir / pbs), namn, status aktiv/fel/ej övervakad, användningsgrad och färgad stapel:", + "items": [ + "Upp till 75 % — blå stapel och blått värde.", + "Över 75 % till 90 % — gul stapel och gult värde. Färggränserna är skilda från Health Monitors trösklar.", + "> 90 % — röd stapel och rött värde. Färggränsen är skild från eskalering i Health Monitor.", + "Fel — röd ram runt raden om lagringen är konfigurerad men inte nåbar, till exempel vid NFS-avbrott eller utgångna CIFS-inloggningsuppgifter.", + "Utesluten — lila ram och etikett ”ej övervakad”. Lagring som användaren uteslutit, till exempel arkivvolymer som avsiktligt hålls frånkopplade." + ], + "calloutTitle": "Utesluta lagring från övervakning", + "calloutBody": "Varje lagringsmeny kan markera lagringen som utesluten från övervakning. Inställningen sparas i excluded_storages och följs av översikten och Health Monitor: inga aviseringar och ingen påverkan på övergripande status." + }, + "zfs": { + "heading": "ZFS Pools kort", + "intro": "Visas bara om ZFS är installerat och minst en pool finns. Varje rad visar en pool med status, storlek, använt och ledigt utrymme samt statusikon:", + "items": [ + "ONLINE - grön. Allt hälsosamt.", + "DEGRADED — gult. Poolen levererar data men minst en enhet är otillgänglig; utbyte behöver hanteras.", + "FAULTED / UNAVAIL / SUSPENDED — rött. Poolen levererar inga data och kräver omedelbar åtgärd." + ], + "outro": "ZFS-status och varje disks SMART-status ingår i kategorin Diskar och I/O i Health Monitor." + }, + "physical": { + "heading": "Fysiska diskar och SMART-status", + "intro": "Interna diskar (SATA / NVMe). Varje rad kondenserar de mest användbara fälten vid en blick:", + "items": [ + "Enhetssökväg — /dev/sda, /dev/nvme0n1.", + "Typetikett — SATA / NVMe och tillhörande ikon.", + "Systemetikett — orange markering för diskar som identifierats som operativsystemets diskar. Identifieringen använder monteringarna / och /boot och ger etiketten System. En saknad etikett bevisar inte att disken kan raderas eller användas för annat utan risk.", + "Modell — tillverkare och modell från smartctl -i.", + "Kapacitet — i lättlästa enheter.", + "Temperatur — aktuellt värde i °C, färgat efter disktyp; NVMe använder högre gränser än SATA.", + "SMART-status — godkänd / underkänd / okänd.", + "Observationsetikett — om den beständiga historiken disk_observations har poster för disken visas en blå etikett med antalet, som 3 obs.. Klicka på disken för att granska dem.", + "Statusetikett — Bra / Varning / Kritiskt utifrån SMART och senaste observationer." + ], + "clickHint": "Ett klick på raden öppnar diskdetaljerna som beskrivs nedan.", + "warningTitle": "Var försiktig med diskar märkta System", + "warningBody": "Diskar med orange System-etikett innehåller det aktiva operativsystemet. Etiketten hjälper dig att identifiera dem; ProxMenux → Diskhantering → Formatera / Radera avvisar destruktiva åtgärder på dem. Använd en räddningsmiljö utanför det aktiva Proxmox-systemet för att återanvända startdisken." + }, + "external": { + "heading": "Extern lagring (USB)", + "body": "USB-enheter har ett eget kort som visas när minst en finns ansluten. Det har samma fält som interna diskar och en orange USB-etikett. Eftersom enheterna ofta bara ansluts för säkerhetskopiering eller tillfälliga överföringar sparas observationerna, men I/O-fel på frånkopplade USB-enheter eskaleras inte." + }, + "drillIn": { + "heading": "Dialog med diskdetaljer", + "intro": "Ett klick på en disk öppnar fyra flikar: Översikt · SMART · Historik · Schema. Rubriken visar sökväg, modell, kapacitet och vid behov orange System-etikett.", + "overviewTitle": "Flik 1 — Översikt", + "overviewImageAlt": "Diskdetaljer med fliken Översikt, status, ringindikator för slitage och livslängd samt viktiga SMART-attribut", + "overviewImageCaption": "Översikt: identitet, status, återstående livslängd med aktuellt slitage och skrivna data samt viktiga SMART-attribut.", + "overviewIntro": "Startflik för att granska diskens status utan att köra ett test. Tre block:", + "overviewItems": [ + "Identitet — modell, serienummer, kapacitet och status Bra / Varning / Kritiskt.", + "Slitage och livslängd — ring för återstående livslängd (97 %, 50 %, …) med källattribut (Media Wearout Indicator, Percentage Used, …), stapel för förbrukad andel, prognosen Beräknad livslängd i år och totalt skrivna data. NVMe visar även Available Spare.", + "SMART-attribut: de viktigaste värdena visas i två kolumner: temperatur, drifttimmar med en läsbar varaktighet som 3 år och 116 dagar, varvtal eller SSD, antal starter, SMART-status, omallokerade sektorer, väntande sektorer och CRC-fel. Den fullständiga attributtabellen finns på fliken SMART." + ], + "smartTitle": "Flik 2 — SMART", + "smartImageAlt": "Diskdetaljer, SMART-fliken med kort och utökat test, senaste resultat och fullständig attributtabell", + "smartImageCaption": "SMART-fliken: kör korta eller utökade tester, granska senaste resultatet och alla attribut och öppna hela rapporten för utskrift eller PDF-sparande.", + "smartIntro": "Tillgängliga åtgärder i tre avsnitt:", + "smartItems": [ + "Kör SMART-test — två knappar. Kort test (~2 min) väntar på resultatet och visar det i dialogen. Utökat test (bakgrund) kan ta timmar på stora diskar, fortsätter på servern och aviserar när det är klart.", + "Senaste test — typ, status (godkänt / underkänt) och tidsstämpel för senaste körningen.", + "SMART-attribut — fullständig tabell med ID, namn, värde, sämsta värde och status bra, varning eller kritiskt. SATA/SAS visar den numrerade listan. NVMe använder nvme smart-log: temperatur, tillgänglig reserv, förbrukad andel, lästa/skrivna enheter, värdläsningar/-skrivningar, styrenhetens upptagna tid, startcykler, osäkra avstängningar, mediefel, felloggposter och tid med sammansatt temperatur i varnings-/kritiskt område." + ], + "pdfTitle": "Visa fullständig SMART-rapport (PDF)", + "pdfIntro": "Längst ner på SMART öppnar Visa fullständig SMART-rapport en utskrivbar rapport. Spara den som PDF via webbläsarens utskriftsdialog för arkivering eller för tillverkarsupport vid RMA.", + "pdfPreviewAlt": "Första sidan i SMART-rapporten med sammanfattning, PASSED-ring och diskinformation", + "pdfPreviewCaption": "Första sidan: sammanfattning, PASSED-ring och fullständig diskinformation. Exempel-PDF:en innehåller SSD-slitage, alla SMART-attribut och testhistorik.", + "pdfDownloadLabel": "Hämta exempelrapport för SMART (PDF)", + "pdfSectionsIntro": "Rapporten har sex huvudavsnitt:", + "pdfSections": [ + "Sammanfattning — PASSED/FAILED, begriplig diskbedömning — bra, sliten eller felande — och fyra uppgifter: rapporttid, senaste testtyp, resultat och kontrollerade attribut.", + "Diskinformation — modell, serienummer, kapacitet, typ HDD/SSD/NVMe, familj, formfaktor, gränssnitt (SATA 3.3 · 6.0 Gb/s, …), TRIM, temperatur och optimal gräns, drifttimmar, starter, SMART, väntande/omallokerade sektorer och CRC-fel.", + "SSD-slitage och livslängd (endast SSD/NVMe) — återstående livslängd, källattribut, aktuellt slitage, skrivna data och drifttimmar.", + "Fullständiga SMART-attribut — ID, namn, värde, sämsta värde, gräns, råvärde och status för varje attribut. Viktiga fält som Reallocated Sector Ct, Power On Hours, Reported Uncorrect, UDMA CRC Error Count och Media Wearout Indicator förklaras kort under raden.", + "Senaste självtest och fullständig historik — senaste testet med typ, resultat, slutmeddelande och drifttimmar vid tillfället samt en numrerad tabell över alla sparade tester.", + "Rekommendationer — åtgärder utifrån resultatet. För friska diskar: disken är bra / regelbundna tester / säkerhetskopieringsstrategi. När attribut ligger utanför gränserna ges råd om utbyte." + ], + "pdfOutro": "Webbläsaren skapar rapporten; Skriv ut och Spara som PDF öppnar båda utskriftsdialogen. Välj ett namn som SMART-<short-id>.pdf. Spara daterade kopior för jämförelser över tid eller delning med supporten.", + "historyTitle": "Flik 3 — Historik", + "historyImageAlt": "Diskdetaljer, fliken Historik med tidigare SMART-tester samt åtgärder för hämtning och borttagning", + "historyImageCaption": "Diskens SMART-historik. Varje rad visar typ, tid, ålder, markering av senaste test samt hämtning av smartctl-utdata och borttagning.", + "historyIntro": "Sparade slutförda korta och utökade tester för disken. Varje post innehåller ursprungliga smartctl-utdata och fälten som Monitor tolkar för översikten. Åtgärder per rad:", + "historyItems": [ + "Hämta — sparar JSON-ögonblicksbilden med rapportens smartctl -a-data. Praktiskt när tillverkarsupporten behöver ursprungliga diagnostikfält.", + "Ta bort — raderar ett test manuellt ur historiken. Lagringsgränsen i Schema (senaste 5 / 10 / 20) tar automatiskt bort de äldsta." + ], + "scheduleTitle": "Flik 4 — Schema", + "scheduleImageAlt": "Diskdetaljer, fliken Schema med reglage för automatiska SMART-tester, schemalista och knappen Lägg till schema", + "scheduleImageCaption": "Schema: välj typ, intervall och lagringstid; Monitor konfigurerar cron för automatiska tester.", + "scheduleIntro": "Automatiska SMART-tester via cron utan terminal. Tre områden:", + "scheduleItems": [ + "Automatiska SMART-tester — gemensamt reglage för diskens alla scheman. Pausar dem vid underhåll utan att radera konfigurationen.", + "Konfigurerade scheman — en rad per schema med typ (kort / långt), läsbart cron-uttryck (”Den 1:a varje månad kl. 03:00”, ”Varje söndag kl. 02:00”), berörda diskar och lagringsinställning.", + "Lägg till / Redigera schema — typ (kort ~2 min / långt 1–4 h), intervall (dagligen / veckovis / månadsvis), månads- eller veckodag, tid och sparade resultat (senaste 5 / 10 / 20)." + ], + "scheduleOutro": "Schemat skapar en cron-post på värden som anropar Monitor. Resultaten sparas i SMART-historiken på flik 3 och lagringsinställningen tar automatiskt bort de äldsta när ett nytt test är klart.", + "tempTitle": "Dialog med temperaturhistorik", + "tempIntro": "Monitor läser regelbundet av diskar med temperatursensor och sparar en lokal historik. Det aktuella värdet visas i Översikt; ett klick öppnar temperaturhistoriken.", + "tempImageAlt": "Temperaturhistorik med sökväg och modell, intervall på 1 timme, 24 timmar, 7 eller 30 dagar, Aktuellt/Min/Medel/Max och linjediagram färgat efter disktypens gränser", + "tempImageCaption": "Temperaturdetaljer öppnas från Översikt om sensorn visar ett värde skilt från noll. Diagrammet använder gränserna för HDD / SSD / NVMe / SAS.", + "tempShowsTitle": "Dialogens innehåll", + "tempShowsItems": [ + "Tidsintervall: 1 timme, 24 timmar som standard, 7 dagar eller 30 dagar. Varje fråga anpassar upplösningen för ett läsbart diagram.", + "Fyra indikatorer: Aktuellt, Min, Medel och Max under intervallet. Aktuellt använder lagringens och aviseringarnas gränser för normal, förhöjd eller hög temperatur.", + "Linjediagram över temperatur över tid med linje och yta färgade efter disktyp:" + ], + "tempDiskTypes": [ + "HDD - typiskt kallare trösklar.", + "SSD – måttliga trösklar.", + "NVMe högre trösklar (NVMe körs varmare av design).", + "SAS — varning vid 55 °C och kritiskt vid 65 °C; varningsgränsen skiljer sig från HDD." + ], + "tempConfigurable": "Alla fyra typerna konfigureras under Inställningar → Health Monitor-gränser.", + "tempWhyTitle": "Varför historiken är viktig", + "tempWhyItems": [ + "Upptäck trender. En enskild avläsning visar inte att en disk värms upp under flera veckor, till exempel på grund av fläktproblem, damm eller närliggande värme. Vyerna för 7 och 30 dagar visar utvecklingen.", + "Koppla temperaturtoppar. Om en säkerhetskopiering eller återuppbyggnad kortvarigt passerade gränsen visar vyerna för 1 och 24 timmar om det var enstaka eller återkommande.", + "Justera gränser. Kontrollera diskens faktiska arbetsintervall i 30-dagarsdiagrammet innan du ändrar Inställningar → Health Monitor-gränser." + ], + "obsTitle": "Observationshistorik i flikarna", + "obsIntro": "Diskfel kan utvecklas gradvis. En disk kan visa SMART PASSED samtidigt som den loggar läsfel i dmesg, tappar SATA-länkar eller visar tillfälligt väntande sektorer. ProxMenux sparar dessa signaler och visar dem i dialogen bredvid aktuell SMART-status.", + "obsImageAlt": "Översikt av en disk med godkänt SMART och noll omallokerade/väntande sektorer och CRC-fel, men en I/O-observation med ursprungligt kärnmeddelande, ATA-förklaring, första och senaste tid samt antal", + "obsImageCaption": "En disk med godkänt SMART kan ha tidigare observationer. Kortet kompletterar aktuell status med signalhistoriken.", + "obsWhatTitle": "Vad är en observation?", + "obsWhatIntro": "ProxMenux sparar diskhändelser från kärnloggen, dmesg eller SMART som en observation när de var för sig är för detaljerade för en avisering. Varje rad visar:", + "obsWhatItems": [ + "Typ — I/O-, SMART-, filsystems-, ZFS-pool- eller anslutningsfel.", + "Ursprungligt kärnmeddelande från dmesg att kopiera till en sökmotor eller ett supportärende.", + "Kort förklaring av kända ATA-koder: IDNF, sektoradress hittades inte, möjlig defekt sektor eller kabel; UNC, okorrigerbart läsfel, defekt sektor; och andra standardkoder.", + "Första och senaste tid samt antal förekomster, grupperade efter felsignatur." + ], + "obsWhyTitle": "Varför ProxMenux sparar och visar dem", + "obsWhyItems": [ + "Fel kan utvecklas över tid. ATA-bussfel, UNC-sektorer eller mediefel kan uppstå innan SMART visar FAILED. dmesg-bufferten behåller dem inte efter en omstart; observationshistoriken gör det.", + "SMART utesluter inte alla fel. En disk kan visa gröna attribut och ändå ha problem. Observationerna sparar ytterligare symtom som ICRC, IDNF, SATA-länkåterställningar eller sänkt hastighet.", + "Skiljer aktuellt från nyligen. Health Monitor löser tillfälliga fel automatiskt när de slutar återkomma. Historiken visar även flera dagar senare exempelvis tre I/O-fel från en natt.", + "Underlag för graderade aviseringar. disk_io använder observationsfrekvensen för tyst, WARNING eller CRITICAL i det rullande 24-timmarsfönstret som infördes i 1.2.1.2." + ], + "obsDedupTitle": "Gruppering av dubbletter och nya aviseringar", + "obsDedupBody1": "Observationer grupperas efter signatur, ett stabilt fingeravtryck av feltyp, enhet och viktiga meddelandefält. Upprepningar ökar occurrence_count i befintlig rad. En annan signatur skapar en ny observation och räknas som ny aviseringshändelse.", + "obsDedupBody2": "För att undvika aviseringskaskader meddelar den första kombinationen av disk, signatur och allvarlighetsgrad operatören. Samma kombination väntar 24 timmar före nästa avisering även om antalet ökar. En ändring från WARNING till CRITICAL bryter väntetiden och meddelar försämringen.", + "obsDismissTitle": "Beständig historik och aktiva fel", + "obsDismissBody1": "Observationer kan inte avfärdas, döljas eller raderas. Varje signatur har ett kort; en upprepning ökar antalet och uppdaterar senaste tiden. Historiken följer serienumret: en annan disk börjar tom även på samma port, och ett namnbyte i kärnan bevarar historiken.", + "obsDismissBody2": "Att lösa eller avfärda ett aktivt fel i Health Monitor ändrar inte observationerna. De finns kvar efter automatisk lösning så att en tillfällig varning från förra veckan fortfarande syns. Se Health Monitor för hantering av aktiva fel." + }, + "dataCollected": { + "heading": "Hur data samlas in", + "headerSection": "Avsnitt av fliken", + "headerEndpoint": "Ändpunkt", + "headerSource": "Källa", + "rows": [ + { + "section": "Övre sammanfattningskort", + "endpoint": "/api/storage/summary", + "source": "Aggregerad från lsblk, zpool list, vgs / lvs." + }, + { + "section": "Inventering per disk", + "endpoint": "/api/storage", + "source": "lsblk -O + smartctl -i per enhet med identitetscache som töms vid hotplug-händelser." + }, + { + "section": "Proxmox-lagring", + "endpoint": "/api/proxmox-storage", + "source": "pvesh get /nodes/<node>/storage med aktiv / online-tillståndet för varje." + }, + { + "section": "Aktuella SMART-värden", + "endpoint": "/api/storage/smart/", + "source": "smartctl -A <dev> är en möjlig fråga; detaljändpunkten använder även fullständiga SMART-JSON-data och NVMe-specifika värden." + }, + { + "section": "Historik för SMART-självtester", + "endpoint": "/api/storage/smart//history", + "source": "Sparas under /usr/local/share/proxmenux/smart/<disk>/ som JSON-ögonblicksbilder." + }, + { + "section": "Permanenta observationer", + "endpoint": "/api/storage/observations", + "source": "SQLite-tabell som Health Monitor uppdaterar varje cykel och behåller efter att aktiva fel lösts." + } + ], + "outro": "Verifiera samlingskedjan på värden:", + "codeComment1": "# Hämta aktuell status från ett skript", + "codeComment2": "# Jämför översiktens data med operativsystemets egna uppgifter" + }, + "whereNext": { + "heading": "Läs vidare", + "items": [ + { + "label": "Hälsoövervakare", + "href": "/docs/monitor/health-monitor", + "tail": " — kategorin Diskar och I/O samt regler för undertryckning." + }, + { + "label": "API-referens", + "href": "/docs/monitor/api", + "tail": " — ändpunkter för lagring och SMART." + }, + { + "label": "Aviseringar", + "href": "/docs/monitor/notifications", + "tailRich": " — följdåtgärder som utlöses av disk_io_error, storage_unavailable och smart_test_failed." + }, + { + "label": "Översiktsindex", + "href": "/docs/monitor/dashboard", + "tail": " — de andra flikarna." + }, + { + "label": "ProxMenux → Diskhanteraren", + "href": "/docs/disk-manager", + "tail": " — TUI-åtgärder: formatera, radera, SMART-tester och importera diskar till VM eller containrar." + }, + { + "label": "ProxMenux → Diskstatus och SMART-tester", + "href": "/docs/disk-manager/smart-disk-test", + "tail": " — CLI-motsvarighet: schemalägg SMART-tester, exportera visade JSON-data och läs om testtyper och resultattolkning." + } + ] + } +} diff --git a/web/messages/sv/docs/monitor/dashboard/system-logs.json b/web/messages/sv/docs/monitor/dashboard/system-logs.json new file mode 100644 index 00000000..c3cbb9e7 --- /dev/null +++ b/web/messages/sv/docs/monitor/dashboard/system-logs.json @@ -0,0 +1,120 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Översikt: Systemloggar | ProxMenux-dokumentation", + "description": "fliken System Logs konsoliderar tre källor i en skärm: live journalctl med filter och nedladdning, Proxmox aktivitetshistorik (UPID) och meddelandelogg - allt sökbart, filtrerat genom svårighetsgrad / tidsintervall och nedladdningsbart som textpaket." + }, + "header": { + "title": "Översikt: Systemloggar", + "description": "Tre underflikar i samma vy: systemjournalen (journalctl med filter), Proxmox uppgiftshistorik och aviseringsloggen. Alla tre kan sökas, filtreras och laddas ner som textpaket.", + "section": "ProxMenux Monitor Dashboard" + }, + "readOnly": { + "title": "Read-only av design", + "body": "Den här fliken ändrar inga loggfiler. Filtren finns i URL:en eller gränssnittets tillstånd och nedladdningar skapas på servern. Översikten raderar aldrig loggposter. För loggunderhåll använder du journalctl --vacuum-time=<N> eller logrotate på värden." + }, + "topRow": { + "heading": "Övre raden: fyra räknare", + "items": [ + "Totalt antal poster — antal loggposter i det aktiva filtrets tidsintervall.", + "Fel — antal poster med allvarlighetsgrad ≤ 3 (err / crit / alert / emerg).", + "Varningar — antal poster med allvarlighetsgrad 4 (warning).", + "Säkerhetskopieringar — antal vzdump-/PBS-uppgifter i samma tidsintervall." + ] + }, + "subtabs": { + "heading": "Tre underflikar", + "logsTitle": "Loggar", + "logsIntro": "Systemjournalen hämtas på servern med journalctl. Följande filter finns i verktygsfältet:", + "logsFilters": [ + "Allvarlighetsgrad — emerg / alert / crit / err / warning / notice / info / debug, eller valfri kombination.", + "Time range - sista 5 min / 15 min / 1 h / 6 h / 24 h / 7 d / custom.", + "Fritextsökning — delsträng eller reguljärt uttryck (journalctl --grep).", + "Enhetsfilter — begränsa till en viss systemd-enhet (pveproxy.service, nginx.service, …)." + ], + "logsRowsAfter": "Varje rad visar tidsstämpel, svårighetsgrad, källenhet och meddelandet. Långa meddelanden kollapsar med en \"visa mer\" växel. Den är Ladda ner Åtgärder buntar det aktuella filtret i en enda .txt fil via GET /api/logs/download - användbar när du vill dela en bit av tidskrift med någon.", + "logDetailsModalTitle": "Dialogrutan Loggdetaljer", + "logDetailsBody": "Ett klick på en rad öppnar dialogrutan Loggdetaljer med alla strukturerade fält som journald fångade för posten, samma vy som journalctl --output=verbose på värden.", + "logDetailsImageAlt": "Dialogrutan Loggdetaljer — en utökad journalpost med nivå, tjänst, tidsstämpel, källa, systemd-enhet, process-ID, värdnamn och hela meddelandet", + "logDetailsImageCaption": "Loggdetaljer — alla strukturerade journald-fält för posten, med hela det oförkortade meddelandet längst ner. Användbart för cron- och tjänsteloggar där den körda kommandoraden är viktig.", + "fieldsIntro": "Fält som visas:", + "fields": [ + "Level - färgad svårighetsgrad (INFO / WARNING / ERROR / CRITICAL).", + "Service - kort namn på enheten / processen som sände inträdet.", + "Timestamp - helt datum och tid för logglinjen.", + "Source - ursprunget till posten (journal, kärna, revision, ...).", + "Systemd Unit - den faktiska .service / .timer / .socket enhet om posten var associerad med en.", + "Process ID – PID för emitteringsprocessen.", + "Hostname - användbar när tidskrifter vidarebefordras över klusternoder.", + "Meddelande — hela det oförkortade meddelandet i ett block med fast teckenbredd, klart att kopiera." + ], + "maxLevelStoreTitle": "Journald MaxLevelStore", + "maxLevelStoreBody": "På en ny Proxmox-installation använder journald som standard MaxLevelStore=warning, vilket kastar bort info-meddelanden. Monitor upptäcker detta vid start och lägger till en kompletterande konfiguration (/etc/systemd/journald.conf.d/proxmenux-loglevel.conf) med gränsen info, så att informationsmeddelanden och allvarligare meddelanden sparas. Detta omfattar inte debug.", + "backupsTitle": "Säkerhetskopieringar", + "backupsBody": "Proxmox uppgiftshistorik filtrerad till säkerhetskopieringar. En rad per uppgift (vzdump, PBS-överföringar, Garbage Collect, Verify) med status (OK / WARNINGS / ERROR), berörd gäst, källagring, varaktighet och UPID. Klicka på en rad för att läsa hela uppgiftsloggen via GET /api/task-log/<upid> — samma data som i Datacenter → Tasks, begränsade till säkerhetskopieringar.", + "notificationsTitle": "Aviseringar", + "notificationsBody1": "Alla aviseringar som Monitor skickar: Telegram, Discord, e-post, Gotify, ntfy, Slack, Teams och webhook. Varje rad visar tidsstämpel, kanal, händelsetyp, allvarlighetsgrad, genererad rubrik och text samt, om AI är aktiverat, ett reglage för att jämföra AI-versionen med originalet.", + "notificationsBody2": "Använd fliken för att kontrollera att en kanal levererar aviseringar och jämföra AI-versionen med grundmallen. Kanaler ställs in på den detaljerade sidan Aviseringar." + }, + "dataCollected": { + "heading": "Hur data samlas in", + "headerSubtab": "Underflik", + "headerEndpoint": "Slutpunkt", + "headerSource": "Källa", + "rows": [ + { + "subtab": "Loggar (livefilter)", + "endpoint": "/api/logs", + "source": "journalctl --output json --since <range> med filter för allvarlighetsgrad, enhet och sökning på servern." + }, + { + "subtab": "Ladda ner", + "endpoint": "/api/logs/download", + "source": "Samma fråga, returnerad som oformaterad text för grep / less." + }, + { + "subtab": "Säkerhetskopieringar", + "endpoint": "/api/backups", + "source": "PVE-uppgiftshistorik filtrerad efter vzdump, PBS-överföringar, Garbage Collect och Verify." + }, + { + "subtab": "Detaljer för en säkerhetskopieringsuppgift", + "endpoint": "/api/task-log/<upid>", + "source": "Hela uppgiftsloggen läses som oformaterad text från /var/log/pve/tasks/<index>/<upid>." + }, + { + "subtab": "Aviseringshistorik", + "endpoint": "/api/notifications/history", + "source": "SQLite-tabellen notification_history fylls av sändningsslingan." + } + ], + "apiIntro": "Både livefiltret och nedladdningarna kan också nås via API:", + "codeComment1": "# Fel och allvarligare händelser från den senaste timmen med ett sökord", + "codeComment2": "# Ladda ner hela journalen från de senaste 6 timmarna som oformaterad text", + "codeComment3": "# Slå upp hela utdata för en viss uppgift med dess UPID" + }, + "whereNext": { + "heading": "Nästa steg", + "items": [ + { + "label": "Hälsoövervakare", + "href": "/docs/monitor/health-monitor", + "tail": " — kategorin Systemloggar, som bevakar ihållande mönster, toppar och kaskader." + }, + { + "label": "Aviseringar", + "href": "/docs/monitor/notifications", + "tail": " — journalbevakningen läser samma källa och omvandlar träffar till aviseringar." + }, + { + "label": "API-referens", + "href": "/docs/monitor/api", + "tail": " — slutpunkterna logs och task-log med sina frågeparametrar." + }, + { + "label": "Översiktsindex", + "href": "/docs/monitor/dashboard", + "tail": " — de andra flikarna." + } + ] + } +} diff --git a/web/messages/sv/docs/monitor/dashboard/system-overview.json b/web/messages/sv/docs/monitor/dashboard/system-overview.json new file mode 100644 index 00000000..6cd42fb9 --- /dev/null +++ b/web/messages/sv/docs/monitor/dashboard/system-overview.json @@ -0,0 +1,177 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Översikt: Systemöversikt | ProxMenux-dokumentation", + "description": "Standardstartfliken i ProxMenux Monitor: fyra mätkort (CPU, minne, aktiva VM och LXC, temperatur) med liveuppdatering och minidiagram, historikdiagram samt lagrings- och nätverkssammanfattningar med länkar till respektive flik." + }, + "header": { + "title": "Översikt: Systemöversikt", + "description": "Fliken som öppnas som standard: fyra livekort med mätvärden överst, historikdiagram i mitten och sammanfattningar av lagring och nätverk längst ner, från samma API:er som respektive detaljflik.", + "section": "ProxMenux Monitor · Översikt" + }, + "readOnly": { + "title": "En skrivskyddad ögonblicksbild", + "body": "Alla paneler på fliken visar information. Åtgärder finns på länkade flikar: Lagring för diskhantering, VM och LXC för att starta eller stoppa gäster och Säkerhet för autentisering." + }, + "captureAlt": "Systemöversikt — fyra mätkort (CPU, minne, aktiva VM, temperatur), nodens mätvärdesdiagram och sammanfattningskort för lagring och nätverk", + "captureCaption": "Systemöversikt, standardstartfliken. De fyra korten visar livevärden, diagrammet visar historik och de två nedersta korten sammanfattar lagring och nätverk.", + "topRow": { + "heading": "Övre raden: mätkort med livevärden", + "intro": "Fyra kort i ett 2×2-rutnät på mobilen och i en rad på datorn. Varje kort uppdateras från /api/system med några sekunders mellanrum.", + "headerCard": "Kort", + "headerWhat": "Vad det visar", + "headerSource": "Källa", + "rows": [ + { + "card": "CPU-användning", + "what": "Aktuell procentandel med en stapel. Uppdateras ungefär varje sekund av vitaldata-samplaren.", + "source": "psutil.cpu_percent()" + }, + { + "card": "Minnesanvändning", + "what": "Använda GB, procentandel och totalt antal GB. Stapeln visar procentandelen.", + "source": "psutil.virtual_memory()" + }, + { + "card": "Aktiv VM & LXC", + "what": "Antal körande gäster med uppdelning Körs / Stoppade och totalt antal VM och LXC längst ner.", + "source": "/api/vms (konsoliderad)" + }, + { + "card": "Temperatur", + "what": "CPU-temperatur i °C med status (sval / varm / het) och ett minidiagram för de senaste 5 minuterna i bakgrunden. Visar N/A utan sensor. Klicka för att öppna temperaturdetaljer.", + "source": "sensors / coretemp" + } + ], + "thresholdsTitle": "Statusfärger och trösklar som tillämpas här", + "thresholdsIntro": "Ringar, staplar och minidiagram använder samma skala: grön under Varning, bärnstensfärgad mellan Varning och Kritisk, röd från Kritisk och uppåt. Rekommenderade standardvärden i ProxMenux:", + "thresholdsItems": [ + "CPU-användning — varning 85 %, kritisk 95 %.", + "Minne — varning 85 %, kritisk 95 %. Swap utlöser också Kritisk vid 5 % användning; en välfungerande Proxmox-värd bör sällan behöva använda swap.", + "CPU-temperatur — varning 80 °C, kritisk 90 °C." + ], + "thresholdsOutro": "Alla värden kan ställas in per värd. Inställningar → Tröskelvärden för hälsokontrollen är den centrala referensen och förklarar hur de anpassas.", + "sparklineTitle": "Minidiagrammet visar trenden", + "sparklineBody": "Temperaturkortet drar ett 5-minuters spår under värdet, med linjen och gradientfärgen efter samma varning / kritiskt par dokumenterat ovan. Det är det snabbaste sättet att se om värden är i en termisk klättring utan att öppna detaljerna." + }, + "processes": { + "heading": "Processer med högst CPU- och minnesanvändning", + "intro": "Korten CPU-användning och Minne öppnar en sorterbar lista över de 25 största processerna: efter CPU-användning från CPU-kortet eller resident minne från minneskortet.", + "listTitle": "Listdialogrutan", + "listItems": [ + "Automatisk uppdatering — listan uppdateras var 5:e sekund medan dialogrutan är öppen och slutar hämta data när den stängs.", + "Filter — sökfältet begränsar listan efter kommando, användare eller PID.", + "Staplar i raderna — huvudkolumnens stapel skalas mot det högsta värdet i den filtrerade listan. Rangordningen förblir tydlig även när ingen process är nära 100 %.", + "Mobil layout — under 640 px döljs PID och Användare, så att Kommando, CPU % och Minne får plats utan horisontell rullning." + ], + "captureListAlt": "Dialogruta med processer efter minne — tabell sorterad efter RSS med PID, användare, kommando, CPU % och minne", + "captureListCaption": "Minneskortet öppnar listan sorterad av RSS (indigo accent). CPU-kortet öppnar samma lista sorterad av CPU-användning (blå accent).", + "detailTitle": "Detaljer per process", + "detailIntro": "Klicka på en rad för att öppna en andra dialogruta med processens aktuella data i fyra avsnitt:", + "detailItems": [ + "Översikt — tillstånd, överordnad process, antal trådar, öppna filbeskrivare, användare och grupp.", + "Resurser — CPU %, minne %, resident minne (RSS), virtuell storlek, swap och totalt läst och skrivet I/O.", + "Kommando — kort namn, fullständig kommandorad, sökväg till den körbara filen och arbetskatalog.", + "Körtid — starttid och förfluten körtid." + ], + "detailRefresh": "Detaljerna uppdateras var 3:e sekund. När processen avslutas stoppas hämtningen och en bärnstensfärgad banderoll Processen har avslutats visas. Den senaste ögonblicksbilden ligger kvar nedtonad så att du kan se vad som hände strax före slutet.", + "captureDetailAlt": "Processdetaljer — Översikt, Resurser, Kommando och Körtid för ett PID", + "captureDetailCaption": "Perprocessdetaljdialog öppnad från en lista rad. Accentfärgen matchar kortet som öppnade det (blå för CPU, indigo för minne)." + }, + "middle": { + "heading": "Mitten: diagram med nodens mätvärden", + "body1": "Under korten visar NodeMetricsCharts historik för CPU, minne och disk-I/O från Proxmox RRD-lager via /api/node/metrics. Välj 1 timme / 24 timmar / 7 dagar / 30 dagar / 1 år. Upplösningen sänks för längre perioder så att diagrammet förblir följsamt.", + "body2": "Samma diagram som Proxmox webbgränssnitt visar för en nod, infogade i Monitors mörka tema och placerade i linje med övriga paneler." + }, + "bottom": { + "heading": "Nedre raden: sammanfattningar av lagring och nätverk", + "storageTitle": "Kortet Lagringsöversikt", + "storageIntro": "En kompakt vy av värdens lagringstillstånd, uppdelad i tre block:", + "storageItems": [ + "Nodens totala kapacitet — summan av VM-/LXC-lagring och lokal systemlagring, med en tonad stapel för använt och ledigt utrymme.", + "Total kapacitet / Fysiska diskar — råkapacitet och antal upptäckta fysiska diskar.", + "VM-/LXC-lagring — använt och ledigt utrymme samt procentandel för gästlagringen, med en räknare när flera lagringar finns.", + "Lokal lagring (system) — värdens rot- eller systemmontering, separat från gästpoolen." + ], + "storageDrillIn": "Detaljer finns på fliken Lagring: SMART per disk, ZFS-pooler, observationshistorik med mera.", + "networkTitle": "Kortet Nätverksöversikt", + "networkBody1": "Top line visar antalet aktiva gränssnitt (fysiska + broar i kombination). Nedan följer två rader färgade märken för de gränssnitt som är up - fysiska NIC i blå, broar i en sekundär färg. En tidsram väljare höger (1 timme / 24 timmar / 7 dagar / 30 dagar / 1 år) kontrollerar en liten RX / TX trafik diagram.", + "networkBody2": "Detaljer per gränssnitt (IP/MAC, RRD-diagram, bromedlemmar, bond-läge med mera) finns på fliken Nätverk." + }, + "refresh": { + "heading": "Uppdateringsmodell", + "intro": "Varje panel hanterar sitt laddningstillstånd (loadingStates.cpu, loadingStates.storage, …) så att en långsam källa inte blockerar resten. Under hämtning visas en pulserande platshållare. Fel hanteras utan att blockera vyn: utan temperatursensor visas N/A i stället för ett fel.", + "items": [ + "Övre mätkort — uppdateras ungefär var 5:e sekund. CPU och temperatur får även data varje sekund från vitaldata-samplaren.", + "Nodens mätvärdesdiagram — laddas när det öppnas och när period eller språk ändras. Vid behov görs ett nytt försök efter 60 s.", + "Lagringskort — uppdateras ungefär var 60:e sekund. SMART-data cachas längre; fliken Lagring begär en ny avläsning vid behov.", + "Nätverkskort — sammanfattning var 59:e sekund och trafikdiagram var 60:e sekund för vald period.", + "Manuell uppdatering — knappen Uppdatera i rubriken laddar genast om alla paneler." + ] + }, + "dataCollected": { + "heading": "Hur data samlas in", + "headerCard": "Kort", + "headerEndpoint": "Slutpunkt", + "headerSource": "Källa", + "rows": [ + { + "card": "Statusindikator i rubriken", + "endpoint": "/api/health", + "source": "Den cachade övergripande status som produceras av hälsokontrollen varje cykel." + }, + { + "card": "CPU / RAM / Swap / Drifttid", + "endpoint": "/api/system", + "source": "/proc/stat, /proc/meminfo, /proc/uptime med kortfönster CPU provtagning." + }, + { + "card": "Värd info (kernel, BIOS, distro)", + "endpoint": "/api/info", + "source": "uname -a, dmidecode, PVE version. Cachad per process." + }, + { + "card": "Lagring / nätverk / VM-kort", + "endpoint": "/api/storage/summary, /api/network/summary, /api/vms", + "source": "Se dedikerade flikarna för varje. Rubriken visar en kompakt vy från samma slutpunkter." + }, + { + "card": "Uppdateringsintervall", + "endpoint": "—", + "source": "Systemdata var 5:e sekund; lagring, VM och nätverkssammanfattning var 59:e sekund. Uppdatera i rubriken laddar genast om alla paneler." + } + ], + "codeComment1": "# Anropet som ger statusindikatorn i rubriken dess data", + "codeComment2": "# offentligt, ingen token", + "codeComment3": "# Autentiserad ögonblicksbild som används av korten" + }, + "whereNext": { + "heading": "Var till nästa", + "items": [ + { + "label": "Hälsoövervakare", + "href": "/docs/monitor/health-monitor", + "tail": " — dialogrutan bakom statusindikatorn i rubriken: tio kategorier samt avfärdande och undertryckning av aviseringar." + }, + { + "label": "API-referens", + "href": "/docs/monitor/api", + "tail": " — slutpunkterna system, info och health." + }, + { + "label": "Aviseringar", + "href": "/docs/monitor/notifications", + "tail": " — Hur samma status förvandlas till Telegram / Discord / E-postmeddelanden." + }, + { + "label": "Översiktsindex", + "href": "/docs/monitor/dashboard", + "tail": " — de övriga översiktsflikarna i korthet." + }, + { + "label": "Arkitektur", + "href": "/docs/monitor/architecture", + "tail": " — bakgrundstrådarna och API:erna som ger data till den här vyn." + } + ] + } +} diff --git a/web/messages/sv/docs/monitor/dashboard/terminal.json b/web/messages/sv/docs/monitor/dashboard/terminal.json new file mode 100644 index 00000000..8f94ce39 --- /dev/null +++ b/web/messages/sv/docs/monitor/dashboard/terminal.json @@ -0,0 +1,174 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Översikt: Terminal | ProxMenux-dokumentation", + "description": "Skal på Proxmox-värden i webbläsaren: upp till 4 terminaler i rutnätsvy, tangentbordsknappar för mobila enheter (ESC, TAB, pilar, Ctrl-kombinationer), inbyggd kommandoguide med cheat.sh och JWT-skydd." + }, + "header": { + "title": "Översikt: Terminal", + "description": "En riktig skalsession på Proxmox-värden i webbläsaren. Upp till fyra terminaler samtidigt, tangentbordsknappar för mobila enheter och en inbyggd kommandoguide, med samma tema som resten av översikten.", + "section": "ProxMenux Monitor · Översikt" + }, + "intro": { + "title": "En riktig PTY i webbläsaren", + "body": "Terminalen skapar en PTY på servern via flask_terminal_routes, kopplar den med WebSocket till xterm.js i webbläsaren och körs som root, systemd-enhetens användare. Som med ssh root@<host> kan du använda vim, tmux, ncurses-verktyg och Proxmox CLI:er (qm, pct, pvesh, pvecm). Varje PTY exporterar PROXMENUX_TERMINAL=monitor. Alla underordnade bash-processer, även en senare start av menu, ärver variabeln så att de känner igen Monitors webbläsarterminal." + }, + "singleAlt": "Terminalfliken i ProxMenux Monitor — en terminalsession som visar Fastfetchs systemöversikt vid inloggning", + "singleCaption": "En värd terminal öppen - verktygsfältet ovan visar räkningen (1 / 4 terminaler), + New, Search, Clear och Close. De mobila tangentbordshjälparna visas under terminalen på touch-enheter.", + "target": { + "heading": "Anslutningsmål", + "body1": "Terminalfliken öppnar ett skal på själva Proxmox-värden, som vid SSH-inloggning. Varje flik öppnar en ny terminal på värden.", + "body2": "För att nå en LXC-container från webbläsaren använder du knappen Konsol på varje körande CT-kort på fliken VM och LXC. Den öppnar en dialogruta som kör pct enter <vmid> och använder samma mobilanpassade verktygsfält som beskrivs nedan." + }, + "menuGuard": { + "heading": "Skydd vid självuppdatering av menu i terminalen", + "body1": "När du bekräftar självuppdateringen ersätter menu sitt skriptträd och laddas om. Det fungerar via SSH eller Proxmox-konsolen, men i webbläsaren skulle skalets PTY stängas och WebSocket avbrytas. Därför läser check_updates_stable, check_updates_beta och apply_release_channel variabeln PROXMENUX_TERMINAL för att känna igen Monitor-kontexten.", + "body2": "Då ersätts ja/nej-dialogrutan med ett meddelande med det officiella installationskommandot: bash -c \"$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)\" för stable och motsvarande URL för install_proxmenux_beta.sh för beta. Uppdateringen utförs via SSH eller Proxmox-värdens konsol; webbläsarterminalen används bara för att läsa och bekräfta meddelandet." + }, + "fourTerminals": { + "heading": "Upp till fyra terminaler samtidigt", + "intro": "Fliken låter dig öppna upp till fyra värdterminaler samtidigt. Var och en får sin egen PTY och sin egen WebSocket De är helt oberoende sessioner. Två layouter växlar med ikonerna bredvid knappen \"New\":", + "items": [ + "Flikvy — en terminal synlig åt gången, de andra som namngivna flikar överst (Terminal 1, Terminal 2…). Passar när du arbetar med en uppgift och har resten i bakgrunden.", + "Rutnätsvy — alla öppna terminaler i ett 2×2-rutnät. Du kan bevaka htop i en, iftop i en annan och redigera i en tredje utan att växla flik." + ], + "outro": "Verktygsfältet visar antalet (1/4 terminaler, 4/4 terminaler). + Ny öppnar en flik; det lilla × i flikrubriken stänger den. Den stora röda knappen Stäng överst avslutar alla terminaler." + }, + "gridAlt": "ProxMenux Monitor Terminal-fliken - rutnätsvy med fyra värdterminaler som kör ls, nätverkskonfig, iftop och ProxMenux huvudmenyn sida vid sida", + "gridCaption": "Rutnätsvy (4 / 4 terminaler) — fyra oberoende PTY:er samtidigt: kataloglista, /etc/network/interfaces, iftop och ProxMenux huvudmeny. Växla mellan rutnät och flikar med layoutreglaget i verktygsfältet.", + "keyboard": { + "heading": "Tangentbordsknappar för mobila enheter", + "intro": "Tangentbord på telefoner och surfplattor saknar ofta ESC, TAB, piltangenter och kombinationer med modifierartangenter. De behövs i vim, nano, htop och TUI-menyer. Terminalfliken visar därför en rad pekknappar under terminalen på små skärmar eller enheter med pekstöd:", + "headerButton": "Knapp", + "headerSends": "Skickar", + "headerUse": "Typisk användning", + "rows": [ + { + "button": "ESC", + "sends": "\\x1b", + "use": "Lämna infogningsläge i vim, avbryt en TUI-dialogruta eller avsluta en sökning." + }, + { + "button": "TAB", + "sends": "\\t", + "use": "Automatisk komplettering av sökvägar och navigering mellan fält i dialog/whiptail." + }, + { + "button": "↑ ↓ ← →", + "sends": "\\x1bO[ABCD]", + "use": "Skalhistorik, markörförflyttning och menynavigering." + }, + { + "button": "↵ Retur", + "sends": "\\r", + "use": "Bekräfta. Vissa skärmtangentbord ersätter Enter med Gå/Klar; den här knappen är entydig." + }, + { + "button": "Ctrl ▾", + "sends": "Listruta", + "useRich": true + } + ], + "ctrlIntro": "Tre kontrollsekvenser:", + "ctrlItems": [ + "Ctrl+C — avbryt kommandot som körs (\\x03).", + "Ctrl+X — avsluta nano (\\x18).", + "Ctrl+R — sök bakåt i bash-historiken (\\x12)." + ], + "modalTitle": "Samma verktygsfält i dialogrutan för LXC-konsolen", + "modalBody": "Konsolen som öppnas från VM och LXC → Konsol visar samma tangentbordsknappar under dialogrutan. Vid anslutning skriver den automatiskt pct enter <vmid>, så att du kommer direkt in i containern." + }, + "lxcAlt": "LXC-konsolens dialogruta i ProxMenux Monitor — Terminal: ubuntu (ID: 103), med samma mobilanpassade verktygsfält (ESC, TAB, pilar, Enter, Ctrl) under terminalen", + "lxcCaption": "LXC-konsolen öppnad från VM och LXC → Konsol. Rubriken visar målcontainern (Terminal: ubuntu (ID: 103)) och samma pekanpassade verktygsfält finns under terminalen.", + "search": { + "heading": "Sök kommandon — inbyggd snabbguide", + "intro": "Den blå knappen Sök öppnar ungefärlig kommandosökning. Skriv några bokstäver i ett Linux- eller Proxmox-kommando (ls, tar, qm, pct, zpool, systemctl…) för att se exempel med Skicka till aktiv terminal med ett tryck. Då kan du hitta en flagga utan att byta webbläsarflik.", + "modalAlt": "ProxMenux Monitor — dialogrutan Sök kommandon med ungefärlig sökning efter Linux- och Proxmox-kommandon via cheat.sh och flera ls-exempel", + "modalCaption": "Sökning efter ls — varje resultat visar kommandot, dess beskrivning och en liten pil för att skicka det till aktiv terminal. Datakällan visas längst ner till höger (Data från cheat.sh).", + "aboutLabel": "Om cheat.sh:", + "aboutBody": "är en snabbguide med öppen källkod som underhålls av gemenskapen och samlar korta praktiska exempel för hundratals Linux-kommandon, administrationsverktyg och programmeringsspråk. Den skapades för curl cheat.sh/<command> i terminalen men kan även nås i webbläsaren. ProxMenux Monitor vidarebefordrar frågorna genom en proxy på servern så att dialogrutan har samma ursprung som översikten.", + "headerSource": "Källa", + "headerWhen": "När den används", + "headerWhat": "Vad du ser", + "onlineLabel": "(online)", + "onlineWhen": "När värden har internetåtkomst och cheat.sh proxy svarar.", + "onlineWhat": "Flera praktiska exempel per kommando med beskrivningen ovanför. Statuspunkten i dialogrutans rubrik är grön.", + "fallbackLabel": "Lokal reservlista", + "fallbackWhen": "När cheat.sh är oåtkomlig (offline värd, restriktiv brandvägg, cheat.sh avbrott).", + "fallbackWhat": "En medföljande lista med vanliga Linux- och Proxmox-kommandon. Mindre katalog, men alltid tillgänglig. Statuspunkten är röd.", + "sendingNote": "Så fungerar sändning: pilen bredvid resultatet skickar texten till aktiv terminal (vald flik eller den terminal du senast klickade på i rutnätet). Dialogrutan stängs automatiskt så att du kan trycka på Enter." + }, + "auth": { + "heading": "Autentisering", + "items": [ + "Webbläsaren begär först en engångsbiljett via POST /api/terminal/ticket med JWT i Authorization-huvudet. Biljetten skickas sedan när WebSocket öppnas och löper ut efter 5 sekunder. Om autentisering är aktiverad och biljetten saknas eller är ogiltig stängs anslutningen innan en PTY skapas.", + "Om Monitor ligger bakom en omvänd proxy måste den vidarebefordra WebSocket-uppgraderingar. Exempel för Nginx / Caddy / Traefik finns på Åtkomst och autentisering." + ] + }, + "clipboard": { + "heading": "Urklipp, rullningshistorik och storleksändring", + "items": [ + "Kopiera och klistra in — använder webbläsarens urklipp. Markera text med mus eller styrplatta och använd systemets kortkommando (Cmd+C på macOS, Ctrl+Shift+C på Linux/Windows). Linux-skrivbord stöder även inklistring med mittenknappen.", + "Rullningshistorik — rulla med hjul eller två fingrar. xterm.js behåller de senaste flera tusen raderna i minnet.", + "Ändra storlek — terminalen anpassar PTY-fönstrets storlek när översiktens panel ändras, så att htop och vim visas korrekt.", + "Återanslutning när fliken får fokus — appbyte på telefon eller surfplatta, särskilt iPad, kan bryta WebSocket. Terminalfliken upptäcker synlighetsändringen och återansluter när du kommer tillbaka, med 15 sekunders tidsgräns för långsamma VPN-anslutningar." + ] + }, + "disconnect": { + "heading": "Orsaker till frånkoppling", + "intro": "De vanligaste orsakerna till att en session slutar och vad man ska göra åt varje:", + "headerCause": "Orsak", + "headerFix": "Lösning", + "rows": [ + { + "cause": "Sessionens JWT har löpt ut när en terminal öppnas eller återansluts (24 timmar).", + "fix": "Uppdatera sidan och logga in igen. Terminalen är inte utformad för obevakade sessioner, så JWT-livslängden matchar den vanliga instrumentpanelen inloggning." + }, + { + "cause": "Tidsgräns för inaktivitet i den omvända proxyn.", + "fix": "Öka proxy_read_timeout i Nginx eller motsvarande i Caddy / Traefik (exempel under Åtkomst och autentisering)." + }, + { + "cause": "Telefon eller surfplatta i viloläge.", + "fix": "När enheten vaknar återansluts fliken automatiskt (15 sekunders tidsgräns för VPN-anslutningar). Ladda annars om fliken." + }, + { + "cause": "Tjänsten startas om på värden.", + "fix": "Varje omstart av proxmenux-monitor.service stänger alla PTY:er. Öppna nya terminaler när översikten har laddats om." + } + ] + }, + "warning": { + "title": "Terminalen är ett root-skal på värden", + "body": "Terminalen ärver systemd-enhetens användare (root) och har fulla rättigheter på Proxmox-värden. Ställ in användarnamn, lösenord och 2FA under Åtkomst och autentisering innan du tillåter åtkomst utanför det lokala nätverket. Om autentisering är avstängd kan alla som når port 8008 öppna ett root-skal utan fler frågor eller SSH-inloggningsuppgifter. Använd Secure Gateway (Tailscale) eller en HTTPS-proxy för extern åtkomst i stället för att öppna porten mot internet." + }, + "whereNext": { + "heading": "Nästa steg", + "items": [ + { + "label": "Åtkomst och autentisering", + "href": "/docs/monitor/access-auth", + "tail": " — exempel för omvänd proxy med de WebSocket-uppgraderingsrader som terminalen kräver." + }, + { + "label": "Arkitektur", + "href": "/docs/monitor/architecture", + "tail": " — WebSocket-transport (HTTP via flask-sock och HTTPS / WSS via gevent)." + }, + { + "label": "API-referens", + "href": "/docs/monitor/api", + "tail": " — WebSocket-slutpunkterna /ws/terminal och /ws/script/ tillsammans med resten av API:et." + }, + { + "label": "Integrationer → Secure Gateway", + "href": "/docs/monitor/integrations", + "tail": " — när du vill ha terminal åtkomst utanför LAN utan att exponera port 8008." + }, + { + "label": "Översiktsindex", + "href": "/docs/monitor/dashboard", + "tail": " — de andra flikarna." + } + ] + } +} diff --git a/web/messages/sv/docs/monitor/dashboard/vms-lxcs-app.json b/web/messages/sv/docs/monitor/dashboard/vms-lxcs-app.json new file mode 100644 index 00000000..231913bf --- /dev/null +++ b/web/messages/sv/docs/monitor/dashboard/vms-lxcs-app.json @@ -0,0 +1,245 @@ +{ + "meta": { + "title": "LXC App-flik: upptäckt, länkar och versionsspårning | ProxMenux", + "description": "Upptäck och registrera LXC-program, skapa webblänkar och eventuellt spåra installerade och tillgängliga versioner." + }, + "header": { + "title": "LXC App-flik: upptäckt, länkar och versionsspårning", + "description": "Ge varje LXC-applikation en ihållande identitet, webbåtkomst och valfria versionsbevis utan att koppla registrering till uppdateringar." + }, + "intro": { + "p1": "Fliken App registrerar vilka appar som hör till en LXC. En post kan innehålla bara namn och webblänk eller även en detektor för installerad version och en uppströmskälla.", + "p2": "Förfarandet som ändrar programvara ställs in separat på fliken Uppdateringar. Att spara en app kör aldrig ett installations- eller uppdateringsprogram.", + "callout": "Registrering, versionsspårning och uppdatering är tre oberoende funktioner. Alla kan användas utan att kräva de andra två.", + "dashboardTitle": "Från registrering till Apps-startvyn", + "dashboard": "Varje sparad webblänk visas också som kort på den övergripande Apps-fliken. Den här LXC-sidan är fortfarande den centrala källan för namn, logotyp, länkar och versionsspårning." + }, + "overview": { + "heading": "Vad en appost kan innehålla", + "lead": "En sparad post kan innehålla:", + "items": [ + "Ett visningsnamn och en logotyp som anpassas till temat.", + "En eller flera klickbara webblänkar byggda från LXC-adressen, schemat och sparad port.", + "En valfri detektor för den version som för närvarande är installerad i LXC.", + "En valfri GitHub, HTTP JSON eller Docker Hub-källa för den senaste tillgängliga versionen.", + "Aviseringar om nya versioner och val för inkludering i uppdateringsräknaren per app.", + "En motsvarande sektion på fliken Uppdateringar, även när versionsspårning är inaktiverad." + ] + }, + "discovery": { + "heading": "Cachad upptäckt och Hitta appar", + "lead": "Appförslag ingår i cachen för varje LXC-dialogruta. Startsökningen förbereder dem i bakgrunden så att App-fliken genast kan visa sparade resultat.", + "items": [ + "Om du öppnar fliken App startar inte en ny katalogsökning och frågar inte LXC upprepade gånger.", + "Hitta appar kör uttryckligen en ny sökning för den LXC:n. Använd den efter att ny programvara installerats medan ProxMenux redan körs.", + "Den tidigare listan förblir synlig medan sökningen körs. Nya träffar läggs till när den är klar.", + "Om ingen ny träff hittas visas resultatet vid åtgärderna och Registrera app är fortfarande tillgängligt för manuell inmatning.", + "Spara, ta bort eller återställa en app uppdaterar samma cache omedelbart. Starta eller återställa en LXC uppdateringar bara den gästen genom sin befintliga livscykel händelse." + ], + "callout": "Ett förslag är ingen registrering. Det förblir skrivskyddat tills Registrera väljs och formuläret sparas." + }, + "registration": { + "heading": "Registrera en app", + "lead": "Ett upptäckt förslag och en manuell post använder samma redigerare:", + "steps": [ + "Välj Registrera på ett förslag eller Registrera app för att välja från katalogen eller ange ett eget namn.", + "Granska namnet och logotypen som föreslås av katalogen.", + "Lägg till nödvändiga webblänkar. Upptäckta lyssningsportar erbjuds som genvägar, men ingen sparas automatiskt.", + "Låt Spåra uppströmsversion vara avstängt för poster med enbart länkar, eller aktivera det och kontrollera detektorn för installerad version samt uppströmskällan.", + "Använd Testa detektor när spårning är aktiverad och spara sedan posten.", + "Välj Klar efter redigering. App- och Uppdateringar-flikarna återanvänder den uppdaterade cachade posten." + ] + }, + "catalog": { + "heading": "Katalogstödd registrering", + "lead": "Katalogen ger standardvärden men den sparade posten kan fortfarande redigeras.", + "items": [ + "Sökresultat kan fylla det kanoniska namnet, logotypen och vanliga webbportar.", + "Kända versionsdetektorer är baserade på riktiga paketnamn, binärer, filer, Python-distributioner, OCI-etiketter eller kommandon snarare än ett universellt /root/.app-antagande.", + "Verifierade korrigeringar för verkliga installationer har företräde när en sökväg skiljer sig från installationsprogrammets metadata.", + "Proxmox VE Helper-Scripts markörer som /root/.slug förblir en kompatibilitetssignal för nyare hjälparinstallationer, inte den enda detektorn.", + "Varje föreslaget värde kan redigeras innan du sparar för att täcka officiella installatörer och manuella installationer." + ] + }, + "docker": { + "heading": "Hur Docker LXC representeras", + "lead": "För en LXC vars primära plattform är Docker, är Docker programmet registrerat på LXC nivå.", + "items": [ + "En containeriserad arbetsbelastning som Portainer, Frigate eller Vaultwarden föreslås inte som en oberoende LXC-applikation.", + "Körande Docker-tjänster med publicerade TCP-portar erbjuds som valfria webblänkar i Docker-redigeraren.", + "Varje föreslagen länk visar tjänsten, värdporten och containerporten. Endast länkar som tillhandahåller ett webbgränssnitt bör sparas.", + "Dockers allmänna logotyp används om länken saknar en egen. En logotyp som ställs in per länk ersätter den.", + "Efter registrering visas uppdateringar av Docker Engine och avbildningar tillsammans i Docker-avsnittet på fliken Uppdateringar." + ], + "callout": "Denna struktur förhindrar en Docker arbetsbelastning från att se ut som programvara installerad direkt i LXC samtidigt bevara snabba länkar till dess gränssnitt." + }, + "webLinks": { + "heading": "Webblänkar och logotyper", + "lead": "Webblänkar fungerar med eller utan versionsspårning.", + "items": [ + "Varje länk sparar protokollschema, port, valfri beskrivning och valfri logotyp-URL.", + "Den visade webbadressen använder den aktuella adressen som redan upptäckts för LXC; adressen är inte duplicerad i varje apppost.", + "En länk utan sin egen logotyp faller tillbaka till app-nivå logotypen.", + "Flera länkar kan representera ett admingränssnitt, API, sekundär UI eller annan slutpunkt i samma app.", + "En sparad länk-bara app visas också på uppdateringar, där en anpassad uppdaterare kan konfigureras senare." + ] + }, + "tracking": { + "heading": "Valfri versionsspårning", + "lead": "Spårning kombinerar en installerad-version detektor med en valfri uppströmskälla. De två sidorna kontrolleras oberoende.", + "colMethod": "Metod för att upptäcka installerad version", + "colUse": "Användning", + "detectorRows": [ + { + "method": "dpkg / apk", + "use": "Läser den installerade paketversionen från Debian, Ubuntu eller Alpine paketmetadata." + }, + { + "method": "binary", + "use": "Kör en binärfil via absolut sökväg eller ett kommandonamn med versionsargument." + }, + { + "method": "file + regex", + "use": "Läser en riktig fil och extraherar versionen med en fångstgrupp." + }, + { + "method": "docker label / docker exec", + "use": "Läser en OCI-versionsetikett eller kör ett versionskommando i en Docker-container." + }, + { + "method": "python distribution", + "use": "Använder importlib.metadata via den valda Python-tolken." + }, + { + "method": "command", + "use": "Kör ett avancerat kommando i argv-format utan skal och extraherar versionen från dess utdata." + }, + { + "method": "manual", + "use": "Lagrar en version som anges manuellt; den måste ändras efter uppgradering av appen." + }, + { + "method": "OCI image", + "use": "För containrar installerade via OCI manager Apps. Läser app- och avbildningsversioner från installationsposten och jämför installerat digest med det som registret publicerar. Ingen konfigurering behövs." + } + ], + "sourcesHeading": "Källor för tillgänglig version", + "sources": [ + "GitHub-arkiv: senaste utgåva eller tagg från ett offentligt owner/name-arkiv.", + "HTTP JSON: en offentlig slutpunkt plus en prickad väg som data.version eller releases[0].tag_name.", + "Docker Hub: versionstaggar filtrerade med ett reguljärt uttryck. En förhandsvisning visar verkliga matchande taggar innan posten sparas.", + "Rörliga taggar som latest, stable eller lts innehåller ingen version. Spåra dessa avbildningar via digest i Docker-avbildningsuppdateringarna." + ], + "regexHeading": "Skriv fångstuttrycket", + "regexLead": "Det reguljära uttrycket måste returnera versionen i sin första fångstgrupp.", + "regexRules": [ + "Matcha texten som avges av den valda binära, fil, kommando eller tag källa; gissa inte en generisk väg.", + "Skriv bokstavliga punkter som \\. så att de inte matchar godtyckliga tecken.", + "Tillåt en ledande v endast när källan kan inkludera den.", + "Inkludera suffix som prerelease eller distro revideringar endast när de är meningsfulla för jämförelsen.", + "Använd Testa detektor innan du sparar och kontrollera att installerad version stämmer med LXC:n." + ], + "regexExampleLead": "Vanligt uttryck för att fånga en semantisk version:", + "regexExample": "v?(\\d+\\.\\d+\\.\\d+)", + "regexCallout": "En framgångsrik regex match är inte ett bevis på att detektorvägen är korrekt. Vägen eller paketet måste också finnas i den verkliga installationen som registreras." + }, + "updater": { + "heading": "Versionsspårning och uppdatering är oberoende", + "lead": "Fliken Uppdateringar skapar ett appavsnitt så snart en appost sparas.", + "items": [ + "En post med enbart länkar visar att versionsspårning inte är inställd men kan ändå få ett eget uppdateringskommando.", + "En app med spårning men utan en körbar metod visar ett neutralt meddelande som ber om ett anpassat kommando.", + "En app med ett verifierat Proxmox VE Helper-Scripts-omslagsskript kan använda det inbyggda uppdateringsprogrammet även om registreringen började med en webblänk.", + "Lägga till eller redigera en uppdaterare ändrar inte detektorn eller uppströmskällan lagrad på fliken App." + ] + }, + "states": { + "heading": "Versionsstatus på App-kortet", + "colState": "Tillstånd", + "colDisplay": "Visning", + "colMeaning": "Betydelse", + "rows": [ + { + "state": "Uppdatering tillgänglig", + "display": "Tillgänglig version i lila med en uppåtpil ikon", + "meaning": "De installerade och uppströms versionerna skiljer sig." + }, + { + "state": "Aktuell", + "display": "Installerade och senaste versioner utan lila varning", + "meaning": "Den sista kontrollen hittade ingen nyare uppströms version." + }, + { + "state": "Versionsspårning väntar", + "display": "Kontroll pågår eller väntar", + "meaning": "Posten är konfigurerad men båda kontrollerna har ännu inte slutförts." + }, + { + "state": "Versionsspårning avstängd", + "display": "Webblänkar endast; inget versionsjämförelseblock", + "meaning": "Posten förblir giltig och kan fortfarande ha ett uppdateringsprogram." + }, + { + "state": "Kontrollfel", + "display": "Förklaring i bärnstensfärg inuti kortet", + "meaning": "Det tidigare sparade tillståndet förblir synligt medan fel från detektorn eller uppströmskällan visas." + } + ] + }, + "management": { + "heading": "Hantera sparade och föreslagna appar", + "lead": "Åtgärderna längst ner på fliken har olika roller:", + "items": [ + "Hitta appar uppdaterar upptäckten enbart för denna LXC.", + "Registrera en annan app öppnar katalogen och den manuella redigeraren utan att söka igenom LXC:n på nytt.", + "Redigera visar Ta bort, Kontrollera, aviseringar och Redigera fält för varje kort.", + "Dölj tar bort ett oönskat förslag. Dolda upptäckter kan återställas från registreringsvyn.", + "Kontrollera uppdaterar den sparade appens versionsdata utan att söka efter nya appar." + ] + }, + "troubleshooting": { + "heading": "Vanliga situationer", + "colProblem": "Situation", + "colResolution": "Lösning", + "rows": [ + { + "problem": "Programvara installerades efter ProxMenux startade", + "resolution": "Välj Hitta appar. Den uttryckliga sökningen uppdaterar de cachade förslagen för LXC:n." + }, + { + "problem": "Ingen app upptäcktes", + "resolution": "Registrera det manuellt. Ett namn och en webblänk räcker; spårning kan läggas till senare." + }, + { + "problem": "Den föreslagna detektorn returnerar fel version", + "resolution": "Öppna redigeringsfält, välj det verkliga paketet, binär eller filvägen och testa detektorn innan du sparar." + }, + { + "problem": "En Docker arbetsbelastning erbjuds inte som en LXC app", + "resolution": "Registrera Docker och lägg till tjänstens publicerade gränssnitt som Docker-webblänk. Avbildningsuppdateringar finns kvar i Docker-avsnittet." + }, + { + "problem": "En sparad app har ingen uppdateringsknapp", + "resolution": "Öppna fliken Uppdateringar och konfigurera dess uppdateringsmetod. Enbart versionsspårning definierar inte hur en uppdatering installeras." + } + ] + }, + "figures": { + "catalog": { + "alt": "Appregistreringskatalog med sökresultat, logotyper, portar och detektorfält", + "caption": "Katalogmetadata accelererar registrering medan varje föreslaget värde förblir redigerbart." + }, + "webLinks": { + "alt": "Sparat LXC-appkort med en klickbar webblänk", + "caption": "En post med bara länkar är giltig: versionsspårning kan förbli avstängd och ett uppdateringsprogram kan läggas till separat." + }, + "tracking": { + "alt": "Valfri installerad-version detektor och uppströms källfält", + "caption": "Installerad versionsdetektering och uppströmskällan är konfigurerade och testade separat." + }, + "card": { + "alt": "Sparat applikationskort med installerade och tillgängliga versioner plus en webblänk", + "caption": "Kortet kombinerar identitet, versionsbevis och webbåtkomst utan att köra uppdateringsåtgärder från den här fliken." + } + } +} diff --git a/web/messages/sv/docs/monitor/dashboard/vms-lxcs-updates.json b/web/messages/sv/docs/monitor/dashboard/vms-lxcs-updates.json new file mode 100644 index 00000000..ce246940 --- /dev/null +++ b/web/messages/sv/docs/monitor/dashboard/vms-lxcs-updates.json @@ -0,0 +1,203 @@ +{ + "meta": { + "title": "LXC-uppdateringar: OS, appar och Docker | ProxMenux", + "description": "Konfigurera och köra uppdateringar av operativsystem, appar, Docker Engine och Docker-avbildningar i en LXC-container." + }, + "header": { + "title": "LXC-uppdateringar: OS, appar och Docker", + "description": "Granska varje uppdateringsmål på ett ställe, kör det självständigt eller kombinera utvalda mål i en kontrollerad bulk åtgärd." + }, + "intro": { + "p1": "Fliken Uppdateringar skiljer versionskontroll från installationen. Registrering och valfri versionsspårning finns på App-fliken; körbara uppdateringsmetoder hanteras här.", + "p2": "En sparad applikation visas i uppdateringar även när den endast innehåller en webblänk. Versionsspårning är frivillig, och en uppdaterare kan konfigureras oberoende.", + "callout": "Registrering väljer inget uppdateringsprogram. Om ett matchande Helper-Scripts-program upptäcks, välj och spara Helper-Scripts eller Eget kommando. Upptäckt garanterar inte kompatibilitet. Valet görs per app även om flera delar en LXC." + }, + "overview": { + "heading": "Vad fliken innehåller", + "lead": "Varje tillgängligt mål har sin egen sektion och handling:", + "items": [ + "OS-paket för Debian-, Ubuntu- och Alpine-containrar.", + "Ett avsnitt per registrerad app, även poster med enbart en länk.", + "En Docker sektion när Docker är registrerad, med Docker Engine och taggade avbildningar grupperade tillsammans.", + "Ett konfigurerbart avsnitt Gruppuppdatering följt av alternativ för säkerhetskopiering, omstart och schemaläggning." + ] + }, + "mechanisms": { + "heading": "Hur en uppdateringsmetod väljs", + "lead": "Den inbyggda vägen för Proxmox VE Helper-Scripts följer den officiella update-apps-mekanismen. Andra installationer använder rätt paket-, Docker- eller egen metod.", + "officialReference": "Officiell referens: Proxmox VE Helper-Scripts dokumentation för update-apps beskriver interaktiva och obevakade lägen, säkerhetskopior, provkörningar, tillfälliga byggresurser, loggar och slutkoder.", + "colSource": "Källa", + "colAction": "Visad åtgärd", + "colNotes": "Vad som körs", + "rows": [ + { + "source": "APT- eller APK-paket", + "action": "Applicera OS-uppdateringar", + "notes": "Uppdaterar containerpaketen. Registrerade appar installerade som dpkg eller apk-paket täcks av samma pass." + }, + { + "source": "Proxmox VE Helper-Scripts", + "action": "Tillämpa uppdatering", + "notes": "Efter ett uttryckligt val av Helper-Scripts körs det officiella appskript som identifieras via det validerade /usr/bin/update-omslagsskriptet. En markör eller katalogträff räcker aldrig för att tillåta körning." + }, + { + "source": "Eget kommando", + "action": "Kör uppdateringsprogrammet", + "notes": "Kör det sparade kommandot i LXC:n och ersätter postens eventuella inbyggda uppdateringsprogram." + }, + { + "source": "Docker Engine", + "action": "Uppdatera Docker Engine", + "notes": "Uppdaterar bara installerade Docker-paket och nödvändiga beroenden. Andra OS-paket och containrar ändras inte." + }, + { + "source": "Docker-avbildning", + "action": "Uppdatera avbild", + "notes": "Hämtar vald avbildning och återskapar dess Compose-tjänstegrupp eller skyddade fristående container." + } + ], + "callout": "Ett eget kommando ersätter Helper-Scripts för appen. Manuella, gruppvisa och schemalagda körningar följer det sparade valet. Befintliga kommandon och uttryckligen sparade äldre grupp- eller aktiva schemaval behålls; en nyregistrerad app väljs aldrig in av ett gammalt schema." + }, + "docker": { + "heading": "Docker Engine och Docker avbildningar", + "lead": "Efter registrering av Docker på App-fliken visas Docker Engine och avbildningsinventeringen i samma Docker-avsnitt.", + "items": [ + "Docker Engine-versionsspårning är separat från OS-paketräknaren och har en egen uppdateringsknapp.", + "Lokala avbildningar med taggar jämförs med registret via oföränderliga digest. Kontrollera nu uppdaterar inventeringen utan att hämta avbildningar eller starta om containrar.", + "Compose-tjänster uppdateras från sitt deklarerade projekt. Avbildningar i samma grupp hanteras tillsammans så att projektet inte återskapas upprepade gånger.", + "En fristående container återskapas från sin nuvarande konfiguration. Det skyddade flödet behåller återställningsdata och återställer den tidigare containern om återskapandet misslyckas.", + "Varje avbildning kan väljas separat vid manuella, gruppvisa och schemalagda uppdateringar, utom deklarerade Compose-beroenden som måste följa huvudtjänsten." + ], + "callout": "Docker-containrar visas inte som fristående LXC-appar. Publicerade webbportar kan sparas som länkar under Docker-registreringen, medan uppdateringar av avbildningar finns i Docker-avsnittet." + }, + "actions": { + "heading": "Individuella åtgärder och statusfärger", + "lead": "Varje avsnitt förblir oberoende genomförbart, oavsett om en bulkuppdatering är konfigurerad.", + "items": [ + "Konfigurera öppnar metodväljaren när ingen metod är vald; Redigera ändrar ett sparat val. Informationsknapparna förklarar alternativen, länkar till officiell dokumentation och visar ett exempel på eget skript. Att välja kör inte alternativet.", + "Utan versionsspårning men med ett uppdateringsprogram visas den neutrala åtgärden Kör uppdateringsprogram. ProxMenux hävdar inte att en uppdatering väntar.", + "Utan ett tillgängligt Helper-Scripts-program kan ett eget kommando anges. Att inaktivera en metod väljer inte tyst en annan; befintliga plan- och schemaval sparas och otillgängliga mål rapporteras.", + "Uppdatera avbildning gäller bara vald Docker-enhet; Docker Engine och orelaterade avbildningar uppdateras inte." + ], + "statusColState": "Känt tillstånd", + "statusColAppearance": "Utseende", + "statusColMeaning": "Betydelse", + "statusRows": [ + { + "state": "Verifierad uppdatering tillgänglig", + "appearance": "Lila text, uppåtpil ikon och lila handling", + "meaning": "Installerad och tillgänglig version, eller avbildningarnas digest, skiljer sig åt." + }, + { + "state": "Verifierat aktuellt", + "appearance": "Grön bock och grön åtgärd Uppdaterad", + "meaning": "Den senaste genomförda kontrollen bekräftar att målet är aktuellt." + }, + { + "state": "Version okänd", + "appearance": "Neutral text och neutral handling", + "meaning": "Uppdateringsprogrammet kan köras, men versionsdata saknas för att ange om målet är aktuellt eller har en väntande uppdatering." + } + ] + }, + "custom": { + "heading": "Anpassade uppdateringskommandon", + "lead": "Använd ett eget kommando när installationen saknar verifierat inbyggt uppdateringsprogram eller när det normala förfarandet måste ersättas.", + "items": [ + "Öppna Konfigurera när fältet är tomt eller Redigera när en metod redan finns.", + "För en inbyggd app eller Docker Engine visar redigeraren det aktuella kommandot. Annat sparat innehåll blir en uttrycklig ersättning för posten.", + "Testa hela proceduren i LXC-terminalen först. Det måste vara icke-interaktivt, använd rätt arbetskatalog och returnera en icke-noll exit status på misslyckande.", + "Ta inte med pct exec; ProxMenux går redan in i containern och kör kommandot som root." + ], + "exampleLead": "Exempel på ett komplett in-container-förfarande:", + "example": "cd /opt/my-app && ./update.sh", + "callout": "Ett kommando som myapp --version läser bara en version och är inget uppdateringsprogram. Kommandon körs med administratörsrättigheter; granska innehållet lika noga som ett root-skalkommando." + }, + "bulk": { + "heading": "Gruppuppdatering", + "lead": "Gruppuppdatering skapar en återanvändbar åtgärd för exakt valda mål i LXC:n. Den ligger efter app- och Docker-avsnitten och före Alternativ.", + "items": [ + "OS-paket är obligatoriska. Minst en ytterligare app, Docker Engine eller Docker-avbildningsenhet måste väljas.", + "Appar och Docker-enheter väljs individuellt. Huvudtjänsten i Compose visar vilka beroenden som följer med.", + "Otillgängliga eller borttagna mål markeras som inaktuella och måste tas bort innan inställningen kan sparas.", + "Tillämpa uppdateringar är lila om något mål har en verifierad uppdatering, grönt om alla är verifierat aktuella och neutralt om resultatet är okänt.", + "Ta bort bulkkonfigurationen tar inte bort enskilda uppdateringsmetoder eller schemalagda inställningar." + ], + "callout": "Bulk-uppdateringen ersätter inte de enskilda knapparna. Det är en valfri genväg för ett val som ska köras tillsammans." + }, + "options": { + "heading": "Alternativ för säkerhetskopiering och omstart", + "lead": "Samma alternativ gäller för manuella, bulk och schemalagda körningar:", + "items": [ + "Snapshot innan applicering skapar en vzdump backup på den valda lagringen. Om den nödvändiga säkerhetskopian misslyckas startar uppdateringen inte.", + "Starta om efter tillämpning startar bara om LXC:n efter en lyckad körning.", + "Urvalen lagras per LXC och förblir oberoende från mållistan." + ] + }, + "scheduled": { + "heading": "Schemalagda uppdateringar", + "lead": "Planerade uppdateringar använder samma körbara mål och säkerhetsalternativ som manuella åtgärder.", + "items": [ + "Välj en förinställd frekvens eller ett cron-uttryck och sedan exakta mål: OS-paket, appar, Docker Engine, fristående Docker-enheter eller Compose-tjänstegrupper.", + "Väntetid efter en release gäller bara valda appar med versionsspårning. Appar utan spårning kör sitt uppdateringsprogram varje gång schemat är förfallet.", + "Den senaste körningens status skiljer mellan lyckad, delvis slutförd, misslyckad, säkerhetspaus och inga väntande uppdateringar. Efter den första schemalagda körningen öppnar Uppdateringar → Schemalagda uppdateringar → Visa logg hela utdata från uppdateringsprogrammet och dess underskript.", + "Efter varje körning kontrollerar ProxMenux standarden Debian reboot-krävd markör. När en omstart behövs, säger fliken Uppdateringar och slutförandet meddelandet så; varningen rensas när LXC startar eller startar om.", + "På Proxmox värd lagras schemalagda loggar i /usr/local/share/proxmenux/logs/lxc-updates/ med namnet <VMID>-scheduled-<run-id>.log. De senaste tio loggar sparas per LXC och äldre filer tas bort automatiskt.", + "Den sparade historiken gäller schemalagda uppdateringar. En manuell uppdatering visar utdata direkt i Monitors körningsfönster och skapar ingen schemalagd logg i katalogen.", + "Externa värdscheman som upptäckts från Proxmox VE Helper-Scripts visas separat så överlappande automatisering är synlig." + ], + "callout": "Kör varje vald metod manuellt innan ett schema aktiveras. Schemalagda kommandon kan inte svara på interaktiva frågor." + }, + "completion": { + "heading": "Vad händer efter en uppdatering", + "lead": "Uppdateringen räknas inte som färdig enbart för att terminalkommandot avslutas.", + "items": [ + "Samma körning registrerar sitt slutresultat och uppdaterar OS-paketstatus, registrerade appversioner och Docker-inventering som tillämpligt.", + "Planerade körningar behåller sin terminalutgång och rapporterar om en omstart fortfarande krävs för att slutföra paketändringar.", + "LXC-cache ersätts med det verifierade post-update-tillståndet, så märken och knappar behåller inte det tidigare resultatet.", + "Om en stoppad eller restaurerad LXC startar, uppdaterar den befintliga livscykelhändelsen att LXC igen. Docker-inventeringen väntar på att daemonen ska bli redo istället för att cacha ett tomt startresultat som slutgiltigt.", + "Aktiverade aviseringar skickas från den slutförda körningen, inklusive partiella fel och grupperade resultat för Docker-avbildningar." + ] + }, + "troubleshooting": { + "heading": "Vanliga situationer", + "colProblem": "Situation", + "colResolution": "Lösning", + "rows": [ + { + "problem": "Ingen uppdateringsmetod har identifierats", + "resolution": "Öppen konfiguration, lägg till den officiella icke-interaktiva proceduren och testa den manuellt innan du schemalägger den." + }, + { + "problem": "En Proxmox VE Helper-Scripts-identitet visas men ingen handling existerar", + "resolution": "LXC:n har äldre identifieringsdata men inget verifierat /usr/bin/update-omslagsskript. Lägg till en egen metod först när rätt förfarande har bekräftats." + }, + { + "problem": "Docker avbildningar är tillfälligt tomma efter start eller återställning", + "resolution": "Vänta tills Docker är redo eller välj Kontrollera nu. Inventeringen försöker igen vid start och behandlar inte ett tillfälligt tomt resultat som slutgiltigt." + }, + { + "problem": "Ett sparat bulkmål är inte längre tillgängligt", + "resolution": "Redigera gruppinställningen, ta bort det inaktuella målet och välj dess nuvarande ersättare om den finns." + }, + { + "problem": "Ett anpassat kommando misslyckas", + "resolution": "Kör den i LXC-terminalen och granska dess väg, beroenden, icke-interaktiva flaggor och exitkod." + }, + { + "problem": "En schemalagd uppdatering säger att en omstart krävs", + "resolution": "Öppna Visa logg för att granska den slutförda körningen och starta sedan om den LXC:n. ProxMenux rensar varningen när livscykelhändelsen registrerar den nya starten." + } + ] + }, + "figures": { + "osPending": { + "alt": "OS-paket med antal väntande uppdateringar och säkerhetsuppdateringar", + "caption": "OS-avsnittet håller paketuppdateringar åtskilda från app- och Docker-åtgärder." + }, + "options": { + "alt": "LXC uppdateringsalternativ med pre-update backup och post-update omstart", + "caption": "Val för säkerhetskopiering och omstart gäller manuella, gruppvisa och schemalagda körningar." + } + } +} diff --git a/web/messages/sv/docs/monitor/dashboard/vms-lxcs.json b/web/messages/sv/docs/monitor/dashboard/vms-lxcs.json new file mode 100644 index 00000000..cf94d7ae --- /dev/null +++ b/web/messages/sv/docs/monitor/dashboard/vms-lxcs.json @@ -0,0 +1,244 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Översikt: VM och LXC | ProxMenux-dokumentation", + "description": "Inventering av gäster med CPU, minne och disk i realtid. Detaljerna visar konfiguration, resurser, säkerhetskopior, senaste Proxmox-loggresultat, anteckningar och Starta / Stäng av / Starta om / Tvinga stopp." + }, + "header": { + "title": "Översikt: VM och LXC", + "description": "Hela nodens gästinventering: fyra mätvärden överst, en sorterbar lista över VM och LXC samt gästdetaljer med konfiguration, resurser, säkerhetskopior, loggar och Starta / Stäng av / Starta om / Tvinga stopp.", + "section": "ProxMenux Monitor · Översikt" + }, + "intro": { + "title": "Kontroller för gäster", + "body": "Här styr du gästernas livscykel. Åtgärder går via POST /api/vms/<vmid>/control efter uttrycklig bekräftelse och uppdaterar gästens rad. Tvingad avstängning kräver den särskilda knappen Tvinga stopp." + }, + "topRow": { + "heading": "Övre raden: fyra statistikkort", + "intro": "Fyra kort sammanfattar gästernas tillstånd: antal, CPU-användning, tilldelat minne jämfört med värdens kapacitet och disktilldelning.", + "imageAlt": "VMs & LXCs-fliken - topprad på fyra statskort: Total VMs & LXCs, Total CPU, Total Memory, Total Disk", + "imageCaption": "Övre raden: totaler och Körs / Stoppade, aktuell CPU-användning, använt minne / tilldelat körande gäster / totalt tilldelat med Inom gränserna samt tilldelat diskutrymme.", + "headerCard": "Kort", + "headerWhat": "Vad det visar", + "totalLabel": "Totalt VM och LXC", + "totalWhat": "Totalräkning med två märken - X Running (grön) och Y Stopped (röd, endast när > 0). Numret du tittar på när något inte kom tillbaka efter en omstart.", + "cpuLabel": "Total CPU", + "cpuWhat": "Gästernas sammanlagda aktuella CPU-användning som andel av värdens fysiska CPU, med texten ”Tilldelad CPU-användning”.", + "memoryLabel": "Totalt minne", + "memoryIntro": "Tre avläsningar staplade vertikalt:", + "memoryItems": [ + "Används nu — huvudvärde, exempelvis 15.4 GB, och X.X % av Y GB av värdens RAM. Den blå stapeln visar procentandelen.", + "Tilldelat körande + Totalt tilldelat — summan av maxmem för körande gäster bredvid summan för alla, även stoppade. Den första gäller nu, den andra när allt startas samtidigt.", + "Inom gränserna är grönt och blir Överallokerat om total tilldelning överstiger värdens RAM. Kontrollerad överallokering kan fungera med KSM; märket varnar när marginalen minskar." + ], + "diskLabel": "Total disk", + "diskWhat": "Summan av tilldelat diskutrymme för alla gäster i GB eller TB med texten ”Tilldelat diskutrymme”." + }, + "inventory": { + "heading": "Lista över virtuella maskiner och containrar", + "intro": "En rad per gäst. Listan kommer från /api/vms, som sammanför qm list + pct list + pvesh /cluster/resources på värden.", + "imageAlt": "Virtual Machines & Containers lista - en rad per gäst med status, typmärke, namn, ID och inline CPU / minne / diskprocent", + "imageCaption": "Inventeringens mobilvy — samma data som datorvyn, omplacerade till en kolumn med kompakta procenttal och statusindikatorer.", + "rowsIntro": "Varje rad visar:", + "rows": [ + "Statusikon — grön uppspelningstriangel för körande eller röd fyrkant för stoppad. Resten av raden tonas ner för stoppade gäster.", + "Typ — LXC i cyan för containrar, VM i lila för virtuella maskiner.", + "Namn — gästens värdnamn eller visningsnamn.", + "VMID - Proxmox numeriska ID under namnet.", + "Inline metrics - tre procenttal med sin ikon (CPU%, Memory%, Disk%). Varje ikon vänder orange när metriska korsar en uppmärksamhet tröskel (t.ex. minne över 90%), så en snabb genomsökning berättar vilken gäst som är under tryck utan att öppna den." + ], + "clickHint": "Klicka på en rad för att öppna detaljerna, oavsett om gästen körs eller är stoppad.", + "mobileTitle": "Listan är utformad för mobila enheter", + "mobileBody": "På telefoner och i smala fönster staplas typ, namn, ID och tre procenttal i en kolumn som på bilden. Breda vyer fördelar samma data horisontellt. Hela raden kan tryckas för att öppna detaljerna." + }, + "drillIn": { + "heading": "Dialogruta med gästdetaljer", + "intro": "Dialogrutan visar namn, VMID, typ, tillstånd och drifttid. Flikarna anpassas till gästen: Status, App och Uppdateringar för LXC-appar, Monteringar när de finns, Loggar för OCI manager Apps-containrar, Säkerhetskopior och Brandvägg. Det fasta åtgärdsfältet ger livscykelkontroller och LXC-terminal från varje flik.", + "statusTitle": "Tab 1 - Status", + "statusImageAlt": "Gästdetaljer — Status med CPU, minne och disk i realtid, disk- och nätverks-I/O, OS-logotyp och Resurser / IP-adresser", + "statusImageCaption": "Status: CPU, minne och disk med staplar överst; total I/O (disk läst/skrivet, nätverk mottaget/skickat); sedan Resurser med Anteckningar, + Info och IP-adresslista.", + "statusIntro": "Standardfliken för att kontrollera gästens tillstånd. Tre block:", + "liveTitle": "1. Rad med aktuella mätvärden", + "liveItems": [ + "CPU-användning (X kärnor) — procentandel med stapel. Antalet inställda kärnor i rubriken förklarar vad 100 % motsvarar.", + "Minne — använt / maximalt i GB med stapel.", + "Disk — använt / maximalt för gästens primära diskavbildning i samma format." + ], + "ioTitle": "2. I/O totalt + OS logo", + "ioItems": [ + "Disk-I/O — total läsning (↓) och skrivning (↑) sedan start. Hjälper dig se en plötslig ökning av I/O jämfört med gästens normala nivå.", + "Nätverks-I/O — total nedladdning (↓) och uppladdning (↑), enligt samma princip.", + "OS-logotyp — Debian / Ubuntu / Alpine / Windows / etc. efter upptäckt system. Hjälper dig skilja öppna dialogrutor åt." + ], + "resourcesTitle": "3. Resursblock", + "resourcesIntro": "Konfiguration enligt Proxmox: CPU-kärnor, minne (inställt maxmem) och swap. Två utfällbara avsnitt i rubriken:", + "resourcesItems": [ + "Anteckningar — gästens redigerbara beskrivning. Spara anropar PUT /api/vms/<vmid>/config och skriver till /etc/pve/qemu-server/<vmid>.conf eller /etc/pve/lxc/<vmid>.conf.", + " + Info - extra fält som är för verbose för standardvyn: bios-läge, maskintyp, agenttillstånd, hostpci passthrough-poster, monteringspunkter (CT), startorder." + ], + "ipsTitle": "4. IP-adresser", + "ipsBody": "Varje IPv4- eller IPv6-adress visas i en grön etikett. Listan är tom för stoppade gäster eller VM utan QEMU-agent; LXC rapporterar adresser direkt.", + "appTitle": "Tab 2 - App (endast LXC)", + "appIntro": "Registrerar LXC-appar, sparar webblänkar och jämför valfritt versioner. Förslagen kommer från startcachen; Hitta appar gör om sökningen för denna LXC efter ny installation.", + "appLinkLead": "Se den", + "appLinkLabel": "den separata App-sidan", + "appLinkTail": "för cachad upptäckt, katalogstödd registrering, Docker webblänkar och versionsdetektorer.", + "updatesTitle": "Tab 3 - Uppdateringar (endast LXC)", + "updatesIntro": "OS-paket, appar, Docker Engine och Docker-avbildningar är separata mål. Varje mål kan köras enskilt eller väljas exakt för gruppvis eller schemalagd körning.", + "updatesLinkLead": "Se den", + "updatesLinkLabel": "Dedikerad uppdateringssida", + "updatesLinkTail": "för inbyggda och egna uppdateringsprogram, återskapande av Docker-containrar, gruppval, säkerhetsalternativ och schemaläggning.", + "mountsTitle": "Flik 4 — Monteringar (bara LXC, när de finns)", + "mountsImageAlt": "LXC-detaljer, Monteringar: PVE-volymer, bind-monteringar från värden eller PVE-lagring och NFS/CIFS monterade inne i CT:n. Varje kort visar typ, kapacitet, använda/totala byte, alternativ och status: grön fungerande, bärnsten skrivskyddad/avvikande, röd otillgänglig.", + "mountsImageCaption": "Monteringar visas bara för LXC med minst en monteringspunkt eller tillagd fjärrmontering. Utan monteringar visas ingen flik.", + "mountsIntro": "Proxmox visar monteringar inställda som mpX, men inte dem som läggs till inne i CT:n via mount.cifs, NFS med autofs med mera. Fliken förenar båda vyerna: inställda monteringar och dem som upptäcks i containern, med status och kapacitet när servern kan hämta den.", + "mountTypesTitle": "Typer av montering upptäckt", + "mountTypesItems": [ + "PVE-volym — Proxmox-hanterad lagring som ZFS-subvolym, katalog eller Ceph RBD. Kapaciteten kommer från PVE-statistik och motsvarar Proxmox visning.", + "Bind från PVE-lagring — mpX-post med sökväg på lagring som PVE känner till.", + "Bind från värden — mpX-post med valfri värdsökväg (/mnt/something). Kapaciteten hämtas med df för den sökvägen.", + "Montering tillagd i CT — finns bara i containerns monteringsnamnrymd, exempelvis NFS som CT:n själv monterar. Kapaciteten läses med pct exec <vmid> df; /proc/<pid>/root från värden ger inte fjärrmonteringens riktiga statistik." + ], + "mountStateTitle": "Statuspunkt och varningar per kort", + "mountStateItems": [ + " Grön — monteringen fungerar och är nåbar.", + " Bärnsten — inställd men inte monterad, skrivskyddad eller zombie-bindning. Källan har försvunnit på värden men CT:n ser den fortfarande som monterad, exempelvis efter urkopplad USB-disk eller umount på värden.", + " Röd — otillgänglig: kontrollen kan inte nå monteringen, exempelvis en NFS-export vars server är nere." + ], + "mountsCalloutTitle": "Ytterligare information jämfört med Proxmox", + "mountsCalloutBody": "Visar containerns läs- och skrivplatser med kapacitet. NFS-/CIFS-delningar monterade inne i CT:n, som Proxmox inte visar, får samma utseende och hälsokontroll. Otillgängliga fjärrmonteringar och zombie-bindningar flaggas innan de orsakar problem vid säkerhetskopiering.", + "logsTitle": "Flik 5 — Loggar (bara OCI-containrar)", + "logsBody": "Bara för containrar från OCI manager Apps. Visar huvudprocessens konsol från /var/log/proxmenux/oci/VMID.console.log: senaste 100, 500 eller 1000 raderna, liveföljning när containern körs, filter och nedladdning. Filen läses om vid öppning även när containern är stoppad. Mer: OCI-containrar i ProxMenux Monitor.", + "backupsTitle": "Flik 6 — Säkerhetskopior", + "backupsImageAlt": "Gästdetaljer — Säkerhetskopior med tillgängliga kopior, destinationer, storlekar och knappen Skapa säkerhetskopia", + "backupsImageCaption": "Alla kopior av gästen på konfigurerade Proxmox-lagringar, nyaste först. Rubriken visar antalet.", + "backupsIntro": "Listar gästens kopior på Proxmox-lagringar, nyaste först. Räknaren i rubriken visar om kopior finns. Varje rad visar:", + "backupsItems": [ + "Tidsstämpel — datum och tid för körningen.", + "Destination — lagring (PBS-Cloud, PBS-Local, NFS-Backup, …), färgad efter status.", + "Storlek — kopians slutliga storlek på disk." + ], + "backupsOutro": "+ Skapa säkerhetskopia startar en kopiering på lagringen markerad ”Backup target” i Proxmox. Återställning görs i Proxmox webbgränssnitt; Monitor visar gästens senaste kopior och kan skapa nya.", + "firewallTitle": "Tab 7 - Brandvägg", + "firewallIntro": "Läser gästens Proxmox-brandväggslogg direkt från värden utan extra tjänst eller periodiska hämtningar. Fliken finns alltid; innehållet beror på om brandväggen är aktiv och någon regel loggar paket.", + "firewallItems": [ + "Brandvägg avstängd — ett bärnstensfärgat meddelande visar var den aktiveras i Proxmox (<Container|VM> → Firewall → Options) och att en regel behöver log: info eller högre för att paket ska synas.", + "Brandvägg aktiv, inga händelser — den tomma vyn påminner om samma loggningskrav, användbart direkt efter aktivering.", + "Händelser finns — rullningsbar ruta med fast teckenbredd och råposter efter åtgärd: ACCEPT grön, REJECT orange, DROP röd. Räknaren i rubriken visar laddade poster." + ], + "firewallRefresh": "Uppdatera hämtar de senaste posterna på begäran. Ingen automatisk uppdatering sker; listan visar läget vid öppning eller senaste tryck. Källan är /var/log/pve-firewall.log, filtrerad efter VMID via GET /api/vms/<vmid>/firewall/log.", + "firewallCalloutTitle": "Varför har det här när Proxmox UI redan visar det?", + "firewallCalloutBody": "Slipper byte till Proxmox och håller vyn avgränsad till samma VMID: starta gästen, kontrollera monteringar och brandväggshändelser och stoppa den igen i panelen. Regler redigeras i Proxmox; Monitor ändrar dem inte.", + "actionBarTitle": "Åtgärdsfält längst ned", + "actionBarIntro": "Alltid synlig vid foten av modalen oavsett vilken flik är aktiv:", + "consoleItem": "Konsol, bara för körande LXC, öppnar pct enter <vmid> i containern. Den använder xterm.js och WebSocket som Terminalfliken, med ett mobilanpassat verktygsfält: ESC, TAB, pilar, Enter och Ctrl+C / Ctrl+X / Ctrl+R. Den fungerar på telefon och surfplatta. För VM använder du Proxmox noVNC-konsol.", + "lifecycleIntro": "Fyra knappar i ett 2×2-rutnät skickar POST /api/vms/<vmid>/control med motsvarande action. Tillgängligheten beror på gästens tillstånd.", + "headerButton": "Knapp", + "headerEnabled": "Aktiverad när", + "headerAction": "Åtgärder som skickas till värd", + "lifecycleRows": [ + { + "button": "Starta", + "color": "green", + "enabled": "Gästen är stoppad.", + "action": "qm start / pct start" + }, + { + "button": "Stäng av", + "color": "blue", + "enabled": "Gästen körs.", + "action": "qm shutdown / pct shutdown — ordnad avstängning, ACPI" + }, + { + "button": "Starta om", + "color": "blue", + "enabled": "Gästen körs.", + "action": "qm reboot / pct reboot — ordnad omstart" + }, + { + "button": "Tvinga stopp", + "color": "red", + "enabled": "Gästen körs.", + "action": "qm stop / pct stop — tvingad avstängning" + } + ], + "forceStopTitle": "Tvinga stopp avslutar körningen omedelbart", + "forceStopBody": "Tvinga stopp hoppar över avstängningen som att dra ur strömmen. Använd Stäng av när gästen svarar. Tvinga bara stopp om avstängningen har hängt sig och du accepterar risken för dataförlust. Röd färg och tydlig text motverkar feltryck." + }, + "dataCollected": { + "heading": "Hur data samlas in", + "headerSection": "Avsnitt av fliken", + "headerEndpoint": "Slutpunkt", + "headerSource": "Källa", + "rows": [ + { + "section": "Inventeringslista", + "endpoint": "/api/vms", + "source": "pvesh get /cluster/resources --type vm för VM och CT." + }, + { + "section": "Detaljpanel (konfig, nätverk, diskar)", + "endpoint": "/api/vms/", + "source": "qm config <id> för VM/pct config <id> för CT." + }, + { + "section": "Diagram med gästens mätvärden", + "endpoint": "/api/vms//metrics", + "source": "PVE RRD-data (pvesh get /nodes/<node>/qemu/<id>/rrddata) kondenserade till en diagramvänlig form." + }, + { + "section": "Senaste Proxmox-loggresultat", + "endpoint": "/api/vms//logs", + "source": "pvesh get /nodes/<node>/<qemu|lxc>/<vmid>/log --start 0 --limit 1000. Om kommandot misslyckas returneras en tom lista; detta ger inte fullständiga systemloggar inifrån gästen." + }, + { + "section": "Backups tillgängliga för gäst", + "endpoint": "/api/vms//backups", + "source": "pvesm list <storage> filtreras av VMID." + }, + { + "section": "Gästens brandväggslogg (Brandvägg-fliken)", + "endpoint": "/api/vms//firewall/log", + "source": "/var/log/pve-firewall.log filtreras av VMID." + }, + { + "section": "Strömknappar (Starta / Tvinga stopp / Starta om / Stäng av)", + "endpoint": "/api/vms//control", + "source": "qm start|stop|reboot|shutdown eller pct motsvarande." + } + ], + "codeComment1": "# Jämför översiktens data med PVE", + "codeComment2": "# Granska gästens konfiguration precis som i dialogrutan", + "codeComment3": "# VM", + "codeComment4": "# CT" + }, + "whereNext": { + "heading": "Nästa steg", + "items": [ + { + "label": "Hälsoövervakare", + "href": "/docs/monitor/health-monitor", + "tailRich": " — VMs & Containers kategori (misslyckad start, QMP timeouts, CT avstängningsfel)." + }, + { + "label": "Aviseringar", + "href": "/docs/monitor/notifications", + "tailRich": " - vad vm_*, ct_*, migration_* och backup_* händelser utlöser nedströms." + }, + { + "label": "API-referens", + "href": "/docs/monitor/api", + "tailRich": " — slutpunkterna för VM och säkerhetskopior." + }, + { + "label": "Översiktsindex", + "href": "/docs/monitor/dashboard", + "tailRich": " — de andra flikarna." + }, + { + "label": "ProxMenux → Skapa VM", + "href": "/docs/create-vm", + "tailRich": " — skapa system: NAS-mallar (Synology med flera), Linux-/Windows-VM och standardvärden anpassade för Proxmox." + } + ] + } +} diff --git a/web/messages/sv/docs/monitor/health-monitor.json b/web/messages/sv/docs/monitor/health-monitor.json new file mode 100644 index 00000000..0dfa93ce --- /dev/null +++ b/web/messages/sv/docs/monitor/health-monitor.json @@ -0,0 +1,372 @@ +{ + "meta": { + "title": "Proxmox hälsoövervakning — CPU, minne, lagring, SMART, ZFS, loggar | ProxMenux", + "description": "Proaktiv hälsoövervakning av Proxmox VE: tio kategorier var femte minut (CPU och temperatur, minne och swap, lagring, diskar/SMART, nätverk, virtuella maskiner, tjänster, loggar, uppdateringar och säkerhet), fyra allvarlighetsgrader, undertryckning per kategori, automatisk rensning av lösta fel, permanent diskhistorik och aviseringar via Telegram, Discord, Gotify eller e-post.", + "ogTitle": "Proxmox hälsoövervakning — CPU, minne, lagring, SMART, ZFS, loggar", + "ogDescription": "Proaktiv hälsoövervakning av Proxmox VE i tio kategorier med allvarlighetsgrader, undertryckningstider och händelsestyrda aviseringar.", + "twitterTitle": "Proxmox Health Monitor ProxMenux", + "twitterDescription": "Proaktiv hälsoövervakning av Proxmox VE i tio kategorier med allvarlighetsgrader och aviseringar." + }, + "header": { + "title": "Hälsoövervakare", + "description": "Den löpande självkontrollen granskar tio kategorier av värdens tillstånd i femminuterscykler, samlar mätvärden mellan cyklerna, slår samman dubbla fynd och förser översikten, aviseringarna och valfri AI-omskrivning med samma underlag.", + "section": "ProxMenux-övervakning" + }, + "intro": { + "title": "En skanner, tre konsumenter", + "body": "En bakgrundstråd kör hela hälsocykeln var femte minut och sparar varje fynd i SQLite under en stabil error_key. Då kan (1) översikten visa aktuellt tillstånd, (2) aviseringssystemet skicka nya händelser till valda kanaler och (3) den valfria AI-assistenten skriva om larm på begripligt språk. En inställning för kontrollen ger alla delar samma underlag." + }, + "howItWorks": { + "heading": "Hur det fungerar", + "intro": "Hälsoövervakningen använder två parallella trådar. En lätt mätvärdessamlare fyller historikbuffertar för CPU, minne och temperatur. Den fullständiga hälsocykeln läser buffertarna, bedömer ihållande tillstånd och kör övriga kontroller ungefär var femte minut. Sedan sparas fynden i SQLite för översikten och aviseringarna.", + "scannerTitle": "Från prov till lagrad upptäckt", + "scannerCaption": "Samlaren fyller buffertar mellan cyklerna: CPU var 5:e s, minne var 30:e s och temperatur var 15:e s. Den bedömer inte larm själv. Hela cykeln utvärderar buffertarna och kör tyngre kontroller av SMART, ZFS, loggar och tjänster innan fynden sparas i SQLite.", + "scannerArrowLabel": "steg", + "scannerNodes": { + "samplerLabel": "Mätvärdessamlare", + "samplerDetail": "CPU-belastning 5 s\nMinne 30 s\nTemperatur 15 s\n→ historikbuffertar", + "cycleLabel": "Full hälsocykel", + "cycleDetail": "Var 5:e min\nLäser buffertar\n+ aktuella kontroller\n(SMART, ZFS,\ntjänster, journal…)", + "checksLabel": "Per-kategori kontroller", + "checksDetail": "Tio kategorier\n(CPU, minne,\nlagring, diskar,\nnätverk, VMs,\ntjänster, loggar,\nuppdateringar, säkerhet)", + "sqliteLabel": "SQLite", + "sqliteDetail": "tabellen errors\n(aktiva +\nundertryckta)\n+ disk_observations\n(permanent historik\nper disk)" + }, + "notifTitle": "Från lagrad upptäckt till användare", + "notifCaption": "Aviseringsflödet. Samma feltabell används också av översikten med aktiva och avfärdade larm och av rensningen i slutet av varje cykel. Rensningen löser inaktuella poster automatiskt. Båda läser samma data utan att gå genom sändningsmodulen.", + "notifArrowLabel": "händelse", + "notifNodes": { + "errorsLabel": "fel tabell", + "errorsDetail": "Aktiva +\navfärdade rader\nmed nyckeln\nerror_key", + "dispatcherLabel": "Modul för aviseringssändning", + "dispatcherDetail": "Nya + förvärrade\nhändelser köas\nEnligt reglage\n+ spärrtid", + "templatesLabel": "Mallar + AI-omskrivning", + "templatesDetail": "Mall\nper händelse\n→ valfri AI-\nomskrivning till\nbegripligt språk", + "channelsLabel": "Kanaler", + "channelsDetail": "Telegram\nDiscord\nGotify\nE-post (SMTP)" + } + }, + "categories": { + "heading": "De tio kategorierna", + "imageAlt": "Hälsokontrollvy som visar de tio kategorierna med sina nuvarande statuser (CPU, minne, lagring, diskar, nätverk, VM, tjänster, loggar, uppdateringar, säkerhet)", + "imageCaption": "Hälsoövervakning - de tio kategorierna med sin nuvarande status. Kategorier på en hälsosam värd visar alla OK; varningar och kritiska händelser visas i linje med raderna som producerade dem.", + "intro": "Varje cykel kör tio oberoende kontroller. Varje kontroll ger ett av fyra tillstånd (OK, INFO, WARNING, CRITICAL) och strukturerade data, som enhetsnamn, loggutdrag och exakta trösklar. Uppgifterna visas i översikten och i aviseringen.", + "headerCategory": "Kategori", + "headerChecks": "Delkontroller", + "headerEvents": "Typiska händelser", + "rows": [ + { + "category": "CPU & Temperatur", + "checks": "CPU användning med hysteres, sensortemperatur", + "events": "Ihållande hög CPU-belastning; temperaturvarningar utifrån samlade sensorvärden." + }, + { + "category": "Minne och swap", + "checks": "RAM-användning, swap-användning", + "events": "Ihållande minnesbrist; aktivitet från OOM-killer; fullt swap-utrymme." + }, + { + "category": "Lagring", + "checks": "Proxmox-lagring, rotfilsystem", + "events": "Rotfilsystemet eller andra övervakade filsystem passerar inställda utrymmeströsklar (85% varning / 95% kritiskt som standard); NFS-export offline; misslyckad CIFS-autentisering; full LVM-thin-pool." + }, + { + "category": "Disker och SMART", + "checks": "SMART, dmesg I/O fel, ZFS pooler, LVM, filsystemfel", + "events": "Misslyckad SMART-kontroll; omallokerade eller väntande sektorer; ATA-I/O-fel; ZFS-pool DEGRADED / FAULTED; ext4 återmonterat skrivskyddat." + }, + { + "category": "Nätverk", + "checks": "Anslutning, länkstatus, gateway latens", + "events": "Brygga eller nätverksbond nere; gateway kan inte nås; återkommande latenstoppar." + }, + { + "category": "virtuella datorer och containrar", + "checks": "QMP-kommunikation, VM start, containerstart", + "events": "Misslyckad VM-start eller CT-avstängning; timeout för QMP-socket; konfiguration eller disk saknas efter kloning." + }, + { + "category": "PVE-tjänster", + "checks": "pveproxy, pvedaemon, pvestatd, pve-cluster, klusterläge", + "events": "Kraschad tjänst; förlorat klusterkvorum; pmxcfs har hängt sig." + }, + { + "category": "Systemloggar", + "checks": "Ihållande fel, felspikar, felkaskader, kritiska kärnmeddelanden", + "events": "Upprepade identiska fel; plötslig ökning av varningar (kaskadmönster); BUG: / OOPS: / oom-killer i dmesg." + }, + { + "category": "Systemuppdateringar", + "checks": "I väntan på uppdateringar, säkerhetsuppdateringar, kärna / PVE-version, systemålder", + "events": "Väntande säkerhetsuppdateringar eller uppdateringar av den kärna som används; system som inte uppdaterats på länge. Knappen Uppdatera nu visas i översiktens sidhuvud när uppdateringar finns. Den kör hela ProxMenux-flödet och uppdaterar hälsan med ?refresh=1 vid stängning utan att invänta nästa cykel." + }, + { + "category": "Säkerhet och certifikat", + "checks": "Inloggningsförsök, certifikat löper ut, valfri Fail2Ban jail status", + "events": "Upprepade misslyckade SSH- eller webbinloggningar; PVE-certifikat löper ut inom 30 dagar; aktiva Fail2Ban-blockeringar." + } + ] + }, + "severity": { + "heading": "Allvarlighetsgrader", + "headerStatus": "Status", + "headerColour": "Färg", + "headerMeaning": "Betydelse", + "headerNotification": "Avisering", + "rows": [ + { + "status": "OK", + "colour": "Grön", + "meaning": "Frisk. Inga resultat i denna kategori.", + "notification": "Tyst." + }, + { + "status": "INFO", + "colour": "Blå", + "meaning": "Övergående eller redan löst tillstånd värt att notera en gång. Används även för kategorier som endast har avvisade objekt kvar.", + "notification": "Valfritt. Varje händelsetyp kan slås på eller av per kanal." + }, + { + "status": "WARNING", + "colour": "Gul", + "meaning": "Uppmärksamhet behövs men värden är fortfarande funktionell. Orsaken är icke-trivial - läs detaljerna.", + "notification": "Skickas när händelsetypen är påslagen för kanalen." + }, + { + "status": "CRITICAL", + "colour": "Röd", + "meaning": "Funktionalitet bruten eller dataförlust möjlig. Åtgärder som krävs.", + "notification": "Skickas när händelsetypen är påslagen för kanalen. Ett CPU-temperaturlarm med CRITICAL utlöses av säkerhetsskäl igen även om det tidigare avfärdats." + } + ], + "infoNote": "En kategori med OK som har avfärdade händelser inom undertryckningstiden visas som INFO. Det påminner om att vissa larm är tystade.", + "unknownTitle": "UNKNOWN när en kontroll inte kan slutföras", + "unknownBody": "En otillgänglig kontroll ger UNKNOWN; efter tre sådana cykler i följd sparas ett bestående fynd. Översikten visar kontrollen i gult. Det övergripande tillståndet begränsar UNKNOWN till WARNING, så en otillgänglig kontroll ensam gör inte värden kritisk." + }, + "dashboardView": { + "heading": "Översiktsvyn", + "intro": "Hälsoövervakningen finns på fliken Översikt. Statusindikatorn i sidhuvudet (Frisk / Varning / Kritiskt) öppnar ett fönster med två listor:", + "items": [ + "Aktiva — kategorier med olösta fynd. Varje rad kan öppnas för att visa berörda delkontroller, originaltexten i reason, enhetens eller VM:ens ID och vid behov länkar till Lagring, Nätverk, VM, Loggar eller Hårdvara.", + "Avfärdade — poster som användaren kvitterat och vars undertryckningstid fortfarande löper. Varje rad visar återstående tid och vald längd. När tiden löper ut lämnar posten listan; om orsaken finns kvar och kategorin stöder det återkommer den under Aktiva." + ], + "pillTitle": "Indikatorn följer den allvarligaste kategorin", + "pillBody": "Sidhuvudets färg följer högsta allvarlighetsgrad: CRITICAL → rött, annars WARNING → gult, annars INFO → blått, annars grönt. Samma logik styr punkten i faviconen och PWA-märket.", + "updateNowTitle": "Uppdatera nu knappen i Översiktsrubriken", + "updateNowBody1": "När Systemuppdateringar visar väntande uppdateringar visas Uppdatera nu bredvid statusindikatorn. Fönstret kör samma värdflöde som ProxMenux → Settings post-install Proxmox → Proxmox System Update: rensning av paketkällor, apt full-upgrade via update-pve-safe.sh, DKMS-ombyggnad av hanterade drivrutiner vid ny kärna, autoremove/autoclean och fråga om omstart när kärnan ändrats. Förloppet visas löpande.", + "updateNowBody2": "När körningen är klar anropar stängningen GET /api/health/details?refresh=1 och ogiltigförklarar endpointens cache. Väntande uppdateringar och allvarlighetsgrad räknas om från det nya paketläget, så märket försvinner utan att invänta nästa cykel. På en uppdaterad värd är knappen dold." + }, + "dismiss": { + "heading": "Avfärda larm och ange undertryckningstid", + "intro": "Vissa händelser kvarstår, som Systemuppdateringar: uppdateringar tillgängliga tills värden uppdaterats. En avisering var femte minut behövs inte. Knappen Uppdatera nu i översikten löser just det fallet direkt. För andra fall eller uppskjutna uppdateringar finns två sammankopplade sätt att tysta larm:", + "step1": "Avfärda en enskild händelse i fönstret. Menyn erbjuder 24 timmar, 7 dagar eller Permanent, oberoende av kategorins standard. Valet skickar POST /api/health/acknowledge med error_key och valda suppression_hours (-1 för permanent). Händelsen flyttas till Avfärdade med tidsstämpeln acknowledged_at.", + "dropdownImageAlt": "Meny för att avfärda ett larm: 24 timmar, 7 dagar eller permanent", + "dropdownImageCaption": "Vald tid gäller bara detta larm; utan enskilt val används kategorins standard. Permanent avfärdade larm har ett bärnstensfärgat märke Permanent och utlöses normalt inte igen. Undantaget för kritisk CPU-temperatur beskrivs nedan.", + "step2": "Undertryckningstid per kategori. Under Inställningar → Hälsoövervakning eller via POST /api/health/settings har var och en av de tio kategorierna en standardtid som används utan enskilt val:", + "imageAlt": "Undertryckningstid per kategori under Inställningar → Hälsoövervakning", + "imageCaption": "En meny per kategori. Välj längre tid för återkommande händelser som väntande uppdateringar och kortare för sådant som bör bedömas igen snart. Aktiva undertryckningar visas nedanför.", + "outro": "Under undertryckningen fortsätter kontrollen och uppdaterar last_seen utan ny avisering. Efteråt bedömer nästa cykel orsaken igen: larmet kan utlösas på nytt eller tas bort om problemet har lösts.", + "activeSuppressionsTitle": "Granska och återkalla avfärdanden — Aktiva undertryckningar", + "activeSuppressionsBody": "Alla tillfälligt eller permanent tystade larm finns under Inställningar → Hälsoövervakning → Aktiva undertryckningar. Varje rad visar ID, kategori, allvarlighetsgrad, kvitteringstid och återstående tid. Återaktivera tar bort kvitteringen inför nästa kontroll. Permanenta avfärdanden återkallas här; tillfälliga kan också avslutas tidigt. Slå på Redigera, välj rader (grön kant och överstruken text) och spara. Avbryt tömmer urvalet.", + "autoTitle": "Automatisk undertryckning när tiden ändras", + "autoBody": "En annan tid än standardens 24 timmar får en andra effekt: nya fynd i kategorin sparas redan kvitterade. En vecka vald för diskhändelser gäller då även nya fynd utan att varje larm behöver avfärdas. De visas direkt bland avfärdade med vald tid kvar. Kategorier med 24 timmar fungerar som vanligt: nya fynd är aktiva tills du agerar.", + "tempTitle": "Undantag för CPU-temperatur CRITICAL", + "tempBody": "Lagringslagret har en särskild regel för CPU-temperatur CRITICAL: en sådan post går förbi tidigare kvittering och automatisk undertryckning. Det betyder inte att varje temperaturkontroll skapar en kritisk post när en inställd kritisk gräns passeras.", + "nonDismissableTitle": "Vilka fynd kan avfärdas?", + "nonDismissableBody": "Fönstret visar Avfärda bara när kontrollen uttryckligen ger dismissable = true. Falskt eller saknat värde döljer knappen. Allvarlighetsgraden ensam avgör inte detta: flera kritiska kontroller tillåter kvittering. Exemplen beskriver aktuella data; att tysta ett larm löser inte orsaken.", + "headerFinding": "Fynd", + "headerWhy": "Beteende vid avfärdande", + "rows": [ + { + "finding": "CPU-temperatur: varning / kritiskt", + "why": "Temperaturvarningen från samlade mätvärden tillåter uttryckligen avfärdande. En separat regel kringgår kvittering om en CPU-temperaturpost med CRITICAL tas emot." + }, + { + "finding": "Kritiskt utrymmesläge på rotfilsystemet", + "why": "Kontroller av filsystemsutrymme tillåter uttryckligen avfärdande även vid kritisk användning. Kvittering frigör inte utrymme och tar inte bort risken för misslyckade skrivningar." + }, + { + "finding": "ZFS pool DEGRADED / FAULTED", + "why": "ZFS-poolernas kapacitetskontroller tillåter uttryckligen avfärdande. Andra poolfynd följer sin egen flagga. Kvittering reparerar inte en degraderad eller felaktig pool." + }, + { + "finding": "Disk-I/O-fel med SMART FAILED", + "why": "Sparade diskfynd från journalen kan tillåta avfärdande. SMART FAILED behöver fortfarande undersökas; knappen beror på kontrollens flagga och inte bara larmtexten." + }, + { + "finding": "Nätverksgränssnitt DOWN", + "why": "Sparade kontroller av gränssnitt med DOWN tillåter uttryckligen avfärdande. Det återställer varken brygga, nätverksbond, fysisk länk eller fjärråtkomst." + }, + { + "finding": "I/O-händelser på sunda diskar (INFO)", + "why": "Tillfälliga ATA- eller dmesg-händelser med frisk SMART kan vara informativa och lösas automatiskt. Informationsrader behöver inte ha en avfärdandeknapp; kontrollen avgör när tillståndet är löst." + } + ], + "principle": "Använd knappen som visas för det aktuella fyndet utan att dra slutsatser från kategori eller allvarlighetsgrad. Kvittering styr visning och aviseringar. Återhämtningskontroller och diskhistorik är separata." + }, + "autoresolve": { + "heading": "Automatisk lösning och rensning", + "intro": "Många larm ska försvinna när orsaken upphör: en VM startar igen, en disk har tagits bort eller temperaturen är normal. Rensningen i slutet av varje femminuterscykel använder dessa regler:", + "headerTrigger": "Utlösare", + "headerAction": "Handling", + "rows": [ + { + "trigger": "CPU-belastning eller temperatur tillbaka på normal nivå.", + "action": "Markeras som löst och tas bort från listan Aktiva." + }, + { + "trigger": "Minnestryck tillbaka under varningströskeln efter en OOM / minnesvarning.", + "action": "Markeras som löst." + }, + { + "trigger": "VM / CT som refereras av felet inte längre finns (qm status / pct status icke-noll).", + "action": "Markeras som löst eftersom resursen tagits bort." + }, + { + "trigger": "Disk som refereras av felet inte längre finns i /dev/.", + "action": "Markeras som löst eftersom enheten tagits bort. Diskens observationshistorik bevaras." + }, + { + "trigger": "Fynd från systemjournalen (kategorin logs, SMART-poster, ATA- eller I/O-fel) när undertryckningstiden löper ut.", + "action": "Tas bort. Varje kontroll granskar nya journalposter från den punkten; samma gamla rad skickas inte ut igen." + }, + { + "trigger": "Lösta fel äldre än sju dagar.", + "action": "Tas bort från databasen för att hålla tabellen liten. Aviseringshistoriken är separat och sparas längre." + } + ], + "permanentTitle": "Permanent undertryckning betyder inte löst", + "permanentBody": "Kategoritiden -1 (permanent) tystar kommande larm för avfärdade poster men hoppar inte över kontrollen för automatisk lösning. Om orsaken försvinner, till exempel när resursen tas bort eller tröskeln inte längre överskrids, rensas posten ändå automatiskt." + }, + "observations": { + "heading": "Diskobservationer – den permanenta historien", + "intro": "Diskhändelser bör bevaras. En SMART-varning på /dev/sdh klockan 02:14 är fortfarande relevant när I/O-störningen lagt sig och felet lösts automatiskt: disken har nu en historik. Därför har övervakningen en separat permanent tabell: disk_observations.", + "headerProperty": "Egenskap", + "headerErrors": "Tabellen errors (Aktiva)", + "headerObs": "Tabellen disk_observations", + "rows": [ + { + "property": "Syfte", + "errors": "Ger underlag till aktuell hälsovy och aviseringssändning.", + "obs": "Permanent granskningshistorik per disk." + }, + { + "property": "Automatisk lösning", + "errors": "Ja - rader rensas när tillståndet försvinner.", + "obs": "Nej - poster kvarstår för alltid om inte användaren uttryckligen avfärdar dem." + }, + { + "property": "Nyckel för deduplicering", + "errors": "error_key (till exempel smart_sdh).", + "obs": "(disk_registry_id, error_type, error_signature) med stabila signaturer där föränderliga data har tagits bort." + }, + { + "property": "Var det visas", + "errors": "Hälsoövervakningens fönster (listorna Aktiva / Avfärdade).", + "obs": "Diskens detaljkort på fliken Lagring, med märket ”X obs.” per disk." + }, + { + "property": "Vad den registrerar", + "errors": "Vad som för närvarande misslyckas.", + "obs": "SMART-varningar (sektorer, temperatur, CRC, misslyckade självtester), I/O-fel (ATA / NVMe / dm), filsystemfel och ZFS-poolhändelser." + } + ], + "outro": "Ett larm kan försvinna från översikten medan incidenten finns kvar i diskhistoriken. Öppna disken under Lagring: kortet visar antalet kvarstående observationer med tidsstämplar, allvarlighetsgrad och ursprungligt råmeddelande. Det hjälper när du bedömer om disken behöver bytas.", + "renameTitle": "Ändrade enhetsnamn slås samman automatiskt", + "renameBody": "Diskar kan först visas med tillfälliga namn som ata8 eller nvme0n1p3. Observationer samlas efter känt serienummer: om en händelse först registreras som ata8 och samma disk senare identifieras som sdh, kopplas de gamla observationerna till sdh nästa cykel. Historiken hålls samlad." + }, + "notification": { + "heading": "Från ett fynd till ett meddelande", + "intro": "Varje aktivt fel kan också ge en avisering. Flödet:", + "items": [ + "Kontrollen sparar fyndet med kategori, allvarlighetsgrad och strukturerade uppgifter.", + "Om händelsetypen är påslagen i de globala aviseringarna och kanalen inte tystat kategorin läggs händelsen i kö.", + "Mallmotorn skapar titel och meddelandetext från strukturerade data. Om AI-omskrivning är påslagen skickas paret också till vald leverantör för en version på begripligt språk.", + "Kanalen skickar ett Telegram-meddelande, ett Discord-embed, en Gotify-push eller e-post. Resultatet sparas i notification_history.", + "Att avfärda larmet startar undertryckningstiden. Nya upptäckter av samma error_key ger normalt ingen avisering under tiden och köas inte automatiskt för leverans när den tar slut. Undantaget för kritisk CPU-temperatur kvarstår." + ], + "outro": "Kanalinställningar — Telegram-bottoken, webhook-URL:er, AI-nycklar, händelsereglage och kanalanpassningar — beskrivs i Aviseringar och AI-assistent." + }, + "rest": { + "heading": "REST-slutpunkter", + "intro": "Fönstrets åtgärder kan anropas via API för skript, översikter och botar. Med Monitors autentisering påslagen behövs en giltig Bearer-token från inloggning eller API-tokenskärmen. Ändringar som kvittering, sparande eller rensning av övergivna fel kräver full_admin; read_only får 403. Med autentisering avstängd eller avböjd tillåter dessa kontroller åtkomst utan token.", + "headerEndpoint": "Slutpunkt", + "headerMethod": "Metod", + "headerUse": "Användning", + "rows": [ + { + "endpoint": "/api/health", + "method": "GET", + "use": "Lätt kontroll som ger JSON med status, timestamp och version. Passar Uptime Kumas nyckelordskontroller; när Monitors autentisering är påslagen måste klienten skicka en Bearer-header." + }, + { + "endpoint": "/api/health/status", + "method": "GET", + "use": "Övergripande tillstånd med en allvarlighetsgrad och en sammanfattning. Kräver autentisering." + }, + { + "endpoint": "/api/health/details", + "method": "GET", + "use": "Alla tio kategorier med respektive tillstånd och de strukturerade data som låg till grund för dem." + }, + { + "endpoint": "/api/health/full", + "method": "GET", + "use": "Fullständig bild: kategorier, aktiva och avfärdade fel samt egna undertryckningsinställningar. Fyller fönstret med ett anrop och använder en sexminuters bakgrundscache för snabba svar." + }, + { + "endpoint": "/api/health/active-errors", + "method": "GET", + "use": "Bara den aktiva listan. Filterbar av ?category=<name>." + }, + { + "endpoint": "/api/health/dismissed", + "method": "GET", + "use": "Bara listan Avfärdade, med återstående timmar." + }, + { + "endpoint": "/api/health/acknowledge", + "method": "POST", + "use": "Meddelandekropp: '{'\"error_key\":\"smart_sdh\"'}'. Avfärda ett larm under kategorins inställda tid." + }, + { + "endpoint": "/api/health/settings", + "method": "GET / POST", + "use": "Läs eller spara undertryckningstid per kategori." + }, + { + "endpoint": "/api/health/cleanup-orphans", + "method": "POST", + "use": "Manuell rensning av fel vars underliggande enhet / VM är borta. Idempotent." + } + ], + "codeComment1": "# Hämta aktuellt hälsotillstånd för ett skript", + "codeComment2": "# Avfärda ett specifikt fel", + "codeComment3": "# Ställ in diskkategoriundertryckning till en vecka" + }, + "whereNext": { + "heading": "Gå vidare", + "items": [ + { + "label": "Översikt", + "href": "/docs/monitor/dashboard", + "tail": " — här öppnas hälsoövervakningens fönster i gränssnittet." + }, + { + "label": "Aviseringar", + "href": "/docs/monitor/notifications", + "tail": " — kanaler, händelsereglage, AI-omskrivning och historik." + }, + { + "label": "AI-assistent", + "href": "/docs/monitor/ai-assistant", + "tail": " — leverantör (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter), promptläge, detaljnivå per kanal och språk." + }, + { + "label": "Arkitektur", + "href": "/docs/monitor/architecture", + "tailRich": " — SQLite-schema (errors, disk_observations, events) och bakgrundstrådarnas intervall." + } + ] + } +} diff --git a/web/messages/sv/docs/monitor/index.json b/web/messages/sv/docs/monitor/index.json new file mode 100644 index 00000000..4e35572e --- /dev/null +++ b/web/messages/sv/docs/monitor/index.json @@ -0,0 +1,151 @@ +{ + "meta": { + "title": "ProxMenux Monitor — Egenhostad webbinstrumentpanel för Proxmox VE | ProxMenux", + "description": "ProxMenux Monitor är en egenhostad webbinstrumentpanel för Proxmox VE: värdmätvärden i realtid, lagring och SMART-data, nätverk, VM:ar och containrar, hårdvara, loggar, webbterminal, proaktiv Health Monitor, aviseringar till Telegram / Discord / e-post, valfri AI-assistent, REST API och integrationer med Homepage och Home Assistant.", + "ogTitle": "ProxMenux Monitor — Egenhostad webbinstrumentpanel för Proxmox VE", + "ogDescription": "Instrumentpanel i realtid Proxmox VE: värdmätningar, lagring SMART, nätverk, virtuella datorer och containrar, hårdvara, loggar, webbterminal, Health Monitor, aviseringar, AI-assistent, REST API.", + "twitterTitle": "ProxMenux Monitor | ProxMenux", + "twitterDescription": "Självvärd Proxmox VE instrumentpanel med Health Monitor, aviseringar, AI-assistent och REST API." + }, + "header": { + "title": "ProxMenux Monitor", + "description": "En egenhostad webbinstrumentpanel för Proxmox VE som levereras som AppImage. Körs som en enda systemd-tjänst på värden, lyssnar på TCP-port 8008 och serverar API och gränssnitt från samma process.", + "section": "ProxMenux Monitor" + }, + "atGlance": { + "title": "En överblick", + "body": "Enda AppImage på Proxmox-värden → Flask backend (port 8008) samlar livedata via psutil, pvesh, smartctl, journalctl → Next.js instrumentpanelen serveras från samma process. Valfri autentisering (lösenord + 2FA), valfri AI-assistent, valfria aviseringar, REST API för integrationer." + }, + "hero": { + "alt": "ProxMenux Monitor instrumentpanel — systemöversiktsskärm med CPU, minne, temperatur och drifttid widgets", + "caption": "Standard landningsskärm – mätvärden på värdnivå och hälsotillstånd i en överblick." + }, + "coverage": { + "heading": "Vad instrumentpanelen täcker", + "intro": "Åtta förstklassiga sektioner, var och en med sina egna API slutpunkter:", + "tableSection": "Avsnitt", + "tableWhat": "Vad den visar", + "sections": [ + { + "name": "Hälsoövervakare", + "description": "Aktiva och avvisade varningar över CPU, minne, lagring, diskar, nätverk, tjänster, loggar, virtuella datorer, uppdateringar och säkerhet. Driver meddelandemotorn." + }, + { + "name": "Lagring", + "description": "Proxmox lagringspooler, fysiska diskar (SATA / NVMe / USB), SMART-attribut, ZFS-poolstatus, slitage och livslängd samt I/O-aktivitet." + }, + { + "name": "Nätverk", + "description": "Alla gränssnitt (fysiska, bond-gränssnitt, bryggor, OVS), IP/MAC/status, RX/TX-grafer i realtid och historiska RRD-data per gränssnitt." + }, + { + "name": "VM och containrar", + "description": "VM-/LXC-inventering med status, resurser och drifttid. Detaljer visar konfiguration, historiska mätvärden, Proxmox-logghämtning och start/stopp/omstart/avstängning. Loggar beror på Proxmox-endpointen; det är inget komplett gäst-OS-loggarkiv." + }, + { + "name": "Hårdvara", + "description": "CPU modell och topologi, minneslayout, PCIe-enheter, GPU lista med drivrutiner och realtidsövervakning per slot (NVIDIA / Intel iGPU)." + }, + { + "name": "Loggar och händelser", + "description": "Live journalctl med filter för allvarlighetsgrad / tidsintervall / sökord, Proxmox-uppgiftshistorik, aviseringslogg, nedladdningsbara loggpaket." + }, + { + "name": "Terminal", + "description": "Värdskal och konsolåtkomst till VM/CT som stöds i webbläsaren via xterm.js och WebSockets. Följer valt autentiseringsläge: om autentisering är avstängd eller avböjd kan klienter med nätåtkomst öppna en session utan inloggning. Det innebär ingen granskning av varje kommando." + }, + { + "name": "Säkerhet", + "description": "Misslyckade autentiseringar, status för Fail2Ban-jails, nyligen blockerade IP-adresser och integration med värdens jail [proxmenux]." + } + ], + "footer": "Varje avsnitt har en egen dokumentationssida under Instrumentpanel i sidofältet." + }, + "howItRuns": { + "heading": "Hur det fungerar", + "intro": "ProxMenux Monitor distribueras som en fristående AppImage. En enda systemd-enhet (proxmenux-monitor.service) startar en Flask-process som:", + "bullets": [ + "Lyssnar på TCP 8008 på värden (HTTP).", + "Betjänar instrumentpanelen Next.js som statiska tillgångar under / och API under /api/* från samma process.", + "Hämtar livedata med standardvärdverktyg: psutil, pvesh, smartctl, journalctl, zpool, ip, nvidia-smi, etc.", + "Sparar tillstånd i en lokal SQLite-databas (/usr/local/share/proxmenux/health_monitor.db): avvisade varningar, diskobservationer, aviserings- och AI-konfiguration. Autentiseringstillstånd lagras separat i /root/.config/proxmenux-monitor/auth.json." + ], + "footer": "Det fullständiga förfrågningsflödet, fillayouten och systemd-integrationen beskrivs i Arkitektur." + }, + "noAgent": { + "title": "Ingen agent på gästerna", + "body": "Monitor läser alla data från värden. Ingen agent behöver installeras i VM:ar eller CT:er: uppgifterna kommer från Proxmox API och från värdens kärna, som har insyn i de gästsystem som körs." + }, + "access": { + "heading": "Åtkomst till instrumentpanelen", + "intro": "Två åtkomstmönster stöds och applikationen upptäcker vilket som används:", + "codeComment1": "# 1) Direktåtkomst på värden", + "codeComment2": "# 2) Via omvänd proxy (Nginx / Caddy / Traefik)", + "afterCode": "En omvänd proxy bör sätta X-Forwarded-For, X-Forwarded-Proto och X-Forwarded-Host korrekt och vidarebefordra WebSocket-uppgraderingar. På standardportar använder webbläsaren aktuellt ursprung. Backend litar på vidarebefordrade IP-adresser bara med uttryckligt PROXMENUX_TRUST_PROXY=1; begränsa då direktåtkomst till backend.", + "footer": "Första-lanseringsinställningar, lösenord + TOTP 2FA och omvänd proxy-kodavsnitt täcks av Åtkomst och autentisering." + }, + "mobile": { + "heading": "Mobilanvändning och startskärmsinstallation", + "intro": "Instrumentpanelen anpassas till skärmen och levereras som progressiv webbapp. public/manifest.json anger display: standalone, appnamn, ikon och temafärg. En genväg på startskärmen öppnar därför appen fristående utan adressfält, med anpassad startbild och mörkt tema som matchar panelen.", + "phoneAlt": "ProxMenux Monitor körs på en telefon – huvudvyn på instrumentpanelen", + "phoneCaption": "Huvudinstrumentpanel på en telefon – layouten ändras för små visningsportar.", + "addHeading": "Lägg till på startskärmen", + "iosLabel": "iOS Safari:", + "iosBody": "delningsknapp → Lägg till på startskärmen. Ikonen kommer från /apple-touch-icon.png som levereras i AppImage.", + "androidLabel": "Android Chrome / Edge:", + "androidBody": "meny med tre punkter → Installera appen (eller Lägg till på startskärmen på äldre versioner).", + "afterInstall": "När den har installerats, öppnar ikonen instrumentpanelen i fristående läge med sin egen uppgiftsväxlarpost.", + "onlineOnlyTitle": "Kräver nätverksanslutning", + "onlineOnlyBody": "PWA:n kan installeras men fungerar inte offline, eftersom den saknar en service worker. Genvägen beter sig som en vanlig app, men enheten måste fortfarande kunna nå värden på TCP 8008 via LAN, VPN eller HTTPS genom en omvänd proxy för att läsa in instrumentpanelen." + }, + "health": { + "heading": "Hälsoövervakaren och meddelanden", + "alt": "Hälsoövervakningsskärm som visar spårade 10 kategorier (CPU, minne, lagring, diskar, nätverk, tjänster, loggar, virtuella datorer, uppdateringar, säkerhet) med aktuell status", + "caption": "Vyn Hälsoövervakare — kategorierna 10 spåras, med deras nuvarande status. Aktiva och avvisade varningar visas här när systemet aktiverar några.", + "body1": "Hälsoövervakaren körs i bakgrunden och skapar strukturerade händelser: hög CPU-temperatur, SMART-varningar, försämrade ZFS-pooler, processer avslutade vid minnesbrist, VM-/CT-fel och säkerhetsincidenter. Varje händelse har kategori, allvarlighetsgrad (INFO / WARNING / CRITICAL) och stabil error_key för att slå ihop dubbletter utan att fylla skärmen.", + "feedsIntro": "Händelser matar tre saker samtidigt:", + "feedsHealth": "Vyn Hälsoövervakaren i instrumentpanelen (aktiva + avvisade listor).", + "feedsChannels": "Aviseringsmotorn — Telegram, Discord, e-post, Gotify, Pushover och Apprise (flera kanaler). Varje kanal konfigureras separat och händelsekategorier kan tystas.", + "feedsAI": "Den valfria AI-assistenten förklarar händelser på vanligt språk via vald leverantör (OpenAI, Anthropic, Gemini, Groq, Ollama eller OpenRouter) och föreslår nästa steg om det är aktiverat i AI-inställningarna.", + "suppressionTitle": "Undertryck enskilda varningar i stället för att tysta allt", + "suppressionBody": "Varje kategori har en egen Undertryckningstid. När en varning avvisas tystas samma varning under perioden (24 timmar som standard, inställbart per kategori upp till permanent). En verklig försämring, till exempel kritisk CPU-temperatur, utlöser alltid en ny varning oavsett undertryckning." + }, + "api": { + "heading": "REST API och integrationer", + "intro": "REST-endpointar ger övervakningsdata som JSON över HTTP/HTTPS för Homepage, Home Assistant, Uptime Kuma och skript. Grafana kan använda den separata Prometheus-textexportören på /api/prometheus. Anrop kan göras med curl.", + "tokens": "Långlivade API-token (365 dagar) skapas under Inställningar → API-åtkomsttoken eller via POST /api/auth/generate-api-token.", + "bearer": "Skicka token som Authorization: Bearer …. Den offentliga /api/health passar tillgänglighetskontroller utan inloggning. Under /api/auth/* finns offentliga inställnings-/inloggnings-/statusrutter och skyddad konto-/tokenhantering; alla är inte anonyma.", + "catalog": "Den fullständiga slutpunktskatalogen, vägledning för tokenrotation och bästa säkerhetspraxis finns i API Referens; Färdiga exempel för Homepage, Home Assistant, Grafana, Uptime Kuma och ett generiskt cURL-mönster finns i Integrationer." + }, + "serviceControl": { + "heading": "Tjänstekontroll", + "intro": "Monitor hanteras som andra systemd-tjänster. Det finns även två poster i ProxMenux textgränssnitt under Inställningar:", + "codeComment": "# Manuell kontroll", + "footer": "Se Inställningar → ProxMenux Monitor för växling i menyn och statusverifieringsflöde." + }, + "nextSteps": { + "heading": "Var härnäst", + "items": [ + { + "label": "Arkitektur", + "description": "— Flask backend, systemd enhet, SQLite schema, AI-leverantörer, aviseringskanaler." + }, + { + "label": "Åtkomst och autentisering", + "description": "— första lansering, lösenordsinställningar, TOTP 2FA, omvänd proxykonfiguration, Fail2Ban integration." + }, + { + "label": "Instrumentpanel", + "description": "— varje avsnitt av UI, en sida vardera." + }, + { + "label": "API-referens", + "description": "— varje slutpunkt, begäran/svarsform och tokenhantering." + }, + { + "label": "Integrationer", + "description": "— Homepage, Home Assistant, Grafana / Prometheus, Uptime Kuma och generiskt cURL-mönster." + } + ] + } +} diff --git a/web/messages/sv/docs/monitor/integrations.json b/web/messages/sv/docs/monitor/integrations.json new file mode 100644 index 00000000..3ac16db2 --- /dev/null +++ b/web/messages/sv/docs/monitor/integrations.json @@ -0,0 +1,255 @@ +{ + "meta": { + "title": "Proxmox-integrationer — Homepage, Home Assistant, Grafana, Prometheus | ProxMenux Monitor", + "description": "Exempel att kopiera för att ansluta ProxMenux Monitor till Homepage, Home Assistant, Grafana via Prometheus och Uptime Kuma, med rätt konfiguration, API-endpoints och autentiseringsheader.", + "ogTitle": "Proxmox-integrationer — Homepage, Home Assistant, Grafana, Prometheus", + "ogDescription": "Guide för att ansluta ProxMenux Monitor till Homepage, Home Assistant, Grafana, Prometheus och Uptime Kuma.", + "twitterTitle": "Proxmox-integrationer | ProxMenux Monitor", + "twitterDescription": "Anvisningar för Homepage, Home Assistant, Grafana, Prometheus och Uptime Kuma." + }, + "header": { + "title": "Integrationer", + "description": "Exempel att kopiera för verktygen i ditt hemlabb: Homepage, Home Assistant, Grafana via Prometheus och Uptime Kuma. Varje exempel visar förväntad konfiguration, vilken Monitor-endpoint som används och rätt autentiseringsheader.", + "section": "ProxMenux-övervakning" + }, + "intro": { + "title": "Vad du kan bygga från denna sida", + "body": "Kopiera respektive exempel till valt verktyg. Endpoints beskrivs i API-referensen; denna sida visar hur de används i Homepage, Home Assistant och Grafana. Skärmbilderna visar resultatet av konfigurationerna." + }, + "auth": { + "heading": "Autentisering: det enda varje recept behöver", + "intro": "De flesta endpoints som används av dessa integrationer är autentiserade. Du har två sätt att tillfredsställa detta krav.", + "optAtitle": "Alternativ A – API token (rekommenderas för integrationer)", + "optAbody1": "Öppna Inställningar → Säkerhet → API-token. Välj Skapa token, ge den ett namn som homepage, home-assistant eller prometheus och kopiera den: den visas bara en gång. Den gäller ett år som standard och kan återkallas separat. Använd den för klienter utanför webbläsaren.", + "optAbody2": "Från den punkten är varje begäran bara:", + "optBtitle": "Alternativ B – inloggningsflöde (användarnamn + lösenord)", + "optBbody": "Användbart för skript som autentiserar som en mänsklig användare. Den returnerade token är kortlivad; de flesta integrationer bör föredra Alternativ A.", + "outro": "TOTP-fältet behövs bara med tvåfaktorsautentisering påslagen. Rotation och återkallande av token, lösenordsregler och granskningslogg beskrivs i Åtkomst och autentisering.", + "httpsTitle": "Använda HTTPS istället för HTTP", + "httpsIntro": "Exemplen använder http:// för korthet. Om TLS är påslaget i Monitor (Inställningar → Säkerhet → SSL/HTTPS), byt http:// mot https:// i varje URL. Två verktygsspecifika anmärkningar:", + "httpsItems": [ + "Självsignerade certifikat. Home Assistants rest:-integration verifierar TLS som standard. Med Monitors självsignerade certifikat kan du lägga till verify_ssl: false i varje REST-block bredvid scan_interval: eller importera dess CA i betrodda certifikat. Detsamma gäller andra verktyg som verifierar certifikat.", + "Prometheus har redan scheme: https i exemplet nedan. Aktivera eller behåll https när TLS är påslaget i Monitor." + ] + }, + "homepage": { + "heading": "Homepage", + "headingHref": "https://gethomepage.dev", + "intro": "Homepage är en statisk och anpassningsbar appöversikt. ProxMenux Monitor ansluts via den inbyggda widgeten customapi: lägg till en tjänst i services.yaml, starta om Homepage och kortet visar aktuella värden.", + "iconCalloutTitle": "Den officiella ProxMenux logotypen är på dashboardicons.com", + "iconCalloutBody": "Exemplen använder icon: proxmenux.png. Homepage slår upp enkla filnamn på dashboardicons.com, ett ikonbibliotek för självhostade översikter. ProxMenux finns på dashboardicons.com/icons/external/proxmenux och hämtas vid första visningen. Samma sak fungerar för tusentals verktyg som Telegram, Discord, Grafana och Tailscale: ange icon: <name>.png i tjänsten.", + "imageAlt": "Homepage-översikt med tre ProxMenux Monitor-kort (EDGE, VOID, DREAM) som visar upptid, CPU, RAM och temperatur per värd", + "imageCaption": "Tre ProxMenux Monitor-instanser som Homepage-kort: upptid, CPU, RAM och CPU-temperatur läses från /api/system på varje värd var 10:e s.", + "basicTitle": "Grundläggande widget - ingen autentisering", + "basicIntro": "Använd detta när ProxMenux Monitor är på ett pålitligt nätverk och du har inte aktiverat autentisering på Monitor sidan ännu. Den enklaste möjliga services.yaml-posten:", + "authedTitle": "Autentiserad widget", + "authedIntro": "Skapa en API-token under Inställningar → Säkerhet → API-token i Monitor. Kopiera den till headern Authorization nedan och ersätt exempeltoken efter Bearer.", + "authedOutro": "Starta om Homepage så visar kortet aktuella värden. Återanvänd token i widgetar som läser samma Monitor-instans.", + "multiTitle": "Multi-widget setup – system, lagring, nätverk", + "multiIntro": "För fler detaljer skapar du tre kort med olika endpoints: system, lagring och nätverk. Använd samma token för denna Monitor-instans.", + "multiCalloutTitle": "Flera Proxmox-värdar", + "multiCalloutBody": "Upprepa blocket per värd för att få korten på bilden. Varje post använder http://<host>:8008 för sin instans. Skapa och spara en token per värd: separata installationer har egna signeringsnycklar, så en token fungerar inte automatiskt på andra värdar." + }, + "homeAssistant": { + "heading": "Home Assistant", + "headingHref": "https://www.home-assistant.io", + "intro": "Exemplen använder Home Assistants inbyggda rest-integration utan särskild HACS-komponent. Den läser endpoints i API-referensen och skapar sensorer och attribut för automationer. Konfigurationen ger ungefär 25 sensorer för resurser, hälsa, VM/CT, lagring, nätverk och uppdateringar. Lägg till den i configuration.yaml och ladda om eller starta om HA.", + "imageAlt": "Home Assistant-översikt med hälsostatus, CPU-/RAM-/temperaturmätare, VM-antal, lagringsanvändning och räknare för aktiva fel", + "imageCaption": "ProxMenux Monitor som en förstklassig Home Assistant-integration - sensorer byggda från YAML-receptet nedan.", + "step1Title": "1 · Spara API-token", + "step1Body": "Spara token i secrets.yaml separat från huvudkonfigurationen. Lägg Bearer-prefix och token i ett värde som kan användas som header. Filen är inte krypterad och måste också hållas privat. Platsen beror på installationen, oftast /config/secrets.yaml i HA OS eller Container.", + "step2Title": "2 · Lägg till REST-konfigurationen", + "step2Body": "Sex REST-block täcker huvudområdena. Deras scan_interval följer ändringstakten: resurser var 30:e s, hälsa var 60:e s och inventeringar var 5–10:e minut. Klistra in i configuration.yaml:", + "step3Title": "3 · Lägg till binära sensorer och mallhjälpare", + "step3Body": "Två binära sensorer och två mallsensorer kompletterar integrationen. De förenklar automationer och villkorade Lovelace-kort utan att upprepa Jinja-uttryck överallt.", + "step4Title": "4 · Ladda om och kontrollera", + "step4Body": "Kontrollera först syntaxen under Utvecklarverktyg → YAML → Kontrollera konfiguration. Ladda sedan om All YAML-konfiguration eller starta om HA. Filtrera Inställningar → Enheter och tjänster → Entiteter efter proxmenux. De ungefär 25 entiteterna bör få värden inom ett avläsningsintervall.", + "replaceTitle": "Ersätter en tidigare version av detta recept?", + "replaceBody": "Efter en äldre version kan registret behålla gamla ID:n och kort visa Entiteten hittades inte. Ta bort tidigare rest:- och template:-block från configuration.yaml och ladda om. Filtrera Inställningar → Enheter och tjänster → Entiteter efter proxmenux och ta bort gamla återställda eller otillgängliga poster. Lägg in aktuellt YAML och ladda om för att registrera nya entiteter.", + "step5Title": "5 · Lovelace-översikt", + "step5Body": "YAML skapar ett vertical-stack-kort med logotyp, nyckeltal, system, VM, lagring, nätverk och ett villkorat problemkort. Öppna översikten, välj pennan, Lägg till kort och sedan Manuellt längst ned och klistra in:", + "viewTipTitle": "Vill du ha det som en fullständig instrumentpanelvy istället för ett enda kort?", + "viewTipBody": "Öppna trepunktsmenyn → Redigerare för råkonfiguration och lägg till en vy med denna rubrik ovanför listan cards::", + "viewTipOutro": "Det ger dig en dedikerad flik / bild i din instrumentpanel med sin egen ikon och titel, istället för ett långt kort på en befintlig vy.", + "altViewTitle": "Alternativ - en dedikerad instrumentpanelvy", + "altViewIntro": "Lägg till en vy med YAML nedan för en egen flik i en befintlig översikt. En vy är en flik i översikten och skapar ingen ny post i sidofältet. Steg:", + "altViewSteps": [ + "Öppna instrumentbrädan där du vill ha den nya fliken.", + "Klicka på pennan för att redigera översikten uppe till höger.", + "Klicka på fliken + i slutet av de befintliga flikarna för att skapa en ny vy.", + "Välj Kodredigerare uppe till höger i dialogen för att växla mellan visuell redigering och YAML.", + "Klistra YAML nedanför.", + "Spara. Vyn ProxMenux Monitor visas som flik i översikten med sina kort." + ], + "twoEditorsTitle": "Två YAML-redigerare i HA - välj rätt", + "twoEditorsIntro": "Home Assistant har två YAML-redigerare som ser lika ut men förväntar sig olika format:", + "twoEditorsItems": [ + "Redigerare för en vy — via + eller Redigera vy → Kodredigerare. Tar en vy med title:, path: och cards: på högsta nivån utan inledande bindestreck.", + "Råredigerare för hela översikten — via trepunktsmenyn. Tar hela listan views:, med varje vy som listpost med inledande -." + ], + "twoEditorsOutro": "Fel format kan ge en Namnlös vy och cards: []. YAML nedan är för redigeraren av en enskild vy; kopiera det som det visas.", + "viewImageAlt": "Egen Home Assistant-vy för ProxMenux Monitor: picture-entity-huvud, glance-nyckeltal och entitetskort för system, VM, lagring och nätverk i flera kolumner", + "viewImageCaption": "Vyn ProxMenux Monitor på bred skärm. Masonry placerar kort i kolumner automatiskt; layouten beror på inställd vytyp.", + "twoColTipTitle": "Vill du ha en fast tvåkolumnlayout istället för auto layout?", + "twoColTipBody": "Lägg två kort, som System + VM eller Lagring + Nätverk, i en gemensam horizontal-stack så att de visas bredvid varandra vid alla skärmbredder:", + "twoColTipOutro": "På mobilen förblir raden hoptryckt. HA:s automatiska layout utan horizontal-stack anpassar sig bättre till smala skärmar.", + "step6Title": "6 · Automationer", + "step6Body": "Tre automationer för vanliga reaktioner: ersätt notify.mobile_app_<your_phone> med den aviseringstjänst du använder.", + "logoTitle": "Om ProxMenux logotyp", + "logoBody": "picture-entity-kortet hämtar den officiella logotypen från dashboardicons.com, ett gratis ikonbibliotek för självhostade översikter. Posten finns på dashboardicons.com/icons/external/proxmenux. Home Assistant hämtar SVG:n via HTTPS vid första visningen och cachar den.", + "logoBrokenTitle": "Om logokortet visar en bruten bild", + "logoBrokenIntro": "Vissa HA-installationer (brandväggade nätverk, innehållsblockerare, värdar utan offentligt internet) kan inte nå jsdelivr.net vid rendertid. Fixen är en lokal kopia:", + "logoBrokenSteps": [ + "Ladda ner SVG från cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/proxmenux.svg.", + "Spara det till /config/www/icons/proxmenux.svg på din HA-värd.", + "I Lovelace YAML, ersätt image: URL med /local/icons/proxmenux.svg. Spara och ladda - bilden görs från den lokala filen, inget internet behövs." + ], + "scanTipTitle": "scan_interval tumregel", + "scanTipBody": "Börja med att läsa /api/system var 30:e s. /api/health/full läser normalt ett bakgrundsresultat giltigt i upp till sex minuter; avläsning var 60:e s kringgår inte cachen. Prova fem minuter för /api/storage/summary och en timme för /api/proxmenux/update-status. Anpassa efter hårdvara och antal värdar." + }, + "grafana": { + "heading": "Prometheus + Grafana", + "promHref": "https://prometheus.io", + "grafanaHref": "https://grafana.com", + "intro": "ProxMenux Monitor erbjuder GET /api/prometheus i Prometheus textformat 0.0.4. Med autentisering påslagen krävs en Bearer-token. Låt Prometheus samla mätvärden och Grafana visualisera tidsseriedatabasen.", + "imageAlt": "Grafana-översikt med ProxMenux-mätvärden: CPU-mätare, minneshistorik, antal startade VM och nätverkstrafik", + "imageCaption": "En enkel Grafana-översikt av ProxMenux-data samlade av Prometheus: CPU, minne, startade VM och nätverkstrafik. Hela katalogen finns i API-referens → Prometheus-mätvärden.", + "step1Title": "1 · Lägg till insamlingsjobbet i Prometheus", + "step1Body": "Skicka API-token via Prometheus inbyggda authorization-block, som också stöder inläsning från fil.", + "step1After": "Ladda om Prometheus med kill -HUP <PID> (ersätt PID med dess process-ID), systemctl reload prometheus om tjänsten stöder det eller docker compose restart prometheus för containern. Under Status → Targets bör proxmenux bli UP inom ett intervall. Etiketten node=\"<hostname>\" skiljer värdar åt.", + "tokenTipTitle": "Spara token i en separat fil", + "tokenTipBody": "Håll token separat från konfigurationen i produktion. Med credentials_file: /etc/prometheus/secrets/proxmenux.token läser Prometheus den ur en fil med rättigheterna 0600.", + "step2Title": "2 · Kontrollera insamlingen med några frågor", + "step2Body": "Kontrollera före Grafana att Prometheus har data. Öppna http://<prometheus-host>:9090, välj Query och kör någon av frågorna nedan. Du bör få aktuella värden från Proxmox-värden:", + "headerQuery": "Fråga", + "headerConfirms": "Vad den bekräftar", + "verifyRows": [ + { + "query": "up{job=\"proxmenux\"}", + "confirms": "Ger 1 om Prometheus lyckas samla data från Monitor, annars 0. Den snabbaste första kontrollen." + }, + { + "query": "proxmox_cpu_usage", + "confirms": "Aktuell CPU-belastning på Proxmox-värden i procent. Värdet bör ändras när frågan uppdateras med några sekunders mellanrum." + }, + { + "query": "proxmox_vms_running", + "confirms": "Antal startade gästmaskiner. Jämför med Proxmox-gränssnittet." + }, + { + "query": "proxmox_uptime_seconds / 86400", + "confirms": "Värdens upptid i dagar. Bör motsvara uptime i Proxmox-terminalen." + } + ], + "calloutTitle": "401 när endpointens URL öppnas direkt kan vara normalt", + "calloutBody": "Med autentisering påslagen öppnar länken under Status → Targets /api/prometheus i webbläsaren utan Prometheus Bearer-header. Svaret kan innehålla '{'\"error\":\"Authentication required\"'}'. Kontrollera målets verkliga State: UP för att bekräfta insamlingen via Prometheus.", + "step3Title": "3 · Lägg till Prometheus som en Grafana datakälla", + "step3Body": "Öppna Connections → Data sources → Add new → Prometheus i Grafana. Ange URL, till exempel http://prometheus.lan:9090, spara och testa. Om Prometheus kräver autentisering ställs den in separat här. Monitors token hör till Prometheus insamlingsjobb.", + "step4Title": "4 · Bygg paneler med dessa PromQL-frågor", + "step4Body": "Ett starturval av mätvärden som brukar övervakas på en Proxmox-värd:", + "headerPanel": "Panelidé", + "headerPromql": "PromQL-fråga", + "panelRows": [ + { + "panel": "CPU-mätare per värd", + "promql": "proxmox_cpu_usage" + }, + { + "panel": "Minnesanvändningsmätare per värd", + "promql": "proxmox_memory_usage_percent" + }, + { + "panel": "Använt och totalt minne (tidsserie)", + "promql": "proxmox_memory_used_bytes / 1024 / 1024 / 1024" + }, + { + "panel": "Startade VM/CT per värd", + "promql": "proxmox_vms_running" + }, + { + "panel": "CPU-temperatur", + "promql": "proxmox_cpu_temperature_celsius" + }, + { + "panel": "Nätverksgenomströmning RX (byte/s)", + "promql": "rate(proxmox_interface_bytes_received_total[5m])" + }, + { + "panel": "Nätverksgenomströmning TX (byte/s)", + "promql": "rate(proxmox_interface_bytes_sent_total[5m])" + }, + { + "panel": "Genomsnittlig belastning (1m)", + "promql": "proxmox_load_average{period=\"1m\"}" + }, + { + "panel": "Använt diskutrymme i procent per monteringspunkt", + "promql": "proxmox_disk_usage_percent" + }, + { + "panel": "UPS-batteriets laddningsnivå", + "promql": "proxmox_ups_battery_charge_percent" + }, + { + "panel": "GPU-temperatur per kortplats", + "promql": "proxmox_gpu_temperature_celsius" + } + ], + "outro": "Lägg till varje fråga som Grafana-panel med Stat för värden och Time series för trender och gruppera efter kategori. Använd node som översiktsvariabel (Settings → Variables → New → Query → label_values(proxmox_cpu_usage, node)) för att filtrera per värd." + }, + "uptimeKuma": { + "heading": "Uptime Kuma och andra statuskontroller", + "href": "https://github.com/louislam/uptime-kuma", + "intro": "Använd GET /api/system-info för en nyckelordskontroll. Denna route kräver ingen token och ger värdnamn, upptid och hälsa som healthy, warning eller critical. Den är offentlig, till skillnad från de skyddade detaljerade hälsoendpoints.", + "kumaTitle": "Uptime Kuma - HTTP nyckelordsövervakning", + "kumaSteps": [ + "I Uptime Kuma klickar du på + Lägg till ny Monitor.", + "Monitor Typ: HTTP(s) - Keyword.", + "Visningsnamn: ProxMenux Monitor — pve01.", + "URL: http://pve01.lan:8008/api/system-info.", + "Nyckelord: healthy (värdet av health.status när värden är OK).", + "Heartbeat Interval: 60 sekunder är tillräckligt.", + "Spara. Routen system-info kräver ingen Bearer-header." + ], + "healthchecksTitle": "healthchecks.io / pingar från cronjobb", + "healthchecksBody": "Ett cronjobb kan läsa /api/system-info och testa .health.status == \"healthy\". Först efter lyckat test skickar det en framgångsping till sin unika Healthchecks.io-URL. Tjänsten tar emot jobbpingar och frågar inte Monitor själv. Enbart HTTP 2xx bevisar inte god värdhälsa.", + "richTitle": "Vill du ha mer detaljerade hälsodata?", + "richBody": "Använd GET /api/health/full för hela tillståndet med tio kategorier, aktiva och avfärdade fel. Svaret innehåller översiktsfönstrets data och kräver Bearer-token när autentisering är påslagen." + }, + "workflows": { + "heading": "n8n, Zapier och anpassade skript", + "intro": "Arbetsflöden och skript kan skicka aviseringar med POST till /api/notifications/send, exempelvis vid CI-fel eller långa cronjobb. Direktsändning kringgår händelsekö och spärrtid per händelseavtryck. Kanalformatering, valfri AI och leverans finns kvar. Hantera eventuella dubbletter i anroparen.", + "n8nBody": "Använd en HTTP Request-nod i n8n med POST, URL ovan och samma JSON som curl. Välj generiska Header Auth-uppgifter: namn Authorization och värde Bearer YOUR_API_TOKEN, och ersätt platshållaren. Anslut ett schema, en webhook eller en föregående nod som utlösare.", + "severityBody": "Allvarlighetsgrad anges som INFO, WARNING eller CRITICAL med versaler. Objektet data ger sammanhang. AI använder renderad titel och text samt stödd berikning; godtyckliga fält ingår inte säkert i prompt eller resultat. Se Aviseringar → Händelsekatalog." + }, + "pveWebhook": { + "heading": "Inbyggd Proxmox VE-webhook (inkommande)", + "intro1": "PVE fick aviseringssystemet i 8.1; inbyggda webhookmål kräver Proxmox VE 8.3 eller senare. Aktivera aviseringar i Inställningar försöker registrera Monitor som mål. PVE-meddelanden som skickas dit, som backup- eller replikeringsrapporter, går in i dess sändningsflöde. Konfigurationen måste vara tillgänglig och skrivbar.", + "intro2": "Förlopp, PVE:s meddelandemall, poster i /etc/pve/notifications.cfg och klusterbeteende beskrivs i Aviseringar → PVE-webhookintegration." + }, + "whereNext": { + "heading": "Gå vidare", + "items": [ + { + "label": "API-referens", + "href": "/docs/monitor/api", + "tail": " — endpoints med metod, sökväg och fullständig Prometheus-mätvärdeskatalog." + }, + { + "label": "Aviseringar", + "href": "/docs/monitor/notifications", + "tail": " — händelsekällor, kanaler, sändningsflöde och PVE-webhookintegration i detalj." + }, + { + "label": "AI-assistent", + "href": "/docs/monitor/ai-assistant", + "tail": " — valfri omskrivning av malltexter till begripligt språk före sändning till Telegram, Discord, e-post eller Gotify." + }, + { + "label": "Åtkomst och autentisering", + "href": "/docs/monitor/access-auth", + "tail": " — skapa och återkalla API-token för exemplen, granskningslogg och TLS-inställningar." + } + ] + } +} diff --git a/web/messages/sv/docs/monitor/notifications.json b/web/messages/sv/docs/monitor/notifications.json new file mode 100644 index 00000000..ca940a34 --- /dev/null +++ b/web/messages/sv/docs/monitor/notifications.json @@ -0,0 +1,535 @@ +{ + "meta": { + "title": "Proxmox-aviseringar — Telegram, Discord, e-post, Gotify, Pushover, Apprise | ProxMenux Monitor", + "description": "Skicka aviseringar från Proxmox VE till Telegram, Discord, e-post, Gotify, Pushover och cirka 80 andra tjänster via Apprise. Händelser från Health Monitor, systemjournalen och PVE:s webhook blir formaterade meddelanden med dubblettkontroll, väntetid mellan upprepningar, gruppering av händelsetoppar, valfri AI-omskrivning och historik.", + "ogTitle": "Proxmox-aviseringar — Telegram, Discord, e-post, Gotify, Pushover, Apprise", + "ogDescription": "Skicka larm från Proxmox VE till Telegram, Discord, e-post, Gotify, Pushover och cirka 80 andra tjänster via Apprise, med dubblettkontroll, väntetid mellan upprepningar, gruppering av händelsetoppar och valfri AI-omskrivning.", + "twitterTitle": "Proxmox-aviseringar | ProxMenux Monitor", + "twitterDescription": "Skicka larm från Proxmox VE till Telegram, Discord, e-post, Gotify, Pushover och cirka 80 andra tjänster via Apprise." + }, + "header": { + "title": "Aviseringar", + "description": "Distribuerar händelser från Monitors insamlare till Telegram, Discord, e-post, Gotify, Pushover och cirka 80 andra tjänster via Apprise. Med dubblettkontroll, väntetid mellan upprepningar, gruppering av händelsetoppar, filter per händelse och kanal, valfri AI-omskrivning och sökbar historik.", + "section": "ProxMenux Monitor" + }, + "intro": { + "title": "Var meddelandena kommer från", + "body": "Aviseringarna förmedlar händelser från Monitors befintliga källor: Health Monitor, övervakningen av systemjournalen och Proxmox-uppgifter, PVE:s webhook, periodiska kontroller och direkta anrop från ProxMenux-skript. Händelserna följer samma hanteringskedja innan de når telefonen eller inkorgen." + }, + "howItWorks": { + "heading": "Hur det fungerar", + "intro": "Insamlarna skapar strukturerade händelser. Hanteringskedjan avgör om och hur de ska skickas. En språkmodell kan skriva om texten innan meddelandet skickas till de kanaler du har konfigurerat.", + "arrowLabel": "händelse", + "caption": "Översikt över flödet. Varje faktiskt sändningsförsök, lyckat, grupperat eller misslyckat, registreras i SQLite-historiken. Händelser som undertrycks av väntetiden mellan upprepningar registreras inte.", + "nodes": { + "sourcesLabel": "Källor", + "sourcesDetail": "Health Monitor\nÖvervakning av systemjournalen\nUppgiftsövervakning\nPVE:s webhook\nPeriodiska kontroller\nInterna händelsekällor", + "dispatchLabel": "Hanteringskedja", + "dispatchDetail": "Gruppering av händelsetoppar\nKontroll av fingeravtryck / väntetid\nFrekvensgränser per grupp\nKontroller per kanal", + "aiLabel": "AI-omskrivning (valfritt)", + "aiDetail": "OpenAI / Anthropic\nGemini / Groq\nOpenRouter / Ollama\n(inaktiverat som standard)", + "channelsLabel": "Kanaler", + "channelsDetail": "Telegram\nDiscord\nE-post (SMTP)\nGotify\nPushover\nApprise (cirka 80 tjänster)" + } + }, + "enabling": { + "heading": "Aktivera aviseringar", + "intro": "Efter en ny installation visar aviseringskortet under Inställningar statusen Inaktiverad och knappen Aktivera aviseringar. Inget skickas och PVE-konfigurationen ändras först när du klickar.", + "disabledAlt": "Aviseringskort efter nyinstallation med statusen Inaktiverad och knappen Aktivera aviseringar", + "disabledCaption": "Det första tillståndet - ett klick för att aktivera.", + "stepsIntro": "Knappen utför tre åtgärder i följd:", + "steps": [ + "Ändrar statusen till Aktiv och visar kanalformuläret nedanför.", + "Registrerar ett webhookmål i /etc/pve/notifications.cfg. Utan HTTPS används POST http://127.0.0.1:8008/api/notifications/webhook; med HTTPS används den lokala HTTP-mottagaren på port 8009. PVE:s aviseringar går då genom Monitor. Se PVE-webhookintegration nedan.", + "Startar en sändningstråd i bakgrunden. Den kontrollerar händelsekön och behandlar varje händelse enligt flödet ovan." + ], + "activeAlt": "Aktiverat aviseringskort med statusen Aktiv, kanalflikar, fältet Visningsnamn och den utfällbara delen Avancerat: AI-förbättring", + "activeCaption": "Aktivt läge med kanalflikar överst (Telegram / Gotify / Discord / e-post / Pushover / Apprise), visningsnamn, kategorier per kanal och delen Avancerat: AI-förbättring." + }, + "sources": { + "heading": "Händelsekällor", + "intro": "Sex typer av källor matar aviseringsmotorn: bakgrundsinsamlare, webhookmottagaren och direkta händelsekällor i processen. De skapar strukturerade NotificationEvent-objekt.", + "headerCollector": "Insamlare", + "headerWatches": "Övervakar", + "headerEvents": "Typiska händelser", + "rows": [ + { + "collector": "Health Monitor", + "watches": "Tio kategorier, ungefär var femte minut", + "events": "new_error, error_resolved, error_escalated, health_degraded, health_persistent." + }, + { + "collector": "Övervakning av systemjournalen", + "watches": "journalctl --follow med mönster för misslyckade SSH- och webbinloggningar, Fail2Ban-blockeringar om den valfria jail-konfigurationen är installerad, kärnans I/O-fel, OOM och smartd-händelser.", + "events": "auth_fail, ip_block, oom_kill, disk_io_error, service_fail." + }, + { + "collector": "Uppgiftsövervakning", + "watches": "Kontrollerar /var/log/pve/tasks/index efter nya uppgifts-UPID:n och följer uppgifternas loggfiler.", + "events": "backup_start, backup_complete, backup_warning, backup_fail, migration_*, snapshot_complete." + }, + { + "collector": "Proxmox-webhookmottagare", + "watches": "Tar emot POST /api/notifications/webhook. PVE-versioner som stöder webhookmål för aviseringar kan vidarebefordra dem hit efter konfiguration. Se nedan.", + "events": "Allt PVE avger - inklusive händelser som Monitor annars skulle missa (HA, replikering, vzdump från GUI)." + }, + { + "collector": "Periodisk insamlare", + "watches": "Jämför regelbundet klusternodernas anslutning, certifikatens giltighet, GPU-genomkoppling och tillgängliga uppdateringar för PVE och ProxMenux.", + "events": "node_disconnect, node_reconnect, pve_update, proxmenux_update, gpu_mode_switch, pci_passthrough_conflict." + }, + { + "collector": "Händelsekällor i processen", + "watches": "Direkta anrop från ProxMenux-skript och Monitor (notification_manager.emit_event(...)).", + "events": "system_startup, system_shutdown, system_reboot, ai_model_migrated och egna testhändelser." + } + ], + "after1": "Varje händelse har en stabil event_type (se katalogen nedan), en severity (INFO, WARNING, CRITICAL), en category för emoji och gruppfilter samt data med mallens uppgifter, såsom vmid, device, source_ip och reason.", + "after2": "Varje event_type har en mall i notification_templates.py som skapar meddelandetexten. Texten går genom hanteringskedjan och kan skrivas om av AI om det är aktiverat. Sidan AI-assistent beskriver samspelet med malltexten." + }, + "channels": { + "heading": "Genomgångar av kanaler", + "intro": "Sex kanaler stöds: Telegram, Discord, Gotify, e-post (SMTP), Pushover och Apprise. De fem första har egna inställningsfält. Apprise lägger till cirka 80 tjänster via ett URL-fält, bland annat ntfy, Matrix, Slack, Teams, Pushbullet, AWS SNS och Mattermost. Anvisningar finns nedan.", + "credsTitle": "Lagring av inloggningsuppgifter", + "credsBody": "Token, nycklar, webhookadresser och SMTP-lösenord lagras lokalt i Monitors SQLite-databas under /usr/local/share/proxmenux/. Känsliga värden skyddas och maskeras i gränssnittet. De lämnar värden endast för att nå respektive tjänst. En säkerhetskopia av katalogen räcker för att återställa kanalerna." + }, + "telegram": { + "heading": "Telegram", + "intro": "Du behöver en bottoken, som kan återanvändas mellan chattar, och ett chatt-ID för destinationen: din privata chatt, en grupp eller ett ämne i en supergrupp. Den inbyggda guiden visar alla steg. Här beskrivs även de två formerna av chatt-ID.", + "guideAlt": "Telegram-guide med fyra delar: skapa bot med BotFather, hämta token, hämta chatt-ID samt grupper och kanaler", + "guideCaption": "Länken + konfigurationsguide på Telegram-fliken öppnar fyra steg från att skapa en bot till en fungerande kanal på cirka två minuter.", + "step1Title": "1 · Skapa en bot med BotFather", + "step1Items": [ + "Öppna Telegram och kontakta @BotFather med den blå verifieringssymbolen. Se upp för kopior.", + "Skicka /newbot.", + "Välj ett visningsnamn, till exempel ProxMenux Lab. Det kan ändras senare.", + "Välj ett användarnamn som slutar på bot, till exempel proxmenux_lab_bot. Det måste vara unikt på Telegram.", + "BotFather svarar med en token på formen 123456789:ABCdef…. Detta är bottoken: skydda den som ett lösenord." + ], + "step2Title": "2 · Hämta chatt-ID", + "step2Intro": "Chatt-ID anger vart boten skickar meddelanden. Formen beror på destinationen.", + "privateLabel": "Privat chatt (du får varningarna på ditt eget konto):", + "privateItems": [ + "Starta en chatt med din nya bot och skicka något meddelande (t.ex. /start).", + "Öppna en chatt med @userinfobot (eller @myidbot) och skicka /start. Det svarar med ditt numeriska användar-ID - det är chatt-ID. Det är ett positivt tal." + ], + "privateAlt": "Telegram-formulär med maskerad bottoken, positivt chatt-ID för en privat chatt och tomt valfritt ämnes-ID", + "privateCaption": "Privat chatt med boten: chatt-ID är ett positivt tal, ditt personliga användar-ID.", + "groupLabel": "Grupp eller supergrupp med ämnen:", + "groupItems": [ + "Lägg till boten som medlem i gruppen och ge den administratörsrättigheter om det krävs för att skicka meddelanden.", + "Skicka ett meddelande i gruppen.", + "Öppna https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates i en webbläsare. Leta efter chat.id i JSON-svaret - för grupper är det ett negativt nummer, för supergrupper börjar det med -100.", + "För supergrupper med Ämnen aktiverat: hämta även önskat message_thread_id och fyll i det valfria fältet Ämnes-ID." + ], + "groupAlt": "Telegram-formulär med maskerad bottoken, negativt chatt-ID som börjar med -100 för en supergrupp och ämnes-ID 3 för en särskild tråd", + "groupCaption": "Supergrupp: chatt-ID börjar med -100…. Det valfria fältet Ämnes-ID väljer en särskild tråd.", + "step3Title": "3 · Spara och testa", + "step3Body": "Klistra in token och chatt-ID, spara och välj Skicka test längst ned. Testet bör komma inom en sekund. Annars visar Historik orsaken, till exempel ogiltig token, boten saknas i gruppen eller användaren har blockerat den." + }, + "discord": { + "heading": "Discord", + "intro": "Discord tar emot meddelanden via en webhookadress knuten till en kanal. Monitor behöver den adressen.", + "items": [ + "Öppna önskad Discord-server och gå till Serverinställningar → Integrationer → Webhooks.", + "Välj Ny webhook, ge den ett namn som ProxMenux och välj kanal. En avatar är valfri.", + "Välj Kopiera webhookadress. Formatet är https://discord.com/api/webhooks/<id>/<token>.", + "Klistra in adressen i webhookfältet på Discord-fliken under Aviseringar och spara." + ], + "imageAlt": "Discord-formulär med webhookadress som börjar med https://discord.com/api/webhooks/", + "imageCaption": "Discord: klistra in webhookadressen från Serverinställningar → Integrationer → Webhooks." + }, + "gotify": { + "heading": "Gotify", + "intro": "Gotify är en aviseringsserver som du kan drifta själv. Du behöver dess basadress och en programtoken skapad i Gotifys administrationsgränssnitt.", + "items": [ + "Om du inte redan har en Gotify-instans, installera en - se officiell installationsguide.", + "Logga in som administratör i Gotify och välj Appar → Skapa program. Ge det ett namn som ProxMenux och kopiera token.", + "Ange Serveradress på Gotify-fliken, exempelvis https://gotify.example.com, och klistra in programtoken.", + "Spara och välj Skicka test." + ], + "imageAlt": "Gotify-formulär med serveradressen https://gotify.example.com och tokenfält med platshållaren A_valid_gotify_token", + "imageCaption": "Gotify: serveradressen till din egen instans och programtoken från administrationsgränssnittet." + }, + "email": { + "heading": "E-post (SMTP)", + "intro": "E-post är den mest flexibla kanalen – och den som har flest fält. Du behöver en SMTP-server, en port, ett TLS-läge, valfritt ett användarnamn och lösenord, en avsändaradress och minst en mottagare.", + "imageAlt": "SMTP-formulär med server, port, TLS-läge, användarnamn, lösenord, avsändare, kommaseparerade mottagare och ämnesprefix", + "imageCaption": "E-post: SMTP-server, port, TLS-läge, valfria inloggningsuppgifter, avsändare, mottagare och ämnesprefix för filtrering i inkorgen.", + "appNote": "Monitor använder SMTP med lösenord. Gmail kan kräva ett applösenord. Hos Microsoft beror stödet på tjänsten och organisationens regler; ett applösenord kringgår inte ett förbud mot grundläggande autentisering. Kontrollera att SMTP-tjänsten tillåter metoden.", + "gmailTitle": "Applösenord för Gmail", + "gmailIntro": "Gmail kräver tvåstegsverifiering för att skapa applösenord. Annars är sidan Applösenord inte tillgänglig.", + "gmailItems": [ + "Öppna myaccount.google.com/security och aktivera tvåstegsverifiering om den inte redan är på.", + "Gå till myaccount.google.com/apppasswords.", + "Ange ett namn som ProxMenux och välj Skapa. Kopiera lösenordet på 16 tecken.", + "Fyll i fliken E-post med Värd smtp.gmail.com, Port 587, TLS-läge STARTTLS, Användarnamn din Gmail-adress och Lösenord applösenordet på 16 tecken." + ], + "outlookTitle": "Applösenord för Microsoft / Outlook", + "outlookIntro": "Microsofts applösenord kräver tvåstegsverifiering, men garanterar inte stöd för SMTP. Om tjänsten eller organisationen kräver OAuth2 kan Monitors lösenordsbaserade SMTP-klient inte autentisera sig. Använd ett SMTP-relä som stöder den autentisering som krävs.", + "outlookItems": [ + "Öppna account.microsoft.com/security och aktivera tvåstegsverifiering.", + "Om kontot erbjuder Avancerade säkerhetsalternativ → Applösenord, välj Skapa ett nytt applösenord. Det garanterar inte att e-posttjänsten godtar SMTP med lösenord.", + "Om Microsoft skapar ett applösenord, kopiera det och kontrollera att SMTP-tjänsten godtar det.", + "Använd bara dessa godkända inställningar om tjänsten tillåter SMTP med lösenord: Server smtp.office365.com för Exchange Online, Port 587, TLS-läge STARTTLS, Användarnamn din e-postadress och Lösenord den tillåtna SMTP-inloggningsuppgiften. Personliga Outlook.com-konton har andra inställningar och krav." + ], + "relayTitle": "Eget SMTP-relä", + "relayBody": "Anslut Monitor till ett SMTP-relä du kontrollerar, till exempel Postfix. Reläet hanterar tjänstens autentisering. Anpassa Monitors autentisering och TLS-läge till reläet; att det körs lokalt stänger inte av kryptering." + }, + "pushover": { + "heading": "Pushover", + "intro": "Pushover är en mobil push-tjänst med officiella appar för iOS, Android och stationära webbläsare. Den dedikerade ProxMenux-kanalen talar direkt till Pushover API, så ingen Apprise-URL krävs.", + "stepsTitle": "Konfiguration", + "steps": [ + "Skapa ett Pushover-konto, installera den officiella appen på enheterna som ska ta emot larm och logga in.", + "Kopiera användarnyckeln på Pushover-panelen. Använd en gruppnyckel om flera personer eller enheter ska få samma larm.", + "Öppna Skapa program/API-token, skapa programmet ProxMenux och kopiera dess API-token på 30 tecken.", + "Under Inställningar → Aviseringar → Pushover, klistra in användar- eller gruppnyckeln och programmets API-token. Enhet och ljud är valfria.", + "Spara och välj Skicka test. Meddelandet bör nå Pushover-appen direkt." + ], + "priorityTitle": "Prioritetsmappning", + "priorityBody": "Vanliga meddelanden använder Pushover-prioritet 0. Med Hög prioritet för kritiska larm får CRITICAL-händelser prioritet 1 och kringgår Pushover-användarens tysta timmar. Nödprioritet 2 med upprepade aviseringar och kvittens används inte.", + "secretTitle": "Skydda båda värdena", + "secretBody": "Användar- eller gruppnyckeln och programmets API-token tillåter sändning. Monitor lagrar dem som skyddade hemligheter och maskerar dem i gränssnittet. Publicera inget av värdena i skärmbilder eller supportloggar." + }, + "apprise": { + "heading": "Apprise (nav för cirka 80 tjänster)", + "intro": "Apprise är ett aviseringsbibliotek med öppen källkod som stöder cirka 80 tjänster genom URL:er. Som kanal i Monitor ger det tillgång till ntfy, Matrix, Slack, Microsoft Teams, Mattermost, Pushbullet, AWS SNS, Pushsafer, Rocket.Chat, Signal API och fler tjänster utan egna flikar. Pushover stöds också, men dess egen flik är enklare för en enda destination.", + "listIntro": "Den fullständiga listan över stödda tjänster och det exakta URL-formatet för var och en finns tillgänglig i den officiella Apprise-dokumentationen:", + "listItems": [ + "Apprises tjänstedokumentation — fullständigt register över tjänster.", + "URL-grunder — hur Apprise-adresser är uppbyggda." + ], + "stepsTitle": "Steg", + "steps": [ + "Välj tjänst i Apprises wiki och kopiera URL-mallen. Tjänstens sida visar rätt schema (ntfy://, matrix://, pover://, slack://…) och nödvändiga token, kanaler och värdnamn.", + "Ersätt platshållarna med dina uppgifter. Ett ntfy.sh-ämne kan vara ntfy://ntfy.sh/my-topic, Pushover pover://user@token och Matrix matrix://user:pass@host:port/#room.", + "Klistra in den slutliga webbadressen i Apprise URL-fältet i Apprise-fliken i meddelandepanelen och spara.", + "Välj Skicka test för att kontrollera anslutningen och att inloggningsuppgifterna godtas." + ], + "deliveredTitle": "Vad som levereras", + "deliveredBody": "Apprise får titel, meddelandetext och allvarlighetsgrad (info / success / warning / failure). Graden anpassas till tjänstens stöd för ikon, prioritet och färg. Formatering och AI-omskrivning sker före anropet, som för Telegram och e-post.", + "fanoutTitle": "En URL per Apprise-kanal", + "fanoutBody": "Monitor har ett URL-fält per Apprise-kanal. För flera tjänster samtidigt, som ntfy.sh och Matrix, kan du drifta en Apprise API-server med taggad konfiguration. Monitor anropar servern, som distribuerar meddelandet till alla adresser under taggen." + }, + "rich": { + "heading": "Formaterade meddelanden, kategorier och filter per kanal", + "intro": "Varje kanal har tre kontroller under formuläret: Formaterade meddelanden överst, elva utfällbara Aviseringskategorier med val per händelse och Skicka test längst ned.", + "imageAlt": "Aviseringskategorier med markerad formateringsinställning överst, utfällbara delar för VM/CT, säkerhetskopiering, resurser, lagring, nätverk, säkerhet, kluster, tjänster, Health Monitor och uppdateringar samt antal händelser och testknapp", + "imageCaption": "Pilen visar Formaterade meddelanden för kanalen. Nedanför finns elva kategorier med val per händelse. Skicka test finns längst ned.", + "richTitle": "Formaterade meddelanden", + "richIntro": "Med Formaterade meddelanden får rubriken en kategoriemoji och texten kanalens formatering, såsom Telegram-HTML eller Discord-kort med färg efter allvarlighetsgrad. Avstängt skickas samma information som enkel text:", + "plainHeader": "Enkel text — formatering av", + "richHeader": "Formaterad text — formatering på", + "richOutro": "Inställningen gäller per kanal. Du kan använda enkel text i e-post för inkorgsregler och formatering i Telegram och Discord. Kanaler utan stöd för formatering, som Gotify och vanlig e-post, får text.", + "togglesTitle": "Kategorier och enskilda händelser", + "togglesIntro": "Varje kanal styr sina kategorier och händelsetyper. En avstängd kategori stoppar dess händelser för kanalen. Enskilda händelseval gäller inom aktiverade kategorier; sändningshanteraren har inget globalt huvudfilter för händelser.", + "togglesItems": [ + "Kategorival per kanal. Avstängd VM/CT-kategori stoppar vm_start och liknande händelser för kanalen. Valet lagras som <channel>.events.<group>.", + "Händelseval per kanal. I en aktiverad kategori kan du välja att skicka backup_complete till Discord men inte Telegram. Valet lagras som <channel>.event.<event_type>." + ], + "togglesOutro": "Kategorirubriken visar aktiverade / totalt och en kontroll för hela gruppen. Du kan därmed stänga av exempelvis alla säkerhetskopieringar med nivån info eller alla uppdateringar utan att öppna kategorin." + }, + "quiet": { + "heading": "Tysta timmar", + "intro": "Under kanalens tysta timmar skickas endast CRITICAL direkt. INFO, WARNING och åtgärdshändelser sparas på disk och skickas som en gemensam sammanfattning när tidsfönstret slutar.", + "imageAlt": "Kanalinställningar med tysta timmar 22:00–07:00 och aktuell förhandsvisning samt daglig sammanfattning kl. 09:00, med en notering om att den dagliga sammanfattningen inte fördröjer CRITICAL och WARNING", + "imageCaption": "Två oberoende inställningar per kanal: tysta timmar överst och daglig sammanfattning nedanför.", + "purposeTitle": "Användningsområde", + "purposeItems": [ + "Väck mig inte kl. 03:00 för en uppdatering. Säkerhetskopieringar, programuppdateringar, optimeringar och andra INFO-händelser behöver inte få telefonen att låta på natten.", + "Kritiska händelser kommer fortfarande fram. Händelser klassade som CRITICAL kringgår tysta timmar. Namnet avgör inte allvarlighetsgraden: journalövervakningen skapar Fail2Ban-blockeringar och värdens avstängnings-/omstartsmeddelanden som INFO, så de kan buffras.", + "Behåll de uppskjutna aviseringarna. De sparas i en SQLite-buffert tills tidsfönstret slutar." + ], + "howTitle": "Hur det fungerar", + "howItems": [ + "Inställning per kanal. Telegram kan vara tyst 22:00–07:00 medan e-post tar emot allt dygnet runt.", + "Start- och sluttid i lokal tidszon. Starten ingår, sluttiden ingår inte. Fönstret kan gå över midnatt, till exempel 22:00–07:00.", + "Aktuell förhandsvisning. Under tidsfälten visas om fönstret är aktivt och när nästa övergång sker.", + "Under tidsfönstret: CRITICAL skickas normalt. INFO och WARNING sparas i en beständig buffert, SQLite-tabellen quiet_pending.", + "När tidsfönstret slutar: en gemensam sammanfattning skickas, med en rad per händelse i tidsordning. Bufferten töms först efter bekräftad leverans, så ett tillfälligt Telegram- eller SMTP-avbrott inte raderar nattens händelser.", + "Vid omstart. Bufferten finns kvar på disk om Monitor startar om under fönstret. Sker omstarten strax efter sluttiden skickar nästa sändningscykel de väntande händelserna i en återhämtningssammanfattning." + ], + "criticalTitle": "Vad räknas som CRITICAL?", + "criticalBody": "Händelsekällan sätter allvarlighetsgraden när händelsen skapas. Disk-, avstängnings- och säkerhetshändelser är inte automatiskt CRITICAL. Journalövervakningen skapar exempelvis ip_block, system_shutdown och system_reboot som INFO. Händelsekatalogen listar typerna; kontrollera källan och den mottagna händelsen för den faktiska graden." + }, + "digest": { + "heading": "Daglig sammanfattning av INFO-händelser", + "intro1": "Daglig sammanfattning är ett aktivt val som samlar lämpliga INFO-aviseringar, som tillgängliga uppdateringar, till kl. 09:00 eller vald tid. Säkerhetskopierings- och replikeringsresultat samt direkta åtgärdshändelser undantas. Tysta timmar fördröjer i stället icke-kritiska meddelanden under ett dagligt tidsfönster.", + "intro2": "Inställningen finns i kanalens kort, direkt under tysta timmar. Se bilden under Tysta timmar. De aktiveras oberoende av varandra.", + "purposeTitle": "Användningsområde", + "purposeItems": [ + "En morgonsammanfattning av händelserna. Om du kontrollerar värden en gång om dagen kan en sammanfattning kl. 09:00 ersätta 20 enskilda aviseringar från föregående dag.", + "Skilj information från larm. INFO beskriver vad som hände; CRITICAL och WARNING visar vad som kräver uppmärksamhet. Sammanfattningen hanterar INFO, medan övriga nivåer fortsätter att skickas direkt enligt kanalens inställningar." + ], + "howTitle": "Hur det fungerar", + "howItems": [ + "Aktiveras per kanal. Avstängt som standard. Aktivera sammanfattning på önskade kanaler och behåll direktleverans på andra.", + "Leveranstid i lokal tidszon, som standard 09:00. Du kan välja en annan tid; sammanfattningen skickas inom ungefär 60 sekunder från den minuten.", + "Ingår i sammanfattningen: lämpliga allmänna händelser med nivån INFO. Exempel: programuppdatering tillgänglig, Tailscale-uppdatering tillgänglig, ProxMenux-optimeringsuppdatering tillgänglig, APT-säkerhetsuppdateringar väntar och frekvensgräns nådd. Säkerhetskopieringsresultat och andra undantagna åtgärdshändelser skickas direkt.", + "Fördröjs aldrig av den dagliga sammanfattningen:", + "Beständig lagring. Väntande händelser sparas i SQLite-tabellen digest_pending till vald tid. En omstart av Monitor förlorar inte innehållet.", + "Tyst när inget har hänt. Om inga INFO-händelser väntar skickas ingen sammanfattning." + ], + "neverDelayedSub": [ + "CRITICAL fördröjs inte av den dagliga sammanfattningen.", + "WARNING fördröjs inte av den dagliga sammanfattningen.", + "Direkta åtgärdshändelser — VM/CT-start, stopp, avstängning, omstart och fel; säkerhetskopieringens start och resultat; replikeringsresultat; värdens avstängning och omstart — kringgår sammanfattningen även som INFO. Tysta timmar kan fortfarande fördröja icke-kritiska händelser." + ], + "comboTitle": "Kombinera tysta timmar och daglig sammanfattning", + "comboBody": "En kanal kan använda båda: tysta timmar 22:00–07:00 och daglig sammanfattning kl. 09:00. Icke-kritiska händelser under tysta timmar buffras till sammanfattningen kl. 07:00. Lämpliga INFO-händelser utanför fönstret går till den dagliga sammanfattningen. CRITICAL kringgår båda; WARNING kringgår den dagliga sammanfattningen men väntar under tysta timmar. Välj ett tyst tidsfönster, en sammanfattning vid fast tid eller båda." + }, + "displayName": { + "heading": "Visningsnamn", + "intro": "Varje avisering har ett visningsnamn som identifierar värden. Det visas längst ned i exemplet med formaterade meddelanden (🏠 home-lab) och i e-postens ämnesprefix.", + "imageAlt": "Fältet Visningsnamn med amd som exempelvärde och etiketten Namn som visas i aviseringar. Ändra värdet för ett eget namn eller lämna det tomt för att använda systemets värdnamn.", + "imageCaption": "Lämna Visningsnamn tomt för systemets värdnamn eller ange ett eget namn.", + "outro": "Om fältet är tomt används systemets värdnamn. Ett eget namn är användbart när flera värdar skickar till samma Telegram-chatt eller inkorg. Etiketter som home-lab och office-pve är lättare att läsa än pve01.lan eller pmx-prod-01." + }, + "dispatch": { + "heading": "Hanteringskedja", + "intro": "Tabellen beskriver tre relaterade mekanismer. Flödet börjar med gruppering av händelsetoppar, följt av leveransanspråk/väntetid och frekvensgränser per grupp, därefter formatering och leveranskontroller per kanal:", + "headerStage": "Steg", + "headerWhat": "Vad det gör", + "headerTunable": "Konfigurerbar?", + "rows": [ + { + "stage": "Dubblettkontroll med fingeravtryck", + "what": "Varje händelse hashas till ett fingeravtryck (event_type + key fields from data). Identiska fingeravtryck inom ett kort tidsfönster räknas som dubbletter av den första händelsen.", + "tunable": "Nej — intern sändningslogik." + }, + { + "stage": "Väntetid mellan upprepningar", + "what": "Efter lyckad leverans undertrycks samma fingeravtryck och tillståndet sparas i notification_last_sent. Grundvärden för CRITICAL, WARNING och INFO är 86 400 s, liksom för resources och updates. Undantag: 5 s för VM/CT-åtgärder och värdens avstängning/omstart, 10 s för säkerhetskopierings-/replikeringsresultat och 1 800–3 600 s för flera hälsokategorier. Egna händelse- eller gruppinställningar kan ersätta värdena.", + "tunable": "Ja — uttryckliga väntetider för händelsetyp eller grupp ersätter standardvärdena i sändningskonfigurationen." + }, + { + "stage": "Gruppering av händelsetoppar", + "what": "När flera händelser av samma slag kommer inom ett kort tidsfönster, som vid en SSH-attack, slås de ihop till ett burst_*-meddelande med antal och exempel.", + "tunable": "Nej - fönster och tröskel är hårdkodade per händelsetyp." + } + ], + "calloutTitle": "Sändningen sker i en bakgrundstråd", + "calloutBody": "Sändningsloopen körs i en egen tråd. HTTP-anropet som skapar händelsen återvänder när den ligger i kön, utan att vänta på Telegram, SMTP eller webhookens svarstid. Sändningsresultaten sparas i historiktabellen." + }, + "aiRewrite": { + "heading": "Valfri AI-omskrivning", + "body1": "Lämpliga händelser kan skrivas om av en språkmodell före leverans. Säkerhetskopieringsresultaten backup_complete och backup_fail undantas. AI är avstängt som standard och körs i sändningstråden när det aktiveras. Vid fel eller tidsgräns används malltexten.", + "body2": "Sex leverantörer stöds: OpenAI, Anthropic, Google Gemini, Groq, OpenRouter och lokal Ollama. Per kanal väljs detaljnivå (brief, standard, detailed), språk, instruktionsläge (default eller custom) och egna instruktioner. Sidan AI-assistent visar konfiguration, bilder och exempel.", + "privacyTitle": "Integritetsinformation", + "privacyBody": "AI-anrop kan innehålla titel, allvarlighetsgrad, meddelandetext, systeminstruktioner, egna instruktioner och insamlad kontext med värdnamn, IP-adresser, användarnamn, fel och journalrader. De skickas till vald server. Ollama är lokalt endast med både lokal server och lokal modell; en fjärrserver eller molnmodell skickar data utanför värden. Stäng av omskrivning eller använd en kontrollerad lokal server och modell om innehållet måste stanna i nätverket." + }, + "pveWebhook": { + "heading": "PVE-webhookintegration", + "intro1": "Proxmox aviseringssystem använder mål som sendmail, Gotify, SMTP och, i versioner med stöd för det, webhook. Aktivering i Monitor registrerar ett webhook-mål. PVE-aviseringar som HA, replikering och säkerhetskopiering från gränssnittet kan då gå genom samma hanteringskedja.", + "intro2": "Målet visas i Proxmox under Datacenter → Aviseringar → Aviseringsmål:", + "imageAlt": "Proxmox VE:s webhookdialog med målet proxmenux-webhook, metoden POST, URL http://127.0.0.1:8008/api/notifications/webhook och en JSON-mall med escape title, escape message, escape severity, escape timestamp och json", + "imageCaption": "Webhookmålet i PVE. Gränssnittet använder värdens språk, spanska i exemplet. Samma fält gäller oavsett språk.", + "registeredIntro": "Det här registreras:", + "registeredItems": [ + "Metod och URL. POST http://127.0.0.1:8008/api/notifications/webhook när HTTPS är avstängt i Monitor. Med HTTPS används en separat lokal HTTP-mottagare på port 8009. Båda finns på samma värd.", + "Meddelandemall. JSON med PVE:s Handlebars-funktioner. PVE sparar mallen base64-kodad i konfigurationen. Avkodad blir den:", + "Matchare. Ett tillhörande matcher: proxmenux-matcher-block med mode all skickar alla PVE-aviseringar till målet.", + "Privat konfiguration. Installationen skriver blocket webhook: proxmenux-webhook i /etc/pve/priv/notifications.cfg, med den delade hemligheten base64-kodad. Det offentliga målet hänvisar till hemligheten för att skicka X-Webhook-Secret. Blocket är alltså inte tomt." + ], + "securityTitle": "Så skyddas mottagaren", + "securityIntro": "Webhookmottagaren på POST /api/notifications/webhook tillämpar olika säkerhetskontroller beroende på anropets källa:", + "securityItems": [ + "Lokala källor (127.0.0.1 / ::1). Frekvensgränser gäller, men kontroller av fjärrhemlighet, tidsstämpel och återuppspelning hoppas över. Även adresser på värdens egna gränssnitt räknas som lokala. PVE-målet använder loopback.", + "Fjärranrop. Utöver frekvensgränser kontrolleras hemligheten i X-Webhook-Secret, en tidsstämpel i X-ProxMenux-Timestamp eller JSON-kroppen, återuppspelning och eventuell lista med tillåtna IP-adresser. Hemligheten lagras i SQLite och som base64-kopia i /etc/pve/priv/notifications.cfg så PVE kan skicka rubriken." + ], + "practiceTitle": "I praktiken", + "practiceBody": "PVE-målet använder http://127.0.0.1:8008 utan HTTPS eller HTTP-port 8009 med HTTPS i Monitor. Externa integrationer på https://<monitor-host>:<port>/api/notifications/webhook måste skicka X-Webhook-Secret och aktuell tidsstämpel samt klara återuppspelnings- och IP-kontroller. Enbart hemligheten räcker inte.", + "actionsIntro": "Monitor hanterar målet genom tre åtgärder under Inställningar:", + "actionsItems": [ + "Konfigurera körs när aviseringar aktiveras och skapar posten i /etc/pve/notifications.cfg. Filen skrivs endast vid ändrat innehåll; de tre senaste kopiorna sparas i /usr/local/share/proxmenux/backups/pve-notifications/. Inget skrivs om /etc/pve inte är monterat. Efter omstart av pve-cluster registreras posten när det är tillgängligt igen.", + "Ta bort tar bort posten och behåller den tidigare säkerhetskopian av filen.", + "Läs konfiguration visar aktuella mål och matchare som PVE ser dem. Kontrollera här vilken väg som skickar till Monitor när flera aviseringsvägar finns." + ], + "clusterTitle": "Klusternoder", + "clusterBody": "/etc/pve/ delas mellan klusternoderna, inklusive målets URL och hemlighet. Varje nod anropar sin egen lokala mottagare: 127.0.0.1:8008 utan HTTPS eller HTTP-port 8009 med HTTPS. Kör Monitor på berörda noder och håll det delade målet förenligt med alla noders mottagarkonfiguration." + }, + "catalogue": { + "heading": "Händelsekatalog", + "intro": "Cirka sjuttio händelsetyper är indelade i elva kategorier. Aviseringspanelen visar en utfällbar del per kategori med val för varje händelse. Alla är aktiverade som standard om inget annat anges.", + "headerGroup": "Grupp", + "headerEvents": "Händelser", + "rows": [ + { + "group": "VM / CT", + "events": "vm_start, vm_start_warning, vm_stop, vm_shutdown, vm_fail, vm_restart, plus ct_*-ekvivalenter, migration_start, migration_complete, migration_warning, migration_fail, replication_complete, replication_fail." + }, + { + "group": "Säkerhetskopieringar", + "events": "backup_start, backup_complete, backup_warning, backup_fail, snapshot_complete, snapshot_fail." + }, + { + "group": "Resurser", + "events": "cpu_high, ram_high, temp_high, load_high." + }, + { + "group": "Lagring", + "events": "disk_space_low, disk_io_error, storage_unavailable, smart_test_complete, smart_test_failed." + }, + { + "group": "Nätverk", + "events": "network_down, network_latency." + }, + { + "group": "Säkerhet", + "events": "auth_fail, ip_block, firewall_issue, user_permission_change." + }, + { + "group": "Kluster", + "events": "split_brain, node_disconnect, node_reconnect." + }, + { + "group": "Tjänster", + "events": "system_startup, system_shutdown, system_reboot, system_problem, service_fail, oom_kill, system_mail." + }, + { + "group": "Health Monitor", + "events": "new_error, error_resolved, error_escalated, health_degraded, health_persistent, health_issue_new, health_issue_resolved." + }, + { + "group": "Uppdateringar", + "events": "update_summary, update_available, pve_update, update_complete, proxmenux_update." + }, + { + "group": "Maskinvara / GPU", + "events": "gpu_mode_switch, gpu_passthrough_blocked, pci_passthrough_conflict, ai_model_migrated." + } + ], + "burstNote": "Några burst_*-typer (burst_auth_fail, burst_ip_block, burst_disk_io med flera) finns bara i sändningshanteraren. De ersätter många enskilda händelser med en sammanfattning och har inga egna val i gränssnittet. De ärver inställningen från sin ursprungliga händelsetyp.", + "backupResults": { + "heading": "Säkerhetskopieringsresultat", + "intro": "En avisering om ett Proxmox-säkerhetskopieringsjobb anger hur jobbet slutade. Resultatet hämtas från Proxmox-rapporten och styr titeln, ikonen med Formaterade meddelanden och e-postens statusrad.", + "headerIcon": "Icon", + "headerResult": "Resultat", + "headerWhen": "När", + "rows": [ + { + "icon": "💾✅", + "result": "Säkerhetskopieringen är klar", + "when": "Säkerhetskopieringen av alla gäster i jobbet slutfördes utan varningar i rapporten." + }, + { + "icon": "💾⚠️", + "result": "Säkerhetskopiering avslutad med varningar", + "when": "Säkerhetskopieringen av alla gäster slutfördes och rapporten innehåller minst en varningsrad." + }, + { + "icon": "💾❌", + "result": "Säkerhetskopieringsfel rapporterat", + "when": "Säkerhetskopieringen av en gäst misslyckades eller jobbet stoppades av ett fel." + }, + { + "icon": "💾❔", + "result": "Säkerhetskopieringsresultat obekräftat", + "when": "Rapporten är ofullständig eller anger inte ett resultat för varje gäst." + } + ], + "items": [ + "Titeln identifierar jobbet. Den anger lagringen och, vid en enda gäst, dess typ, namn och ID. Ett misslyckat jobb namnger gästen som misslyckades.", + "Meddelandet listar varje gäst med resultat, storlek, varaktighet och arkiv, följt av jobbets totalsiffror.", + "Varningar och fel listas en gång. Upprepade rader visas bara en gång, med huvudorsaken först. Efter åtta rader anges resten som ett antal på slutraden; detaljerna finns kvar i Proxmox uppgiftslogg.", + "Ett jobb som misslyckas före den första gästen visar Proxmox angivna orsak, exempelvis en lagring som saknas.", + "Sammanfattningar behåller resultatet. Säkerhetskopieringen behåller sin resultatikon i sammanfattningen efter tysta timmar. Resultathändelser för säkerhetskopiering kringgår den dagliga sammanfattningen." + ] + } + }, + "history": { + "heading": "Historik", + "body1": "Varje faktiskt sändningsförsök registreras i SQLite-tabellen notification_history. Raden innehåller tidsstämpel (sent_at), kanal, händelsetyp, allvarlighetsgrad, titel, meddelandetext, flaggan success och tjänstens felmeddelande i error_message vid fel. Grupperade händelser visas som en rad med typen burst_*. Händelser som undertrycks av väntetiden mellan upprepningar registreras inte eftersom inget sändningsförsök sker.", + "body2": "Inställningar → Aviseringar har delen Aviseringshistorik, stängd som standard, med de senaste 20 posterna: resultat, kanal, datum och eventuellt fel. För varje daglig sammanfattning visas om något fanns att skicka. Sidan har ingen raderingsknapp; Audit & Report använder samma historik för att kontrollera kanalernas leverans.", + "body3": "Samma data finns via GET /api/notifications/history med valfria frågeparametrar limit, offset, severity och channel. Historiken kan raderas med DELETE /api/notifications/history." + }, + "api": { + "heading": "API-ändpunkter", + "headerEndpoint": "Ändpunkt", + "headerMethod": "Metod", + "headerUse": "Användning", + "rows": [ + { + "endpoint": "/api/notifications/settings", + "method": "GET / POST", + "use": "Läs eller skriv hela konfigurationen: kanaler, händelseval, AI-omskrivning och visningsnamn." + }, + { + "endpoint": "/api/notifications/test", + "method": "POST", + "use": "Skicka ett testmeddelande till en kanal: '{'\"channel\":\"telegram\"'}'." + }, + { + "endpoint": "/api/notifications/test-ai", + "method": "POST", + "use": "Formatera och skriv om en exempelhändelse utan att skicka den." + }, + { + "endpoint": "/api/notifications/provider-models", + "method": "POST", + "use": "Lista tillgängliga modeller för den valda AI-leverantören." + }, + { + "endpoint": "/api/notifications/send", + "method": "POST", + "use": "Skapa en händelse från en extern integration." + }, + { + "endpoint": "/api/notifications/history", + "method": "GET / DELETE", + "use": "Läs historiken med filter eller radera den." + }, + { + "endpoint": "/api/notifications/webhook", + "method": "POST", + "use": "Tar emot Proxmox-aviseringar. Lokala källadresser hoppar över fjärrautentisering men omfattas av frekvensgränser. Fjärranrop kontrolleras mot X-Webhook-Secret, tidsstämpel i X-ProxMenux-Timestamp eller JSON-kroppen, återuppspelning och eventuell lista över tillåtna IP-adresser." + }, + { + "endpoint": "/api/notifications/proxmox/setup-webhook", + "method": "POST", + "use": "Registrera Monitor som mål i /etc/pve/notifications.cfg." + }, + { + "endpoint": "/api/notifications/proxmox/cleanup-webhook", + "method": "POST", + "use": "Ta bort Monitor-målet från PVE:s aviseringskonfiguration." + }, + { + "endpoint": "/api/notifications/proxmox/read-cfg", + "method": "GET", + "use": "Visa aktuell aviseringskonfiguration som PVE ser den." + } + ] + }, + "whereNext": { + "heading": "Nästa steg", + "items": [ + { + "label": "AI-assistent", + "href": "/docs/monitor/ai-assistant", + "tail": " — leverantörer, modeller, instruktionslägen, språk och detaljnivå per kanal." + }, + { + "label": "Health Monitor", + "href": "/docs/monitor/health-monitor", + "tail": " — den största enskilda händelsekällan, med egna undertryckningsintervall per kategori." + }, + { + "label": "Arkitektur", + "href": "/docs/monitor/architecture", + "tailRich": " — hur SQLite-tabellerna (notification_last_sent, notification_history) och sändningstråden ingår i Monitor-processen." + }, + { + "label": "Åtkomst och autentisering", + "href": "/docs/monitor/access-auth", + "tailRich": " — hur API-token skapas för skript som anropar /api/notifications/send." + }, + { + "label": "Instrumentpanel → Systemloggar", + "href": "/docs/monitor/dashboard/system-logs", + "tail": " — direktvisningen av samma systemjournal som journalövervakningen läser." + } + ] + } +} From 178540a94f1ac3ad1e7e772c2c6e62488d94c78b Mon Sep 17 00:00:00 2001 From: Jonatan <190036+jcastro@users.noreply.github.com> Date: Sat, 17 Oct 2026 15:15:37 +0200 Subject: [PATCH 2/4] Use the translated integration heading --- web/app/[locale]/docs/monitor/integrations/page.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/app/[locale]/docs/monitor/integrations/page.tsx b/web/app/[locale]/docs/monitor/integrations/page.tsx index 2b0cbb6c..acd7a100 100644 --- a/web/app/[locale]/docs/monitor/integrations/page.tsx +++ b/web/app/[locale]/docs/monitor/integrations/page.tsx @@ -1070,8 +1070,8 @@ scrape_configs:

- Uptime Kuma - {" "}and other status checkers + {t("uptimeKuma.heading")} +

From c1fb72ed0ea486caca0105a217dfd78774619016 Mon Sep 17 00:00:00 2001 From: MacRimi <123239993+MacRimi@users.noreply.github.com> Date: Sun, 18 Oct 2026 17:16:51 +0200 Subject: [PATCH 3/4] Describe the Monitor pages as the code behaves --- web/messages/de/docs/monitor/access-auth.json | 22 ++++++------ .../de/docs/monitor/ai-assistant.json | 6 ++-- .../de/docs/monitor/api-reference.json | 4 +-- .../de/docs/monitor/architecture.json | 12 +++---- .../de/docs/monitor/dashboard/network.json | 2 +- .../de/docs/monitor/dashboard/security.json | 2 +- .../de/docs/monitor/dashboard/settings.json | 10 +++--- .../de/docs/monitor/dashboard/storage.json | 6 ++-- .../de/docs/monitor/dashboard/vms-lxcs.json | 12 +++---- .../de/docs/monitor/health-monitor.json | 12 +++---- web/messages/de/docs/monitor/index.json | 4 +-- .../de/docs/monitor/integrations.json | 2 +- .../de/docs/monitor/notifications.json | 8 ++--- web/messages/en/docs/monitor/access-auth.json | 22 ++++++------ .../en/docs/monitor/ai-assistant.json | 6 ++-- .../en/docs/monitor/api-reference.json | 4 +-- .../en/docs/monitor/architecture.json | 12 +++---- .../en/docs/monitor/dashboard/network.json | 2 +- .../en/docs/monitor/dashboard/security.json | 2 +- .../en/docs/monitor/dashboard/settings.json | 10 +++--- .../en/docs/monitor/dashboard/storage.json | 6 ++-- .../en/docs/monitor/dashboard/vms-lxcs.json | 12 +++---- .../en/docs/monitor/health-monitor.json | 12 +++---- web/messages/en/docs/monitor/index.json | 4 +-- .../en/docs/monitor/integrations.json | 2 +- .../en/docs/monitor/notifications.json | 8 ++--- web/messages/es/docs/monitor/access-auth.json | 34 +++++++++---------- .../es/docs/monitor/ai-assistant.json | 10 +++--- .../es/docs/monitor/api-reference.json | 22 ++++++------ .../es/docs/monitor/architecture.json | 14 ++++---- .../es/docs/monitor/audit-report/index.json | 2 +- .../es/docs/monitor/audit-report/policy.json | 2 +- .../es/docs/monitor/dashboard/hardware.json | 8 ++--- .../es/docs/monitor/dashboard/network.json | 2 +- .../es/docs/monitor/dashboard/security.json | 2 +- .../es/docs/monitor/dashboard/settings.json | 16 ++++----- .../es/docs/monitor/dashboard/storage.json | 16 ++++----- .../docs/monitor/dashboard/system-logs.json | 8 ++--- .../monitor/dashboard/vms-lxcs-updates.json | 12 +++---- .../es/docs/monitor/dashboard/vms-lxcs.json | 24 ++++++------- .../es/docs/monitor/health-monitor.json | 12 +++---- web/messages/es/docs/monitor/index.json | 4 +-- .../es/docs/monitor/integrations.json | 4 +-- .../es/docs/monitor/notifications.json | 30 ++++++++-------- web/messages/fr/docs/monitor/access-auth.json | 24 ++++++------- .../fr/docs/monitor/ai-assistant.json | 6 ++-- .../fr/docs/monitor/api-reference.json | 4 +-- .../fr/docs/monitor/architecture.json | 12 +++---- .../fr/docs/monitor/dashboard/network.json | 2 +- .../fr/docs/monitor/dashboard/security.json | 2 +- .../fr/docs/monitor/dashboard/settings.json | 10 +++--- .../fr/docs/monitor/dashboard/storage.json | 6 ++-- .../fr/docs/monitor/dashboard/vms-lxcs.json | 12 +++---- .../fr/docs/monitor/health-monitor.json | 12 +++---- web/messages/fr/docs/monitor/index.json | 4 +-- .../fr/docs/monitor/integrations.json | 2 +- .../fr/docs/monitor/notifications.json | 8 ++--- web/messages/it/docs/monitor/access-auth.json | 24 ++++++------- .../it/docs/monitor/ai-assistant.json | 6 ++-- .../it/docs/monitor/api-reference.json | 4 +-- .../it/docs/monitor/architecture.json | 12 +++---- .../it/docs/monitor/dashboard/network.json | 2 +- .../it/docs/monitor/dashboard/security.json | 2 +- .../it/docs/monitor/dashboard/settings.json | 10 +++--- .../it/docs/monitor/dashboard/storage.json | 6 ++-- .../it/docs/monitor/dashboard/vms-lxcs.json | 12 +++---- .../it/docs/monitor/health-monitor.json | 12 +++---- web/messages/it/docs/monitor/index.json | 4 +-- .../it/docs/monitor/integrations.json | 2 +- .../it/docs/monitor/notifications.json | 8 ++--- web/messages/pt/docs/monitor/access-auth.json | 24 ++++++------- .../pt/docs/monitor/ai-assistant.json | 6 ++-- .../pt/docs/monitor/api-reference.json | 4 +-- .../pt/docs/monitor/architecture.json | 12 +++---- .../pt/docs/monitor/dashboard/network.json | 2 +- .../pt/docs/monitor/dashboard/security.json | 2 +- .../pt/docs/monitor/dashboard/settings.json | 10 +++--- .../pt/docs/monitor/dashboard/storage.json | 6 ++-- .../pt/docs/monitor/dashboard/vms-lxcs.json | 12 +++---- .../pt/docs/monitor/health-monitor.json | 12 +++---- web/messages/pt/docs/monitor/index.json | 4 +-- .../pt/docs/monitor/integrations.json | 2 +- .../pt/docs/monitor/notifications.json | 8 ++--- web/messages/sk/docs/monitor/access-auth.json | 24 ++++++------- .../sk/docs/monitor/ai-assistant.json | 6 ++-- .../sk/docs/monitor/api-reference.json | 4 +-- .../sk/docs/monitor/architecture.json | 12 +++---- .../sk/docs/monitor/dashboard/network.json | 2 +- .../sk/docs/monitor/dashboard/security.json | 2 +- .../sk/docs/monitor/dashboard/settings.json | 10 +++--- .../sk/docs/monitor/dashboard/storage.json | 6 ++-- .../sk/docs/monitor/dashboard/vms-lxcs.json | 12 +++---- .../sk/docs/monitor/health-monitor.json | 12 +++---- web/messages/sk/docs/monitor/index.json | 4 +-- .../sk/docs/monitor/integrations.json | 2 +- .../sk/docs/monitor/notifications.json | 8 ++--- web/messages/sv/docs/monitor/access-auth.json | 24 ++++++------- .../sv/docs/monitor/ai-assistant.json | 6 ++-- .../sv/docs/monitor/api-reference.json | 4 +-- .../sv/docs/monitor/architecture.json | 12 +++---- .../sv/docs/monitor/dashboard/network.json | 2 +- .../sv/docs/monitor/dashboard/security.json | 2 +- .../sv/docs/monitor/dashboard/settings.json | 10 +++--- .../sv/docs/monitor/dashboard/storage.json | 6 ++-- .../sv/docs/monitor/dashboard/vms-lxcs.json | 12 +++---- .../sv/docs/monitor/health-monitor.json | 12 +++---- web/messages/sv/docs/monitor/index.json | 4 +-- .../sv/docs/monitor/integrations.json | 2 +- .../sv/docs/monitor/notifications.json | 8 ++--- 109 files changed, 473 insertions(+), 473 deletions(-) diff --git a/web/messages/de/docs/monitor/access-auth.json b/web/messages/de/docs/monitor/access-auth.json index c35012e4..305456c1 100644 --- a/web/messages/de/docs/monitor/access-auth.json +++ b/web/messages/de/docs/monitor/access-auth.json @@ -19,7 +19,7 @@ "reaching": { "heading": "Dashboard öffnen", "intro": "ProxMenux Monitor lauscht auf 0.0.0.0:8008. Drei übliche Zugriffswege:", - "outro": "Direktzugriff entspricht der Standard-systemd-Unit. Reverse-Proxy und Secure Gateway werden unten beschrieben. Client-IPs aus X-Forwarded-For werden nur mit PROXMENUX_TRUST_PROXY=1 und einem von Ihnen kontrollierten Proxy verwendet. X-Forwarded-Proto oder X-Forwarded-Host allein aktivieren dieses Vertrauen nicht; das Frontend erstellt API-URLs aus dem Ursprung des Browsers." + "outro": "Direktzugriff entspricht der Standard-systemd-Unit. Reverse-Proxy und Secure Gateway werden unten beschrieben. Das Vertrauen in Client-IPs aus X-Forwarded-For erfordert PROXMENUX_TRUST_PROXY=1 und einen von Ihnen kontrollierten Proxy. X-Forwarded-Proto oder X-Forwarded-Host allein aktivieren das Proxy-Vertrauen nicht. Auf den Ports 80/443 verwendet das Frontend relative /api/*-URLs; auf jedem anderen Port ruft es Port 8008 unter demselben Hostnamen auf." }, "firstLaunch": { "heading": "Ablauf beim ersten Start", @@ -117,8 +117,8 @@ "loginImageCaption": "Sobald die Authentifizierung konfiguriert ist, beginnt hier jeder Besuch des Dashboards. Wenn 2FA aktiviert ist, fragt der Bildschirm in einem zweiten Schritt nach dem akzeptierten Passwort nach dem 6-stelligen Code.", "loginFlowTitle": "Loginfluss", "twofaIntro": "Mit 2FA antwortet derselbe Aufruf zunächst mit requires_totp: true. Senden Sie ihn erneut mit dem sechsstelligen Code:", - "publicTitle": "Öffentlicher Zugriff und geschützte Prüfungen", - "publicIntro": "Anmeldung und Authentifizierungsstatus sind öffentlich. Die Ersteinrichtung ist möglich, solange Benutzername und Passwort fehlen, auch nach abgelehntem Schutz. Systemdaten benötigen bei aktiviertem Schutz eine Authentifizierung:", + "publicTitle": "Öffentliche Endpunkte (ohne Token)", + "publicIntro": "Anmeldung, Authentifizierungsstatus, Ersteinrichtung und der leichte Endpunkt /api/system-info sind öffentlich:", "publicItems": [ "/api/auth/login und /api/auth/status sind öffentlich. /api/auth/setup erstellt das erste Konto und lehnt das Überschreiben vorhandener Zugangsdaten ab.", "/api/system-info ist ein öffentlicher Endpunkt für grundlegende Systemdaten einschließlich health.status. Er verlangt kein Token. Auch /api/auth/status ist öffentlich und eignet sich für eine Erreichbarkeitsprüfung." @@ -146,7 +146,7 @@ }, { "asset": "2FA-TOTP-Geheimnis", - "algorithm": "Standard-TOTP (RFC 6238) mit Base32-kodiertem Geheimnis. Die acht Wiederherstellungscodes sind einmalig und werden als SHA-256-Hashes gespeichert.", + "algorithm": "Standard-TOTP (RFC 6238) mit Base32-kodiertem Geheimnis. Die acht Backup-Codes sind einmalig und werden als SHA-256-Hashes gespeichert.", "where": "auth.json → totp_secret + backup_codes[]" }, { @@ -243,17 +243,17 @@ } ], "backupTitle": "Warum Sicherungen wichtig sind", - "backupBody": "Bei Verlust des Authenticator-Geräts einen gesicherten Wiederherstellungscode verwenden oder eine zuvor eingerichtete App-Sicherung wiederherstellen. Cloud-Synchronisierung und lokale Exporte unterscheiden sich je nach App; prüfen Sie, ob die TOTP-Geheimnisse tatsächlich wiederhergestellt werden. Mit Root-Zugang zum Host ist die unten beschriebene Wiederherstellung ebenfalls möglich. Bewahren Sie eine separate, sichere Kopie auf.", + "backupBody": "Bei Verlust des Authenticator-Geräts einen gesicherten Backup-Code verwenden oder die App aus einer zuvor eingerichteten Sicherung wiederherstellen. Cloud-Synchronisierung und lokale Exporte unterscheiden sich je nach App; prüfen Sie, ob die gewählte Methode die TOTP-Geheimnisse tatsächlich wiederherstellt. Mit Root-Zugang zum Host ist die unten beschriebene Wiederherstellung ebenfalls möglich. Bewahren Sie eine separate, sichere Kopie auf.", "setupTitle": "Schritt-für-Schritt-Setup aus dem Dashboard", "setupImageAlt": "Einrichtungsbildschirm 2FA mit QR-Code und Backup-Codes", - "setupImageCaption": "Der 2FA-Dialog zeigt QR-Code, Base32-Geheimnis zur manuellen Eingabe und acht einmalige Wiederherstellungscodes. Vor dem Schließen kopieren; sie werden nicht erneut angezeigt.", + "setupImageCaption": "Der 2FA-Einrichtungsdialog zeigt QR-Code, Base32-Geheimnis zur manuellen Eingabe und nach der Überprüfung acht einmalige Backup-Codes. Die Codes vor dem Schließen des Dialogs kopieren; sie werden nicht erneut angezeigt.", "setupSteps": [ "Installieren Sie die Authenticator-App auf Ihrem Telefon (oder öffnen Sie Ihren Passwort-Manager). Eine der Apps aus der Tabelle oben. Sie müssen dies nur einmal tun - die gleiche app enthält codes für jeden dienst, den sie schützen.", "Am Dashboard anmelden mit Benutzername und Passwort.", - "Sicherheit öffnen und 2FA aktivieren wählen. Der Dialog zeigt QR-Code, Base32-Geheimnis und acht Wiederherstellungscodes.", + "Registerkarte Sicherheit öffnen in der Seitenleiste des Dashboards, dann auf 2FA aktivieren und Einrichtung starten klicken. Der Dialog zeigt QR-Code und manuellen Schlüssel; die acht Backup-Codes erscheinen, nachdem der Code überprüft wurde.", "Fügen Sie den Eintrag zur Authenticator-App hinzu:", - "Wiederherstellungscodes sichern. Alle acht in einem Passwortmanager, einer verschlüsselten Notiz oder einem sicheren Ausdruck aufbewahren. Jeder funktioniert einmal, wenn der Authenticator fehlt.", "Bestätigen Sie, indem Sie den aktuellen 6-stelligen Code aus der App in das Feld \"Verifizierungscode\" des Setup-Dialogs eingeben und senden. Codes aktualisieren alle 30 Sekunden, wenn es also abläuft, während Sie tippen, geben Sie einfach den nächsten ein.", + "Backup-Codes sichern. Nach der Überprüfung alle acht sicher in einem Passwortmanager, einer verschlüsselten Notiz oder einem sicheren Ausdruck aufbewahren. Jeder funktioniert einmal, wenn der Authenticator nicht verfügbar ist.", "Fertig. 2FA ist aktiv. Bei der nächsten Anmeldung wird zuerst das Passwort und danach der aktuelle sechsstellige Code abgefragt." ], "setupStep4Sub": [ @@ -261,17 +261,17 @@ "Manuelle Alternative, falls Scannen nicht möglich ist, etwa auf demselben Telefon: Konto hinzufügen → Einrichtungsschlüssel eingeben. Einen Namen wie Proxmox Monitor wählen, Base32-Geheimnis einfügen, Typ auf Zeitbasiert belassen und speichern." ], "testTitle": "Test vor dem Abmelden", - "testBody": "Die bestehende Sitzung geöffnet lassen und sofort in einem privaten Fenster eine neue Anmeldung testen. Bei abgelehntem Code zuerst Server- und Telefonuhr prüfen, bevor Sie die funktionierende Sitzung schließen. Bei bereits verlorenem Zugang Wiederherstellungscode verwenden oder auth.json in der Host-Shell bearbeiten.", + "testBody": "Die bestehende Sitzung geöffnet lassen und sofort nach der Einrichtung in einem privaten Fenster eine neue Anmeldung testen. Bei abgelehntem Code zuerst Server- und Telefonuhr prüfen, bevor Sie sich aus der funktionierenden Sitzung abmelden. Bei bereits verlorenem Zugang einen Backup-Code verwenden oder auth.json in der Host-Shell bearbeiten.", "lostTitle": "Verlorener Authentifikator", "lostIntro": "Drei Wiederherstellungswege, von geringem bis stärkerem Eingriff:", "lostItems": [ - "Wiederherstellungscode verwenden. Einen der acht gesicherten Codes im TOTP-Feld eingeben. Jeder funktioniert einmal; unbenutzte bleiben gültig. Danach 2FA in den Einstellungen neu einrichten, um acht neue Codes zu erhalten.", + "Backup-Code verwenden. Einen der acht gesicherten Codes im TOTP-Feld eingeben. Er funktioniert einmal; unbenutzte Codes bleiben gültig. Nach der Anmeldung Sicherheit öffnen, zuerst 2FA deaktivieren und danach 2FA aktivieren wählen, um acht neue Codes zu erhalten.", "Authenticator aus Cloud oder Sicherung wiederherstellen. Bei eingerichteter Cloud-Synchronisierung die App auf dem neuen Gerät installieren und anmelden, etwa Google, Microsoft, Authy, Apple Passwords über iCloud-Schlüsselbund, Ente oder 2FAS. Bei einer Exportdatei, etwa aus Aegis, Raivo oder FreeOTP+, die App installieren und die Datei importieren.", "Deaktivieren Sie 2FA von der Host-Shell. Wenn die vorherigen Optionen nicht verfügbar sind, bearbeiten Sie /root/.config/proxmenux-monitor/auth.json auf dem Proxmox-Host (Sie benötigen SSH oder Konsolenzugriff), setzen Sie totp_enabled auf false, speichern und starten Sie den Dienst neu:" ], "lostShellOutro": "Sie können sich nur mit Benutzername + Passwort anmelden und dann 2FA aus Einstellungen wieder aktivieren.", "disableTitle": "Deaktivieren Sie 2FA", - "disableBody": "Sicherheit öffnen und 2FA deaktivieren wählen. POST /api/auth/totp/disable benötigt Passwort und gültigen TOTP- oder Wiederherstellungscode. Danach werden Geheimnis und Wiederherstellungscodes gelöscht. Alten Eintrag auch in der App entfernen.", + "disableBody": "Sicherheit öffnen und 2FA deaktivieren wählen. POST /api/auth/totp/disable benötigt das aktuelle Passwort und einen gültigen TOTP- oder Backup-Code. Dabei werden TOTP-Geheimnis und Backup-Codes gelöscht. Den alten Eintrag auch in der Authenticator-App entfernen.", "rejectedTitle": "Der 6-stellige Code wird immer abgelehnt", "rejectedIntro": "TOTP ist zeitbasiert. Server- und Telefonuhr dürfen nur etwa 30 Sekunden voneinander abweichen. Zwei Prüfungen:", "rejectedItems": [ diff --git a/web/messages/de/docs/monitor/ai-assistant.json b/web/messages/de/docs/monitor/ai-assistant.json index eb3b0679..5bf8a164 100644 --- a/web/messages/de/docs/monitor/ai-assistant.json +++ b/web/messages/de/docs/monitor/ai-assistant.json @@ -14,7 +14,7 @@ }, "intro": { "title": "Standardmäßig aus, mit einem Schalter aktivieren", - "body": "Die KI-Umschreibung ist standardmäßig aus. Aktivieren Sie sie unter Einstellungen → Benachrichtigungen → Erweitert: KI-Verbesserung. Schlagen Kontextanreicherung oder Umschreibung fehl, wird die ursprüngliche Vorlage gesendet. Nach spätestens 25 Sekunden Wartezeit pro Umschreibung wird auf die Vorlage zurückgegriffen." + "body": "Die KI-Umschreibung ist standardmäßig aus. Aktivieren Sie sie unter Einstellungen → Benachrichtigungen → Erweitert: KI-Verbesserung. Schlagen Kontextanreicherung oder Umschreibung fehl, sendet der Dispatcher die ursprüngliche Vorlage. Umschreibungen in der Versandwarteschlange für Ereignisse haben ein Zeitlimit von 25 Sekunden; wird es erreicht, wird die Vorlage gesendet, statt weiter zu warten." }, "howItWorks": { "heading": "Wie es funktioniert", @@ -109,7 +109,7 @@ ], "customNote": "Der benutzerdefinierte Eingabeaufforderungsmodus verwendet eine feste Obergrenze von 500-Ausgabetoken unabhängig von der Detailstufe - die benutzerdefinierte Eingabeaufforderung ist in Ihrer Kontrolle und die Obergrenze schützt vor außer Kontrolle geratenen Antworten.", "sizingTitle": "Praktische Dimensionierung", - "sizingBody": "Schätzen Sie den Verbrauch als umgeschriebene Ereignisse × KI-Kanäle × Eingabe- und Ausgabe-Token je Aufruf. Beispiel: 50 Ereignisse × ein Kanal × (500 Eingabe + 300 Ausgabe) ergeben 40.000 Token täglich. Verbrauch und Kosten hängen von Modell, Kontext, Cache und Anbieterlimits ab. Detailstufe pro Kanal erklärt brief für Chats statt standard, bei weiterhin ausführlichen E-Mails." + "sizingBody": "Schätzen Sie den Verbrauch als umgeschriebene Ereignisse × KI-Kanäle × Eingabe- und Ausgabe-Token je Aufruf. Beispiel: 50 Ereignisse × ein Kanal × (2.000 Eingabe + 300 Ausgabe) ergeben etwa 115.000 Token täglich, da allein der Standard-Systemprompt rund 1.500 Token umfasst. Tatsächlicher Verbrauch und Kosten hängen von Modell, Kontext, Cache und Anbieterlimits ab. Der Abschnitt Detailstufe pro Kanal erklärt brief für Chats statt standard, bei weiterhin ausführlichen E-Mail-Berichten." }, "providers": { "heading": "KI-Anbieter", @@ -142,7 +142,7 @@ "items": [ "API-Schlüssel: console.anthropic.com/settings/keys", "Beispiele aus der mitgelieferten Modellliste: claude-haiku-4-5-20251001, claude-sonnet-4-6, claude-opus-4-6.", - "Mitgelieferte Empfehlung: claude-haiku-4-5-20251001. Dieser genaue Snapshot ist als Empfehlung konfiguriert; die älteren Claude-3.5-Einträge stehen nicht mehr in der mitgelieferten Liste." + "Mitgelieferte Empfehlung: claude-haiku-4-5-20251001, ein fest angehefteter Snapshot statt eines wechselnden Alias." ] }, "gemini": { diff --git a/web/messages/de/docs/monitor/api-reference.json b/web/messages/de/docs/monitor/api-reference.json index 03b616d5..8581cd36 100644 --- a/web/messages/de/docs/monitor/api-reference.json +++ b/web/messages/de/docs/monitor/api-reference.json @@ -162,7 +162,7 @@ { "endpoint": "/api/vms//backup", "method": "POST", - "use": "Erstellt eine vzdump-Sicherung einer VM oder eines LXC. Optionale, an den Speicher anzupassende Felder: storage (PVE-Ziel), mode (snapshot, suspend oder stop), compress (zstd, lzo, gzip oder none), protected (true oder false), notes, notification (auto, always, failure oder never) und pbs_change_detection (default, legacy oder data). Liefert die UPID des PVE-Tasks." + "use": "Erstellt eine vzdump-Sicherung einer VM oder eines LXC. Felder im Body, alle optional, sofern die Vorgaben zum Speicheraufbau passen: storage (ein PVE-Speicher), mode (snapshot, suspend oder stop), compress (zstd, lzo, gzip oder none), protected (true oder false), notes und pbs_change_detection (default, legacy oder data). Liefert die UPID des PVE-Tasks." }, { "endpoint": "/api/vms//backups", @@ -286,7 +286,7 @@ { "endpoint": "/api/storage/smart//test", "method": "POST", - "use": "Startet einen SMART-Selbsttest. Anfrageschema: '{'\"type\":\"short\"|\"long\"'}'." + "use": "Startet einen SMART-Selbsttest. Anfrageschema: '{'\"test_type\":\"short\"|\"long\"'}'." }, { "endpoint": "/api/storage/smart/schedules", diff --git a/web/messages/de/docs/monitor/architecture.json b/web/messages/de/docs/monitor/architecture.json index 385a3e2a..be93e6be 100644 --- a/web/messages/de/docs/monitor/architecture.json +++ b/web/messages/de/docs/monitor/architecture.json @@ -73,13 +73,13 @@ "intro": "Das AppImage enthält ein beim Start eingehängtes Dateisystem. AppRun im Wurzelverzeichnis bereitet die Umgebung vor und startet flask_server.py:", "consequencesIntro": "Zwei Konsequenzen dieses Layouts:", "consequences": [ - "Mitgelieferte Python-Umgebung. Interpreter und Pakete liegen im AppImage; eine Installation in das System-Python entfällt. Die Anwendung nutzt weiterhin Kernel-Schnittstellen und externe Host-Werkzeuge.", + "Mitgelieferte Python-Pakete. Die Python-Pakete liegen im AppImage und laufen mit dem Python-Interpreter des Hosts, 3.11 (PVE 8) oder 3.13 (PVE 9), ohne dass etwas in das System-Python des Hosts installiert wird. Die Anwendung nutzt weiterhin Kernel-Schnittstellen des Hosts und externe Host-Werkzeuge.", "Hardware-Clients sind enthalten. Mitgeliefert werden ipmitool, lm-sensors und upsc. Messwerte erfordern unterstützte Hardware, Sensorzugriff und für USV-Daten einen eingerichteten NUT-Server." ] }, "flask": { "heading": "Struktur der Flask-Anwendung", - "intro": "flask_server.py erstellt eine Flask(__name__)-Instanz mit begrenztem CORS, registriert neun Blueprints direkt und initialisiert Terminalrouten. Die Tabelle zeigt Hauptmodule; Audit, VM-Sicherung und PBS sind ebenfalls registriert. PVE-Vorwärmer laufen nur auf PVE-Hosts.", + "intro": "flask_server.py erstellt eine Flask(__name__)-Instanz mit eingeschränkten CORS-Ursprüngen, registriert zehn Blueprints direkt und initialisiert Terminalrouten. Die Tabelle zeigt die Hauptmodule; die Blueprints für PBS, Monitor-Links, Audit und VM-Sicherung sind ebenfalls registriert. PVE-spezifische Vorwärmer laufen nur auf PVE-Hosts.", "headerBlueprint": "Blueprint / Modul", "headerPrefix": "Routenpräfix", "headerOwns": "Zuständigkeit", @@ -242,10 +242,10 @@ "Updates: ausstehende Paketaktualisierungen und Sicherheitspatches.", "Protokolle: anhaltende Muster, Spitzen und Kaskaden im Systemjournal.", "Arbeitsspeicher: OOM-Killer-Aktivität und anhaltender Speicherdruck.", - "Temperatur: CPU- und Datenträgerwerte im Vergleich zu Überwachungsschwellen; verfügbare Sensoren hängen von der Hardware ab.", + "CPU: Auslastung und CPU-Temperatur im Vergleich zu den konfigurierbaren Schwellen; verfügbare Sensoren hängen von der Hardware ab.", "Sicherheit: Anmeldefehler, Sperrereignisse und Fail2Ban-Jail-Zustand." ], - "afterIntro": "Befunde verwenden stabile error_key, Kategorie und Schweregrad. Vorhandene Zeilen in errors erhalten last_seen und Zähleraktualisierungen statt Duplikaten. Der Benachrichtigungsversand hat eigene Fingerabdrücke und Wartezeiten.", + "afterIntro": "Befunde verwenden stabile error_key, Kategorie und Schweregrad. Vorhandene Einträge in errors werden an Ort und Stelle aktualisiert (last_seen, Schweregrad, Grund), statt dupliziert zu werden. Der Benachrichtigungsversand hat zudem eigene Regeln für Fingerabdrücke und Wartezeiten.", "cycleEnd": "Die Bereinigung kann alte Fehler anhand der Unterdrückungsdauer je Kategorie und Zustandsregeln auflösen, verwaiste Einträge entfernter Ressourcen entfernen und events über 30 Tage löschen. Kategorien erklärt Dashboard → Health Monitor." }, "notifications": { @@ -264,9 +264,9 @@ "intro": "Die Registerkarte Terminal verbindet einen schlanken xterm.js-Client über WebSocket mit einem serverseitigen PTY. Es gibt zwei Betriebsarten:", "items": [ "HTTP-Modus, Standard: Der integrierte Flask-Server verarbeitet mit flask-sock WebSocket-Upgrade-Anfragen.", - "HTTPS-/WSS-Modus: Verwendet gevent.pywsgi.WSGIServer mit geventwebsocket.handler.WebSocketHandler für WebSocket über TLS." + "HTTPS-/WSS-Modus: Der TLS-Server verwendet gevent.pywsgi.WSGIServer mit dessen Standard-Handler; flask-sock verarbeitet WebSocket-Verbindungen über TLS." ], - "outro": "Terminalprozesse erben User=root. Bei aktiver Authentifizierung braucht WebSocket ein kurzlebiges Einmalticket vom authentifizierten Ticket-Endpunkt mit Verwaltungsrechten. Ist Authentifizierung deaktiviert oder abgelehnt, folgt der Verbindungsaufbau diesem unauthentifizierten Modus.", + "outro": "Terminal-Kindprozesse erben User=root vom Dienst. Das Öffnen eines WebSockets erfordert ein kurzlebiges Einmalticket vom authentifizierten Terminal-Ticket-Endpunkt mit Verwaltungsrechten.", "proxyNote": "Beim Reverse-Proxy muss WebSocket-Weiterleitung mit den Headern Upgrade und Connection funktionieren. Das Terminal benötigt diese Weiterleitung." }, "proxy": { diff --git a/web/messages/de/docs/monitor/dashboard/network.json b/web/messages/de/docs/monitor/dashboard/network.json index 4ddd73fb..0196266b 100644 --- a/web/messages/de/docs/monitor/dashboard/network.json +++ b/web/messages/de/docs/monitor/dashboard/network.json @@ -162,7 +162,7 @@ } ], "reportTitle": "Netzwerklatenzbericht (PDF)", - "reportIntro": "Beide Modi haben neben der Zielauswahl eine Schaltfläche Bericht. Sie erzeugt ein PDF der Messungen als möglichen Anhang für eine Störungsmeldung beim Internetanbieter.", + "reportIntro": "Beide Modi haben neben der Zielauswahl eine Schaltfläche Bericht. Sie öffnet einen druckbaren Bericht der Messungen; speichern Sie ihn über den Druckdialog des Browsers als PDF und hängen Sie ihn an eine Störungsmeldung beim Internetanbieter an.", "reportPreviewAlt": "Erste PDF-Seite des Latenzberichts mit Zusammenfassung, Messanzeige, Statistik, Diagramm und Schwellenwerten", "reportPreviewCaption": "Die erste Seite enthält Zusammenfassung, Messanzeige, Hauptstatistik, Latenzverlauf und Schwellenwerte. Ab Seite 2 folgen die Messwerttabelle und die Methodik.", "downloadLabel": "Beispiel-Latenzbericht herunterladen (PDF)", diff --git a/web/messages/de/docs/monitor/dashboard/security.json b/web/messages/de/docs/monitor/dashboard/security.json index 9a626db3..2ba938e6 100644 --- a/web/messages/de/docs/monitor/dashboard/security.json +++ b/web/messages/de/docs/monitor/dashboard/security.json @@ -136,7 +136,7 @@ "configCaption": "Jail sshd bearbeiten: Wählen Sie einen niedrigeren Wert für Max Retries, wenn SSH nur aus Ihrem Subnetz genutzt wird, oder verlängern Sie Ban Time für ein öffentlich erreichbares Dashboard.", "outro": "Die Anleitung Installation, Konfiguration und Deinstallation behandelt auch die manuelle Installation, die Änderung von SSH MaxAuthTries und das Protokoll proxmenux-auth.log. Sie finden sie unter ProxMenux → Sicherheit → Fail2Ban.", "calloutTitle": "Ohne Fail2Ban sperrt dieser Mechanismus keine IPs", - "calloutBody": "ProxMenux Monitor prüft die von Fail2Ban gesperrten IPs auf Anwendungsebene, bevor Flask-Anfragen verarbeitet werden. Es fragt fail2ban-client ab und speichert das Ergebnis 30 Sekunden zwischen; eine SQL-Sperrtabelle wird nicht gelesen. Ohne Fail2Ban werden fehlgeschlagene Anmeldungen in proxmenux-auth.log protokolliert, dieser Mechanismus sperrt dann aber keine IPs." + "calloutBody": "ProxMenux Monitor prüft die im Fail2Ban-Jail proxmenux gesperrten IPs auf Anwendungsebene, bevor Flask-Anfragen verarbeitet werden, und speichert das Ergebnis 30 Sekunden zwischen. Ohne Fail2Ban werden fehlgeschlagene Anmeldungen in proxmenux-auth.log protokolliert und der Login-Endpunkt ist auf 5 Versuche pro IP alle 5 Minuten begrenzt, es wird aber keine IP gesperrt." }, "lynis": { "heading": "Lynis-Sicherheitsprüfung", diff --git a/web/messages/de/docs/monitor/dashboard/settings.json b/web/messages/de/docs/monitor/dashboard/settings.json index 77cefc51..56d6cb32 100644 --- a/web/messages/de/docs/monitor/dashboard/settings.json +++ b/web/messages/de/docs/monitor/dashboard/settings.json @@ -76,7 +76,7 @@ }, "thresholds": { "heading": "Health-Monitor-Schwellenwerte", - "intro": "Die vorige Karte regelt die Ruhezeit nach einer Unterdrückung; diese bestimmt den Auslösewert einer Warnung. Die meisten Schwellenprüfungen bieten anpassbare Werte für Warnung und Kritisch. Die Tabelle erklärt Ausnahmen wie die kombinierte Swap-Regel und den aktuellen RAM-Detektor.", + "intro": "Die vorige Karte regelt die Ruhezeit nach einer Unterdrückung; diese bestimmt den Auslösewert einer Warnung. Die meisten Schwellenprüfungen bieten anpassbare Werte für Warnung und Kritisch. Die Tabelle unten erklärt Ausnahmen wie die kombinierte Swap-Regel.", "whatForTitle": "Wozu es dient", "whatForIntro": "Die Standardwerte sind ein Ausgangspunkt, aber jede Umgebung hat eigene Betriebsbedingungen:", "whatForItems": [ @@ -85,7 +85,7 @@ "Wählen Sie Temperaturschwellen anhand der Laufwerksspezifikationen und tatsächlichen Bedingungen. Passive oder aktive Kühlung allein bestimmt keine allgemein niedrigere oder höhere sichere Grenze.", "Ein stark virtualisierter Host kann bei Builds CPU-Spitzen erreichen, ohne für jeden 80-%-Peak zu warnen; anhaltende Überlast muss weiter gemeldet werden." ], - "whatForOutro": "Unterstützte Änderungen gelten bei der nächsten Prüfung. Der Health Monitor liest /usr/local/share/proxmenux/health_thresholds.json in jedem Zyklus ohne Neustart. Einige Anzeigen wie die Datenträgertemperatur verwenden diese Werte; manche Kapazitätsbalken haben eigene Grenzen. Die RAM-Zeile beschreibt eine aktuelle Ausnahme.", + "whatForOutro": "Unterstützte Schwellenänderungen gelten bei der nächsten Prüfung. Der Health Monitor liest /usr/local/share/proxmenux/health_thresholds.json in jedem Zyklus ohne Neustart. Ausgewählte Anzeigen, darunter die Datenträgertemperatur, verwenden diese Werte; manche Kapazitätsbalken behalten eigene visuelle Grenzen.", "coloursTitle": "Statusfarben für Warnung und Kritisch", "coloursIntro": "Widgets mit dem konfigurierten Paar Warnung/Kritisch verwenden die drei folgenden Zustände. Andere Anzeigen, etwa PVE-Kapazitätsbalken, haben eigene Grenzen; ihre Farbe allein belegt keine Health-Monitor-Warnung.", "headerColour": "Farbe", @@ -125,7 +125,7 @@ "section": "Arbeitsspeicher", "warning": "85 %", "critical": "95 %", - "gates": "RAM-Druck des Hosts. Der konfigurierbare Standard zeigt Kritisch bei 95 %, doch der aktuelle Detektor verwendet fest 90 % über längere Zeit; diese Einstellung ändert diesen Laufzeitzweig derzeit nicht." + "gates": "RAM-Druck des Hosts." }, { "section": "Swap (nur kritischer Schwellenwert)", @@ -185,7 +185,7 @@ "section": "PVE-Speicher", "warning": "85 %", "critical": "95 %", - "gates": "Von PVE verwaltete Speicher: LVM, LVM-thin, ZFS-pool, RBD/Ceph und PBS. Nicht alle sind Blockspeicher." + "gates": "Nur PVE-Speicher der Typen LVM, LVM-thin, ZFS-pool, RBD, CephFS und PBS. Verzeichnis-, NFS- und CIFS-Speicher deckt die Zeile zum Host-Speicherplatz ab." }, { "section": "ZFS-Pool", @@ -218,7 +218,7 @@ "toggleTitle": "Benachrichtigungsschalter bei aktiver Erkennung", "toggleBody": "Der Schalter lxc_updates_available je Kanal unter Benachrichtigungen → Dienste erscheint nur bei aktiver Erkennung. Beim Abschalten verschwindet die Zeile in allen Kanälen. Die Datenbank bewahrt die Einstellung; beim Einschalten kehrt der bisherige Wert zurück.", "purgeTitle": "Was beim Abschalten der Erkennung gelöscht wird", - "purgeBody": "Das Abschalten entfernt sofort alle type=lxc-Einträge aus /usr/local/share/proxmenux/managed_installs.json. Hardware zeigt beim nächsten Neuladen keine LXC-Updatezähler mehr. Nach dem Einschalten füllt der nächste Erkennungszyklus den Bestand erneut; ein manueller API-Aufruf kann dies vorziehen." + "purgeBody": "Das Abschalten entfernt sofort alle type=lxc-Einträge aus /usr/local/share/proxmenux/managed_installs.json. Die LXC-Updatezähler auf der Registerkarte VMs und LXCs verschwinden beim nächsten Neuladen des Dashboards. Nach dem Einschalten füllt der nächste Erkennungszyklus den Bestand erneut; ein manueller API-Aufruf kann dies vorziehen." }, "storageExclusions": { "heading": "Ausschlüsse von Remote-Speicher", diff --git a/web/messages/de/docs/monitor/dashboard/storage.json b/web/messages/de/docs/monitor/dashboard/storage.json index e3f1c1a1..3f75c928 100644 --- a/web/messages/de/docs/monitor/dashboard/storage.json +++ b/web/messages/de/docs/monitor/dashboard/storage.json @@ -70,7 +70,7 @@ "items": [ "Gerätepfad — /dev/sda, /dev/nvme0n1.", "Typkennzeichnung — SATA / NVMe und passendes Symbol.", - "Systemkennzeichnung — orange Markierung für erkannte Betriebssystemlaufwerke. Die Erkennung verwendet die Einhängepunkte / und /boot; zugehörige Laufwerke erhalten System. Eine fehlende Markierung beweist nicht, dass das Laufwerk gefahrlos gelöscht oder anders verwendet werden kann.", + "Systemkennzeichnung — orange Markierung für Laufwerke, die der Host verwendet: Systemeinhängepunkte (/, /boot, /usr, /var…), aktiver Swap, ZFS-Poolmitglieder, physische LVM-Volumes, aktive RAID-Mitglieder oder Bezeichnungen von Systempartitionen. Eine fehlende Markierung beweist nicht, dass das Laufwerk gefahrlos gelöscht oder anders verwendet werden kann.", "Modell — Hersteller und Modell aus smartctl -i.", "Kapazität — in gut lesbaren Einheiten.", "Temperatur — aktueller Wert in °C, eingefärbt nach Laufwerkstyp; NVMe verwendet höhere Schwellen als SATA.", @@ -112,7 +112,7 @@ "pdfPreviewAlt": "Erste Seite des SMART-Berichts mit Zusammenfassung, PASSED-Ring und Laufwerksinformationen", "pdfPreviewCaption": "Erste Seite: Zusammenfassung, PASSED-Ring und vollständige Laufwerksinformationen. Das Beispiel-PDF enthält SSD-Verschleiß, alle SMART-Attribute und den Testverlauf.", "pdfDownloadLabel": "Beispiel-SMART-Bericht herunterladen (PDF)", - "pdfSectionsIntro": "Der Bericht hat sechs Hauptabschnitte:", + "pdfSectionsIntro": "Der Bericht enthält diese Hauptabschnitte:", "pdfSections": [ "Zusammenfassung — PASSED/FAILED, verständliche Zustandsbewertung — in Ordnung, Verschleiß oder Ausfall — und vier Angaben: Berichtszeit, letzter Testtyp, Ergebnis und geprüfte Attribute.", "Laufwerksinformationen — Modell, Seriennummer, Kapazität, Typ HDD/SSD/NVMe, Familie, Bauform, Schnittstelle (SATA 3.3 · 6.0 Gb/s, …), TRIM, Temperatur und optimale Schwelle, Betriebsstunden, Einschaltzyklen, SMART, ausstehende/neu zugewiesene Sektoren und CRC-Fehler.", @@ -127,7 +127,7 @@ "historyImageCaption": "SMART-Testverlauf des Laufwerks. Jede Zeile zeigt Typ, Zeit, Alter, Markierung des neuesten Tests sowie Download der smartctl-Ausgabe und Löschen.", "historyIntro": "Aufbewahrte abgeschlossene kurze und erweiterte Tests des Laufwerks. Jeder Eintrag enthält die ursprüngliche smartctl-Ausgabe und die von Monitor für das Dashboard ausgewerteten Felder. Aktionen je Zeile:", "historyItems": [ - "Herunterladen — speichert den JSON-Snapshot mit den vom Bericht verwendeten smartctl -a-Daten. Hilfreich, wenn der Herstellersupport die ursprünglichen Diagnosefelder benötigt.", + "Herunterladen — speichert den JSON-Snapshot dieses Tests (Ausgabe von smartctl -a --json oder bei NVMe nvme smart-log, wenn smartctl fehlschlägt). Hilfreich, wenn der Herstellersupport die ursprünglichen Diagnosefelder benötigt.", "Löschen — entfernt einen Test manuell aus dem Verlauf. Die Aufbewahrung im Zeitplan (letzte 5 / 10 / 20) löscht automatisch die ältesten." ], "scheduleTitle": "Registerkarte 4 — Zeitplan", diff --git a/web/messages/de/docs/monitor/dashboard/vms-lxcs.json b/web/messages/de/docs/monitor/dashboard/vms-lxcs.json index 70551ce1..53ab3b16 100644 --- a/web/messages/de/docs/monitor/dashboard/vms-lxcs.json +++ b/web/messages/de/docs/monitor/dashboard/vms-lxcs.json @@ -1,16 +1,16 @@ { "meta": { "title": "ProxMenux Monitor — Dashboard: VMs und LXCs | ProxMenux-Dokumentation", - "description": "Inventar aller Gäste mit CPU, Arbeitsspeicher und Datenträgern in Echtzeit. Die Details zeigen Konfiguration, Ressourcen, Sicherungen, aktuelle Proxmox-Protokollergebnisse, Notizen und Starten / Herunterfahren / Neustart / Stopp." + "description": "Die Registerkarte VMs und LXCs listet alle Gäste des Hosts mit CPU-, Arbeitsspeicher- und Datenträgernutzung in Echtzeit. Die Details je Gast zeigen Konfiguration, Ressourcen, Sicherungen, das Konsolenprotokoll von OCI-Containern, Notizen und die Steuerung Starten / Herunterfahren / Neustart / Stopp erzwingen." }, "header": { "title": "Dashboard: VMs und LXCs", - "description": "Vollständiges Gastinventar des Knotens: vier Kennzahlen oben, eine sortierbare VM-/LXC-Liste darunter und Gastdetails mit Konfiguration, Ressourcen, Sicherungen, Protokollen sowie Starten/Herunterfahren/Neustart/Stopp.", + "description": "Vollständiges Gastinventar des Knotens: vier Kennzahlen oben, eine sortierbare Liste aller VMs und LXCs darunter und Gastdetails mit Konfiguration, Ressourcen, Sicherungen, dem Konsolenprotokoll von OCI-Containern sowie den vier Lebenszyklus-Steuerungen (Starten / Herunterfahren / Neustart / Stopp erzwingen).", "section": "ProxMenux Monitor · Übersicht" }, "intro": { "title": "Steuerung der Gäste", - "body": "Hier steuern Sie den Lebenszyklus der Gäste. Aktionen laufen nach ausdrücklicher Bestätigung über POST /api/vms/<vmid>/control und aktualisieren die Gastzeile. Erzwungenes Ausschalten erfordert die eigene Schaltfläche Stopp erzwingen." + "body": "Hier steuern Sie den Lebenszyklus der Gäste. Lebenszyklusaktionen laufen über POST /api/vms/<vmid>/control; bei Neustart und Stopp erzwingen geben Sie zur Bestätigung die VMID ein, und die Antwort wird in der Gastzeile angezeigt. Erzwungenes Ausschalten erfordert die eigene Schaltfläche Stopp erzwingen." }, "topRow": { "heading": "Obere Reihe: vier Stat-Karten", @@ -186,9 +186,9 @@ "source": "PVE RRD-Daten (pvesh get /nodes/<node>/qemu/<id>/rrddata) werden zu einer chartfreundlichen Form verdichtet." }, { - "section": "Aktuelle Proxmox-Protokollergebnisse", - "endpoint": "/api/vms//logs", - "source": "pvesh get /nodes/<node>/<qemu|lxc>/<vmid>/log --start 0 --limit 1000. Bei Befehlsfehlern wird eine leere Liste zurückgegeben; dies sind keine vollständigen Systemprotokolle aus dem Gast." + "section": "OCI-Konsolenprotokoll (Registerkarte Logs)", + "endpoint": "/api/lxc//console-log", + "source": "Konsolenausgabe des Hauptprozesses des Images, gelesen aus /var/log/proxmenux/oci/<vmid>.console.log auf dem Host. Nur für OCI-Container angezeigt." }, { "section": "Backups für Gäste verfügbar", diff --git a/web/messages/de/docs/monitor/health-monitor.json b/web/messages/de/docs/monitor/health-monitor.json index f3ddf6d6..6f3d16d5 100644 --- a/web/messages/de/docs/monitor/health-monitor.json +++ b/web/messages/de/docs/monitor/health-monitor.json @@ -68,7 +68,7 @@ { "category": "Speicher", "checks": "Proxmox-Speicher, Root-Dateisystem", - "events": "Konfigurierte Belegungsschwellen auf Root oder anderen überwachten Dateisystemen überschritten (standardmäßig 85% Warnung / 95% kritisch); NFS-Freigabe offline; CIFS-Anmeldung fehlgeschlagen; LVM-thin-Pool voll." + "events": "Konfigurierte Belegungsschwellen auf Root oder anderen überwachten Dateisystemen überschritten (standardmäßig 85% Warnung / 95% kritisch); nicht verfügbare PVE-Speicher; hängende oder unerwartet schreibgeschützte NFS-/CIFS-Einhängungen; LVM-thin- und andere Pool-Speicher, die dieselben Schwellen überschreiten." }, { "category": "Platten und SMART", @@ -98,7 +98,7 @@ { "category": "Systemaktualisierungen", "checks": "Ausstehende Updates, Sicherheitsupdates, Kernel / PVE-Version, Systemalter", - "events": "Ausstehende Sicherheits- oder Kernelupdates; lange nicht aktualisiertes System. Bei verfügbaren Updates erscheint in der Übersicht Jetzt aktualisieren. Die Schaltfläche startet den vollständigen ProxMenux-Updateablauf. Beim Schließen wird der Zustand mit ?refresh=1 neu abgefragt, damit die Anzeige ohne Warten auf den nächsten Zyklus aktualisiert wird." + "events": "Ausstehende Sicherheits- oder Kernelupdates; lange nicht aktualisiertes System. Die Kategorie Updates im Dialog zum Gesundheitszustand zeigt bei ausstehenden Updates die Schaltfläche Jetzt aktualisieren. Sie startet den vollständigen ProxMenux-Updateablauf direkt im Dialog; beim Schließen wird der Zustand mit ?refresh=1 neu abgefragt, damit die Anzeige den neuen Zustand ohne Warten auf den nächsten Zyklus widerspiegelt." }, { "category": "Sicherheit & Zertifikate", @@ -158,7 +158,7 @@ }, "dismiss": { "heading": "Warnungen bestätigen und die Unterdrückungsdauer", - "intro": "Manche Ereignisse bleiben lange bestehen: Systemupdates: Updates verfügbar gilt bis zur Aktualisierung des Hosts. Dafür ist nicht alle fünf Minuten eine neue Nachricht nötig. Jetzt aktualisieren in der Übersicht behebt diesen Fall direkt. Für andere Fälle oder aufgeschobene Updates bietet die Zustandsüberwachung zwei verbundene Möglichkeiten zum Unterdrücken von Meldungen:", + "intro": "Manche Ereignisse bleiben naturgemäß lange bestehen: Systemupdates: Updates verfügbar gilt bis zur Aktualisierung des Hosts, und eine Nachricht alle fünf Minuten über eine ganze Woche ist nicht erwünscht. Die Schaltfläche Jetzt aktualisieren in der Kategorie Updates des Dialogs zum Gesundheitszustand behebt genau diesen Fall direkt. Für andere Fälle oder aufgeschobene Updates bietet die Zustandsüberwachung zudem zwei verbundene Möglichkeiten zum Unterdrücken von Meldungen:", "step1": "Einzelnes Ereignis bestätigen im Dialog. Das Menü bietet 24 Stunden, 7 Tage oder Dauerhaft, unabhängig vom Kategoriestandard. Die Auswahl sendet POST /api/health/acknowledge mit error_key und gewählten suppression_hours (-1 für dauerhaft). Das Ereignis wechselt mit Zeitstempel acknowledged_at in die unterdrückte Liste.", "dropdownImageAlt": "Menü zum Unterdrücken einer Warnung: 24 Stunden, 7 Tage oder dauerhaft", "dropdownImageCaption": "Die gewählte Dauer gilt nur für diese Warnung; ohne Einzelauswahl greift der Kategoriestandard. Dauerhafte Bestätigungen erhalten die bernsteinfarbene Markierung Dauerhaft und lösen normalerweise nicht erneut aus. Eine Ausnahme ist die unten beschriebene kritische CPU-Temperatur.", @@ -187,7 +187,7 @@ }, { "finding": "ZFS pool DEGRADED / FAULTED", - "why": "ZFS-Poolbelegungsprüfungen erlauben ausdrücklich die Bestätigung. Andere Poolbefunde folgen ihrem eigenen Kennzeichen. Bestätigen repariert keinen beeinträchtigten oder ausgefallenen Pool." + "why": "Befunde zum ZFS-Poolzustand (DEGRADED, FAULTED, UNAVAIL) erlauben ausdrücklich die Bestätigung, ebenso Prüfungen der Poolbelegung. Bestätigen repariert keinen beeinträchtigten oder ausgefallenen Pool." }, { "finding": "Festplatten-I/O-Fehler mit SMART FAILED", @@ -289,7 +289,7 @@ }, "rest": { "heading": "REST-Endpunkte", - "intro": "Die Dialogaktionen sind per API für Skripte, Dashboards und Chatbots verfügbar. Bei aktiver Monitor-Authentifizierung benötigen Aufrufe ein gültiges Bearer-Token aus Anmeldung oder API-Tokenverwaltung. Änderungen wie Bestätigen, Speichern oder Bereinigen verwaister Fehler erfordern full_admin; read_only erhält 403. Bei deaktivierter oder abgelehnter Authentifizierung erlauben diese Prüfungen Zugriff ohne Token.", + "intro": "Die Dialogaktionen sind auch per API für Skripte, eigene Dashboards und Chatbots verfügbar. Aufrufe benötigen ein gültiges Bearer-Token aus Anmeldung oder API-Tokenverwaltung. Änderungen wie das Bestätigen von Warnungen, das Speichern von Unterdrückungseinstellungen oder das Bereinigen verwaister Fehler erfordern den Bereich full_admin; read_only erhält 403.", "headerEndpoint": "Endpunkt", "headerMethod": "Methode", "headerUse": "Verwendung", @@ -297,7 +297,7 @@ { "endpoint": "/api/health", "method": "GET", - "use": "Leichte Zustandsabfrage mit JSON-Feldern status, timestamp und version. Für Schlüsselwortprüfungen in Uptime Kuma geeignet; bei aktiver Monitor-Authentifizierung muss der Client einen Bearer-Header senden." + "use": "Leichte Zustandsabfrage mit JSON-Feldern status, timestamp und version. Für Schlüsselwortprüfungen in Uptime Kuma geeignet; der Client muss einen Bearer-Header senden." }, { "endpoint": "/api/health/status", diff --git a/web/messages/de/docs/monitor/index.json b/web/messages/de/docs/monitor/index.json index 883aa0c9..4039ab4a 100644 --- a/web/messages/de/docs/monitor/index.json +++ b/web/messages/de/docs/monitor/index.json @@ -52,7 +52,7 @@ }, { "name": "Terminal", - "description": "Browser-Shell für den Host und unterstützte VM-/CT-Konsolen über xterm.js und WebSockets. Es gilt der konfigurierte Authentifizierungsmodus: Bei deaktivierter oder abgelehnter Anmeldung können erreichbare Clients Sitzungen ohne Login öffnen. Das bedeutet keine Protokollierung jedes Befehls." + "description": "Browser-Shell für den Host und unterstützte VM-/CT-Konsolen über xterm.js und WebSockets. Sitzungen werden nicht pro Befehl protokolliert." }, { "name": "Sicherheit", @@ -114,7 +114,7 @@ "heading": "REST API und Integrationen", "intro": "REST-Endpunkte liefern Überwachungsdaten als JSON über HTTP/HTTPS für Homepage, Home Assistant, Uptime Kuma und eigene Skripte. Grafana kann den separaten Prometheus-Textexporter unter /api/prometheus nutzen. Anfragen sind mit curl möglich.", "tokens": "Langlebige API-Tokens (365 Tage) werden aus Einstellungen → API Zugriffstokens oder über POST /api/auth/generate-api-token generiert.", - "bearer": "Token werden als Authorization: Bearer … gesendet. Der öffentliche Endpunkt /api/health eignet sich für Verfügbarkeitsprüfungen ohne Zugangsdaten. Unter /api/auth/* liegen öffentliche Setup-/Login-/Statusrouten und geschützte Konto-/Tokenverwaltung; nicht alle sind anonym.", + "bearer": "Token werden als Authorization: Bearer … gesendet. Auch /api/health erwartet den Bearer-Header, daher benötigen Verfügbarkeitsprüfungen ein read_only-Token. Unter /api/auth/* liegen sowohl öffentliche Setup-/Login-/Statusrouten als auch geschützte Routen der Konto-/Tokenverwaltung; nicht alle sind anonym.", "catalog": "Der vollständige Endpunktkatalog, Anleitungen zur Token-Rotation und Best Practices für die Sicherheit finden Sie in der API-Referenz; Vorgefertigte Beispiele für Homepage, Home Assistant, Grafana, Uptime Kuma und ein generisches cURL-Muster finden Sie in Integrationen." }, "serviceControl": { diff --git a/web/messages/de/docs/monitor/integrations.json b/web/messages/de/docs/monitor/integrations.json index 526758fd..72610b7c 100644 --- a/web/messages/de/docs/monitor/integrations.json +++ b/web/messages/de/docs/monitor/integrations.json @@ -220,7 +220,7 @@ "heading": "n8n, Zapier und eigene Skripte", "intro": "Workflow-Werkzeuge und Skripte können mit POST an /api/notifications/send Meldungen senden, etwa bei CI-Fehlern oder langen Cronjobs. Der direkte Versand umgeht Ereigniswarteschlange und Fingerprint-Sperrzeit. Kanalformatierung, optionale KI und Versand bleiben erhalten. Erforderliche Duplikatkontrolle übernimmt der Aufrufer.", "n8nBody": "Nutzen Sie in n8n einen HTTP Request-Knoten mit POST, obiger URL und demselben JSON wie curl. Wählen Sie generische Header-Auth-Zugangsdaten mit Authorization und Bearer YOUR_API_TOKEN; ersetzen Sie den Platzhalter. Ein Zeitplan, Webhook oder vorheriger Knoten löst die Anfrage aus.", - "severityBody": "Schweregrade sind INFO, WARNING oder CRITICAL in Großbuchstaben. data liefert Kontext. Die KI nutzt gerenderten Titel und Text sowie unterstützte Ergänzungen; beliebige Felder erscheinen nicht garantiert in Prompt oder Ausgabe. Siehe Benachrichtigungen → Ereigniskatalog." + "severityBody": "Schweregrade sind INFO, WARNING oder CRITICAL in Großbuchstaben. Das Objekt data liefert Ereigniskontext und Vorlagenfelder. An diesem Endpunkt erhält die KI-Umschreibung nur Titel und Text; Felder in data werden nicht an den Anbieter gesendet. Zur Bedeutung der Ereignisse siehe Benachrichtigungen → Ereigniskatalog." }, "pveWebhook": { "heading": "Nativer Proxmox-VE-Webhook (eingehend)", diff --git a/web/messages/de/docs/monitor/notifications.json b/web/messages/de/docs/monitor/notifications.json index 27b9f274..075809d1 100644 --- a/web/messages/de/docs/monitor/notifications.json +++ b/web/messages/de/docs/monitor/notifications.json @@ -171,7 +171,7 @@ "Öffnen Sie account.microsoft.com/security und ermöglichen Sie eine zweistufige Verifizierung.", "Falls angeboten, unter Erweiterte Sicherheitsoptionen → App-Passwörter die Option Neues App-Passwort erstellen wählen. Das garantiert keine Unterstützung für SMTP mit Passwort.", "Falls ein App-Passwort erzeugt wird, kopieren und die SMTP-Zulässigkeit prüfen.", - "Nur bei erlaubtem Passwort-SMTP die genehmigten Werte eintragen: Host smtp.office365.com für Exchange Online, Port 587, TLS-Modus STARTTLS, Benutzername die Mailadresse und Passwort die erlaubte SMTP-Zugangsinformation. Persönliches Outlook.com hat andere Einstellungen und Anforderungen." + "Nur wenn Ihr Anbieter Passwort-SMTP erlaubt, die genehmigten Werte eintragen: SMTP-Host smtp.office365.com für Exchange Online, Port 587, TLS-Modus STARTTLS, Benutzername Ihre Postfachadresse und Passwort die erlaubte SMTP-Zugangsinformation. Persönliches Outlook.com hat andere Einstellungen und Authentifizierungsanforderungen; gehen Sie nicht davon aus, dass diese Zugangsdaten funktionieren." ], "relayTitle": "Selbst gehostetes SMTP-Relay", "relayBody": "Den Monitor auf ein eigenes SMTP-Relay wie Postfix richten. Das Relay authentifiziert sich beim Anbieter. Authentifizierung und TLS des Monitors müssen zum Relay passen; ein lokales Relay deaktiviert die Verschlüsselung nicht automatisch." @@ -266,7 +266,7 @@ "howItems": [ "Je Kanal aktivieren. Standardmäßig aus. Nur gewünschte Kanäle zusammenfassen; andere weiter direkt beliefern.", "Zustellzeit in lokaler Zeitzone, standardmäßig 09:00. Der Versand erfolgt etwa innerhalb von 60 s um diese Minute.", - "Enthalten: geeignete allgemeine Ereignisse mit Schwere INFO, etwa App-Update verfügbar, Tailscale-Update verfügbar, ProxMenux-Optimierungsupdate verfügbar, APT-Sicherheitsupdates ausstehend oder Meldung zur Versandbegrenzung. Sicherungsergebnisse und ausgenommene Aktionen bleiben direkt.", + "In der Zusammenfassung enthalten: geeignete allgemeine Ereignisse mit Schwere INFO. Beispiele sind App-Update verfügbar, Tailscale-Update verfügbar, ProxMenux-Optimierungsupdate verfügbar und APT-Sicherheitsupdates ausstehend. Sicherungsergebnisse und andere ausgenommene Aktionsereignisse bleiben direkt.", "Was ist nie verzögert:", "Dauerhafte Speicherung. Ausstehende Ereignisse bleiben bis zur Zustellzeit in digest_pending in SQLite und überstehen Neustarts.", "Leere Tage sind still. Wenn nichts INFO-Level passiert ist, wird kein Digest gesendet - der Kanal bleibt ruhig, anstatt eine Nachricht \"keine Ereignisse zu melden\" zu erhalten." @@ -301,7 +301,7 @@ { "stage": "Wartezeit für Wiederholungen", "what": "Nach erfolgreichem Versand werden Wiederholungen unterdrückt; der Zustand steht in notification_last_sent. Basiswerte für CRITICAL, WARNING, INFO, resources und updates: 86400 s. Ausnahmen: 5 s für VM/CT-Aktionen und Host-Neustart/Abschaltung, 10 s für Sicherungs-/Replikationsergebnisse, 1800–3600 s für mehrere Gesundheitskategorien. Explizite Ereignis-/Gruppeneinstellungen haben Vorrang.", - "tunable": "Ja — ausdrückliche Konfigurationswerte je Ereignis oder Gruppe überschreiben die Vorgaben." + "tunable": "Nur über die Einstellungs-API — ein Schlüssel cooldown.<event_type> oder cooldown.<group> überschreibt die Vorgaben; in der Oberfläche gibt es dafür kein Steuerelement." }, { "stage": "Zusammenfassung von Ereignisspitzen", @@ -330,7 +330,7 @@ "Methode und URL. POST http://127.0.0.1:8008/api/notifications/webhook ohne Monitor-HTTPS; mit HTTPS der gesonderte lokale HTTP-Port 8009. Beide bleiben auf demselben Host.", "Nachrichtenvorlage. JSON mit nativen Handlebars-Helfern von PVE, in der Konfiguration als Base64 gespeichert. Dekodiert ergibt es:", "Matcher. Ein Begleiter matcher: proxmenux-matcher Block mit mode all, so dass jede PVE-Benachrichtigung das Ziel erreicht.", - "Private Konfiguration. Einrichtung schreibt webhook: proxmenux-webhook in /etc/pve/priv/notifications.cfg, einschließlich Base64-kodiertem gemeinsamem Geheimnis. Das öffentliche Ziel nutzt es für X-Webhook-Secret. Der Block ist nicht leer." + "Private Konfiguration. Die Einrichtung schreibt den passenden Block webhook: proxmenux-webhook in /etc/pve/priv/notifications.cfg mit einem Base64-kodierten secret-Eintrag namens X-Webhook-Secret. Der öffentliche Zielblock enthält nur Body-Vorlage, Methode und URL. Der private Block ist kein leerer Platzhalter." ], "securityTitle": "Wie der Empfänger gesichert ist", "securityIntro": "Der webhook-Empfänger bei POST /api/notifications/webhook verwendet verschiedene Sicherheitsschichten, je nachdem, woher die Anforderung stammt:", diff --git a/web/messages/en/docs/monitor/access-auth.json b/web/messages/en/docs/monitor/access-auth.json index 8cef948e..62606548 100644 --- a/web/messages/en/docs/monitor/access-auth.json +++ b/web/messages/en/docs/monitor/access-auth.json @@ -19,7 +19,7 @@ "reaching": { "heading": "Reaching the dashboard", "intro": "ProxMenux Monitor binds to 0.0.0.0:8008. There are three common ways to reach it:", - "outro": "Direct access matches the default systemd unit. Reverse-proxy and Secure Gateway access are described below. Trust for client IPs in X-Forwarded-For requires PROXMENUX_TRUST_PROXY=1 and a proxy you control. The presence of X-Forwarded-Proto or X-Forwarded-Host alone does not enable proxy trust; the frontend builds API URLs from the browser’s origin." + "outro": "Direct access matches the default systemd unit. Reverse-proxy and Secure Gateway access are described below. Trust for client IPs in X-Forwarded-For requires PROXMENUX_TRUST_PROXY=1 and a proxy you control. The presence of X-Forwarded-Proto or X-Forwarded-Host alone does not enable proxy trust. On ports 80/443 the frontend uses relative /api/* URLs; on any other port it calls port 8008 on the same host name." }, "firstLaunch": { "heading": "First-launch flow", @@ -117,8 +117,8 @@ "loginImageCaption": "Once authentication is configured, every visit to the dashboard starts here. With 2FA enabled, the screen asks for the 6-digit code in a second step after the password is accepted.", "loginFlowTitle": "Login flow", "twofaIntro": "With 2FA enabled, the same call returns requires_totp: true first. Re-issue with the 6-digit code:", - "publicTitle": "Public access and protected probes", - "publicIntro": "Login and authentication status are public. Initial setup is available while no username and password are stored, including after declining protection. System-data probes require authentication when protection is enabled:", + "publicTitle": "Public endpoints (no token)", + "publicIntro": "Login, authentication status, initial setup and the lightweight /api/system-info endpoint are public:", "publicItems": [ "/api/auth/login and /api/auth/status are public. /api/auth/setup creates the initial account and rejects attempts to overwrite existing credentials.", "/api/system-info is a public lightweight system-information endpoint, including health.status. It is not decorated with the token requirement. /api/auth/status is another public endpoint suitable for a reachability check." @@ -146,7 +146,7 @@ }, { "asset": "2FA TOTP secret", - "algorithm": "Standard TOTP (RFC 6238), with a base32-encoded secret. The eight recovery codes are single-use and stored as SHA-256 hashes.", + "algorithm": "Standard TOTP (RFC 6238), with a base32-encoded secret. The eight backup codes are single-use and stored as SHA-256 hashes.", "where": "auth.json → totp_secret + backup_codes[]" }, { @@ -243,17 +243,17 @@ } ], "backupTitle": "What \"backup\" really matters for", - "backupBody": "If you lose the authenticator device, use a saved recovery code or restore the app from a backup you configured beforehand. Cloud sync and local exports differ by app; check that your chosen method actually restores the TOTP secrets. Root access to the host also allows recovery, as explained below. Keep a separate, secure backup.", + "backupBody": "If you lose the authenticator device, use a saved backup code or restore the app from a backup you configured beforehand. Cloud sync and local exports differ by app; check that your chosen method actually restores the TOTP secrets. Root access to the host also allows recovery, as explained below. Keep a separate, secure backup.", "setupTitle": "Step-by-step setup from the dashboard", "setupImageAlt": "2FA setup screen with QR code and backup codes", - "setupImageCaption": "The 2FA setup dialog shows a QR code, a Base32 secret for manual entry, and eight one-time recovery codes. Copy the codes before closing the dialog; they are not displayed again.", + "setupImageCaption": "The 2FA setup dialog shows a QR code, a Base32 secret for manual entry and, after verification, eight one-time backup codes. Copy the codes before closing the dialog; they are not displayed again.", "setupSteps": [ "Install the authenticator app on your phone (or open your password manager). One of the apps from the table above. You only need to do this once — the same app will hold codes for every service you protect.", "Log into the dashboard with your username and password.", - "Open the Security tab in the dashboard sidebar, then click Enable 2FA. A dialog shows a QR code, the Base32 secret and eight recovery codes.", + "Open the Security tab in the dashboard sidebar, then click Enable 2FA and Start setup. The dialog shows a QR code and the manual key; the eight backup codes appear after the code is verified.", "Add the entry to the authenticator app:", - "Save the recovery codes. Store all eight safely in a password manager, encrypted note or secure printed copy. Each works once if your authenticator is unavailable.", "Confirm by typing the current 6-digit code from the app into the \"Verification code\" field of the setup dialog and submit. Codes refresh every 30 seconds, so if it expires while you're typing, just enter the next one.", + "Save the backup codes. After verification, store all eight safely in a password manager, encrypted note or secure printed copy. Each works once if your authenticator is unavailable.", "Done. 2FA is now active. Next time you log in, the dashboard asks for the password first; once it's accepted it asks for the current 6-digit code." ], "setupStep4Sub": [ @@ -261,17 +261,17 @@ "Manual fallback (when scanning isn't possible — e.g. setting up on the same phone you opened the dashboard with): tap Add account → Enter setup key. Type any name (e.g. Proxmox Monitor), paste the Base32 string from the dialog, leave Type as Time-based, save." ], "testTitle": "Test before logging out", - "testBody": "Keep your current session open and test a new login in a private window immediately after setup. If the code is rejected, check the server and phone clocks before logging out of the working session. If access is already lost, use a recovery code or edit auth.json from the host shell.", + "testBody": "Keep your current session open and test a new login in a private window immediately after setup. If the code is rejected, check the server and phone clocks before logging out of the working session. If access is already lost, use a backup code or edit auth.json from the host shell.", "lostTitle": "Lost authenticator", "lostIntro": "Three escape hatches, in order of how disruptive they are:", "lostItems": [ - "Use a recovery code. Enter one of the eight saved codes in the TOTP field. It works once; unused codes remain valid. After logging in, set up 2FA again from Settings to obtain eight new codes.", + "Use a backup code. Enter one of the eight saved codes in the TOTP field. It works once; unused codes remain valid. After logging in, open Security, choose Disable 2FA and then Enable 2FA to obtain eight new codes.", "Restore the authenticator from cloud / backup. If your app has a cloud sync (Google, Microsoft, Authy, Apple Passwords via iCloud Keychain, Ente, 2FAS) install it on a new device, sign in, and the entries reappear. If your app uses an encrypted export file (Aegis, Raivo, FreeOTP+), install the app on the new device and import the file.", "Disable 2FA from the host shell. When the previous options aren't available, edit /root/.config/proxmenux-monitor/auth.json on the Proxmox host (you need root SSH or console access), set totp_enabled to false, save, and restart the service:" ], "lostShellOutro": "You can log in with username + password only, then re-enable 2FA from Settings.", "disableTitle": "Disable 2FA", - "disableBody": "Open Security and choose Disable 2FA. POST /api/auth/totp/disable requires the current password and a valid TOTP or recovery code. It removes the TOTP secret and recovery codes. Remove the old entry from your authenticator app too.", + "disableBody": "Open Security and choose Disable 2FA. POST /api/auth/totp/disable requires the current password and a valid TOTP or backup code. It removes the TOTP secret and backup codes. Remove the old entry from your authenticator app too.", "rejectedTitle": "The 6-digit code is always rejected", "rejectedIntro": "TOTP is time-based — server clock and phone clock must agree to within ~30 s. Two checks:", "rejectedItems": [ diff --git a/web/messages/en/docs/monitor/ai-assistant.json b/web/messages/en/docs/monitor/ai-assistant.json index f0dcbe59..93b8368b 100644 --- a/web/messages/en/docs/monitor/ai-assistant.json +++ b/web/messages/en/docs/monitor/ai-assistant.json @@ -14,7 +14,7 @@ }, "intro": { "title": "Off by default, single switch to enable", - "body": "AI rewriting is off by default. Enable it in Settings → Notifications → Advanced: AI Enhancement. If enrichment or rewriting fails, the dispatcher sends the original template. Each rewrite has a 25-second dispatch timeout; reaching it falls back to the template instead of waiting indefinitely." + "body": "AI rewriting is off by default. Enable it in Settings → Notifications → Advanced: AI Enhancement. If enrichment or rewriting fails, the dispatcher sends the original template. Rewrites in the event dispatch queue have a 25-second timeout; reaching it sends the template instead of waiting." }, "howItWorks": { "heading": "How it works", @@ -109,7 +109,7 @@ ], "customNote": "Custom prompt mode uses a fixed cap of 500 output tokens regardless of detail level — the custom prompt is in your control and the cap protects against runaway responses.", "sizingTitle": "Practical sizing", - "sizingBody": "Estimate usage as rewritten events × AI-enabled channels × input-plus-output tokens per call. For example, 50 events × one channel × (500 input + 300 output tokens) is 40,000 tokens per day, not a few thousand. Actual usage and charges depend on model, context, caching and provider limits. The Detail level per channel section shows how to use brief for chat instead of standard, while keeping detailed email reports." + "sizingBody": "Estimate usage as rewritten events × AI-enabled channels × input-plus-output tokens per call. For example, 50 events × one channel × (2,000 input + 300 output tokens) is about 115,000 tokens per day, since the default system prompt alone is roughly 1,500 tokens. Actual usage and charges depend on model, context, caching and provider limits. The Detail level per channel section shows how to use brief for chat instead of standard, while keeping detailed email reports." }, "providers": { "heading": "AI providers", @@ -142,7 +142,7 @@ "items": [ "API key: console.anthropic.com/settings/keys", "Examples from the bundled model list: claude-haiku-4-5-20251001, claude-sonnet-4-6, claude-opus-4-6.", - "Bundled recommendation: claude-haiku-4-5-20251001. This exact snapshot is the configured recommendation; the older Claude 3.5 entries shown in earlier documentation are no longer in the bundled list." + "Bundled recommendation: claude-haiku-4-5-20251001, a pinned snapshot rather than a moving alias." ] }, "gemini": { diff --git a/web/messages/en/docs/monitor/api-reference.json b/web/messages/en/docs/monitor/api-reference.json index bad1193f..eb5e3ff4 100644 --- a/web/messages/en/docs/monitor/api-reference.json +++ b/web/messages/en/docs/monitor/api-reference.json @@ -162,7 +162,7 @@ { "endpoint": "/api/vms//backup", "method": "POST", - "use": "Create a vzdump backup of a VM or LXC. Body fields, all optional unless the defaults do not match the storage layout: storage (a PVE storage), mode (snapshot, suspend or stop), compress (zstd, lzo, gzip or none), protected (true or false), notes, notification (auto, always, failure or never) and pbs_change_detection (default, legacy or data). Returns the PVE task UPID." + "use": "Create a vzdump backup of a VM or LXC. Body fields, all optional unless the defaults do not match the storage layout: storage (a PVE storage), mode (snapshot, suspend or stop), compress (zstd, lzo, gzip or none), protected (true or false), notes and pbs_change_detection (default, legacy or data). Returns the PVE task UPID." }, { "endpoint": "/api/vms//backups", @@ -286,7 +286,7 @@ { "endpoint": "/api/storage/smart//test", "method": "POST", - "use": "Start a SMART self-test. Body schema: '{'\"type\":\"short\"|\"long\"'}'." + "use": "Start a SMART self-test. Body schema: '{'\"test_type\":\"short\"|\"long\"'}'." }, { "endpoint": "/api/storage/smart/schedules", diff --git a/web/messages/en/docs/monitor/architecture.json b/web/messages/en/docs/monitor/architecture.json index 8cf9181d..d8415fa6 100644 --- a/web/messages/en/docs/monitor/architecture.json +++ b/web/messages/en/docs/monitor/architecture.json @@ -73,13 +73,13 @@ "intro": "The AppImage is a self-mounting filesystem. AppRun at the root sets up the environment and execs flask_server.py:", "consequencesIntro": "Two consequences of this layout:", "consequences": [ - "Bundled Python environment. The interpreter and Python packages are shipped inside the AppImage, avoiding installation into the host’s system Python environment. The application still uses host kernel interfaces and external host tools.", + "Bundled Python packages. Python packages ship inside the AppImage and run on the host's own Python 3.11 (PVE 8) or 3.13 (PVE 9) interpreter, without installing anything into the host's system Python. The application still uses host kernel interfaces and external host tools.", "Hardware clients are bundled too. ipmitool, lm-sensors and upsc are included. Readings still depend on supported hardware, access to sensors and, for UPS data, a configured NUT server." ] }, "flask": { "heading": "Flask app structure", - "intro": "flask_server.py creates one Flask(__name__) instance with restricted CORS origins, registers nine blueprints directly and initializes terminal routes. The table highlights the main modules; audit, VM-backup and PBS blueprints are also registered. PVE-specific prewarmers run only on PVE hosts.", + "intro": "flask_server.py creates one Flask(__name__) instance with restricted CORS origins, registers ten blueprints directly and initializes terminal routes. The table highlights the main modules; PBS, Monitor links, audit and VM-backup blueprints are also registered. PVE-specific prewarmers run only on PVE hosts.", "headerBlueprint": "Blueprint / module", "headerPrefix": "Routes prefix", "headerOwns": "Owns", @@ -242,10 +242,10 @@ "Updates: pending package upgrades and security patches.", "Logs: persistent / spike / cascade pattern detection in the system journal.", "Memory: OOM killer activity, sustained high pressure.", - "Temperature: CPU and disk readings checked against monitoring thresholds; available sensors depend on the hardware.", + "CPU: usage and CPU temperature checked against the configurable thresholds; available sensors depend on the hardware.", "Security: authentication failures, ban events, fail2ban jail status." ], - "afterIntro": "Findings use a stable error_key, category and severity. Existing records in errors are updated with last_seen and occurrence counts rather than duplicated. Notification delivery also has its own fingerprint and cooldown rules.", + "afterIntro": "Findings use a stable error_key, category and severity. Existing records in errors are updated in place (last_seen, severity, reason) rather than duplicated. Notification delivery also has its own fingerprint and cooldown rules.", "cycleEnd": "Cleanup can auto-resolve stale errors using category Suppression Duration values and state-based rules, remove orphan records for resources that were removed, and prune events older than 30 days. The categories and dashboard are described in Dashboard → Health Monitor." }, "notifications": { @@ -264,9 +264,9 @@ "intro": "The Terminal tab in the dashboard is a thin xterm.js client wired to a server-side PTY through a WebSocket. Two transport modes:", "items": [ "HTTP mode (default): the built-in Flask server with flask-sock handles WebSocket upgrade requests.", - "HTTPS / WSS mode: the TLS server uses gevent.pywsgi.WSGIServer with geventwebsocket.handler.WebSocketHandler for WebSocket connections over TLS." + "HTTPS / WSS mode: the TLS server uses gevent.pywsgi.WSGIServer with its default handler; flask-sock handles WebSocket connections over TLS." ], - "outro": "Terminal child processes inherit User=root from the service. With authentication enabled, opening a WebSocket requires a short-lived, single-use ticket obtained from the authenticated terminal-ticket endpoint with administrative scope. When authentication is disabled or declined, the handshake follows that unauthenticated mode.", + "outro": "Terminal child processes inherit User=root from the service. Opening a WebSocket requires a short-lived, single-use ticket obtained from the authenticated terminal-ticket endpoint with administrative scope.", "proxyNote": "If you access the Monitor through a reverse proxy, make sure WebSocket forwarding is enabled (the Upgrade and Connection headers). Without it the terminal won't work." }, "proxy": { diff --git a/web/messages/en/docs/monitor/dashboard/network.json b/web/messages/en/docs/monitor/dashboard/network.json index 24757003..1bb47040 100644 --- a/web/messages/en/docs/monitor/dashboard/network.json +++ b/web/messages/en/docs/monitor/dashboard/network.json @@ -162,7 +162,7 @@ } ], "reportTitle": "Network Latency Report (PDF)", - "reportIntro": "Both modes have a Report button beside the target selector. It generates a PDF of the measurements that you can attach to a troubleshooting request to your ISP.", + "reportIntro": "Both modes have a Report button beside the target selector. It opens a printable report of the measurements; save it as PDF from the browser's print dialog and attach it to a troubleshooting request to your ISP.", "reportPreviewAlt": "First page of the Network Latency Report PDF — Executive Summary with the gauge, latency statistics, the latency graph and the threshold guide", "reportPreviewCaption": "The first page of the Network Latency Report contains the executive summary, gauge, main statistics, time-series latency graph and threshold guide. Page 2 onwards contains the per-sample table and methodology.", "downloadLabel": "Download sample Network Latency report (PDF)", diff --git a/web/messages/en/docs/monitor/dashboard/security.json b/web/messages/en/docs/monitor/dashboard/security.json index 1cedc7f2..36ac8340 100644 --- a/web/messages/en/docs/monitor/dashboard/security.json +++ b/web/messages/en/docs/monitor/dashboard/security.json @@ -136,7 +136,7 @@ "configCaption": "Editing the sshd jail — pick a stricter Max Retries for SSH if you only ever log in from your own subnet, or extend Ban Time for the public-facing dashboard.", "outro": "The full What it installs / how it's configured / how to uninstall walkthrough — including the manual install path, the SSH MaxAuthTries side effect, and the relationship with the proxmenux-auth.log journal — is in ProxMenux → Security → Fail2Ban.", "calloutTitle": "Without Fail2Ban, this mechanism does not block IPs", - "calloutBody": "ProxMenux Monitor checks Fail2Ban’s banned IPs at the application level before handling Flask requests. It queries fail2ban-client and caches the result for 30 seconds; it does not read a SQL bans table. Without Fail2Ban, failed logins are recorded in proxmenux-auth.log, but this mechanism does not actively block IPs." + "calloutBody": "ProxMenux Monitor checks the IPs banned in Fail2Ban's proxmenux jail at the application level before handling Flask requests, caching the result for 30 seconds. Without Fail2Ban, failed logins are recorded in proxmenux-auth.log and the login endpoint is limited to 5 attempts per IP every 5 minutes, but no IP is banned." }, "lynis": { "heading": "Lynis Security Audit", diff --git a/web/messages/en/docs/monitor/dashboard/settings.json b/web/messages/en/docs/monitor/dashboard/settings.json index d05425ec..66abb836 100644 --- a/web/messages/en/docs/monitor/dashboard/settings.json +++ b/web/messages/en/docs/monitor/dashboard/settings.json @@ -76,7 +76,7 @@ }, "thresholds": { "heading": "Health Monitor Thresholds", - "intro": "The previous card sets how long to stay quiet after a dismiss; this one sets the value at which an alert is raised. Most threshold-based checks have adjustable Warning and Critical values. The table below explains exceptions such as the combined swap rule and the current RAM detector.", + "intro": "The previous card sets how long to stay quiet after a dismiss; this one sets the value at which an alert is raised. Most threshold-based checks have adjustable Warning and Critical values. The table below explains exceptions such as the combined swap rule.", "whatForTitle": "What it is for", "whatForIntro": "Defaults that ship with ProxMenux are sane for the average Proxmox host, but every environment has its own envelope:", "whatForItems": [ @@ -85,7 +85,7 @@ "Choose drive-temperature thresholds using the drive’s specifications and observed operating conditions. Passive versus forced-air cooling alone does not determine a universally lower or higher safe limit.", "A heavily-virtualized host that pegs CPU during builds should not page on every 80 % spike, but must still alert on sustained pressure." ], - "whatForOutro": "Supported threshold changes take effect on the next scan. The Health Monitor reads /usr/local/share/proxmenux/health_thresholds.json each cycle without a restart. Selected widgets, including disk temperature, use these values; some capacity bars retain separate visual cutoffs. See the RAM row below for a current runtime exception.", + "whatForOutro": "Supported threshold changes take effect on the next scan. The Health Monitor reads /usr/local/share/proxmenux/health_thresholds.json each cycle without a restart. Selected widgets, including disk temperature, use these values; some capacity bars retain separate visual cutoffs.", "coloursTitle": "Status colours: how Warning and Critical render in the dashboard", "coloursIntro": "Widgets that use the configured Warning/Critical pair follow the three-state classification below. Some visual indicators, including the PVE storage capacity bars, use their own cutoffs; do not infer a Health Monitor alert solely from their colour.", "headerColour": "Colour", @@ -125,7 +125,7 @@ "section": "Memory", "warning": "85 %", "critical": "95 %", - "gates": "Host RAM pressure. The configurable Critical default shown here is 95 %, but the current detector uses a hard-coded 90 % sustained RAM rule; changing that setting does not currently change this runtime branch." + "gates": "Host RAM pressure." }, { "section": "Swap (critical only)", @@ -185,7 +185,7 @@ "section": "PVE storage", "warning": "85 %", "critical": "95 %", - "gates": "PVE-managed storages, including LVM, LVM-thin, ZFS-pool, RBD/Ceph and PBS. These are not all block-storage backends." + "gates": "Only PVE storages of type LVM, LVM-thin, ZFS-pool, RBD, CephFS and PBS. Directory, NFS and CIFS storages are covered by the host disk-space row." }, { "section": "ZFS pool", @@ -218,7 +218,7 @@ "toggleTitle": "Conditional notification toggle", "toggleBody": "The lxc_updates_available per-channel notification toggle in Notifications → Services only renders while detection is enabled. When you turn detection OFF, that row disappears from every channel's category list — but its stored preference is preserved in the DB, so re-enabling detection brings the toggle back at the value it had before.", "purgeTitle": "What gets purged when you disable detection", - "purgeBody": "Turning the switch OFF immediately removes every type=lxc entry from /usr/local/share/proxmenux/managed_installs.json. LXC update counts on the Hardware tab clear on the next dashboard refresh. Turning it back ON repopulates the registry on the next detection cycle, or sooner with a manual API refresh." + "purgeBody": "Turning the switch OFF immediately removes every type=lxc entry from /usr/local/share/proxmenux/managed_installs.json. LXC update counts in the VMs & LXCs tab clear on the next dashboard refresh. Turning it back ON repopulates the registry on the next detection cycle, or sooner with a manual API refresh." }, "storageExclusions": { "heading": "Remote Storage Exclusions", diff --git a/web/messages/en/docs/monitor/dashboard/storage.json b/web/messages/en/docs/monitor/dashboard/storage.json index 29faff4a..146d165d 100644 --- a/web/messages/en/docs/monitor/dashboard/storage.json +++ b/web/messages/en/docs/monitor/dashboard/storage.json @@ -70,7 +70,7 @@ "items": [ "Device path — /dev/sda, /dev/nvme0n1.", "Type badge — SATA / NVMe (and the relevant icon).", - "System badge — orange tag for disks identified as hosting the OS. Detection uses the mountpoints of / and /boot; physical disks hosting them receive the System tag. A missing tag does not prove a disk is safe to erase or repurpose.", + "System badge — orange tag for disks in use by the host: system mountpoints (/, /boot, /usr, /var…), active swap, ZFS pool members, LVM physical volumes, active RAID members or system partition labels. A missing tag does not prove a disk is safe to erase or repurpose.", "Model — vendor + model string from smartctl -i.", "Capacity — formatted human-readable.", "Temperature — current °C, coloured by the disk-type threshold (NVMe runs warmer than SATA).", @@ -112,7 +112,7 @@ "pdfPreviewAlt": "First page of the generated SMART Health Report PDF — Executive Summary with the PASSED ring + Disk Information block", "pdfPreviewCaption": "First page of the SMART Health Report — Executive Summary with the PASSED ring and the full Disk Information block. The full PDF below has the SSD wear ring, every SMART attribute and the test history.", "pdfDownloadLabel": "Download sample SMART report (PDF)", - "pdfSectionsIntro": "The report has six main sections:", + "pdfSectionsIntro": "The report includes these main sections:", "pdfSections": [ "Executive Summary — large PASSED / FAILED verdict, plain-language disk health assessment paragraph (\"your disk is healthy / showing signs of wear / failing\"), and four quick stats (report timestamp, last-test type, test result, attributes checked).", "Disk Information — model, serial, capacity, type (HDD / SSD / NVMe), family, form factor, interface (SATA 3.3 · 6.0 Gb/s, …), TRIM support, current temperature with the optimal threshold, power-on time, power cycles, SMART status, plus the headline counters (pending sectors, CRC errors, reallocated sectors).", @@ -127,7 +127,7 @@ "historyImageCaption": "History tab — every retained SMART test for this disk. Per row: type, timestamp, \"X days ago\" tag, latest marker, download (raw smartctl output) and delete actions.", "historyIntro": "The retained pool of SMART tests for this disk — both short and extended runs that completed. Each entry is the raw smartctl output captured at run time, plus the structured fields the Monitor parsed out for the dashboard. Per-row actions:", "historyItems": [ - "Download — saves the retained JSON snapshot with the smartctl -a data used by the report. Useful when vendor support needs the original diagnostic fields.", + "Download — saves that test's JSON snapshot (smartctl -a --json output, or nvme smart-log on NVMe when smartctl fails). Useful when vendor support needs the original diagnostic fields.", "Delete — removes the test from history. The retention limit set in the Schedule tab (Last 5 / 10 / 20) deletes oldest-first automatically; this action is the manual override." ], "scheduleTitle": "Tab 4 — Schedule", diff --git a/web/messages/en/docs/monitor/dashboard/vms-lxcs.json b/web/messages/en/docs/monitor/dashboard/vms-lxcs.json index e7ce2c34..7c4b14b3 100644 --- a/web/messages/en/docs/monitor/dashboard/vms-lxcs.json +++ b/web/messages/en/docs/monitor/dashboard/vms-lxcs.json @@ -1,16 +1,16 @@ { "meta": { "title": "ProxMenux Monitor — Dashboard: VMs & LXCs tab | ProxMenux Documentation", - "description": "The VMs & LXCs tab inventories every guest on the host with live CPU / memory / disk usage. Per-guest details show configuration, resources, backups, recent Proxmox log results, notes, and Start / Shutdown / Reboot / Stop controls." + "description": "The VMs & LXCs tab inventories every guest on the host with live CPU / memory / disk usage. Per-guest details show configuration, resources, backups, the console log of OCI containers, notes, and Start / Shutdown / Reboot / Force Stop controls." }, "header": { "title": "Dashboard: VMs & LXCs tab", - "description": "The full inventory of guests on the node. Four headline metrics across the top, a sortable list of every VM and LXC below, and a drill-in per guest with config, resources, backups, logs and the four lifecycle controls (Start / Shutdown / Reboot / Stop).", + "description": "The full inventory of guests on the node. Four headline metrics across the top, a sortable list of every VM and LXC below, and a drill-in per guest with config, resources, backups, the console log of OCI containers and the four lifecycle controls (Start / Shutdown / Reboot / Force Stop).", "section": "ProxMenux Monitor · Dashboard" }, "intro": { "title": "The control surface for guests", - "body": "Use this tab to control guest lifecycles. Lifecycle actions go through POST /api/vms/<vmid>/control with an explicit confirmation and the response is reflected back in the guest’s row. Force shutdown requires the dedicated Force Stop button." + "body": "Use this tab to control guest lifecycles. Lifecycle actions go through POST /api/vms/<vmid>/control; Reboot and Force Stop ask you to type the VMID to confirm, and the response is reflected back in the guest’s row. Force shutdown requires the dedicated Force Stop button." }, "topRow": { "heading": "Top row: four stat cards", @@ -186,9 +186,9 @@ "source": "PVE RRD data (pvesh get /nodes/<node>/qemu/<id>/rrddata) condensed to a chart-friendly shape." }, { - "section": "Recent Proxmox log results", - "endpoint": "/api/vms//logs", - "source": "pvesh get /nodes/<node>/<qemu|lxc>/<vmid>/log --start 0 --limit 1000. A command failure returns an empty list; this does not provide complete in-guest system logs." + "section": "OCI console log (Logs tab)", + "endpoint": "/api/lxc//console-log", + "source": "Console output of the image's main process, read from /var/log/proxmenux/oci/<vmid>.console.log on the host. Shown for OCI containers only." }, { "section": "Backups available for guest", diff --git a/web/messages/en/docs/monitor/health-monitor.json b/web/messages/en/docs/monitor/health-monitor.json index 732e0290..c4c3c725 100644 --- a/web/messages/en/docs/monitor/health-monitor.json +++ b/web/messages/en/docs/monitor/health-monitor.json @@ -68,7 +68,7 @@ { "category": "Storage", "checks": "Proxmox storages, root filesystem", - "events": "Root or other monitored filesystems crossing configured space thresholds (85% warning / 95% critical by default); offline NFS export; CIFS authentication failure; full LVM-thin pool." + "events": "Root or other monitored filesystems crossing configured space thresholds (85% warning / 95% critical by default); unavailable PVE storages; stale or unexpectedly read-only NFS/CIFS mounts; LVM-thin and other pool storages crossing the same thresholds." }, { "category": "Disks & SMART", @@ -98,7 +98,7 @@ { "category": "System Updates", "checks": "Pending updates, security updates, kernel / PVE version, system age", - "events": "Pending security or running-kernel updates; a system not updated for a long time. The Overview header shows an Update Now button when updates are pending. It runs the full ProxMenux update flow inline; closing it refreshes health with ?refresh=1 so the badge reflects the new state without waiting for the next cycle." + "events": "Pending security or running-kernel updates; a system not updated for a long time. The Updates category of the Health Status modal shows an Update Now button when updates are pending. It runs the full ProxMenux update flow inline; closing it refreshes health with ?refresh=1 so the badge reflects the new state without waiting for the next cycle." }, { "category": "Security & Certificates", @@ -158,7 +158,7 @@ }, "dismiss": { "heading": "Dismissing alerts and the Suppression Duration", - "intro": "Some events are noisy by nature — a System Updates: pending updates available stays true until you patch the host, and you don't want a notification every five minutes for a week. The Update Now button in the Overview header is the direct shortcut to resolve that specific case in place; for everything else, or when patching is deferred, the Health Monitor also offers two coupled silencing mechanisms:", + "intro": "Some events are noisy by nature — a System Updates: pending updates available stays true until you patch the host, and you don't want a notification every five minutes for a week. The Update Now button in the Updates category of the Health Status modal is the direct shortcut to resolve that specific case in place; for everything else, or when patching is deferred, the Health Monitor also offers two coupled silencing mechanisms:", "step1": "Per-event Dismiss action in the modal. The Dismiss button opens a small dropdown with three options — 24 hours, 7 days or Permanently — letting you choose how long this specific alert stays silenced regardless of the category's default. Picking one calls POST /api/health/acknowledge with the error_key and the chosen suppression_hours (-1 for permanent). The event moves to the Dismissed list with a timestamped acknowledged_at.", "dropdownImageAlt": "Dismiss dropdown on a Health Monitor alert — 24 hours, 7 days or Permanently", "dropdownImageCaption": "Per-event Dismiss dropdown. The chosen window applies to this single alert; without a per-event choice the category default is used. Permanent dismissals have an amber Permanent badge and normally do not re-fire. The critical CPU-temperature override described below is an exception.", @@ -187,7 +187,7 @@ }, { "finding": "ZFS pool DEGRADED / FAULTED", - "why": "ZFS pool-capacity checks explicitly allow dismissal. Other pool findings follow their own flag. Acknowledgment does not repair a degraded or faulted pool." + "why": "ZFS pool-state findings (DEGRADED, FAULTED, UNAVAIL) explicitly allow dismissal, as do pool-capacity checks. Acknowledgment does not repair a degraded or faulted pool." }, { "finding": "Disk I/O errors with SMART FAILED", @@ -289,7 +289,7 @@ }, "rest": { "heading": "REST endpoints", - "intro": "The modal actions are also available through the API for scripts, custom dashboards or chatbots. When Monitor authentication is enabled, calls need a valid bearer token, either from login or the API-token screen. Changes such as acknowledging alerts, saving suppression settings or cleaning orphan errors require full_admin scope; read_only receives 403. When authentication is disabled or declined, these decorators allow access without a token.", + "intro": "The modal actions are also available through the API for scripts, custom dashboards or chatbots. Calls need a valid bearer token, either from login or the API-token screen. Changes such as acknowledging alerts, saving suppression settings or cleaning orphan errors require full_admin scope; read_only receives 403.", "headerEndpoint": "Endpoint", "headerMethod": "Method", "headerUse": "Use", @@ -297,7 +297,7 @@ { "endpoint": "/api/health", "method": "GET", - "use": "Lightweight health probe returning JSON with status, timestamp and version. Suitable for Uptime Kuma keyword checks; when Monitor authentication is enabled, the client must send a bearer header." + "use": "Lightweight health probe returning JSON with status, timestamp and version. Suitable for Uptime Kuma keyword checks; the client must send a bearer header." }, { "endpoint": "/api/health/status", diff --git a/web/messages/en/docs/monitor/index.json b/web/messages/en/docs/monitor/index.json index 1b2408ed..2613e500 100644 --- a/web/messages/en/docs/monitor/index.json +++ b/web/messages/en/docs/monitor/index.json @@ -52,7 +52,7 @@ }, { "name": "Terminal", - "description": "Browser shell for the host and supported VM/CT console access, powered by xterm.js over WebSockets. It follows the configured authentication mode: when authentication is disabled or declined, reachable clients can open a session without login. This description does not imply per-command auditing." + "description": "Browser shell for the host and supported VM/CT console access, powered by xterm.js over WebSockets. Sessions are not audited per command." }, { "name": "Security", @@ -114,7 +114,7 @@ "heading": "REST API and integrations", "intro": "The dashboard’s REST endpoints expose monitoring data as JSON over HTTP/HTTPS for Homepage widgets, Home Assistant sensors, Uptime Kuma probes and custom scripts. Grafana can use the separate Prometheus text exporter at /api/prometheus. Requests can be made with curl.", "tokens": "Long-lived API tokens (365 days) are generated from Settings → API Access Tokens or via POST /api/auth/generate-api-token.", - "bearer": "Send tokens as Authorization: Bearer …. The public /api/health endpoint is suitable for external uptime probes without credentials. Routes under /api/auth/* include both public setup/login/status routes and protected account/token management routes; they are not all anonymous.", + "bearer": "Send tokens as Authorization: Bearer …. /api/health also expects the bearer header, so uptime probes need a read_only token. Routes under /api/auth/* include both public setup/login/status routes and protected account/token management routes; they are not all anonymous.", "catalog": "The full endpoint catalog, token rotation guidance and security best-practices live in API Reference; ready-made examples for Homepage, Home Assistant, Grafana, Uptime Kuma and a generic cURL pattern are in Integrations." }, "serviceControl": { diff --git a/web/messages/en/docs/monitor/integrations.json b/web/messages/en/docs/monitor/integrations.json index 415a2088..d0b5a0bd 100644 --- a/web/messages/en/docs/monitor/integrations.json +++ b/web/messages/en/docs/monitor/integrations.json @@ -220,7 +220,7 @@ "heading": "n8n, Zapier and custom scripts", "intro": "Workflow tools and scripts can send notifications through a POST to /api/notifications/send, for example after a CI failure or an overlong cron job. This is a direct send: it bypasses the event queue and fingerprint cooldown. It still uses channel formatting, optional AI rewriting and delivery to configured channels. Apply any required duplicate control in the caller.", "n8nBody": "In n8n, use an HTTP Request node with POST, the URL above and the same JSON body as curl. Choose generic Header Auth credentials: set the header name to Authorization and its value to Bearer YOUR_API_TOKEN, replacing the placeholder. Connect a schedule, webhook or other preceding node to trigger the request.", - "severityBody": "Severity values are INFO, WARNING or CRITICAL in uppercase. The data object supplies event context. AI rewriting uses the rendered title and message plus supported enrichment; arbitrary fields are not guaranteed to appear in its prompt or output. See Notifications → Event catalogue for event semantics." + "severityBody": "Severity values are INFO, WARNING or CRITICAL in uppercase. The data object supplies event context and template fields. On this endpoint, AI rewriting receives only the title and message; fields in data are not sent to the provider. See Notifications → Event catalogue for event semantics." }, "pveWebhook": { "heading": "Native Proxmox VE webhook (inbound)", diff --git a/web/messages/en/docs/monitor/notifications.json b/web/messages/en/docs/monitor/notifications.json index 8112cd6c..3a26f7d9 100644 --- a/web/messages/en/docs/monitor/notifications.json +++ b/web/messages/en/docs/monitor/notifications.json @@ -171,7 +171,7 @@ "Open account.microsoft.com/security and enable two-step verification.", "If your account offers Advanced security options → App passwords, choose Create a new app password. This option alone does not establish that your mail service accepts password-based SMTP.", "If Microsoft generates an app password, copy it and verify that your SMTP service accepts it.", - "Only if your provider permits password-based SMTP, fill in its approved settings: Host smtp.office365.com for Exchange Online, Port 587, TLS Mode STARTTLS, Username your mailbox address, and Password the permitted SMTP credential. Personal Outlook.com settings and authentication requirements are different; do not assume these credentials will work." + "Only if your provider permits password-based SMTP, fill in its approved settings: SMTP host smtp.office365.com for Exchange Online, Port 587, TLS mode STARTTLS, Username your mailbox address, and Password the permitted SMTP credential. Personal Outlook.com settings and authentication requirements are different; do not assume these credentials will work." ], "relayTitle": "Self-hosted SMTP relay", "relayBody": "Point the Monitor at an SMTP relay you control, such as Postfix. The relay handles upstream authentication. Configure the Monitor’s authentication and TLS mode to match the relay; using a local relay does not itself disable encryption." @@ -266,7 +266,7 @@ "howItems": [ "Per-channel opt-in. Off by default — Telegram doesn't silently batch your alerts. You enable it on the channels where you want a digest, leaving others on live delivery.", "Delivery time in your local timezone. Defaults to 09:00 but you can pick any time; the dispatcher fires the digest within ~60 s of that minute.", - "Included in the digest: eligible generic events with severity INFO. Examples include application update available, Tailscale update available, ProxMenux optimisation update available, APT security updates pending and rate-limit notice. Backup results and other exempt action events remain live.", + "Included in the digest: eligible generic events with severity INFO. Examples include application update available, Tailscale update available, ProxMenux optimisation update available and APT security updates pending. Backup results and other exempt action events remain live.", "What is never delayed:", "Persistence. Pending events sit in a SQLite table (digest_pending) until the configured hour. The Monitor can restart freely without losing what the digest will eventually contain.", "Empty days are silent. If nothing INFO-level happened, no digest is sent — the channel stays quiet rather than receiving a \"no events to report\" message." @@ -301,7 +301,7 @@ { "stage": "Cooldown", "what": "After successful delivery, repeated fingerprints are suppressed and the state is saved in notification_last_sent. Base defaults for CRITICAL, WARNING and INFO are 86 400 s, as are resources and updates. Exceptions include 5 s for VM/CT actions and host shutdown/reboot, 10 s for backup/replication results, and 1 800–3 600 s for several health-state categories. Explicit event/group settings can override these values.", - "tunable": "Yes — explicit cooldown settings for an event type or group override the defaults; these are dispatcher configuration values." + "tunable": "Only through the settings API — a cooldown.<event_type> or cooldown.<group> key overrides the defaults; there is no control in the UI." }, { "stage": "Burst aggregation", @@ -330,7 +330,7 @@ "Method and URL. POST http://127.0.0.1:8008/api/notifications/webhook when Monitor HTTPS is off. With HTTPS enabled, the target uses the separate HTTP loopback listener on port 8009. Both stay on the same host.", "Body template. A JSON body using PVE's native Handlebars helpers — stored base64-encoded in the config file by PVE, but it expands to:", "Matcher. A companion matcher: proxmenux-matcher block with mode all so every PVE notification reaches the target.", - "Private configuration. Setup writes the matching webhook: proxmenux-webhook block in /etc/pve/priv/notifications.cfg, including the shared secret encoded in base64. The public target references that secret to send X-Webhook-Secret. The block is not an empty stub." + "Private configuration. Setup writes the matching webhook: proxmenux-webhook block in /etc/pve/priv/notifications.cfg with a secret entry named X-Webhook-Secret, encoded in base64. The public target block holds only the body template, method and URL. The private block is not an empty stub." ], "securityTitle": "How the receiver is secured", "securityIntro": "The webhook receiver at POST /api/notifications/webhook applies different security layers depending on where the request comes from:", diff --git a/web/messages/es/docs/monitor/access-auth.json b/web/messages/es/docs/monitor/access-auth.json index 36f245e1..9c8ae824 100644 --- a/web/messages/es/docs/monitor/access-auth.json +++ b/web/messages/es/docs/monitor/access-auth.json @@ -19,7 +19,7 @@ "reaching": { "heading": "Cómo llegar al panel", "intro": "ProxMenux Monitor escucha en 0.0.0.0:8008. Hay tres formas habituales de llegar a él:", - "outro": "El acceso directo corresponde a la unidad systemd predeterminada. El proxy inverso y Secure Gateway se describen más abajo. Para confiar en la IP de X-Forwarded-For se requiere PROXMENUX_TRUST_PROXY=1 y un proxy que controles. La presencia de X-Forwarded-Proto o X-Forwarded-Host no activa esa confianza; el frontend construye las URL de la API a partir del origen del navegador." + "outro": "El acceso directo corresponde a la unidad systemd predeterminada. El proxy inverso y Secure Gateway se describen más abajo. Para confiar en la IP de X-Forwarded-For se requiere PROXMENUX_TRUST_PROXY=1 y un proxy que controles. La presencia de X-Forwarded-Proto o X-Forwarded-Host no activa esa confianza. En los puertos 80/443 el frontend usa URL relativas /api/*; en cualquier otro puerto llama al puerto 8008 del mismo nombre de host." }, "firstLaunch": { "heading": "Flujo de primer arranque", @@ -117,14 +117,14 @@ "loginImageCaption": "Una vez configurada la autenticación, cada visita al panel empieza aquí. Con 2FA activado, la pantalla pide el código de 6 dígitos en un segundo paso tras aceptar la contraseña.", "loginFlowTitle": "Flujo de login", "twofaIntro": "Con 2FA activado, la misma llamada devuelve primero requires_totp: true. Reemite con el código de 6 dígitos:", - "publicTitle": "Acceso público y sondas protegidas", - "publicIntro": "El inicio de sesión y su estado son públicos. Puedes crear la cuenta mientras no haya usuario y contraseña guardados, incluso tras rechazar la protección. Las sondas de datos del sistema requieren autenticación cuando la protección está activa:", + "publicTitle": "Endpoints públicos (sin token)", + "publicIntro": "El inicio de sesión, su estado, la configuración inicial y el endpoint ligero /api/system-info son públicos:", "publicItems": [ "/api/auth/login y /api/auth/status son públicos. /api/auth/setup crea la cuenta inicial y rechaza sobrescribir credenciales existentes.", "/api/system-info es un endpoint público de información básica del sistema, incluido health.status. No lleva el requisito de token. /api/auth/status también es público y sirve para comprobar disponibilidad." ], "cryptoTitle": "Criptografía y almacenamiento", - "cryptoIntro": "ProxMenux Monitor es código abierto — nada de esto es secreto. Documentar el stack aquí de forma explícita es una decisión deliberada: los operadores que guardan credenciales en su host merecen saber cómo se protegen esas credenciales antes de decidir confiar en ellas. Los algoritmos de abajo son los mismos que usa el código en scripts/auth_manager.py; esta sección es un contrato, no una promesa de marketing.", + "cryptoIntro": "ProxMenux Monitor es código abierto — nada de esto es secreto. Documentar el stack aquí de forma explícita es una decisión deliberada: los usuarios que guardan credenciales en su host merecen saber cómo se protegen esas credenciales antes de decidir confiar en ellas. Los algoritmos de abajo son los mismos que usa el código en scripts/auth_manager.py; esta sección es un contrato, no una promesa de marketing.", "headerAsset": "Elemento", "headerAlgo": "Algoritmo", "headerWhere": "Ubicación", @@ -146,7 +146,7 @@ }, { "asset": "Secret TOTP de 2FA", - "algorithm": "TOTP estándar (RFC 6238), con secreto codificado en base32. Los ocho códigos de recuperación son de un solo uso y se almacenan como hashes SHA-256.", + "algorithm": "TOTP estándar (RFC 6238), con secreto codificado en base32. Los ocho códigos de backup son de un solo uso y se almacenan como hashes SHA-256.", "where": "auth.json → totp_secret + backup_codes[]" }, { @@ -158,9 +158,9 @@ "authJsonTitle": "auth.json — qué contiene y cómo se protege", "authJsonBody": "Todo lo que ProxMenux Monitor necesita para autenticarte vive en un único archivo: /root/.config/proxmenux-monitor/auth.json, modo 0600, propietario root. El archivo guarda hashes (PBKDF2) y material de firma (jwt_secret, totp_secret) — nunca una contraseña en texto plano. Trátalo como cualquier otro secreto de solo-root: si haces backup o replicas el host, cifra el destino y nunca lo subas a control de versiones.", "rotateTitle": "Rotar jwt_secret invalida todos los JWTs existentes", - "rotateBody": "Si auth.json se regenera (borrado manual, reinstalación, restauración desde un backup con un secret distinto) el jwt_secret cambia y cada JWT previamente emitido — tanto sesiones interactivas como API tokens de larga duración — falla la verificación con \"Invalid or expired token\". La UI marca los API tokens afectados con un badge Invalid — regenerate para que el operador sepa que tiene que revocarlos y volver a emitirlos; Home Assistant / scripts / cualquier cliente externo necesita un token fresco después de eso.", + "rotateBody": "Si auth.json se regenera (borrado manual, reinstalación, restauración desde un backup con un secret distinto) el jwt_secret cambia y cada JWT previamente emitido — tanto sesiones interactivas como API tokens de larga duración — falla la verificación con \"Invalid or expired token\". La UI marca los API tokens afectados con un badge Invalid — regenerate para que el usuario sepa que tiene que revocarlos y volver a emitirlos; Home Assistant / scripts / cualquier cliente externo necesita un token fresco después de eso.", "recoverTitle": "Recuperar una contraseña perdida", - "recoverIntro": "No hay un flujo online de \"olvidé mi contraseña\" — por diseño, ya que el panel corre en el propio host del operador y el camino de recuperación es acceso shell a ese host. ProxMenux trae un reset guiado dentro del menú de configuración para que no tengas que editar a mano auth.json:", + "recoverIntro": "No hay un flujo online de \"olvidé mi contraseña\" — por diseño, ya que el panel corre en el propio host del usuario y el camino de recuperación es acceso shell a ese host. ProxMenux trae un reset guiado dentro del menú de configuración para que no tengas que editar a mano auth.json:", "survivesTitle": "Qué sobrevive al reset", "survivesBody": "Solo el login interactivo se borra. El jwt_secret y los api_tokens registrados se preservan — así que Home Assistant y cualquier otro script que use un API token de larga duración siguen funcionando sin reconfiguración. Si quieres una pizarra totalmente limpia (también rotar el secret JWT), borra auth.json manualmente y reinicia el servicio. El siguiente arranque genera un secret fresco y todos los tokens viejos se vuelven inválidos.", "physicalTitle": "Prerrequisito de acceso físico", @@ -170,7 +170,7 @@ "heading": "Autenticación de dos factores (TOTP)", "intro": "El 2FA añade un segundo factor encima de tu contraseña: un código de 6 dígitos que rota cada 30 segundos, generado en un móvil o gestor de contraseñas que controlas. Aunque alguien obtenga la contraseña, sigue sin poder entrar sin el código de tu dispositivo. ProxMenux Monitor implementa el protocolo estándar TOTP (RFC 6238), así que cualquier app autenticadora funciona.", "pickTitle": "Elige una app autenticadora", - "pickIntro": "Si ya tienes una aplicación TOTP, puedes usarla aquí. La tabla recoge opciones habituales: algunas son gratuitas y otras requieren suscripción. También cambian las plataformas y los métodos de copia de seguridad.", + "pickIntro": "Si ya tienes una aplicación TOTP, puedes usarla aquí. La tabla recoge opciones habituales: algunas son gratuitas y otras requieren suscripción. También cambian las plataformas y los métodos de backup.", "headerApp": "Aplicación", "headerPlatforms": "Plataformas", "headerAppNotes": "Notas", @@ -243,17 +243,17 @@ } ], "backupTitle": "Para qué importa realmente el \"backup\"", - "backupBody": "Si pierdes el dispositivo autenticador, usa un código de recuperación guardado o restaura una copia que hubieras configurado previamente. La sincronización en la nube y las exportaciones varían según la aplicación; comprueba que restauren los secretos TOTP. El acceso root al host también permite recuperar el acceso, como se explica abajo. Conserva una copia separada y segura.", + "backupBody": "Si pierdes el dispositivo autenticador, usa un código de backup guardado o restaura un backup de la app que hubieras configurado previamente. La sincronización en la nube y las exportaciones varían según la aplicación; comprueba que restauren los secretos TOTP. El acceso root al host también permite recuperar el acceso, como se explica abajo. Conserva un backup separado y seguro.", "setupTitle": "Configuración paso a paso desde el panel", "setupImageAlt": "Pantalla de configuración de 2FA con código QR y códigos de backup", - "setupImageCaption": "El diálogo de 2FA muestra un código QR, el secreto Base32 para introducirlo manualmente y ocho códigos de recuperación de un solo uso. Cópialos antes de cerrar; no volverán a mostrarse.", + "setupImageCaption": "El diálogo de 2FA muestra un código QR, el secreto Base32 para introducirlo manualmente y, tras la verificación, ocho códigos de backup de un solo uso. Cópialos antes de cerrar; no volverán a mostrarse.", "setupSteps": [ "Instala la app autenticadora en tu móvil (o abre tu gestor de contraseñas). Una de las apps de la tabla de arriba. Solo necesitas hacerlo una vez — la misma app guardará códigos para cada servicio que protejas.", "Loguéate en el panel con tu usuario y contraseña.", - "Abre la pestaña Seguridad en la barra lateral y pulsa Activar 2FA. El diálogo muestra un QR, el secreto Base32 y ocho códigos de recuperación.", + "Abre la pestaña Seguridad en la barra lateral y pulsa Activar 2FA y Iniciar configuración. El diálogo muestra un QR y la clave manual; los ocho códigos de backup aparecen tras verificar el código.", "Añade la entrada a la app autenticadora:", - "Guarda los códigos de recuperación. Conserva los ocho en un gestor de contraseñas, nota cifrada o copia impresa segura. Cada uno funciona una vez si no tienes el autenticador.", - "Confirma escribiendo el código actual de 6 dígitos de la app en el campo \"Código de verificación\" del diálogo de setup y envía. Los códigos se refrescan cada 30 segundos, así que si caduca mientras escribes, simplemente introduce el siguiente.", + "Confirma escribiendo el código actual de 6 dígitos de la app en el campo \"Código de verificación\" del diálogo de configuración y envía. Los códigos se renuevan cada 30 segundos, así que si caduca mientras escribes, introduce el siguiente.", + "Guarda los códigos de backup. Tras la verificación, conserva los ocho en un gestor de contraseñas, nota cifrada o copia impresa segura. Cada uno funciona una vez si no tienes el autenticador.", "Hecho. El 2FA está ahora activo. La próxima vez que te logues, el panel pide primero la contraseña; una vez aceptada pide el código actual de 6 dígitos." ], "setupStep4Sub": [ @@ -261,17 +261,17 @@ "Plan B manual (cuando escanear no es posible — p. ej. configurando en el mismo móvil con el que abriste el panel): pulsa Añadir cuenta → Introducir clave de setup. Escribe cualquier nombre (p. ej. Proxmox Monitor), pega la cadena Base32 del diálogo, deja Tipo como Basado en tiempo, guarda." ], "testTitle": "Prueba antes de cerrar sesión", - "testBody": "Mantén la sesión actual abierta y prueba un nuevo acceso en una ventana privada inmediatamente después de configurar 2FA. Si el código falla, comprueba los relojes del servidor y del móvil antes de cerrar la sesión válida. Si ya perdiste el acceso, usa un código de recuperación o edita auth.json desde la consola del host.", + "testBody": "Mantén la sesión actual abierta y prueba un nuevo acceso en una ventana privada inmediatamente después de configurar 2FA. Si el código falla, comprueba los relojes del servidor y del móvil antes de cerrar la sesión válida. Si ya perdiste el acceso, usa un código de backup o edita auth.json desde la consola del host.", "lostTitle": "Autenticador perdido", "lostIntro": "Tres salidas de emergencia, en orden de cuán disruptivas son:", "lostItems": [ - "Usa un código de recuperación. Introduce uno de los ocho códigos guardados en el campo TOTP. Funciona una vez; los no usados siguen siendo válidos. Tras entrar, configura 2FA de nuevo desde Ajustes para obtener ocho códigos nuevos.", + "Usa un código de backup. Introduce uno de los ocho códigos guardados en el campo TOTP. Funciona una vez; los no usados siguen siendo válidos. Tras entrar, abre Seguridad, elige Desactivar 2FA y después Activar 2FA para obtener ocho códigos nuevos.", "Restaura el autenticador desde la nube / backup. Si tu app tiene sync en la nube (Google, Microsoft, Authy, Apple Passwords vía iCloud Keychain, Ente, 2FAS) instálala en un dispositivo nuevo, loguéate y las entradas reaparecen. Si tu app usa un archivo de exportación cifrado (Aegis, Raivo, FreeOTP+), instala la app en el dispositivo nuevo e importa el archivo.", "Desactiva el 2FA desde la shell del host. Cuando las opciones anteriores no están disponibles, edita /root/.config/proxmenux-monitor/auth.json en el host Proxmox (necesitas SSH root o acceso por consola), pon totp_enabled a false, guarda y reinicia el servicio:" ], "lostShellOutro": "Puedes loguearte con usuario + contraseña solo, luego reactivar el 2FA desde Settings.", "disableTitle": "Desactivar el 2FA", - "disableBody": "Abre Seguridad y elige Desactivar 2FA. POST /api/auth/totp/disable exige la contraseña actual y un código TOTP o de recuperación válido. Elimina el secreto TOTP y los códigos de recuperación. Borra también la entrada antigua en la aplicación autenticadora.", + "disableBody": "Abre Seguridad y elige Desactivar 2FA. POST /api/auth/totp/disable exige la contraseña actual y un código TOTP o de backup válido. Elimina el secreto TOTP y los códigos de backup. Elimina también la entrada antigua en la aplicación autenticadora.", "rejectedTitle": "El código de 6 dígitos se rechaza siempre", "rejectedIntro": "El TOTP está basado en tiempo — el reloj del servidor y el del móvil deben coincidir dentro de unos ~30 s. Dos comprobaciones:", "rejectedItems": [ @@ -316,7 +316,7 @@ "calloutBody": "Monitor puede usar un certificado gestionado por Proxmox o archivos de certificados propios. No emite certificados ACME. Para emitirlos y renovarlos automáticamente, usa ACME de Proxmox o un proxy inverso como Caddy, Traefik o Nginx y asegúrate de cargar los certificados renovados." }, "gateway": { - "heading": "Pasarela segura (Tailscale)", + "heading": "Secure Gateway (Tailscale)", "intro": "Un proxy inverso es una opción de acceso remoto. Secure Gateway permite acceder sin exponer TCP 8008: despliega un LXC Alpine con Tailscale como router de subred. El acceso a la IP LAN del host depende de las rutas aprobadas y de las reglas de acceso de la tailnet.", "calloutTitle": "Por qué esto es cómodo", "calloutBody": "Usa la URL LAN http://<proxmox-lan-ip>:8008 mediante la ruta de subred aprobada. Tailscale usa SNAT por defecto, por lo que Monitor suele ver la IP LAN de la pasarela, no la dirección 100.x.y.z del cliente. Los registros y Fail2Ban identifican la dirección de origen que recibe el host.", diff --git a/web/messages/es/docs/monitor/ai-assistant.json b/web/messages/es/docs/monitor/ai-assistant.json index 05492b10..78ab18ca 100644 --- a/web/messages/es/docs/monitor/ai-assistant.json +++ b/web/messages/es/docs/monitor/ai-assistant.json @@ -14,7 +14,7 @@ }, "intro": { "title": "Desactivado por defecto, un solo interruptor para activarlo", - "body": "La reescritura con IA viene desactivada. Actívala en Ajustes → Notificaciones → Avanzado: mejora con IA. Si falla el enriquecimiento o la reescritura, se envía la plantilla original. Cada reescritura tiene un tiempo límite de 25 segundos; al alcanzarlo se usa la plantilla en lugar de esperar indefinidamente." + "body": "La reescritura con IA viene desactivada. Actívala en Ajustes → Notificaciones → Avanzado: mejora con IA. Si falla el enriquecimiento o la reescritura, se envía la plantilla original. Las reescrituras de la cola de eventos tienen un tiempo límite de 25 segundos; al alcanzarlo se envía la plantilla en lugar de esperar." }, "howItWorks": { "heading": "Cómo funciona", @@ -83,7 +83,7 @@ "intro1": "Cada proveedor comercial cobra por token, así que merece la pena entender qué es un token antes de elegir un plan. Un token son aproximadamente cuatro caracteres de texto en inglés o unas tres cuartas partes de una palabra. La frase \"Backup completed on storage local-bak\" son unos ocho tokens. Un extracto corto de journal de diez líneas puede ser 200-400 tokens según la densidad técnica.", "intro2": "Se facturan dos cosas en cada llamada:", "items": [ - "Tokens de entrada: incluyen las instrucciones del sistema y el mensaje de usuario: severidad, título, texto de la plantilla y contexto adicional. La cantidad depende del prompt y del evento. Cada canal reescrito puede consumir sus propios tokens de entrada; los informes de copia completada y fallida omiten la IA.", + "Tokens de entrada: incluyen las instrucciones del sistema y el mensaje de usuario: severidad, título, texto de la plantilla y contexto adicional. La cantidad depende del prompt y del evento. Cada canal reescrito puede consumir sus propios tokens de entrada; los informes de backup completado y fallido omiten la IA.", "Tokens de salida — lo que el modelo escribe de vuelta. El Monitor lo limita con max_tokens (mira la tabla de abajo). El límite es un tope, no un cargo: si el modelo produce 250 tokens con un tope de 1500, pagas 250." ], "capsIntro": "Estos son los topes reales que aplica el dispatcher, tomados directamente de AI_DETAIL_TOKENS en notification_templates.py:", @@ -109,7 +109,7 @@ ], "customNote": "El modo de prompt personalizado usa un tope fijo de 500 tokens de salida independientemente del nivel de detalle — el prompt personalizado está bajo tu control y el tope protege contra respuestas descontroladas.", "sizingTitle": "Dimensionamiento práctico", - "sizingBody": "Estima el consumo como eventos reescritos × canales con IA × tokens de entrada y salida por llamada. Por ejemplo: 50 eventos × un canal × (500 de entrada + 300 de salida) son 40.000 tokens al día. El consumo y coste reales dependen del modelo, contexto, caché y límites del proveedor. Nivel de detalle por canal explica cómo usar brief para chat en lugar de standard, manteniendo informes detallados por correo." + "sizingBody": "Estima el consumo como eventos reescritos × canales con IA × tokens de entrada y salida por llamada. Por ejemplo: 50 eventos × un canal × (2.000 de entrada + 300 de salida) son unos 115.000 tokens al día, porque el prompt de sistema predeterminado ya ocupa unos 1.500 tokens. El consumo y coste reales dependen del modelo, contexto, caché y límites del proveedor. Nivel de detalle por canal explica cómo usar brief para chat en lugar de standard, manteniendo informes detallados por correo." }, "providers": { "heading": "Proveedores de IA", @@ -142,7 +142,7 @@ "items": [ "Clave API: console.anthropic.com/settings/keys", "Ejemplos de la lista de modelos incluida: claude-haiku-4-5-20251001, claude-sonnet-4-6, claude-opus-4-6.", - "Recomendación incluida: claude-haiku-4-5-20251001. Esta versión exacta figura como recomendada; los modelos Claude 3.5 de la documentación anterior ya no están en la lista incluida." + "Recomendación incluida: claude-haiku-4-5-20251001, una versión fija y no un alias que cambie." ] }, "gemini": { @@ -215,7 +215,7 @@ "shareTitle": "Compartir prompts con la comunidad", "shareIntro": "El botón Export escribe tu prompt personalizado actual en un archivo (.txt / .md) que puedes guardar como backup o pasar a otra persona. Import lo trae de vuelta. El tercer botón al lado enlaza con una galería comunitaria pública en GitHub:", "shareLinkLabel": "github.com/MacRimi/ProxMenux/discussions — Comparte prompts personalizados para notificaciones de IA", - "shareOutro": "Navega la discusión para ver qué han construido otros operadores — alertas escuetas tipo pager, reportes técnicos verbosos, variantes específicas por idioma. Si tuneas el tuyo y te gusta el resultado, publícalo allí: incluso una descripción de un párrafo de para qué optimiza tu prompt ayuda a la gente a elegir un buen punto de partida. El feedback sobre lo que funciona y lo que no es igualmente bienvenido." + "shareOutro": "Navega la discusión para ver qué han construido otros usuarios — alertas escuetas tipo pager, reportes técnicos verbosos, variantes específicas por idioma. Si tuneas el tuyo y te gusta el resultado, publícalo allí: incluso una descripción de un párrafo de para qué optimiza tu prompt ayuda a la gente a elegir un buen punto de partida. El feedback sobre lo que funciona y lo que no es igualmente bienvenido." }, "suggestions": { "heading": "Sugerencias de IA (BETA)", diff --git a/web/messages/es/docs/monitor/api-reference.json b/web/messages/es/docs/monitor/api-reference.json index c95dbcbe..480e144f 100644 --- a/web/messages/es/docs/monitor/api-reference.json +++ b/web/messages/es/docs/monitor/api-reference.json @@ -1,7 +1,7 @@ { "meta": { "title": "API de Proxmox Monitor — Referencia de integración | ProxMenux", - "description": "Endpoints HTTP de ProxMenux Monitor para Home Assistant, Homepage, Grafana, Prometheus, n8n y paneles propios. Consulta el estado y ejecuta operaciones documentadas: control de VM, inicio de copias, notificaciones y confirmación de alertas.", + "description": "Endpoints HTTP de ProxMenux Monitor para Home Assistant, Homepage, Grafana, Prometheus, n8n y paneles propios. Consulta el estado y ejecuta operaciones documentadas: control de VM, inicio de backups, notificaciones y confirmación de alertas.", "ogTitle": "API de Proxmox Monitor — Referencia de integración", "ogDescription": "Endpoints de ProxMenux Monitor para Home Assistant, Homepage, Grafana, Prometheus, n8n y paneles propios.", "twitterTitle": "API de Proxmox Monitor | ProxMenux", @@ -14,7 +14,7 @@ }, "intro": { "title": "Para qué es esta página", - "body": "Esta página reúne endpoints para integraciones externas: datos de lectura y operaciones como iniciar copias, enviar avisos y confirmar alertas. La API usa el mismo proceso Flask que sirve el panel en TCP 8008. La dirección de escucha y TLS se explican en Acceso y autenticación." + "body": "Esta página reúne endpoints para integraciones externas: datos de lectura y operaciones como iniciar backups, enviar avisos y confirmar alertas. La API usa el mismo proceso Flask que sirve el panel en TCP 8008. La dirección de escucha y TLS se explican en Acceso y autenticación." }, "headerEndpoint": "Endpoint", "headerMethod": "Método", @@ -102,9 +102,9 @@ }, "actions": { "heading": "Acciones del sistema", - "intro": "Estas acciones asíncronas se ejecutan en unidades systemd transitorias. Con autenticación activa, sus rutas de escritura exigen full_admin; read_only puede consultar .../status. El inicio aceptado devuelve HTTP 202 y estado; consulta .../status para el progreso. El control de invitados y las copias usan respuestas distintas, explicadas abajo.", + "intro": "Estas acciones asíncronas se ejecutan en unidades systemd transitorias. Con autenticación activa, sus rutas de escritura exigen full_admin; read_only puede consultar .../status. El inicio aceptado devuelve HTTP 202 y estado; consulta .../status para el progreso. El control de invitados y los backups usan respuestas distintas, explicadas abajo.", "shapeTitle": "Formato de respuesta común", - "shapeIntro": "Las acciones asíncronas del sistema comparten este objeto JSON de estado. El control de invitados y las copias tienen formatos distintos:", + "shapeIntro": "Las acciones asíncronas del sistema comparten este objeto JSON de estado. El control de invitados y los backups tienen formatos distintos:", "shapeCode": "{\n \"unit\": \"proxmenux-action-pve-update.service\",\n \"state\": \"idle | running | success | failed | cancelled\",\n \"started_at\": \"Sat 2026-08-01 11:01:32 CEST\",\n \"finished_at\": null,\n \"exit_code\": null,\n \"result\": null\n}", "concurrencyTitle": "Concurrencia y cancelación", "concurrencyBody": "Iniciar otra ejecución de la misma acción activa devuelve HTTP 409. Solo se cancela si hay una ruta DELETE documentada, como en la actualización PVE. Su estado pasa a cancelled y conserva fechas. Los estados finales se guardan en memoria del proceso y pueden perderse al reiniciar Monitor.", @@ -162,7 +162,7 @@ { "endpoint": "/api/vms//backup", "method": "POST", - "use": "Crea una copia vzdump de una VM o LXC. Campos opcionales, ajustables según el almacenamiento: storage (destino PVE), mode (snapshot, suspend o stop), compress (zstd, lzo, gzip o none), protected (true o false), notes, notification (auto, always, failure o never) y pbs_change_detection (default, legacy o data). Devuelve el UPID de la tarea PVE." + "use": "Crea un backup vzdump de una VM o LXC. Campos opcionales, ajustables según el almacenamiento: storage (destino PVE), mode (snapshot, suspend o stop), compress (zstd, lzo, gzip o none), protected (true o false), notes y pbs_change_detection (default, legacy o data). Devuelve el UPID de la tarea PVE." }, { "endpoint": "/api/vms//backups", @@ -171,7 +171,7 @@ } ], "syncVsAsyncTitle": "Dos tipos de acción", - "syncVsAsyncBody": "Encendido, apagado y actualizaciones del host usan unidades systemd transitorias con .../status. Solo la actualización PVE tiene aquí una ruta de cancelación DELETE. El control VM/LXC devuelve una tarea que debe consultarse; la copia devuelve un UPID de trabajo en segundo plano. Aceptar la petición no equivale a terminarla. Autenticación y permisos dependen de la ruta.", + "syncVsAsyncBody": "Encendido, apagado y actualizaciones del host usan unidades systemd transitorias con .../status. Solo la actualización PVE tiene aquí una ruta de cancelación DELETE. El control VM/LXC devuelve una tarea que debe consultarse; el backup devuelve un UPID de trabajo en segundo plano. Aceptar la petición no equivale a terminarla. Autenticación y permisos dependen de la ruta.", "curlTitle": "Ejemplo curl", "curlBody": "Inicia una actualización PVE y consulta hasta que termine: la secuencia que usaría una automatización Home Assistant o un playbook Ansible.", "curlCode": "TOKEN=\n\ncurl -sSf -X POST \\\n -H \"Authorization: Bearer $TOKEN\" \\\n https://:8008/api/system/pve-update/run\n\nwhile true; do\n state=$(curl -sSf -H \"Authorization: Bearer $TOKEN\" \\\n https://:8008/api/system/pve-update/status | jq -r .state)\n [ \"$state\" != \"running\" ] && break\n sleep 30\ndone\necho \"final state: $state\"", @@ -286,7 +286,7 @@ { "endpoint": "/api/storage/smart//test", "method": "POST", - "use": "Inicia una prueba SMART. Esquema del cuerpo: '{'\"type\":\"short\"|\"long\"'}'." + "use": "Inicia una prueba SMART. Esquema del cuerpo: '{'\"test_type\":\"short\"|\"long\"'}'." }, { "endpoint": "/api/storage/smart/schedules", @@ -356,7 +356,7 @@ { "endpoint": "/api/vms//backups", "method": "GET", - "use": "Copias de seguridad conservadas para este invitado." + "use": "Backups conservados para este invitado." }, { "endpoint": "/api/vms//control", @@ -381,17 +381,17 @@ ] }, "backups": { - "heading": "Copias de seguridad", + "heading": "Backups", "rows": [ { "endpoint": "/api/backups", "method": "GET", - "use": "Copias encontradas en almacenamientos dir, NFS, CIFS y PBS consultados desde el nodo local. No explora todos los nodos del clúster." + "use": "Backups encontrados en almacenamientos dir, NFS, CIFS y PBS consultados desde el nodo local. No explora todos los nodos del clúster." }, { "endpoint": "/api/backup-storages", "method": "GET", - "use": "Almacenamientos que admiten copias de seguridad, con espacio libre." + "use": "Almacenamientos que admiten backups, con espacio libre." } ] }, diff --git a/web/messages/es/docs/monitor/architecture.json b/web/messages/es/docs/monitor/architecture.json index f7821bee..7dd9fce6 100644 --- a/web/messages/es/docs/monitor/architecture.json +++ b/web/messages/es/docs/monitor/architecture.json @@ -73,13 +73,13 @@ "intro": "AppImage es un sistema de archivos que se monta al ejecutarlo. AppRun en su raíz prepara el entorno y lanza flask_server.py:", "consequencesIntro": "Dos consecuencias de esta estructura:", "consequences": [ - "Entorno Python incluido. El intérprete y sus paquetes vienen en AppImage, evitando instalarlos en Python del host. La aplicación sigue usando interfaces del kernel y herramientas externas del host.", + "Paquetes Python incluidos. Los paquetes Python vienen en la AppImage y se ejecutan con el intérprete Python 3.11 (PVE 8) o 3.13 (PVE 9) del propio host, sin instalar nada en su Python del sistema. La aplicación sigue usando interfaces del kernel y herramientas externas del host.", "Clientes de hardware incluidos. Contiene ipmitool, lm-sensors y upsc. Las lecturas dependen del hardware compatible, acceso a sensores y, para el SAI, un servidor NUT configurado." ] }, "flask": { "heading": "Estructura de la aplicación Flask", - "intro": "flask_server.py crea una instancia Flask(__name__) con CORS restringido, registra directamente nueve blueprints e inicializa el terminal. La tabla destaca módulos principales; también registra auditoría, copias VM y PBS. Las precargas PVE solo se ejecutan en hosts PVE.", + "intro": "flask_server.py crea una instancia Flask(__name__) con CORS restringido, registra directamente diez blueprints e inicializa el terminal. La tabla destaca módulos principales; también registra PBS, enlaces del Monitor, auditoría y backups de VM. Las precargas PVE solo se ejecutan en hosts PVE.", "headerBlueprint": "Blueprint / módulo", "headerPrefix": "Prefijo de rutas", "headerOwns": "Responsabilidad", @@ -242,17 +242,17 @@ "Actualizaciones: paquetes pendientes y parches de seguridad.", "Registros: patrones persistentes, picos y cascadas en el journal del sistema.", "Memoria: actividad del OOM killer y presión RAM sostenida.", - "Temperatura: lecturas CPU y discos frente a umbrales de monitorización; los sensores disponibles dependen del hardware.", + "CPU: uso y temperatura de la CPU frente a los umbrales configurables; los sensores disponibles dependen del hardware.", "Seguridad: fallos de acceso, bloqueos y estado del jail Fail2Ban." ], - "afterIntro": "Los hallazgos usan error_key, categoría y gravedad estables. Las filas de errors se actualizan con last_seen y recuentos, sin duplicarlas. El envío de avisos tiene además sus propias huellas y tiempos de espera.", + "afterIntro": "Los hallazgos usan error_key, categoría y gravedad estables. Las filas de errors se actualizan en el sitio (last_seen, gravedad, motivo), sin duplicarlas. El envío de avisos tiene además sus propias huellas y tiempos de espera.", "cycleEnd": "La limpieza puede resolver errores obsoletos con la duración de silenciamiento por categoría y reglas de estado, retirar registros huérfanos de recursos eliminados y borrar events de más de 30 días. Las categorías se explican en Panel → Health Monitor." }, "notifications": { "heading": "Motor de notificaciones", "intro": "notification_manager.py coordina el envío: carga canales, gestiona la cola y ofrece una API Python para Flask y Health Monitor, además de una entrada de consola para los hooks .sh de ProxMenux.", "items": [ - "Los observadores generan eventos: JournalWatcher sigue el journal, TaskWatcher consulta tareas Proxmox, ProxmoxHookWatcher recibe hooks de copias, replicación y snapshots, y PollingCollector gestiona fuentes lentas.", + "Los observadores generan eventos: JournalWatcher sigue el journal, TaskWatcher consulta tareas Proxmox, ProxmoxHookWatcher recibe hooks de backups, replicación y snapshots, y PollingCollector gestiona fuentes lentas.", "Las plantillas convierten eventos en título y texto. El proveedor de IA configurado (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter) puede reformularlos en lenguaje natural. Ambas versiones se guardan en notification_history.", "Los canales envían por Telegram, Discord, correo, Gotify, Pushover y Apprise, entre otros. Las implementaciones en notification_channels.py comparten create_channel() / send().", "Cifrado. Los ajustes sensibles (telegram.bot_token, discord.webhook_url, pushover.user_key, pushover.api_token, ai_api_key_*, email.password) se cifran con la clave de .notification_key antes de guardarse en la base de datos y se muestran enmascarados en la interfaz." @@ -264,9 +264,9 @@ "intro": "La pestaña Terminal conecta un cliente ligero xterm.js a un PTY del servidor por WebSocket. Hay dos modos:", "items": [ "Modo HTTP, predeterminado: el servidor Flask incluido y flask-sock gestionan el cambio de protocolo a WebSocket.", - "Modo HTTPS / WSS: usa gevent.pywsgi.WSGIServer con geventwebsocket.handler.WebSocketHandler para conexiones WebSocket sobre TLS." + "Modo HTTPS / WSS: usa gevent.pywsgi.WSGIServer con su gestor predeterminado; flask-sock atiende las conexiones WebSocket sobre TLS." ], - "outro": "Los procesos del terminal heredan User=root. Con autenticación activa, abrir WebSocket exige un ticket breve y de un solo uso, obtenido del endpoint de tickets autenticado con permisos administrativos. Si la autenticación está desactivada o se rechazó configurarla, la conexión sigue ese modo sin autenticación.", + "outro": "Los procesos del terminal heredan User=root. Abrir WebSocket exige un ticket breve y de un solo uso, obtenido del endpoint de tickets autenticado con permisos administrativos.", "proxyNote": "Si usas un proxy inverso, permite el tráfico WebSocket y sus cabeceras Upgrade y Connection. El terminal necesita ese reenvío." }, "proxy": { diff --git a/web/messages/es/docs/monitor/audit-report/index.json b/web/messages/es/docs/monitor/audit-report/index.json index b4bf8e0c..c97f501f 100644 --- a/web/messages/es/docs/monitor/audit-report/index.json +++ b/web/messages/es/docs/monitor/audit-report/index.json @@ -34,7 +34,7 @@ { "icon": "fileText", "title": "Política: ¿qué se espera?", - "body": "Declara qué invitados necesitan copia de seguridad o deben arrancar con el host, qué almacenamiento es esencial y los umbrales de las comprobaciones." + "body": "Declara qué invitados necesitan backup o deben arrancar con el host, qué almacenamiento es esencial y los umbrales de las comprobaciones." } ] } diff --git a/web/messages/es/docs/monitor/audit-report/policy.json b/web/messages/es/docs/monitor/audit-report/policy.json index b8463cb0..e7c33e31 100644 --- a/web/messages/es/docs/monitor/audit-report/policy.json +++ b/web/messages/es/docs/monitor/audit-report/policy.json @@ -1,7 +1,7 @@ { "meta": { "title": "Política | Auditoría e informes", - "description": "Política del nodo en Auditoría e informes: copias de seguridad, arranque automático y objetivo de recuperación de cada invitado, función de cada almacenamiento y umbrales de comprobación." + "description": "Política del nodo en Auditoría e informes: backups, arranque automático y objetivo de recuperación de cada invitado, función de cada almacenamiento y umbrales de comprobación." }, "header": { "title": "Política", diff --git a/web/messages/es/docs/monitor/dashboard/hardware.json b/web/messages/es/docs/monitor/dashboard/hardware.json index 167d8ddb..d0259219 100644 --- a/web/messages/es/docs/monitor/dashboard/hardware.json +++ b/web/messages/es/docs/monitor/dashboard/hardware.json @@ -31,7 +31,7 @@ "Placa base: fabricante, modelo, versión y fecha de BIOS y UUID SMBIOS. Sirve para localizar la página de descarga correcta del fabricante al buscar firmware." ], "memoryTitle": "Módulos de memoria", - "memoryBody": "Una fila por ranura ocupada según dmidecode: etiqueta, capacidad del módulo, tipo (DDR4 / DDR5 / variantes ECC), velocidad configurada y nominal, fabricante, referencia y número de serie. Las ranuras vacías aparecen atenuadas para mostrar el margen de ampliación.", + "memoryBody": "Una fila por slot ocupado según dmidecode: etiqueta, capacidad del módulo, tipo (DDR4 / DDR5 / variantes ECC), velocidad configurada y nominal, fabricante, referencia y número de serie. Los slots vacíos aparecen atenuados para mostrar el margen de ampliación.", "thermalTitle": "Monitoreo Térmico", "thermalIntro": "Siete bloques alimentados por lm-sensors, sysfs y lectores específicos de cada herramienta. Los sensores hwmon de almacenamiento se asocian al dispositivo de bloques físico, con su modelo y ruta /dev/.... Cada bloque se oculta si no hay sensores en su categoría.", "thermalItems": [ @@ -52,7 +52,7 @@ "lxcImageAlt": "Tarjetas gráficas: iGPU Intel UHD Graphics con i915 y NVIDIA Quadro P1000 con nvidia, ambas listas para contenedores LXC", "lxcImageCaption": "Mismo nodo después de devolver la tarjeta NVIDIA al driver nativo — ambas GPUs ahora Ready for LXC containers.", "realtimeTitle": "Ventana de monitorización en tiempo real", - "realtimeBody": "Pulsa una GPU para abrir su monitorización por ranura, que consulta la herramienta del fabricante cada tres segundos. Muestra fabricante, tipo, ranura PCI, controlador, módulos del kernel, uso de motores (Render/3D, Video, Blitter, VideoEnhance), frecuencias de gráficos y memoria, temperatura, consumo si está disponible, VRAM y procesos activos con carga por proceso. Datos de /api/gpu/<slot>/realtime.", + "realtimeBody": "Pulsa una GPU para abrir su monitorización por slot, que consulta la herramienta del fabricante cada tres segundos. Muestra fabricante, tipo, slot PCI, controlador, módulos del kernel, uso de motores (Render/3D, Video, Blitter, VideoEnhance), frecuencias de gráficos y memoria, temperatura, consumo si está disponible, VRAM y procesos activos con carga por proceso. Datos de /api/gpu/<slot>/realtime.", "toolsIntro": "Herramienta del fabricante usada para cada GPU:", "headerVendor": "Proveedor", "headerTool": "Herramienta", @@ -123,9 +123,9 @@ "intro": "Todos los dispositivos de bloques conocidos por el kernel, agrupados por tipo. Cada disco muestra su nombre (sda, nvme0n1, zram0…), tipo (SSD, HDD, NVMe SSD), modelo y enlace negociado. Pulsa para abrir modelo, número de serie, capacidad, interfaz y velocidad actual y máxima.", "imageAlt": "Tarjeta Storage Summary listando once dispositivos de bloque (SSDs SATA, HDDs SATA, SSDs NVMe y zram) con cadenas de modelo y velocidades de enlace negociadas; los dos discos NVMe muestran 3.0 x4 con la velocidad actual resaltada", "imageCaption": "Once dispositivos en este nodo. Los enlaces SATA aparecen como SATA <version>, <Gb/s> (current: ...); los NVMe como <PCIe gen> x<width>.", - "nvmeBody": "La línea de cada NVMe compara el enlace negociado con el máximo admitido. Si difieren, como un SSD Gen3 x4 funcionando a 3.0 x1 en una ranura de un solo carril, el valor actual aparece en ámbar. Permite detectar enlaces limitados al investigar discos lentos o cambios de carriles tras actualizar BIOS.", + "nvmeBody": "La línea de cada NVMe compara el enlace negociado con el máximo admitido. Si difieren, como un SSD Gen3 x4 funcionando a 3.0 x1 en un slot de un solo carril, el valor actual aparece en ámbar. Permite detectar enlaces limitados al investigar discos lentos o cambios de carriles tras actualizar BIOS.", "nvmeModalAlt": "Modal de detalle de disco NVMe para nvme0n1: tipo NVMe SSD, 953.9 GB de capacidad, velocidad actual de enlace 3.0 x1 resaltada en ámbar, velocidad máxima 3.0 x4, modelo WDC CL SN720, número de serie, interfaz PCIe/NVMe", - "nvmeModalCaption": "Detalles NVMe con enlace limitado: el disco admite x4, pero la ranura está conectada a x1.", + "nvmeModalCaption": "Detalles NVMe con enlace limitado: el disco admite x4, pero el slot está conectado a x1.", "outro": "Los datos SMART, autopruebas, historial e informe PDF están en Panel: Almacenamiento. Los mismos datos alimentan Salud y pruebas SMART de discos. Una prueba larga desde el script escribe el JSON mostrado por Monitor en Almacenamiento → Historial." }, "pci": { diff --git a/web/messages/es/docs/monitor/dashboard/network.json b/web/messages/es/docs/monitor/dashboard/network.json index 540d4847..20109a23 100644 --- a/web/messages/es/docs/monitor/dashboard/network.json +++ b/web/messages/es/docs/monitor/dashboard/network.json @@ -162,7 +162,7 @@ } ], "reportTitle": "Informe de latencia de red (PDF)", - "reportIntro": "Ambos modos tienen un botón Informe junto al selector de destino. Genera un PDF de las mediciones que puedes adjuntar a una solicitud de asistencia a tu proveedor de Internet.", + "reportIntro": "Ambos modos tienen un botón Informe junto al selector de destino. Abre un informe imprimible de las mediciones; guárdalo como PDF desde el diálogo de impresión del navegador y adjúntalo a una solicitud de asistencia a tu proveedor de Internet.", "reportPreviewAlt": "Primera página del informe PDF de latencia: resumen ejecutivo, indicador, estadísticas, gráfico y guía de umbrales", "reportPreviewCaption": "La primera página contiene resumen ejecutivo, indicador, estadísticas principales, serie temporal de latencia y guía de umbrales. Desde la página 2 aparecen la tabla de muestras y la metodología.", "downloadLabel": "Descargar informe de ejemplo de latencia (PDF)", diff --git a/web/messages/es/docs/monitor/dashboard/security.json b/web/messages/es/docs/monitor/dashboard/security.json index 11698780..7a09c303 100644 --- a/web/messages/es/docs/monitor/dashboard/security.json +++ b/web/messages/es/docs/monitor/dashboard/security.json @@ -136,7 +136,7 @@ "configCaption": "Edición del jail sshd: reduce Max Retries para SSH si solo accedes desde tu subred, o amplía Ban Time para el panel expuesto a Internet.", "outro": "La guía Qué instala, cómo se configura y cómo desinstalar incluye la instalación manual, el cambio de SSH MaxAuthTries y la relación con el registro proxmenux-auth.log. Consulta ProxMenux → Seguridad → Fail2Ban.", "calloutTitle": "Sin Fail2Ban, este mecanismo no bloquea las IP", - "calloutBody": "ProxMenux Monitor comprueba las IP bloqueadas por Fail2Ban a nivel de aplicación antes de procesar las peticiones de Flask. Consulta fail2ban-client y guarda el resultado en caché durante 30 segundos; no lee ninguna tabla SQL de bloqueos. Sin Fail2Ban, los intentos fallidos se registran en proxmenux-auth.log, pero este mecanismo no bloquea IPs." + "calloutBody": "ProxMenux Monitor comprueba las IP bloqueadas en la jaula proxmenux de Fail2Ban a nivel de aplicación antes de procesar las peticiones de Flask, con el resultado en caché durante 30 segundos. Sin Fail2Ban, los intentos fallidos se registran en proxmenux-auth.log y el inicio de sesión se limita a 5 intentos por IP cada 5 minutos, pero no se bloquea ninguna IP." }, "lynis": { "heading": "Auditoría de seguridad de Lynis", diff --git a/web/messages/es/docs/monitor/dashboard/settings.json b/web/messages/es/docs/monitor/dashboard/settings.json index d4d57152..c4d91dbc 100644 --- a/web/messages/es/docs/monitor/dashboard/settings.json +++ b/web/messages/es/docs/monitor/dashboard/settings.json @@ -26,7 +26,7 @@ }, "navigationOrder": { "heading": "Orden de navegación", - "intro": "Ordena los siete elementos principales: Resumen, Apps, VMs y LXCs, Nodo, Copias, Terminal y Administración. Pulsa Editar, arrastra las filas y guarda.", + "intro": "Ordena los siete elementos principales: Resumen, Apps, VMs y LXCs, Nodo, Backup, Terminal y Administración. Pulsa Editar, arrastra las filas y guarda.", "items": [ "Con el ratón, el arrastre empieza al pulsar. En pantallas táctiles requiere mantener la pulsación 250 ms para distinguirlo del desplazamiento.", "Los grupos Nodo y Administración se mueven completos; sus páginas internas conservan el orden establecido.", @@ -76,16 +76,16 @@ }, "thresholds": { "heading": "Umbrales de Health Monitor", - "intro": "La tarjeta anterior define cuánto dura el silencio tras descartar; esta define el valor que activa una alerta. La mayoría de controles tienen valores Aviso y Crítico ajustables. La tabla explica excepciones como la regla combinada de swap y el detector actual de RAM.", + "intro": "La tarjeta anterior define cuánto dura el silencio tras descartar; esta define el valor que activa una alerta. La mayoría de controles tienen valores Aviso y Crítico ajustables. La tabla explica excepciones como la regla combinada de swap.", "whatForTitle": "Para qué sirve", "whatForIntro": "Los valores predeterminados sirven como punto de partida, pero cada entorno tiene sus propias condiciones:", "whatForItems": [ - "Un homelab con un único SSD puede avisar antes de llenarse, por ejemplo al 75/90 %, para dejar margen a las instantáneas.", + "Un homelab con un único SSD puede avisar antes de llenarse, por ejemplo al 75/90 %, para dejar margen a los snapshots.", "Los umbrales de memoria deben reflejar las mediciones y la carga del host. La redundancia Ceph no justifica por sí sola relajar avisos, y el uso elevado de ARC de ZFS no equivale a memoria de trabajo irrecuperable.", "Elige umbrales de temperatura según las especificaciones del disco y sus condiciones reales. La refrigeración pasiva o forzada no determina por sí sola un límite seguro universalmente más bajo o más alto.", "Un host muy virtualizado puede alcanzar picos de CPU durante compilaciones sin necesitar avisos por cada pico del 80 %, pero debe seguir avisando de saturación sostenida." ], - "whatForOutro": "Los cambios admitidos se aplican en el siguiente análisis. Health Monitor lee /usr/local/share/proxmenux/health_thresholds.json cada ciclo sin reinicio. Algunos indicadores, como temperatura de disco, usan estos valores; ciertas barras de capacidad conservan sus propios cortes. La fila de RAM explica una excepción actual.", + "whatForOutro": "Los cambios admitidos se aplican en el siguiente análisis. Health Monitor lee /usr/local/share/proxmenux/health_thresholds.json cada ciclo sin reinicio. Algunos indicadores, como temperatura de disco, usan estos valores; ciertas barras de capacidad conservan sus propios cortes.", "coloursTitle": "Colores de estado de Aviso y Crítico", "coloursIntro": "Los widgets que usan el par Aviso/Crítico siguen los tres estados siguientes. Algunos indicadores, como las barras de capacidad PVE, tienen límites propios; su color no basta para deducir una alerta de Health Monitor.", "headerColour": "Color", @@ -125,7 +125,7 @@ "section": "Memoria", "warning": "85 %", "critical": "95 %", - "gates": "Presión de RAM del host. La configuración muestra Crítico al 95 %, pero el detector actual usa una regla fija del 90 % sostenido; cambiar ese ajuste no modifica actualmente esa rama de ejecución." + "gates": "Presión de RAM del host." }, { "section": "Uso de swap (solo crítico)", @@ -185,7 +185,7 @@ "section": "Almacenamiento PVE", "warning": "85 %", "critical": "95 %", - "gates": "Almacenamientos gestionados por PVE: LVM, LVM-thin, ZFS-pool, RBD/Ceph y PBS. No todos son backends de bloques." + "gates": "Solo almacenamientos PVE de tipo LVM, LVM-thin, ZFS-pool, RBD, CephFS y PBS. Los de tipo directorio, NFS y CIFS los cubre la fila de espacio en disco del host." }, { "section": "Pool ZFS", @@ -218,7 +218,7 @@ "toggleTitle": "Interruptor de aviso condicionado a la detección", "toggleBody": "El interruptor por canal lxc_updates_available en Notificaciones → Servicios solo aparece con la detección activa. Al desactivarla, la fila se oculta en todos los canales. Su preferencia se conserva en la base de datos y recupera el mismo valor al reactivarla.", "purgeTitle": "Qué se elimina al desactivar la detección", - "purgeBody": "Desactivarlo elimina de inmediato las entradas type=lxc de /usr/local/share/proxmenux/managed_installs.json. Los contadores de actualizaciones LXC de Hardware desaparecen en el siguiente refresco. Al reactivarlo, el próximo ciclo de detección repuebla el registro, o antes con una actualización manual de la API." + "purgeBody": "Desactivarlo elimina de inmediato las entradas type=lxc de /usr/local/share/proxmenux/managed_installs.json. Los contadores de actualizaciones LXC de la pestaña VM y LXC desaparecen en el siguiente refresco. Al reactivarlo, el próximo ciclo de detección repuebla el registro, o antes con una actualización manual de la API." }, "storageExclusions": { "heading": "Exclusiones de almacenamiento remoto", @@ -226,7 +226,7 @@ "imageCaption": "Controles Estado y Alertas por almacenamiento. Con ambos desactivados, deja de participar en Health Monitor y de enviar avisos. Sigue visible en Almacenamiento, marcado como excluido.", "intro": "Puedes excluir almacenamientos gestionados por Proxmox (NFS / CIFS / PBS / Ceph / iSCSI / etc.) con dos controles independientes:", "items": [ - "Estado — al desactivar este control, el almacenamiento deja de contar en la categoría Almacenamiento de Health Monitor. Útil para volúmenes de archivo habitualmente desconectados o destinos remotos de copia que solo se encienden según un horario.", + "Estado — al desactivar este control, el almacenamiento deja de contar en la categoría Almacenamiento de Health Monitor. Útil para volúmenes de archivo habitualmente desconectados o destinos remotos de backup que solo se encienden según un horario.", "Alertas — desactivarlo impide enviar avisos de este almacenamiento por los canales configurados, aunque los controles de estado sigan activos. Útil si quieres ver su estado en el panel sin recibir avisos." ], "outro": "Los almacenamientos excluidos siguen en la pestaña Almacenamiento con la insignia morada excluido, para mantener visible el inventario. El estado se guarda en la tabla SQLite excluded_storages." diff --git a/web/messages/es/docs/monitor/dashboard/storage.json b/web/messages/es/docs/monitor/dashboard/storage.json index 162982b3..7bb4c4ef 100644 --- a/web/messages/es/docs/monitor/dashboard/storage.json +++ b/web/messages/es/docs/monitor/dashboard/storage.json @@ -70,7 +70,7 @@ "items": [ "Ruta del dispositivo — /dev/sda, /dev/nvme0n1.", "Etiqueta de tipo: SATA / NVMe y su icono.", - "Etiqueta de sistema: marca naranja para los discos identificados como discos del SO. Se detectan mediante los montajes de / y /boot y reciben la etiqueta System. La ausencia de etiqueta no demuestra que se puedan borrar o reutilizar sin riesgo.", + "Etiqueta de sistema: marca naranja para los discos en uso por el host: montajes del sistema (/, /boot, /usr, /var…), swap activa, miembros de pools ZFS, volúmenes físicos LVM, miembros de RAID activos o etiquetas de partición del sistema. La ausencia de etiqueta no demuestra que se puedan borrar o reutilizar sin riesgo.", "Modelo: fabricante y modelo de smartctl -i.", "Capacidad: expresada en unidades legibles.", "Temperatura: °C actuales, con color según el umbral del tipo de disco; NVMe admite umbrales más altos que SATA.", @@ -84,7 +84,7 @@ }, "external": { "heading": "Almacenamiento externo (USB)", - "body": "Las unidades USB tienen una tarjeta propia, visible cuando hay alguna conectada. Muestra los mismos campos que los discos internos y una etiqueta naranja USB. Como suelen conectarse solo para copias o transferencias ocasionales, se conservan sus observaciones, pero los errores de E/S de una unidad USB desconectada no se escalan." + "body": "Las unidades USB tienen una tarjeta propia, visible cuando hay alguna conectada. Muestra los mismos campos que los discos internos y una etiqueta naranja USB. Como suelen conectarse solo para backups o transferencias ocasionales, se conservan sus observaciones, pero los errores de E/S de una unidad USB desconectada no se escalan." }, "drillIn": { "heading": "Diálogo de detalle del disco", @@ -112,14 +112,14 @@ "pdfPreviewAlt": "Primera página del informe SMART: resumen ejecutivo con indicador PASSED e información del disco", "pdfPreviewCaption": "Primera página: resumen, indicador PASSED e información completa del disco. El PDF de ejemplo incluye desgaste SSD, todos los atributos SMART e historial de pruebas.", "pdfDownloadLabel": "Descargar informe SMART de ejemplo (PDF)", - "pdfSectionsIntro": "El informe tiene seis secciones principales:", + "pdfSectionsIntro": "El informe incluye estas secciones principales:", "pdfSections": [ "Resumen ejecutivo: estado PASSED/FAILED, evaluación clara del disco —correcto, con desgaste o fallando— y cuatro datos: fecha del informe, tipo de última prueba, resultado y atributos comprobados.", "Información del disco: modelo, serie, capacidad, tipo HDD/SSD/NVMe, familia, formato, interfaz (SATA 3.3 · 6.0 Gb/s, …), TRIM, temperatura y umbral óptimo, horas y ciclos de encendido, SMART, sectores pendientes y reasignados y errores CRC.", "Desgaste y vida útil SSD (solo SSD/NVMe): indicador de vida restante, atributo de origen, desgaste actual, datos escritos y horas de encendido.", "Atributos SMART completos: ID, nombre, valor, peor valor, umbral, valor bruto y estado de cada atributo. Los principales —Reallocated Sector Ct, Power On Hours, Reported Uncorrect, UDMA CRC Error Count, Media Wearout Indicator, …— incluyen una explicación breve bajo su fila.", "Última autoprueba e historial completo: última prueba con tipo, resultado, mensaje final y horas de encendido en ese momento, más una tabla numerada de todas las pruebas conservadas.", - "Recomendaciones: acciones según el resultado. Para discos correctos: disco sano / pruebas periódicas / estrategia de copias. Si los atributos salen de rango, incluye indicaciones de sustitución." + "Recomendaciones: acciones según el resultado. Para discos correctos: disco sano / pruebas periódicas / estrategia de backups. Si los atributos salen de rango, incluye indicaciones de sustitución." ], "pdfOutro": "El navegador crea el informe imprimible; Imprimir y Guardar como PDF abren su diálogo de impresión. Elige un nombre como SMART-<short-id>.pdf. Conserva copias fechadas para comparar cambios o compartirlas con el fabricante.", "historyTitle": "Pestaña 3 — Historial", @@ -127,7 +127,7 @@ "historyImageCaption": "Historial de pruebas SMART del disco. Cada fila muestra tipo, fecha y hora, antigüedad, marca de última prueba y acciones de descarga de la salida smartctl y eliminación.", "historyIntro": "Pruebas cortas y extendidas completadas y conservadas para el disco. Cada entrada guarda la salida original de smartctl y los campos que Monitor interpreta para el panel. Acciones por fila:", "historyItems": [ - "Descargar: guarda la instantánea JSON con los datos de smartctl -a usados por el informe. Útil si el fabricante necesita los campos de diagnóstico originales.", + "Descargar: guarda el snapshot JSON de esa prueba (salida de smartctl -a --json, o nvme smart-log en NVMe cuando falla smartctl). Útil si el fabricante necesita los campos de diagnóstico originales.", "Eliminar: borra una prueba del historial manualmente. La retención de Programación (últimas 5 / 10 / 20) elimina automáticamente las más antiguas." ], "scheduleTitle": "Pestaña 4 — Programación", @@ -160,7 +160,7 @@ "tempWhyTitle": "Por qué importa el historial", "tempWhyItems": [ "Detectar tendencias. Una lectura aislada no revela que un disco lleva semanas calentándose, por ejemplo por fallos de ventilación, polvo o calor cercano. Las vistas de 7 y 30 días permiten ver la evolución.", - "Relacionar picos. Si una copia de seguridad o reconstrucción elevó brevemente la temperatura por encima del umbral, las vistas de 1 y 24 horas muestran si fue puntual o recurrente.", + "Relacionar picos. Si un backup o una reconstrucción elevó brevemente la temperatura por encima del umbral, las vistas de 1 y 24 horas muestran si fue puntual o recurrente.", "Ajustar umbrales. Antes de cambiarlos en Ajustes → Umbrales de Health Monitor, consulta el gráfico de 30 días para conocer el rango real de funcionamiento del disco." ], "obsTitle": "Historial de observaciones en las pestañas", @@ -184,7 +184,7 @@ ], "obsDedupTitle": "Agrupación de duplicados y repetición de avisos", "obsDedupBody1": "Las observaciones se agrupan por firma, una huella estable del tipo de error, dispositivo y campos clave del mensaje. Las repeticiones aumentan occurrence_count en la fila existente. Una firma distinta crea otra observación y cuenta como evento nuevo para las notificaciones.", - "obsDedupBody2": "Para evitar avisos en cascada, la primera combinación de disco, firma y gravedad notifica al operador. La misma combinación no vuelve a avisar hasta pasadas 24 horas, aunque aumente el contador. Un cambio de WARNING a CRITICAL interrumpe esa espera y avisa del empeoramiento.", + "obsDedupBody2": "Para evitar avisos en cascada, la primera combinación de disco, firma y gravedad notifica al usuario. La misma combinación no vuelve a avisar hasta pasadas 24 horas, aunque aumente el contador. Un cambio de WARNING a CRITICAL interrumpe esa espera y avisa del empeoramiento.", "obsDismissTitle": "Historial permanente y errores activos", "obsDismissBody1": "Las observaciones no se pueden descartar, ocultar ni borrar. Cada firma tiene una tarjeta; si se repite, aumenta el contador y actualiza la última fecha. El historial sigue al número de serie: otro disco empieza vacío aunque use el mismo puerto, y un cambio de nombre del kernel no pierde el historial.", "obsDismissBody2": "Resolver o descartar un error activo en Health Monitor no modifica sus observaciones. Se conservan después de la resolución automática, de modo que un aviso transitorio de la semana pasada siga visible hoy. Consulta Health Monitor para gestionar los errores activos." @@ -218,7 +218,7 @@ { "section": "Historial de autopruebas SMART", "endpoint": "/api/storage/smart//history", - "source": "Se guarda en /usr/local/share/proxmenux/smart/<disk>/ como instantáneas JSON." + "source": "Se guarda en /usr/local/share/proxmenux/smart/<disk>/ como snapshots JSON." }, { "section": "Observaciones permanentes", diff --git a/web/messages/es/docs/monitor/dashboard/system-logs.json b/web/messages/es/docs/monitor/dashboard/system-logs.json index a618efd4..7372eee7 100644 --- a/web/messages/es/docs/monitor/dashboard/system-logs.json +++ b/web/messages/es/docs/monitor/dashboard/system-logs.json @@ -18,7 +18,7 @@ "Entradas totales: número de registros dentro del intervalo del filtro activo.", "Errores: número de entradas con severidad ≤ 3 (err / crit / alert / emerg).", "Advertencias: número de entradas con severidad 4 (warning).", - "Copias de seguridad: número de entradas de tareas vzdump / PBS en el mismo intervalo." + "Backups: número de entradas de tareas vzdump / PBS en el mismo intervalo." ] }, "subtabs": { @@ -49,7 +49,7 @@ ], "maxLevelStoreTitle": "MaxLevelStore de journald", "maxLevelStoreBody": "En una instalación nueva de Proxmox, journald usa por defecto MaxLevelStore=warning, que descarta los mensajes info. Monitor lo detecta al arrancar y añade un archivo de configuración complementario (/etc/systemd/journald.conf.d/proxmenux-loglevel.conf) con el umbral info para conservar los mensajes informativos y los de mayor gravedad. Esto no incluye debug.", - "backupsTitle": "Copias de seguridad", + "backupsTitle": "Backups", "backupsBody": "Historial de tareas de Proxmox filtrado a las entradas relacionadas con backup. Una fila por tarea (vzdump, transferencias PBS, Garbage Collect, Verify) con el estado (OK / WARNINGS / ERROR), el guest implicado, el almacenamiento de origen, la duración y el UPID. Pulsa una fila para cargar el log completo de la tarea vía GET /api/task-log/<upid> — los mismos datos que Proxmox expone a través de Datacenter → Tasks, acotado a backups.", "notificationsTitle": "Notificaciones", "notificationsBody1": "Todas las notificaciones enviadas por Monitor: Telegram, Discord, correo electrónico, Gotify, ntfy, Slack, Teams y webhook. Cada fila muestra fecha y hora, canal, tipo de evento, severidad, título y cuerpo generados y, si la IA está activa, un selector para comparar su reescritura con el original.", @@ -72,12 +72,12 @@ "source": "La misma consulta, devuelta como texto plano para grep / less." }, { - "subtab": "Copias de seguridad", + "subtab": "Backups", "endpoint": "/api/backups", "source": "Historial de tareas PVE filtrado por vzdump, transferencias PBS, Garbage Collect, Verify." }, { - "subtab": "Detalles de una tarea de copia de seguridad", + "subtab": "Detalles de una tarea de backup", "endpoint": "/api/task-log/<upid>", "source": "Log completo de la tarea en texto plano leído de /var/log/pve/tasks/<index>/<upid>." }, diff --git a/web/messages/es/docs/monitor/dashboard/vms-lxcs-updates.json b/web/messages/es/docs/monitor/dashboard/vms-lxcs-updates.json index 6770a754..a7fff483 100644 --- a/web/messages/es/docs/monitor/dashboard/vms-lxcs-updates.json +++ b/web/messages/es/docs/monitor/dashboard/vms-lxcs-updates.json @@ -19,13 +19,13 @@ "Paquetes del SO para contenedores Debian, Ubuntu y Alpine.", "Una sección por cada aplicación registrada, incluidos los registros que solo contienen enlaces.", "Una sección Docker cuando Docker está registrado, con Docker Engine y las imágenes etiquetadas dentro del mismo bloque.", - "Una Actualización en bloque configurable, seguida de las opciones de copia, reinicio y programación." + "Una Actualización en bloque configurable, seguida de las opciones de backup, reinicio y programación." ] }, "mechanisms": { "heading": "Cómo se selecciona el método", "lead": "La vía integrada de Proxmox VE Helper-Scripts sigue el mecanismo oficial update-apps. El resto de instalaciones usa el método de paquetes, Docker o el comando personalizado correspondiente.", - "officialReference": "Referencia oficial: la documentación de update-apps de Proxmox VE Helper-Scripts explica los modos interactivo y desatendido, las copias de seguridad, la simulación, los recursos temporales de compilación, los registros y los códigos de salida.", + "officialReference": "Referencia oficial: la documentación de update-apps de Proxmox VE Helper-Scripts explica los modos interactivo y desatendido, los backups, la simulación, los recursos temporales de compilación, los registros y los códigos de salida.", "colSource": "Origen", "colAction": "Acción mostrada", "colNotes": "Qué se ejecuta", @@ -126,10 +126,10 @@ "callout": "La actualización en bloque no reemplaza los botones individuales. Es un acceso opcional para una selección que debe ejecutarse junta." }, "options": { - "heading": "Opciones de copia y reinicio", + "heading": "Opciones de backup y reinicio", "lead": "Las mismas opciones se aplican a ejecuciones manuales, en bloque y programadas:", "items": [ - "Instantánea antes de aplicar crea una copia vzdump en el almacenamiento seleccionado. Si la copia solicitada falla, la actualización no comienza.", + "Backup antes de aplicar crea un backup vzdump en el almacenamiento seleccionado. Si el backup solicitado falla, la actualización no comienza.", "Reiniciar después de aplicar reinicia el LXC únicamente tras una ejecución correcta.", "Las selecciones se guardan por LXC y son independientes de la lista de objetivos." ] @@ -196,8 +196,8 @@ "caption": "La sección del sistema operativo mantiene los paquetes separados de las acciones de aplicaciones y Docker." }, "options": { - "alt": "Opciones de actualización LXC con copia previa y reinicio posterior", - "caption": "Las preferencias de copia y reinicio se aplican a ejecuciones manuales, en bloque y programadas." + "alt": "Opciones de actualización LXC con backup previo y reinicio posterior", + "caption": "Las preferencias de backup y reinicio se aplican a ejecuciones manuales, en bloque y programadas." } } } diff --git a/web/messages/es/docs/monitor/dashboard/vms-lxcs.json b/web/messages/es/docs/monitor/dashboard/vms-lxcs.json index baabcc31..c8ee65c2 100644 --- a/web/messages/es/docs/monitor/dashboard/vms-lxcs.json +++ b/web/messages/es/docs/monitor/dashboard/vms-lxcs.json @@ -1,16 +1,16 @@ { "meta": { "title": "ProxMenux Monitor — Panel: VMs y LXCs | Documentación de ProxMenux", - "description": "Inventario de todos los invitados con CPU, memoria y disco en vivo. Los detalles incluyen configuración, recursos, copias de seguridad, resultados recientes del log Proxmox, notas y controles Iniciar / Apagar / Reiniciar / Forzar parada." + "description": "Inventario de todos los invitados con CPU, memoria y disco en vivo. Los detalles incluyen configuración, recursos, backups, el log de consola de los contenedores OCI, notas y controles Iniciar / Apagar / Reiniciar / Forzar parada." }, "header": { "title": "Panel: VMs y LXCs", - "description": "Inventario completo de invitados del nodo: cuatro métricas arriba, lista ordenable de VM y LXC abajo y detalles por invitado con configuración, recursos, copias, logs y cuatro controles de ciclo de vida (Iniciar / Apagar / Reiniciar / Forzar parada).", + "description": "Inventario completo de invitados del nodo: cuatro métricas arriba, lista ordenable de VM y LXC abajo y detalles por invitado con configuración, recursos, backups, el log de consola de los contenedores OCI y cuatro controles de ciclo de vida (Iniciar / Apagar / Reiniciar / Forzar parada).", "section": "ProxMenux Monitor · Panel" }, "intro": { "title": "Controles de los invitados", - "body": "Controla el ciclo de vida de los invitados desde esta pestaña. Las acciones pasan por POST /api/vms/<vmid>/control con confirmación explícita y actualizan la fila del invitado. El apagado forzado requiere el botón específico Forzar parada." + "body": "Controla el ciclo de vida de los invitados desde esta pestaña. Las acciones pasan por POST /api/vms/<vmid>/control; Reiniciar y Forzar parada piden escribir el VMID para confirmar, y la respuesta se refleja en la fila del invitado. El apagado forzado requiere el botón específico Forzar parada." }, "topRow": { "heading": "Fila superior: cuatro tarjetas de estadísticas", @@ -108,16 +108,16 @@ "mountsCalloutBody": "Una vista veraz y consciente de la capacidad de cada sitio donde el contenedor lee o escribe. Shares NFS o CIFS montados desde dentro del CT — invisibles para la UI web de Proxmox — aparecen aquí con el mismo aspecto y la misma sonda de salud que cualquier mount point configurado. Mounts remotos stale y zombie binds salen marcados antes de que muerdan durante un backup.", "logsTitle": "Pestaña 5 — Logs (solo contenedores OCI)", "logsBody": "Solo para contenedores de OCI manager Apps. Muestra la consola del proceso principal de la imagen, guardada en /var/log/proxmenux/oci/VMID.console.log: últimas 100, 500 o 1000 líneas, seguimiento en vivo mientras está activo, filtro y descarga. Relee el archivo al abrir y funciona detenido. Más en Contenedores OCI en ProxMenux Monitor.", - "backupsTitle": "Pestaña 6 — Copias de seguridad", + "backupsTitle": "Pestaña 6 — Backups", "backupsImageAlt": "Modal de vista en detalle por guest — pestaña Backups con la lista de backups disponibles, etiqueta de destino, tamaños y el botón Create Backup", - "backupsImageCaption": "Todas las copias del invitado en almacenamientos Proxmox configurados, de más nueva a más antigua. La cabecera muestra su número.", - "backupsIntro": "Lista las copias del invitado en almacenamientos Proxmox, empezando por la más reciente. El contador del título permite comprobar si tiene copias. Cada fila muestra:", + "backupsImageCaption": "Todos los backups del invitado en almacenamientos Proxmox configurados, de más nueva a más antigua. La cabecera muestra su número.", + "backupsIntro": "Lista los backups del invitado en almacenamientos Proxmox, empezando por la más reciente. El contador del título permite comprobar si tiene backups. Cada fila muestra:", "backupsItems": [ "Fecha y hora: momento de la ejecución.", "Etiqueta de destino — el almacenamiento donde vive (PBS-Cloud, PBS-Local, NFS-Backup, …) coloreada por estado.", - "Tamaño: tamaño final en disco de la copia." + "Tamaño: tamaño final en disco del backup." ], - "backupsOutro": "+ Crear copia inicia una copia en el almacenamiento marcado «Backup target» en Proxmox. Para restaurar usa la interfaz web de Proxmox; Monitor muestra las copias recientes del invitado y permite crearlas.", + "backupsOutro": "+ Crear backup inicia un backup en el almacenamiento marcado «Backup target» en Proxmox. Para restaurar usa la interfaz web de Proxmox; Monitor muestra los backups recientes del invitado y permite crearlos.", "firewallTitle": "Pestaña 7 — Cortafuegos", "firewallIntro": "Lee el registro del cortafuegos de cada invitado directamente del host, sin servicio extra ni consultas periódicas. La pestaña siempre aparece; el contenido depende de que el cortafuegos esté activado y de que alguna regla registre paquetes.", "firewallItems": [ @@ -186,9 +186,9 @@ "source": "Datos RRD de PVE (pvesh get /nodes/<node>/qemu/<id>/rrddata) condensados a una forma amigable para gráficas." }, { - "section": "Resultados recientes del log Proxmox", - "endpoint": "/api/vms//logs", - "source": "pvesh get /nodes/<node>/<qemu|lxc>/<vmid>/log --start 0 --limit 1000. Si el comando falla devuelve una lista vacía; no proporciona todos los logs internos del invitado." + "section": "Log de consola OCI (pestaña Logs)", + "endpoint": "/api/lxc//console-log", + "source": "Salida de consola del proceso principal de la imagen, leída de /var/log/proxmenux/oci/<vmid>.console.log en el host. Solo para contenedores OCI." }, { "section": "Backups disponibles para el guest", @@ -227,7 +227,7 @@ { "label": "Referencia de la API", "href": "/docs/monitor/api", - "tailRich": " — endpoints de VM y copias de seguridad." + "tailRich": " — endpoints de VM y backups." }, { "label": "Índice del panel", diff --git a/web/messages/es/docs/monitor/health-monitor.json b/web/messages/es/docs/monitor/health-monitor.json index 6b47c0f0..7e3a2071 100644 --- a/web/messages/es/docs/monitor/health-monitor.json +++ b/web/messages/es/docs/monitor/health-monitor.json @@ -68,7 +68,7 @@ { "category": "Almacenamiento", "checks": "Almacenamientos Proxmox, sistema de archivos raíz", - "events": "Uso de espacio por encima de los umbrales configurados en la raíz u otros sistemas de archivos supervisados (85% aviso / 95% crítico por defecto); exportación NFS desconectada; fallo de autenticación CIFS; pool LVM-thin lleno." + "events": "Uso de espacio por encima de los umbrales configurados en la raíz u otros sistemas de archivos supervisados (85% aviso / 95% crítico por defecto); almacenamientos PVE no disponibles; montajes NFS/CIFS bloqueados o en solo lectura inesperada; LVM-thin y otros almacenamientos de pool que superan los mismos umbrales." }, { "category": "Discos y SMART", @@ -98,7 +98,7 @@ { "category": "Actualizaciones del sistema", "checks": "Actualizaciones pendientes, actualizaciones de seguridad, kernel / versión de PVE, antigüedad del sistema", - "events": "Actualizaciones pendientes de seguridad o del kernel en uso; sistema sin actualizar desde hace mucho tiempo. Si hay actualizaciones, la cabecera de Vista general muestra Actualizar ahora. Ejecuta todo el proceso de actualización de ProxMenux; al cerrarlo, consulta el estado con ?refresh=1 para actualizar el indicador sin esperar al próximo ciclo." + "events": "Actualizaciones pendientes de seguridad o del kernel en uso; sistema sin actualizar desde hace mucho tiempo. Si hay actualizaciones, la categoría Actualizaciones de la ventana de estado de salud muestra Actualizar ahora. Ejecuta todo el proceso de actualización de ProxMenux; al cerrarlo, consulta el estado con ?refresh=1 para actualizar el indicador sin esperar al próximo ciclo." }, { "category": "Seguridad y Certificados", @@ -158,7 +158,7 @@ }, "dismiss": { "heading": "Hacer dismiss de alertas y la Suppression Duration", - "intro": "Algunos eventos son ruidosos por naturaleza — un System Updates: actualizaciones pendientes disponibles permanece cierto hasta que parches el host, y no quieres una notificación cada cinco minutos durante una semana. El botón Update Now de la cabecera de Overview es el atajo directo para resolver ese caso concreto en sitio; para todo lo demás, o cuando el parche se aplaza, el Monitor de salud ofrece además dos mecanismos de silenciamiento acoplados:", + "intro": "Algunos eventos son ruidosos por naturaleza: System Updates: actualizaciones pendientes disponibles sigue activo hasta que actualices el host, y no quieres una notificación cada cinco minutos durante una semana. El botón Actualizar ahora de la categoría Actualizaciones de la ventana de estado de salud resuelve ese caso en el sitio; para todo lo demás, o si aplazas la actualización, el Monitor de salud ofrece además dos mecanismos de silenciado relacionados:", "step1": "Descartar un evento desde su ventana. El botón ofrece 24 horas, 7 días o Permanentemente, independientemente del valor de la categoría. Envía POST /api/health/acknowledge con el error_key y las suppression_hours elegidas (-1 para permanente). El evento pasa a Descartados con su fecha acknowledged_at.", "dropdownImageAlt": "Menú para descartar una alerta: 24 horas, 7 días o permanentemente", "dropdownImageCaption": "La duración elegida se aplica solo a esta alerta; sin una elección individual, se usa el valor de la categoría. Los descartes permanentes llevan una etiqueta ámbar Permanente y normalmente no reaparecen. La excepción de temperatura crítica de CPU se explica más abajo.", @@ -187,7 +187,7 @@ }, { "finding": "Pool ZFS DEGRADED / FAULTED", - "why": "Las comprobaciones de capacidad del pool ZFS permiten descartarse. Otros hallazgos del pool siguen su propio indicador. Confirmar no repara un pool degradado o averiado." + "why": "Los hallazgos de estado del pool ZFS (DEGRADED, FAULTED, UNAVAIL) permiten descartarse, igual que las comprobaciones de capacidad del pool. Confirmar no repara un pool degradado o averiado." }, { "finding": "Errores I/O de disco con SMART FAILED", @@ -289,7 +289,7 @@ }, "rest": { "heading": "Endpoints REST", - "intro": "Las acciones de la ventana están disponibles por API para scripts, paneles o bots. Con la autenticación del Monitor activada, las llamadas necesitan un token Bearer válido, obtenido al iniciar sesión o en la pantalla de tokens API. Los cambios, como confirmar alertas, guardar ajustes o limpiar errores huérfanos, exigen full_admin; read_only recibe 403. Si la autenticación está desactivada o se rechazó, estos controles permiten acceder sin token.", + "intro": "Las acciones de la ventana están disponibles por API para scripts, paneles o bots. Las llamadas necesitan un token Bearer válido, obtenido al iniciar sesión o en la pantalla de tokens API. Los cambios, como confirmar alertas, guardar ajustes o limpiar errores huérfanos, exigen full_admin; read_only recibe 403.", "headerEndpoint": "Endpoint", "headerMethod": "Método", "headerUse": "Uso", @@ -297,7 +297,7 @@ { "endpoint": "/api/health", "method": "GET", - "use": "Comprobación ligera que devuelve JSON con status, timestamp y version. Sirve para comprobar palabras clave con Uptime Kuma; si la autenticación del Monitor está activa, el cliente debe enviar una cabecera Bearer." + "use": "Comprobación ligera que devuelve JSON con status, timestamp y version. Sirve para comprobar palabras clave con Uptime Kuma; el cliente debe enviar una cabecera Bearer." }, { "endpoint": "/api/health/status", diff --git a/web/messages/es/docs/monitor/index.json b/web/messages/es/docs/monitor/index.json index 1f0f4033..6d56db73 100644 --- a/web/messages/es/docs/monitor/index.json +++ b/web/messages/es/docs/monitor/index.json @@ -52,7 +52,7 @@ }, { "name": "Terminal", - "description": "Shell del host y acceso a consolas VM/CT compatibles en el navegador mediante xterm.js y WebSockets. Sigue el modo de autenticación configurado: si está desactivada o rechazada, los clientes con acceso de red pueden abrir sesiones sin iniciar sesión. No implica auditoría de cada comando." + "description": "Shell del host y acceso a consolas VM/CT compatibles en el navegador mediante xterm.js y WebSockets. Las sesiones no se auditan comando a comando." }, { "name": "Seguridad", @@ -114,7 +114,7 @@ "heading": "API REST e integraciones", "intro": "Los endpoints REST ofrecen datos de monitorización JSON por HTTP/HTTPS para widgets Homepage, sensores Home Assistant, pruebas Uptime Kuma y scripts. Grafana puede usar el exportador de texto Prometheus en /api/prometheus. Las peticiones se pueden hacer con curl.", "tokens": "Los tokens API de larga duración (365 días) se generan en Configuración → Tokens de acceso API o mediante POST /api/auth/generate-api-token.", - "bearer": "Envía tokens con Authorization: Bearer …. El endpoint público /api/health permite pruebas de disponibilidad sin credenciales. Bajo /api/auth/* hay rutas públicas de configuración/inicio/estado y rutas protegidas de cuentas y tokens; no todas son anónimas.", + "bearer": "Envía tokens con Authorization: Bearer …. /api/health también espera la cabecera Bearer, así que las pruebas de disponibilidad necesitan un token read_only. Bajo /api/auth/* hay rutas públicas de configuración/inicio/estado y rutas protegidas de cuentas y tokens; no todas son anónimas.", "catalog": "El catálogo de endpoints, rotación de tokens y prácticas de seguridad están en Referencia de la API. Los ejemplos para Homepage, Home Assistant, Grafana, Uptime Kuma y cURL están en Integraciones." }, "serviceControl": { diff --git a/web/messages/es/docs/monitor/integrations.json b/web/messages/es/docs/monitor/integrations.json index 4fbf74b1..c31f56c6 100644 --- a/web/messages/es/docs/monitor/integrations.json +++ b/web/messages/es/docs/monitor/integrations.json @@ -220,11 +220,11 @@ "heading": "n8n, Zapier y scripts propios", "intro": "Las herramientas de workflow y scripts pueden enviar notificaciones con un POST a /api/notifications/send, por ejemplo por un fallo de CI o un trabajo cron demasiado largo. Es un envío directo: omite la cola y la espera entre huellas de eventos. Conserva el formato por canal, la IA opcional y la entrega a los canales configurados. Controla los duplicados desde quien llama.", "n8nBody": "En n8n, usa un nodo HTTP Request con POST, la URL anterior y el mismo JSON que curl. Elige credenciales genéricas Header Auth: nombre Authorization y valor Bearer YOUR_API_TOKEN, sustituyendo el marcador. Conecta una programación, webhook u otro nodo para disparar la petición.", - "severityBody": "La gravedad usa INFO, WARNING o CRITICAL en mayúsculas. El objeto data aporta contexto. La IA usa el título y mensaje renderizados más el enriquecimiento admitido; no se garantiza que todos los campos entren en el prompt o la salida. Consulta Notificaciones → Catálogo de eventos." + "severityBody": "La gravedad usa INFO, WARNING o CRITICAL en mayúsculas. El objeto data aporta contexto del evento y campos de plantilla. En este endpoint, la IA solo recibe el título y el mensaje; los campos de data no se envían al proveedor. Consulta Notificaciones → Catálogo de eventos." }, "pveWebhook": { "heading": "Webhook nativo de Proxmox VE (entrante)", - "intro1": "El sistema de notificaciones llegó en PVE 8.1; los destinos webhook nativos requieren Proxmox VE 8.3 o posterior. Activar notificaciones en Ajustes intenta registrar el Monitor como destino. Los avisos que PVE enruta allí, como informes de copias o replicación, entran en su flujo de envío. El alta depende de que la configuración esté disponible y permita escritura.", + "intro1": "El sistema de notificaciones llegó en PVE 8.1; los destinos webhook nativos requieren Proxmox VE 8.3 o posterior. Activar notificaciones en Ajustes intenta registrar el Monitor como destino. Los avisos que PVE enruta allí, como informes de backups o replicación, entran en su flujo de envío. El alta depende de que la configuración esté disponible y permita escritura.", "intro2": "La mecánica, la plantilla de body que PVE envía, las entradas escritas en /etc/pve/notifications.cfg y el comportamiento en clusters están documentados en Notifications → Integración del webhook de PVE." }, "whereNext": { diff --git a/web/messages/es/docs/monitor/notifications.json b/web/messages/es/docs/monitor/notifications.json index 4be8fc87..e9dd8e17 100644 --- a/web/messages/es/docs/monitor/notifications.json +++ b/web/messages/es/docs/monitor/notifications.json @@ -91,7 +91,7 @@ "heading": "Configuración de los canales", "intro": "Actualmente se admiten seis canales: Telegram, Discord, Gotify, Email (SMTP), Pushover y Apprise. Los cinco primeros son integraciones nativas con sus propios campos de configuración. Apprise funciona como un concentrador genérico que añade unos 80 servicios adicionales (ntfy, Matrix, Slack, Teams, Pushbullet, AWS SNS, Mattermost…) mediante una única URL. Todos están documentados paso a paso a continuación.", "credsTitle": "Dónde se guardan las credenciales", - "credsBody": "Los tokens, las claves, las URL de webhook y las contraseñas SMTP se guardan localmente en la base de datos SQLite del Monitor dentro de /usr/local/share/proxmenux/. Los valores sensibles están protegidos y se ocultan en la interfaz. Solo salen del host para comunicarse con el servicio correspondiente. Una copia de ese directorio permite recuperar los canales configurados." + "credsBody": "Los tokens, las claves, las URL de webhook y las contraseñas SMTP se guardan localmente en la base de datos SQLite del Monitor dentro de /usr/local/share/proxmenux/. Los valores sensibles están protegidos y se ocultan en la interfaz. Solo salen del host para comunicarse con el servicio correspondiente. Un backup de ese directorio permite recuperar los canales configurados." }, "telegram": { "heading": "Telegram", @@ -120,7 +120,7 @@ "Añade el bot al grupo como miembro (y hazlo admin si el grupo lo requiere para publicar).", "Envía cualquier mensaje en el grupo.", "Abre https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates en un navegador. Busca chat.id en la respuesta JSON — para grupos es un número negativo, para supergrupos empieza con -100.", - "En supergrupos con Temas, anota el message_thread_id de destino e introdúcelo en el campo opcional ID del tema." + "En supergrupos con Temas, anota el message_thread_id de destino e introdúcelo en el campo opcional ID de tema." ], "groupAlt": "Formulario de canal Telegram con Bot Token (enmascarado), Chat ID negativo prefijado con -100 indicando un supergrupo, y Topic ID 3 configurado para entregar a un tema específico", "groupCaption": "Supergrupo — el Chat ID empieza con -100… y el Topic ID opcional apunta a un hilo específico.", @@ -171,7 +171,7 @@ "Abre account.microsoft.com/security y activa la verificación en dos pasos.", "Si tu cuenta ofrece Opciones avanzadas de seguridad → Contraseñas de aplicación, elige Crear una contraseña de aplicación. Eso no garantiza que el correo admita autenticación SMTP con contraseña.", "Si Microsoft genera la contraseña, cópiala y comprueba que tu servicio SMTP la acepte.", - "Solo si el proveedor admite SMTP con contraseña, usa sus ajustes autorizados: Servidor smtp.office365.com para Exchange Online, Puerto 587, Modo TLS STARTTLS, Usuario tu dirección y Contraseña la credencial permitida. Outlook.com personal usa requisitos y ajustes distintos; no presupongas que estas credenciales funcionen." + "Solo si el proveedor admite SMTP con contraseña, usa sus ajustes autorizados: servidor SMTP smtp.office365.com para Exchange Online, Puerto 587, modo TLS STARTTLS, Nombre de usuario tu dirección y Contraseña la credencial permitida. Outlook.com personal usa requisitos y ajustes distintos; no presupongas que estas credenciales funcionen." ], "relayTitle": "Relay SMTP autoalojado", "relayBody": "Usa un relay SMTP que controles, como Postfix. El relay gestiona la autenticación hacia el proveedor. Configura la autenticación y TLS de Monitor según lo que exija el relay; que sea local no desactiva el cifrado." @@ -215,7 +215,7 @@ "rich": { "heading": "Mensajes enriquecidos, categorías y filtros por canal", "intro": "Cada canal tiene tres controles: Mensajes enriquecidos arriba, once secciones de Categorías de notificación con interruptores por evento y Enviar prueba abajo.", - "imageAlt": "Categorías con Mensajes enriquecidos destacado, secciones de VM/CT, copias, recursos, almacenamiento, red, seguridad, clúster, servicios, salud y actualizaciones, con interruptores y contadores, y botón Enviar prueba", + "imageAlt": "Categorías con Mensajes enriquecidos destacado, secciones de VM/CT, backups, recursos, almacenamiento, red, seguridad, clúster, servicios, salud y actualizaciones, con interruptores y contadores, y botón Enviar prueba", "imageCaption": "La flecha señala Mensajes enriquecidos. Debajo están las once categorías desplegables con controles por evento. Enviar prueba está al final.", "richTitle": "Mensajes enriquecidos", "richIntro": "Con Mensajes enriquecidos, cada aviso lleva un emoji de categoría y formato nativo del canal, como HTML en Telegram o tarjetas coloreadas en Discord. Desactivado, se envía el mismo contenido en texto simple:", @@ -228,7 +228,7 @@ "Control de categoría por canal. Por ejemplo, desactivar VM/CT suprime vm_start y sus equivalentes para ese canal. Se guarda como <channel>.events.<group>.", "Control de evento por canal. En una categoría activa puedes elegir enviar backup_complete a Discord pero no a Telegram. Se guarda como <channel>.event.<event_type>." ], - "togglesOutro": "Cada categoría indica los eventos activados frente al total y permite activar o desactivar el grupo completo con un clic, por ejemplo copias info o avisos de actualización, sin abrirlo." + "togglesOutro": "Cada categoría indica los eventos activados frente al total y permite activar o desactivar el grupo completo con un clic, por ejemplo backups info o avisos de actualización, sin abrirlo." }, "quiet": { "heading": "Horas de silencio", @@ -255,7 +255,7 @@ }, "digest": { "heading": "Resumen diario de eventos INFO", - "intro1": "El resumen diario es una opción que activas expresamente: agrupa avisos INFO aptos, como actualizaciones disponibles, a las 09:00 o a la hora elegida. Los resultados de copias y replicación y las acciones en directo están excluidos. Las horas de silencio aplazan los avisos no críticos durante un intervalo.", + "intro1": "El resumen diario es una opción que activas expresamente: agrupa avisos INFO aptos, como actualizaciones disponibles, a las 09:00 o a la hora elegida. Los resultados de backups y replicación y las acciones en directo están excluidos. Las horas de silencio aplazan los avisos no críticos durante un intervalo.", "intro2": "Está debajo de las horas de silencio en la misma tarjeta; consulta la figura en Horas de silencio. Ambos se activan por separado.", "purposeTitle": "Para qué sirve", "purposeItems": [ @@ -266,7 +266,7 @@ "howItems": [ "Activación por canal. Desactivado por defecto. Actívalo solo donde quieras resúmenes y deja los otros canales con avisos directos.", "Hora de entrega en tu zona horaria local. Por defecto 09:00 pero puedes elegir cualquier hora; el dispatcher dispara el digest dentro de ~60 s de ese minuto.", - "Incluye: eventos generales aptos de nivel INFO, como actualización de aplicación disponible, actualización de Tailscale disponible, actualización de optimización de ProxMenux disponible, actualizaciones de seguridad APT pendientes y aviso de límite de envíos. Los resultados de copias y otras acciones excluidas siguen en directo.", + "Incluye: eventos generales aptos de nivel INFO, como actualización de aplicación disponible, actualización de Tailscale disponible, actualización de optimización de ProxMenux disponible y actualizaciones de seguridad APT pendientes. Los resultados de backups y otras acciones excluidas siguen en directo.", "Qué nunca se retrasa:", "Persistencia. Los pendientes se guardan en SQLite, tabla digest_pending, hasta la hora elegida y sobreviven a reinicios.", "Sin eventos, sin resumen. Si no hay avisos INFO pendientes, no se envía ningún resumen vacío." @@ -274,7 +274,7 @@ "neverDelayedSub": [ "Los eventos CRITICAL siempre pasan inmediatamente.", "Los eventos WARNING siempre pasan inmediatamente.", - "Las acciones de VM/CT, sus fallos, inicio y resultados de copias, resultados de replicación y apagado o reinicio del host evitan el resumen incluso con nivel INFO. Las horas de silencio sí pueden retrasarlas si no son críticas." + "Las acciones de VM/CT, sus fallos, inicio y resultados de backups, resultados de replicación y apagado o reinicio del host evitan el resumen incluso con nivel INFO. Las horas de silencio sí pueden retrasarlas si no son críticas." ], "comboTitle": "Combinar horas de silencio y resumen diario", "comboBody": "Puedes activar ambos: silencio de 22:00 a 07:00 y resumen a 09:00. Los avisos no críticos del intervalo se liberan en el resumen de 07:00; los INFO aptos de fuera van al resumen diario. CRITICAL evita ambos; WARNING evita el diario, pero espera durante el silencio. Elige un intervalo sin avisos, un resumen a hora fija o ambos." @@ -300,8 +300,8 @@ }, { "stage": "Intervalo de repetición", - "what": "Tras un envío correcto se suprimen huellas repetidas y se guarda el estado en notification_last_sent. Las bases de CRITICAL, WARNING e INFO son 86400 s, igual que resources y updates. Excepciones: 5 s para acciones VM/CT y apagado/reinicio, 10 s para resultados de copias/replicación y 1800–3600 s para varias categorías de salud. Los ajustes explícitos por evento o grupo prevalecen.", - "tunable": "Sí: los ajustes explícitos del distribuidor por evento o grupo sustituyen los valores predeterminados." + "what": "Tras un envío correcto se suprimen huellas repetidas y se guarda el estado en notification_last_sent. Las bases de CRITICAL, WARNING e INFO son 86400 s, igual que resources y updates. Excepciones: 5 s para acciones VM/CT y apagado/reinicio, 10 s para resultados de backups/replicación y 1800–3600 s para varias categorías de salud. Los ajustes explícitos por evento o grupo prevalecen.", + "tunable": "Solo mediante la API de ajustes: una clave cooldown.<event_type> o cooldown.<group> sustituye los valores predeterminados; no hay control en la interfaz." }, { "stage": "Agrupación de ráfagas", @@ -321,7 +321,7 @@ }, "pveWebhook": { "heading": "Integración del webhook de PVE", - "intro1": "El sistema de notificaciones Proxmox tiene destinos sendmail, Gotify, SMTP y, en versiones compatibles, webhook. Monitor registra un destino webhook al activarse. Los avisos de PVE, como HA, replicación y copias desde la interfaz, entran así en el mismo proceso de envío.", + "intro1": "El sistema de notificaciones Proxmox tiene destinos sendmail, Gotify, SMTP y, en versiones compatibles, webhook. Monitor registra un destino webhook al activarse. Los avisos de PVE, como HA, replicación y backups desde la interfaz, entran así en el mismo proceso de envío.", "intro2": "Puedes verlo en Datacenter → Notificaciones → Destinos de notificación.", "imageAlt": "Diálogo Proxmox VE Edit Webhook mostrando el destino proxmenux-webhook autocreado con método POST, URL http://127.0.0.1:8008/api/notifications/webhook y una plantilla JSON usando escape title, escape message, escape severity, escape timestamp y campos json", "imageCaption": "El destino webhook del lado PVE como Proxmox lo ve (la GUI está en el locale configurado del host — español en este ejemplo). Los mismos campos aplican en cualquier idioma.", @@ -330,7 +330,7 @@ "Método y URL. POST http://127.0.0.1:8008/api/notifications/webhook sin HTTPS en Monitor. Con HTTPS, usa el receptor HTTP local del puerto 8009. Ambos permanecen en el mismo host.", "Plantilla del cuerpo. JSON con funciones Handlebars de PVE, guardado como base64 en la configuración. Al expandirse resulta:", "Matcher. Un bloque compañero matcher: proxmenux-matcher con mode all para que cada notificación de PVE llegue al destino.", - "Configuración privada. Se escribe webhook: proxmenux-webhook en /etc/pve/priv/notifications.cfg, con el secreto compartido en base64. El destino público lo referencia para enviar X-Webhook-Secret. El bloque contiene ese secreto." + "Configuración privada. Se escribe el bloque webhook: proxmenux-webhook en /etc/pve/priv/notifications.cfg con una entrada secret llamada X-Webhook-Secret, codificada en base64. El bloque del destino público solo contiene la plantilla del cuerpo, el método y la URL. El bloque privado no está vacío." ], "securityTitle": "Cómo se asegura el receptor", "securityIntro": "El receptor webhook en POST /api/notifications/webhook aplica distintas capas de seguridad según de dónde venga la petición:", @@ -360,7 +360,7 @@ "events": "vm_start, vm_start_warning, vm_stop, vm_shutdown, vm_fail, vm_restart, más los equivalentes ct_*, migration_start, migration_complete, migration_warning, migration_fail, replication_complete, replication_fail." }, { - "group": "Copias de seguridad", + "group": "Backups", "events": "backup_start, backup_complete, backup_warning, backup_fail, snapshot_complete, snapshot_fail." }, { @@ -403,7 +403,7 @@ "burstNote": "Los tipos agrupados burst_* (burst_auth_fail, burst_ip_block, burst_disk_io, etc.) sustituyen ráfagas por un resumen. No tienen controles propios en la interfaz y heredan los del evento de origen.", "backupResults": { "heading": "Resultados de backup", - "intro": "El informe de cada trabajo de copia determina su resultado, título, icono con Mensajes enriquecidos y fila de estado del correo.", + "intro": "El informe de cada trabajo de backup determina su resultado, título, icono con Mensajes enriquecidos y fila de estado del correo.", "headerIcon": "Icon", "headerResult": "Resultado", "headerWhen": "Cuándo", @@ -434,7 +434,7 @@ "El cuerpo detalla cada sistema invitado, con resultado, tamaño, duración y archivo, seguido de los totales.", "Las advertencias y los errores se listan una vez. Las líneas repetidas se muestran una sola vez con la causa principal primero; a partir de ocho líneas, el resto se cuenta en una línea de cierre y permanece en el log de la tarea de Proxmox.", "Un trabajo que falla antes del primer invitado muestra la causa indicada por Proxmox, por ejemplo un almacenamiento inexistente.", - "Los resúmenes conservan el resultado. Una copia en el resumen de horas de silencio conserva su icono. Los resultados de copias evitan el resumen diario." + "Los resúmenes conservan el resultado. Un backup en el resumen de horas de silencio conserva su icono. Los resultados de backups evitan el resumen diario." ] } }, diff --git a/web/messages/fr/docs/monitor/access-auth.json b/web/messages/fr/docs/monitor/access-auth.json index a81ae173..8932f21e 100644 --- a/web/messages/fr/docs/monitor/access-auth.json +++ b/web/messages/fr/docs/monitor/access-auth.json @@ -19,7 +19,7 @@ "reaching": { "heading": "Atteindre le tableau de bord", "intro": "Le ProxMenux Monitor se lie au 0.0.0.0:8008. Il y a trois façons communes d'y parvenir:", - "outro": "L’accès direct correspond à l’unité systemd par défaut. Le proxy inverse et Secure Gateway sont décrits ci-dessous. Les IP de X-Forwarded-For nécessitent PROXMENUX_TRUST_PROXY=1 et un proxy que vous contrôlez. X-Forwarded-Proto ou X-Forwarded-Host seuls n’activent pas cette confiance ; le frontend construit les URL API depuis l’origine du navigateur." + "outro": "L’accès direct correspond à l’unité systemd par défaut. Le proxy inverse et Secure Gateway sont décrits ci-dessous. La confiance accordée aux IP clientes de X-Forwarded-For nécessite PROXMENUX_TRUST_PROXY=1 et un proxy que vous contrôlez. La seule présence de X-Forwarded-Proto ou X-Forwarded-Host n’active pas la confiance envers le proxy. Sur les ports 80/443, le frontend utilise des URL relatives /api/* ; sur tout autre port, il appelle le port 8008 du même nom d’hôte." }, "firstLaunch": { "heading": "Premier démarrage", @@ -117,8 +117,8 @@ "loginImageCaption": "Une fois l'authentification configurée, chaque visite au tableau de bord commence ici. Avec 2FA activé, l'écran demande le code à chiffres 6 dans une deuxième étape après l'acceptation du mot de passe.", "loginFlowTitle": "Flux de connexion", "twofaIntro": "Avec 2FA, le premier appel renvoie requires_totp: true. Répétez-le avec le code à six chiffres :", - "publicTitle": "Accès public et sondes protégées", - "publicIntro": "La connexion et son état sont publics. La création du compte reste possible tant qu’aucun identifiant et mot de passe ne sont enregistrés, même après un refus de protection. Les données système exigent une authentification lorsque la protection est active :", + "publicTitle": "Points d’accès publics (sans jeton)", + "publicIntro": "La connexion, l’état de l’authentification, la configuration initiale et le point d’accès léger /api/system-info sont publics :", "publicItems": [ "/api/auth/login et /api/auth/status sont publics. /api/auth/setup crée le premier compte et refuse d’écraser des identifiants existants.", "/api/system-info est un endpoint public d’informations système légères, dont health.status. Il n’exige pas de jeton. /api/auth/status est également public et permet de vérifier la disponibilité." @@ -146,7 +146,7 @@ }, { "asset": "Secret TOTP de 2FA", - "algorithm": "TOTP standard (RFC 6238), avec secret encodé en base32. Les huit codes de récupération sont à usage unique et conservés sous forme de hachages SHA-256.", + "algorithm": "TOTP standard (RFC 6238), avec secret encodé en base32. Les huit codes de secours sont à usage unique et conservés sous forme de hachages SHA-256.", "where": "auth.json → totp_secret + backup_codes[]" }, { @@ -243,17 +243,17 @@ } ], "backupTitle": "Pourquoi les sauvegardes comptent", - "backupBody": "Si vous perdez l’appareil, utilisez un code de récupération conservé ou restaurez une sauvegarde préparée auparavant. Synchronisation cloud et exports varient selon l’application : vérifiez que votre méthode restaure bien les secrets TOTP. L’accès root à l’hôte permet aussi une récupération, décrite ci-dessous. Gardez une sauvegarde distincte et sécurisée.", + "backupBody": "Si vous perdez l’appareil d’authentification, utilisez un code de secours conservé ou restaurez l’application depuis une sauvegarde préparée auparavant. Synchronisation cloud et exports locaux varient selon l’application : vérifiez que votre méthode restaure bien les secrets TOTP. L’accès root à l’hôte permet aussi une récupération, décrite ci-dessous. Gardez une sauvegarde distincte et sécurisée.", "setupTitle": "Configuration étape par étape depuis le tableau de bord", "setupImageAlt": "Écran de configuration 2FA avec code QR et codes de sauvegarde", - "setupImageCaption": "Le dialogue 2FA montre un QR code, le secret Base32 pour la saisie manuelle et huit codes de récupération à usage unique. Copiez-les avant de fermer : ils ne seront plus affichés.", + "setupImageCaption": "Le dialogue de configuration 2FA montre un QR code, un secret Base32 pour la saisie manuelle et, après la vérification, huit codes de secours à usage unique. Copiez les codes avant de fermer le dialogue : ils ne seront plus affichés.", "setupSteps": [ "Installez l'application authentificateur sur votre téléphone (ou ouvrez votre gestionnaire de mots de passe). Une des applications du tableau ci-dessus. Vous n'avez besoin de le faire qu'une seule fois — la même application contiendra des codes pour chaque service que vous protégez.", "Se connecter au tableau de bord avec votre nom d'utilisateur et votre mot de passe.", - "Ouvrez l’onglet Sécurité, puis Activer 2FA. Le dialogue montre le QR code, le secret Base32 et huit codes de récupération.", + "Ouvrez l’onglet Sécurité dans la barre latérale du tableau de bord, puis cliquez sur Activer 2FA et Démarrer la configuration. Le dialogue montre le QR code et la clé manuelle ; les huit codes de secours apparaissent après la vérification du code.", "Ajouter l'entrée à l'application authentificateur:", - "Conservez les codes de récupération. Gardez les huit dans un gestionnaire de mots de passe, une note chiffrée ou une copie papier sécurisée. Chacun sert une fois si l’application est indisponible.", - "Confirmez avec le code actuel à six chiffres de l’application dans le champ « Code de vérification », puis validez. Le code change toutes les 30 secondes ; s’il expire pendant la saisie, utilisez le suivant.", + "Confirmez avec le code actuel à six chiffres de l’application dans le champ « Code de vérification » du dialogue de configuration, puis validez. Le code change toutes les 30 secondes ; s’il expire pendant la saisie, utilisez le suivant.", + "Conservez les codes de secours. Après la vérification, gardez les huit en lieu sûr dans un gestionnaire de mots de passe, une note chiffrée ou une copie papier sécurisée. Chacun sert une fois si votre application d’authentification est indisponible.", "Terminé. 2FA est actif. La prochaine connexion demande d’abord le mot de passe, puis le code actuel à six chiffres." ], "setupStep4Sub": [ @@ -261,17 +261,17 @@ "Alternative manuelle si le scan est impossible, notamment sur le même téléphone : Ajouter un compte → Saisir une clé de configuration. Choisissez un nom comme Proxmox Monitor, collez le secret Base32, laissez le Type sur Basé sur le temps et enregistrez." ], "testTitle": "Tester avant de déconnecter", - "testBody": "Gardez la session actuelle ouverte et testez une nouvelle connexion dans une fenêtre privée immédiatement après la configuration. Si le code échoue, vérifiez les horloges du serveur et du téléphone avant de fermer la session fonctionnelle. Si l’accès est perdu, utilisez un code de récupération ou modifiez auth.json depuis le shell de l’hôte.", + "testBody": "Gardez la session actuelle ouverte et testez une nouvelle connexion dans une fenêtre privée immédiatement après la configuration. Si le code est refusé, vérifiez les horloges du serveur et du téléphone avant de vous déconnecter de la session fonctionnelle. Si l’accès est déjà perdu, utilisez un code de secours ou modifiez auth.json depuis le shell de l’hôte.", "lostTitle": "Authentificateur perdu", "lostIntro": "Trois méthodes de récupération, de la moins intrusive à la plus intrusive :", "lostItems": [ - "Utilisez un code de récupération. Saisissez un des huit codes dans le champ TOTP. Il sert une fois ; les autres restent valides. Après connexion, reconfigurez 2FA dans les paramètres pour obtenir huit nouveaux codes.", + "Utilisez un code de secours. Saisissez un des huit codes enregistrés dans le champ TOTP. Il sert une fois ; les codes inutilisés restent valides. Après connexion, ouvrez Sécurité, choisissez Désactiver 2FA puis Activer 2FA pour obtenir huit nouveaux codes.", "Restaurer l'authentificateur à partir du cloud / sauvegarde. Si votre application a une synchronisation cloud (Google, Microsoft, Authy, Apple Passwords via iCloud Keychain, Ente, 2FAS) l'installe sur un nouvel appareil, se connecte et les entrées réapparaissent. Si votre application utilise un fichier d'exportation chiffré (Aegis, Raivo, FreeOTP+), installer l'application sur le nouvel appareil et importer le fichier.", "Désactivez 2FA depuis le shell de l'hôte. Lorsque les options précédentes ne sont pas disponibles, modifiez /root/.config/proxmenux-monitor/auth.json sur l'hôte Proxmox (vous avez besoin de root SSH ou d'un accès à la console), définissez totp_enabled sur false, enregistrez et redémarrez le service :" ], "lostShellOutro": "Vous pouvez vous connecter avec le nom d'utilisateur + mot de passe seulement, puis réactiver 2FA depuis Paramètres.", "disableTitle": "Désactiver 2FA", - "disableBody": "Ouvrez Sécurité et choisissez Désactiver 2FA. POST /api/auth/totp/disable exige le mot de passe actuel et un code TOTP ou de récupération valide. Le secret TOTP et les codes sont effacés. Retirez aussi l’ancienne entrée de l’application.", + "disableBody": "Ouvrez Sécurité et choisissez Désactiver 2FA. POST /api/auth/totp/disable exige le mot de passe actuel et un code TOTP ou de secours valide. Le secret TOTP et les codes de secours sont effacés. Retirez aussi l’ancienne entrée de votre application d’authentification.", "rejectedTitle": "Le code à chiffres 6 est toujours rejeté", "rejectedIntro": "TOTP dépend du temps : les horloges du serveur et du téléphone doivent différer de moins d’environ 30 s. Deux contrôles :", "rejectedItems": [ diff --git a/web/messages/fr/docs/monitor/ai-assistant.json b/web/messages/fr/docs/monitor/ai-assistant.json index c7bb3274..7d25d3fc 100644 --- a/web/messages/fr/docs/monitor/ai-assistant.json +++ b/web/messages/fr/docs/monitor/ai-assistant.json @@ -14,7 +14,7 @@ }, "intro": { "title": "Désactivé par défaut, un seul interrupteur pour l’activer", - "body": "La reformulation IA est désactivée par défaut. Activez-la dans Paramètres → Notifications → Avancé : amélioration IA. Si l’enrichissement ou la reformulation échoue, le texte du modèle original est envoyé. Chaque reformulation a un délai maximal de 25 secondes ; au-delà, le modèle est utilisé sans attendre indéfiniment." + "body": "La reformulation IA est désactivée par défaut. Activez-la dans Paramètres → Notifications → Avancé : amélioration IA. Si l’enrichissement ou la reformulation échoue, le répartiteur envoie le modèle original. Les reformulations de la file d’envoi des événements ont un délai maximal de 25 secondes ; une fois ce délai atteint, le modèle est envoyé au lieu d’attendre." }, "howItWorks": { "heading": "Comment ça marche", @@ -109,7 +109,7 @@ ], "customNote": "Le mode personnalisé fixe la sortie à 500 tokens, quel que soit le niveau de détail. Vous contrôlez les instructions ; le plafond évite les réponses trop longues.", "sizingTitle": "Taille pratique", - "sizingBody": "Estimez la consommation : événements reformulés × canaux IA × tokens d’entrée et de sortie par appel. Exemple : 50 événements × un canal × (500 en entrée + 300 en sortie) = 40 000 tokens par jour. Les valeurs réelles dépendent du modèle, du contexte, du cache et des limites du fournisseur. Détail par canal explique comment utiliser brief pour le chat au lieu de standard, avec des e-mails détaillés." + "sizingBody": "Estimez la consommation : événements reformulés × canaux avec IA × tokens d’entrée et de sortie par appel. Exemple : 50 événements × un canal × (2 000 en entrée + 300 en sortie) font environ 115 000 tokens par jour, car l’invite système par défaut compte à elle seule environ 1 500 tokens. La consommation et les coûts réels dépendent du modèle, du contexte, du cache et des limites du fournisseur. La section Détail par canal explique comment utiliser brief pour le chat au lieu de standard, tout en gardant des rapports e-mail détaillés." }, "providers": { "heading": "Fournisseurs d'IA", @@ -142,7 +142,7 @@ "items": [ "Clé API : console.anthropic.com/settings/keys", "Exemples de la liste de modèles fournie : claude-haiku-4-5-20251001, claude-sonnet-4-6, claude-opus-4-6.", - "Recommandation fournie : claude-haiku-4-5-20251001. Cette version précise est recommandée ; les anciens modèles Claude 3.5 ne figurent plus dans la liste fournie." + "Recommandation fournie : claude-haiku-4-5-20251001, un instantané figé plutôt qu’un alias évolutif." ] }, "gemini": { diff --git a/web/messages/fr/docs/monitor/api-reference.json b/web/messages/fr/docs/monitor/api-reference.json index 416a903e..c11019c5 100644 --- a/web/messages/fr/docs/monitor/api-reference.json +++ b/web/messages/fr/docs/monitor/api-reference.json @@ -162,7 +162,7 @@ { "endpoint": "/api/vms//backup", "method": "POST", - "use": "Crée une sauvegarde vzdump de VM ou LXC. Champs facultatifs à adapter au stockage : storage (cible PVE), mode (snapshot, suspend ou stop), compress (zstd, lzo, gzip ou none), protected (true ou false), notes, notification (auto, always, failure ou never) et pbs_change_detection (default, legacy ou data). Renvoie l’UPID de la tâche PVE." + "use": "Crée une sauvegarde vzdump d’une VM ou d’un LXC. Champs du corps, tous facultatifs sauf si les valeurs par défaut ne correspondent pas à l’organisation du stockage : storage (un stockage PVE), mode (snapshot, suspend ou stop), compress (zstd, lzo, gzip ou none), protected (true ou false), notes et pbs_change_detection (default, legacy ou data). Renvoie l’UPID de la tâche PVE." }, { "endpoint": "/api/vms//backups", @@ -286,7 +286,7 @@ { "endpoint": "/api/storage/smart//test", "method": "POST", - "use": "Lance un autotest SMART. Schéma du corps : '{'\"type\":\"short\"|\"long\"'}'." + "use": "Lance un autotest SMART. Schéma du corps : '{'\"test_type\":\"short\"|\"long\"'}'." }, { "endpoint": "/api/storage/smart/schedules", diff --git a/web/messages/fr/docs/monitor/architecture.json b/web/messages/fr/docs/monitor/architecture.json index 8c3b92ec..71a14829 100644 --- a/web/messages/fr/docs/monitor/architecture.json +++ b/web/messages/fr/docs/monitor/architecture.json @@ -73,13 +73,13 @@ "intro": "L’AppImage contient un système de fichiers monté à l’exécution. AppRun à sa racine prépare l’environnement et lance flask_server.py :", "consequencesIntro": "Deux conséquences de cette disposition :", "consequences": [ - "Environnement Python fourni. Interpréteur et paquets sont dans l’AppImage, sans installation dans le Python système. L’application utilise toujours les interfaces du noyau et les outils externes de l’hôte.", + "Paquets Python fournis. Les paquets Python sont livrés dans l’AppImage et s’exécutent avec l’interpréteur Python de l’hôte lui-même, 3.11 (PVE 8) ou 3.13 (PVE 9), sans rien installer dans le Python système de l’hôte. L’application utilise toujours les interfaces du noyau et les outils externes de l’hôte.", "Clients matériels inclus. L’AppImage fournit ipmitool, lm-sensors et upsc. Les mesures dépendent du matériel compatible, de l’accès aux capteurs et, pour l’onduleur, d’un serveur NUT configuré." ] }, "flask": { "heading": "Structure de l’application Flask", - "intro": "flask_server.py crée une instance Flask(__name__) avec CORS limité, enregistre directement neuf blueprints et initialise le terminal. Le tableau montre les modules principaux ; audit, sauvegarde VM et PBS sont aussi enregistrés. Les préchargements PVE ne tournent que sur les hôtes PVE.", + "intro": "flask_server.py crée une instance Flask(__name__) avec des origines CORS restreintes, enregistre directement dix blueprints et initialise les routes du terminal. Le tableau montre les modules principaux ; les blueprints PBS, liens du Monitor, audit et sauvegarde VM sont aussi enregistrés. Les préchargements propres à PVE ne tournent que sur les hôtes PVE.", "headerBlueprint": "Blueprint / module", "headerPrefix": "Préfixe des itinéraires", "headerOwns": "Responsabilité", @@ -242,10 +242,10 @@ "Mises à jour : paquets en attente et correctifs de sécurité.", "Journaux : motifs persistants, pics et cascades dans le journal système.", "Mémoire : interventions de l’OOM killer et pression mémoire prolongée.", - "Température : mesures CPU et disques comparées aux seuils de surveillance ; les capteurs disponibles dépendent du matériel.", + "CPU : utilisation et température CPU comparées aux seuils configurables ; les capteurs disponibles dépendent du matériel.", "Sécurité : échecs de connexion, blocages et état du jail Fail2Ban." ], - "afterIntro": "Les constats utilisent error_key, catégorie et gravité stables. Les lignes d’errors sont mises à jour avec last_seen et le compteur, sans duplication. L’envoi a aussi ses propres empreintes et temporisations.", + "afterIntro": "Les constats utilisent error_key, catégorie et gravité stables. Les enregistrements existants d’errors sont mis à jour sur place (last_seen, gravité, motif), sans duplication. L’envoi des notifications a aussi ses propres règles d’empreinte et de temporisation.", "cycleEnd": "Le nettoyage peut résoudre les erreurs anciennes selon la durée de suppression par catégorie et des règles d’état, retirer les entrées orphelines des ressources supprimées et purger events après 30 jours. Voir Tableau de bord → Health Monitor pour les catégories." }, "notifications": { @@ -264,9 +264,9 @@ "intro": "L’onglet Terminal relie un client léger xterm.js à un PTY du serveur via WebSocket. Deux modes existent :", "items": [ "Mode HTTP, par défaut : le serveur Flask intégré et flask-sock gèrent le passage au protocole WebSocket.", - "Mode HTTPS / WSS : utilise gevent.pywsgi.WSGIServer avec geventwebsocket.handler.WebSocketHandler pour WebSocket sur TLS." + "Mode HTTPS / WSS : le serveur TLS utilise gevent.pywsgi.WSGIServer avec son gestionnaire par défaut ; flask-sock gère les connexions WebSocket sur TLS." ], - "outro": "Les processus du terminal héritent de User=root. Avec authentification active, WebSocket exige un ticket bref à usage unique obtenu par le point d’accès authentifié avec droits administratifs. Si l’authentification est désactivée ou refusée, la connexion suit ce mode sans authentification.", + "outro": "Les processus enfants du terminal héritent de User=root du service. L’ouverture d’un WebSocket exige un ticket bref à usage unique obtenu par le point d’accès authentifié des tickets de terminal avec droits administratifs.", "proxyNote": "Avec un proxy inverse, autorisez WebSocket et ses en-têtes Upgrade et Connection. Le terminal a besoin de ce transfert." }, "proxy": { diff --git a/web/messages/fr/docs/monitor/dashboard/network.json b/web/messages/fr/docs/monitor/dashboard/network.json index 82828702..a3b3fd8b 100644 --- a/web/messages/fr/docs/monitor/dashboard/network.json +++ b/web/messages/fr/docs/monitor/dashboard/network.json @@ -162,7 +162,7 @@ } ], "reportTitle": "Rapport de latence réseau (PDF)", - "reportIntro": "Les deux modes ont un bouton Rapport près du sélecteur de cible. Il génère un PDF des mesures que vous pouvez joindre à une demande d’assistance auprès de votre FAI.", + "reportIntro": "Les deux modes ont un bouton Rapport près du sélecteur de cible. Il ouvre un rapport imprimable des mesures ; enregistrez-le en PDF depuis la boîte de dialogue d’impression du navigateur et joignez-le à une demande d’assistance auprès de votre FAI.", "reportPreviewAlt": "Première page PDF du rapport de latence : synthèse, jauge, statistiques, graphique et guide des seuils", "reportPreviewCaption": "La première page contient la synthèse, la jauge, les statistiques principales, l’évolution de la latence et le guide des seuils. À partir de la page 2 figurent le tableau des mesures et la méthodologie.", "downloadLabel": "Télécharger un exemple de rapport de latence (PDF)", diff --git a/web/messages/fr/docs/monitor/dashboard/security.json b/web/messages/fr/docs/monitor/dashboard/security.json index 304d63dd..26511643 100644 --- a/web/messages/fr/docs/monitor/dashboard/security.json +++ b/web/messages/fr/docs/monitor/dashboard/security.json @@ -136,7 +136,7 @@ "configCaption": "Modification du jail sshd : réduisez Max Retries si vous utilisez SSH uniquement depuis votre sous-réseau, ou augmentez Ban Time pour un tableau de bord exposé sur Internet.", "outro": "Le guide Installation, configuration et désinstallation couvre aussi l’installation manuelle, la modification de SSH MaxAuthTries et le journal proxmenux-auth.log. Consultez ProxMenux → Sécurité → Fail2Ban.", "calloutTitle": "Sans Fail2Ban, ce mécanisme ne bloque pas les IP", - "calloutBody": "ProxMenux Monitor vérifie les IP bloquées par Fail2Ban au niveau applicatif avant de traiter les requêtes Flask. Il interroge fail2ban-client et conserve le résultat en cache pendant 30 secondes ; il ne lit pas de table SQL de blocages. Sans Fail2Ban, les échecs sont consignés dans proxmenux-auth.log, mais ce mécanisme ne bloque pas les IP." + "calloutBody": "ProxMenux Monitor vérifie les IP bloquées dans la jail proxmenux de Fail2Ban au niveau applicatif avant de traiter les requêtes Flask, en gardant le résultat en cache pendant 30 secondes. Sans Fail2Ban, les échecs de connexion sont consignés dans proxmenux-auth.log et le point d’accès de connexion est limité à 5 tentatives par IP toutes les 5 minutes, mais aucune IP n’est bloquée." }, "lynis": { "heading": "Audit de sécurité Lynis", diff --git a/web/messages/fr/docs/monitor/dashboard/settings.json b/web/messages/fr/docs/monitor/dashboard/settings.json index 57f5e741..ee877c2b 100644 --- a/web/messages/fr/docs/monitor/dashboard/settings.json +++ b/web/messages/fr/docs/monitor/dashboard/settings.json @@ -76,7 +76,7 @@ }, "thresholds": { "heading": "Seuils du Health Monitor", - "intro": "La carte précédente définit la durée de silence après un rejet ; celle-ci règle la valeur qui déclenche une alerte. La plupart des contrôles ont des valeurs Avertissement et Critique réglables. Le tableau explique les exceptions, dont la règle combinée du swap et le détecteur RAM actuel.", + "intro": "La carte précédente définit la durée de silence après un rejet ; celle-ci règle la valeur qui déclenche une alerte. La plupart des contrôles à seuil ont des valeurs Avertissement et Critique réglables. Le tableau ci-dessous explique les exceptions, comme la règle combinée du swap.", "whatForTitle": "À quoi cela sert", "whatForIntro": "Les valeurs par défaut sont un point de départ ; chaque environnement a ses propres conditions :", "whatForItems": [ @@ -85,7 +85,7 @@ "Choisissez les seuils de température selon les spécifications du disque et ses conditions réelles. Le refroidissement passif ou forcé ne définit pas seul une limite sûre universellement plus basse ou haute.", "Un hôte très virtualisé peut avoir des pics CPU pendant les compilations sans alerter à chaque pic de 80 %, mais doit signaler une saturation durable." ], - "whatForOutro": "Les modifications prises en charge s’appliquent à l’analyse suivante. Le Health Monitor lit /usr/local/share/proxmenux/health_thresholds.json à chaque cycle sans redémarrage. Certains indicateurs, comme la température des disques, utilisent ces valeurs ; des barres de capacité gardent leurs propres limites. La ligne RAM décrit une exception actuelle.", + "whatForOutro": "Les modifications de seuils prises en charge s’appliquent à l’analyse suivante. Le Health Monitor lit /usr/local/share/proxmenux/health_thresholds.json à chaque cycle sans redémarrage. Certains indicateurs, dont la température des disques, utilisent ces valeurs ; certaines barres de capacité gardent leurs propres limites visuelles.", "coloursTitle": "Couleurs des états Avertissement et Critique", "coloursIntro": "Les widgets utilisant Avertissement/Critique suivent les trois états ci-dessous. D’autres indicateurs, comme les barres de capacité PVE, ont leurs propres limites ; leur couleur seule n’indique pas une alerte Health Monitor.", "headerColour": "Couleur", @@ -125,7 +125,7 @@ "section": "Mémoire", "warning": "85 %", "critical": "95 %", - "gates": "Pression RAM de l’hôte. Le réglage affiche Critique à 95 %, mais le détecteur actuel utilise une règle fixe de 90 % soutenus ; ce réglage ne modifie pas actuellement cette branche d’exécution." + "gates": "Pression RAM de l’hôte." }, { "section": "Swap (seuil critique uniquement)", @@ -185,7 +185,7 @@ "section": "Stockage PVE", "warning": "85 %", "critical": "95 %", - "gates": "Stockages gérés par PVE : LVM, LVM-thin, ZFS-pool, RBD/Ceph et PBS. Tous ne sont pas des stockages en blocs." + "gates": "Uniquement les stockages PVE de type LVM, LVM-thin, ZFS-pool, RBD, CephFS et PBS. Les stockages répertoire, NFS et CIFS relèvent de la ligne d’espace disque de l’hôte." }, { "section": "Pool ZFS", @@ -218,7 +218,7 @@ "toggleTitle": "Interrupteur de notification lié à la détection", "toggleBody": "L’interrupteur lxc_updates_available par canal dans Notifications → Services n’apparaît que si la détection est active. La désactiver masque la ligne pour tous les canaux. Le choix reste dans la base et retrouve sa valeur à la réactivation.", "purgeTitle": "Ce qui est supprimé à la désactivation", - "purgeBody": "La désactivation retire aussitôt les entrées type=lxc de /usr/local/share/proxmenux/managed_installs.json. Les compteurs de mises à jour LXC de Matériel disparaissent à l’actualisation suivante. La réactivation remplit le registre au prochain cycle, ou plus tôt par actualisation manuelle de l’API." + "purgeBody": "La désactivation retire aussitôt toutes les entrées type=lxc de /usr/local/share/proxmenux/managed_installs.json. Les compteurs de mises à jour LXC de l’onglet VM et LXC disparaissent à l’actualisation suivante du tableau de bord. La réactivation remplit le registre au prochain cycle de détection, ou plus tôt par actualisation manuelle de l’API." }, "storageExclusions": { "heading": "Exclusions de stockage distant", diff --git a/web/messages/fr/docs/monitor/dashboard/storage.json b/web/messages/fr/docs/monitor/dashboard/storage.json index 54006e0b..7f5304ca 100644 --- a/web/messages/fr/docs/monitor/dashboard/storage.json +++ b/web/messages/fr/docs/monitor/dashboard/storage.json @@ -70,7 +70,7 @@ "items": [ "Chemin du périphérique — /dev/sda, /dev/nvme0n1.", "Étiquette de type — SATA / NVMe et icône associée.", - "Étiquette système — marque orange pour les disques identifiés comme hébergeant le système. La détection utilise les montages / et /boot et applique l’étiquette System. Son absence ne prouve pas qu’un disque peut être effacé ou réutilisé sans risque.", + "Étiquette système — marque orange pour les disques utilisés par l’hôte : points de montage système (/, /boot, /usr, /var…), swap actif, membres de pools ZFS, volumes physiques LVM, membres RAID actifs ou étiquettes de partitions système. Son absence ne prouve pas qu’un disque peut être effacé ou réutilisé sans risque.", "Modèle — fabricant et modèle de smartctl -i.", "Capacité — exprimée en unités lisibles.", "Température — valeur actuelle en °C, colorée selon le type de disque ; les seuils NVMe sont plus élevés que SATA.", @@ -112,7 +112,7 @@ "pdfPreviewAlt": "Première page du rapport SMART avec synthèse, indicateur PASSED et informations sur le disque", "pdfPreviewCaption": "Première page : synthèse, indicateur PASSED et informations complètes du disque. L’exemple PDF contient l’usure SSD, tous les attributs SMART et l’historique des tests.", "pdfDownloadLabel": "Télécharger un exemple de rapport SMART (PDF)", - "pdfSectionsIntro": "Le rapport comporte six sections principales :", + "pdfSectionsIntro": "Le rapport comporte ces sections principales :", "pdfSections": [ "Synthèse — état PASSED/FAILED, évaluation claire du disque — sain, usé ou défaillant — et quatre données : date du rapport, dernier type de test, résultat et attributs vérifiés.", "Informations sur le disque — modèle, série, capacité, type HDD/SSD/NVMe, famille, format, interface (SATA 3.3 · 6.0 Gb/s, …), TRIM, température et seuil optimal, heures de fonctionnement, cycles d’alimentation, SMART, secteurs en attente/réalloués et erreurs CRC.", @@ -127,7 +127,7 @@ "historyImageCaption": "Historique SMART du disque. Chaque ligne affiche type, date, ancienneté, repère du dernier test et actions de téléchargement de la sortie smartctl et suppression.", "historyIntro": "Tests courts et étendus terminés et conservés pour le disque. Chaque entrée contient la sortie originale smartctl et les champs interprétés par Monitor pour le tableau de bord. Actions par ligne :", "historyItems": [ - "Télécharger — enregistre l’instantané JSON contenant les données smartctl -a utilisées par le rapport. Utile si le support demande les champs de diagnostic originaux.", + "Télécharger — enregistre l’instantané JSON de ce test (sortie de smartctl -a --json, ou nvme smart-log sur NVMe si smartctl échoue). Utile si le support du fabricant demande les champs de diagnostic originaux.", "Supprimer — retire manuellement un test de l’historique. La conservation de Planification (5 / 10 / 20 derniers) supprime automatiquement les plus anciens." ], "scheduleTitle": "Onglet 4 — Planification", diff --git a/web/messages/fr/docs/monitor/dashboard/vms-lxcs.json b/web/messages/fr/docs/monitor/dashboard/vms-lxcs.json index b3cd7448..febe9371 100644 --- a/web/messages/fr/docs/monitor/dashboard/vms-lxcs.json +++ b/web/messages/fr/docs/monitor/dashboard/vms-lxcs.json @@ -1,16 +1,16 @@ { "meta": { "title": "ProxMenux Monitor — Tableau de bord : VM et LXC | Documentation ProxMenux", - "description": "Inventaire des invités avec CPU, mémoire et disque en direct. Les détails montrent configuration, ressources, sauvegardes, résultats récents du journal Proxmox, notes et Démarrer / Éteindre / Redémarrer / Forcer l'arrêt." + "description": "L’onglet VM et LXC inventorie tous les invités de l’hôte avec l’utilisation CPU, mémoire et disque en direct. Les détails de chaque invité montrent configuration, ressources, sauvegardes, journal de console des conteneurs OCI, notes et commandes Démarrer / Éteindre / Redémarrer / Forcer l'arrêt." }, "header": { "title": "Tableau de bord : VM et LXC", - "description": "Inventaire complet du nœud : quatre mesures en haut, une liste triable des VM et LXC et les détails par invité avec configuration, ressources, sauvegardes, journaux et commandes Démarrer / Éteindre / Redémarrer / Forcer l'arrêt.", + "description": "Inventaire complet des invités du nœud : quatre mesures en haut, une liste triable de chaque VM et LXC en dessous et les détails par invité avec configuration, ressources, sauvegardes, journal de console des conteneurs OCI et les quatre commandes de cycle de vie (Démarrer / Éteindre / Redémarrer / Forcer l'arrêt).", "section": "ProxMenux Monitor · Tableau de bord" }, "intro": { "title": "Commandes des systèmes invités", - "body": "Cet onglet contrôle le cycle de vie des invités. Les actions passent par POST /api/vms/<vmid>/control avec confirmation explicite et actualisent la ligne de l'invité. L'arrêt forcé nécessite le bouton dédié Forcer l'arrêt." + "body": "Cet onglet contrôle le cycle de vie des invités. Les actions de cycle de vie passent par POST /api/vms/<vmid>/control ; Redémarrer et Forcer l'arrêt demandent de saisir le VMID pour confirmer, et la réponse est reflétée dans la ligne de l’invité. L’arrêt forcé nécessite le bouton dédié Forcer l'arrêt." }, "topRow": { "heading": "Ligne supérieure : quatre cartes statistiques", @@ -186,9 +186,9 @@ "source": "Les données PVE RRD (pvesh get /nodes/<node>/qemu/<id>/rrddata) sont condensées à une forme facile à tracer." }, { - "section": "Résultats récents du journal Proxmox", - "endpoint": "/api/vms//logs", - "source": "pvesh get /nodes/<node>/<qemu|lxc>/<vmid>/log --start 0 --limit 1000. Un échec renvoie une liste vide ; ces données ne constituent pas les journaux système complets de l'invité." + "section": "Journal de console OCI (onglet Logs)", + "endpoint": "/api/lxc//console-log", + "source": "Sortie console du processus principal de l’image, lue depuis /var/log/proxmenux/oci/<vmid>.console.log sur l’hôte. Affiché uniquement pour les conteneurs OCI." }, { "section": "Sauvegardes disponibles pour les invités", diff --git a/web/messages/fr/docs/monitor/health-monitor.json b/web/messages/fr/docs/monitor/health-monitor.json index 6ad87f31..2e3654cd 100644 --- a/web/messages/fr/docs/monitor/health-monitor.json +++ b/web/messages/fr/docs/monitor/health-monitor.json @@ -68,7 +68,7 @@ { "category": "Stockage", "checks": "Stockages Proxmox, système de fichiers racine", - "events": "Seuils d’occupation dépassés sur la racine ou un autre système de fichiers surveillé (85% avertissement / 95% critique par défaut) ; export NFS indisponible ; échec d’authentification CIFS ; pool LVM-thin plein." + "events": "Seuils d’occupation dépassés sur la racine ou un autre système de fichiers surveillé (85% avertissement / 95% critique par défaut) ; stockages PVE indisponibles ; montages NFS/CIFS figés ou passés en lecture seule de façon inattendue ; stockages LVM-thin et autres pools dépassant les mêmes seuils." }, { "category": "Disques & SMART", @@ -98,7 +98,7 @@ { "category": "Mises à jour du système", "checks": "Mises à jour en attente, mises à jour de sécurité, version noyau / PVE, âge du système", - "events": "Mises à jour de sécurité ou du noyau utilisé en attente ; système non mis à jour depuis longtemps. Le bouton Mettre à jour maintenant apparaît dans l’aperçu lorsque des mises à jour sont disponibles. Il lance la procédure complète ProxMenux ; sa fermeture actualise l’état avec ?refresh=1 sans attendre le cycle suivant." + "events": "Mises à jour de sécurité ou du noyau utilisé en attente ; système non mis à jour depuis longtemps. La catégorie Mises à jour de la fenêtre État de santé affiche un bouton Mettre à jour maintenant lorsque des mises à jour sont en attente. Il lance la procédure complète de mise à jour ProxMenux dans la fenêtre ; sa fermeture actualise l’état avec ?refresh=1 afin que l’indicateur reflète le nouvel état sans attendre le cycle suivant." }, { "category": "Sécurité et certificats", @@ -158,7 +158,7 @@ }, "dismiss": { "heading": "Masquer les alertes et choisir la durée de mise en sourdine", - "intro": "Certains événements persistent, comme Mises à jour système : mises à jour disponibles tant que l’hôte n’est pas mis à jour. Une notification toutes les cinq minutes serait inutile. Le bouton Mettre à jour maintenant de l’aperçu permet de résoudre ce cas directement. Pour les autres cas ou les mises à jour reportées, deux mécanismes liés permettent de masquer les alertes :", + "intro": "Certains événements persistent par nature, comme Mises à jour système : mises à jour disponibles tant que l’hôte n’est pas mis à jour, et une notification toutes les cinq minutes pendant une semaine serait inutile. Le bouton Mettre à jour maintenant de la catégorie Mises à jour de la fenêtre État de santé permet de résoudre ce cas directement. Pour les autres cas ou les mises à jour reportées, la surveillance offre aussi deux mécanismes liés pour masquer les alertes :", "step1": "Masquer un événement dans la fenêtre. Le menu propose 24 heures, 7 jours ou Définitivement, indépendamment de la catégorie. Le choix envoie POST /api/health/acknowledge avec error_key et suppression_hours (-1 pour une durée permanente). L’événement passe dans la liste masquée avec l’horodatage acknowledged_at.", "dropdownImageAlt": "Menu pour masquer une alerte : 24 heures, 7 jours ou définitivement", "dropdownImageCaption": "La durée choisie ne concerne que cette alerte ; sans choix individuel, la valeur de la catégorie s’applique. Les alertes masquées définitivement portent un badge ambre Permanent et ne se déclenchent normalement plus. La température CPU critique constitue l’exception décrite plus bas.", @@ -187,7 +187,7 @@ }, { "finding": "ZFS pool DEGRADED / FAULTED", - "why": "Les contrôles de capacité des pools ZFS autorisent l’acquittement. Les autres constats suivent leur propre indicateur. Acquitter ne répare pas un pool dégradé ou défaillant." + "why": "Les constats d’état des pools ZFS (DEGRADED, FAULTED, UNAVAIL) autorisent explicitement l’acquittement, tout comme les contrôles de capacité des pools. Acquitter ne répare pas un pool dégradé ou défaillant." }, { "finding": "Erreurs d'entrée/sortie du disque avec SMART FAILED", @@ -289,7 +289,7 @@ }, "rest": { "heading": "Points d’accès REST", - "intro": "Les actions de la fenêtre sont accessibles par API pour scripts, tableaux de bord ou bots. Si l’authentification du Monitor est activée, un jeton Bearer valide issu de la connexion ou de l’écran des jetons API est requis. Les modifications, comme acquitter, enregistrer ou nettoyer les erreurs orphelines, exigent full_admin ; read_only reçoit 403. Si l’authentification est désactivée ou refusée, ces contrôles autorisent l’accès sans jeton.", + "intro": "Les actions de la fenêtre sont aussi accessibles par API pour scripts, tableaux de bord personnalisés ou bots. Les appels exigent un jeton Bearer valide, issu de la connexion ou de l’écran des jetons API. Les modifications, comme acquitter des alertes, enregistrer les réglages de suppression ou nettoyer les erreurs orphelines, exigent la portée full_admin ; read_only reçoit 403.", "headerEndpoint": "Point d’accès", "headerMethod": "Méthode", "headerUse": "Utilisation", @@ -297,7 +297,7 @@ { "endpoint": "/api/health", "method": "GET", - "use": "Contrôle léger renvoyant du JSON avec status, timestamp et version. Convient aux contrôles de mots-clés Uptime Kuma ; si l’authentification du Monitor est activée, le client doit envoyer un en-tête Bearer." + "use": "Contrôle léger renvoyant du JSON avec status, timestamp et version. Convient aux contrôles de mots-clés Uptime Kuma ; le client doit envoyer un en-tête Bearer." }, { "endpoint": "/api/health/status", diff --git a/web/messages/fr/docs/monitor/index.json b/web/messages/fr/docs/monitor/index.json index 511bb3e6..be430c57 100644 --- a/web/messages/fr/docs/monitor/index.json +++ b/web/messages/fr/docs/monitor/index.json @@ -52,7 +52,7 @@ }, { "name": "Terminal", - "description": "Shell de l’hôte et consoles VM/CT compatibles dans le navigateur via xterm.js et WebSockets. Le mode d’authentification configuré s’applique : désactivé ou refusé, il permet aux clients ayant accès au réseau d’ouvrir une session sans connexion. Cela n’implique pas un audit de chaque commande." + "description": "Shell de l’hôte et consoles VM/CT compatibles dans le navigateur via xterm.js et WebSockets. Les sessions ne sont pas auditées commande par commande." }, { "name": "Sécurité", @@ -114,7 +114,7 @@ "heading": "REST API et intégrations", "intro": "Les points d’accès REST exposent les mesures en JSON par HTTP/HTTPS pour Homepage, Home Assistant, Uptime Kuma et les scripts. Grafana peut utiliser l’exporteur texte Prometheus séparé sur /api/prometheus. Les requêtes peuvent être faites avec curl.", "tokens": "Les jetons API à longue durée de vie (365 jours) sont générés à partir de Paramètres → API Tokens ou via POST /api/auth/generate-api-token.", - "bearer": "Envoyez les jetons via Authorization: Bearer …. Le point public /api/health convient aux sondes de disponibilité sans identifiants. Sous /api/auth/*, certaines routes de configuration/connexion/état sont publiques, mais celles de gestion du compte et des jetons sont protégées.", + "bearer": "Envoyez les jetons via Authorization: Bearer …. /api/health attend aussi l’en-tête Bearer : les sondes de disponibilité ont donc besoin d’un jeton read_only. Sous /api/auth/* se trouvent à la fois des routes publiques de configuration/connexion/état et des routes protégées de gestion du compte et des jetons ; elles ne sont pas toutes anonymes.", "catalog": "Le catalogue complet des points d'accès, les conseils de rotation des jetons et les bonnes pratiques de sécurité se trouvent dans la référence API. Des exemples pour Homepage, Home Assistant, Grafana et Uptime Kuma, ainsi qu'un modèle générique cURL, sont proposés dans les intégrations." }, "serviceControl": { diff --git a/web/messages/fr/docs/monitor/integrations.json b/web/messages/fr/docs/monitor/integrations.json index 88c6973d..dc4373ac 100644 --- a/web/messages/fr/docs/monitor/integrations.json +++ b/web/messages/fr/docs/monitor/integrations.json @@ -220,7 +220,7 @@ "heading": "n8n, Zapier et scripts personnalisés", "intro": "Les workflows et scripts peuvent envoyer des notifications par POST vers /api/notifications/send, par exemple après un échec CI ou une tâche trop longue. Cet envoi direct contourne la file et le délai entre empreintes d’événements. Il conserve le format par canal, l’IA facultative et la livraison. Gérez les doublons dans l’appelant.", "n8nBody": "Dans n8n, utilisez un nœud HTTP Request avec POST, l’URL ci-dessus et le même JSON que curl. Choisissez les identifiants génériques Header Auth : nom Authorization et valeur Bearer YOUR_API_TOKEN, en remplaçant le marqueur. Reliez un planning, webhook ou autre nœud pour déclencher la requête.", - "severityBody": "La gravité utilise INFO, WARNING ou CRITICAL en majuscules. L’objet data apporte du contexte. L’IA reçoit le titre et le message rendus avec les enrichissements pris en charge ; tous les champs ne sont pas garantis dans ses instructions ou sa sortie. Voir Notifications → Catalogue des événements." + "severityBody": "La gravité utilise INFO, WARNING ou CRITICAL en majuscules. L’objet data apporte le contexte de l’événement et les champs du modèle. Sur ce point d’accès, la reformulation IA ne reçoit que le titre et le message ; les champs de data ne sont pas envoyés au fournisseur. Voir Notifications → Catalogue des événements pour la signification des événements." }, "pveWebhook": { "heading": "Webhook natif Proxmox VE (entrant)", diff --git a/web/messages/fr/docs/monitor/notifications.json b/web/messages/fr/docs/monitor/notifications.json index 6f27ef60..68f6f549 100644 --- a/web/messages/fr/docs/monitor/notifications.json +++ b/web/messages/fr/docs/monitor/notifications.json @@ -171,7 +171,7 @@ "Ouvrez account.microsoft.com/security et activez la vérification en deux étapes.", "Si votre compte propose Options de sécurité avancées → Mots de passe d’application, choisissez Créer un mot de passe d’application. Cela ne garantit pas l’acceptation de SMTP avec mot de passe.", "Si Microsoft crée ce mot de passe, copiez-le et vérifiez son acceptation par le service SMTP.", - "Uniquement si SMTP avec mot de passe est autorisé, utilisez les paramètres approuvés : Serveur smtp.office365.com pour Exchange Online, Port 587, Mode TLS STARTTLS, Identifiant votre adresse et Mot de passe la valeur autorisée. Outlook.com personnel a d’autres paramètres et exigences." + "Uniquement si votre fournisseur autorise SMTP avec mot de passe, saisissez ses paramètres approuvés : Hôte SMTP smtp.office365.com pour Exchange Online, Port 587, Mode TLS STARTTLS, Nom d'utilisateur l’adresse de votre boîte aux lettres et Mot de passe l’identifiant SMTP autorisé. Les paramètres et exigences d’authentification d’Outlook.com personnel sont différents ; ne supposez pas que ces identifiants fonctionneront." ], "relayTitle": "Relais SMTP auto-hébergé", "relayBody": "Dirigez Monitor vers un relais SMTP contrôlé, par exemple Postfix. Le relais gère l’authentification du fournisseur. Configurez authentification et TLS selon le relais ; son caractère local ne désactive pas le chiffrement." @@ -266,7 +266,7 @@ "howItems": [ "Activation par canal. Désactivé par défaut. Activez-le seulement là où vous voulez un résumé ; les autres canaux restent en direct.", "Heure de livraison locale, 09:00 par défaut. L’envoi se déclenche à environ 60 s près.", - "Inclus : événements génériques admissibles de niveau INFO, comme mise à jour d’application disponible, mise à jour Tailscale disponible, mise à jour d’optimisation ProxMenux disponible, mises à jour de sécurité APT en attente et avis de limitation d’envoi. Résultats de sauvegarde et actions exemptées restent en direct.", + "Inclus dans le résumé : événements génériques admissibles de niveau INFO. Exemples : mise à jour d’application disponible, mise à jour Tailscale disponible, mise à jour d’optimisation ProxMenux disponible et mises à jour de sécurité APT en attente. Les résultats de sauvegarde et les autres événements d’action exemptés restent en direct.", "Ce qui n'est jamais retardé:", "Persistance. Les événements restent dans SQLite, table digest_pending, jusqu’à l’heure prévue, même après redémarrage.", "Sans événement, sans résumé. Aucun résumé vide n’est envoyé si aucun INFO n’attend." @@ -301,7 +301,7 @@ { "stage": "Délai de répétition", "what": "Après livraison réussie, les répétitions sont supprimées ; l’état est dans notification_last_sent. Base pour CRITICAL, WARNING, INFO, resources et updates : 86400 s. Exceptions : 5 s pour actions VM/CT et arrêt/redémarrage, 10 s pour résultats sauvegarde/réplication, 1800–3600 s pour plusieurs états de santé. Les réglages explicites d’événement/groupe prévalent.", - "tunable": "Oui : des valeurs explicites par événement ou groupe remplacent les valeurs du répartiteur." + "tunable": "Uniquement via l’API des paramètres : une clé cooldown.<event_type> ou cooldown.<group> remplace les valeurs par défaut ; aucun contrôle n’existe dans l’interface." }, { "stage": "Regroupement des rafales", @@ -330,7 +330,7 @@ "Méthode et URL. POST http://127.0.0.1:8008/api/notifications/webhook sans HTTPS Monitor ; avec HTTPS, récepteur HTTP local séparé sur 8009. Les deux restent sur l’hôte.", "Modèle du corps. JSON avec aides Handlebars natives de PVE, stocké en base64 dans la configuration. Une fois décodé :", "Matcher. Un bloc d'accompagnement matcher: proxmenux-matcher avec mode all afin que chaque notification PVE atteigne la cible.", - "Configuration privée. La configuration écrit webhook: proxmenux-webhook dans /etc/pve/priv/notifications.cfg avec le secret partagé en base64. La cible publique le référence pour envoyer X-Webhook-Secret. Le bloc n’est pas vide." + "Configuration privée. La configuration écrit le bloc correspondant webhook: proxmenux-webhook dans /etc/pve/priv/notifications.cfg avec une entrée secret nommée X-Webhook-Secret, encodée en base64. Le bloc public de la cible ne contient que le modèle du corps, la méthode et l’URL. Le bloc privé n’est pas une ébauche vide." ], "securityTitle": "Comment le récepteur est sécurisé", "securityIntro": "Le récepteur webhook de POST /api/notifications/webhook applique différentes couches de sécurité selon l'origine de la demande:", diff --git a/web/messages/it/docs/monitor/access-auth.json b/web/messages/it/docs/monitor/access-auth.json index 6a69a76d..59d77edd 100644 --- a/web/messages/it/docs/monitor/access-auth.json +++ b/web/messages/it/docs/monitor/access-auth.json @@ -19,7 +19,7 @@ "reaching": { "heading": "Raggiungere la dashboard", "intro": "ProxMenux Monitor si lega a 0.0.0.0:8008. Ci sono tre modi comuni per raggiungerlo:", - "outro": "L’accesso diretto corrisponde all’unità systemd predefinita. Proxy inverso e Secure Gateway sono descritti più avanti. Per usare l’IP in X-Forwarded-For servono PROXMENUX_TRUST_PROXY=1 e un proxy sotto il tuo controllo. X-Forwarded-Proto o X-Forwarded-Host da soli non attivano tale fiducia; il frontend costruisce gli URL API dall’origine del browser." + "outro": "L’accesso diretto corrisponde all’unità systemd predefinita. Proxy inverso e Secure Gateway sono descritti più avanti. Per fidarsi degli IP client in X-Forwarded-For servono PROXMENUX_TRUST_PROXY=1 e un proxy sotto il tuo controllo. La sola presenza di X-Forwarded-Proto o X-Forwarded-Host non attiva la fiducia nel proxy. Sulle porte 80/443 il frontend usa URL /api/* relativi; su qualsiasi altra porta chiama la porta 8008 sullo stesso nome host." }, "firstLaunch": { "heading": "Procedura al primo avvio", @@ -117,8 +117,8 @@ "loginImageCaption": "Dopo la configurazione, l’accesso inizia da questa schermata. Con 2FA viene richiesto il codice a sei cifre dopo l’accettazione della password.", "loginFlowTitle": "Flusso di accesso", "twofaIntro": "Con 2FA, la prima chiamata restituisce requires_totp: true. Ripetila con il codice a sei cifre:", - "publicTitle": "Accesso pubblico e controlli protetti", - "publicIntro": "Accesso e stato dell’autenticazione sono pubblici. La creazione dell’account è possibile finché non sono salvati nome e password, anche dopo aver rifiutato la protezione. I dati di sistema richiedono autenticazione quando la protezione è attiva:", + "publicTitle": "Endpoint pubblici (senza token)", + "publicIntro": "Accesso, stato dell’autenticazione, configurazione iniziale e l’endpoint leggero /api/system-info sono pubblici:", "publicItems": [ "/api/auth/login e /api/auth/status sono pubblici. /api/auth/setup crea il primo account e rifiuta di sovrascrivere credenziali esistenti.", "/api/system-info è un endpoint pubblico con informazioni di base sul sistema, incluso health.status. Non richiede un token. Anche /api/auth/status è pubblico e consente di verificare la raggiungibilità." @@ -146,7 +146,7 @@ }, { "asset": "Segreto TOTP della 2FA", - "algorithm": "TOTP standard (RFC 6238), con segreto in base32. Gli otto codici di recupero sono monouso e vengono salvati come hash SHA-256.", + "algorithm": "TOTP standard (RFC 6238), con segreto in base32. Gli otto codici di backup sono monouso e vengono salvati come hash SHA-256.", "where": "auth.json → totp_secret + backup_codes[]" }, { @@ -243,17 +243,17 @@ } ], "backupTitle": "Perché servono i backup", - "backupBody": "Se perdi il dispositivo, usa un codice di recupero salvato oppure ripristina un backup configurato in precedenza. Sincronizzazione cloud ed esportazioni variano per app: verifica che ripristinino davvero i segreti TOTP. L’accesso root all’host permette anche il recupero descritto sotto. Conserva una copia separata e sicura.", + "backupBody": "Se perdi il dispositivo di autenticazione, usa un codice di backup salvato oppure ripristina l’app da un backup configurato in precedenza. Sincronizzazione cloud ed esportazioni locali variano per app: verifica che il metodo scelto ripristini davvero i segreti TOTP. L’accesso root all’host permette anche il recupero descritto sotto. Conserva un backup separato e sicuro.", "setupTitle": "Impostazione passo passo dal cruscotto", "setupImageAlt": "Schermo di configurazione 2FA con codice QR e codici di backup", - "setupImageCaption": "La finestra 2FA mostra QR, segreto Base32 per inserimento manuale e otto codici di recupero monouso. Copiali prima di chiudere: non saranno mostrati di nuovo.", + "setupImageCaption": "La finestra di configurazione 2FA mostra un QR, un segreto Base32 per l’inserimento manuale e, dopo la verifica, otto codici di backup monouso. Copia i codici prima di chiudere la finestra: non saranno mostrati di nuovo.", "setupSteps": [ "Installa l’app di autenticazione sul telefono o apri il gestore di password. Basta farlo una volta: la stessa app può conservare i codici di tutti i servizi protetti.", "Accedi alla dashboard con nome utente e password.", - "Apri la scheda Sicurezza e scegli Abilita 2FA. Il dialogo mostra QR, segreto Base32 e otto codici di recupero.", + "Apri la scheda Sicurezza nella barra laterale della dashboard, poi fai clic su Abilita 2FA e Avvia la configurazione. Il dialogo mostra il QR e la chiave manuale; gli otto codici di backup compaiono dopo la verifica del codice.", "Aggiungi la voce all’app di autenticazione:", - "Salva i codici di recupero. Conserva tutti e otto in un gestore di password, nota cifrata o copia cartacea sicura. Ciascuno funziona una volta se l’app non è disponibile.", - "Conferma inserendo il codice attuale a sei cifre dell’app nel campo \"Codice di verifica\" e invia. Cambia ogni 30 secondi: se scade mentre lo scrivi, usa il successivo.", + "Conferma inserendo il codice attuale a sei cifre dell’app nel campo \"Codice di verifica\" della finestra di configurazione e invia. Cambia ogni 30 secondi: se scade mentre lo scrivi, usa il successivo.", + "Salva i codici di backup. Dopo la verifica, conserva tutti e otto in modo sicuro in un gestore di password, nota cifrata o copia cartacea sicura. Ciascuno funziona una volta se l’app di autenticazione non è disponibile.", "Fatto. 2FA è attivo. Al prossimo accesso verrà richiesta prima la password, poi il codice attuale a sei cifre." ], "setupStep4Sub": [ @@ -261,17 +261,17 @@ "Alternativa manuale se non puoi scansionare, ad esempio sullo stesso telefono: Aggiungi account → Inserisci chiave di configurazione. Scegli un nome come Proxmox Monitor, incolla il segreto Base32, lascia Tipo su Basato sul tempo e salva." ], "testTitle": "Prova prima di uscire", - "testBody": "Mantieni la sessione attuale aperta e prova un nuovo accesso in una finestra privata subito dopo la configurazione. Se il codice fallisce, controlla gli orologi di server e telefono prima di chiudere la sessione valida. Se hai già perso l’accesso, usa un codice di recupero o modifica auth.json dalla shell dell’host.", + "testBody": "Mantieni la sessione attuale aperta e prova un nuovo accesso in una finestra privata subito dopo la configurazione. Se il codice viene rifiutato, controlla gli orologi di server e telefono prima di uscire dalla sessione valida. Se hai già perso l’accesso, usa un codice di backup o modifica auth.json dalla shell dell’host.", "lostTitle": "Autenticatore perso", "lostIntro": "Tre metodi di recupero, dal meno al più invasivo:", "lostItems": [ - "Usa un codice di recupero. Inserisci uno degli otto nel campo TOTP. Funziona una volta; gli altri restano validi. Dopo l’accesso, riconfigura 2FA dalle impostazioni per ottenere otto nuovi codici.", + "Usa un codice di backup. Inserisci uno degli otto codici salvati nel campo TOTP. Funziona una volta; i codici non usati restano validi. Dopo l’accesso apri Sicurezza, scegli Disattiva 2FA e poi Abilita 2FA per ottenere otto nuovi codici.", "Ripristina l’app da cloud o backup. Con sincronizzazione configurata, installala sul nuovo dispositivo e accedi: Google, Microsoft, Authy, Apple Passwords tramite Portachiavi iCloud, Ente o 2FAS. Con un file esportato da Aegis, Raivo o FreeOTP+, installa l’app e importa il file.", "Disattiva 2FA dalla shell dell’host. Se gli altri metodi non sono disponibili, modifica /root/.config/proxmenux-monitor/auth.json come root via SSH o console, imposta totp_enabled su false, salva e riavvia il servizio:" ], "lostShellOutro": "È possibile accedere solo con nome utente + password, quindi abilitare 2FA da Impostazioni.", "disableTitle": "Disabilita 2FA", - "disableBody": "Apri Sicurezza e scegli Disattiva 2FA. POST /api/auth/totp/disable richiede password attuale e codice TOTP o di recupero valido. Elimina segreto TOTP e codici di recupero. Rimuovi la vecchia voce anche dall’app.", + "disableBody": "Apri Sicurezza e scegli Disattiva 2FA. POST /api/auth/totp/disable richiede la password attuale e un codice TOTP o di backup valido. Elimina il segreto TOTP e i codici di backup. Rimuovi la vecchia voce anche dall’app di autenticazione.", "rejectedTitle": "Il codice a sei cifre viene sempre rifiutato", "rejectedIntro": "TOTP dipende dall’ora: gli orologi di server e telefono devono differire di meno di circa 30 s. Due controlli:", "rejectedItems": [ diff --git a/web/messages/it/docs/monitor/ai-assistant.json b/web/messages/it/docs/monitor/ai-assistant.json index c60581f6..7dffdec2 100644 --- a/web/messages/it/docs/monitor/ai-assistant.json +++ b/web/messages/it/docs/monitor/ai-assistant.json @@ -14,7 +14,7 @@ }, "intro": { "title": "Off per impostazione predefinita, singolo interruttore per abilitare", - "body": "La riscrittura IA è disattivata per impostazione predefinita. Attivala in Impostazioni → Notifiche → Avanzate: miglioramento IA. Se il contesto aggiuntivo o la riscrittura falliscono, viene inviato il modello originale. Ogni riscrittura ha un tempo limite di 25 secondi; allo scadere si usa il modello senza attendere indefinitamente." + "body": "La riscrittura IA è disattivata per impostazione predefinita. Attivala in Impostazioni → Notifiche → Avanzate: miglioramento IA. Se il contesto aggiuntivo o la riscrittura falliscono, il processo di invio manda il modello originale. Le riscritture nella coda di invio degli eventi hanno un tempo limite di 25 secondi; allo scadere si invia il modello invece di attendere." }, "howItWorks": { "heading": "Come funziona", @@ -109,7 +109,7 @@ ], "customNote": "La modalità con prompt personalizzato limita l’uscita a 500 token, indipendentemente dal livello di dettaglio. Il prompt è sotto il tuo controllo e il limite evita risposte eccessive.", "sizingTitle": "Pratico dimensionamento", - "sizingBody": "Stima il consumo come eventi riscritti × canali IA × token in ingresso e uscita per chiamata. Esempio: 50 eventi × un canale × (500 in ingresso + 300 in uscita) = 40.000 token al giorno. Consumi e costi dipendono da modello, contesto, cache e limiti del provider. Dettaglio per canale spiega come usare brief nelle chat invece di standard, mantenendo e-mail dettagliate." + "sizingBody": "Stima il consumo come eventi riscritti × canali con IA × token in ingresso e uscita per chiamata. Esempio: 50 eventi × un canale × (2.000 in ingresso + 300 in uscita) sono circa 115.000 token al giorno, perché il prompt di sistema predefinito da solo occupa circa 1.500 token. Consumi e costi reali dipendono da modello, contesto, cache e limiti del provider. La sezione Dettaglio per canale spiega come usare brief nelle chat invece di standard, mantenendo report e-mail dettagliati." }, "providers": { "heading": "Fornitori di AI", @@ -142,7 +142,7 @@ "items": [ "Chiave API: console.anthropic.com/settings/keys", "Esempi dall’elenco di modelli incluso: claude-haiku-4-5-20251001, claude-sonnet-4-6, claude-opus-4-6.", - "Raccomandazione inclusa: claude-haiku-4-5-20251001. Questa versione precisa è configurata come consigliata; le vecchie voci Claude 3.5 non sono più nella lista inclusa." + "Raccomandazione inclusa: claude-haiku-4-5-20251001, uno snapshot fisso anziché un alias variabile." ] }, "gemini": { diff --git a/web/messages/it/docs/monitor/api-reference.json b/web/messages/it/docs/monitor/api-reference.json index 4e8b149d..a4789f6b 100644 --- a/web/messages/it/docs/monitor/api-reference.json +++ b/web/messages/it/docs/monitor/api-reference.json @@ -162,7 +162,7 @@ { "endpoint": "/api/vms//backup", "method": "POST", - "use": "Crea un backup vzdump di VM o LXC. Campi facoltativi da adattare allo storage: storage (destinazione PVE), mode (snapshot, suspend o stop), compress (zstd, lzo, gzip o none), protected (true o false), notes, notification (auto, always, failure o never) e pbs_change_detection (default, legacy o data). Restituisce l’UPID della task PVE." + "use": "Crea un backup vzdump di una VM o di un LXC. Campi del corpo, tutti facoltativi salvo che i valori predefiniti non corrispondano alla struttura dello storage: storage (uno storage PVE), mode (snapshot, suspend o stop), compress (zstd, lzo, gzip o none), protected (true o false), notes e pbs_change_detection (default, legacy o data). Restituisce l’UPID della task PVE." }, { "endpoint": "/api/vms//backups", @@ -286,7 +286,7 @@ { "endpoint": "/api/storage/smart//test", "method": "POST", - "use": "Avvia un autotest SMART. Schema del corpo: '{'\"type\":\"short\"|\"long\"'}'." + "use": "Avvia un autotest SMART. Schema del corpo: '{'\"test_type\":\"short\"|\"long\"'}'." }, { "endpoint": "/api/storage/smart/schedules", diff --git a/web/messages/it/docs/monitor/architecture.json b/web/messages/it/docs/monitor/architecture.json index ba32fbd8..b69a24ae 100644 --- a/web/messages/it/docs/monitor/architecture.json +++ b/web/messages/it/docs/monitor/architecture.json @@ -73,13 +73,13 @@ "intro": "L’AppImage contiene un filesystem montato all’esecuzione. AppRun alla radice prepara l’ambiente e avvia flask_server.py:", "consequencesIntro": "Due conseguenze di questo layout:", "consequences": [ - "Ambiente Python incluso. Interprete e pacchetti sono nell’AppImage, senza installazione nel Python di sistema. L’app usa comunque interfacce del kernel e strumenti esterni dell’host.", + "Pacchetti Python inclusi. I pacchetti Python sono distribuiti nell’AppImage e girano sull’interprete Python dell’host stesso, 3.11 (PVE 8) o 3.13 (PVE 9), senza installare nulla nel Python di sistema dell’host. L’app usa comunque interfacce del kernel e strumenti esterni dell’host.", "Client hardware inclusi. Sono presenti ipmitool, lm-sensors e upsc. Le letture richiedono hardware compatibile, accesso ai sensori e, per l’UPS, un server NUT configurato." ] }, "flask": { "heading": "Struttura dell’applicazione Flask", - "intro": "flask_server.py crea un’istanza Flask(__name__) con CORS limitato, registra direttamente nove blueprint e inizializza il terminale. La tabella mostra moduli principali; registra anche audit, backup VM e PBS. I precaricamenti PVE si eseguono solo sugli host PVE.", + "intro": "flask_server.py crea un’istanza Flask(__name__) con origini CORS limitate, registra direttamente dieci blueprint e inizializza le rotte del terminale. La tabella mostra i moduli principali; sono registrati anche i blueprint di PBS, collegamenti del Monitor, audit e backup VM. I precaricamenti specifici di PVE si eseguono solo sugli host PVE.", "headerBlueprint": "Blueprint / modulo", "headerPrefix": "Prefisso delle rotte", "headerOwns": "Responsabilità", @@ -242,10 +242,10 @@ "Aggiornamenti: pacchetti in attesa e patch di sicurezza.", "Log: schemi persistenti, picchi e sequenze a cascata nel journal di sistema.", "Memoria: interventi dell’OOM killer e pressione RAM prolungata.", - "Temperatura: letture CPU e dischi rispetto alle soglie di monitoraggio; i sensori disponibili dipendono dall’hardware.", + "CPU: utilizzo e temperatura della CPU rispetto alle soglie configurabili; i sensori disponibili dipendono dall’hardware.", "Sicurezza: errori di accesso, blocchi e stato del jail Fail2Ban." ], - "afterIntro": "I risultati usano error_key, categoria e gravità stabili. Le righe in errors vengono aggiornate con last_seen e contatori, senza duplicarle. L’invio delle notifiche ha anche impronte e intervalli propri.", + "afterIntro": "I risultati usano error_key, categoria e gravità stabili. I record esistenti in errors vengono aggiornati sul posto (last_seen, gravità, motivo), senza duplicarli. L’invio delle notifiche ha anche regole proprie di impronta e intervallo.", "cycleEnd": "La pulizia può risolvere errori obsoleti con la durata del silenziamento per categoria e regole di stato, rimuovere voci orfane di risorse eliminate e cancellare events oltre 30 giorni. Le categorie sono in Pannello → Health Monitor." }, "notifications": { @@ -264,9 +264,9 @@ "intro": "La scheda Terminale collega un client leggero xterm.js a un PTY del server via WebSocket. Esistono due modalità:", "items": [ "Modalità HTTP, predefinita: il server Flask integrato con flask-sock gestisce il passaggio al protocollo WebSocket.", - "Modalità HTTPS / WSS: usa gevent.pywsgi.WSGIServer con geventwebsocket.handler.WebSocketHandler per WebSocket su TLS." + "Modalità HTTPS / WSS: il server TLS usa gevent.pywsgi.WSGIServer con il suo gestore predefinito; flask-sock gestisce le connessioni WebSocket su TLS." ], - "outro": "I processi del terminale ereditano User=root. Con autenticazione attiva, WebSocket richiede un ticket breve monouso ottenuto dall’endpoint autenticato con permessi amministrativi. Se l’autenticazione è disattivata o rifiutata, la connessione segue quella modalità senza autenticazione.", + "outro": "I processi figli del terminale ereditano User=root dal servizio. Aprire un WebSocket richiede un ticket breve monouso ottenuto dall’endpoint autenticato dei ticket del terminale con permessi amministrativi.", "proxyNote": "Con un proxy inverso, abilita WebSocket e le intestazioni Upgrade e Connection. Il terminale richiede questo inoltro." }, "proxy": { diff --git a/web/messages/it/docs/monitor/dashboard/network.json b/web/messages/it/docs/monitor/dashboard/network.json index c3dadb78..9ee3f750 100644 --- a/web/messages/it/docs/monitor/dashboard/network.json +++ b/web/messages/it/docs/monitor/dashboard/network.json @@ -162,7 +162,7 @@ } ], "reportTitle": "Rapporto sulla latenza di rete (PDF)", - "reportIntro": "Entrambe le modalità hanno un pulsante Rapporto accanto alla destinazione. Genera un PDF delle misurazioni da allegare a una richiesta di assistenza al provider Internet.", + "reportIntro": "Entrambe le modalità hanno un pulsante Rapporto accanto alla destinazione. Apre un report stampabile delle misurazioni; salvalo in PDF dalla finestra di stampa del browser e allegalo a una richiesta di assistenza al provider Internet.", "reportPreviewAlt": "Prima pagina PDF del rapporto di latenza: sintesi, indicatore, statistiche, grafico e guida alle soglie", "reportPreviewCaption": "La prima pagina contiene sintesi, indicatore, statistiche principali, andamento della latenza e guida alle soglie. Dalla pagina 2 seguono la tabella delle misurazioni e la metodologia.", "downloadLabel": "Scarica un rapporto di latenza di esempio (PDF)", diff --git a/web/messages/it/docs/monitor/dashboard/security.json b/web/messages/it/docs/monitor/dashboard/security.json index 964d48ea..067c9ca9 100644 --- a/web/messages/it/docs/monitor/dashboard/security.json +++ b/web/messages/it/docs/monitor/dashboard/security.json @@ -136,7 +136,7 @@ "configCaption": "Modifica del jail sshd: riduci Max Retries se accedi a SSH solo dalla tua sottorete, oppure aumenta Ban Time per la dashboard esposta a Internet.", "outro": "La guida Installazione, configurazione e disinstallazione include anche l’installazione manuale, la modifica di SSH MaxAuthTries e il registro proxmenux-auth.log. Vedi ProxMenux → Sicurezza → Fail2Ban.", "calloutTitle": "Senza Fail2Ban, questo meccanismo non blocca gli IP", - "calloutBody": "ProxMenux Monitor controlla gli IP bloccati da Fail2Ban a livello applicativo prima di elaborare le richieste Flask. Interroga fail2ban-client e conserva il risultato in cache per 30 secondi; non legge una tabella SQL dei blocchi. Senza Fail2Ban, gli accessi falliti sono registrati in proxmenux-auth.log, ma questo meccanismo non blocca gli IP." + "calloutBody": "ProxMenux Monitor controlla gli IP bloccati nella jail proxmenux di Fail2Ban a livello applicativo prima di elaborare le richieste Flask, conservando il risultato in cache per 30 secondi. Senza Fail2Ban, gli accessi falliti sono registrati in proxmenux-auth.log e l’endpoint di login è limitato a 5 tentativi per IP ogni 5 minuti, ma nessun IP viene bloccato." }, "lynis": { "heading": "Audit di sicurezza Lynis", diff --git a/web/messages/it/docs/monitor/dashboard/settings.json b/web/messages/it/docs/monitor/dashboard/settings.json index eab32cb0..4abed2a5 100644 --- a/web/messages/it/docs/monitor/dashboard/settings.json +++ b/web/messages/it/docs/monitor/dashboard/settings.json @@ -76,7 +76,7 @@ }, "thresholds": { "heading": "Soglie di Health Monitor", - "intro": "La scheda precedente imposta il silenzio dopo aver ignorato un avviso; questa regola il valore che attiva un avviso. La maggior parte dei controlli ha valori Avviso e Critico modificabili. La tabella spiega eccezioni come la regola combinata dello swap e il rilevatore RAM attuale.", + "intro": "La scheda precedente imposta il silenzio dopo aver ignorato un avviso; questa regola il valore che attiva un avviso. La maggior parte dei controlli a soglia ha valori Avviso e Critico modificabili. La tabella sotto spiega eccezioni come la regola combinata dello swap.", "whatForTitle": "A cosa serve", "whatForIntro": "I valori predefiniti sono un punto di partenza, ma ogni ambiente ha condizioni proprie:", "whatForItems": [ @@ -85,7 +85,7 @@ "Scegli le soglie di temperatura secondo le specifiche del disco e le condizioni reali. Il raffreddamento passivo o forzato non determina da solo un limite sicuro universalmente più basso o alto.", "Un host molto virtualizzato può avere picchi CPU durante le compilazioni senza avvisare a ogni picco dell’80%, ma deve segnalare una saturazione prolungata." ], - "whatForOutro": "Le modifiche supportate valgono dall’analisi successiva. Health Monitor legge /usr/local/share/proxmenux/health_thresholds.json a ogni ciclo senza riavvio. Alcuni indicatori, come la temperatura dei dischi, usano questi valori; alcune barre di capacità hanno limiti propri. La riga RAM descrive un’eccezione attuale.", + "whatForOutro": "Le modifiche supportate alle soglie valgono dall’analisi successiva. Health Monitor legge /usr/local/share/proxmenux/health_thresholds.json a ogni ciclo senza riavvio. Alcuni indicatori, tra cui la temperatura dei dischi, usano questi valori; alcune barre di capacità mantengono limiti visivi propri.", "coloursTitle": "Colori degli stati Avviso e Critico", "coloursIntro": "I widget che usano Avviso/Critico seguono i tre stati sotto. Altri indicatori, come le barre di capacità PVE, hanno limiti propri; il loro colore da solo non dimostra un avviso Health Monitor.", "headerColour": "Colore", @@ -125,7 +125,7 @@ "section": "Memoria", "warning": "85 %", "critical": "95 %", - "gates": "Pressione RAM dell’host. Il valore configurabile mostra Critico al 95%, ma il rilevatore attuale usa una regola fissa del 90% prolungato; cambiare l’impostazione non modifica attualmente quel ramo." + "gates": "Pressione RAM dell’host." }, { "section": "Swap (solo soglia critica)", @@ -185,7 +185,7 @@ "section": "Storage PVE", "warning": "85 %", "critical": "95 %", - "gates": "Storage gestiti da PVE: LVM, LVM-thin, ZFS-pool, RBD/Ceph e PBS. Non sono tutti backend a blocchi." + "gates": "Solo gli storage PVE di tipo LVM, LVM-thin, ZFS-pool, RBD, CephFS e PBS. Gli storage directory, NFS e CIFS sono coperti dalla riga dello spazio su disco dell’host." }, { "section": "Pool ZFS", @@ -218,7 +218,7 @@ "toggleTitle": "Opzione di notifica legata al rilevamento", "toggleBody": "L’opzione lxc_updates_available per canale in Notifiche → Servizi appare solo con rilevamento attivo. Disattivandolo, la riga scompare da tutti i canali. La preferenza resta nel database e ritorna al valore precedente alla riattivazione.", "purgeTitle": "Cosa viene rimosso disattivando il rilevamento", - "purgeBody": "Disattivandolo si rimuovono subito le voci type=lxc da /usr/local/share/proxmenux/managed_installs.json. I contatori degli aggiornamenti LXC in Hardware spariscono al prossimo aggiornamento. Riattivandolo, il ciclo successivo ripopola il registro, o prima tramite aggiornamento manuale dell’API." + "purgeBody": "Disattivandolo si rimuovono subito tutte le voci type=lxc da /usr/local/share/proxmenux/managed_installs.json. I contatori degli aggiornamenti LXC nella scheda VM e LXC spariscono al prossimo aggiornamento della dashboard. Riattivandolo, il ciclo di rilevamento successivo ripopola il registro, o prima tramite aggiornamento manuale dell’API." }, "storageExclusions": { "heading": "Esclusioni storage remoto", diff --git a/web/messages/it/docs/monitor/dashboard/storage.json b/web/messages/it/docs/monitor/dashboard/storage.json index b4d979cf..2f6754d4 100644 --- a/web/messages/it/docs/monitor/dashboard/storage.json +++ b/web/messages/it/docs/monitor/dashboard/storage.json @@ -70,7 +70,7 @@ "items": [ "Percorso del dispositivo — /dev/sda, /dev/nvme0n1.", "Etichetta del tipo — SATA / NVMe e relativa icona.", - "Etichetta di sistema — indicatore arancione dei dischi identificati come dischi del sistema operativo. Il rilevamento usa i montaggi / e /boot e assegna System. L’assenza dell’etichetta non dimostra che il disco possa essere cancellato o riutilizzato senza rischi.", + "Etichetta di sistema — indicatore arancione dei dischi usati dall’host: punti di montaggio di sistema (/, /boot, /usr, /var…), swap attivo, membri di pool ZFS, volumi fisici LVM, membri RAID attivi o etichette di partizioni di sistema. L’assenza dell’etichetta non dimostra che il disco possa essere cancellato o riutilizzato senza rischi.", "Modello — produttore e modello da smartctl -i.", "Capacità — espressa in unità leggibili.", "Temperatura — valore attuale in °C, colorato secondo il tipo di disco; NVMe usa soglie più alte di SATA.", @@ -112,7 +112,7 @@ "pdfPreviewAlt": "Prima pagina del rapporto SMART con sintesi, indicatore PASSED e informazioni sul disco", "pdfPreviewCaption": "Prima pagina: sintesi, indicatore PASSED e informazioni complete del disco. Il PDF di esempio include usura SSD, tutti gli attributi SMART e cronologia dei test.", "pdfDownloadLabel": "Scarica un rapporto SMART di esempio (PDF)", - "pdfSectionsIntro": "Il rapporto ha sei sezioni principali:", + "pdfSectionsIntro": "Il rapporto include queste sezioni principali:", "pdfSections": [ "Sintesi — stato PASSED/FAILED, valutazione chiara del disco — regolare, usurato o guasto — e quattro dati: data del rapporto, ultimo tipo di test, risultato e attributi controllati.", "Informazioni sul disco — modello, serie, capacità, tipo HDD/SSD/NVMe, famiglia, formato, interfaccia (SATA 3.3 · 6.0 Gb/s, …), TRIM, temperatura e soglia ottimale, ore e cicli di accensione, SMART, settori in attesa/riallocati ed errori CRC.", @@ -127,7 +127,7 @@ "historyImageCaption": "Cronologia SMART del disco. Ogni riga mostra tipo, data e ora, anzianità, indicatore dell’ultimo test e azioni di download dell’output smartctl ed eliminazione.", "historyIntro": "Test brevi ed estesi completati e conservati per il disco. Ogni voce contiene l’output originale smartctl e i campi interpretati da Monitor per la dashboard. Azioni per riga:", "historyItems": [ - "Scarica — salva lo snapshot JSON con i dati smartctl -a usati dal rapporto. Utile se il supporto richiede i campi diagnostici originali.", + "Scarica — salva lo snapshot JSON di quel test (output di smartctl -a --json, o nvme smart-log su NVMe quando smartctl fallisce). Utile se il supporto del produttore richiede i campi diagnostici originali.", "Elimina — rimuove manualmente un test dalla cronologia. La conservazione in Pianificazione (ultimi 5 / 10 / 20) elimina automaticamente i più vecchi." ], "scheduleTitle": "Scheda 4 — Pianificazione", diff --git a/web/messages/it/docs/monitor/dashboard/vms-lxcs.json b/web/messages/it/docs/monitor/dashboard/vms-lxcs.json index 5676aba9..4cd27750 100644 --- a/web/messages/it/docs/monitor/dashboard/vms-lxcs.json +++ b/web/messages/it/docs/monitor/dashboard/vms-lxcs.json @@ -1,16 +1,16 @@ { "meta": { "title": "ProxMenux Monitor — Pannello: VM e LXC | Documentazione ProxMenux", - "description": "Inventario dei guest con CPU, memoria e disco in tempo reale. I dettagli includono configurazione, risorse, backup, risultati recenti del log Proxmox, note e Avvia / Spegni / Riavvia / Forza arresto." + "description": "La scheda VM e LXC elenca ogni guest dell’host con utilizzo di CPU, memoria e disco in tempo reale. I dettagli per guest includono configurazione, risorse, backup, log della console dei container OCI, note e i comandi Avvia / Spegni / Riavvia / Forza arresto." }, "header": { "title": "Pannello: VM e LXC", - "description": "Inventario completo dei guest del nodo: quattro metriche in alto, elenco ordinabile di VM e LXC e dettagli per guest con configurazione, risorse, backup, log e comandi Avvia / Spegni / Riavvia / Forza arresto.", + "description": "Inventario completo dei guest del nodo: quattro metriche in alto, elenco ordinabile di ogni VM e LXC sotto e dettagli per guest con configurazione, risorse, backup, log della console dei container OCI e i quattro comandi del ciclo di vita (Avvia / Spegni / Riavvia / Forza arresto).", "section": "ProxMenux Monitor · Dashboard" }, "intro": { "title": "Controlli dei sistemi guest", - "body": "Questa scheda controlla il ciclo di vita dei guest. Le azioni passano da POST /api/vms/<vmid>/control con conferma esplicita e aggiornano la riga del guest. L'arresto forzato richiede il pulsante dedicato Forza arresto." + "body": "Questa scheda controlla il ciclo di vita dei guest. Le azioni del ciclo di vita passano da POST /api/vms/<vmid>/control; Riavvia e Forza arresto chiedono di digitare il VMID per confermare, e la risposta si riflette nella riga del guest. L’arresto forzato richiede il pulsante dedicato Forza arresto." }, "topRow": { "heading": "Riga superiore: quattro schede statistiche", @@ -186,9 +186,9 @@ "source": "Dati RRD PVE (pvesh get /nodes/<node>/qemu/<id>/rrddata) adattati alla visualizzazione in grafico." }, { - "section": "Risultati recenti del log Proxmox", - "endpoint": "/api/vms//logs", - "source": "pvesh get /nodes/<node>/<qemu|lxc>/<vmid>/log --start 0 --limit 1000. Se il comando fallisce restituisce uno elenco vuoto; non fornisce tutti i log interni del guest." + "section": "Log della console OCI (scheda Log)", + "endpoint": "/api/lxc//console-log", + "source": "Output della console del processo principale dell’immagine, letto da /var/log/proxmenux/oci/<vmid>.console.log sull’host. Mostrato solo per i container OCI." }, { "section": "Backup disponibili per gli ospiti", diff --git a/web/messages/it/docs/monitor/health-monitor.json b/web/messages/it/docs/monitor/health-monitor.json index d7e71d7b..c80eaf14 100644 --- a/web/messages/it/docs/monitor/health-monitor.json +++ b/web/messages/it/docs/monitor/health-monitor.json @@ -68,7 +68,7 @@ { "category": "Archiviazione", "checks": "Archivi Proxmox, filesystem radice", - "events": "Soglie di spazio superate sulla radice o su altri filesystem monitorati (85% avviso / 95% critico per impostazione predefinita); esportazione NFS offline; autenticazione CIFS fallita; pool LVM-thin pieno." + "events": "Soglie di spazio superate sulla radice o su altri filesystem monitorati (85% avviso / 95% critico per impostazione predefinita); storage PVE non disponibili; montaggi NFS/CIFS bloccati o inaspettatamente in sola lettura; storage LVM-thin e altri pool che superano le stesse soglie." }, { "category": "Disco e SMART", @@ -98,7 +98,7 @@ { "category": "Aggiornamenti di sistema", "checks": "Aggiornamenti di attesa, aggiornamenti di sicurezza, versione kernel / PVE, età del sistema", - "events": "Aggiornamenti di sicurezza o del kernel in uso in attesa; sistema non aggiornato da molto tempo. Nell’intestazione della panoramica appare Aggiorna ora quando ci sono aggiornamenti. Avvia l’intera procedura ProxMenux; alla chiusura aggiorna lo stato con ?refresh=1 senza attendere il ciclo successivo." + "events": "Aggiornamenti di sicurezza o del kernel in uso in attesa; sistema non aggiornato da molto tempo. La categoria Aggiornamenti della finestra Stato di salute mostra il pulsante Aggiorna ora quando ci sono aggiornamenti in attesa. Avvia l’intera procedura di aggiornamento ProxMenux nella finestra stessa; alla chiusura aggiorna lo stato con ?refresh=1, così l’indicatore riflette il nuovo stato senza attendere il ciclo successivo." }, { "category": "Sicurezza e certificati", @@ -158,7 +158,7 @@ }, "dismiss": { "heading": "Silenziare gli avvisi e scegliere la durata", - "intro": "Alcuni eventi persistono, come Aggiornamenti di sistema: aggiornamenti disponibili finché non aggiorni l’host. Non serve una notifica ogni cinque minuti. Il pulsante Aggiorna ora nella panoramica risolve direttamente questo caso. Per gli altri casi o gli aggiornamenti rimandati sono disponibili due meccanismi collegati per silenziare gli avvisi:", + "intro": "Alcuni eventi persistono per natura, come Aggiornamenti di sistema: aggiornamenti disponibili finché non aggiorni l’host, e una notifica ogni cinque minuti per una settimana non serve. Il pulsante Aggiorna ora nella categoria Aggiornamenti della finestra Stato di salute risolve direttamente questo caso. Per gli altri casi o gli aggiornamenti rimandati il monitor offre anche due meccanismi collegati per silenziare gli avvisi:", "step1": "Silenziare un singolo evento nella finestra. Il menu offre 24 ore, 7 giorni o Permanentemente, indipendentemente dalla categoria. La scelta invia POST /api/health/acknowledge con error_key e suppression_hours (-1 per permanente). L’evento passa tra i silenziati con data acknowledged_at.", "dropdownImageAlt": "Menu per silenziare un avviso: 24 ore, 7 giorni o permanentemente", "dropdownImageCaption": "La durata scelta vale solo per questo avviso; senza scelta individuale si usa il valore della categoria. Gli avvisi silenziati permanentemente hanno un’etichetta ambra Permanente e normalmente non si riattivano. La temperatura critica della CPU è l’eccezione descritta sotto.", @@ -187,7 +187,7 @@ }, { "finding": "ZFS pool DEGRADED / FAULTED", - "why": "I controlli di capacità dei pool ZFS consentono il silenziamento. Gli altri rilevamenti seguono il proprio indicatore. Il riconoscimento non ripara un pool degradato o guasto." + "why": "I rilevamenti sullo stato dei pool ZFS (DEGRADED, FAULTED, UNAVAIL) consentono esplicitamente il silenziamento, così come i controlli di capacità dei pool. Il riconoscimento non ripara un pool degradato o guasto." }, { "finding": "Errori del disco I/O con SMART FAILED", @@ -289,7 +289,7 @@ }, "rest": { "heading": "Endpoint REST", - "intro": "Le azioni della finestra sono disponibili via API per script, dashboard o bot. Con autenticazione del Monitor attiva serve un token Bearer valido, ottenuto con l’accesso o nella schermata dei token API. Le modifiche, come riconoscere avvisi, salvare o pulire errori orfani, richiedono full_admin; read_only riceve 403. Con autenticazione disattivata o rifiutata, questi controlli consentono accesso senza token.", + "intro": "Le azioni della finestra sono disponibili anche via API per script, dashboard personalizzate o bot. Le chiamate richiedono un token Bearer valido, ottenuto con l’accesso o nella schermata dei token API. Le modifiche, come riconoscere avvisi, salvare le impostazioni di soppressione o pulire errori orfani, richiedono l’ambito full_admin; read_only riceve 403.", "headerEndpoint": "Endpoint", "headerMethod": "Metodo", "headerUse": "Uso", @@ -297,7 +297,7 @@ { "endpoint": "/api/health", "method": "GET", - "use": "Controllo leggero che restituisce JSON con status, timestamp e version. Adatto ai controlli per parola chiave Uptime Kuma; con autenticazione del Monitor attiva il client deve inviare un’intestazione Bearer." + "use": "Controllo leggero che restituisce JSON con status, timestamp e version. Adatto ai controlli per parola chiave Uptime Kuma; il client deve inviare un’intestazione Bearer." }, { "endpoint": "/api/health/status", diff --git a/web/messages/it/docs/monitor/index.json b/web/messages/it/docs/monitor/index.json index 43abfbc5..e26ca62a 100644 --- a/web/messages/it/docs/monitor/index.json +++ b/web/messages/it/docs/monitor/index.json @@ -52,7 +52,7 @@ }, { "name": "Terminale", - "description": "Shell host e console VM/CT supportate nel browser tramite xterm.js e WebSocket. Segue l’autenticazione configurata: se disabilitata o rifiutata, i client con accesso di rete possono aprire sessioni senza login. Non implica un audit di ogni comando." + "description": "Shell host e console VM/CT supportate nel browser tramite xterm.js e WebSocket. Le sessioni non sono sottoposte ad audit per singolo comando." }, { "name": "Sicurezza", @@ -114,7 +114,7 @@ "heading": "REST API e integrazioni", "intro": "Gli endpoint REST espongono dati di monitoraggio JSON via HTTP/HTTPS per Homepage, Home Assistant, Uptime Kuma e script. Grafana può usare l’esportatore testuale Prometheus separato su /api/prometheus. Le richieste possono usare curl.", "tokens": "I token API a lunga durata (365 giorni) vengono generati in Impostazioni → Token di accesso API o tramite POST /api/auth/generate-api-token.", - "bearer": "Invia i token con Authorization: Bearer …. L’endpoint pubblico /api/health serve ai controlli di disponibilità senza credenziali. Sotto /api/auth/* ci sono rotte pubbliche di configurazione/login/stato e rotte protette per account e token; non sono tutte anonime.", + "bearer": "Invia i token con Authorization: Bearer …. Anche /api/health richiede l’intestazione Bearer, quindi i controlli di disponibilità necessitano di un token read_only. Sotto /api/auth/* ci sono sia rotte pubbliche di configurazione/login/stato sia rotte protette per account e token; non sono tutte anonime.", "catalog": "Catalogo degli endpoint, rotazione dei token e sicurezza sono nel Riferimento API; esempi per Homepage, Home Assistant, Grafana, Uptime Kuma e cURL sono in Integrazioni." }, "serviceControl": { diff --git a/web/messages/it/docs/monitor/integrations.json b/web/messages/it/docs/monitor/integrations.json index 87ce408f..563e98f9 100644 --- a/web/messages/it/docs/monitor/integrations.json +++ b/web/messages/it/docs/monitor/integrations.json @@ -220,7 +220,7 @@ "heading": "n8n, Zapier e script personalizzati", "intro": "Workflow e script possono inviare notifiche con POST a /api/notifications/send, per esempio dopo un errore CI o un’attività troppo lunga. L’invio diretto salta coda e intervallo tra impronte degli eventi. Mantiene formato per canale, IA facoltativa e consegna. Gestisci gli eventuali duplicati nel chiamante.", "n8nBody": "In n8n usa un nodo HTTP Request con POST, URL sopra e lo stesso JSON di curl. Scegli credenziali generiche Header Auth: nome Authorization e valore Bearer YOUR_API_TOKEN, sostituendo il segnaposto. Collega una pianificazione, webhook o altro nodo per avviare la richiesta.", - "severityBody": "La gravità usa INFO, WARNING o CRITICAL in maiuscolo. L’oggetto data fornisce contesto. L’IA usa titolo e messaggio prodotti con gli arricchimenti supportati; non tutti i campi sono garantiti nel prompt o nell’output. Vedi Notifiche → Catalogo eventi." + "severityBody": "La gravità usa INFO, WARNING o CRITICAL in maiuscolo. L’oggetto data fornisce il contesto dell’evento e i campi del modello. Su questo endpoint la riscrittura IA riceve solo titolo e messaggio; i campi in data non vengono inviati al provider. Vedi Notifiche → Catalogo eventi per il significato degli eventi." }, "pveWebhook": { "heading": "Webhook nativo Proxmox VE (in ingresso)", diff --git a/web/messages/it/docs/monitor/notifications.json b/web/messages/it/docs/monitor/notifications.json index 2db7ab04..7173a53f 100644 --- a/web/messages/it/docs/monitor/notifications.json +++ b/web/messages/it/docs/monitor/notifications.json @@ -171,7 +171,7 @@ "Apri account.microsoft.com/security e attiva la verifica in due passaggi.", "Se disponibile, apri Opzioni di sicurezza avanzate → Password per le app → Crea una nuova password per app. La sua presenza non prova che il servizio accetti SMTP con password.", "Se Microsoft genera una password per app, copiala e verifica che il servizio SMTP la accetti.", - "Solo se è consentito SMTP con password, usa i parametri approvati: Server smtp.office365.com per Exchange Online, Porta 587, Modalità TLS STARTTLS, Nome utente con l’indirizzo email e Password con la credenziale consentita. Outlook.com personale ha requisiti differenti; non presumere che funzioni." + "Solo se il provider consente SMTP con password, inserisci i parametri approvati: Host SMTP smtp.office365.com per Exchange Online, Porta 587, Modalità TLS STARTTLS, Nome utente con l’indirizzo della casella e Password con la credenziale SMTP consentita. Outlook.com personale ha impostazioni e requisiti di autenticazione differenti; non presumere che queste credenziali funzionino." ], "relayTitle": "Relay SMTP gestito da te", "relayBody": "Puoi usare un relay SMTP sotto il tuo controllo, come Postfix, che gestisca l’autenticazione a monte. Imposta credenziali e TLS di Monitor in base al relay: usare un relay locale non disattiva di per sé la cifratura." @@ -266,7 +266,7 @@ "howItems": [ "Attivazione per canale. Disattivato inizialmente. Attivalo solo sui canali dove desideri un riepilogo; gli altri mantengono gli invii immediati.", "Ora di invio nel fuso locale, inizialmente 09:00. Puoi cambiarla; il processo invia entro circa 60 secondi dal minuto impostato.", - "Nel riepilogo: eventi generici idonei di livello INFO, come aggiornamenti applicazioni, aggiornamenti Tailscale, aggiornamenti ottimizzazioni ProxMenux, aggiornamenti di sicurezza APT e avvisi di limite di frequenza. Risultati backup e altre azioni escluse restano immediati.", + "Nel riepilogo: eventi generici idonei di livello INFO. Ad esempio aggiornamenti applicazioni, aggiornamenti Tailscale, aggiornamenti ottimizzazioni ProxMenux e aggiornamenti di sicurezza APT. Risultati backup e altri eventi di azione esclusi restano immediati.", "Che cosa non è mai ritardato:", "Persistenza. Gli eventi restano in SQLite, nella tabella digest_pending, fino all’ora scelta e sopravvivono ai riavvii di Monitor.", "Nessun evento, nessun riepilogo. Non invia messaggi vuoti quando non ci sono eventi INFO da riepilogare." @@ -301,7 +301,7 @@ { "stage": "Intervallo fra invii", "what": "Dopo un invio riuscito, sopprime le ripetizioni e salva lo stato in notification_last_sent. Valori base: 86 400 s per CRITICAL, WARNING, INFO, resources e updates. Eccezioni: 5 s per azioni VM/CT e spegnimento/riavvio host, 10 s per risultati backup/replica, 1 800–3 600 s per varie categorie di integrità. Impostazioni esplicite per evento/gruppo prevalgono.", - "tunable": "Sì: le impostazioni esplicite dell’intervallo per evento o gruppo sostituiscono i valori predefiniti del processo di invio." + "tunable": "Solo tramite l’API delle impostazioni: una chiave cooldown.<event_type> o cooldown.<group> sostituisce i valori predefiniti; nell’interfaccia non c’è alcun controllo." }, { "stage": "Aggregazione eventi ravvicinati", @@ -330,7 +330,7 @@ "Metodo e URL. POST http://127.0.0.1:8008/api/notifications/webhook senza HTTPS Monitor. Con HTTPS usa il listener HTTP locale separato sulla porta 8009. Entrambi restano sullo stesso host.", "Modello del corpo. Usa gli helper Handlebars di PVE. PVE lo salva codificato in base64; il contenuto JSON è:", "Matcher. Un compagno blocco matcher: proxmenux-matcher con mode all così ogni notifica PVE raggiunge l'obiettivo.", - "Configurazione privata. Crea il blocco webhook: proxmenux-webhook in /etc/pve/priv/notifications.cfg con il segreto condiviso in base64. Il destinatario pubblico lo usa per X-Webhook-Secret. Il blocco non è vuoto." + "Configurazione privata. La configurazione scrive il blocco corrispondente webhook: proxmenux-webhook in /etc/pve/priv/notifications.cfg con una voce secret chiamata X-Webhook-Secret, codificata in base64. Il blocco pubblico del destinatario contiene solo modello del corpo, metodo e URL. Il blocco privato non è uno stub vuoto." ], "securityTitle": "Come il ricevitore è protetto", "securityIntro": "Il ricevitore webhook a POST /api/notifications/webhook applica diversi livelli di sicurezza a seconda di dove proviene la richiesta:", diff --git a/web/messages/pt/docs/monitor/access-auth.json b/web/messages/pt/docs/monitor/access-auth.json index 596573f4..371da883 100644 --- a/web/messages/pt/docs/monitor/access-auth.json +++ b/web/messages/pt/docs/monitor/access-auth.json @@ -19,7 +19,7 @@ "reaching": { "heading": "Alcançar o painel", "intro": "ProxMenux Monitor liga-se a 0.0.0.0:8008. Há três maneiras comuns de alcançá-lo:", - "outro": "O acesso direto corresponde à unidade systemd predefinida. O proxy inverso e o Secure Gateway são descritos abaixo. Os IP em X-Forwarded-For exigem PROXMENUX_TRUST_PROXY=1 e um proxy sob o seu controlo. X-Forwarded-Proto ou X-Forwarded-Host não ativam essa confiança por si só; o frontend constrói os URL API a partir da origem do navegador." + "outro": "O acesso direto corresponde à unidade systemd predefinida. O proxy inverso e o Secure Gateway são descritos abaixo. Confiar nos IP de cliente em X-Forwarded-For exige PROXMENUX_TRUST_PROXY=1 e um proxy sob o seu controlo. A simples presença de X-Forwarded-Proto ou X-Forwarded-Host não ativa a confiança no proxy. Nas portas 80/443, o frontend usa URL /api/* relativos; em qualquer outra porta, chama a porta 8008 no mesmo nome de anfitrião." }, "firstLaunch": { "heading": "Procedimento do primeiro arranque", @@ -117,8 +117,8 @@ "loginImageCaption": "Uma vez configurada a autenticação, cada visita ao painel começa aqui. Com o 2FA ativado, a tela pede o código 6 dígitos em um segundo passo após a senha ser aceita.", "loginFlowTitle": "Fluxo de login", "twofaIntro": "Com 2FA ativo, a primeira chamada devolve requires_totp: true. Repita-a com o código de seis dígitos:", - "publicTitle": "Acesso público e verificações protegidas", - "publicIntro": "O início de sessão e o estado da autenticação são públicos. Pode criar a conta enquanto não houver utilizador e palavra-passe guardados, mesmo após recusar a proteção. Os dados do sistema exigem autenticação quando a proteção está ativa:", + "publicTitle": "Endpoints públicos (sem token)", + "publicIntro": "O início de sessão, o estado da autenticação, a configuração inicial e o endpoint leve /api/system-info são públicos:", "publicItems": [ "/api/auth/login e /api/auth/status são públicos. /api/auth/setup cria a primeira conta e recusa substituir credenciais existentes.", "/api/system-info é um endpoint público com informações básicas do sistema, incluindo health.status. Não exige token. /api/auth/status também é público e permite verificar a disponibilidade." @@ -146,7 +146,7 @@ }, { "asset": "Segredo TOTP de 2FA", - "algorithm": "TOTP padrão (RFC 6238), com segredo codificado em base32. Os oito códigos de recuperação são de utilização única e guardados como hashes SHA-256.", + "algorithm": "TOTP padrão (RFC 6238), com segredo codificado em base32. Os oito códigos de backup são de utilização única e guardados como hashes SHA-256.", "where": "auth.json → totp_secret + backup_codes[]" }, { @@ -243,17 +243,17 @@ } ], "backupTitle": "Porque são importantes as cópias de segurança", - "backupBody": "Se perder o dispositivo, use um código de recuperação guardado ou restaure uma cópia configurada previamente. A sincronização na nuvem e as exportações variam por aplicação: verifique se restauram os segredos TOTP. O acesso root ao anfitrião também permite a recuperação descrita abaixo. Guarde uma cópia separada e segura.", + "backupBody": "Se perder o dispositivo autenticador, use um código de backup guardado ou restaure a aplicação a partir de uma cópia configurada previamente. A sincronização na nuvem e as exportações locais variam por aplicação: verifique se o método escolhido restaura de facto os segredos TOTP. O acesso root ao anfitrião também permite a recuperação descrita abaixo. Guarde uma cópia separada e segura.", "setupTitle": "Configuração passo a passo do painel", "setupImageAlt": "Tela de configuração 2FA com código QR e códigos de backup", - "setupImageCaption": "O diálogo 2FA mostra um QR, o segredo Base32 para introdução manual e oito códigos de recuperação de utilização única. Copie-os antes de fechar: não serão apresentados novamente.", + "setupImageCaption": "O diálogo de configuração 2FA mostra um QR, um segredo Base32 para introdução manual e, após a verificação, oito códigos de backup de utilização única. Copie os códigos antes de fechar o diálogo: não serão apresentados novamente.", "setupSteps": [ "Instale o aplicativo autenticador no telefone (ou abra o gerenciador de senhas). Um dos aplicativos da tabela acima. Você só precisa fazer isso uma vez — o mesmo aplicativo irá conter códigos para cada serviço que você protege.", "Fazer login no painel com seu nome de usuário e senha.", - "Abra o separador Segurança e escolha Ativar 2FA. O diálogo mostra QR, segredo Base32 e oito códigos de recuperação.", + "Abra o separador Segurança na barra lateral do painel e clique em Ativar 2FA e em Iniciar configuração. O diálogo mostra o QR e a chave manual; os oito códigos de backup aparecem depois de o código ser verificado.", "Adicione a entrada ao aplicativo autenticador:", - "Guarde os códigos de recuperação. Conserve os oito num gestor de palavras-passe, nota cifrada ou cópia impressa segura. Cada um funciona uma vez se a aplicação estiver indisponível.", - "Confirme com o código atual de seis dígitos da aplicação no campo \"Código de verificação\" e envie. Muda a cada 30 segundos; se expirar durante a escrita, use o seguinte.", + "Confirme com o código atual de seis dígitos da aplicação no campo \"Código de verificação\" do diálogo de configuração e envie. Muda a cada 30 segundos; se expirar durante a escrita, use o seguinte.", + "Guarde os códigos de backup. Depois da verificação, conserve os oito em segurança num gestor de palavras-passe, nota cifrada ou cópia impressa segura. Cada um funciona uma vez se o autenticador estiver indisponível.", "Concluído. 2FA está ativo. O próximo início de sessão pede primeiro a palavra-passe e depois o código atual de seis dígitos." ], "setupStep4Sub": [ @@ -261,17 +261,17 @@ "Alternativa manual, se não puder ler o QR, por exemplo no mesmo telefone: Adicionar conta → Introduzir chave de configuração. Escolha um nome como Proxmox Monitor, cole o segredo Base32, mantenha Tipo em Baseado no tempo e guarde." ], "testTitle": "Teste antes de sair", - "testBody": "Mantenha a sessão atual aberta e teste outro início de sessão numa janela privada imediatamente após configurar. Se o código falhar, verifique os relógios do servidor e do telefone antes de terminar a sessão válida. Se já perdeu o acesso, use um código de recuperação ou edite auth.json na shell do anfitrião.", + "testBody": "Mantenha a sessão atual aberta e teste outro início de sessão numa janela privada imediatamente após configurar. Se o código for rejeitado, verifique os relógios do servidor e do telefone antes de terminar a sessão válida. Se já perdeu o acesso, use um código de backup ou edite auth.json na shell do anfitrião.", "lostTitle": "Autenticador perdido", "lostIntro": "Três métodos de recuperação, do menos ao mais intrusivo:", "lostItems": [ - "Use um código de recuperação. Introduza um dos oito no campo TOTP. Funciona uma vez; os restantes continuam válidos. Depois de entrar, configure novamente 2FA nas definições para obter oito códigos novos.", + "Use um código de backup. Introduza um dos oito códigos guardados no campo TOTP. Funciona uma vez; os códigos não usados continuam válidos. Depois de entrar, abra Segurança, escolha Desativar 2FA e depois Ativar 2FA para obter oito códigos novos.", "Restaure a aplicação da nuvem ou de uma cópia. Com sincronização configurada, instale-a no novo dispositivo e inicie sessão: Google, Microsoft, Authy, Apple Passwords via Porta-chaves iCloud, Ente ou 2FAS. Com um ficheiro exportado por Aegis, Raivo ou FreeOTP+, instale a aplicação e importe o ficheiro.", "Desativar 2FA do shell do host. Quando as opções anteriores não estiverem disponíveis, edite /root/.config/proxmenux-monitor/auth.json no host Proxmox (você precisa de acesso raiz SSH ou console), defina totp_enabled para false, salve e reinicie o serviço:" ], "lostShellOutro": "Você pode fazer login com nome de usuário + senha apenas, em seguida, habilitar de configurações 2FA.", "disableTitle": "Desativar 2FA", - "disableBody": "Abra Segurança e escolha Desativar 2FA. POST /api/auth/totp/disable exige palavra-passe atual e código TOTP ou de recuperação válido. Elimina o segredo TOTP e os códigos. Remova também a entrada antiga da aplicação.", + "disableBody": "Abra Segurança e escolha Desativar 2FA. POST /api/auth/totp/disable exige a palavra-passe atual e um código TOTP ou de backup válido. Elimina o segredo TOTP e os códigos de backup. Remova também a entrada antiga da aplicação autenticadora.", "rejectedTitle": "O código de seis dígitos é sempre rejeitado", "rejectedIntro": "O TOTP depende da hora: os relógios do servidor e do telefone devem diferir menos de cerca de 30 s. Duas verificações:", "rejectedItems": [ diff --git a/web/messages/pt/docs/monitor/ai-assistant.json b/web/messages/pt/docs/monitor/ai-assistant.json index 9882a503..cdbc90eb 100644 --- a/web/messages/pt/docs/monitor/ai-assistant.json +++ b/web/messages/pt/docs/monitor/ai-assistant.json @@ -14,7 +14,7 @@ }, "intro": { "title": "Desligado por omissão, comutador único para activar", - "body": "A reformulação por IA vem desativada. Ative-a em Definições → Notificações → Avançado: melhoria por IA. Se o enriquecimento ou a reformulação falhar, é enviado o modelo original. Cada reformulação tem um limite de espera de 25 segundos; ao atingi-lo, utiliza-se o modelo sem esperar indefinidamente." + "body": "A reformulação por IA vem desativada por predefinição. Ative-a em Definições → Notificações → Avançado: melhoria por IA. Se o enriquecimento ou a reformulação falhar, o processo de envio envia o modelo original. As reformulações na fila de envio de eventos têm um limite de espera de 25 segundos; ao atingi-lo, envia-se o modelo em vez de esperar." }, "howItWorks": { "heading": "Como funciona", @@ -109,7 +109,7 @@ ], "customNote": "O modo de prompt personalizado limita a saída a 500 tokens, independentemente do detalhe. O prompt é controlado por si e o limite evita respostas excessivas.", "sizingTitle": "Tamanho prático", - "sizingBody": "Estime o consumo: eventos reformulados × canais IA × tokens de entrada e saída por chamada. Exemplo: 50 eventos × um canal × (500 de entrada + 300 de saída) = 40.000 tokens por dia. O consumo e custo reais dependem do modelo, contexto, cache e limites do fornecedor. Detalhe por canal explica o uso de brief no chat em vez de standard, mantendo e-mails detalhados." + "sizingBody": "Estime o consumo como eventos reformulados × canais com IA × tokens de entrada e saída por chamada. Por exemplo, 50 eventos × um canal × (2.000 de entrada + 300 de saída) são cerca de 115.000 tokens por dia, já que só o prompt de sistema predefinido tem cerca de 1.500 tokens. O consumo e o custo reais dependem do modelo, contexto, cache e limites do fornecedor. A secção Detalhe por canal explica o uso de brief no chat em vez de standard, mantendo relatórios de e-mail detalhados." }, "providers": { "heading": "Prestadores de IA", @@ -142,7 +142,7 @@ "items": [ "Chave API: console.anthropic.com/settings/keys", "Exemplos da lista de modelos incluída: claude-haiku-4-5-20251001, claude-sonnet-4-6, claude-opus-4-6.", - "Recomendação incluída: claude-haiku-4-5-20251001. Esta versão exata está configurada como recomendada; as antigas entradas Claude 3.5 já não constam da lista incluída." + "Recomendação incluída: claude-haiku-4-5-20251001, um snapshot fixo em vez de um alias variável." ] }, "gemini": { diff --git a/web/messages/pt/docs/monitor/api-reference.json b/web/messages/pt/docs/monitor/api-reference.json index 33b4bed5..91fb3a54 100644 --- a/web/messages/pt/docs/monitor/api-reference.json +++ b/web/messages/pt/docs/monitor/api-reference.json @@ -162,7 +162,7 @@ { "endpoint": "/api/vms//backup", "method": "POST", - "use": "Cria uma cópia vzdump de VM ou LXC. Campos opcionais a adaptar ao armazenamento: storage (destino PVE), mode (snapshot, suspend ou stop), compress (zstd, lzo, gzip ou none), protected (true ou false), notes, notification (auto, always, failure ou never) e pbs_change_detection (default, legacy ou data). Devolve o UPID da tarefa PVE." + "use": "Cria uma cópia vzdump de uma VM ou LXC. Campos do corpo, todos opcionais exceto se as predefinições não corresponderem à organização do armazenamento: storage (um armazenamento PVE), mode (snapshot, suspend ou stop), compress (zstd, lzo, gzip ou none), protected (true ou false), notes e pbs_change_detection (default, legacy ou data). Devolve o UPID da tarefa PVE." }, { "endpoint": "/api/vms//backups", @@ -286,7 +286,7 @@ { "endpoint": "/api/storage/smart//test", "method": "POST", - "use": "Inicia um autoteste SMART. Esquema do corpo: '{'\"type\":\"short\"|\"long\"'}'." + "use": "Inicia um autoteste SMART. Esquema do corpo: '{'\"test_type\":\"short\"|\"long\"'}'." }, { "endpoint": "/api/storage/smart/schedules", diff --git a/web/messages/pt/docs/monitor/architecture.json b/web/messages/pt/docs/monitor/architecture.json index ec6c53ad..20b28ae7 100644 --- a/web/messages/pt/docs/monitor/architecture.json +++ b/web/messages/pt/docs/monitor/architecture.json @@ -73,13 +73,13 @@ "intro": "O AppImage contém um sistema de ficheiros montado ao executar. AppRun na raiz prepara o ambiente e inicia flask_server.py:", "consequencesIntro": "Duas consequências deste layout:", "consequences": [ - "Ambiente Python incluído. O interpretador e os pacotes estão no AppImage, sem instalação no Python do sistema. A aplicação continua a usar interfaces do kernel e ferramentas externas do anfitrião.", + "Pacotes Python incluídos. Os pacotes Python vêm no AppImage e correm no interpretador Python do próprio anfitrião, 3.11 (PVE 8) ou 3.13 (PVE 9), sem instalar nada no Python do sistema do anfitrião. A aplicação continua a usar interfaces do kernel e ferramentas externas do anfitrião.", "Clientes de hardware incluídos. Contém ipmitool, lm-sensors e upsc. As leituras dependem do hardware compatível, acesso aos sensores e, para a UPS, de um servidor NUT configurado." ] }, "flask": { "heading": "Estrutura da aplicação Flask", - "intro": "flask_server.py cria uma instância Flask(__name__) com CORS limitado, regista diretamente nove blueprints e inicia o terminal. A tabela destaca módulos principais; regista também auditoria, cópias VM e PBS. As pré-cargas PVE só funcionam em anfitriões PVE.", + "intro": "flask_server.py cria uma instância Flask(__name__) com origens CORS restritas, regista diretamente dez blueprints e inicia as rotas do terminal. A tabela destaca os módulos principais; também são registados os blueprints de PBS, ligações do Monitor, auditoria e cópias VM. As pré-cargas específicas de PVE só funcionam em anfitriões PVE.", "headerBlueprint": "Blueprint / módulo", "headerPrefix": "Prefixo das rotas", "headerOwns": "Responsabilidade", @@ -242,10 +242,10 @@ "Atualizações: pacotes pendentes e correções de segurança.", "Registos: padrões persistentes, picos e cascatas no journal do sistema.", "Memória: intervenções do OOM killer e pressão RAM prolongada.", - "Temperatura: leituras CPU e discos face aos limites de monitorização; os sensores disponíveis dependem do hardware.", + "CPU: utilização e temperatura da CPU face aos limites configuráveis; os sensores disponíveis dependem do hardware.", "Segurança: falhas de acesso, bloqueios e estado do jail Fail2Ban." ], - "afterIntro": "Os resultados usam error_key, categoria e gravidade estáveis. As linhas de errors recebem last_seen e contagens, sem duplicação. O envio de notificações tem também impressões e intervalos próprios.", + "afterIntro": "Os resultados usam error_key, categoria e gravidade estáveis. Os registos existentes em errors são atualizados no local (last_seen, gravidade, motivo), sem duplicação. O envio de notificações tem também regras próprias de impressões e intervalos.", "cycleEnd": "A limpeza pode resolver erros antigos com a duração de silenciamento por categoria e regras de estado, retirar registos órfãos de recursos removidos e apagar events com mais de 30 dias. As categorias estão em Painel → Health Monitor." }, "notifications": { @@ -264,9 +264,9 @@ "intro": "A aba Terminal liga um cliente leve xterm.js a um PTY do servidor por WebSocket. Existem dois modos:", "items": [ "Modo HTTP, predefinido: o servidor Flask incluído e flask-sock tratam a mudança de protocolo para WebSocket.", - "Modo HTTPS / WSS: usa gevent.pywsgi.WSGIServer com geventwebsocket.handler.WebSocketHandler para WebSocket sobre TLS." + "Modo HTTPS / WSS: o servidor TLS usa gevent.pywsgi.WSGIServer com o seu handler predefinido; flask-sock trata as ligações WebSocket sobre TLS." ], - "outro": "Os processos do terminal herdam User=root. Com autenticação ativa, WebSocket exige um ticket breve de uso único obtido pelo endpoint autenticado com permissões administrativas. Se a autenticação estiver desativada ou recusada, a ligação segue esse modo sem autenticação.", + "outro": "Os processos filhos do terminal herdam User=root do serviço. Abrir um WebSocket exige um ticket breve de uso único obtido pelo endpoint autenticado de tickets do terminal com permissões administrativas.", "proxyNote": "Num proxy inverso, permita WebSocket e os cabeçalhos Upgrade e Connection. O terminal precisa desse encaminhamento." }, "proxy": { diff --git a/web/messages/pt/docs/monitor/dashboard/network.json b/web/messages/pt/docs/monitor/dashboard/network.json index 8a8576c1..5b62bb26 100644 --- a/web/messages/pt/docs/monitor/dashboard/network.json +++ b/web/messages/pt/docs/monitor/dashboard/network.json @@ -162,7 +162,7 @@ } ], "reportTitle": "Relatório de latência da rede (PDF)", - "reportIntro": "Ambos os modos têm um botão Relatório junto ao seletor de destino. Gera um PDF das medições que pode anexar a um pedido de assistência ao fornecedor de Internet.", + "reportIntro": "Ambos os modos têm um botão Relatório junto ao seletor de destino. Abre um relatório imprimível das medições; guarde-o em PDF a partir da janela de impressão do navegador e anexe-o a um pedido de assistência ao fornecedor de Internet.", "reportPreviewAlt": "Primeira página PDF do relatório de latência: resumo executivo, indicador, estatísticas, gráfico e guia dos limites", "reportPreviewCaption": "A primeira página contém resumo executivo, indicador, estatísticas principais, evolução da latência e guia dos limites. A partir da página 2 surgem a tabela de medições e a metodologia.", "downloadLabel": "Transferir relatório de latência de exemplo (PDF)", diff --git a/web/messages/pt/docs/monitor/dashboard/security.json b/web/messages/pt/docs/monitor/dashboard/security.json index 0c10615a..01727fc5 100644 --- a/web/messages/pt/docs/monitor/dashboard/security.json +++ b/web/messages/pt/docs/monitor/dashboard/security.json @@ -136,7 +136,7 @@ "configCaption": "Edição da jail sshd: reduza Max Retries se usar SSH apenas a partir da sua sub-rede, ou aumente Ban Time para um painel exposto à Internet.", "outro": "O guia Instalação, configuração e desinstalação inclui a instalação manual, a alteração de SSH MaxAuthTries e a relação com o registo proxmenux-auth.log. Consulte ProxMenux → Segurança → Fail2Ban.", "calloutTitle": "Sem Fail2Ban, este mecanismo não bloqueia IPs", - "calloutBody": "O ProxMenux Monitor verifica os IP bloqueados pelo Fail2Ban ao nível da aplicação antes de processar pedidos Flask. Consulta fail2ban-client e guarda o resultado em cache durante 30 segundos; não lê uma tabela SQL de bloqueios. Sem Fail2Ban, as tentativas falhadas são registadas em proxmenux-auth.log, mas este mecanismo não bloqueia IPs." + "calloutBody": "O ProxMenux Monitor verifica os IP bloqueados na jail proxmenux do Fail2Ban ao nível da aplicação antes de processar pedidos Flask, guardando o resultado em cache durante 30 segundos. Sem Fail2Ban, as tentativas falhadas são registadas em proxmenux-auth.log e o endpoint de início de sessão fica limitado a 5 tentativas por IP a cada 5 minutos, mas nenhum IP é bloqueado." }, "lynis": { "heading": "Auditoria de segurança Lynis", diff --git a/web/messages/pt/docs/monitor/dashboard/settings.json b/web/messages/pt/docs/monitor/dashboard/settings.json index 79d22117..fbad5728 100644 --- a/web/messages/pt/docs/monitor/dashboard/settings.json +++ b/web/messages/pt/docs/monitor/dashboard/settings.json @@ -76,7 +76,7 @@ }, "thresholds": { "heading": "Limites do Health Monitor", - "intro": "O cartão anterior define o silêncio após dispensar um alerta; este regula o valor que desencadeia um alerta. A maioria das verificações tem valores Aviso e Crítico ajustáveis. A tabela explica exceções como a regra combinada de swap e o detetor atual de RAM.", + "intro": "O cartão anterior define o silêncio após dispensar um alerta; este regula o valor que desencadeia um alerta. A maioria das verificações por limiar tem valores Aviso e Crítico ajustáveis. A tabela abaixo explica exceções como a regra combinada de swap.", "whatForTitle": "Para que serve", "whatForIntro": "Os valores predefinidos são um ponto de partida, mas cada ambiente tem condições próprias:", "whatForItems": [ @@ -85,7 +85,7 @@ "Escolha os limites de temperatura conforme as especificações do disco e as condições reais. A refrigeração passiva ou forçada não determina só por si um limite seguro universalmente inferior ou superior.", "Um anfitrião muito virtualizado pode ter picos de CPU durante compilações sem avisar por cada pico de 80%, mas deve alertar para saturação prolongada." ], - "whatForOutro": "As alterações suportadas aplicam-se na próxima análise. O Health Monitor lê /usr/local/share/proxmenux/health_thresholds.json em cada ciclo sem reinício. Alguns indicadores, como a temperatura dos discos, usam estes valores; certas barras de capacidade têm limites próprios. A linha RAM descreve uma exceção atual.", + "whatForOutro": "As alterações de limiares suportadas aplicam-se na próxima análise. O Health Monitor lê /usr/local/share/proxmenux/health_thresholds.json em cada ciclo sem reinício. Alguns indicadores, incluindo a temperatura dos discos, usam estes valores; certas barras de capacidade mantêm limites visuais próprios.", "coloursTitle": "Cores dos estados Aviso e Crítico", "coloursIntro": "Os widgets que usam Aviso/Crítico seguem os três estados abaixo. Outros indicadores, como as barras de capacidade PVE, têm limites próprios; a cor por si só não indica um alerta Health Monitor.", "headerColour": "Cor", @@ -125,7 +125,7 @@ "section": "Memória", "warning": "85 %", "critical": "95 %", - "gates": "Pressão RAM do anfitrião. A definição mostra Crítico a 95%, mas o detetor atual usa uma regra fixa de 90% sustentados; alterar a definição não muda atualmente esse ramo." + "gates": "Pressão RAM do anfitrião." }, { "section": "Swap (apenas nível crítico)", @@ -185,7 +185,7 @@ "section": "Armazenamento PVE", "warning": "85 %", "critical": "95 %", - "gates": "Armazenamentos geridos por PVE: LVM, LVM-thin, ZFS-pool, RBD/Ceph e PBS. Nem todos são backends de blocos." + "gates": "Apenas armazenamentos PVE do tipo LVM, LVM-thin, ZFS-pool, RBD, CephFS e PBS. Os armazenamentos de diretório, NFS e CIFS são cobertos pela linha de espaço em disco do anfitrião." }, { "section": "Conjunto ZFS", @@ -218,7 +218,7 @@ "toggleTitle": "Opção de notificação ligada à deteção", "toggleBody": "A opção lxc_updates_available por canal em Notificações → Serviços só aparece com a deteção ativa. Desativá-la oculta a linha em todos os canais. A preferência fica na base de dados e recupera o mesmo valor ao reativar.", "purgeTitle": "O que é removido ao desativar a deteção", - "purgeBody": "Desativar remove de imediato as entradas type=lxc de /usr/local/share/proxmenux/managed_installs.json. Os contadores de atualizações LXC em Hardware desaparecem na próxima atualização. Reativar preenche o registo no próximo ciclo, ou antes por atualização manual da API." + "purgeBody": "Desativar remove de imediato todas as entradas type=lxc de /usr/local/share/proxmenux/managed_installs.json. Os contadores de atualizações LXC no separador VMs e LXCs desaparecem na próxima atualização do painel. Reativar preenche o registo no próximo ciclo de deteção, ou antes por atualização manual da API." }, "storageExclusions": { "heading": "Exclusões de armazenamento remoto", diff --git a/web/messages/pt/docs/monitor/dashboard/storage.json b/web/messages/pt/docs/monitor/dashboard/storage.json index 5dae7a5d..9da13a25 100644 --- a/web/messages/pt/docs/monitor/dashboard/storage.json +++ b/web/messages/pt/docs/monitor/dashboard/storage.json @@ -70,7 +70,7 @@ "items": [ "Caminho do dispositivo — /dev/sda, /dev/nvme0n1.", "Etiqueta de tipo — SATA / NVMe e respetivo ícone.", - "Etiqueta de sistema — marca laranja dos discos identificados como discos do sistema operativo. A deteção usa as montagens / e /boot e atribui System. A ausência da etiqueta não prova que o disco possa ser apagado ou reutilizado sem risco.", + "Etiqueta de sistema — marca laranja dos discos usados pelo anfitrião: pontos de montagem do sistema (/, /boot, /usr, /var…), swap ativo, membros de pools ZFS, volumes físicos LVM, membros RAID ativos ou etiquetas de partições do sistema. A ausência da etiqueta não prova que o disco possa ser apagado ou reutilizado sem risco.", "Modelo — fabricante e modelo de smartctl -i.", "Capacidade — expressa em unidades legíveis.", "Temperatura — valor atual em °C, com cor conforme o tipo de disco; NVMe usa limites mais altos que SATA.", @@ -112,7 +112,7 @@ "pdfPreviewAlt": "Primeira página do relatório SMART com resumo executivo, indicador PASSED e informações do disco", "pdfPreviewCaption": "Primeira página: resumo, indicador PASSED e informações completas do disco. O PDF de exemplo inclui desgaste SSD, todos os atributos SMART e histórico de testes.", "pdfDownloadLabel": "Transferir relatório SMART de exemplo (PDF)", - "pdfSectionsIntro": "O relatório tem seis secções principais:", + "pdfSectionsIntro": "O relatório inclui estas secções principais:", "pdfSections": [ "Resumo executivo — estado PASSED/FAILED, avaliação clara do disco — saudável, com desgaste ou a falhar — e quatro dados: data do relatório, último tipo de teste, resultado e atributos verificados.", "Informações do disco — modelo, série, capacidade, tipo HDD/SSD/NVMe, família, formato, interface (SATA 3.3 · 6.0 Gb/s, …), TRIM, temperatura e limite ideal, horas e ciclos de funcionamento, SMART, setores pendentes/realocados e erros CRC.", @@ -127,7 +127,7 @@ "historyImageCaption": "Histórico SMART do disco. Cada linha mostra tipo, data e hora, antiguidade, marca do último teste e ações de transferência da saída smartctl e eliminação.", "historyIntro": "Testes curtos e alargados concluídos e guardados para o disco. Cada entrada contém a saída original smartctl e os campos interpretados pelo Monitor para o painel. Ações por linha:", "historyItems": [ - "Transferir — guarda a cópia JSON com os dados smartctl -a usados pelo relatório. Útil se o suporte pedir os campos de diagnóstico originais.", + "Transferir — guarda a cópia JSON desse teste (saída de smartctl -a --json, ou nvme smart-log em NVMe quando o smartctl falha). Útil se o suporte do fabricante pedir os campos de diagnóstico originais.", "Eliminar — remove manualmente um teste do histórico. A retenção em Agendamento (últimos 5 / 10 / 20) elimina automaticamente os mais antigos." ], "scheduleTitle": "Separador 4 — Agendamento", diff --git a/web/messages/pt/docs/monitor/dashboard/vms-lxcs.json b/web/messages/pt/docs/monitor/dashboard/vms-lxcs.json index 9adcc28e..5931276b 100644 --- a/web/messages/pt/docs/monitor/dashboard/vms-lxcs.json +++ b/web/messages/pt/docs/monitor/dashboard/vms-lxcs.json @@ -1,16 +1,16 @@ { "meta": { "title": "ProxMenux Monitor — Painel: VM e LXC | Documentação ProxMenux", - "description": "Inventário dos sistemas convidados com CPU, memória e disco em direto. Os detalhes mostram configuração, recursos, cópias de segurança, resultados recentes do registo Proxmox, notas e Iniciar / Desligar / Reiniciar / Forçar paragem." + "description": "O separador VMs e LXCs inventaria todos os sistemas convidados do anfitrião com utilização de CPU, memória e disco em direto. Os detalhes de cada um mostram configuração, recursos, cópias de segurança, o registo de consola dos contentores OCI, notas e Iniciar / Desligar / Reiniciar / Forçar paragem." }, "header": { "title": "Painel: VM e LXC", - "description": "Inventário completo dos sistemas convidados: quatro métricas no topo, lista ordenável de VM e LXC e detalhes com configuração, recursos, cópias de segurança, registos e controlos Iniciar / Desligar / Reiniciar / Forçar paragem.", + "description": "Inventário completo dos sistemas convidados do nó: quatro métricas no topo, lista ordenável de cada VM e LXC por baixo e detalhes com configuração, recursos, cópias de segurança, o registo de consola dos contentores OCI e os quatro controlos de ciclo de vida (Iniciar / Desligar / Reiniciar / Forçar paragem).", "section": "ProxMenux Monitor · Painel" }, "intro": { "title": "Controlos dos sistemas convidados", - "body": "Este separador controla o ciclo de vida dos sistemas convidados. As ações passam por POST /api/vms/<vmid>/control com confirmação explícita e atualizam a linha do sistema. O desligamento forçado exige o botão específico Forçar paragem." + "body": "Este separador controla o ciclo de vida dos sistemas convidados. As ações de ciclo de vida passam por POST /api/vms/<vmid>/control; Reiniciar e Forçar paragem pedem que escreva o VMID para confirmar, e a resposta reflete-se na linha do sistema. O desligamento forçado exige o botão específico Forçar paragem." }, "topRow": { "heading": "Linha superior: quatro cartas estatísticas", @@ -186,9 +186,9 @@ "source": "Dados PVE RRD (pvesh get /nodes/<node>/qemu/<id>/rrddata) condensados a uma forma amigável a gráficos." }, { - "section": "Resultados recentes do registo Proxmox", - "endpoint": "/api/vms//logs", - "source": "pvesh get /nodes/<node>/<qemu|lxc>/<vmid>/log --start 0 --limit 1000. Uma falha devolve uma lista vazia; não fornece todos os registos internos do sistema convidado." + "section": "Registo de consola OCI (separador Logs)", + "endpoint": "/api/lxc//console-log", + "source": "Saída de consola do processo principal da imagem, lida de /var/log/proxmenux/oci/<vmid>.console.log no anfitrião. Mostrado apenas para contentores OCI." }, { "section": "Backups disponíveis para hóspedes", diff --git a/web/messages/pt/docs/monitor/health-monitor.json b/web/messages/pt/docs/monitor/health-monitor.json index 50e331f3..7b24f9d7 100644 --- a/web/messages/pt/docs/monitor/health-monitor.json +++ b/web/messages/pt/docs/monitor/health-monitor.json @@ -68,7 +68,7 @@ { "category": "Armazenamento", "checks": "Armazenamento do Proxmox, sistema de arquivos raiz", - "events": "Limiares de ocupação ultrapassados na raiz ou noutros sistemas de ficheiros monitorizados (85% aviso / 95% crítico por predefinição); exportação NFS indisponível; falha de autenticação CIFS; pool LVM-thin cheio." + "events": "Limiares de ocupação ultrapassados na raiz ou noutros sistemas de ficheiros monitorizados (85% aviso / 95% crítico por predefinição); armazenamentos PVE indisponíveis; montagens NFS/CIFS bloqueadas ou inesperadamente só de leitura; armazenamentos LVM-thin e outros pools que ultrapassam os mesmos limiares." }, { "category": "Discos e SMART", @@ -98,7 +98,7 @@ { "category": "Atualizações do sistema", "checks": "Atualizações pendentes, atualizações de segurança, kernel / versão PVE, idade do sistema", - "events": "Atualizações de segurança ou do kernel em uso pendentes; sistema sem atualizar há muito tempo. O cabeçalho da vista geral apresenta Atualizar agora quando há atualizações. O botão executa todo o processo ProxMenux; ao fechar, atualiza o estado com ?refresh=1 sem esperar pelo ciclo seguinte." + "events": "Atualizações de segurança ou do kernel em uso pendentes; sistema sem atualizar há muito tempo. A categoria Atualizações da janela Estado de saúde apresenta o botão Atualizar agora quando há atualizações pendentes. Executa todo o processo de atualização ProxMenux na própria janela; ao fechar, atualiza o estado com ?refresh=1 para que o indicador mostre o novo estado sem esperar pelo ciclo seguinte." }, { "category": "Segurança e Certificados", @@ -158,7 +158,7 @@ }, "dismiss": { "heading": "Silenciar alertas e definir a duração da supressão", - "intro": "Alguns eventos persistem, como Atualizações do sistema: atualizações disponíveis até atualizar o anfitrião. Uma notificação a cada cinco minutos seria desnecessária. O botão Atualizar agora na vista geral resolve diretamente esse caso. Para os restantes casos ou atualizações adiadas, há dois mecanismos ligados de silenciamento:", + "intro": "Alguns eventos persistem por natureza, como Atualizações do sistema: atualizações disponíveis até atualizar o anfitrião, e uma notificação a cada cinco minutos durante uma semana seria desnecessária. O botão Atualizar agora na categoria Atualizações da janela Estado de saúde resolve diretamente esse caso. Para os restantes casos ou atualizações adiadas, a monitorização oferece também dois mecanismos ligados de silenciamento:", "step1": "Silenciar um evento na janela. O menu oferece 24 horas, 7 dias ou Permanentemente, independentemente da categoria. A escolha envia POST /api/health/acknowledge com error_key e suppression_hours (-1 para permanente). O evento passa aos suprimidos com a data acknowledged_at.", "dropdownImageAlt": "Menu para silenciar um alerta: 24 horas, 7 dias ou permanentemente", "dropdownImageCaption": "A duração escolhida aplica-se só a este alerta; sem escolha individual, usa-se o valor da categoria. Os alertas silenciados permanentemente têm uma etiqueta âmbar Permanente e normalmente não reaparecem. A temperatura crítica da CPU é a exceção descrita abaixo.", @@ -187,7 +187,7 @@ }, { "finding": "ZFS pool DEGRADED / FAULTED", - "why": "As verificações de capacidade dos pools ZFS permitem a supressão. As restantes ocorrências seguem o seu próprio indicador. Reconhecer não repara um pool degradado ou avariado." + "why": "As ocorrências de estado dos pools ZFS (DEGRADED, FAULTED, UNAVAIL) permitem explicitamente a supressão, tal como as verificações de capacidade dos pools. Reconhecer não repara um pool degradado ou avariado." }, { "finding": "Erros de E/S de disco com SMART FAILED", @@ -289,7 +289,7 @@ }, "rest": { "heading": "Endpoints REST", - "intro": "As ações da janela estão disponíveis pela API para scripts, painéis ou bots. Com a autenticação do Monitor ativa, é necessário um token Bearer válido, obtido no início de sessão ou no ecrã de tokens API. As alterações, como reconhecer alertas, guardar ou limpar erros órfãos, exigem full_admin; read_only recebe 403. Com autenticação desativada ou recusada, estes controlos permitem acesso sem token.", + "intro": "As ações da janela também estão disponíveis pela API para scripts, painéis personalizados ou bots. As chamadas exigem um token Bearer válido, obtido no início de sessão ou no ecrã de tokens API. As alterações, como reconhecer alertas, guardar definições de supressão ou limpar erros órfãos, exigem o âmbito full_admin; read_only recebe 403.", "headerEndpoint": "Endpoint", "headerMethod": "Método", "headerUse": "Utilização", @@ -297,7 +297,7 @@ { "endpoint": "/api/health", "method": "GET", - "use": "Verificação leve que devolve JSON com status, timestamp e version. Serve para verificações de palavras-chave Uptime Kuma; com autenticação do Monitor ativa, o cliente tem de enviar um cabeçalho Bearer." + "use": "Verificação leve que devolve JSON com status, timestamp e version. Serve para verificações de palavras-chave Uptime Kuma; o cliente tem de enviar um cabeçalho Bearer." }, { "endpoint": "/api/health/status", diff --git a/web/messages/pt/docs/monitor/index.json b/web/messages/pt/docs/monitor/index.json index 6c47b736..2d6eef39 100644 --- a/web/messages/pt/docs/monitor/index.json +++ b/web/messages/pt/docs/monitor/index.json @@ -52,7 +52,7 @@ }, { "name": "Terminal", - "description": "Shell do host e consolas VM/CT suportadas no navegador via xterm.js e WebSockets. Segue a autenticação configurada: desativada ou recusada, permite sessões sem início de sessão a clientes com acesso de rede. Não implica auditoria de cada comando." + "description": "Shell do host e consolas VM/CT suportadas no navegador via xterm.js e WebSockets. As sessões não são auditadas por comando." }, { "name": "Segurança", @@ -114,7 +114,7 @@ "heading": "REST API e integrações", "intro": "Os endpoints REST expõem dados de monitorização JSON por HTTP/HTTPS para Homepage, Home Assistant, Uptime Kuma e scripts. Grafana pode usar o exportador de texto Prometheus separado em /api/prometheus. As chamadas podem usar curl.", "tokens": "Tokens API de longa duração (365 dias) são gerados em Configurações → API Tokens de acesso ou via POST /api/auth/generate-api-token.", - "bearer": "Envie tokens com Authorization: Bearer …. O endpoint público /api/health serve a testes de disponibilidade sem credenciais. Em /api/auth/* existem rotas públicas de configuração/início/estado e rotas protegidas de contas e tokens; nem todas são anónimas.", + "bearer": "Envie tokens com Authorization: Bearer …. /api/health também espera o cabeçalho Bearer, pelo que os testes de disponibilidade precisam de um token read_only. Em /api/auth/* existem tanto rotas públicas de configuração/início/estado como rotas protegidas de contas e tokens; nem todas são anónimas.", "catalog": "O catálogo de endpoints, rotação de tokens e segurança estão na Referência da API; exemplos para Homepage, Home Assistant, Grafana, Uptime Kuma e cURL estão em Integrações." }, "serviceControl": { diff --git a/web/messages/pt/docs/monitor/integrations.json b/web/messages/pt/docs/monitor/integrations.json index 90bb0b37..a1c33729 100644 --- a/web/messages/pt/docs/monitor/integrations.json +++ b/web/messages/pt/docs/monitor/integrations.json @@ -220,7 +220,7 @@ "heading": "n8n, Zapier e scripts personalizados", "intro": "Workflows e scripts podem enviar notificações por POST para /api/notifications/send, por exemplo após falha CI ou tarefa demasiado longa. O envio direto ignora a fila e o intervalo entre impressões digitais dos eventos. Mantém a formatação, IA opcional e entrega por canal. Controle os duplicados na origem.", "n8nBody": "No n8n use um nó HTTP Request com POST, o URL acima e o mesmo JSON do curl. Escolha credenciais genéricas Header Auth: nome Authorization e valor Bearer YOUR_API_TOKEN, substituindo o marcador. Ligue um agendamento, webhook ou outro nó para iniciar o pedido.", - "severityBody": "A gravidade usa INFO, WARNING ou CRITICAL em maiúsculas. O objeto data fornece contexto. A IA usa título e mensagem gerados e os enriquecimentos suportados; nem todos os campos entram necessariamente no prompt ou resultado. Veja Notificações → Catálogo de eventos." + "severityBody": "A gravidade usa INFO, WARNING ou CRITICAL em maiúsculas. O objeto data fornece o contexto do evento e os campos do modelo. Neste endpoint, a reformulação por IA recebe apenas o título e a mensagem; os campos de data não são enviados ao fornecedor. Veja Notificações → Catálogo de eventos para o significado dos eventos." }, "pveWebhook": { "heading": "Webhook nativo Proxmox VE (entrada)", diff --git a/web/messages/pt/docs/monitor/notifications.json b/web/messages/pt/docs/monitor/notifications.json index 7ebaf342..4296dc37 100644 --- a/web/messages/pt/docs/monitor/notifications.json +++ b/web/messages/pt/docs/monitor/notifications.json @@ -171,7 +171,7 @@ "Abra o account.microsoft.com/security e habilite a verificação em duas etapas.", "Se disponível, abra Opções de segurança avançadas → Palavras-passe de aplicações → Criar nova palavra-passe de aplicação. A sua existência não prova que o serviço aceite SMTP por palavra-passe.", "Se Microsoft gerar uma palavra-passe de aplicação, copie-a e verifique se o serviço SMTP a aceita.", - "Só se SMTP por palavra-passe for permitido, use os parâmetros aprovados: Servidor smtp.office365.com para Exchange Online, Porta 587, Modo TLS STARTTLS, Utilizador com o endereço email e Palavra-passe com a credencial permitida. Outlook.com pessoal tem requisitos diferentes; não presuma que funcione." + "Só se o seu fornecedor permitir SMTP por palavra-passe, preencha os parâmetros aprovados: Host SMTP smtp.office365.com para Exchange Online, Porta 587, Modo TLS STARTTLS, Utilizador com o endereço da caixa de correio e Palavra-passe com a credencial SMTP permitida. O Outlook.com pessoal tem definições e requisitos de autenticação diferentes; não presuma que estas credenciais funcionem." ], "relayTitle": "Relay SMTP gerido por si", "relayBody": "Pode usar um relay SMTP sob o seu controlo, como Postfix, que trate da autenticação a montante. Configure credenciais e TLS do Monitor conforme o relay: usar um relay local não desativa por si só a encriptação." @@ -266,7 +266,7 @@ "howItems": [ "Ativação por canal. Desativado por predefinição. Ative só nos canais onde pretende um resumo; os restantes mantêm envios imediatos.", "Hora de envio no fuso local, inicialmente 09:00. Pode alterá-la; o processo envia até cerca de 60 segundos após o minuto definido.", - "No resumo: eventos genéricos elegíveis de nível INFO, como atualizações de aplicações, atualizações Tailscale, atualizações de otimizações ProxMenux, atualizações de segurança APT e avisos de limite de frequência. Resultados de cópias e outras ações excluídas continuam imediatos.", + "No resumo: eventos genéricos elegíveis de nível INFO. Por exemplo, atualizações de aplicações, atualizações Tailscale, atualizações de otimizações ProxMenux e atualizações de segurança APT. Resultados de cópias e outros eventos de ações excluídas continuam imediatos.", "O que nunca é atrasado:", "Persistência. Os eventos permanecem em SQLite, na tabela digest_pending, até à hora escolhida e sobrevivem aos reinícios do Monitor.", "Sem eventos, sem resumo. Não envia mensagens vazias quando não existem eventos INFO a resumir." @@ -301,7 +301,7 @@ { "stage": "Intervalo entre envios", "what": "Após envio bem-sucedido suprime repetições e guarda o estado em notification_last_sent. Valores base: 86 400 s para CRITICAL, WARNING, INFO, resources e updates. Exceções: 5 s para ações VM/CT e encerramento/reinício do anfitrião, 10 s para resultados de cópias/replicação, 1 800–3 600 s para várias categorias de saúde. Definições explícitas por evento/grupo prevalecem.", - "tunable": "Sim: definições explícitas do intervalo por evento ou grupo substituem os valores predefinidos do processo de envio." + "tunable": "Apenas através da API de definições: uma chave cooldown.<event_type> ou cooldown.<group> substitui os valores predefinidos; não existe nenhum controlo na interface." }, { "stage": "Agregação de eventos próximos", @@ -330,7 +330,7 @@ "Método e URL. POST http://127.0.0.1:8008/api/notifications/webhook sem HTTPS do Monitor. Com HTTPS usa o listener HTTP local separado na porta 8009. Ambos permanecem no mesmo anfitrião.", "Modelo do corpo. Usa os auxiliares Handlebars do PVE. O PVE guarda-o codificado em base64; o conteúdo JSON é:", "Matcher. Um bloco matcher: proxmenux-matcher companheiro com mode all para que cada notificação PVE atinja o alvo.", - "Configuração privada. Cria o bloco webhook: proxmenux-webhook em /etc/pve/priv/notifications.cfg com o segredo partilhado em base64. O destino público usa-o para X-Webhook-Secret. O bloco não está vazio." + "Configuração privada. A configuração escreve o bloco correspondente webhook: proxmenux-webhook em /etc/pve/priv/notifications.cfg com uma entrada secret chamada X-Webhook-Secret, codificada em base64. O bloco público do destino contém apenas o modelo do corpo, o método e o URL. O bloco privado não é um esboço vazio." ], "securityTitle": "Como o receptor está seguro", "securityIntro": "O receptor webhook em POST /api/notifications/webhook aplica diferentes camadas de segurança, dependendo de onde o pedido vem:", diff --git a/web/messages/sk/docs/monitor/access-auth.json b/web/messages/sk/docs/monitor/access-auth.json index 445c9b87..7f2adb94 100644 --- a/web/messages/sk/docs/monitor/access-auth.json +++ b/web/messages/sk/docs/monitor/access-auth.json @@ -19,7 +19,7 @@ "reaching": { "heading": "Prístup k panelu", "intro": "ProxMenux Monitor sa viaže na 0.0.0.0:8008. Existujú tri bežné spôsoby, ako ju dosiahnuť:", - "outro": "Priamy prístup zodpovedá predvolenej jednotke systemd. Reverzný proxy a Secure Gateway sú opísané nižšie. IP z X-Forwarded-For vyžadujú PROXMENUX_TRUST_PROXY=1 a proxy pod vašou kontrolou. Samotné X-Forwarded-Proto alebo X-Forwarded-Host túto dôveru nezapnú; frontend zostavuje URL API z pôvodu prehliadača." + "outro": "Priamy prístup zodpovedá predvolenej jednotke systemd. Reverzný proxy a Secure Gateway sú opísané nižšie. Dôvera v IP klientov z X-Forwarded-For vyžaduje PROXMENUX_TRUST_PROXY=1 a proxy pod vašou kontrolou. Samotná prítomnosť X-Forwarded-Proto alebo X-Forwarded-Host dôveru v proxy nezapne. Na portoch 80/443 frontend používa relatívne URL /api/*; na akomkoľvek inom porte volá port 8008 na rovnakom názve hostiteľa." }, "firstLaunch": { "heading": "Postup pri prvom spustení", @@ -117,8 +117,8 @@ "loginImageCaption": "Po nastavení overenia sa tu začína prihlásenie. Pri zapnutom 2FA sa po prijatí hesla vyžiada šesťmiestny kód.", "loginFlowTitle": "Prihlasovací tok", "twofaIntro": "Pri 2FA prvé volanie vráti requires_totp: true. Zopakujte ho so šesťmiestnym kódom:", - "publicTitle": "Verejný prístup a chránené kontroly", - "publicIntro": "Prihlásenie a stav overenia sú verejné. Účet možno vytvoriť, kým nie sú uložené meno a heslo, aj po odmietnutí ochrany. Pri zapnutej ochrane vyžadujú systémové údaje overenie:", + "publicTitle": "Verejné koncové body (bez tokenu)", + "publicIntro": "Prihlásenie, stav overenia, počiatočné nastavenie a ľahký koncový bod /api/system-info sú verejné:", "publicItems": [ "/api/auth/login a /api/auth/status sú verejné. /api/auth/setup vytvorí prvý účet a odmietne prepísať existujúce prihlasovacie údaje.", "/api/system-info je verejný endpoint so základnými údajmi systému vrátane health.status. Nevyžaduje token. Aj /api/auth/status je verejný a hodí sa na kontrolu dostupnosti." @@ -146,7 +146,7 @@ }, { "asset": "Tajný kľúč TOTP pre 2FA", - "algorithm": "Štandardný TOTP (RFC 6238) s tajným kľúčom v base32. Osem jednorazových obnovovacích kódov sa ukladá ako hashe SHA-256.", + "algorithm": "Štandardný TOTP (RFC 6238) s tajným kľúčom v base32. Osem jednorazových záložných kódov sa ukladá ako hashe SHA-256.", "where": "auth.json → totp_secret + backup_codes[]" }, { @@ -243,17 +243,17 @@ } ], "backupTitle": "Prečo sú zálohy dôležité", - "backupBody": "Pri strate zariadenia použite uložený obnovovací kód alebo obnovte vopred nastavenú zálohu. Cloudová synchronizácia a exporty sa líšia podľa aplikácie; overte, že obnovia aj tajné kľúče TOTP. Prístup root na hostiteľovi umožňuje aj obnovu opísanú nižšie. Uchovajte samostatnú bezpečnú zálohu.", + "backupBody": "Pri strate overovacieho zariadenia použite uložený záložný kód alebo obnovte aplikáciu z vopred nastavenej zálohy. Cloudová synchronizácia a lokálne exporty sa líšia podľa aplikácie; overte, že zvolený spôsob naozaj obnoví tajné kľúče TOTP. Prístup root na hostiteľovi umožňuje aj obnovu opísanú nižšie. Uchovajte samostatnú bezpečnú zálohu.", "setupTitle": "Nastavenie krok za krokom z panelu", "setupImageAlt": "Nastavovacia obrazovka 2FA s QR kódom a záložnými kódmi", - "setupImageCaption": "Dialóg 2FA zobrazuje QR, tajný kľúč Base32 na ručné zadanie a osem jednorazových obnovovacích kódov. Pred zatvorením ich skopírujte; už sa nezobrazia.", + "setupImageCaption": "Dialóg nastavenia 2FA zobrazuje QR, tajný kľúč Base32 na ručné zadanie a po overení osem jednorazových záložných kódov. Kódy skopírujte pred zatvorením dialógu; už sa nezobrazia.", "setupSteps": [ "Nainštalujte autentifikačnú aplikáciu do telefónu alebo otvorte správcu hesiel. Stačí raz; rovnaká aplikácia môže uchovávať kódy pre všetky chránené služby.", "Prihláste sa do panelu menom a heslom.", - "Otvorte kartu Zabezpečenie a vyberte Zapnúť 2FA. Dialóg zobrazí QR, tajný kľúč Base32 a osem obnovovacích kódov.", + "Otvorte kartu Zabezpečenie v bočnom paneli dashboardu a kliknite na Zapnúť 2FA a Spustiť nastavenie. Dialóg zobrazí QR a ručný kľúč; osem záložných kódov sa zobrazí po overení kódu.", "Pridajte položku do autentifikačnej aplikácie:", - "Uložte obnovovacie kódy. Všetkých osem bezpečne uložte do správcu hesiel, šifrovanej poznámky alebo na papier. Každý funguje raz, keď aplikácia nie je dostupná.", - "Potvrďte aktuálnym šesťmiestnym kódom z aplikácie v poli \"Overovací kód\" a odošlite. Mení sa každých 30 sekúnd; ak počas písania vyprší, použite ďalší.", + "Potvrďte aktuálnym šesťmiestnym kódom z aplikácie v poli \"Overovací kód\" dialógu nastavenia a odošlite. Mení sa každých 30 sekúnd; ak počas písania vyprší, použite ďalší.", + "Uložte záložné kódy. Po overení všetkých osem bezpečne uložte do správcu hesiel, šifrovanej poznámky alebo na zabezpečenú tlačenú kópiu. Každý funguje raz, keď overovacia aplikácia nie je dostupná.", "Hotovo. 2FA je aktívne. Ďalšie prihlásenie vyžiada najprv heslo a potom aktuálny šesťmiestny kód." ], "setupStep4Sub": [ @@ -261,17 +261,17 @@ "Ručná alternatíva, ak nemožno skenovať, napríklad na rovnakom telefóne: Pridať účet → Zadať nastavovací kľúč. Zvoľte názov ako Proxmox Monitor, vložte tajný kľúč Base32, nechajte Typ nastavený na Časový a uložte." ], "testTitle": "Test pred odhlásením", - "testBody": "Aktuálnu reláciu nechajte otvorenú a hneď po nastavení otestujte nové prihlásenie v súkromnom okne. Ak kód nefunguje, pred odhlásením skontrolujte hodiny servera a telefónu. Ak je prístup už stratený, použite obnovovací kód alebo upravte auth.json zo shellu hostiteľa.", + "testBody": "Aktuálnu reláciu nechajte otvorenú a hneď po nastavení otestujte nové prihlásenie v súkromnom okne. Ak je kód odmietnutý, pred odhlásením z funkčnej relácie skontrolujte hodiny servera a telefónu. Ak je prístup už stratený, použite záložný kód alebo upravte auth.json zo shellu hostiteľa.", "lostTitle": "Stratený autentifikátor", "lostIntro": "Tri spôsoby obnovy, od najmenšieho po najväčší zásah:", "lostItems": [ - "Použite obnovovací kód. Jeden z ôsmich zadajte do poľa TOTP. Funguje raz; nepoužité kódy zostanú platné. Po prihlásení nastavte 2FA znova v nastaveniach a získajte osem nových kódov.", + "Použite záložný kód. Jeden z ôsmich uložených kódov zadajte do poľa TOTP. Funguje raz; nepoužité kódy zostanú platné. Po prihlásení otvorte Zabezpečenie, vyberte Vypnúť 2FA a potom Zapnúť 2FA a získajte osem nových kódov.", "Obnovte aplikáciu z cloudu alebo zálohy. Pri nastavenej synchronizácii ju nainštalujte na nové zariadenie a prihláste sa: Google, Microsoft, Authy, Apple Passwords cez iCloud Kľúčenku, Ente alebo 2FAS. Pri exporte z Aegis, Raivo alebo FreeOTP+ nainštalujte aplikáciu a importujte súbor.", "Vypnite 2FA zo shellu hostiteľa. Ak iné možnosti nie sú dostupné, upravte /root/.config/proxmenux-monitor/auth.json ako root cez SSH alebo konzolu. Nastavte totp_enabled na false, uložte a reštartujte službu:" ], "lostShellOutro": "Môžete sa prihlásiť iba s užívateľským menom + heslom a potom znovu zapnúť 2FA z Nastavenia.", "disableTitle": "Vypnúť 2FA", - "disableBody": "Otvorte Zabezpečenie a vyberte Vypnúť 2FA. POST /api/auth/totp/disable vyžaduje aktuálne heslo a platný TOTP alebo obnovovací kód. Odstráni tajný kľúč aj obnovovacie kódy. Starú položku odstráňte aj z aplikácie.", + "disableBody": "Otvorte Zabezpečenie a vyberte Vypnúť 2FA. POST /api/auth/totp/disable vyžaduje aktuálne heslo a platný TOTP alebo záložný kód. Odstráni tajný kľúč TOTP aj záložné kódy. Starú položku odstráňte aj z overovacej aplikácie.", "rejectedTitle": "Šesťmiestny kód je vždy odmietnutý", "rejectedIntro": "TOTP závisí od času. Rozdiel hodín servera a telefónu má byť najviac približne 30 s. Dve kontroly:", "rejectedItems": [ diff --git a/web/messages/sk/docs/monitor/ai-assistant.json b/web/messages/sk/docs/monitor/ai-assistant.json index 3d8ad079..0e5ac9b4 100644 --- a/web/messages/sk/docs/monitor/ai-assistant.json +++ b/web/messages/sk/docs/monitor/ai-assistant.json @@ -14,7 +14,7 @@ }, "intro": { "title": "Predvolene vypnuté, zapnutie jedným prepínačom", - "body": "Prepis AI je predvolene vypnutý. Zapnite ho v Nastavenia → Oznámenia → Pokročilé: vylepšenie AI. Pri chybe doplnenia kontextu alebo prepisu sa odošle pôvodná šablóna. Každý prepis má časový limit 25 sekúnd; po jeho uplynutí sa použije šablóna bez neobmedzeného čakania." + "body": "Prepis AI je predvolene vypnutý. Zapnite ho v Nastavenia → Oznámenia → Pokročilé: vylepšenie AI. Pri chybe doplnenia kontextu alebo prepisu odosielač pošle pôvodnú šablónu. Prepisy vo fronte odosielania udalostí majú časový limit 25 sekúnd; po jeho dosiahnutí sa namiesto čakania odošle šablóna." }, "howItWorks": { "heading": "Ako to funguje", @@ -109,7 +109,7 @@ ], "customNote": "Režim vlastného promptu má pevný limit 500 výstupných tokenov bez ohľadu na úroveň detailov. Prompt ovládate vy a limit bráni neprimerane dlhým odpovediam.", "sizingTitle": "Praktická veľkosť", - "sizingBody": "Spotrebu odhadnite ako prepísané udalosti × kanály AI × vstupné a výstupné tokeny na volanie. Napríklad 50 udalostí × jeden kanál × (500 vstupných + 300 výstupných) = 40 000 tokenov denne. Skutočná spotreba a cena závisia od modelu, kontextu, cache a limitov poskytovateľa. Časť Detaily podľa kanála opisuje brief pre chat namiesto standard pri zachovaní podrobných e-mailov." + "sizingBody": "Spotrebu odhadnite ako prepísané udalosti × kanály s AI × vstupné a výstupné tokeny na volanie. Napríklad 50 udalostí × jeden kanál × (2 000 vstupných + 300 výstupných) je asi 115 000 tokenov denne, pretože samotný predvolený systémový prompt má približne 1 500 tokenov. Skutočná spotreba a cena závisia od modelu, kontextu, cache a limitov poskytovateľa. Časť Detaily podľa kanála opisuje brief pre chat namiesto standard pri zachovaní podrobných e-mailových správ." }, "providers": { "heading": "Poskytovatelia AI", @@ -142,7 +142,7 @@ "items": [ "Kľúč API: console.anthropic.com/settings/keys", "Príklady z dodaného zoznamu modelov: claude-haiku-4-5-20251001, claude-sonnet-4-6, claude-opus-4-6.", - "Dodané odporúčanie: claude-haiku-4-5-20251001. Odporúčaná je táto presná verzia; staršie položky Claude 3.5 už v dodanom zozname nie sú." + "Dodané odporúčanie: claude-haiku-4-5-20251001, pevne určená snímka namiesto premenlivého aliasu." ] }, "gemini": { diff --git a/web/messages/sk/docs/monitor/api-reference.json b/web/messages/sk/docs/monitor/api-reference.json index 2fc2dbb7..379dbcb3 100644 --- a/web/messages/sk/docs/monitor/api-reference.json +++ b/web/messages/sk/docs/monitor/api-reference.json @@ -162,7 +162,7 @@ { "endpoint": "/api/vms//backup", "method": "POST", - "use": "Vytvorí zálohu vzdump VM alebo LXC. Voliteľné polia prispôsobte úložisku: storage (cieľ PVE), mode (snapshot, suspend alebo stop), compress (zstd, lzo, gzip alebo none), protected (true alebo false), notes, notification (auto, always, failure alebo never) a pbs_change_detection (default, legacy alebo data). Vráti UPID úlohy PVE." + "use": "Vytvorí zálohu vzdump VM alebo LXC. Polia tela, všetky voliteľné, ak predvolené hodnoty zodpovedajú rozloženiu úložiska: storage (úložisko PVE), mode (snapshot, suspend alebo stop), compress (zstd, lzo, gzip alebo none), protected (true alebo false), notes a pbs_change_detection (default, legacy alebo data). Vráti UPID úlohy PVE." }, { "endpoint": "/api/vms//backups", @@ -286,7 +286,7 @@ { "endpoint": "/api/storage/smart//test", "method": "POST", - "use": "Spustí autotest SMART. Schéma tela: '{'\"type\":\"short\"|\"long\"'}'." + "use": "Spustí autotest SMART. Schéma tela: '{'\"test_type\":\"short\"|\"long\"'}'." }, { "endpoint": "/api/storage/smart/schedules", diff --git a/web/messages/sk/docs/monitor/architecture.json b/web/messages/sk/docs/monitor/architecture.json index 6901f32c..d160d4ad 100644 --- a/web/messages/sk/docs/monitor/architecture.json +++ b/web/messages/sk/docs/monitor/architecture.json @@ -73,13 +73,13 @@ "intro": "AppImage obsahuje súborový systém pripojený pri spustení. AppRun v koreni pripraví prostredie a spustí flask_server.py:", "consequencesIntro": "Dva dôsledky tohto usporiadania:", "consequences": [ - "Pribalené prostredie Python. Interpret a balíky sú v AppImage, bez inštalácie do systémového Pythonu. Aplikácia naďalej používa rozhrania jadra a externé nástroje hostiteľa.", + "Pribalené balíky Python. Balíky Python sú súčasťou AppImage a bežia na vlastnom interpretri Python hostiteľa 3.11 (PVE 8) alebo 3.13 (PVE 9), bez inštalácie čohokoľvek do systémového Pythonu hostiteľa. Aplikácia naďalej používa rozhrania jadra hostiteľa a externé nástroje hostiteľa.", "Pribalení klienti hardvéru. Obsahuje ipmitool, lm-sensors a upsc. Merania vyžadujú podporovaný hardvér, prístup k senzorom a pre UPS nastavený server NUT." ] }, "flask": { "heading": "Štruktúra aplikácie Flask", - "intro": "flask_server.py vytvorí inštanciu Flask(__name__) s obmedzeným CORS, priamo registruje deväť blueprintov a inicializuje terminál. Tabuľka uvádza hlavné moduly; registrované sú aj audit, zálohy VM a PBS. Prednačítavanie PVE beží iba na hostiteľoch PVE.", + "intro": "flask_server.py vytvorí jednu inštanciu Flask(__name__) s obmedzenými pôvodmi CORS, priamo registruje desať blueprintov a inicializuje trasy terminálu. Tabuľka uvádza hlavné moduly; registrované sú aj blueprinty PBS, odkazov Monitora, auditu a záloh VM. Prednačítavanie špecifické pre PVE beží iba na hostiteľoch PVE.", "headerBlueprint": "Blueprint / modul", "headerPrefix": "Predpona ciest", "headerOwns": "Zodpovednosť", @@ -242,10 +242,10 @@ "Aktualizácie: čakajúce balíky a bezpečnostné opravy.", "Protokoly: trvalé vzory, špičky a kaskády v systémovom denníku.", "Pamäť: zásahy OOM killer a dlhodobý tlak na RAM.", - "Teplota: hodnoty CPU a diskov sa porovnávajú s monitorovacími prahmi; dostupné senzory závisia od hardvéru.", + "CPU: využitie a teplota CPU sa porovnávajú s nastaviteľnými prahmi; dostupné senzory závisia od hardvéru.", "Bezpečnosť: zlyhania prihlásenia, blokovania a stav jailu Fail2Ban." ], - "afterIntro": "Nálezy používajú stabilné error_key, kategóriu a závažnosť. Riadky v errors sa aktualizujú cez last_seen a počty bez duplicít. Odosielanie oznámení má aj vlastné odtlačky a časové odstupy.", + "afterIntro": "Nálezy používajú stabilné error_key, kategóriu a závažnosť. Existujúce záznamy v errors sa aktualizujú na mieste (last_seen, závažnosť, dôvod) namiesto duplikovania. Odosielanie oznámení má aj vlastné pravidlá odtlačkov a časových odstupov.", "cycleEnd": "Čistenie môže vyriešiť staré chyby podľa trvania potlačenia kategórie a stavových pravidiel, odstrániť osirelé záznamy zrušených prostriedkov a vymazať events staršie než 30 dní. Kategórie opisuje Panel → Health Monitor." }, "notifications": { @@ -264,9 +264,9 @@ "intro": "Karta Terminál prepája ľahkého klienta xterm.js s PTY servera cez WebSocket. Existujú dva režimy:", "items": [ "Režim HTTP, predvolený: vstavaný server Flask s flask-sock spracúva prechod na protokol WebSocket.", - "Režim HTTPS / WSS: používa gevent.pywsgi.WSGIServer s geventwebsocket.handler.WebSocketHandler na spojenia WebSocket cez TLS." + "Režim HTTPS / WSS: server TLS používa gevent.pywsgi.WSGIServer s jeho predvoleným handlerom; flask-sock spracúva spojenia WebSocket cez TLS." ], - "outro": "Procesy terminálu dedia User=root. Pri zapnutom overovaní WebSocket vyžaduje krátkodobý jednorazový lístok získaný z overeného koncového bodu so správcovským oprávnením. Pri vypnutom alebo odmietnutom overovaní spojenie používa tento neoverovaný režim.", + "outro": "Podriadené procesy terminálu dedia User=root zo služby. Otvorenie WebSocketu vyžaduje krátkodobý jednorazový lístok získaný z overeného koncového bodu lístkov terminálu so správcovským oprávnením.", "proxyNote": "Pri reverznom proxy povoľte WebSocket a hlavičky Upgrade a Connection. Terminál potrebuje toto preposielanie." }, "proxy": { diff --git a/web/messages/sk/docs/monitor/dashboard/network.json b/web/messages/sk/docs/monitor/dashboard/network.json index c131cc2f..9b0592a0 100644 --- a/web/messages/sk/docs/monitor/dashboard/network.json +++ b/web/messages/sk/docs/monitor/dashboard/network.json @@ -162,7 +162,7 @@ } ], "reportTitle": "Správa o latencii siete (PDF)", - "reportIntro": "Oba režimy majú pri výbere cieľa tlačidlo Správa. Vytvorí PDF meraní, ktoré môžete priložiť k žiadosti o podporu u poskytovateľa internetu.", + "reportIntro": "Oba režimy majú pri výbere cieľa tlačidlo Správa. Otvorí tlačiteľnú správu z meraní; uložte ju ako PDF cez dialóg tlače prehliadača a priložte ju k žiadosti o podporu u poskytovateľa internetu.", "reportPreviewAlt": "Prvá strana správy PDF o odozve: súhrn, ukazovateľ, štatistiky, graf a vysvetlenie prahov", "reportPreviewCaption": "Prvá strana obsahuje súhrn, ukazovateľ, hlavné štatistiky, časový priebeh odozvy a vysvetlenie prahov. Od strany 2 nasleduje tabuľka meraní a metodika.", "downloadLabel": "Stiahnuť príklad správy o odozve (PDF)", diff --git a/web/messages/sk/docs/monitor/dashboard/security.json b/web/messages/sk/docs/monitor/dashboard/security.json index 6fce8221..405314d5 100644 --- a/web/messages/sk/docs/monitor/dashboard/security.json +++ b/web/messages/sk/docs/monitor/dashboard/security.json @@ -136,7 +136,7 @@ "configCaption": "Úprava jailu sshd: znížte Max Retries, ak SSH používate iba z vlastnej podsiete, alebo predĺžte Ban Time pre prehľad dostupný z internetu.", "outro": "Návod Inštalácia, nastavenie a odinštalovanie opisuje aj ručnú inštaláciu, zmenu SSH MaxAuthTries a súvislosť so záznamom proxmenux-auth.log. Pozrite ProxMenux → Zabezpečenie → Fail2Ban.", "calloutTitle": "Bez Fail2Ban tento mechanizmus neblokuje IP adresy", - "calloutBody": "ProxMenux Monitor kontroluje IP adresy blokované Fail2Ban na aplikačnej úrovni pred spracovaním požiadaviek Flask. Volá fail2ban-client a výsledok ukladá do vyrovnávacej pamäte na 30 sekúnd; nečíta tabuľku blokovaní SQL. Bez Fail2Ban sa neúspešné prihlásenia zapisujú do proxmenux-auth.log, ale tento mechanizmus IP adresy neblokuje." + "calloutBody": "ProxMenux Monitor kontroluje IP adresy zablokované v jail proxmenux nástroja Fail2Ban na aplikačnej úrovni pred spracovaním požiadaviek Flask a výsledok uchováva vo vyrovnávacej pamäti 30 sekúnd. Bez Fail2Ban sa neúspešné prihlásenia zapisujú do proxmenux-auth.log a koncový bod prihlásenia je obmedzený na 5 pokusov z jednej IP za 5 minút, ale žiadna IP adresa sa nezablokuje." }, "lynis": { "heading": "Bezpečnostný audit Lynis", diff --git a/web/messages/sk/docs/monitor/dashboard/settings.json b/web/messages/sk/docs/monitor/dashboard/settings.json index c80d161a..a6241bca 100644 --- a/web/messages/sk/docs/monitor/dashboard/settings.json +++ b/web/messages/sk/docs/monitor/dashboard/settings.json @@ -76,7 +76,7 @@ }, "thresholds": { "heading": "Prahy Health Monitor", - "intro": "Predchádzajúca karta určuje trvanie stíšenia po potlačení; táto nastavuje hodnotu spustenia výstrahy. Väčšina kontrol má nastaviteľný varovný a kritický prah. Tabuľka vysvetľuje výnimky, napríklad kombinované pravidlo swapu a aktuálny detektor RAM.", + "intro": "Predchádzajúca karta určuje trvanie stíšenia po potlačení; táto nastavuje hodnotu spustenia výstrahy. Väčšina prahových kontrol má nastaviteľný varovný a kritický prah. Tabuľka nižšie vysvetľuje výnimky, napríklad kombinované pravidlo swapu.", "whatForTitle": "Na čo slúži", "whatForIntro": "Predvolené hodnoty sú východiskom, ale každé prostredie má vlastné podmienky:", "whatForItems": [ @@ -85,7 +85,7 @@ "Teplotné prahy vyberte podľa špecifikácií disku a skutočných podmienok. Pasívne alebo nútené chladenie samo neurčuje univerzálne nižší či vyšší bezpečný limit.", "Silne virtualizovaný hostiteľ môže pri zostavovaní dosiahnuť špičky CPU bez výstrahy pri každom 80 % výkyve, ale musí upozorniť na trvalé preťaženie." ], - "whatForOutro": "Podporované zmeny platia pri ďalšej kontrole. Health Monitor číta /usr/local/share/proxmenux/health_thresholds.json v každom cykle bez reštartu. Niektoré ukazovatele, napríklad teplota diskov, používajú tieto hodnoty; niektoré kapacitné pruhy majú vlastné hranice. Riadok RAM vysvetľuje aktuálnu výnimku.", + "whatForOutro": "Podporované zmeny prahov platia pri ďalšej kontrole. Health Monitor číta /usr/local/share/proxmenux/health_thresholds.json v každom cykle bez reštartu. Vybrané ukazovatele vrátane teploty diskov používajú tieto hodnoty; niektoré kapacitné pruhy si ponechávajú vlastné vizuálne hranice.", "coloursTitle": "Farby stavov Varovanie a Kritické", "coloursIntro": "Widgety s nastavenou dvojicou Varovanie/Kritické používajú tri stavy nižšie. Iné ukazovatele, napríklad kapacitné pruhy PVE, majú vlastné hranice; samotná farba nedokazuje výstrahu Health Monitor.", "headerColour": "Farba", @@ -125,7 +125,7 @@ "section": "Pamäť", "warning": "85 %", "critical": "95 %", - "gates": "Tlak na RAM hostiteľa. Nastavenie uvádza kritický prah 95 %, ale aktuálny detektor používa pevné pravidlo trvalých 90 %; zmena nastavenia teraz nemení túto vetvu." + "gates": "Tlak na RAM hostiteľa." }, { "section": "Swap (iba kritická hranica)", @@ -185,7 +185,7 @@ "section": "PVE úložisko", "warning": "85 %", "critical": "95 %", - "gates": "Úložiská spravované PVE: LVM, LVM-thin, ZFS-pool, RBD/Ceph a PBS. Nie všetky sú blokové úložiská." + "gates": "Iba úložiská PVE typu LVM, LVM-thin, ZFS-pool, RBD, CephFS a PBS. Úložiská typu adresár, NFS a CIFS pokrýva riadok miesta na disku hostiteľa." }, { "section": "ZFS pool", @@ -218,7 +218,7 @@ "toggleTitle": "Prepínač oznámení pri zapnutej detekcii", "toggleBody": "Prepínač lxc_updates_available pre každý kanál v Oznámenia → Služby sa zobrazuje iba pri zapnutej detekcii. Vypnutie skryje riadok vo všetkých kanáloch. Voľba zostáva v databáze a po zapnutí sa obnoví pôvodná hodnota.", "purgeTitle": "Čo sa odstráni pri vypnutí detekcie", - "purgeBody": "Vypnutie ihneď odstráni záznamy type=lxc z /usr/local/share/proxmenux/managed_installs.json. Po obnovení Hardvér prestane zobrazovať počty aktualizácií LXC. Po zapnutí register naplní ďalší cyklus, prípadne skoršie ručné obnovenie cez API." + "purgeBody": "Vypnutie ihneď odstráni všetky záznamy type=lxc z /usr/local/share/proxmenux/managed_installs.json. Počty aktualizácií LXC na karte VM a LXC zmiznú pri ďalšom obnovení dashboardu. Po zapnutí register naplní ďalší cyklus detekcie, prípadne skoršie ručné obnovenie cez API." }, "storageExclusions": { "heading": "Vylúčené vzdialené úložiská", diff --git a/web/messages/sk/docs/monitor/dashboard/storage.json b/web/messages/sk/docs/monitor/dashboard/storage.json index 6fe25751..60e5e65d 100644 --- a/web/messages/sk/docs/monitor/dashboard/storage.json +++ b/web/messages/sk/docs/monitor/dashboard/storage.json @@ -70,7 +70,7 @@ "items": [ "Trasa zariadenia — /dev/sda, /dev/nvme0n1.", "Štítok typu — SATA / NVMe a príslušná ikona.", - "Systémový štítok — oranžové označenie diskov rozpoznaných ako disky operačného systému. Detekcia používa pripojenia / a /boot a pridelí štítok System. Chýbajúci štítok nedokazuje, že disk možno bezpečne vymazať alebo použiť inak.", + "Systémový štítok — oranžové označenie diskov, ktoré používa hostiteľ: systémové body pripojenia (/, /boot, /usr, /var…), aktívny swap, členovia poolov ZFS, fyzické zväzky LVM, aktívni členovia RAID alebo menovky systémových oddielov. Chýbajúci štítok nedokazuje, že disk možno bezpečne vymazať alebo použiť inak.", "Model — výrobca a model z smartctl -i.", "Kapacita — zobrazená v zrozumiteľných jednotkách.", "Teplota — aktuálna hodnota v °C s farbou podľa typu disku; NVMe používa vyššie prahy než SATA.", @@ -112,7 +112,7 @@ "pdfPreviewAlt": "Prvá strana správy SMART so súhrnom, ukazovateľom PASSED a informáciami o disku", "pdfPreviewCaption": "Prvá strana: súhrn, ukazovateľ PASSED a úplné informácie o disku. Príklad PDF obsahuje opotrebovanie SSD, všetky atribúty SMART a históriu testov.", "pdfDownloadLabel": "Stiahnuť príklad správy SMART (PDF)", - "pdfSectionsIntro": "Správa má šesť hlavných častí:", + "pdfSectionsIntro": "Správa obsahuje tieto hlavné časti:", "pdfSections": [ "Súhrn — stav PASSED/FAILED, zrozumiteľné hodnotenie disku — v poriadku, opotrebovaný alebo zlyhávajúci — a štyri údaje: čas správy, posledný typ testu, výsledok a overené atribúty.", "Informácie o disku — model, sériové číslo, kapacita, typ HDD/SSD/NVMe, rodina, formát, rozhranie (SATA 3.3 · 6.0 Gb/s, …), TRIM, teplota a optimálny prah, hodiny prevádzky, zapnutia, SMART, čakajúce/prerozdelené sektory a chyby CRC.", @@ -127,7 +127,7 @@ "historyImageCaption": "História testov SMART disku. Každý riadok ukazuje typ, čas, vek, označenie posledného testu a možnosti stiahnutia výstupu smartctl a odstránenia.", "historyIntro": "Dokončené a uchované krátke aj rozšírené testy disku. Každý záznam obsahuje pôvodný výstup smartctl a polia spracované Monitorom pre prehľad. Akcie v riadku:", "historyItems": [ - "Stiahnuť — uloží snímku JSON s údajmi smartctl -a použitými v správe. Užitočné, ak podpora potrebuje pôvodné diagnostické polia.", + "Stiahnuť — uloží snímku JSON daného testu (výstup smartctl -a --json, alebo nvme smart-log pri NVMe, keď smartctl zlyhá). Užitočné, ak podpora výrobcu potrebuje pôvodné diagnostické polia.", "Odstrániť — ručne vymaže test z histórie. Uchovávanie v Plánovaní (posledných 5 / 10 / 20) automaticky maže najstaršie." ], "scheduleTitle": "Karta 4 — Plánovanie", diff --git a/web/messages/sk/docs/monitor/dashboard/vms-lxcs.json b/web/messages/sk/docs/monitor/dashboard/vms-lxcs.json index 3b161ab5..c8fbb299 100644 --- a/web/messages/sk/docs/monitor/dashboard/vms-lxcs.json +++ b/web/messages/sk/docs/monitor/dashboard/vms-lxcs.json @@ -1,16 +1,16 @@ { "meta": { "title": "ProxMenux Monitor — Panel: VM a LXC | Dokumentácia ProxMenux", - "description": "Inventár hosťovských systémov so živými údajmi CPU, pamäte a disku. Podrobnosti obsahujú konfiguráciu, zdroje, zálohy, nedávne výsledky záznamu Proxmox, poznámky a Spustiť / Vypnúť / Reštartovať / Vynútiť vypnutie." + "description": "Karta VM a LXC eviduje všetky hosťovské systémy na hostiteľovi so živým využitím CPU, pamäte a disku. Podrobnosti každého systému zobrazujú konfiguráciu, zdroje, zálohy, záznam konzoly kontajnerov OCI, poznámky a ovládanie Spustiť / Vypnúť / Reštartovať / Vynútiť vypnutie." }, "header": { "title": "Panel: VM a LXC", - "description": "Úplný inventár hosťovských systémov uzla: štyri metriky hore, triediteľný zoznam VM a LXC a podrobnosti s konfiguráciou, zdrojmi, zálohami, záznamami a ovládaním Spustiť / Vypnúť / Reštartovať / Vynútiť vypnutie.", + "description": "Úplný inventár hosťovských systémov uzla: štyri metriky hore, triediteľný zoznam všetkých VM a LXC pod nimi a podrobnosti s konfiguráciou, zdrojmi, zálohami, záznamom konzoly kontajnerov OCI a štyrmi ovládacími prvkami životného cyklu (Spustiť / Vypnúť / Reštartovať / Vynútiť vypnutie).", "section": "ProxMenux Monitor · Prehľad" }, "intro": { "title": "Ovládanie hosťovských systémov", - "body": "Táto karta ovláda životný cyklus hosťovských systémov. Akcie idú cez POST /api/vms/<vmid>/control s výslovným potvrdením a aktualizujú riadok systému. Nútené vypnutie vyžaduje samostatné tlačidlo Vynútiť vypnutie." + "body": "Táto karta ovláda životný cyklus hosťovských systémov. Akcie životného cyklu idú cez POST /api/vms/<vmid>/control; Reštartovať a Vynútiť vypnutie vás požiadajú o zadanie VMID na potvrdenie a odpoveď sa prejaví v riadku systému. Nútené vypnutie vyžaduje samostatné tlačidlo Vynútiť vypnutie." }, "topRow": { "heading": "Horný riadok: štyri štatistické karty", @@ -186,9 +186,9 @@ "source": "Dáta RRD PVE (pvesh get /nodes/<node>/qemu/<id>/rrddata) upravené do formátu pre graf." }, { - "section": "Nedávne výsledky záznamu Proxmox", - "endpoint": "/api/vms//logs", - "source": "pvesh get /nodes/<node>/<qemu|lxc>/<vmid>/log --start 0 --limit 1000. Pri zlyhaní príkazu vráti prázdny zoznam; nejde o úplné systémové záznamy vnútri hosťovského systému." + "section": "Záznam konzoly OCI (karta Logy)", + "endpoint": "/api/lxc//console-log", + "source": "Výstup konzoly hlavného procesu obrazu, čítaný z /var/log/proxmenux/oci/<vmid>.console.log na hostiteľovi. Zobrazuje sa iba pre kontajnery OCI." }, { "section": "Zálohy k dispozícii pre hostí", diff --git a/web/messages/sk/docs/monitor/health-monitor.json b/web/messages/sk/docs/monitor/health-monitor.json index 645ab240..83b459a1 100644 --- a/web/messages/sk/docs/monitor/health-monitor.json +++ b/web/messages/sk/docs/monitor/health-monitor.json @@ -68,7 +68,7 @@ { "category": "Úložisko", "checks": "Proxmox úložiská, koreňový súborový systém", - "events": "Prekročenie nastavených prahov využitia koreňového alebo iného sledovaného súborového systému (predvolene 85% upozornenie / 95% kritický stav); nedostupný export NFS; zlyhanie overenia CIFS; plný pool LVM-thin." + "events": "Prekročenie nastavených prahov využitia koreňového alebo iného sledovaného súborového systému (predvolene 85% upozornenie / 95% kritický stav); nedostupné úložiská PVE; zaseknuté pripojenia NFS/CIFS alebo pripojenia nečakane len na čítanie; úložiská LVM-thin a iné poolové úložiská prekračujúce rovnaké prahy." }, { "category": "Disky & SMART", @@ -98,7 +98,7 @@ { "category": "Aktualizácie systému", "checks": "Nevybavené aktualizácie, aktualizácie zabezpečenia, verzia jadra / PVE, systémový vek", - "events": "Čakajúce bezpečnostné aktualizácie alebo aktualizácie používaného jadra; dlho neaktualizovaný systém. Ak sú dostupné aktualizácie, hlavička prehľadu zobrazí Aktualizovať teraz. Tlačidlo spustí celý postup ProxMenux; po zatvorení obnoví stav cez ?refresh=1 bez čakania na ďalší cyklus." + "events": "Čakajúce bezpečnostné aktualizácie alebo aktualizácie používaného jadra; dlho neaktualizovaný systém. Kategória Aktualizácie v okne Stav systému zobrazí tlačidlo Aktualizovať teraz, keď čakajú aktualizácie. Spustí celý postup aktualizácie ProxMenux priamo v okne; po zatvorení obnoví stav cez ?refresh=1, aby indikátor ukázal nový stav bez čakania na ďalší cyklus." }, { "category": "Bezpečnosť a certifikáty", @@ -158,7 +158,7 @@ }, "dismiss": { "heading": "Potlačenie upozornení a jeho trvanie", - "intro": "Niektoré udalosti pretrvávajú, napríklad Aktualizácie systému: dostupné aktualizácie, kým hostiteľa neaktualizujete. Oznámenie každých päť minút nie je potrebné. Tlačidlo Aktualizovať teraz v prehľade tento prípad rieši priamo. Pre ostatné prípady alebo odložené aktualizácie sú dostupné dva prepojené spôsoby potlačenia:", + "intro": "Niektoré udalosti z povahy veci pretrvávajú, napríklad Aktualizácie systému: dostupné aktualizácie, kým hostiteľa neaktualizujete, a oznámenie každých päť minút počas celého týždňa nie je žiaduce. Tlačidlo Aktualizovať teraz v kategórii Aktualizácie okna Stav systému tento prípad rieši priamo. Pre ostatné prípady alebo odložené aktualizácie ponúka Monitor stavu aj dva prepojené spôsoby potlačenia:", "step1": "Potlačiť jednotlivú udalosť v okne. Ponuka obsahuje 24 hodín, 7 dní alebo Natrvalo bez ohľadu na predvolenú dobu kategórie. Voľba odošle POST /api/health/acknowledge s error_key a zvolenými suppression_hours (-1 pre trvalé potlačenie). Udalosť sa presunie medzi potlačené s časom acknowledged_at.", "dropdownImageAlt": "Ponuka potlačenia upozornenia: 24 hodín, 7 dní alebo natrvalo", "dropdownImageCaption": "Zvolená doba platí iba pre toto upozornenie; bez individuálnej voľby sa použije hodnota kategórie. Trvalo potlačené upozornenia majú jantárový odznak Natrvalo a bežne sa neobnovujú. Výnimkou je kritická teplota CPU opísaná nižšie.", @@ -187,7 +187,7 @@ }, { "finding": "ZFS pool DEGRADED / FAULTED", - "why": "Kontroly kapacity poolu ZFS výslovne umožňujú potlačenie. Ostatné zistenia používajú vlastný príznak. Potvrdenie neopraví degradovaný ani chybný pool." + "why": "Zistenia o stave poolu ZFS (DEGRADED, FAULTED, UNAVAIL) výslovne umožňujú potlačenie, rovnako ako kontroly kapacity poolu. Potvrdenie neopraví degradovaný ani chybný pool." }, { "finding": "Chyba disku I/O s SMART FAILED", @@ -289,7 +289,7 @@ }, "rest": { "heading": "Koncové body REST", - "intro": "Činnosti okna sú dostupné cez API pre skripty, panely či botov. Pri zapnutom overovaní Monitora treba platný Bearer token z prihlásenia alebo obrazovky API tokenov. Zmeny, ako potvrdenie upozornení, uloženie či čistenie osirelých chýb, vyžadujú full_admin; read_only dostane 403. Pri vypnutom alebo odmietnutom overovaní tieto kontroly umožnia prístup bez tokenu.", + "intro": "Činnosti okna sú dostupné aj cez API pre skripty, vlastné panely či botov. Volania vyžadujú platný Bearer token z prihlásenia alebo obrazovky API tokenov. Zmeny, ako potvrdenie upozornení, uloženie nastavení potlačenia či čistenie osirelých chýb, vyžadujú rozsah full_admin; read_only dostane 403.", "headerEndpoint": "Koncový bod", "headerMethod": "Metóda", "headerUse": "Použitie", @@ -297,7 +297,7 @@ { "endpoint": "/api/health", "method": "GET", - "use": "Ľahká kontrola vracajúca JSON s status, timestamp a version. Vhodná pre kontroly kľúčových slov Uptime Kuma; pri zapnutom overovaní Monitora musí klient poslať hlavičku Bearer." + "use": "Ľahká kontrola vracajúca JSON s status, timestamp a version. Vhodná pre kontroly kľúčových slov Uptime Kuma; klient musí poslať hlavičku Bearer." }, { "endpoint": "/api/health/status", diff --git a/web/messages/sk/docs/monitor/index.json b/web/messages/sk/docs/monitor/index.json index 49f438ea..d948916c 100644 --- a/web/messages/sk/docs/monitor/index.json +++ b/web/messages/sk/docs/monitor/index.json @@ -52,7 +52,7 @@ }, { "name": "Terminál", - "description": "Shell hostiteľa a podporované konzoly VM/CT v prehliadači cez xterm.js a WebSockets. Používa nastavený režim overovania: pri vypnutí alebo odmietnutí môžu klienti s prístupom zo siete otvoriť reláciu bez prihlásenia. Neznamená to audit každého príkazu." + "description": "Shell hostiteľa a podporované konzoly VM/CT v prehliadači cez xterm.js a WebSockets. Relácie sa neauditujú po jednotlivých príkazoch." }, { "name": "Zabezpečenie", @@ -114,7 +114,7 @@ "heading": "REST API a integrácie", "intro": "Endpointy REST poskytujú monitorovacie dáta JSON cez HTTP/HTTPS pre Homepage, Home Assistant, Uptime Kuma a skripty. Grafana môže použiť samostatný textový exportér Prometheus na /api/prometheus. Požiadavky možno posielať cez curl.", "tokens": "Tokeny API s dlhou životnosťou (365 dni) sa generujú z Nastavenia → API prístupových tokenov alebo prostredníctvom POST /api/auth/generate-api-token.", - "bearer": "Tokeny posielajte ako Authorization: Bearer …. Verejný /api/health je vhodný na kontroly dostupnosti bez poverení. Pod /api/auth/* sú verejné trasy nastavenia/prihlásenia/stavu aj chránená správa účtov/tokenov; nie všetky sú anonymné.", + "bearer": "Tokeny posielajte ako Authorization: Bearer …. Aj /api/health očakáva hlavičku Bearer, takže kontroly dostupnosti potrebujú token read_only. Pod /api/auth/* sú verejné trasy nastavenia/prihlásenia/stavu aj chránené trasy správy účtov/tokenov; nie všetky sú anonymné.", "catalog": "Katalóg endpointov, rotácia tokenov a zabezpečenie sú v Referenčnej príručke API; príklady pre Homepage, Home Assistant, Grafana, Uptime Kuma a cURL sú v Integrácie." }, "serviceControl": { diff --git a/web/messages/sk/docs/monitor/integrations.json b/web/messages/sk/docs/monitor/integrations.json index 320c12ea..38748402 100644 --- a/web/messages/sk/docs/monitor/integrations.json +++ b/web/messages/sk/docs/monitor/integrations.json @@ -220,7 +220,7 @@ "heading": "n8n, Zapier a vlastné skripty", "intro": "Workflow nástroje a skripty môžu odosielať oznámenia cez POST na /api/notifications/send, napríklad pri zlyhaní CI alebo dlhej úlohe cron. Priame odoslanie obíde front aj časový odstup podľa odtlačku udalosti. Zachová formátovanie kanálov, voliteľnú AI a doručenie. Duplicity musí riešiť volajúci.", "n8nBody": "V n8n použite uzol HTTP Request s POST, uvedenou URL a rovnakým JSON ako curl. Zvoľte všeobecné údaje Header Auth: názov Authorization a hodnotu Bearer YOUR_API_TOKEN, pričom nahraďte zástupný text. Požiadavku spustí plán, webhook alebo predchádzajúci uzol.", - "severityBody": "Závažnosť používa INFO, WARNING alebo CRITICAL veľkými písmenami. Objekt data poskytuje kontext. AI používa vytvorený nadpis, správu a podporované doplnenia; nie je zaručené, že ľubovoľné polia zahrnie do promptu či výstupu. Pozri Oznámenia → Katalóg udalostí." + "severityBody": "Závažnosť používa INFO, WARNING alebo CRITICAL veľkými písmenami. Objekt data poskytuje kontext udalosti a polia šablóny. Na tomto koncovom bode dostane prepis AI iba nadpis a správu; polia v data sa poskytovateľovi neposielajú. Význam udalostí pozri v Oznámenia → Katalóg udalostí." }, "pveWebhook": { "heading": "Natívny webhook Proxmox VE (prichádzajúci)", diff --git a/web/messages/sk/docs/monitor/notifications.json b/web/messages/sk/docs/monitor/notifications.json index 215eda7b..67654a7f 100644 --- a/web/messages/sk/docs/monitor/notifications.json +++ b/web/messages/sk/docs/monitor/notifications.json @@ -171,7 +171,7 @@ "Otvorte account.microsoft.com/security a povoľte dvojstupňové overovanie.", "Ak účet ponúka Rozšírené možnosti zabezpečenia → Heslá aplikácií, vyberte Vytvoriť heslo aplikácie. Samotná voľba nezaručuje podporu SMTP s heslom.", "Ak Microsoft vytvorí heslo, skopírujte ho a overte jeho prijatie službou SMTP.", - "Len ak poskytovateľ dovoľuje SMTP s heslom, použite schválené hodnoty: Server smtp.office365.com pre Exchange Online, Port 587, Režim TLS STARTTLS, Meno adresu schránky a Heslo povolený údaj. Osobné Outlook.com má iné nastavenia a požiadavky." + "Len ak poskytovateľ dovoľuje SMTP s heslom, vyplňte jeho schválené hodnoty: Server smtp.office365.com pre Exchange Online, Port 587, Režim TLS STARTTLS, Používateľské meno adresu vašej schránky a Heslo povolený prihlasovací údaj SMTP. Osobné Outlook.com má iné nastavenia a požiadavky na overenie; nepredpokladajte, že tieto údaje budú fungovať." ], "relayTitle": "SMTP relay na vlastnom serveri", "relayBody": "Nasmerujte Monitor na vlastný SMTP relay, napríklad Postfix. Ten rieši overenie voči poskytovateľovi. Overenie a TLS Monitora nastavte podľa relaya; miestny relay automaticky nevypína šifrovanie." @@ -266,7 +266,7 @@ "howItems": [ "Zapnutie pre každý kanál. Predvolene vypnuté. Zapnite iba tam, kde chcete súhrn; ostatné kanály nechajte priame.", "Čas doručenia v miestnom čase, predvolene 09:00. Odosielač ho spustí približne do 60 s od danej minúty.", - "Obsah súhrnu: vhodné všeobecné udalosti INFO, napríklad dostupná aktualizácia aplikácie, dostupná aktualizácia Tailscale, dostupná aktualizácia optimalizácie ProxMenux, čakajúce bezpečnostné aktualizácie APT a oznámenie o limite odosielania. Výsledky záloh a vyňaté akcie zostanú priame.", + "Obsah súhrnu: vhodné všeobecné udalosti so závažnosťou INFO. Napríklad dostupná aktualizácia aplikácie, dostupná aktualizácia Tailscale, dostupná aktualizácia optimalizácie ProxMenux a čakajúce bezpečnostné aktualizácie APT. Výsledky záloh a ďalšie vyňaté udalosti akcií zostanú priame.", "Čo sa nikdy neodkladá:", "Trvalé uloženie. Udalosti čakajú v tabuľke SQLite digest_pending do nastaveného času a prežijú reštart.", "Bez udalostí nie je súhrn. Ak nečakajú INFO, prázdna správa sa neposiela." @@ -301,7 +301,7 @@ { "stage": "Interval opakovania", "what": "Po úspešnom odoslaní sa opakované odtlačky potlačia; stav je v notification_last_sent. Základ pre CRITICAL, WARNING, INFO, resources a updates je 86400 s. Výnimky: 5 s pre akcie VM/CT a vypnutie/reštart, 10 s pre výsledky záloh/replikácie, 1800–3600 s pre viaceré zdravotné stavy. Výslovné nastavenia udalosti/skupiny majú prednosť.", - "tunable": "Áno — konfiguračné hodnoty pre udalosť či skupinu prepisujú predvolené intervaly." + "tunable": "Len cez API nastavení — kľúč cooldown.<event_type> alebo cooldown.<group> prepíše predvolené hodnoty; v rozhraní na to nie je žiadny ovládací prvok." }, { "stage": "Zoskupovanie nárazových udalostí", @@ -330,7 +330,7 @@ "Metóda a URL. POST http://127.0.0.1:8008/api/notifications/webhook bez HTTPS Monitora; s HTTPS samostatný miestny HTTP port 8009. Obe zostávajú na hostiteľovi.", "Šablóna správy. JSON s funkciami Handlebars PVE, uložený v konfigurácii ako base64. Po dekódovaní:", "Pravidlo priradenia. Blok matcher: proxmenux-matcher s mode all posiela všetky oznámenia PVE do cieľa.", - "Súkromná konfigurácia. Nastavenie zapíše webhook: proxmenux-webhook do /etc/pve/priv/notifications.cfg so zdieľaným tajomstvom v base64. Verejný cieľ ho použije pre X-Webhook-Secret. Blok nie je prázdny." + "Súkromná konfigurácia. Nastavenie zapíše zodpovedajúci blok webhook: proxmenux-webhook do /etc/pve/priv/notifications.cfg s položkou secret s názvom X-Webhook-Secret, zakódovanou v base64. Verejný blok cieľa obsahuje iba šablónu tela, metódu a URL. Súkromný blok nie je prázdny zástupný záznam." ], "securityTitle": "Ako je prijímač zabezpečený", "securityIntro": "Prijímač webhook na POST /api/notifications/webhook používa rôzne bezpečnostné vrstvy v závislosti od toho, odkiaľ pochádza žiadosť:", diff --git a/web/messages/sv/docs/monitor/access-auth.json b/web/messages/sv/docs/monitor/access-auth.json index 4880b377..f02a46b3 100644 --- a/web/messages/sv/docs/monitor/access-auth.json +++ b/web/messages/sv/docs/monitor/access-auth.json @@ -19,7 +19,7 @@ "reaching": { "heading": "Öppna instrumentpanelen", "intro": "ProxMenux Monitor binder till 0.0.0.0:8008. Det finns tre vanliga sätt att nå den:", - "outro": "Direktåtkomst motsvarar standardenheten för systemd. Omvänd proxy och Secure Gateway beskrivs nedan. Klient-IP från X-Forwarded-For kräver PROXMENUX_TRUST_PROXY=1 och en proxy du kontrollerar. Enbart X-Forwarded-Proto eller X-Forwarded-Host aktiverar inte detta förtroende; frontend bygger API-URL:er från webbläsarens ursprung." + "outro": "Direktåtkomst motsvarar standardenheten för systemd. Omvänd proxy och Secure Gateway beskrivs nedan. Förtroende för klient-IP i X-Forwarded-For kräver PROXMENUX_TRUST_PROXY=1 och en proxy du kontrollerar. Enbart förekomsten av X-Forwarded-Proto eller X-Forwarded-Host aktiverar inte proxyförtroende. På portarna 80/443 använder frontend relativa /api/*-URL:er; på alla andra portar anropas port 8008 på samma värdnamn." }, "firstLaunch": { "heading": "Första starten", @@ -117,8 +117,8 @@ "loginImageCaption": "När autentiseringen är konfigurerad börjar varje besök på instrumentbrädan här. Med 2FA aktiverad ber skärmen om 6-siffrig kod i ett andra steg efter att lösenordet accepteras.", "loginFlowTitle": "Inloggningsflöde", "twofaIntro": "Med 2FA returnerar första anropet requires_totp: true. Upprepa det med den sexsiffriga koden:", - "publicTitle": "Offentlig åtkomst och skyddade kontroller", - "publicIntro": "Inloggning och autentiseringsstatus är offentliga. Kontot kan skapas så länge användarnamn och lösenord inte sparats, även efter att skydd avböjts. Systemdata kräver autentisering när skyddet är aktivt:", + "publicTitle": "Offentliga slutpunkter (utan token)", + "publicIntro": "Inloggning, autentiseringsstatus, första konfigurationen och den lätta slutpunkten /api/system-info är offentliga:", "publicItems": [ "/api/auth/login och /api/auth/status är offentliga. /api/auth/setup skapar första kontot och vägrar skriva över befintliga inloggningsuppgifter.", "/api/system-info är en offentlig ändpunkt med grundläggande systeminformation, inklusive health.status. Den kräver ingen token. Även /api/auth/status är offentlig och passar för en tillgänglighetskontroll." @@ -146,7 +146,7 @@ }, { "asset": "TOTP-hemlighet för 2FA", - "algorithm": "Standard-TOTP (RFC 6238) med base32-kodad hemlighet. De åtta engångskoderna för återställning lagras som SHA-256-hashar.", + "algorithm": "Standard-TOTP (RFC 6238) med base32-kodad hemlighet. De åtta reservkoderna är engångskoder och lagras som SHA-256-hashar.", "where": "auth.json → totp_secret + backup_codes[]" }, { @@ -243,17 +243,17 @@ } ], "backupTitle": "Varför säkerhetskopior behövs", - "backupBody": "Om enheten försvinner, använd en sparad återställningskod eller återställ en säkerhetskopia som du ordnat i förväg. Molnsynkronisering och exporter skiljer sig mellan appar; kontrollera att TOTP-hemligheterna kan återställas. Root-åtkomst på värden möjliggör också återställning enligt nedan. Spara en separat, säker kopia.", + "backupBody": "Om autentiseringsenheten försvinner, använd en sparad reservkod eller återställ appen från en säkerhetskopia som du ordnat i förväg. Molnsynkronisering och lokala exporter skiljer sig mellan appar; kontrollera att den valda metoden verkligen återställer TOTP-hemligheterna. Root-åtkomst på värden möjliggör också återställning enligt nedan. Spara en separat, säker kopia.", "setupTitle": "Ställ in steg för steg från panelen", "setupImageAlt": "2FA-inställning med QR-kod och återställningskoder", - "setupImageCaption": "2FA-dialogen visar QR-kod, Base32-hemlighet för manuell inmatning och åtta engångskoder för återställning. Kopiera dem innan dialogen stängs; de visas inte igen.", + "setupImageCaption": "Installationsdialogen för 2FA visar en QR-kod, en Base32-hemlighet för manuell inmatning och, efter verifieringen, åtta reservkoder för engångsbruk. Kopiera koderna innan dialogen stängs; de visas inte igen.", "setupSteps": [ "Installera autentiseringsappen på din telefon (eller öppna din lösenordshanterare). En av apparna från tabellen ovan. Du behöver bara göra det en gång - samma app kommer att hålla koder för varje tjänst du skyddar.", "Logga in på panelen med användarnamn och lösenord.", - "Öppna fliken Säkerhet och välj Aktivera 2FA. Dialogen visar QR-kod, Base32-hemlighet och åtta återställningskoder.", + "Öppna fliken Säkerhet i instrumentpanelens sidofält och klicka sedan på Aktivera 2FA och Starta installationen. Dialogen visar en QR-kod och den manuella nyckeln; de åtta reservkoderna visas när koden har verifierats.", "Lägg till posten i autentiseringsappen:", - "Spara återställningskoderna. Förvara alla åtta i en lösenordshanterare, krypterad anteckning eller säker papperskopia. Varje kod fungerar en gång när appen är otillgänglig.", - "Bekräfta med den aktuella sexsiffriga koden från appen i fältet \"Verifieringskod\" och skicka. Koden ändras var 30:e sekund; använd nästa om den hinner löpa ut.", + "Bekräfta med den aktuella sexsiffriga koden från appen i fältet \"Verifieringskod\" i installationsdialogen och skicka. Koden ändras var 30:e sekund; använd nästa om den hinner löpa ut medan du skriver.", + "Spara reservkoderna. Förvara efter verifieringen alla åtta säkert i en lösenordshanterare, krypterad anteckning eller säker papperskopia. Varje kod fungerar en gång om autentiseringsappen är otillgänglig.", "Klart. 2FA är aktivt. Nästa inloggning frågar först efter lösenord och sedan den aktuella sexsiffriga koden." ], "setupStep4Sub": [ @@ -261,17 +261,17 @@ "Manuellt alternativ när skanning inte är möjlig, exempelvis på samma telefon: Lägg till konto → Ange inställningsnyckel. Välj ett namn som Proxmox Monitor, klistra in Base32-hemligheten, lämna Typ som Tidsbaserad och spara." ], "testTitle": "Test innan du loggar ut", - "testBody": "Behåll den nuvarande sessionen och testa en ny inloggning i ett privat fönster omedelbart efter inställningen. Kontrollera serverns och telefonens klockor om koden nekas, innan du stänger den fungerande sessionen. Om åtkomsten redan är förlorad, använd återställningskod eller redigera auth.json från värdens skal.", + "testBody": "Behåll den nuvarande sessionen och testa en ny inloggning i ett privat fönster omedelbart efter inställningen. Kontrollera serverns och telefonens klockor om koden nekas, innan du loggar ut från den fungerande sessionen. Om åtkomsten redan är förlorad, använd en reservkod eller redigera auth.json från värdens skal.", "lostTitle": "Förlorad autentiseringsapp", "lostIntro": "Tre återställningsmetoder, från minst till mest ingripande:", "lostItems": [ - "Använd en återställningskod. Ange en av de åtta sparade koderna i TOTP-fältet. Den fungerar en gång; oanvända koder förblir giltiga. Ställ sedan in 2FA på nytt i inställningarna för åtta nya koder.", + "Använd en reservkod. Ange en av de åtta sparade koderna i TOTP-fältet. Den fungerar en gång; oanvända koder förblir giltiga. Öppna Säkerhet efter inloggningen, välj Inaktivera 2FA och sedan Aktivera 2FA för att få åtta nya koder.", "Återställ appen från moln eller säkerhetskopia. Med inställd molnsynkronisering kan appen installeras och kontot öppnas på en ny enhet: Google, Microsoft, Authy, Apple Passwords via iCloud-nyckelring, Ente eller 2FAS. Med en exportfil från Aegis, Raivo eller FreeOTP+, installera appen och importera filen.", "Stäng av 2FA från värdens skal. Om övriga metoder saknas, redigera /root/.config/proxmenux-monitor/auth.json som root via SSH eller konsol. Sätt totp_enabled till false, spara och starta om tjänsten:" ], "lostShellOutro": "Du kan logga in med användarnamn + lösenord bara, sedan aktivera 2FA från Inställningar.", "disableTitle": "Inaktivera 2FA", - "disableBody": "Öppna Säkerhet och välj Inaktivera 2FA. POST /api/auth/totp/disable kräver aktuellt lösenord och giltig TOTP- eller återställningskod. Hemligheten och återställningskoderna tas bort. Ta även bort den gamla posten i appen.", + "disableBody": "Öppna Säkerhet och välj Inaktivera 2FA. POST /api/auth/totp/disable kräver aktuellt lösenord och en giltig TOTP- eller reservkod. TOTP-hemligheten och reservkoderna tas bort. Ta även bort den gamla posten i autentiseringsappen.", "rejectedTitle": "Den sexsiffriga koden nekas alltid", "rejectedIntro": "TOTP är tidsbaserat. Serverns och telefonens klockor bör skilja mindre än cirka 30 s. Två kontroller:", "rejectedItems": [ diff --git a/web/messages/sv/docs/monitor/ai-assistant.json b/web/messages/sv/docs/monitor/ai-assistant.json index 8346ec59..635abe9f 100644 --- a/web/messages/sv/docs/monitor/ai-assistant.json +++ b/web/messages/sv/docs/monitor/ai-assistant.json @@ -14,7 +14,7 @@ }, "intro": { "title": "Avstängt som standard, aktiveras med ett reglage", - "body": "AI-omskrivning är avstängd som standard. Aktivera den under Inställningar → Aviseringar → Avancerat: AI-förbättring. Om kontextberikning eller omskrivning misslyckas skickas originalmallen. Varje omskrivning har högst 25 sekunders väntetid; därefter används mallen i stället för obegränsad väntan." + "body": "AI-omskrivning är avstängd som standard. Aktivera den under Inställningar → Aviseringar → Avancerat: AI-förbättring. Om kontextberikning eller omskrivning misslyckas skickar sändaren originalmallen. Omskrivningar i händelsernas sändningskö har en tidsgräns på 25 sekunder; när den nås skickas mallen i stället för att vänta." }, "howItWorks": { "heading": "Hur det fungerar", @@ -109,7 +109,7 @@ ], "customNote": "Läget med egen prompt har en fast gräns på 500 utdatatoken oavsett detaljnivå. Du styr prompten och gränsen motverkar alltför långa svar.", "sizingTitle": "Praktisk storlek", - "sizingBody": "Uppskatta förbrukningen som omskrivna händelser × AI-kanaler × in- och utdatatoken per anrop. Exempel: 50 händelser × en kanal × (500 indata + 300 utdata) = 40 000 token per dag. Förbrukning och kostnad beror på modell, kontext, cache och leverantörsgränser. Detaljnivå per kanal visar brief för chatt i stället för standard, med fortsatt detaljerad e-post." + "sizingBody": "Uppskatta förbrukningen som omskrivna händelser × AI-aktiverade kanaler × in- och utdatatoken per anrop. Exempel: 50 händelser × en kanal × (2 000 indata + 300 utdata) blir cirka 115 000 token per dag, eftersom standardsystemprompten ensam är ungefär 1 500 token. Faktisk förbrukning och kostnad beror på modell, kontext, cache och leverantörsgränser. Avsnittet Detaljnivå per kanal visar hur du använder brief för chatt i stället för standard, med fortsatt detaljerade e-postrapporter." }, "providers": { "heading": "AI-leverantörer", @@ -142,7 +142,7 @@ "items": [ "API-nyckel: console.anthropic.com/settings/keys", "Exempel från den medföljande modellistan: claude-haiku-4-5-20251001, claude-sonnet-4-6, claude-opus-4-6.", - "Medföljande rekommendation: claude-haiku-4-5-20251001. Denna exakta version är rekommenderad; de äldre Claude 3.5-posterna finns inte längre i listan." + "Medföljande rekommendation: claude-haiku-4-5-20251001, en fast ögonblicksbild i stället för ett rörligt alias." ] }, "gemini": { diff --git a/web/messages/sv/docs/monitor/api-reference.json b/web/messages/sv/docs/monitor/api-reference.json index 0fd9db90..d4d2817c 100644 --- a/web/messages/sv/docs/monitor/api-reference.json +++ b/web/messages/sv/docs/monitor/api-reference.json @@ -162,7 +162,7 @@ { "endpoint": "/api/vms//backup", "method": "POST", - "use": "Skapar en vzdump-säkerhetskopia av VM eller LXC. Valfria fält att anpassa till lagringen: storage (PVE-mål), mode (snapshot, suspend eller stop), compress (zstd, lzo, gzip eller none), protected (true eller false), notes, notification (auto, always, failure eller never) och pbs_change_detection (default, legacy eller data). Returnerar PVE-uppgiftens UPID." + "use": "Skapar en vzdump-säkerhetskopia av en VM eller LXC. Fält i begäran, alla valfria om inte standardvärdena passar lagringsupplägget: storage (en PVE-lagring), mode (snapshot, suspend eller stop), compress (zstd, lzo, gzip eller none), protected (true eller false), notes och pbs_change_detection (default, legacy eller data). Returnerar PVE-uppgiftens UPID." }, { "endpoint": "/api/vms//backups", @@ -286,7 +286,7 @@ { "endpoint": "/api/storage/smart//test", "method": "POST", - "use": "Startar ett SMART-självtest. Schema för begäran: '{'\"type\":\"short\"|\"long\"'}'." + "use": "Startar ett SMART-självtest. Schema för begäran: '{'\"test_type\":\"short\"|\"long\"'}'." }, { "endpoint": "/api/storage/smart/schedules", diff --git a/web/messages/sv/docs/monitor/architecture.json b/web/messages/sv/docs/monitor/architecture.json index b4c27043..f8127df2 100644 --- a/web/messages/sv/docs/monitor/architecture.json +++ b/web/messages/sv/docs/monitor/architecture.json @@ -73,13 +73,13 @@ "intro": "AppImage innehåller ett filsystem som monteras vid körning. AppRun i roten ställer in miljön och startar flask_server.py:", "consequencesIntro": "Två konsekvenser av denna layout:", "consequences": [ - "Medföljande Python-miljö. Tolken och paketen finns i AppImage utan installation i värdens system-Python. Appen använder fortfarande kärngränssnitt och externa värdverktyg.", + "Medföljande Python-paket. Python-paketen levereras i AppImage och körs med värdens egen Python-tolk 3.11 (PVE 8) eller 3.13 (PVE 9), utan att något installeras i värdens system-Python. Appen använder fortfarande värdens kärngränssnitt och externa värdverktyg.", "Maskinvaruklienter ingår. Här finns ipmitool, lm-sensors och upsc. Mätningar kräver maskinvarustöd, sensoråtkomst och för UPS en konfigurerad NUT-server." ] }, "flask": { "heading": "Flask-appens struktur", - "intro": "flask_server.py skapar en Flask(__name__)-instans med begränsat CORS, registrerar nio blueprints direkt och initierar terminalen. Tabellen visar huvudmoduler; även granskning, VM-säkerhetskopiering och PBS registreras. PVE-förladdning körs bara på PVE-värdar.", + "intro": "flask_server.py skapar en Flask(__name__)-instans med begränsade CORS-ursprung, registrerar tio blueprints direkt och initierar terminalrutterna. Tabellen visar huvudmodulerna; blueprints för PBS, Monitor-länkar, granskning och VM-säkerhetskopiering registreras också. PVE-specifik förladdning körs bara på PVE-värdar.", "headerBlueprint": "Blueprint / modul", "headerPrefix": "Ruttprefix", "headerOwns": "Ansvar", @@ -242,10 +242,10 @@ "Uppdateringar: väntande paket och säkerhetsuppdateringar.", "Loggar: ihållande mönster, toppar och kaskader i systemjournalen.", "Minne: OOM-händelser och ihållande minnestryck.", - "Temperatur: CPU- och diskvärden jämförs med övervakningsgränser; tillgängliga sensorer beror på maskinvaran.", + "CPU: användning och CPU-temperatur jämförs med de konfigurerbara gränserna; tillgängliga sensorer beror på maskinvaran.", "Säkerhet: inloggningsfel, blockeringar och Fail2Ban-jailstatus." ], - "afterIntro": "Resultat använder stabil error_key, kategori och allvarlighetsgrad. Rader i errors uppdateras med last_seen och räknare utan dubbletter. Aviseringssändning har även egna fingeravtryck och väntetider.", + "afterIntro": "Resultat använder stabil error_key, kategori och allvarlighetsgrad. Befintliga poster i errors uppdateras på plats (last_seen, allvarlighetsgrad, orsak) i stället för att dupliceras. Aviseringssändning har även egna regler för fingeravtryck och väntetider.", "cycleEnd": "Rensning kan lösa gamla fel med kategorins tid för undertryckning och statusregler, ta bort övergivna poster för borttagna resurser och radera events äldre än 30 dagar. Kategorierna beskrivs i Panel → Health Monitor." }, "notifications": { @@ -264,9 +264,9 @@ "intro": "Fliken Terminal ansluter en lätt xterm.js-klient till ett PTY på servern via WebSocket. Två lägen finns:", "items": [ "HTTP-läge, standard: den inbyggda Flask-servern med flask-sock hanterar byte till WebSocket-protokollet.", - "HTTPS-/WSS-läge: använder gevent.pywsgi.WSGIServer med geventwebsocket.handler.WebSocketHandler för WebSocket över TLS." + "HTTPS-/WSS-läge: TLS-servern använder gevent.pywsgi.WSGIServer med sin standardhanterare; flask-sock hanterar WebSocket-anslutningar över TLS." ], - "outro": "Terminalprocesser ärver User=root. Med autentisering på kräver WebSocket en kortlivad engångsbiljett från den autentiserade biljettslutpunkten med administratörsbehörighet. Om autentisering är avstängd eller avböjd följer anslutningen det oautentiserade läget.", + "outro": "Terminalens underprocesser ärver User=root från tjänsten. För att öppna en WebSocket krävs en kortlivad engångsbiljett från den autentiserade slutpunkten för terminalbiljetter med administratörsbehörighet.", "proxyNote": "Med omvänd proxy måste WebSocket och dess headers Upgrade och Connection vidarebefordras. Terminalen kräver det." }, "proxy": { diff --git a/web/messages/sv/docs/monitor/dashboard/network.json b/web/messages/sv/docs/monitor/dashboard/network.json index de31d3d0..dee26d4d 100644 --- a/web/messages/sv/docs/monitor/dashboard/network.json +++ b/web/messages/sv/docs/monitor/dashboard/network.json @@ -162,7 +162,7 @@ } ], "reportTitle": "Rapport om nätverkslatens (PDF)", - "reportIntro": "Båda lägena har knappen Rapport bredvid målväljaren. Den skapar en PDF med mätningarna som du kan bifoga ett supportärende hos internetleverantören.", + "reportIntro": "Båda lägena har knappen Rapport bredvid målväljaren. Den öppnar en utskrivbar rapport över mätningarna; spara den som PDF från webbläsarens utskriftsdialog och bifoga den till ett supportärende hos internetleverantören.", "reportPreviewAlt": "Första PDF-sidan i latensrapporten med sammanfattning, mätare, statistik, diagram och gränsvärdesguide", "reportPreviewCaption": "Första sidan innehåller sammanfattning, mätare, huvudstatistik, latens över tid och gränsvärdesguide. Från sida 2 följer mättabellen och metoden.", "downloadLabel": "Hämta exempelrapport om latens (PDF)", diff --git a/web/messages/sv/docs/monitor/dashboard/security.json b/web/messages/sv/docs/monitor/dashboard/security.json index 255bb94b..718d35a8 100644 --- a/web/messages/sv/docs/monitor/dashboard/security.json +++ b/web/messages/sv/docs/monitor/dashboard/security.json @@ -136,7 +136,7 @@ "configCaption": "Redigera jailen sshd: sänk Max Retries om du bara använder SSH från ditt eget undernät, eller öka Ban Time för en översikt som är åtkomlig från internet.", "outro": "Guiden Installation, konfiguration och avinstallation beskriver även manuell installation, ändringen av SSH MaxAuthTries och kopplingen till loggen proxmenux-auth.log. Se ProxMenux → Säkerhet → Fail2Ban.", "calloutTitle": "Utan Fail2Ban blockerar den här mekanismen inga IP-adresser", - "calloutBody": "ProxMenux Monitor kontrollerar IP-adresser som blockerats av Fail2Ban på applikationsnivå innan Flask-begäranden behandlas. Den frågar fail2ban-client och sparar resultatet i cache i 30 sekunder; ingen SQL-tabell med blockeringar läses. Utan Fail2Ban loggas misslyckade inloggningar i proxmenux-auth.log, men mekanismen blockerar inga IP-adresser." + "calloutBody": "ProxMenux Monitor kontrollerar IP-adresser som blockerats i Fail2Bans jail proxmenux på applikationsnivå innan Flask-begäranden behandlas och sparar resultatet i cache i 30 sekunder. Utan Fail2Ban loggas misslyckade inloggningar i proxmenux-auth.log och inloggningsslutpunkten begränsas till 5 försök per IP var 5:e minut, men ingen IP-adress blockeras." }, "lynis": { "heading": "Säkerhetsgranskning med Lynis", diff --git a/web/messages/sv/docs/monitor/dashboard/settings.json b/web/messages/sv/docs/monitor/dashboard/settings.json index 64a4198b..ec7dba49 100644 --- a/web/messages/sv/docs/monitor/dashboard/settings.json +++ b/web/messages/sv/docs/monitor/dashboard/settings.json @@ -76,7 +76,7 @@ }, "thresholds": { "heading": "Gränsvärden i Health Monitor", - "intro": "Förra kortet anger tystnadens längd efter avfärdande; detta anger värdet som utlöser en varning. De flesta gränskontroller har justerbara värden för Varning och Kritiskt. Tabellen förklarar undantag som kombinerad swapregel och aktuell RAM-detektor.", + "intro": "Förra kortet anger tystnadens längd efter avfärdande; detta anger värdet som utlöser en varning. De flesta gränskontroller har justerbara värden för Varning och Kritiskt. Tabellen nedan förklarar undantag som den kombinerade swapregeln.", "whatForTitle": "Vad det används till", "whatForIntro": "Standardvärdena är en utgångspunkt, men varje miljö har egna förutsättningar:", "whatForItems": [ @@ -85,7 +85,7 @@ "Välj temperaturgränser efter diskens specifikationer och faktiska förhållanden. Passiv eller forcerad kylning avgör inte ensam en allmänt lägre eller högre säker gräns.", "En tungt virtualiserad värd kan få CPU-toppar vid byggen utan att varna för varje topp på 80 %, men måste fortfarande varna vid långvarig överbelastning." ], - "whatForOutro": "Ändringar som stöds gäller vid nästa kontroll. Health Monitor läser /usr/local/share/proxmenux/health_thresholds.json varje cykel utan omstart. Vissa indikatorer, som disktemperatur, använder värdena; vissa kapacitetsstaplar har egna gränser. RAM-raden beskriver ett aktuellt undantag.", + "whatForOutro": "Ändringar av tröskelvärden som stöds gäller vid nästa kontroll. Health Monitor läser /usr/local/share/proxmenux/health_thresholds.json varje cykel utan omstart. Utvalda indikatorer, bland annat disktemperatur, använder värdena; vissa kapacitetsstaplar behåller egna visuella gränser.", "coloursTitle": "Statusfärger för Varning och Kritiskt", "coloursIntro": "Widgetar med det konfigurerade paret Varning/Kritiskt följer de tre lägena nedan. Andra indikatorer, som PVE-kapacitetsstaplar, har egna gränser; färgen ensam visar inte att Health Monitor har larmat.", "headerColour": "Färg", @@ -125,7 +125,7 @@ "section": "Minne", "warning": "85 %", "critical": "95 %", - "gates": "Värdens RAM-belastning. Den konfigurerbara standarden visar Kritiskt vid 95 %, men aktuell detektor använder en fast regel på 90 % över tid; inställningen ändrar för närvarande inte den körningsgrenen." + "gates": "Värdens RAM-belastning." }, { "section": "Swap (endast kritisk nivå)", @@ -185,7 +185,7 @@ "section": "PVE-lagring", "warning": "85 %", "critical": "95 %", - "gates": "Lagring som hanteras av PVE: LVM, LVM-thin, ZFS-pool, RBD/Ceph och PBS. Alla är inte blocklagringssystem." + "gates": "Endast PVE-lagring av typerna LVM, LVM-thin, ZFS-pool, RBD, CephFS och PBS. Katalog-, NFS- och CIFS-lagring täcks av raden för värdens diskutrymme." }, { "section": "ZFS-pool", @@ -218,7 +218,7 @@ "toggleTitle": "Aviseringsreglage när detektering är på", "toggleBody": "Reglaget lxc_updates_available per kanal under Aviseringar → Tjänster visas bara när detektering är på. När den stängs av döljs raden för alla kanaler. Valet sparas i databasen och samma värde återkommer när detektering slås på.", "purgeTitle": "Vad som rensas när detektering stängs av", - "purgeBody": "Avstängning tar genast bort type=lxc-poster från /usr/local/share/proxmenux/managed_installs.json. Räknarna för LXC-uppdateringar i Hårdvara försvinner vid nästa omladdning. Påslagning fyller registret vid nästa kontroll, eller tidigare med manuell API-uppdatering." + "purgeBody": "Avstängning tar genast bort alla type=lxc-poster från /usr/local/share/proxmenux/managed_installs.json. Räknarna för LXC-uppdateringar på fliken VM och LXC töms vid nästa uppdatering av instrumentpanelen. Påslagning fyller registret vid nästa identifieringscykel, eller tidigare med manuell API-uppdatering." }, "storageExclusions": { "heading": "Exklusioner för fjärrlagring", diff --git a/web/messages/sv/docs/monitor/dashboard/storage.json b/web/messages/sv/docs/monitor/dashboard/storage.json index c402ea5e..522a9a65 100644 --- a/web/messages/sv/docs/monitor/dashboard/storage.json +++ b/web/messages/sv/docs/monitor/dashboard/storage.json @@ -70,7 +70,7 @@ "items": [ "Enhetssökväg — /dev/sda, /dev/nvme0n1.", "Typetikett — SATA / NVMe och tillhörande ikon.", - "Systemetikett — orange markering för diskar som identifierats som operativsystemets diskar. Identifieringen använder monteringarna / och /boot och ger etiketten System. En saknad etikett bevisar inte att disken kan raderas eller användas för annat utan risk.", + "Systemetikett — orange markering för diskar som värden använder: systemets monteringspunkter (/, /boot, /usr, /var…), aktiv swap, ZFS-poolmedlemmar, fysiska LVM-volymer, aktiva RAID-medlemmar eller etiketter på systempartitioner. En saknad etikett bevisar inte att disken kan raderas eller användas för annat utan risk.", "Modell — tillverkare och modell från smartctl -i.", "Kapacitet — i lättlästa enheter.", "Temperatur — aktuellt värde i °C, färgat efter disktyp; NVMe använder högre gränser än SATA.", @@ -112,7 +112,7 @@ "pdfPreviewAlt": "Första sidan i SMART-rapporten med sammanfattning, PASSED-ring och diskinformation", "pdfPreviewCaption": "Första sidan: sammanfattning, PASSED-ring och fullständig diskinformation. Exempel-PDF:en innehåller SSD-slitage, alla SMART-attribut och testhistorik.", "pdfDownloadLabel": "Hämta exempelrapport för SMART (PDF)", - "pdfSectionsIntro": "Rapporten har sex huvudavsnitt:", + "pdfSectionsIntro": "Rapporten innehåller dessa huvudavsnitt:", "pdfSections": [ "Sammanfattning — PASSED/FAILED, begriplig diskbedömning — bra, sliten eller felande — och fyra uppgifter: rapporttid, senaste testtyp, resultat och kontrollerade attribut.", "Diskinformation — modell, serienummer, kapacitet, typ HDD/SSD/NVMe, familj, formfaktor, gränssnitt (SATA 3.3 · 6.0 Gb/s, …), TRIM, temperatur och optimal gräns, drifttimmar, starter, SMART, väntande/omallokerade sektorer och CRC-fel.", @@ -127,7 +127,7 @@ "historyImageCaption": "Diskens SMART-historik. Varje rad visar typ, tid, ålder, markering av senaste test samt hämtning av smartctl-utdata och borttagning.", "historyIntro": "Sparade slutförda korta och utökade tester för disken. Varje post innehåller ursprungliga smartctl-utdata och fälten som Monitor tolkar för översikten. Åtgärder per rad:", "historyItems": [ - "Hämta — sparar JSON-ögonblicksbilden med rapportens smartctl -a-data. Praktiskt när tillverkarsupporten behöver ursprungliga diagnostikfält.", + "Hämta — sparar testets JSON-ögonblicksbild (utdata från smartctl -a --json, eller nvme smart-log på NVMe när smartctl misslyckas). Praktiskt när tillverkarsupporten behöver ursprungliga diagnostikfält.", "Ta bort — raderar ett test manuellt ur historiken. Lagringsgränsen i Schema (senaste 5 / 10 / 20) tar automatiskt bort de äldsta." ], "scheduleTitle": "Flik 4 — Schema", diff --git a/web/messages/sv/docs/monitor/dashboard/vms-lxcs.json b/web/messages/sv/docs/monitor/dashboard/vms-lxcs.json index cf94d7ae..f71d6a3c 100644 --- a/web/messages/sv/docs/monitor/dashboard/vms-lxcs.json +++ b/web/messages/sv/docs/monitor/dashboard/vms-lxcs.json @@ -1,16 +1,16 @@ { "meta": { "title": "ProxMenux Monitor — Översikt: VM och LXC | ProxMenux-dokumentation", - "description": "Inventering av gäster med CPU, minne och disk i realtid. Detaljerna visar konfiguration, resurser, säkerhetskopior, senaste Proxmox-loggresultat, anteckningar och Starta / Stäng av / Starta om / Tvinga stopp." + "description": "Fliken VM och LXC inventerar alla gäster på värden med CPU-, minnes- och diskanvändning i realtid. Detaljerna per gäst visar konfiguration, resurser, säkerhetskopior, konsolloggen för OCI-containrar, anteckningar och Starta / Stäng av / Starta om / Tvinga stopp." }, "header": { "title": "Översikt: VM och LXC", - "description": "Hela nodens gästinventering: fyra mätvärden överst, en sorterbar lista över VM och LXC samt gästdetaljer med konfiguration, resurser, säkerhetskopior, loggar och Starta / Stäng av / Starta om / Tvinga stopp.", + "description": "Hela nodens gästinventering: fyra mätvärden överst, en sorterbar lista över alla VM och LXC nedanför samt gästdetaljer med konfiguration, resurser, säkerhetskopior, konsolloggen för OCI-containrar och de fyra livscykelkontrollerna (Starta / Stäng av / Starta om / Tvinga stopp).", "section": "ProxMenux Monitor · Översikt" }, "intro": { "title": "Kontroller för gäster", - "body": "Här styr du gästernas livscykel. Åtgärder går via POST /api/vms/<vmid>/control efter uttrycklig bekräftelse och uppdaterar gästens rad. Tvingad avstängning kräver den särskilda knappen Tvinga stopp." + "body": "Här styr du gästernas livscykel. Livscykelåtgärder går via POST /api/vms/<vmid>/control; Starta om och Tvinga stopp ber dig skriva VMID för att bekräfta, och svaret visas i gästens rad. Tvingad avstängning kräver den särskilda knappen Tvinga stopp." }, "topRow": { "heading": "Övre raden: fyra statistikkort", @@ -186,9 +186,9 @@ "source": "PVE RRD-data (pvesh get /nodes/<node>/qemu/<id>/rrddata) kondenserade till en diagramvänlig form." }, { - "section": "Senaste Proxmox-loggresultat", - "endpoint": "/api/vms//logs", - "source": "pvesh get /nodes/<node>/<qemu|lxc>/<vmid>/log --start 0 --limit 1000. Om kommandot misslyckas returneras en tom lista; detta ger inte fullständiga systemloggar inifrån gästen." + "section": "OCI-konsollogg (fliken Loggar)", + "endpoint": "/api/lxc//console-log", + "source": "Konsolutdata från avbildningens huvudprocess, läst från /var/log/proxmenux/oci/<vmid>.console.log på värden. Visas endast för OCI-containrar." }, { "section": "Backups tillgängliga för gäst", diff --git a/web/messages/sv/docs/monitor/health-monitor.json b/web/messages/sv/docs/monitor/health-monitor.json index 0dfa93ce..ae3a030e 100644 --- a/web/messages/sv/docs/monitor/health-monitor.json +++ b/web/messages/sv/docs/monitor/health-monitor.json @@ -68,7 +68,7 @@ { "category": "Lagring", "checks": "Proxmox-lagring, rotfilsystem", - "events": "Rotfilsystemet eller andra övervakade filsystem passerar inställda utrymmeströsklar (85% varning / 95% kritiskt som standard); NFS-export offline; misslyckad CIFS-autentisering; full LVM-thin-pool." + "events": "Rotfilsystemet eller andra övervakade filsystem passerar inställda utrymmeströsklar (85% varning / 95% kritiskt som standard); otillgänglig PVE-lagring; hängande eller oväntat skrivskyddade NFS-/CIFS-monteringar; LVM-thin och annan poollagring som passerar samma trösklar." }, { "category": "Disker och SMART", @@ -98,7 +98,7 @@ { "category": "Systemuppdateringar", "checks": "I väntan på uppdateringar, säkerhetsuppdateringar, kärna / PVE-version, systemålder", - "events": "Väntande säkerhetsuppdateringar eller uppdateringar av den kärna som används; system som inte uppdaterats på länge. Knappen Uppdatera nu visas i översiktens sidhuvud när uppdateringar finns. Den kör hela ProxMenux-flödet och uppdaterar hälsan med ?refresh=1 vid stängning utan att invänta nästa cykel." + "events": "Väntande säkerhetsuppdateringar eller uppdateringar av den kärna som används; system som inte uppdaterats på länge. Kategorin Uppdateringar i fönstret Hälsostatus visar knappen Uppdatera nu när uppdateringar väntar. Den kör hela ProxMenux-uppdateringsflödet direkt i fönstret; vid stängning uppdateras hälsan med ?refresh=1 så att indikatorn visar det nya tillståndet utan att invänta nästa cykel." }, { "category": "Säkerhet och certifikat", @@ -158,7 +158,7 @@ }, "dismiss": { "heading": "Avfärda larm och ange undertryckningstid", - "intro": "Vissa händelser kvarstår, som Systemuppdateringar: uppdateringar tillgängliga tills värden uppdaterats. En avisering var femte minut behövs inte. Knappen Uppdatera nu i översikten löser just det fallet direkt. För andra fall eller uppskjutna uppdateringar finns två sammankopplade sätt att tysta larm:", + "intro": "Vissa händelser kvarstår av naturen, som Systemuppdateringar: uppdateringar tillgängliga tills värden uppdaterats, och en avisering var femte minut i en vecka behövs inte. Knappen Uppdatera nu i kategorin Uppdateringar i fönstret Hälsostatus löser just det fallet direkt. För andra fall eller uppskjutna uppdateringar erbjuder hälsoövervakningen också två sammankopplade sätt att tysta larm:", "step1": "Avfärda en enskild händelse i fönstret. Menyn erbjuder 24 timmar, 7 dagar eller Permanent, oberoende av kategorins standard. Valet skickar POST /api/health/acknowledge med error_key och valda suppression_hours (-1 för permanent). Händelsen flyttas till Avfärdade med tidsstämpeln acknowledged_at.", "dropdownImageAlt": "Meny för att avfärda ett larm: 24 timmar, 7 dagar eller permanent", "dropdownImageCaption": "Vald tid gäller bara detta larm; utan enskilt val används kategorins standard. Permanent avfärdade larm har ett bärnstensfärgat märke Permanent och utlöses normalt inte igen. Undantaget för kritisk CPU-temperatur beskrivs nedan.", @@ -187,7 +187,7 @@ }, { "finding": "ZFS pool DEGRADED / FAULTED", - "why": "ZFS-poolernas kapacitetskontroller tillåter uttryckligen avfärdande. Andra poolfynd följer sin egen flagga. Kvittering reparerar inte en degraderad eller felaktig pool." + "why": "Fynd om ZFS-poolernas tillstånd (DEGRADED, FAULTED, UNAVAIL) tillåter uttryckligen avfärdande, liksom kontroller av poolkapacitet. Kvittering reparerar inte en degraderad eller felaktig pool." }, { "finding": "Disk-I/O-fel med SMART FAILED", @@ -289,7 +289,7 @@ }, "rest": { "heading": "REST-slutpunkter", - "intro": "Fönstrets åtgärder kan anropas via API för skript, översikter och botar. Med Monitors autentisering påslagen behövs en giltig Bearer-token från inloggning eller API-tokenskärmen. Ändringar som kvittering, sparande eller rensning av övergivna fel kräver full_admin; read_only får 403. Med autentisering avstängd eller avböjd tillåter dessa kontroller åtkomst utan token.", + "intro": "Fönstrets åtgärder kan också anropas via API för skript, egna översikter och botar. Anrop kräver en giltig Bearer-token, antingen från inloggning eller API-tokenskärmen. Ändringar som kvittering av larm, sparande av undertryckningsinställningar eller rensning av övergivna fel kräver omfånget full_admin; read_only får 403.", "headerEndpoint": "Slutpunkt", "headerMethod": "Metod", "headerUse": "Användning", @@ -297,7 +297,7 @@ { "endpoint": "/api/health", "method": "GET", - "use": "Lätt kontroll som ger JSON med status, timestamp och version. Passar Uptime Kumas nyckelordskontroller; när Monitors autentisering är påslagen måste klienten skicka en Bearer-header." + "use": "Lätt kontroll som ger JSON med status, timestamp och version. Passar Uptime Kumas nyckelordskontroller; klienten måste skicka en Bearer-header." }, { "endpoint": "/api/health/status", diff --git a/web/messages/sv/docs/monitor/index.json b/web/messages/sv/docs/monitor/index.json index 4e35572e..fa2eab2f 100644 --- a/web/messages/sv/docs/monitor/index.json +++ b/web/messages/sv/docs/monitor/index.json @@ -52,7 +52,7 @@ }, { "name": "Terminal", - "description": "Värdskal och konsolåtkomst till VM/CT som stöds i webbläsaren via xterm.js och WebSockets. Följer valt autentiseringsläge: om autentisering är avstängd eller avböjd kan klienter med nätåtkomst öppna en session utan inloggning. Det innebär ingen granskning av varje kommando." + "description": "Värdskal och konsolåtkomst till VM/CT som stöds i webbläsaren via xterm.js och WebSockets. Sessioner granskas inte per kommando." }, { "name": "Säkerhet", @@ -114,7 +114,7 @@ "heading": "REST API och integrationer", "intro": "REST-endpointar ger övervakningsdata som JSON över HTTP/HTTPS för Homepage, Home Assistant, Uptime Kuma och skript. Grafana kan använda den separata Prometheus-textexportören på /api/prometheus. Anrop kan göras med curl.", "tokens": "Långlivade API-token (365 dagar) skapas under Inställningar → API-åtkomsttoken eller via POST /api/auth/generate-api-token.", - "bearer": "Skicka token som Authorization: Bearer …. Den offentliga /api/health passar tillgänglighetskontroller utan inloggning. Under /api/auth/* finns offentliga inställnings-/inloggnings-/statusrutter och skyddad konto-/tokenhantering; alla är inte anonyma.", + "bearer": "Skicka token som Authorization: Bearer …. Även /api/health förväntar sig Bearer-headern, så tillgänglighetskontroller behöver en read_only-token. Under /api/auth/* finns både offentliga inställnings-/inloggnings-/statusrutter och skyddade rutter för konto-/tokenhantering; alla är inte anonyma.", "catalog": "Den fullständiga slutpunktskatalogen, vägledning för tokenrotation och bästa säkerhetspraxis finns i API Referens; Färdiga exempel för Homepage, Home Assistant, Grafana, Uptime Kuma och ett generiskt cURL-mönster finns i Integrationer." }, "serviceControl": { diff --git a/web/messages/sv/docs/monitor/integrations.json b/web/messages/sv/docs/monitor/integrations.json index 3ac16db2..60d5ee3b 100644 --- a/web/messages/sv/docs/monitor/integrations.json +++ b/web/messages/sv/docs/monitor/integrations.json @@ -220,7 +220,7 @@ "heading": "n8n, Zapier och anpassade skript", "intro": "Arbetsflöden och skript kan skicka aviseringar med POST till /api/notifications/send, exempelvis vid CI-fel eller långa cronjobb. Direktsändning kringgår händelsekö och spärrtid per händelseavtryck. Kanalformatering, valfri AI och leverans finns kvar. Hantera eventuella dubbletter i anroparen.", "n8nBody": "Använd en HTTP Request-nod i n8n med POST, URL ovan och samma JSON som curl. Välj generiska Header Auth-uppgifter: namn Authorization och värde Bearer YOUR_API_TOKEN, och ersätt platshållaren. Anslut ett schema, en webhook eller en föregående nod som utlösare.", - "severityBody": "Allvarlighetsgrad anges som INFO, WARNING eller CRITICAL med versaler. Objektet data ger sammanhang. AI använder renderad titel och text samt stödd berikning; godtyckliga fält ingår inte säkert i prompt eller resultat. Se Aviseringar → Händelsekatalog." + "severityBody": "Allvarlighetsgrad anges som INFO, WARNING eller CRITICAL med versaler. Objektet data ger händelsekontext och mallfält. På denna slutpunkt får AI-omskrivningen bara titel och text; fält i data skickas inte till leverantören. Se Aviseringar → Händelsekatalog för händelsernas betydelse." }, "pveWebhook": { "heading": "Inbyggd Proxmox VE-webhook (inkommande)", diff --git a/web/messages/sv/docs/monitor/notifications.json b/web/messages/sv/docs/monitor/notifications.json index ca940a34..1f20b3f6 100644 --- a/web/messages/sv/docs/monitor/notifications.json +++ b/web/messages/sv/docs/monitor/notifications.json @@ -171,7 +171,7 @@ "Öppna account.microsoft.com/security och aktivera tvåstegsverifiering.", "Om kontot erbjuder Avancerade säkerhetsalternativ → Applösenord, välj Skapa ett nytt applösenord. Det garanterar inte att e-posttjänsten godtar SMTP med lösenord.", "Om Microsoft skapar ett applösenord, kopiera det och kontrollera att SMTP-tjänsten godtar det.", - "Använd bara dessa godkända inställningar om tjänsten tillåter SMTP med lösenord: Server smtp.office365.com för Exchange Online, Port 587, TLS-läge STARTTLS, Användarnamn din e-postadress och Lösenord den tillåtna SMTP-inloggningsuppgiften. Personliga Outlook.com-konton har andra inställningar och krav." + "Fyll bara i tjänstens godkända inställningar om den tillåter SMTP med lösenord: SMTP-värd smtp.office365.com för Exchange Online, Port 587, TLS-läge STARTTLS, Användarnamn din postlådeadress och Lösenord den tillåtna SMTP-inloggningsuppgiften. Personliga Outlook.com-konton har andra inställningar och autentiseringskrav; utgå inte från att dessa uppgifter fungerar." ], "relayTitle": "Eget SMTP-relä", "relayBody": "Anslut Monitor till ett SMTP-relä du kontrollerar, till exempel Postfix. Reläet hanterar tjänstens autentisering. Anpassa Monitors autentisering och TLS-läge till reläet; att det körs lokalt stänger inte av kryptering." @@ -266,7 +266,7 @@ "howItems": [ "Aktiveras per kanal. Avstängt som standard. Aktivera sammanfattning på önskade kanaler och behåll direktleverans på andra.", "Leveranstid i lokal tidszon, som standard 09:00. Du kan välja en annan tid; sammanfattningen skickas inom ungefär 60 sekunder från den minuten.", - "Ingår i sammanfattningen: lämpliga allmänna händelser med nivån INFO. Exempel: programuppdatering tillgänglig, Tailscale-uppdatering tillgänglig, ProxMenux-optimeringsuppdatering tillgänglig, APT-säkerhetsuppdateringar väntar och frekvensgräns nådd. Säkerhetskopieringsresultat och andra undantagna åtgärdshändelser skickas direkt.", + "Ingår i sammanfattningen: lämpliga allmänna händelser med nivån INFO. Exempel: programuppdatering tillgänglig, Tailscale-uppdatering tillgänglig, ProxMenux-optimeringsuppdatering tillgänglig och APT-säkerhetsuppdateringar väntar. Säkerhetskopieringsresultat och andra undantagna åtgärdshändelser skickas direkt.", "Fördröjs aldrig av den dagliga sammanfattningen:", "Beständig lagring. Väntande händelser sparas i SQLite-tabellen digest_pending till vald tid. En omstart av Monitor förlorar inte innehållet.", "Tyst när inget har hänt. Om inga INFO-händelser väntar skickas ingen sammanfattning." @@ -301,7 +301,7 @@ { "stage": "Väntetid mellan upprepningar", "what": "Efter lyckad leverans undertrycks samma fingeravtryck och tillståndet sparas i notification_last_sent. Grundvärden för CRITICAL, WARNING och INFO är 86 400 s, liksom för resources och updates. Undantag: 5 s för VM/CT-åtgärder och värdens avstängning/omstart, 10 s för säkerhetskopierings-/replikeringsresultat och 1 800–3 600 s för flera hälsokategorier. Egna händelse- eller gruppinställningar kan ersätta värdena.", - "tunable": "Ja — uttryckliga väntetider för händelsetyp eller grupp ersätter standardvärdena i sändningskonfigurationen." + "tunable": "Endast via inställnings-API:t — en nyckel cooldown.<event_type> eller cooldown.<group> ersätter standardvärdena; det finns ingen kontroll i gränssnittet." }, { "stage": "Gruppering av händelsetoppar", @@ -330,7 +330,7 @@ "Metod och URL. POST http://127.0.0.1:8008/api/notifications/webhook när HTTPS är avstängt i Monitor. Med HTTPS används en separat lokal HTTP-mottagare på port 8009. Båda finns på samma värd.", "Meddelandemall. JSON med PVE:s Handlebars-funktioner. PVE sparar mallen base64-kodad i konfigurationen. Avkodad blir den:", "Matchare. Ett tillhörande matcher: proxmenux-matcher-block med mode all skickar alla PVE-aviseringar till målet.", - "Privat konfiguration. Installationen skriver blocket webhook: proxmenux-webhook i /etc/pve/priv/notifications.cfg, med den delade hemligheten base64-kodad. Det offentliga målet hänvisar till hemligheten för att skicka X-Webhook-Secret. Blocket är alltså inte tomt." + "Privat konfiguration. Installationen skriver det matchande blocket webhook: proxmenux-webhook i /etc/pve/priv/notifications.cfg med en secret-post som heter X-Webhook-Secret, base64-kodad. Det offentliga målblocket innehåller bara body-mallen, metoden och URL:en. Det privata blocket är ingen tom stub." ], "securityTitle": "Så skyddas mottagaren", "securityIntro": "Webhookmottagaren på POST /api/notifications/webhook tillämpar olika säkerhetskontroller beroende på anropets källa:", From 06968696e3485f096afbaf245bdb26160d5b6b3e Mon Sep 17 00:00:00 2001 From: MacRimi Date: Sun, 18 Oct 2026 17:58:56 +0200 Subject: [PATCH 4/4] Update test_lynis_threshold_wording.py --- .github/scripts/tests/test_lynis_threshold_wording.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/scripts/tests/test_lynis_threshold_wording.py b/.github/scripts/tests/test_lynis_threshold_wording.py index 435432a9..ef62cd1e 100644 --- a/.github/scripts/tests/test_lynis_threshold_wording.py +++ b/.github/scripts/tests/test_lynis_threshold_wording.py @@ -110,7 +110,7 @@ class LynisThresholdContracts(unittest.TestCase): _, module = extract_function(APP / 'scripts/health_monitor.py', '_check_memory_comprehensive', owner='HealthMonitor') # The method is bound to an inert class, not the production constructor. self_obj = SimpleNamespace(state_history=defaultdict(list), MEMORY_DURATION=300, SWAP_CRITICAL_DURATION=300, - MEMORY_WARNING=80, SWAP_HIGH_PERCENT=80, AVAILABLE_MIN_PERCENT=20) + MEMORY_WARNING=80, MEMORY_CRITICAL=90, SWAP_HIGH_PERCENT=80, AVAILABLE_MIN_PERCENT=20) memory = SimpleNamespace(percent=50, available=10, total=100) swap = SimpleNamespace(percent=90, used=90, total=100) namespace = {'Dict': dict, 'Any': object, 'psutil': SimpleNamespace(virtual_memory=lambda: memory, swap_memory=lambda: swap),